@yattalo/task-system-core 0.1.0 → 0.2.0

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 (46) hide show
  1. package/README.md +122 -15
  2. package/dist/__tests__/config.test.d.ts +2 -0
  3. package/dist/__tests__/config.test.d.ts.map +1 -0
  4. package/dist/__tests__/config.test.js +43 -0
  5. package/dist/__tests__/config.test.js.map +1 -0
  6. package/dist/__tests__/context-tiers.test.d.ts +2 -0
  7. package/dist/__tests__/context-tiers.test.d.ts.map +1 -0
  8. package/dist/__tests__/context-tiers.test.js +92 -0
  9. package/dist/__tests__/context-tiers.test.js.map +1 -0
  10. package/dist/__tests__/context-types.test.d.ts +2 -0
  11. package/dist/__tests__/context-types.test.d.ts.map +1 -0
  12. package/dist/__tests__/context-types.test.js +44 -0
  13. package/dist/__tests__/context-types.test.js.map +1 -0
  14. package/dist/__tests__/interfaces.test.d.ts +2 -0
  15. package/dist/__tests__/interfaces.test.d.ts.map +1 -0
  16. package/dist/__tests__/interfaces.test.js +83 -0
  17. package/dist/__tests__/interfaces.test.js.map +1 -0
  18. package/dist/__tests__/types.test.d.ts +2 -0
  19. package/dist/__tests__/types.test.d.ts.map +1 -0
  20. package/dist/__tests__/types.test.js +15 -0
  21. package/dist/__tests__/types.test.js.map +1 -0
  22. package/dist/__tests__/validators.test.d.ts +2 -0
  23. package/dist/__tests__/validators.test.d.ts.map +1 -0
  24. package/dist/__tests__/validators.test.js +207 -0
  25. package/dist/__tests__/validators.test.js.map +1 -0
  26. package/dist/config.d.ts +9 -1
  27. package/dist/config.d.ts.map +1 -1
  28. package/dist/config.js +20 -0
  29. package/dist/config.js.map +1 -1
  30. package/dist/context-tiers.d.ts +23 -0
  31. package/dist/context-tiers.d.ts.map +1 -0
  32. package/dist/context-tiers.js +59 -0
  33. package/dist/context-tiers.js.map +1 -0
  34. package/dist/index.d.ts +5 -0
  35. package/dist/index.d.ts.map +1 -1
  36. package/dist/index.js +11 -3
  37. package/dist/index.js.map +1 -1
  38. package/dist/types.d.ts +112 -0
  39. package/dist/types.d.ts.map +1 -1
  40. package/dist/types.js +38 -0
  41. package/dist/types.js.map +1 -1
  42. package/dist/validators.d.ts +244 -4
  43. package/dist/validators.d.ts.map +1 -1
  44. package/dist/validators.js +95 -1
  45. package/dist/validators.js.map +1 -1
  46. package/package.json +3 -2
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # @yattalo/task-system-core
2
2
 
3
- Shared types, config helpers, and Zod validators for `@yattalo/task-system`.
3
+ Shared types, config helpers, Zod validators, and context tier logic for `@yattalo/task-system`.
4
4
 
5
5
  ## Install
6
6
 
@@ -10,39 +10,146 @@ npm install @yattalo/task-system-core
10
10
 
11
11
  ## API
12
12
 
13
- ### `defineConfig(config)`
13
+ ### Configuration
14
14
 
15
- Type-safe configuration builder with defaults.
15
+ #### `defineConfig(config)`
16
+
17
+ Type-safe configuration builder with defaults for the task system scaffold.
16
18
 
17
19
  ```ts
18
20
  import { defineConfig } from "@yattalo/task-system-core";
19
21
 
20
22
  const config = defineConfig({
21
23
  projectName: "my-project",
22
- agents: { claude: { label: "Claude", icon: "C", color: "#6B5CE7" } },
24
+ agents: { claude: { label: "Claude", icon: "C", color: "#D97706" } },
23
25
  categories: ["backend", "frontend"],
24
26
  phases: [{ id: "foundation", label: "Foundation", wave: 1 }],
27
+ taskIdPattern: "[C]\\d{1,3}",
28
+ extensions: { commitTracking: true },
29
+ });
30
+ ```
31
+
32
+ #### `defineRuntimeConfig(config)`
33
+
34
+ Runtime configuration for UCA features (NLM, drift detection, context tiers).
35
+
36
+ ```ts
37
+ import { defineRuntimeConfig } from "@yattalo/task-system-core";
38
+
39
+ const runtime = defineRuntimeConfig({
40
+ projectId: "my-project",
41
+ convexUrl: "https://my-project.convex.cloud",
42
+ nlm: { enabled: true, globalNotebookId: "abc123" },
43
+ drift: { checkpointInterval: 50, timeOverrunMultiplier: 1.5 },
44
+ context: { autoPromoteThreshold: 2 },
25
45
  });
26
46
  ```
27
47
 
28
- ### `validateConfig(raw)`
48
+ ### Context Tier Logic
49
+
50
+ #### `canPromote(entry, targetTier, promoterAgent)`
51
+
52
+ Check if a context entry can be promoted to the target tier.
53
+
54
+ ```ts
55
+ import { canPromote } from "@yattalo/task-system-core";
56
+
57
+ // AI can promote draft->reviewed if confidence > 3
58
+ canPromote(entry, "reviewed", "claude"); // true if entry.confidenceScore > 3
59
+
60
+ // Only humans can promote reviewed->curated
61
+ canPromote(entry, "curated", "human"); // true
62
+ canPromote(entry, "curated", "claude"); // false
63
+ ```
64
+
65
+ #### `canAutoPromote(entry)`
66
+
67
+ Check if an entry qualifies for automatic promotion (draft -> reviewed only). Requires 2+ validations from different agents.
68
+
69
+ ```ts
70
+ import { canAutoPromote } from "@yattalo/task-system-core";
71
+
72
+ // entry.validatedBy = ["claude", "codex"]
73
+ canAutoPromote(entry); // true — 2 unique validators
74
+ ```
75
+
76
+ #### `getNextTier(currentTier)`
77
+
78
+ Returns the next tier in the hierarchy, or `null` if already at top.
79
+
80
+ ```ts
81
+ getNextTier("draft"); // "reviewed"
82
+ getNextTier("reviewed"); // "curated"
83
+ getNextTier("curated"); // null
84
+ ```
85
+
86
+ #### `createPromotionRecord(from, to, promotedBy, reason?)`
87
+
88
+ Create a timestamped promotion record for tracking history.
29
89
 
30
- Validates a `TaskSystemConfig` object using Zod. Throws on invalid input.
90
+ ### Validators
31
91
 
32
- ### `validateTaskDefinitions(raw)`
92
+ All validators use Zod and throw on invalid input.
33
93
 
34
- Validates a `TaskDefinition[]` array using Zod.
94
+ ```ts
95
+ import {
96
+ validateConfig,
97
+ validateTaskDefinitions,
98
+ validateContextEntry,
99
+ validateKnowledgeEntry,
100
+ validateDriftEvent,
101
+ validateAgentRegistryEntry,
102
+ } from "@yattalo/task-system-core";
103
+
104
+ // Validates and returns typed object, or throws ZodError
105
+ const entry = validateContextEntry(rawData);
106
+ ```
35
107
 
36
- ### Helper Functions
108
+ Zod schemas are also exported for custom composition:
109
+
110
+ ```ts
111
+ import {
112
+ contextEntrySchema,
113
+ knowledgeEntrySchema,
114
+ driftEventSchema,
115
+ agentRegistryEntrySchema,
116
+ } from "@yattalo/task-system-core";
117
+ ```
118
+
119
+ ### Config Helpers
120
+
121
+ | Function | Description |
122
+ |----------|-------------|
123
+ | `getActiveExtensions(config)` | List enabled extension keys |
124
+ | `hasSoftwareExtensions(config)` | Check if software extensions enabled |
125
+ | `hasResearchExtensions(config)` | Check if research extensions enabled |
126
+ | `getAgentKeys(config)` | Array of agent key strings |
127
+ | `getTableName(config)` | Convex table name (default: `"agentTasks"`) |
128
+
129
+ ### Constants
130
+
131
+ ```ts
132
+ import {
133
+ TASK_STATUSES, // ["backlog","todo","in_progress","blocked","review","done","archived"]
134
+ TASK_PRIORITIES, // ["critical","high","medium","low"]
135
+ CONTEXT_TIERS, // ["draft","reviewed","curated"]
136
+ CONTEXT_ENTRY_TYPES, // ["task_output","decision","learning","insight",...]
137
+ DRIFT_TYPES, // ["scope_creep","time_overrun","context_switch",...]
138
+ DRIFT_SEVERITIES, // ["low","medium","high"]
139
+ DRIFT_STATUSES, // ["open","acknowledged","resolved","dismissed"]
140
+ KNOWLEDGE_CATEGORIES, // ["pattern","decision","lesson_learned",...]
141
+ AGENT_TYPES, // ["ai","human"]
142
+ AGENT_STATUSES, // ["active","idle","offline"]
143
+ JOB_STATUSES, // ["active","paused","completed","failed"]
144
+ RUN_STATUSES, // ["queued","running","completed","failed","cancelled","timeout"]
145
+ } from "@yattalo/task-system-core";
146
+ ```
37
147
 
38
- - `getActiveExtensions(config)` - List enabled extension keys
39
- - `hasSoftwareExtensions(config)` / `hasResearchExtensions(config)` - Boolean checks
40
- - `getAgentKeys(config)` - Array of agent key strings
41
- - `getTableName(config)` - Convex table name (default: `"agentTasks"`)
148
+ ### Types
42
149
 
43
- ## Types
150
+ **Task System**: `TaskSystemConfig`, `TaskDefinition`, `TaskStatus`, `TaskPriority`, `AgentConfig`, `PhaseConfig`, `ExtensionsConfig`, `GeneratorContext`, `ProjectDetection`, `CommitRecord`, `ScopeCreepFlag`, `EvidenceRecord`, `HandoffRecord`, `CheckpointEntry`, `AgentOpsJob`, `AgentOpsRun`
44
151
 
45
- Key exports: `TaskSystemConfig`, `TaskDefinition`, `GeneratorContext`, `ProjectDetection`, `ExtensionsConfig`, `AgentConfig`, `PhaseConfig`.
152
+ **UCA**: `ContextTier`, `ContextEntryType`, `ContextEntry`, `PromotionRecord`, `DriftType`, `DriftSeverity`, `DriftStatus`, `DriftEvent`, `KnowledgeCategory`, `KnowledgeEntry`, `AgentRegistryType`, `AgentRegistryStatus`, `AgentRegistryEntry`, `RuntimeConfig`, `NlmConfig`, `DriftConfig`, `ContextConfig`
46
153
 
47
154
  ## License
48
155
 
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=config.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/config.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,43 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { defineConfig, defineRuntimeConfig } from "../config.js";
3
+ describe("defineRuntimeConfig", () => {
4
+ it("returns config with defaults", () => {
5
+ const config = defineRuntimeConfig({
6
+ projectId: "uca-main",
7
+ convexUrl: "https://example.convex.cloud",
8
+ });
9
+ expect(config.projectId).toBe("uca-main");
10
+ expect(config.convexUrl).toBe("https://example.convex.cloud");
11
+ expect(config.nlm.enabled).toBe(false);
12
+ expect(config.drift.checkpointInterval).toBe(50);
13
+ expect(config.drift.timeOverrunMultiplier).toBe(1.5);
14
+ expect(config.context.autoPromoteThreshold).toBe(2);
15
+ });
16
+ it("allows overriding defaults", () => {
17
+ const config = defineRuntimeConfig({
18
+ projectId: "test",
19
+ convexUrl: "https://test.convex.cloud",
20
+ nlm: { enabled: true, binaryPath: "/usr/local/bin/nlm", globalNotebookId: "abc" },
21
+ drift: { checkpointInterval: 30 },
22
+ });
23
+ expect(config.nlm.enabled).toBe(true);
24
+ expect(config.nlm.binaryPath).toBe("/usr/local/bin/nlm");
25
+ expect(config.drift.checkpointInterval).toBe(30);
26
+ expect(config.drift.timeOverrunMultiplier).toBe(1.5);
27
+ });
28
+ });
29
+ describe("defineConfig (existing)", () => {
30
+ it("still works unchanged", () => {
31
+ const config = defineConfig({
32
+ projectName: "test",
33
+ agents: { claude: { label: "Claude", icon: "C", color: "#7C3AED" } },
34
+ categories: ["backend"],
35
+ phases: [{ id: "foundation", label: "Foundation", wave: 1 }],
36
+ taskIdPattern: "[C]\\d{1,3}",
37
+ extensions: {},
38
+ });
39
+ expect(config.projectName).toBe("test");
40
+ expect(config.tableName).toBe("agentTasks");
41
+ });
42
+ });
43
+ //# sourceMappingURL=config.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.test.js","sourceRoot":"","sources":["../../src/__tests__/config.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAEjE,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACtC,MAAM,MAAM,GAAG,mBAAmB,CAAC;YACjC,SAAS,EAAE,UAAU;YACrB,SAAS,EAAE,8BAA8B;SAC1C,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC1C,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;QAC9D,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjD,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACrD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACpC,MAAM,MAAM,GAAG,mBAAmB,CAAC;YACjC,SAAS,EAAE,MAAM;YACjB,SAAS,EAAE,2BAA2B;YACtC,GAAG,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,KAAK,EAAE;YACjF,KAAK,EAAE,EAAE,kBAAkB,EAAE,EAAE,EAAE;SAClC,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;QACzD,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjD,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;IACvC,EAAE,CAAC,uBAAuB,EAAE,GAAG,EAAE;QAC/B,MAAM,MAAM,GAAG,YAAY,CAAC;YAC1B,WAAW,EAAE,MAAM;YACnB,MAAM,EAAE,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE;YACpE,UAAU,EAAE,CAAC,SAAS,CAAC;YACvB,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;YAC5D,aAAa,EAAE,aAAa;YAC5B,UAAU,EAAE,EAAE;SACf,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACxC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=context-tiers.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-tiers.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/context-tiers.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,92 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { canPromote, canAutoPromote, getNextTier, createPromotionRecord, } from "../context-tiers.js";
3
+ const makeEntry = (overrides = {}) => ({
4
+ entryId: "ctx-1",
5
+ projectId: "proj-1",
6
+ type: "decision",
7
+ content: "test",
8
+ tier: "draft",
9
+ promotionHistory: [],
10
+ linksTo: [],
11
+ propagateTo: [],
12
+ tags: [],
13
+ createdBy: "claude",
14
+ createdAt: Date.now(),
15
+ updatedAt: Date.now(),
16
+ ...overrides,
17
+ });
18
+ describe("canPromote", () => {
19
+ it("allows draft -> reviewed by human", () => {
20
+ const entry = makeEntry({ tier: "draft" });
21
+ expect(canPromote(entry, "reviewed", "human")).toBe(true);
22
+ });
23
+ it("allows draft -> reviewed by AI with confidence > 3", () => {
24
+ const entry = makeEntry({ tier: "draft", confidenceScore: 4 });
25
+ expect(canPromote(entry, "reviewed", "claude")).toBe(true);
26
+ });
27
+ it("rejects draft -> reviewed by AI with low confidence", () => {
28
+ const entry = makeEntry({ tier: "draft", confidenceScore: 2 });
29
+ expect(canPromote(entry, "reviewed", "claude")).toBe(false);
30
+ });
31
+ it("allows reviewed -> curated only by human", () => {
32
+ const entry = makeEntry({ tier: "reviewed" });
33
+ expect(canPromote(entry, "curated", "human")).toBe(true);
34
+ });
35
+ it("rejects reviewed -> curated by AI", () => {
36
+ const entry = makeEntry({ tier: "reviewed" });
37
+ expect(canPromote(entry, "curated", "claude")).toBe(false);
38
+ });
39
+ it("rejects skipping tiers (draft -> curated)", () => {
40
+ const entry = makeEntry({ tier: "draft" });
41
+ expect(canPromote(entry, "curated", "human")).toBe(false);
42
+ });
43
+ it("rejects same tier promotion", () => {
44
+ const entry = makeEntry({ tier: "draft" });
45
+ expect(canPromote(entry, "draft", "human")).toBe(false);
46
+ });
47
+ });
48
+ describe("canAutoPromote", () => {
49
+ it("auto-promotes draft -> reviewed with 2+ different validators", () => {
50
+ const entry = makeEntry({
51
+ tier: "draft",
52
+ validatedBy: ["claude", "gemini"],
53
+ });
54
+ expect(canAutoPromote(entry)).toBe(true);
55
+ });
56
+ it("does not auto-promote with < 2 validators", () => {
57
+ const entry = makeEntry({
58
+ tier: "draft",
59
+ validatedBy: ["claude"],
60
+ });
61
+ expect(canAutoPromote(entry)).toBe(false);
62
+ });
63
+ it("never auto-promotes to curated", () => {
64
+ const entry = makeEntry({
65
+ tier: "reviewed",
66
+ validatedBy: ["claude", "gemini", "codex"],
67
+ });
68
+ expect(canAutoPromote(entry)).toBe(false);
69
+ });
70
+ });
71
+ describe("getNextTier", () => {
72
+ it("draft -> reviewed", () => {
73
+ expect(getNextTier("draft")).toBe("reviewed");
74
+ });
75
+ it("reviewed -> curated", () => {
76
+ expect(getNextTier("reviewed")).toBe("curated");
77
+ });
78
+ it("curated -> null (no next tier)", () => {
79
+ expect(getNextTier("curated")).toBeNull();
80
+ });
81
+ });
82
+ describe("createPromotionRecord", () => {
83
+ it("creates a valid record", () => {
84
+ const record = createPromotionRecord("draft", "reviewed", "human", "verified by tests");
85
+ expect(record.from).toBe("draft");
86
+ expect(record.to).toBe("reviewed");
87
+ expect(record.promotedBy).toBe("human");
88
+ expect(record.reason).toBe("verified by tests");
89
+ expect(record.timestamp).toBeGreaterThan(0);
90
+ });
91
+ });
92
+ //# sourceMappingURL=context-tiers.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-tiers.test.js","sourceRoot":"","sources":["../../src/__tests__/context-tiers.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=context-types.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-types.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/context-types.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,44 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { CONTEXT_TIERS, CONTEXT_ENTRY_TYPES, DRIFT_TYPES, DRIFT_SEVERITIES, DRIFT_STATUSES, KNOWLEDGE_CATEGORIES, AGENT_TYPES, AGENT_STATUSES, } from "../types.js";
3
+ describe("context tier constants", () => {
4
+ it("exports CONTEXT_TIERS", () => {
5
+ expect(CONTEXT_TIERS).toEqual(["draft", "reviewed", "curated"]);
6
+ });
7
+ it("exports CONTEXT_ENTRY_TYPES with 9 types", () => {
8
+ expect(CONTEXT_ENTRY_TYPES).toContain("task_output");
9
+ expect(CONTEXT_ENTRY_TYPES).toContain("decision");
10
+ expect(CONTEXT_ENTRY_TYPES).toContain("learning");
11
+ expect(CONTEXT_ENTRY_TYPES).toContain("drift_event");
12
+ expect(CONTEXT_ENTRY_TYPES.length).toBe(9);
13
+ });
14
+ it("exports DRIFT_TYPES with 5 types", () => {
15
+ expect(DRIFT_TYPES).toContain("scope_creep");
16
+ expect(DRIFT_TYPES).toContain("time_overrun");
17
+ expect(DRIFT_TYPES).toContain("context_switch");
18
+ expect(DRIFT_TYPES).toContain("quality_drop");
19
+ expect(DRIFT_TYPES).toContain("assumption_introduced");
20
+ expect(DRIFT_TYPES.length).toBe(5);
21
+ });
22
+ it("exports DRIFT_SEVERITIES", () => {
23
+ expect(DRIFT_SEVERITIES).toEqual(["low", "medium", "high"]);
24
+ });
25
+ it("exports DRIFT_STATUSES", () => {
26
+ expect(DRIFT_STATUSES).toEqual(["open", "acknowledged", "resolved", "dismissed"]);
27
+ });
28
+ it("exports KNOWLEDGE_CATEGORIES with 6 categories", () => {
29
+ expect(KNOWLEDGE_CATEGORIES).toContain("pattern");
30
+ expect(KNOWLEDGE_CATEGORIES).toContain("decision");
31
+ expect(KNOWLEDGE_CATEGORIES).toContain("lesson_learned");
32
+ expect(KNOWLEDGE_CATEGORIES).toContain("best_practice");
33
+ expect(KNOWLEDGE_CATEGORIES).toContain("anti_pattern");
34
+ expect(KNOWLEDGE_CATEGORIES).toContain("reference");
35
+ expect(KNOWLEDGE_CATEGORIES.length).toBe(6);
36
+ });
37
+ it("exports AGENT_TYPES", () => {
38
+ expect(AGENT_TYPES).toEqual(["ai", "human"]);
39
+ });
40
+ it("exports AGENT_STATUSES", () => {
41
+ expect(AGENT_STATUSES).toEqual(["active", "idle", "offline"]);
42
+ });
43
+ });
44
+ //# sourceMappingURL=context-types.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-types.test.js","sourceRoot":"","sources":["../../src/__tests__/context-types.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=interfaces.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interfaces.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/interfaces.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,83 @@
1
+ import { describe, it, expect } from "vitest";
2
+ describe("UCA interfaces", () => {
3
+ it("ContextEntry has required fields", () => {
4
+ const entry = {
5
+ entryId: "ctx-1",
6
+ projectId: "proj-1",
7
+ type: "decision",
8
+ content: "chose Convex over Supabase",
9
+ tier: "draft",
10
+ promotionHistory: [],
11
+ linksTo: [],
12
+ propagateTo: [],
13
+ tags: ["architecture"],
14
+ createdBy: "claude",
15
+ createdAt: Date.now(),
16
+ updatedAt: Date.now(),
17
+ };
18
+ expect(entry.tier).toBe("draft");
19
+ expect(entry.promotionHistory).toEqual([]);
20
+ });
21
+ it("PromotionRecord tracks tier changes", () => {
22
+ const record = {
23
+ from: "draft",
24
+ to: "reviewed",
25
+ promotedBy: "human",
26
+ timestamp: Date.now(),
27
+ };
28
+ expect(record.from).toBe("draft");
29
+ expect(record.to).toBe("reviewed");
30
+ });
31
+ it("KnowledgeEntry requires confidence score", () => {
32
+ const entry = {
33
+ entryId: "kb-1",
34
+ title: "Use Convex for real-time",
35
+ content: "Convex subscriptions are better than polling for dashboards",
36
+ category: "best_practice",
37
+ confidenceScore: 4,
38
+ sourceEntryIds: ["ctx-1"],
39
+ tags: ["convex", "performance"],
40
+ createdBy: "claude",
41
+ createdAt: Date.now(),
42
+ updatedAt: Date.now(),
43
+ usageCount: 0,
44
+ };
45
+ expect(entry.confidenceScore).toBe(4);
46
+ expect(entry.category).toBe("best_practice");
47
+ });
48
+ it("DriftEvent tracks scope creep", () => {
49
+ const event = {
50
+ eventId: "drift-1",
51
+ projectId: "proj-1",
52
+ agent: "claude",
53
+ driftType: "scope_creep",
54
+ description: "Added auth when task was about UI",
55
+ severity: "medium",
56
+ status: "open",
57
+ detectedAt: Date.now(),
58
+ };
59
+ expect(event.driftType).toBe("scope_creep");
60
+ expect(event.status).toBe("open");
61
+ });
62
+ it("AgentRegistryEntry supports human type", () => {
63
+ const agent = {
64
+ agentId: "human",
65
+ label: "Human Operator",
66
+ type: "human",
67
+ capabilities: ["review", "curation", "strategy"],
68
+ preferredCategories: ["architecture", "design"],
69
+ currentStatus: "active",
70
+ currentTaskIds: ["HU1"],
71
+ totalTasksCompleted: 42,
72
+ totalHoursLogged: 120,
73
+ avgCompletionRate: 0.85,
74
+ driftEventsTriggered: 3,
75
+ taskIdPrefix: "HU",
76
+ color: "#10B981",
77
+ icon: "P",
78
+ };
79
+ expect(agent.type).toBe("human");
80
+ expect(agent.capabilities).toContain("curation");
81
+ });
82
+ });
83
+ //# sourceMappingURL=interfaces.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interfaces.test.js","sourceRoot":"","sources":["../../src/__tests__/interfaces.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAS9C,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,MAAM,KAAK,GAAiB;YAC1B,OAAO,EAAE,OAAO;YAChB,SAAS,EAAE,QAAQ;YACnB,IAAI,EAAE,UAAU;YAChB,OAAO,EAAE,4BAA4B;YACrC,IAAI,EAAE,OAAO;YACb,gBAAgB,EAAE,EAAE;YACpB,OAAO,EAAE,EAAE;YACX,WAAW,EAAE,EAAE;YACf,IAAI,EAAE,CAAC,cAAc,CAAC;YACtB,SAAS,EAAE,QAAQ;YACnB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;YACrB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACtB,CAAC;QACF,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACjC,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,MAAM,GAAoB;YAC9B,IAAI,EAAE,OAAO;YACb,EAAE,EAAE,UAAU;YACd,UAAU,EAAE,OAAO;YACnB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACtB,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAClC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,MAAM,KAAK,GAAmB;YAC5B,OAAO,EAAE,MAAM;YACf,KAAK,EAAE,0BAA0B;YACjC,OAAO,EAAE,6DAA6D;YACtE,QAAQ,EAAE,eAAe;YACzB,eAAe,EAAE,CAAC;YAClB,cAAc,EAAE,CAAC,OAAO,CAAC;YACzB,IAAI,EAAE,CAAC,QAAQ,EAAE,aAAa,CAAC;YAC/B,SAAS,EAAE,QAAQ;YACnB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;YACrB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;YACrB,UAAU,EAAE,CAAC;SACd,CAAC;QACF,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACtC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACvC,MAAM,KAAK,GAAe;YACxB,OAAO,EAAE,SAAS;YAClB,SAAS,EAAE,QAAQ;YACnB,KAAK,EAAE,QAAQ;YACf,SAAS,EAAE,aAAa;YACxB,WAAW,EAAE,mCAAmC;YAChD,QAAQ,EAAE,QAAQ;YAClB,MAAM,EAAE,MAAM;YACd,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE;SACvB,CAAC;QACF,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAC5C,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,MAAM,KAAK,GAAuB;YAChC,OAAO,EAAE,OAAO;YAChB,KAAK,EAAE,gBAAgB;YACvB,IAAI,EAAE,OAAO;YACb,YAAY,EAAE,CAAC,QAAQ,EAAE,UAAU,EAAE,UAAU,CAAC;YAChD,mBAAmB,EAAE,CAAC,cAAc,EAAE,QAAQ,CAAC;YAC/C,aAAa,EAAE,QAAQ;YACvB,cAAc,EAAE,CAAC,KAAK,CAAC;YACvB,mBAAmB,EAAE,EAAE;YACvB,gBAAgB,EAAE,GAAG;YACrB,iBAAiB,EAAE,IAAI;YACvB,oBAAoB,EAAE,CAAC;YACvB,YAAY,EAAE,IAAI;YAClB,KAAK,EAAE,SAAS;YAChB,IAAI,EAAE,GAAG;SACV,CAAC;QACF,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACjC,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/types.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,15 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { TASK_STATUSES, TASK_PRIORITIES } from "../types.js";
3
+ describe("existing types", () => {
4
+ it("exports TASK_STATUSES", () => {
5
+ expect(TASK_STATUSES).toContain("backlog");
6
+ expect(TASK_STATUSES).toContain("done");
7
+ expect(TASK_STATUSES.length).toBe(7);
8
+ });
9
+ it("exports TASK_PRIORITIES", () => {
10
+ expect(TASK_PRIORITIES).toContain("critical");
11
+ expect(TASK_PRIORITIES).toContain("low");
12
+ expect(TASK_PRIORITIES.length).toBe(4);
13
+ });
14
+ });
15
+ //# sourceMappingURL=types.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.test.js","sourceRoot":"","sources":["../../src/__tests__/types.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE7D,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,EAAE,CAAC,uBAAuB,EAAE,GAAG,EAAE;QAC/B,MAAM,CAAC,aAAa,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QAC3C,MAAM,CAAC,aAAa,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACxC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yBAAyB,EAAE,GAAG,EAAE;QACjC,MAAM,CAAC,eAAe,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QAC9C,MAAM,CAAC,eAAe,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QACzC,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=validators.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validators.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/validators.test.ts"],"names":[],"mappings":""}