@cleocode/core 2026.3.45 → 2026.3.47

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 (154) hide show
  1. package/dist/bootstrap.d.ts.map +1 -1
  2. package/dist/index.js +1508 -377
  3. package/dist/index.js.map +4 -4
  4. package/dist/init.d.ts.map +1 -1
  5. package/dist/injection.d.ts +1 -1
  6. package/dist/injection.d.ts.map +1 -1
  7. package/dist/routing/capability-matrix.d.ts +6 -4
  8. package/dist/routing/capability-matrix.d.ts.map +1 -1
  9. package/dist/scaffold.d.ts +35 -9
  10. package/dist/scaffold.d.ts.map +1 -1
  11. package/dist/skills/agents/install.d.ts.map +1 -1
  12. package/dist/skills/routing-table.d.ts +17 -16
  13. package/dist/skills/routing-table.d.ts.map +1 -1
  14. package/dist/skills/skill-paths.d.ts.map +1 -1
  15. package/dist/system/health.d.ts.map +1 -1
  16. package/dist/ui/index.d.ts +0 -1
  17. package/dist/ui/index.d.ts.map +1 -1
  18. package/package.json +9 -4
  19. package/schemas/adr-frontmatter.schema.json +72 -0
  20. package/schemas/agent-configs.schema.json +120 -0
  21. package/schemas/agent-registry.json +243 -0
  22. package/schemas/agent-registry.schema.json +132 -0
  23. package/schemas/archive/research-manifest.schema.json +257 -0
  24. package/schemas/archive.schema.json +450 -0
  25. package/schemas/brain-decision.schema.json +69 -0
  26. package/schemas/brain-learning.schema.json +57 -0
  27. package/schemas/brain-pattern.schema.json +72 -0
  28. package/schemas/config.schema.json +2606 -0
  29. package/schemas/context-state.schema.json +137 -0
  30. package/schemas/contribution.schema.json +722 -0
  31. package/schemas/critical-path.schema.json +246 -0
  32. package/schemas/deps-cache.schema.json +97 -0
  33. package/schemas/doctor-output.schema.json +283 -0
  34. package/schemas/error.schema.json +161 -0
  35. package/schemas/export-package.schema.json +375 -0
  36. package/schemas/global-config.schema.json +219 -0
  37. package/schemas/grade.schema.json +49 -0
  38. package/schemas/log.schema.json +250 -0
  39. package/schemas/metrics.schema.json +328 -0
  40. package/schemas/migrations.schema.json +150 -0
  41. package/schemas/nexus-registry.schema.json +90 -0
  42. package/schemas/operation-constitution.schema.json +438 -0
  43. package/schemas/output.schema.json +164 -0
  44. package/schemas/project-context.schema.json +164 -0
  45. package/schemas/project-info.schema.json +180 -0
  46. package/schemas/projects-registry.schema.json +107 -0
  47. package/schemas/protocol-frontmatter.schema.json +72 -0
  48. package/schemas/rcasd-consensus-report.schema.json +10 -0
  49. package/schemas/rcasd-evidence.schema.json +42 -0
  50. package/schemas/rcasd-gate-result.schema.json +46 -0
  51. package/schemas/rcasd-hitl-resolution.schema.json +10 -0
  52. package/schemas/rcasd-index.schema.json +10 -0
  53. package/schemas/rcasd-manifest.schema.json +10 -0
  54. package/schemas/rcasd-research-output.schema.json +10 -0
  55. package/schemas/rcasd-spec-frontmatter.schema.json +10 -0
  56. package/schemas/rcasd-stage-transition.schema.json +38 -0
  57. package/schemas/releases.schema.json +267 -0
  58. package/schemas/skills-manifest.schema.json +91 -0
  59. package/schemas/skillsmp.schema.json +208 -0
  60. package/schemas/spec-index.schema.json +196 -0
  61. package/schemas/system-flow-atlas.schema.json +125 -0
  62. package/src/__tests__/injection-chain.test.d.ts +4 -3
  63. package/src/__tests__/injection-chain.test.d.ts.map +1 -1
  64. package/src/__tests__/injection-chain.test.js +11 -10
  65. package/src/__tests__/injection-chain.test.js.map +1 -1
  66. package/src/__tests__/injection-chain.test.ts +11 -10
  67. package/src/__tests__/injection-mvi-tiers.test.js +4 -2
  68. package/src/__tests__/injection-mvi-tiers.test.js.map +1 -1
  69. package/src/__tests__/injection-mvi-tiers.test.ts +4 -2
  70. package/src/agents/__tests__/capacity.test.d.ts +7 -0
  71. package/src/agents/__tests__/capacity.test.d.ts.map +1 -0
  72. package/src/agents/__tests__/capacity.test.js +173 -0
  73. package/src/agents/__tests__/capacity.test.js.map +1 -0
  74. package/src/agents/__tests__/registry.test.d.ts +8 -0
  75. package/src/agents/__tests__/registry.test.d.ts.map +1 -0
  76. package/src/agents/__tests__/registry.test.js +348 -0
  77. package/src/agents/__tests__/registry.test.js.map +1 -0
  78. package/src/agents/__tests__/retry.test.d.ts +7 -0
  79. package/src/agents/__tests__/retry.test.d.ts.map +1 -0
  80. package/src/agents/__tests__/retry.test.js +225 -0
  81. package/src/agents/__tests__/retry.test.js.map +1 -0
  82. package/src/bootstrap.ts +37 -6
  83. package/src/init.ts +63 -18
  84. package/src/injection.ts +11 -5
  85. package/src/intelligence/__tests__/impact.test.d.ts +15 -0
  86. package/src/intelligence/__tests__/impact.test.d.ts.map +1 -0
  87. package/src/intelligence/__tests__/impact.test.js +384 -0
  88. package/src/intelligence/__tests__/impact.test.js.map +1 -0
  89. package/src/intelligence/__tests__/patterns.test.d.ts +8 -0
  90. package/src/intelligence/__tests__/patterns.test.d.ts.map +1 -0
  91. package/src/intelligence/__tests__/patterns.test.js +370 -0
  92. package/src/intelligence/__tests__/patterns.test.js.map +1 -0
  93. package/src/intelligence/__tests__/prediction.test.d.ts +8 -0
  94. package/src/intelligence/__tests__/prediction.test.d.ts.map +1 -0
  95. package/src/intelligence/__tests__/prediction.test.js +314 -0
  96. package/src/intelligence/__tests__/prediction.test.js.map +1 -0
  97. package/src/nexus/__tests__/nexus-e2e.test.d.ts +12 -0
  98. package/src/nexus/__tests__/nexus-e2e.test.d.ts.map +1 -0
  99. package/src/nexus/__tests__/nexus-e2e.test.js +1220 -0
  100. package/src/nexus/__tests__/nexus-e2e.test.js.map +1 -0
  101. package/src/nexus/__tests__/transfer.test.d.ts +8 -0
  102. package/src/nexus/__tests__/transfer.test.d.ts.map +1 -0
  103. package/src/nexus/__tests__/transfer.test.js +372 -0
  104. package/src/nexus/__tests__/transfer.test.js.map +1 -0
  105. package/src/nexus/__tests__/transfer.test.ts +1 -1
  106. package/src/routing/capability-matrix.ts +1435 -205
  107. package/src/scaffold.ts +70 -13
  108. package/src/sessions/__tests__/briefing.test.js +28 -2
  109. package/src/sessions/__tests__/briefing.test.js.map +1 -1
  110. package/src/skills/__tests__/routing-table.test.js +48 -31
  111. package/src/skills/__tests__/routing-table.test.js.map +1 -1
  112. package/src/skills/__tests__/routing-table.test.ts +53 -33
  113. package/src/skills/agents/install.ts +9 -1
  114. package/src/skills/orchestrator/__tests__/spawn-tier.test.js +41 -32
  115. package/src/skills/orchestrator/__tests__/spawn-tier.test.js.map +1 -1
  116. package/src/skills/routing-table.ts +39 -253
  117. package/src/skills/skill-paths.ts +3 -2
  118. package/src/store/__tests__/project-detect.test.js +1 -1
  119. package/src/store/__tests__/project-detect.test.js.map +1 -1
  120. package/src/store/__tests__/project-detect.test.ts +1 -1
  121. package/src/store/__tests__/test-db-helper.d.ts.map +1 -1
  122. package/src/store/__tests__/test-db-helper.js +0 -1
  123. package/src/store/__tests__/test-db-helper.js.map +1 -1
  124. package/src/system/health.ts +18 -7
  125. package/src/ui/index.ts +0 -6
  126. package/src/validation/operation-gate-validators.ts +2 -2
  127. package/templates/CLEO-INJECTION.md +120 -0
  128. package/templates/README.md +29 -0
  129. package/templates/agent-registry.json +305 -0
  130. package/templates/cleo-gitignore +74 -0
  131. package/templates/config.template.json +187 -0
  132. package/templates/git-hooks/commit-msg +149 -0
  133. package/templates/git-hooks/pre-commit +40 -0
  134. package/templates/git-hooks/pre-push +79 -0
  135. package/templates/github/ISSUE_TEMPLATE/bug_report.yml +143 -0
  136. package/templates/github/ISSUE_TEMPLATE/config.yml +8 -0
  137. package/templates/github/ISSUE_TEMPLATE/feature_request.yml +125 -0
  138. package/templates/github/ISSUE_TEMPLATE/help_question.yml +99 -0
  139. package/templates/global-config.template.json +56 -0
  140. package/templates/hooks/precompact-safestop.sh +89 -0
  141. package/templates/issue-templates/bug_report.yml +143 -0
  142. package/templates/issue-templates/config.yml +8 -0
  143. package/templates/issue-templates/feature_request.yml +125 -0
  144. package/templates/issue-templates/help_question.yml +99 -0
  145. package/templates/skillsmp.json.example +28 -0
  146. package/templates/skillsmp.json.example.md +214 -0
  147. package/dist/ui/injection-legacy.d.ts +0 -26
  148. package/dist/ui/injection-legacy.d.ts.map +0 -1
  149. package/src/ui/__tests__/injection-registry.test.d.ts +0 -11
  150. package/src/ui/__tests__/injection-registry.test.d.ts.map +0 -1
  151. package/src/ui/__tests__/injection-registry.test.js +0 -46
  152. package/src/ui/__tests__/injection-registry.test.js.map +0 -1
  153. package/src/ui/__tests__/injection-registry.test.ts +0 -57
  154. package/src/ui/injection-legacy.ts +0 -44
package/src/scaffold.ts CHANGED
@@ -13,7 +13,7 @@
13
13
  import { execFile } from 'node:child_process';
14
14
  import { randomUUID } from 'node:crypto';
15
15
  import { existsSync, constants as fsConstants, readFileSync, statSync } from 'node:fs';
16
- import { access, mkdir, readFile, writeFile } from 'node:fs/promises';
16
+ import { access, mkdir, readFile, rm, writeFile } from 'node:fs/promises';
17
17
  import { dirname, join, resolve } from 'node:path';
18
18
  import { fileURLToPath } from 'node:url';
19
19
  import { promisify } from 'node:util';
@@ -116,11 +116,14 @@ export async function fileExists(path: string): Promise<boolean> {
116
116
  /**
117
117
  * Strip legacy <!-- CLEO:START -->...<!-- CLEO:END --> blocks from a file.
118
118
  * Called before CAAMP injection to prevent competing blocks.
119
+ *
120
+ * Handles both bare markers (<!-- CLEO:START -->) and versioned markers
121
+ * (<!-- CLEO:START v0.53.4 -->, <!-- CLEO:START v1.2.3 -->).
119
122
  */
120
123
  export async function stripCLEOBlocks(filePath: string): Promise<void> {
121
124
  if (!existsSync(filePath)) return;
122
125
  const content = await readFile(filePath, 'utf8');
123
- const stripped = content.replace(/\n?<!-- CLEO:START -->[\s\S]*?<!-- CLEO:END -->\n?/g, '');
126
+ const stripped = content.replace(/\n?<!-- CLEO:START[^>]*-->[\s\S]*?<!-- CLEO:END -->\n?/g, '');
124
127
  if (stripped !== content) await writeFile(filePath, stripped, 'utf8');
125
128
  }
126
129
 
@@ -523,7 +526,7 @@ export async function ensureProjectContext(
523
526
  try {
524
527
  const schemaPath = join(
525
528
  dirname(fileURLToPath(import.meta.url)),
526
- '../../schemas/project-context.schema.json',
529
+ '../schemas/project-context.schema.json',
527
530
  );
528
531
  if (existsSync(schemaPath)) {
529
532
  const AjvModule = await import('ajv');
@@ -1037,13 +1040,51 @@ export function checkMemoryBridge(projectRoot: string): CheckResult {
1037
1040
  * Required subdirectories under the global ~/.cleo/ home.
1038
1041
  * These are infrastructure directories managed by CLEO itself,
1039
1042
  * not project-specific data.
1043
+ *
1044
+ * Truly global:
1045
+ * - logs — global log output
1046
+ * - templates — CLEO-INJECTION.md symlink target
1047
+ *
1048
+ * Note: nexus.db lives directly in ~/.cleo/, not a subdir.
1049
+ * Schemas are read at runtime from getPackageRoot()/schemas/ — no copy needed.
1050
+ * Project-level dirs (adrs/, rcasd/, agent-outputs/, backups/) live in .cleo/ only.
1051
+ */
1052
+ export const REQUIRED_GLOBAL_SUBDIRS = ['logs', 'templates'] as const;
1053
+
1054
+ /**
1055
+ * Stale entries that must NOT exist at the global ~/.cleo/ level.
1056
+ * These were project-level artefacts accidentally placed in the global home
1057
+ * by old versions of CLEO. They are safe to remove because:
1058
+ * - adrs/, rcasd/, agent-outputs/, backups/ — project-level, live in .cleo/
1059
+ * - sandbox/ — unused
1060
+ * - tasks.db / tasks.db-shm / tasks.db-wal — project-level database files
1061
+ * - brain-worker.pid — stale PID file
1062
+ * - VERSION — redundant (read from package.json)
1063
+ * - schemas/ — now read from npm binary at runtime
1064
+ * - bin/ — stale dev symlink directory
1040
1065
  */
1041
- export const REQUIRED_GLOBAL_SUBDIRS = ['schemas', 'templates'] as const;
1066
+ export const STALE_GLOBAL_ENTRIES = [
1067
+ 'adrs',
1068
+ 'rcasd',
1069
+ 'agent-outputs',
1070
+ 'backups',
1071
+ 'sandbox',
1072
+ 'tasks.db',
1073
+ 'tasks.db-shm',
1074
+ 'tasks.db-wal',
1075
+ 'brain-worker.pid',
1076
+ 'VERSION',
1077
+ 'schemas',
1078
+ 'bin',
1079
+ ] as const;
1042
1080
 
1043
1081
  /**
1044
1082
  * Ensure the global ~/.cleo/ home directory and its required
1045
1083
  * subdirectories exist. Idempotent: skips directories that already exist.
1046
1084
  *
1085
+ * Also removes known stale project-level entries that old CLEO versions
1086
+ * incorrectly placed at the global level (see STALE_GLOBAL_ENTRIES).
1087
+ *
1047
1088
  * This is the SSoT for global home scaffolding, replacing raw mkdirSync
1048
1089
  * calls that were previously scattered across global-bootstrap.ts.
1049
1090
  */
@@ -1057,6 +1098,23 @@ export async function ensureGlobalHome(): Promise<ScaffoldResult> {
1057
1098
  await mkdir(join(cleoHome, subdir), { recursive: true });
1058
1099
  }
1059
1100
 
1101
+ // Remove stale project-level entries from global home (one-time cleanup).
1102
+ for (const stale of STALE_GLOBAL_ENTRIES) {
1103
+ const stalePath = join(cleoHome, stale);
1104
+ if (existsSync(stalePath)) {
1105
+ try {
1106
+ await rm(stalePath, { recursive: true, force: true });
1107
+ // eslint-disable-next-line no-console
1108
+ console.warn(`[CLEO] Removed stale global entry: ${stalePath}`);
1109
+ } catch (err) {
1110
+ // eslint-disable-next-line no-console
1111
+ console.warn(
1112
+ `[CLEO] Could not remove stale global entry ${stalePath}: ${err instanceof Error ? err.message : String(err)}`,
1113
+ );
1114
+ }
1115
+ }
1116
+ }
1117
+
1060
1118
  return {
1061
1119
  action: alreadyExists ? 'skipped' : 'created',
1062
1120
  path: cleoHome,
@@ -1111,9 +1169,13 @@ export async function ensureGlobalTemplates(): Promise<ScaffoldResult> {
1111
1169
  }
1112
1170
 
1113
1171
  /**
1114
- * Perform a complete global scaffold operation: ensure home, schemas,
1115
- * and templates are all present and current. This is the single entry
1116
- * point for global infrastructure scaffolding.
1172
+ * Perform a complete global scaffold operation: ensure home and templates
1173
+ * are all present and current. This is the single entry point for global
1174
+ * infrastructure scaffolding.
1175
+ *
1176
+ * Schemas are NOT copied here — they are read at runtime from the npm
1177
+ * package path (getPackageRoot() + '/schemas/'). Use ensureGlobalSchemas()
1178
+ * explicitly from init or upgrade if a copy is needed for a specific workflow.
1117
1179
  *
1118
1180
  * Used by:
1119
1181
  * - MCP startup (via startupHealthCheck in health.ts)
@@ -1122,17 +1184,12 @@ export async function ensureGlobalTemplates(): Promise<ScaffoldResult> {
1122
1184
  */
1123
1185
  export async function ensureGlobalScaffold(): Promise<{
1124
1186
  home: ScaffoldResult;
1125
- schemas: { installed: number; updated: number; total: number };
1126
1187
  templates: ScaffoldResult;
1127
1188
  }> {
1128
- // Lazy import to avoid circular dependency
1129
- const { ensureGlobalSchemas } = await import('./schema-management.js');
1130
-
1131
1189
  const home = await ensureGlobalHome();
1132
- const schemas = ensureGlobalSchemas();
1133
1190
  const templates = await ensureGlobalTemplates();
1134
1191
 
1135
- return { home, schemas, templates };
1192
+ return { home, templates };
1136
1193
  }
1137
1194
 
1138
1195
  // ── Global check* functions (read-only diagnostics) ──────────────────
@@ -17,6 +17,11 @@ vi.mock('../../store/data-accessor.js', () => ({
17
17
  vi.mock('../handoff.js', () => ({
18
18
  getLastHandoff: vi.fn().mockResolvedValue(null),
19
19
  }));
20
+ // Mock lifecycle pipeline — computePipelineStage dynamically imports this
21
+ let mockPipeline = null;
22
+ vi.mock('../../lifecycle/pipeline.js', () => ({
23
+ getPipeline: vi.fn().mockImplementation(() => Promise.resolve(mockPipeline)),
24
+ }));
20
25
  import { getAccessor } from '../../store/data-accessor.js';
21
26
  import { computeBriefing } from '../briefing.js';
22
27
  // ---------------------------------------------------------------------------
@@ -287,13 +292,34 @@ describe('computeBriefing scope filtering', () => {
287
292
  expect(briefing.currentTask.id).toBe('T101');
288
293
  expect(briefing.currentTask.title).toBe('Child 1');
289
294
  });
290
- it('pipelineStage is included when metadata has lifecycle state', async () => {
291
- setupMockAccessor(makeMockTasks(), { lifecycleState: 'implementation' });
295
+ it('pipelineStage is included when active lifecycle pipeline exists', async () => {
296
+ // Mock the lifecycle pipeline BEFORE calling computeBriefing
297
+ mockPipeline = { currentStage: 'implementation', status: 'active', isActive: true };
298
+ // Set up focus state pointing to a task that has a pipeline
299
+ const focus = { currentTask: 'T100', currentPhase: null };
300
+ const metaStore = { focus_state: focus };
301
+ const tasks = makeMockTasks();
302
+ const mockAccessor = {
303
+ loadSessions: vi.fn().mockResolvedValue([]),
304
+ queryTasks: vi.fn().mockResolvedValue({ tasks, total: tasks.length }),
305
+ getMetaValue: vi
306
+ .fn()
307
+ .mockImplementation((key) => Promise.resolve(metaStore[key] ?? null)),
308
+ setMetaValue: vi.fn().mockResolvedValue(undefined),
309
+ loadArchive: vi.fn().mockResolvedValue(null),
310
+ saveArchive: vi.fn().mockResolvedValue(undefined),
311
+ appendLog: vi.fn().mockResolvedValue(undefined),
312
+ close: vi.fn().mockResolvedValue(undefined),
313
+ engine: 'sqlite',
314
+ };
315
+ getAccessor.mockResolvedValue(mockAccessor);
292
316
  const briefing = await computeBriefing('/fake/project', {
293
317
  scope: 'global',
294
318
  });
295
319
  expect(briefing.pipelineStage).toBeDefined();
296
320
  expect(briefing.pipelineStage.currentStage).toBe('implementation');
321
+ // Reset
322
+ mockPipeline = null;
297
323
  });
298
324
  it('blocked tasks include those with unresolved dependencies', async () => {
299
325
  setupMockAccessor();
@@ -1 +1 @@
1
- {"version":3,"file":"briefing.test.js","sourceRoot":"","sources":["briefing.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"briefing.test.js","sourceRoot":"","sources":["briefing.test.ts"],"names":[],"mappings":"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"}
@@ -1,37 +1,12 @@
1
1
  import { describe, expect, it } from 'vitest';
2
- import { getOperationsByChannel, getPreferredChannel, getRoutingForDomain, ROUTING_TABLE, } from '../routing-table.js';
2
+ import { getOperationsByChannel, getPreferredChannel, getRoutingForDomain, } from '../routing-table.js';
3
3
  describe('routing-table', () => {
4
- describe('ROUTING_TABLE structure', () => {
5
- it('has entries for all 10 canonical domains', () => {
6
- const domains = new Set(ROUTING_TABLE.map((e) => e.domain));
7
- expect(domains.has('memory')).toBe(true);
8
- expect(domains.has('tasks')).toBe(true);
9
- expect(domains.has('session')).toBe(true);
10
- expect(domains.has('admin')).toBe(true);
11
- expect(domains.has('tools')).toBe(true);
12
- expect(domains.has('check')).toBe(true);
13
- expect(domains.has('pipeline')).toBe(true);
14
- expect(domains.has('orchestrate')).toBe(true);
15
- expect(domains.has('nexus')).toBe(true);
16
- expect(domains.has('sticky')).toBe(true);
17
- });
18
- it('every entry has required fields', () => {
19
- for (const entry of ROUTING_TABLE) {
20
- expect(entry.domain).toBeTruthy();
21
- expect(entry.operation).toBeTruthy();
22
- expect(['mcp', 'cli', 'either']).toContain(entry.preferredChannel);
23
- expect(entry.reason).toBeTruthy();
24
- }
4
+ describe('getPreferredChannel (via capability matrix)', () => {
5
+ it('returns mcp for memory.find', () => {
6
+ expect(getPreferredChannel('memory', 'find')).toBe('mcp');
25
7
  });
26
- it('has no duplicate domain+operation pairs', () => {
27
- const keys = ROUTING_TABLE.map((e) => `${e.domain}.${e.operation}`);
28
- const unique = new Set(keys);
29
- expect(unique.size).toBe(keys.length);
30
- });
31
- });
32
- describe('getPreferredChannel', () => {
33
- it('returns mcp for memory.brain.search', () => {
34
- expect(getPreferredChannel('memory', 'brain.search')).toBe('mcp');
8
+ it('returns mcp for memory.fetch', () => {
9
+ expect(getPreferredChannel('memory', 'fetch')).toBe('mcp');
35
10
  });
36
11
  it('returns cli for pipeline.release.ship', () => {
37
12
  expect(getPreferredChannel('pipeline', 'release.ship')).toBe('cli');
@@ -42,13 +17,49 @@ describe('routing-table', () => {
42
17
  it('returns either for unknown operations', () => {
43
18
  expect(getPreferredChannel('nonexistent', 'op')).toBe('either');
44
19
  });
20
+ it('returns mcp for tasks.show', () => {
21
+ expect(getPreferredChannel('tasks', 'show')).toBe('mcp');
22
+ });
23
+ it('returns mcp for session.status', () => {
24
+ expect(getPreferredChannel('session', 'status')).toBe('mcp');
25
+ });
26
+ it('returns mcp for admin.dash', () => {
27
+ expect(getPreferredChannel('admin', 'dash')).toBe('mcp');
28
+ });
45
29
  });
46
30
  describe('getRoutingForDomain', () => {
31
+ it('returns entries covering all 10 canonical domains', () => {
32
+ const domains = [
33
+ 'memory',
34
+ 'tasks',
35
+ 'session',
36
+ 'admin',
37
+ 'tools',
38
+ 'check',
39
+ 'pipeline',
40
+ 'orchestrate',
41
+ 'nexus',
42
+ 'sticky',
43
+ ];
44
+ for (const domain of domains) {
45
+ const entries = getRoutingForDomain(domain);
46
+ expect(entries.length).toBeGreaterThan(0);
47
+ expect(entries.every((e) => e.domain === domain)).toBe(true);
48
+ }
49
+ });
47
50
  it('returns all memory domain entries', () => {
48
51
  const entries = getRoutingForDomain('memory');
49
52
  expect(entries.length).toBeGreaterThan(0);
50
53
  expect(entries.every((e) => e.domain === 'memory')).toBe(true);
51
54
  });
55
+ it('every entry has required fields with valid channel', () => {
56
+ const entries = getRoutingForDomain('tasks');
57
+ for (const entry of entries) {
58
+ expect(entry.domain).toBeTruthy();
59
+ expect(entry.operation).toBeTruthy();
60
+ expect(['mcp', 'cli', 'either']).toContain(entry.preferredChannel);
61
+ }
62
+ });
52
63
  it('returns empty array for unknown domain', () => {
53
64
  expect(getRoutingForDomain('nonexistent')).toEqual([]);
54
65
  });
@@ -69,6 +80,12 @@ describe('routing-table', () => {
69
80
  const cliCount = getOperationsByChannel('cli').length;
70
81
  expect(mcpCount).toBeGreaterThan(cliCount);
71
82
  });
83
+ it('has no duplicate domain+operation pairs within a channel', () => {
84
+ const mcpOps = getOperationsByChannel('mcp');
85
+ const keys = mcpOps.map((e) => `${e.domain}.${e.operation}`);
86
+ const unique = new Set(keys);
87
+ expect(unique.size).toBe(keys.length);
88
+ });
72
89
  });
73
90
  });
74
91
  //# sourceMappingURL=routing-table.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"routing-table.test.js","sourceRoot":"","sources":["routing-table.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EACL,sBAAsB,EACtB,mBAAmB,EACnB,mBAAmB,EACnB,aAAa,GACd,MAAM,qBAAqB,CAAC;AAE7B,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;QACvC,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;YAClD,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;YAC5D,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACzC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACxC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC1C,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACxC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACxC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACxC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC3C,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC9C,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACxC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;YACzC,KAAK,MAAM,KAAK,IAAI,aAAa,EAAE,CAAC;gBAClC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,UAAU,EAAE,CAAC;gBAClC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,UAAU,EAAE,CAAC;gBACrC,MAAM,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;gBACnE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,UAAU,EAAE,CAAC;YACpC,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;YACjD,MAAM,IAAI,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;YACpE,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC;YAC7B,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACxC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;QACnC,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;YAC7C,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACpE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;YAC/C,MAAM,CAAC,mBAAmB,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACtE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;YAC1C,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACjE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;YAC/C,MAAM,CAAC,mBAAmB,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAClE,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;QACnC,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;YAC3C,MAAM,OAAO,GAAG,mBAAmB,CAAC,QAAQ,CAAC,CAAC;YAC9C,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;YAC1C,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;YAChD,MAAM,CAAC,mBAAmB,CAAC,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACzD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE;QACtC,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;YAC1C,MAAM,MAAM,GAAG,sBAAsB,CAAC,KAAK,CAAC,CAAC;YAC7C,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;YACzC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,gBAAgB,KAAK,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;YAC1C,MAAM,MAAM,GAAG,sBAAsB,CAAC,KAAK,CAAC,CAAC;YAC7C,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;YACzC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,gBAAgB,KAAK,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;YAC1D,MAAM,QAAQ,GAAG,sBAAsB,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC;YACtD,MAAM,QAAQ,GAAG,sBAAsB,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC;YACtD,MAAM,CAAC,QAAQ,CAAC,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"routing-table.test.js","sourceRoot":"","sources":["routing-table.test.ts"],"names":[],"mappings":"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"}
@@ -3,44 +3,16 @@ import {
3
3
  getOperationsByChannel,
4
4
  getPreferredChannel,
5
5
  getRoutingForDomain,
6
- ROUTING_TABLE,
7
6
  } from '../routing-table.js';
8
7
 
9
8
  describe('routing-table', () => {
10
- describe('ROUTING_TABLE structure', () => {
11
- it('has entries for all 10 canonical domains', () => {
12
- const domains = new Set(ROUTING_TABLE.map((e) => e.domain));
13
- expect(domains.has('memory')).toBe(true);
14
- expect(domains.has('tasks')).toBe(true);
15
- expect(domains.has('session')).toBe(true);
16
- expect(domains.has('admin')).toBe(true);
17
- expect(domains.has('tools')).toBe(true);
18
- expect(domains.has('check')).toBe(true);
19
- expect(domains.has('pipeline')).toBe(true);
20
- expect(domains.has('orchestrate')).toBe(true);
21
- expect(domains.has('nexus')).toBe(true);
22
- expect(domains.has('sticky')).toBe(true);
23
- });
24
-
25
- it('every entry has required fields', () => {
26
- for (const entry of ROUTING_TABLE) {
27
- expect(entry.domain).toBeTruthy();
28
- expect(entry.operation).toBeTruthy();
29
- expect(['mcp', 'cli', 'either']).toContain(entry.preferredChannel);
30
- expect(entry.reason).toBeTruthy();
31
- }
9
+ describe('getPreferredChannel (via capability matrix)', () => {
10
+ it('returns mcp for memory.find', () => {
11
+ expect(getPreferredChannel('memory', 'find')).toBe('mcp');
32
12
  });
33
13
 
34
- it('has no duplicate domain+operation pairs', () => {
35
- const keys = ROUTING_TABLE.map((e) => `${e.domain}.${e.operation}`);
36
- const unique = new Set(keys);
37
- expect(unique.size).toBe(keys.length);
38
- });
39
- });
40
-
41
- describe('getPreferredChannel', () => {
42
- it('returns mcp for memory.brain.search', () => {
43
- expect(getPreferredChannel('memory', 'brain.search')).toBe('mcp');
14
+ it('returns mcp for memory.fetch', () => {
15
+ expect(getPreferredChannel('memory', 'fetch')).toBe('mcp');
44
16
  });
45
17
 
46
18
  it('returns cli for pipeline.release.ship', () => {
@@ -54,15 +26,56 @@ describe('routing-table', () => {
54
26
  it('returns either for unknown operations', () => {
55
27
  expect(getPreferredChannel('nonexistent', 'op')).toBe('either');
56
28
  });
29
+
30
+ it('returns mcp for tasks.show', () => {
31
+ expect(getPreferredChannel('tasks', 'show')).toBe('mcp');
32
+ });
33
+
34
+ it('returns mcp for session.status', () => {
35
+ expect(getPreferredChannel('session', 'status')).toBe('mcp');
36
+ });
37
+
38
+ it('returns mcp for admin.dash', () => {
39
+ expect(getPreferredChannel('admin', 'dash')).toBe('mcp');
40
+ });
57
41
  });
58
42
 
59
43
  describe('getRoutingForDomain', () => {
44
+ it('returns entries covering all 10 canonical domains', () => {
45
+ const domains = [
46
+ 'memory',
47
+ 'tasks',
48
+ 'session',
49
+ 'admin',
50
+ 'tools',
51
+ 'check',
52
+ 'pipeline',
53
+ 'orchestrate',
54
+ 'nexus',
55
+ 'sticky',
56
+ ];
57
+ for (const domain of domains) {
58
+ const entries = getRoutingForDomain(domain);
59
+ expect(entries.length).toBeGreaterThan(0);
60
+ expect(entries.every((e) => e.domain === domain)).toBe(true);
61
+ }
62
+ });
63
+
60
64
  it('returns all memory domain entries', () => {
61
65
  const entries = getRoutingForDomain('memory');
62
66
  expect(entries.length).toBeGreaterThan(0);
63
67
  expect(entries.every((e) => e.domain === 'memory')).toBe(true);
64
68
  });
65
69
 
70
+ it('every entry has required fields with valid channel', () => {
71
+ const entries = getRoutingForDomain('tasks');
72
+ for (const entry of entries) {
73
+ expect(entry.domain).toBeTruthy();
74
+ expect(entry.operation).toBeTruthy();
75
+ expect(['mcp', 'cli', 'either']).toContain(entry.preferredChannel);
76
+ }
77
+ });
78
+
66
79
  it('returns empty array for unknown domain', () => {
67
80
  expect(getRoutingForDomain('nonexistent')).toEqual([]);
68
81
  });
@@ -86,5 +99,12 @@ describe('routing-table', () => {
86
99
  const cliCount = getOperationsByChannel('cli').length;
87
100
  expect(mcpCount).toBeGreaterThan(cliCount);
88
101
  });
102
+
103
+ it('has no duplicate domain+operation pairs within a channel', () => {
104
+ const mcpOps = getOperationsByChannel('mcp');
105
+ const keys = mcpOps.map((e) => `${e.domain}.${e.operation}`);
106
+ const unique = new Set(keys);
107
+ expect(unique.size).toBe(keys.length);
108
+ });
89
109
  });
90
110
  });
@@ -9,10 +9,18 @@
9
9
  */
10
10
 
11
11
  import { existsSync, mkdirSync, readdirSync, readlinkSync, symlinkSync, unlinkSync } from 'node:fs';
12
+ import { platform } from 'node:os';
12
13
  import { basename, join } from 'node:path';
13
14
  import { getClaudeAgentsDir } from '../../paths.js';
14
15
  import { getAgentsDir } from './config.js';
15
16
 
17
+ /**
18
+ * Symlink type for directory symlinks.
19
+ * On Windows, use 'junction' (no admin privileges required).
20
+ * On Unix, use 'dir'.
21
+ */
22
+ const DIR_SYMLINK_TYPE: 'junction' | 'dir' = platform() === 'win32' ? 'junction' : 'dir';
23
+
16
24
  // ============================================================================
17
25
  // Agent Installation
18
26
  // ============================================================================
@@ -65,7 +73,7 @@ export function installAgent(agentDir: string): {
65
73
  }
66
74
 
67
75
  try {
68
- symlinkSync(agentDir, targetPath, 'dir');
76
+ symlinkSync(agentDir, targetPath, DIR_SYMLINK_TYPE);
69
77
  return { installed: true, path: targetPath };
70
78
  } catch (err) {
71
79
  return { installed: false, path: targetPath, error: `Symlink failed: ${err}` };