@jamesaphoenix/tx-types 0.4.2 → 0.4.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/README.md +480 -0
  2. package/dist/attempt.d.ts +36 -28
  3. package/dist/attempt.d.ts.map +1 -1
  4. package/dist/attempt.js +59 -1
  5. package/dist/attempt.js.map +1 -1
  6. package/dist/cycle.d.ts +130 -0
  7. package/dist/cycle.d.ts.map +1 -0
  8. package/dist/cycle.js +89 -0
  9. package/dist/cycle.js.map +1 -0
  10. package/dist/deduplication.d.ts +76 -92
  11. package/dist/deduplication.d.ts.map +1 -1
  12. package/dist/deduplication.js +63 -2
  13. package/dist/deduplication.js.map +1 -1
  14. package/dist/doc.d.ts +269 -0
  15. package/dist/doc.d.ts.map +1 -0
  16. package/dist/doc.js +232 -0
  17. package/dist/doc.js.map +1 -0
  18. package/dist/file-learning.d.ts +23 -28
  19. package/dist/file-learning.d.ts.map +1 -1
  20. package/dist/file-learning.js +22 -2
  21. package/dist/file-learning.js.map +1 -1
  22. package/dist/index.d.ts +14 -14
  23. package/dist/index.d.ts.map +1 -1
  24. package/dist/index.js +38 -21
  25. package/dist/index.js.map +1 -1
  26. package/dist/learning.d.ts +167 -172
  27. package/dist/learning.d.ts.map +1 -1
  28. package/dist/learning.js +109 -1
  29. package/dist/learning.js.map +1 -1
  30. package/dist/response.d.ts +636 -0
  31. package/dist/response.d.ts.map +1 -0
  32. package/dist/response.js +354 -0
  33. package/dist/response.js.map +1 -0
  34. package/dist/run.d.ts +73 -40
  35. package/dist/run.d.ts.map +1 -1
  36. package/dist/run.js +108 -1
  37. package/dist/run.js.map +1 -1
  38. package/dist/task.d.ts +114 -78
  39. package/dist/task.d.ts.map +1 -1
  40. package/dist/task.js +149 -2
  41. package/dist/task.js.map +1 -1
  42. package/dist/tracked-project.d.ts +24 -34
  43. package/dist/tracked-project.d.ts.map +1 -1
  44. package/dist/tracked-project.js +34 -0
  45. package/dist/tracked-project.js.map +1 -1
  46. package/package.json +27 -3
  47. package/dist/anchor.d.ts +0 -153
  48. package/dist/anchor.d.ts.map +0 -1
  49. package/dist/anchor.js +0 -27
  50. package/dist/anchor.js.map +0 -1
  51. package/dist/candidate.d.ts +0 -203
  52. package/dist/candidate.d.ts.map +0 -1
  53. package/dist/candidate.js +0 -30
  54. package/dist/candidate.js.map +0 -1
  55. package/dist/edge.d.ts +0 -90
  56. package/dist/edge.d.ts.map +0 -1
  57. package/dist/edge.js +0 -32
  58. package/dist/edge.js.map +0 -1
  59. package/dist/symbol.d.ts +0 -72
  60. package/dist/symbol.d.ts.map +0 -1
  61. package/dist/symbol.js +0 -29
  62. package/dist/symbol.js.map +0 -1
package/dist/task.d.ts CHANGED
@@ -1,120 +1,158 @@
1
1
  /**
2
2
  * Task types for tx
3
3
  *
4
- * Core type definitions for the task management system.
5
- * Zero runtime dependencies - pure TypeScript types only.
4
+ * Core type definitions using Effect Schema (Doctrine Rule 10).
5
+ * Schema definitions provide both compile-time types and runtime validation.
6
6
  */
7
+ import { Schema } from "effect";
7
8
  /**
8
9
  * All valid task statuses in lifecycle order.
9
10
  * backlog → ready → planning → active → blocked → review → human_needs_to_review → done
10
11
  */
11
12
  export declare const TASK_STATUSES: readonly ["backlog", "ready", "planning", "active", "blocked", "review", "human_needs_to_review", "done"];
12
13
  /**
13
- * Task status - one of the valid lifecycle states.
14
+ * Regex pattern for valid task IDs.
14
15
  */
15
- export type TaskStatus = (typeof TASK_STATUSES)[number];
16
+ export declare const TASK_ID_PATTERN: RegExp;
16
17
  /**
17
- * Branded type for task IDs.
18
- * Format: tx-[a-z0-9]{6,8} (e.g., "tx-abc123")
18
+ * Valid status transitions map.
19
+ * Used to validate status changes follow the lifecycle.
19
20
  */
20
- export type TaskId = string & {
21
- readonly _brand: unique symbol;
22
- };
21
+ export declare const VALID_TRANSITIONS: Record<TaskStatus, readonly TaskStatus[]>;
22
+ /** Task status - one of the valid lifecycle states. */
23
+ export declare const TaskStatusSchema: Schema.Literal<["backlog", "ready", "planning", "active", "blocked", "review", "human_needs_to_review", "done"]>;
24
+ export type TaskStatus = typeof TaskStatusSchema.Type;
25
+ /** Task ID - branded string matching tx-[a-z0-9]{6,12}. */
26
+ export declare const TaskIdSchema: Schema.brand<Schema.filter<typeof Schema.String>, "TaskId">;
27
+ export type TaskId = typeof TaskIdSchema.Type;
23
28
  /**
24
29
  * Core task entity without dependency information.
25
30
  * IMPORTANT: Per doctrine Rule 1, never return bare Task to external consumers.
26
31
  * Always use TaskWithDeps for API responses.
27
32
  */
28
- export interface Task {
29
- readonly id: TaskId;
30
- readonly title: string;
31
- readonly description: string;
32
- readonly status: TaskStatus;
33
- readonly parentId: TaskId | null;
34
- readonly score: number;
35
- readonly createdAt: Date;
36
- readonly updatedAt: Date;
37
- readonly completedAt: Date | null;
38
- readonly metadata: Record<string, unknown>;
39
- }
33
+ export declare const TaskSchema: Schema.Struct<{
34
+ id: Schema.brand<Schema.filter<typeof Schema.String>, "TaskId">;
35
+ title: typeof Schema.String;
36
+ description: typeof Schema.String;
37
+ status: Schema.Literal<["backlog", "ready", "planning", "active", "blocked", "review", "human_needs_to_review", "done"]>;
38
+ parentId: Schema.NullOr<Schema.brand<Schema.filter<typeof Schema.String>, "TaskId">>;
39
+ score: Schema.filter<typeof Schema.Number>;
40
+ createdAt: typeof Schema.DateFromSelf;
41
+ updatedAt: typeof Schema.DateFromSelf;
42
+ completedAt: Schema.NullOr<typeof Schema.DateFromSelf>;
43
+ metadata: Schema.Record$<typeof Schema.String, typeof Schema.Unknown>;
44
+ }>;
45
+ export type Task = typeof TaskSchema.Type;
40
46
  /**
41
47
  * Task with full dependency information.
42
48
  * This is the REQUIRED return type for all external APIs (Rule 1).
43
49
  */
44
- export interface TaskWithDeps extends Task {
50
+ export declare const TaskWithDepsSchema: Schema.Struct<{
45
51
  /** Task IDs that block this task */
46
- readonly blockedBy: TaskId[];
52
+ blockedBy: Schema.Array$<Schema.brand<Schema.filter<typeof Schema.String>, "TaskId">>;
47
53
  /** Task IDs this task blocks */
48
- readonly blocks: TaskId[];
54
+ blocks: Schema.Array$<Schema.brand<Schema.filter<typeof Schema.String>, "TaskId">>;
49
55
  /** Direct child task IDs */
50
- readonly children: TaskId[];
56
+ children: Schema.Array$<Schema.brand<Schema.filter<typeof Schema.String>, "TaskId">>;
51
57
  /** Whether this task can be worked on (status is workable AND all blockers are done) */
52
- readonly isReady: boolean;
53
- }
54
- /**
55
- * Recursive tree structure for task hierarchy.
56
- */
57
- export interface TaskTree {
58
+ isReady: typeof Schema.Boolean;
59
+ id: Schema.brand<Schema.filter<typeof Schema.String>, "TaskId">;
60
+ title: typeof Schema.String;
61
+ description: typeof Schema.String;
62
+ status: Schema.Literal<["backlog", "ready", "planning", "active", "blocked", "review", "human_needs_to_review", "done"]>;
63
+ parentId: Schema.NullOr<Schema.brand<Schema.filter<typeof Schema.String>, "TaskId">>;
64
+ score: Schema.filter<typeof Schema.Number>;
65
+ createdAt: typeof Schema.DateFromSelf;
66
+ updatedAt: typeof Schema.DateFromSelf;
67
+ completedAt: Schema.NullOr<typeof Schema.DateFromSelf>;
68
+ metadata: Schema.Record$<typeof Schema.String, typeof Schema.Unknown>;
69
+ }>;
70
+ export type TaskWithDeps = typeof TaskWithDepsSchema.Type;
71
+ /** Recursive tree structure for task hierarchy. */
72
+ export declare const TaskTreeSchema: Schema.Schema<TaskTree, any>;
73
+ export type TaskTree = {
58
74
  readonly task: Task;
59
75
  readonly children: readonly TaskTree[];
60
- }
76
+ };
77
+ /** Task dependency relationship. */
78
+ export declare const TaskDependencySchema: Schema.Struct<{
79
+ blockerId: Schema.brand<Schema.filter<typeof Schema.String>, "TaskId">;
80
+ blockedId: Schema.brand<Schema.filter<typeof Schema.String>, "TaskId">;
81
+ createdAt: typeof Schema.DateFromSelf;
82
+ }>;
83
+ export type TaskDependency = typeof TaskDependencySchema.Type;
84
+ /** Input for creating a new task. */
85
+ export declare const CreateTaskInputSchema: Schema.Struct<{
86
+ title: typeof Schema.String;
87
+ description: Schema.optional<typeof Schema.String>;
88
+ parentId: Schema.optional<Schema.NullOr<typeof Schema.String>>;
89
+ score: Schema.optional<Schema.filter<typeof Schema.Number>>;
90
+ metadata: Schema.optional<Schema.Record$<typeof Schema.String, typeof Schema.Unknown>>;
91
+ }>;
92
+ export type CreateTaskInput = typeof CreateTaskInputSchema.Type;
93
+ /** Input for updating an existing task. */
94
+ export declare const UpdateTaskInputSchema: Schema.Struct<{
95
+ title: Schema.optional<typeof Schema.String>;
96
+ description: Schema.optional<typeof Schema.String>;
97
+ status: Schema.optional<Schema.Literal<["backlog", "ready", "planning", "active", "blocked", "review", "human_needs_to_review", "done"]>>;
98
+ parentId: Schema.optional<Schema.NullOr<typeof Schema.String>>;
99
+ score: Schema.optional<Schema.filter<typeof Schema.Number>>;
100
+ metadata: Schema.optional<Schema.Record$<typeof Schema.String, typeof Schema.Unknown>>;
101
+ }>;
102
+ export type UpdateTaskInput = typeof UpdateTaskInputSchema.Type;
103
+ /** Cursor for pagination (score + id based). */
104
+ export declare const TaskCursorSchema: Schema.Struct<{
105
+ score: typeof Schema.Number;
106
+ id: typeof Schema.String;
107
+ }>;
108
+ export type TaskCursor = typeof TaskCursorSchema.Type;
109
+ /** Filter options for task queries. */
110
+ export declare const TaskFilterSchema: Schema.Struct<{
111
+ status: Schema.optional<Schema.Union<[Schema.Literal<["backlog", "ready", "planning", "active", "blocked", "review", "human_needs_to_review", "done"]>, Schema.Array$<Schema.Literal<["backlog", "ready", "planning", "active", "blocked", "review", "human_needs_to_review", "done"]>>]>>;
112
+ parentId: Schema.optional<Schema.NullOr<typeof Schema.String>>;
113
+ limit: Schema.optional<Schema.filter<typeof Schema.Number>>;
114
+ /** Search in title and description (case-insensitive) */
115
+ search: Schema.optional<typeof Schema.String>;
116
+ /** Cursor for keyset pagination (returns tasks after this cursor) */
117
+ cursor: Schema.optional<Schema.Struct<{
118
+ score: typeof Schema.Number;
119
+ id: typeof Schema.String;
120
+ }>>;
121
+ /** Exclude tasks that have an active claim in task_claims (prevents thundering herd) */
122
+ excludeClaimed: Schema.optional<typeof Schema.Boolean>;
123
+ }>;
124
+ export type TaskFilter = typeof TaskFilterSchema.Type;
61
125
  /**
62
- * Task dependency relationship.
126
+ * Check if a string is a valid task status.
63
127
  */
64
- export interface TaskDependency {
65
- readonly blockerId: TaskId;
66
- readonly blockedId: TaskId;
67
- readonly createdAt: Date;
68
- }
128
+ export declare const isValidTaskStatus: (status: string) => status is TaskStatus;
69
129
  /**
70
- * Input for creating a new task.
130
+ * Error thrown when a task status is invalid.
71
131
  */
72
- export interface CreateTaskInput {
73
- readonly title: string;
74
- readonly description?: string;
75
- readonly parentId?: string | null;
76
- readonly score?: number;
77
- readonly metadata?: Record<string, unknown>;
132
+ export declare class InvalidTaskStatusError extends Error {
133
+ readonly status: string;
134
+ constructor(status: string);
78
135
  }
79
136
  /**
80
- * Input for updating an existing task.
137
+ * Validate and return a TaskStatus, or throw if invalid.
81
138
  */
82
- export interface UpdateTaskInput {
83
- readonly title?: string;
84
- readonly description?: string;
85
- readonly status?: TaskStatus;
86
- readonly parentId?: string | null;
87
- readonly score?: number;
88
- readonly metadata?: Record<string, unknown>;
89
- }
139
+ export declare const assertTaskStatus: (status: string) => TaskStatus;
90
140
  /**
91
- * Cursor for pagination (score + id based).
141
+ * Check if a string is a valid task ID format.
92
142
  */
93
- export interface TaskCursor {
94
- readonly score: number;
95
- readonly id: string;
96
- }
143
+ export declare const isValidTaskId: (id: string) => id is TaskId;
97
144
  /**
98
- * Filter options for task queries.
145
+ * Error thrown when a task ID is invalid.
99
146
  */
100
- export interface TaskFilter {
101
- readonly status?: TaskStatus | TaskStatus[];
102
- readonly parentId?: string | null;
103
- readonly limit?: number;
104
- /** Search in title and description (case-insensitive) */
105
- readonly search?: string;
106
- /** Cursor for keyset pagination (returns tasks after this cursor) */
107
- readonly cursor?: TaskCursor;
147
+ export declare class InvalidTaskIdError extends Error {
148
+ readonly id: string;
149
+ constructor(id: string);
108
150
  }
109
151
  /**
110
- * Valid status transitions map.
111
- * Used to validate status changes follow the lifecycle.
112
- */
113
- export declare const VALID_TRANSITIONS: Record<TaskStatus, readonly TaskStatus[]>;
114
- /**
115
- * Database row type for tasks (snake_case from SQLite).
116
- * Used by repositories for mapping DB rows to Task objects.
152
+ * Validate and return a branded TaskId, or throw if invalid.
117
153
  */
154
+ export declare const assertTaskId: (id: string) => TaskId;
155
+ /** Database row type for tasks (snake_case from SQLite). */
118
156
  export interface TaskRow {
119
157
  id: string;
120
158
  title: string;
@@ -127,9 +165,7 @@ export interface TaskRow {
127
165
  completed_at: string | null;
128
166
  metadata: string;
129
167
  }
130
- /**
131
- * Database row type for dependencies (snake_case from SQLite).
132
- */
168
+ /** Database row type for dependencies (snake_case from SQLite). */
133
169
  export interface DependencyRow {
134
170
  blocker_id: string;
135
171
  blocked_id: string;
@@ -1 +1 @@
1
- {"version":3,"file":"task.d.ts","sourceRoot":"","sources":["../src/task.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"task.d.ts","sourceRoot":"","sources":["../src/task.ts"],"names":[],"mappings":"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"}
package/dist/task.js CHANGED
@@ -1,9 +1,13 @@
1
1
  /**
2
2
  * Task types for tx
3
3
  *
4
- * Core type definitions for the task management system.
5
- * Zero runtime dependencies - pure TypeScript types only.
4
+ * Core type definitions using Effect Schema (Doctrine Rule 10).
5
+ * Schema definitions provide both compile-time types and runtime validation.
6
6
  */
7
+ import { Schema } from "effect";
8
+ // =============================================================================
9
+ // CONSTANTS
10
+ // =============================================================================
7
11
  /**
8
12
  * All valid task statuses in lifecycle order.
9
13
  * backlog → ready → planning → active → blocked → review → human_needs_to_review → done
@@ -18,6 +22,10 @@ export const TASK_STATUSES = [
18
22
  "human_needs_to_review",
19
23
  "done",
20
24
  ];
25
+ /**
26
+ * Regex pattern for valid task IDs.
27
+ */
28
+ export const TASK_ID_PATTERN = /^tx-[a-z0-9]{6,12}$/;
21
29
  /**
22
30
  * Valid status transitions map.
23
31
  * Used to validate status changes follow the lifecycle.
@@ -32,4 +40,143 @@ export const VALID_TRANSITIONS = {
32
40
  human_needs_to_review: ["active", "review", "done"],
33
41
  done: ["backlog"],
34
42
  };
43
+ // =============================================================================
44
+ // SCHEMAS & TYPES
45
+ // =============================================================================
46
+ /** Task status - one of the valid lifecycle states. */
47
+ export const TaskStatusSchema = Schema.Literal(...TASK_STATUSES);
48
+ /** Task ID - branded string matching tx-[a-z0-9]{6,12}. */
49
+ export const TaskIdSchema = Schema.String.pipe(Schema.pattern(TASK_ID_PATTERN), Schema.brand("TaskId"));
50
+ /**
51
+ * Core task entity without dependency information.
52
+ * IMPORTANT: Per doctrine Rule 1, never return bare Task to external consumers.
53
+ * Always use TaskWithDeps for API responses.
54
+ */
55
+ export const TaskSchema = Schema.Struct({
56
+ id: TaskIdSchema,
57
+ title: Schema.String,
58
+ description: Schema.String,
59
+ status: TaskStatusSchema,
60
+ parentId: Schema.NullOr(TaskIdSchema),
61
+ score: Schema.Number.pipe(Schema.int()),
62
+ createdAt: Schema.DateFromSelf,
63
+ updatedAt: Schema.DateFromSelf,
64
+ completedAt: Schema.NullOr(Schema.DateFromSelf),
65
+ metadata: Schema.Record({ key: Schema.String, value: Schema.Unknown }),
66
+ });
67
+ /**
68
+ * Task with full dependency information.
69
+ * This is the REQUIRED return type for all external APIs (Rule 1).
70
+ */
71
+ export const TaskWithDepsSchema = Schema.Struct({
72
+ ...TaskSchema.fields,
73
+ /** Task IDs that block this task */
74
+ blockedBy: Schema.Array(TaskIdSchema),
75
+ /** Task IDs this task blocks */
76
+ blocks: Schema.Array(TaskIdSchema),
77
+ /** Direct child task IDs */
78
+ children: Schema.Array(TaskIdSchema),
79
+ /** Whether this task can be worked on (status is workable AND all blockers are done) */
80
+ isReady: Schema.Boolean,
81
+ });
82
+ /** Recursive tree structure for task hierarchy. */
83
+ export const TaskTreeSchema = Schema.Struct({
84
+ task: TaskSchema,
85
+ children: Schema.Array(Schema.suspend(() => TaskTreeSchema)),
86
+ });
87
+ /** Task dependency relationship. */
88
+ export const TaskDependencySchema = Schema.Struct({
89
+ blockerId: TaskIdSchema,
90
+ blockedId: TaskIdSchema,
91
+ createdAt: Schema.DateFromSelf,
92
+ });
93
+ /** Input for creating a new task. */
94
+ export const CreateTaskInputSchema = Schema.Struct({
95
+ title: Schema.String,
96
+ description: Schema.optional(Schema.String),
97
+ parentId: Schema.optional(Schema.NullOr(Schema.String)),
98
+ score: Schema.optional(Schema.Number.pipe(Schema.int())),
99
+ metadata: Schema.optional(Schema.Record({ key: Schema.String, value: Schema.Unknown })),
100
+ });
101
+ /** Input for updating an existing task. */
102
+ export const UpdateTaskInputSchema = Schema.Struct({
103
+ title: Schema.optional(Schema.String),
104
+ description: Schema.optional(Schema.String),
105
+ status: Schema.optional(TaskStatusSchema),
106
+ parentId: Schema.optional(Schema.NullOr(Schema.String)),
107
+ score: Schema.optional(Schema.Number.pipe(Schema.int())),
108
+ metadata: Schema.optional(Schema.Record({ key: Schema.String, value: Schema.Unknown })),
109
+ });
110
+ /** Cursor for pagination (score + id based). */
111
+ export const TaskCursorSchema = Schema.Struct({
112
+ score: Schema.Number,
113
+ id: Schema.String,
114
+ });
115
+ /** Filter options for task queries. */
116
+ export const TaskFilterSchema = Schema.Struct({
117
+ status: Schema.optional(Schema.Union(TaskStatusSchema, Schema.Array(TaskStatusSchema))),
118
+ parentId: Schema.optional(Schema.NullOr(Schema.String)),
119
+ limit: Schema.optional(Schema.Number.pipe(Schema.int())),
120
+ /** Search in title and description (case-insensitive) */
121
+ search: Schema.optional(Schema.String),
122
+ /** Cursor for keyset pagination (returns tasks after this cursor) */
123
+ cursor: Schema.optional(TaskCursorSchema),
124
+ /** Exclude tasks that have an active claim in task_claims (prevents thundering herd) */
125
+ excludeClaimed: Schema.optional(Schema.Boolean),
126
+ });
127
+ // =============================================================================
128
+ // VALIDATION FUNCTIONS
129
+ // =============================================================================
130
+ /**
131
+ * Check if a string is a valid task status.
132
+ */
133
+ export const isValidTaskStatus = (status) => {
134
+ return TASK_STATUSES.includes(status);
135
+ };
136
+ /**
137
+ * Error thrown when a task status is invalid.
138
+ */
139
+ export class InvalidTaskStatusError extends Error {
140
+ status;
141
+ constructor(status) {
142
+ super(`Invalid task status: "${status}". Valid statuses: ${TASK_STATUSES.join(", ")}`);
143
+ this.status = status;
144
+ this.name = "InvalidTaskStatusError";
145
+ }
146
+ }
147
+ /**
148
+ * Validate and return a TaskStatus, or throw if invalid.
149
+ */
150
+ export const assertTaskStatus = (status) => {
151
+ if (!isValidTaskStatus(status)) {
152
+ throw new InvalidTaskStatusError(status);
153
+ }
154
+ return status;
155
+ };
156
+ /**
157
+ * Check if a string is a valid task ID format.
158
+ */
159
+ export const isValidTaskId = (id) => {
160
+ return TASK_ID_PATTERN.test(id);
161
+ };
162
+ /**
163
+ * Error thrown when a task ID is invalid.
164
+ */
165
+ export class InvalidTaskIdError extends Error {
166
+ id;
167
+ constructor(id) {
168
+ super(`Invalid task ID: "${id}". Expected format: tx-[a-z0-9]{6,12}`);
169
+ this.id = id;
170
+ this.name = "InvalidTaskIdError";
171
+ }
172
+ }
173
+ /**
174
+ * Validate and return a branded TaskId, or throw if invalid.
175
+ */
176
+ export const assertTaskId = (id) => {
177
+ if (!isValidTaskId(id)) {
178
+ throw new InvalidTaskIdError(id);
179
+ }
180
+ return id;
181
+ };
35
182
  //# sourceMappingURL=task.js.map
package/dist/task.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"task.js","sourceRoot":"","sources":["../src/task.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;GAGG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,SAAS;IACT,OAAO;IACP,UAAU;IACV,QAAQ;IACR,SAAS;IACT,QAAQ;IACR,uBAAuB;IACvB,MAAM;CACE,CAAC;AA2GX;;;GAGG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAA8C;IAC1E,OAAO,EAAE,CAAC,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,CAAC;IAC3D,KAAK,EAAE,CAAC,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,CAAC;IAChD,QAAQ,EAAE,CAAC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,CAAC;IAChD,MAAM,EAAE,CAAC,SAAS,EAAE,QAAQ,EAAE,MAAM,CAAC;IACrC,OAAO,EAAE,CAAC,SAAS,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,CAAC;IACnD,MAAM,EAAE,CAAC,QAAQ,EAAE,uBAAuB,EAAE,MAAM,CAAC;IACnD,qBAAqB,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,CAAC;IACnD,IAAI,EAAE,CAAC,SAAS,CAAC;CACT,CAAC"}
1
+ {"version":3,"file":"task.js","sourceRoot":"","sources":["../src/task.ts"],"names":[],"mappings":"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"}
@@ -3,57 +3,47 @@
3
3
  *
4
4
  * Tracked projects are directories that the daemon monitors for JSONL
5
5
  * transcripts to process for learning extraction.
6
+ * Core type definitions using Effect Schema (Doctrine Rule 10).
6
7
  *
7
8
  * @see PRD-015 for the JSONL daemon and knowledge promotion pipeline
8
9
  */
9
- /**
10
- * Source type of the AI tool generating transcripts.
11
- *
12
- * - claude: Claude Code
13
- * - cursor: Cursor IDE
14
- * - windsurf: Windsurf IDE
15
- * - other: Other AI coding tools
16
- */
17
- export type SourceType = "claude" | "cursor" | "windsurf" | "other";
10
+ import { Schema } from "effect";
18
11
  /**
19
12
  * All valid source types.
20
13
  */
21
14
  export declare const SOURCE_TYPES: readonly ["claude", "cursor", "windsurf", "other"];
22
- /**
23
- * Unique identifier for a tracked project.
24
- */
15
+ /** Source type of the AI tool generating transcripts. */
16
+ export declare const SourceTypeSchema: Schema.Literal<["claude", "cursor", "windsurf", "other"]>;
17
+ export type SourceType = typeof SourceTypeSchema.Type;
18
+ /** Unique identifier for a tracked project. */
25
19
  export type TrackedProjectId = number;
26
- /**
27
- * A project directory tracked by the daemon for transcript processing.
28
- */
29
- export interface TrackedProject {
20
+ /** A project directory tracked by the daemon for transcript processing. */
21
+ export declare const TrackedProjectSchema: Schema.Struct<{
30
22
  /** Unique database ID */
31
- readonly id: TrackedProjectId;
23
+ id: Schema.filter<typeof Schema.Number>;
32
24
  /** Absolute path to the project directory */
33
- readonly projectPath: string;
25
+ projectPath: typeof Schema.String;
34
26
  /** Optional project identifier (for linking to tx database) */
35
- readonly projectId: string | null;
27
+ projectId: Schema.NullOr<typeof Schema.String>;
36
28
  /** Type of AI tool generating transcripts */
37
- readonly sourceType: SourceType;
29
+ sourceType: Schema.Literal<["claude", "cursor", "windsurf", "other"]>;
38
30
  /** When the project was added for tracking */
39
- readonly addedAt: Date;
31
+ addedAt: typeof Schema.DateFromSelf;
40
32
  /** Whether tracking is currently enabled */
41
- readonly enabled: boolean;
42
- }
43
- /**
44
- * Input for tracking a new project.
45
- */
46
- export interface CreateTrackedProjectInput {
33
+ enabled: typeof Schema.Boolean;
34
+ }>;
35
+ export type TrackedProject = typeof TrackedProjectSchema.Type;
36
+ /** Input for tracking a new project. */
37
+ export declare const CreateTrackedProjectInputSchema: Schema.Struct<{
47
38
  /** Absolute path to the project directory */
48
- readonly projectPath: string;
39
+ projectPath: typeof Schema.String;
49
40
  /** Optional project identifier */
50
- readonly projectId?: string | null;
41
+ projectId: Schema.optional<Schema.NullOr<typeof Schema.String>>;
51
42
  /** Type of AI tool (defaults to 'claude') */
52
- readonly sourceType?: SourceType;
53
- }
54
- /**
55
- * Database row representation for daemon_tracked_projects table.
56
- */
43
+ sourceType: Schema.optional<Schema.Literal<["claude", "cursor", "windsurf", "other"]>>;
44
+ }>;
45
+ export type CreateTrackedProjectInput = typeof CreateTrackedProjectInputSchema.Type;
46
+ /** Database row representation for daemon_tracked_projects table. */
57
47
  export interface TrackedProjectRow {
58
48
  readonly id: number;
59
49
  readonly project_path: string;
@@ -1 +1 @@
1
- {"version":3,"file":"tracked-project.d.ts","sourceRoot":"","sources":["../src/tracked-project.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH;;;;;;;GAOG;AACH,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,QAAQ,GAAG,UAAU,GAAG,OAAO,CAAA;AAEnE;;GAEG;AACH,eAAO,MAAM,YAAY,oDAAqD,CAAA;AAE9E;;GAEG;AACH,MAAM,MAAM,gBAAgB,GAAG,MAAM,CAAA;AAErC;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,yBAAyB;IACzB,QAAQ,CAAC,EAAE,EAAE,gBAAgB,CAAA;IAC7B,6CAA6C;IAC7C,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAC5B,+DAA+D;IAC/D,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACjC,6CAA6C;IAC7C,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAA;IAC/B,8CAA8C;IAC9C,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAA;IACtB,4CAA4C;IAC5C,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;CAC1B;AAED;;GAEG;AACH,MAAM,WAAW,yBAAyB;IACxC,6CAA6C;IAC7C,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAC5B,kCAAkC;IAClC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAClC,6CAA6C;IAC7C,QAAQ,CAAC,UAAU,CAAC,EAAE,UAAU,CAAA;CACjC;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;IAC7B,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IAClC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CACzB"}
1
+ {"version":3,"file":"tracked-project.d.ts","sourceRoot":"","sources":["../src/tracked-project.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAM/B;;GAEG;AACH,eAAO,MAAM,YAAY,oDAAqD,CAAA;AAM9E,yDAAyD;AACzD,eAAO,MAAM,gBAAgB,2DAAkC,CAAA;AAC/D,MAAM,MAAM,UAAU,GAAG,OAAO,gBAAgB,CAAC,IAAI,CAAA;AAErD,+CAA+C;AAC/C,MAAM,MAAM,gBAAgB,GAAG,MAAM,CAAA;AAErC,2EAA2E;AAC3E,eAAO,MAAM,oBAAoB;IAC/B,yBAAyB;;IAEzB,6CAA6C;;IAE7C,+DAA+D;;IAE/D,6CAA6C;;IAE7C,8CAA8C;;IAE9C,4CAA4C;;EAE5C,CAAA;AACF,MAAM,MAAM,cAAc,GAAG,OAAO,oBAAoB,CAAC,IAAI,CAAA;AAE7D,wCAAwC;AACxC,eAAO,MAAM,+BAA+B;IAC1C,6CAA6C;;IAE7C,kCAAkC;;IAElC,6CAA6C;;EAE7C,CAAA;AACF,MAAM,MAAM,yBAAyB,GAAG,OAAO,+BAA+B,CAAC,IAAI,CAAA;AAMnF,qEAAqE;AACrE,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;IAC7B,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IAClC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CACzB"}
@@ -3,11 +3,45 @@
3
3
  *
4
4
  * Tracked projects are directories that the daemon monitors for JSONL
5
5
  * transcripts to process for learning extraction.
6
+ * Core type definitions using Effect Schema (Doctrine Rule 10).
6
7
  *
7
8
  * @see PRD-015 for the JSONL daemon and knowledge promotion pipeline
8
9
  */
10
+ import { Schema } from "effect";
11
+ // =============================================================================
12
+ // CONSTANTS
13
+ // =============================================================================
9
14
  /**
10
15
  * All valid source types.
11
16
  */
12
17
  export const SOURCE_TYPES = ["claude", "cursor", "windsurf", "other"];
18
+ // =============================================================================
19
+ // SCHEMAS & TYPES
20
+ // =============================================================================
21
+ /** Source type of the AI tool generating transcripts. */
22
+ export const SourceTypeSchema = Schema.Literal(...SOURCE_TYPES);
23
+ /** A project directory tracked by the daemon for transcript processing. */
24
+ export const TrackedProjectSchema = Schema.Struct({
25
+ /** Unique database ID */
26
+ id: Schema.Number.pipe(Schema.int()),
27
+ /** Absolute path to the project directory */
28
+ projectPath: Schema.String,
29
+ /** Optional project identifier (for linking to tx database) */
30
+ projectId: Schema.NullOr(Schema.String),
31
+ /** Type of AI tool generating transcripts */
32
+ sourceType: SourceTypeSchema,
33
+ /** When the project was added for tracking */
34
+ addedAt: Schema.DateFromSelf,
35
+ /** Whether tracking is currently enabled */
36
+ enabled: Schema.Boolean,
37
+ });
38
+ /** Input for tracking a new project. */
39
+ export const CreateTrackedProjectInputSchema = Schema.Struct({
40
+ /** Absolute path to the project directory */
41
+ projectPath: Schema.String,
42
+ /** Optional project identifier */
43
+ projectId: Schema.optional(Schema.NullOr(Schema.String)),
44
+ /** Type of AI tool (defaults to 'claude') */
45
+ sourceType: Schema.optional(SourceTypeSchema),
46
+ });
13
47
  //# sourceMappingURL=tracked-project.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"tracked-project.js","sourceRoot":"","sources":["../src/tracked-project.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAYH;;GAEG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,CAAU,CAAA"}
1
+ {"version":3,"file":"tracked-project.js","sourceRoot":"","sources":["../src/tracked-project.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAE/B,gFAAgF;AAChF,YAAY;AACZ,gFAAgF;AAEhF;;GAEG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,CAAU,CAAA;AAE9E,gFAAgF;AAChF,kBAAkB;AAClB,gFAAgF;AAEhF,yDAAyD;AACzD,MAAM,CAAC,MAAM,gBAAgB,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,YAAY,CAAC,CAAA;AAM/D,2EAA2E;AAC3E,MAAM,CAAC,MAAM,oBAAoB,GAAG,MAAM,CAAC,MAAM,CAAC;IAChD,yBAAyB;IACzB,EAAE,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;IACpC,6CAA6C;IAC7C,WAAW,EAAE,MAAM,CAAC,MAAM;IAC1B,+DAA+D;IAC/D,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC;IACvC,6CAA6C;IAC7C,UAAU,EAAE,gBAAgB;IAC5B,8CAA8C;IAC9C,OAAO,EAAE,MAAM,CAAC,YAAY;IAC5B,4CAA4C;IAC5C,OAAO,EAAE,MAAM,CAAC,OAAO;CACxB,CAAC,CAAA;AAGF,wCAAwC;AACxC,MAAM,CAAC,MAAM,+BAA+B,GAAG,MAAM,CAAC,MAAM,CAAC;IAC3D,6CAA6C;IAC7C,WAAW,EAAE,MAAM,CAAC,MAAM;IAC1B,kCAAkC;IAClC,SAAS,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACxD,6CAA6C;IAC7C,UAAU,EAAE,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAC;CAC9C,CAAC,CAAA"}