@swoft/gtd-domain
Version:
Getting Things Done (GTD) productivity system - consolidated domain implementation
588 lines (586 loc) • 14.7 kB
JavaScript
import {
ApiValidationError,
BackendApiError,
BackendErrorResponseSchema,
BackendInboxItemSchema,
BackendInboxListResponseSchema,
BackendProjectSchema,
BackendProjectsListResponseSchema,
BackendSuccessResponseSchema,
ConsoleErrorLogger,
DEFAULT_RETRY_CONFIG,
ErrorType,
classifyError,
defaultErrorLogger,
getUserFriendlyMessage,
isBackendErrorResponse,
isBackendSuccessResponse,
shouldRetry,
withRetry
} from "../chunk-GQ5XH56W.mjs";
import {
__name
} from "../chunk-PAWJFY3S.mjs";
// src/contracts/api/types.ts
import { z } from "zod";
var ListResponseSchema = /* @__PURE__ */ __name((itemSchema) => z.object({
items: z.array(itemSchema),
pagination: z.object({
totalCount: z.number(),
page: z.number().optional(),
pageSize: z.number().optional(),
hasMore: z.boolean().optional()
}),
totalCount: z.number()
}), "ListResponseSchema");
// src/bounded-contexts/api-contracts/contracts/GtdApiContractV2.ts
import { makeApi } from "@zodios/core";
import { z as z2 } from "zod";
var GTDInboxItemDTOSchema = z2.object({
id: z2.string(),
originalContent: z2.string(),
capturedAt: z2.string().datetime(),
capturedByPersonId: z2.string(),
clarification: z2.string().optional(),
isActionable: z2.boolean().optional(),
processingStatus: z2.enum([
"unprocessed",
"processed"
]),
lastRefinedAt: z2.string().datetime().optional(),
refinedByPersonId: z2.string().optional()
// Domain field name
});
var GTDProjectProgressSchema = z2.object({
projectId: z2.string(),
totalActions: z2.number(),
completedActions: z2.number(),
assignedActions: z2.number(),
availableActions: z2.number(),
completionPercentage: z2.number()
});
var GTDNextActionDTOSchema = z2.object({
id: z2.string(),
description: z2.string(),
context: z2.string(),
energyRequired: z2.enum([
"low",
"medium",
"high"
]),
estimatedMinutes: z2.number(),
createdBy: z2.string(),
createdAt: z2.string().datetime(),
projectId: z2.string().optional(),
// Assignment fields
assignedTo: z2.string().optional(),
roleType: z2.string().optional(),
assignedAt: z2.string().datetime().optional(),
// Completion
completedAt: z2.string().datetime().optional(),
status: z2.enum([
"available",
"assigned",
"completed"
])
// Computed property in domain
});
var GTDProjectDTOSchema = z2.object({
id: z2.string(),
name: z2.string(),
desiredOutcome: z2.string(),
createdBy: z2.string(),
createdAt: z2.string().datetime(),
area: z2.string().optional(),
reviewDate: z2.string().datetime().optional(),
status: z2.enum([
"active",
"someday-maybe",
"completed",
"cancelled"
]),
completedAt: z2.string().datetime().optional(),
nextActionIds: z2.array(z2.string()),
progress: GTDProjectProgressSchema.optional()
// Computed at application layer
});
var CaptureInboxItemRequestSchema = z2.object({
content: z2.string(),
capturedByPersonId: z2.string(),
source: z2.string().optional()
// For tracking capture source (e.g., 'mcp', 'web', 'email')
});
var RefineInboxItemRequestSchema = z2.object({
refinedContent: z2.string(),
refinedByPersonId: z2.string()
});
var ClarifyInboxItemRequestSchema = z2.object({
clarification: z2.string(),
isActionable: z2.boolean(),
clarifiedByPersonId: z2.string()
});
var CreateProjectRequestSchema = z2.object({
name: z2.string(),
desiredOutcome: z2.string(),
createdBy: z2.string(),
area: z2.string().optional(),
reviewDate: z2.string().datetime().optional()
});
var CreateNextActionRequestSchema = z2.object({
description: z2.string(),
context: z2.string(),
energyRequired: z2.enum([
"low",
"medium",
"high"
]),
estimatedMinutes: z2.number(),
createdBy: z2.string(),
projectId: z2.string().optional()
});
var AssignNextActionRequestSchema = z2.object({
partyId: z2.string(),
roleType: z2.string()
});
var ListResponseSchema2 = /* @__PURE__ */ __name((itemSchema) => z2.object({
success: z2.boolean(),
items: z2.array(itemSchema),
total: z2.number(),
meta: z2.object({
limit: z2.number(),
offset: z2.number(),
filters: z2.record(z2.string()).optional()
}).optional()
}), "ListResponseSchema");
var ItemResponseSchema = /* @__PURE__ */ __name((itemSchema) => z2.object({
success: z2.boolean(),
item: itemSchema.nullable()
}), "ItemResponseSchema");
var SuccessResponseSchema = z2.object({
success: z2.boolean(),
message: z2.string().optional()
});
var GtdApiContractV2 = makeApi([
// Inbox operations
{
method: "get",
path: "/api/gtd/inbox",
alias: "listInboxItems",
parameters: [
{
name: "processingStatus",
type: "Query",
schema: z2.enum([
"unprocessed",
"processed"
]).optional()
},
{
name: "capturedByPersonId",
type: "Query",
schema: z2.string().optional()
},
{
name: "limit",
type: "Query",
schema: z2.number().optional()
},
{
name: "offset",
type: "Query",
schema: z2.number().optional()
}
],
response: ListResponseSchema2(GTDInboxItemDTOSchema)
},
{
method: "get",
path: "/api/gtd/inbox/:id",
alias: "getInboxItem",
response: ItemResponseSchema(GTDInboxItemDTOSchema)
},
{
method: "post",
path: "/api/gtd/inbox/capture",
alias: "captureInboxItem",
parameters: [
{
name: "body",
type: "Body",
schema: CaptureInboxItemRequestSchema
}
],
response: ItemResponseSchema(GTDInboxItemDTOSchema)
},
{
method: "post",
path: "/api/gtd/inbox/:id/refine",
alias: "refineInboxItem",
parameters: [
{
name: "body",
type: "Body",
schema: RefineInboxItemRequestSchema
}
],
response: ItemResponseSchema(GTDInboxItemDTOSchema)
},
{
method: "post",
path: "/api/gtd/inbox/:id/clarify",
alias: "clarifyInboxItem",
parameters: [
{
name: "body",
type: "Body",
schema: ClarifyInboxItemRequestSchema
}
],
response: ItemResponseSchema(GTDInboxItemDTOSchema)
},
{
method: "delete",
path: "/api/gtd/inbox/:id",
alias: "deleteInboxItem",
response: SuccessResponseSchema
},
// Project operations
{
method: "get",
path: "/api/gtd/projects",
alias: "listProjects",
parameters: [
{
name: "status",
type: "Query",
schema: z2.enum([
"active",
"someday-maybe",
"completed",
"cancelled"
]).optional()
},
{
name: "area",
type: "Query",
schema: z2.string().optional()
},
{
name: "createdBy",
type: "Query",
schema: z2.string().optional()
},
{
name: "needsAttention",
type: "Query",
schema: z2.boolean().optional()
},
{
name: "limit",
type: "Query",
schema: z2.number().optional()
},
{
name: "offset",
type: "Query",
schema: z2.number().optional()
}
],
response: ListResponseSchema2(GTDProjectDTOSchema)
},
{
method: "get",
path: "/api/gtd/projects/:id",
alias: "getProject",
response: ItemResponseSchema(GTDProjectDTOSchema)
},
{
method: "post",
path: "/api/gtd/projects",
alias: "createProject",
parameters: [
{
name: "body",
type: "Body",
schema: CreateProjectRequestSchema
}
],
response: ItemResponseSchema(GTDProjectDTOSchema)
},
{
method: "post",
path: "/api/gtd/projects/:id/complete",
alias: "completeProject",
parameters: [
{
name: "body",
type: "Body",
schema: z2.object({
completedBy: z2.string().optional(),
completionNotes: z2.string().optional()
})
}
],
response: ItemResponseSchema(GTDProjectDTOSchema)
},
{
method: "post",
path: "/api/gtd/projects/:id/defer",
alias: "deferProject",
response: ItemResponseSchema(GTDProjectDTOSchema)
},
{
method: "post",
path: "/api/gtd/projects/:id/activate",
alias: "activateProject",
response: ItemResponseSchema(GTDProjectDTOSchema)
},
{
method: "post",
path: "/api/gtd/projects/:id/cancel",
alias: "cancelProject",
response: ItemResponseSchema(GTDProjectDTOSchema)
},
{
method: "delete",
path: "/api/gtd/projects/:id",
alias: "deleteProject",
response: SuccessResponseSchema
},
// Next Actions
{
method: "get",
path: "/api/gtd/actions",
alias: "listNextActions",
parameters: [
{
name: "context",
type: "Query",
schema: z2.string().optional()
},
{
name: "energyRequired",
type: "Query",
schema: z2.enum([
"low",
"medium",
"high"
]).optional()
},
{
name: "projectId",
type: "Query",
schema: z2.string().optional()
},
{
name: "status",
type: "Query",
schema: z2.enum([
"available",
"assigned",
"completed"
]).optional()
},
{
name: "assignedTo",
type: "Query",
schema: z2.string().optional()
},
{
name: "createdBy",
type: "Query",
schema: z2.string().optional()
},
{
name: "limit",
type: "Query",
schema: z2.number().optional()
},
{
name: "offset",
type: "Query",
schema: z2.number().optional()
}
],
response: ListResponseSchema2(GTDNextActionDTOSchema)
},
{
method: "get",
path: "/api/gtd/actions/:id",
alias: "getNextAction",
response: ItemResponseSchema(GTDNextActionDTOSchema)
},
{
method: "post",
path: "/api/gtd/actions",
alias: "createNextAction",
parameters: [
{
name: "body",
type: "Body",
schema: CreateNextActionRequestSchema
}
],
response: ItemResponseSchema(GTDNextActionDTOSchema)
},
{
method: "post",
path: "/api/gtd/actions/:id/assign",
alias: "assignNextAction",
parameters: [
{
name: "body",
type: "Body",
schema: AssignNextActionRequestSchema
}
],
response: ItemResponseSchema(GTDNextActionDTOSchema)
},
{
method: "post",
path: "/api/gtd/actions/:id/unassign",
alias: "unassignNextAction",
response: ItemResponseSchema(GTDNextActionDTOSchema)
},
{
method: "post",
path: "/api/gtd/actions/:id/complete",
alias: "completeNextAction",
response: ItemResponseSchema(GTDNextActionDTOSchema)
},
{
method: "delete",
path: "/api/gtd/actions/:id",
alias: "deleteNextAction",
response: SuccessResponseSchema
},
// Weekly Review
{
method: "get",
path: "/api/gtd/weekly-review",
alias: "getWeeklyReview",
parameters: [
{
name: "reviewedBy",
type: "Query",
schema: z2.string()
}
// Person performing the review
],
response: z2.object({
success: z2.boolean(),
review: z2.object({
reviewDate: z2.string().datetime(),
reviewedBy: z2.string(),
// Inbox status
unprocessedInboxItems: z2.number(),
totalInboxItems: z2.number(),
// Project health
activeProjects: z2.number(),
projectsNeedingAttention: z2.array(GTDProjectDTOSchema),
somedayMaybeProjects: z2.number(),
completedProjectsThisWeek: z2.number(),
// Next actions overview
availableActions: z2.number(),
assignedActions: z2.number(),
completedActionsThisWeek: z2.number(),
actionsByContext: z2.record(z2.string(), z2.number()),
actionsByEnergy: z2.object({
low: z2.number(),
medium: z2.number(),
high: z2.number()
}),
// Review recommendations
recommendations: z2.array(z2.string())
// e.g., ["Process 5 inbox items", "Review stalled Project X"]
})
})
},
// GTD Processing - Convert inbox item to project/action
{
method: "post",
path: "/api/gtd/inbox/:id/process",
alias: "processInboxItem",
parameters: [
{
name: "body",
type: "Body",
schema: z2.object({
clarification: z2.string(),
isActionable: z2.boolean(),
processedBy: z2.string(),
// If actionable and multi-step (project)
createProject: z2.object({
name: z2.string(),
desiredOutcome: z2.string(),
area: z2.string().optional(),
firstAction: z2.object({
description: z2.string(),
context: z2.string(),
energyRequired: z2.enum([
"low",
"medium",
"high"
]),
estimatedMinutes: z2.number()
})
}).optional(),
// If actionable and single-step (next action)
createAction: z2.object({
description: z2.string(),
context: z2.string(),
energyRequired: z2.enum([
"low",
"medium",
"high"
]),
estimatedMinutes: z2.number()
}).optional(),
// If not actionable
moveToReference: z2.boolean().optional(),
moveToSomedayMaybe: z2.boolean().optional(),
trash: z2.boolean().optional()
})
}
],
response: z2.object({
success: z2.boolean(),
processedItem: GTDInboxItemDTOSchema,
createdProject: GTDProjectDTOSchema.optional(),
createdAction: GTDNextActionDTOSchema.optional()
})
}
]);
export {
ApiValidationError,
AssignNextActionRequestSchema,
BackendApiError,
BackendErrorResponseSchema,
BackendInboxItemSchema,
BackendInboxListResponseSchema,
BackendProjectSchema,
BackendProjectsListResponseSchema,
BackendSuccessResponseSchema,
CaptureInboxItemRequestSchema,
ClarifyInboxItemRequestSchema,
ConsoleErrorLogger,
CreateNextActionRequestSchema,
CreateProjectRequestSchema,
DEFAULT_RETRY_CONFIG,
ErrorType,
GTDInboxItemDTOSchema,
GTDNextActionDTOSchema,
GTDProjectDTOSchema,
GTDProjectProgressSchema,
GtdApiContractV2,
ListResponseSchema,
RefineInboxItemRequestSchema,
classifyError,
defaultErrorLogger,
getUserFriendlyMessage,
isBackendErrorResponse,
isBackendSuccessResponse,
shouldRetry,
withRetry
};
//# sourceMappingURL=index.mjs.map