tlc-claude-code 2.4.3 → 2.4.5

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 (42) hide show
  1. package/.claude/commands/tlc/build.md +33 -13
  2. package/.claude/commands/tlc/recall.md +59 -87
  3. package/.claude/commands/tlc/remember.md +76 -71
  4. package/.claude/commands/tlc/review.md +76 -21
  5. package/.claude/hooks/tlc-capture-exchange.sh +50 -21
  6. package/.claude/hooks/tlc-session-init.sh +30 -0
  7. package/bin/init.js +12 -3
  8. package/package.json +1 -1
  9. package/server/lib/capture/classifier.js +71 -0
  10. package/server/lib/capture/classifier.test.js +71 -0
  11. package/server/lib/capture/claude-capture.js +140 -0
  12. package/server/lib/capture/claude-capture.test.js +152 -0
  13. package/server/lib/capture/codex-capture.js +79 -0
  14. package/server/lib/capture/codex-capture.test.js +161 -0
  15. package/server/lib/capture/codex-event-parser.js +76 -0
  16. package/server/lib/capture/codex-event-parser.test.js +83 -0
  17. package/server/lib/capture/ensure-ready.js +56 -0
  18. package/server/lib/capture/ensure-ready.test.js +135 -0
  19. package/server/lib/capture/envelope.js +77 -0
  20. package/server/lib/capture/envelope.test.js +169 -0
  21. package/server/lib/capture/extractor.js +51 -0
  22. package/server/lib/capture/extractor.test.js +92 -0
  23. package/server/lib/capture/generic-capture.js +96 -0
  24. package/server/lib/capture/generic-capture.test.js +171 -0
  25. package/server/lib/capture/index.js +117 -0
  26. package/server/lib/capture/index.test.js +263 -0
  27. package/server/lib/capture/redactor.js +68 -0
  28. package/server/lib/capture/redactor.test.js +93 -0
  29. package/server/lib/capture/spool-processor.js +155 -0
  30. package/server/lib/capture/spool-processor.test.js +278 -0
  31. package/server/lib/health-check.js +255 -0
  32. package/server/lib/health-check.test.js +243 -0
  33. package/server/lib/orchestration/cli-dispatch.js +200 -0
  34. package/server/lib/orchestration/cli-dispatch.test.js +242 -0
  35. package/server/lib/orchestration/prompt-builder.js +118 -0
  36. package/server/lib/orchestration/prompt-builder.test.js +200 -0
  37. package/server/lib/orchestration/standalone-compat.js +39 -0
  38. package/server/lib/orchestration/standalone-compat.test.js +144 -0
  39. package/server/lib/orchestration/worktree-manager.js +43 -0
  40. package/server/lib/orchestration/worktree-manager.test.js +50 -0
  41. package/server/lib/task-router-config.js +22 -5
  42. package/server/lib/task-router-config.test.js +46 -13
@@ -27,12 +27,27 @@ function mockFs(fileMap = {}) {
27
27
  describe('task-router-config', () => {
28
28
  // ── SHIPPED_DEFAULTS ──────────────────────────────────────────────
29
29
  describe('SHIPPED_DEFAULTS', () => {
30
- it('maps every routable command to claude/single', () => {
30
+ it('routes coding commands to codex', () => {
31
+ expect(SHIPPED_DEFAULTS['build']).toEqual({ models: ['codex'], strategy: 'single' });
32
+ expect(SHIPPED_DEFAULTS['quick']).toEqual({ models: ['codex'], strategy: 'single' });
33
+ expect(SHIPPED_DEFAULTS['autofix']).toEqual({ models: ['codex'], strategy: 'single' });
34
+ expect(SHIPPED_DEFAULTS['edge-cases']).toEqual({ models: ['codex'], strategy: 'parallel' });
35
+ expect(SHIPPED_DEFAULTS['review']).toEqual({ models: ['codex', 'claude'], strategy: 'parallel' });
36
+ });
37
+
38
+ it('routes thinking commands to claude', () => {
39
+ expect(SHIPPED_DEFAULTS['plan']).toEqual({ models: ['codex', 'claude'], strategy: 'parallel' });
40
+ expect(SHIPPED_DEFAULTS['discuss']).toEqual({ models: ['claude'], strategy: 'single' });
41
+ expect(SHIPPED_DEFAULTS['docs']).toEqual({ models: ['claude'], strategy: 'single' });
42
+ expect(SHIPPED_DEFAULTS['coverage']).toEqual({ models: ['claude'], strategy: 'single' });
43
+ expect(SHIPPED_DEFAULTS['test']).toEqual({ models: ['claude'], strategy: 'single' });
44
+ expect(SHIPPED_DEFAULTS['design']).toEqual({ models: ['claude'], strategy: 'single' });
45
+ expect(SHIPPED_DEFAULTS['vision']).toEqual({ models: ['claude'], strategy: 'single' });
46
+ });
47
+
48
+ it('has an entry for every routable command', () => {
31
49
  for (const cmd of ROUTABLE_COMMANDS) {
32
- expect(SHIPPED_DEFAULTS[cmd]).toEqual({
33
- models: ['claude'],
34
- strategy: 'single',
35
- });
50
+ expect(SHIPPED_DEFAULTS[cmd]).toBeDefined();
36
51
  }
37
52
  });
38
53
  });
@@ -43,6 +58,7 @@ describe('task-router-config', () => {
43
58
  const expected = [
44
59
  'build', 'plan', 'review', 'test', 'coverage',
45
60
  'autofix', 'discuss', 'docs', 'edge-cases', 'quick',
61
+ 'design', 'vision',
46
62
  ];
47
63
  for (const cmd of expected) {
48
64
  expect(ROUTABLE_COMMANDS).toContain(cmd);
@@ -128,7 +144,7 @@ describe('task-router-config', () => {
128
144
 
129
145
  // ── resolveRouting ────────────────────────────────────────────────
130
146
  describe('resolveRouting', () => {
131
- it('returns shipped defaults when no config exists', () => {
147
+ it('returns shipped defaults when no config exists (coding command)', () => {
132
148
  const fs = mockFs({});
133
149
  const result = resolveRouting({
134
150
  command: 'build',
@@ -137,6 +153,23 @@ describe('task-router-config', () => {
137
153
  fs,
138
154
  });
139
155
 
156
+ expect(result).toEqual({
157
+ models: ['codex'],
158
+ strategy: 'single',
159
+ source: 'shipped-defaults',
160
+ warnings: [],
161
+ });
162
+ });
163
+
164
+ it('returns shipped defaults when no config exists (thinking command)', () => {
165
+ const fs = mockFs({});
166
+ const result = resolveRouting({
167
+ command: 'discuss',
168
+ projectDir: '/project',
169
+ homeDir: '/home/user',
170
+ fs,
171
+ });
172
+
140
173
  expect(result).toEqual({
141
174
  models: ['claude'],
142
175
  strategy: 'single',
@@ -274,7 +307,7 @@ describe('task-router-config', () => {
274
307
  warnings: [],
275
308
  });
276
309
 
277
- // 'build' should still use defaults
310
+ // 'build' should still use its shipped default (codex/single)
278
311
  const buildResult = resolveRouting({
279
312
  command: 'build',
280
313
  projectDir: '/project',
@@ -282,7 +315,7 @@ describe('task-router-config', () => {
282
315
  fs,
283
316
  });
284
317
  expect(buildResult).toEqual({
285
- models: ['claude'],
318
+ models: ['codex'],
286
319
  strategy: 'single',
287
320
  source: 'shipped-defaults',
288
321
  warnings: [],
@@ -306,9 +339,9 @@ describe('task-router-config', () => {
306
339
  fs,
307
340
  });
308
341
 
309
- // Should keep default models but use personal strategy
342
+ // Should keep default models (codex for build) but use personal strategy
310
343
  expect(result.strategy).toBe('parallel');
311
- expect(result.models).toEqual(['claude']);
344
+ expect(result.models).toEqual(['codex']);
312
345
  expect(result.source).toBe('personal-config');
313
346
  expect(result.warnings).toEqual([]);
314
347
  });
@@ -393,7 +426,7 @@ describe('task-router-config', () => {
393
426
  });
394
427
 
395
428
  expect(result).toEqual({
396
- models: ['claude'],
429
+ models: ['codex'],
397
430
  strategy: 'single',
398
431
  source: 'shipped-defaults',
399
432
  warnings: [expect.stringContaining('/home/user/.tlc/config.json')],
@@ -413,7 +446,7 @@ describe('task-router-config', () => {
413
446
  });
414
447
 
415
448
  expect(result).toEqual({
416
- models: ['claude'],
449
+ models: ['codex'],
417
450
  strategy: 'single',
418
451
  source: 'shipped-defaults',
419
452
  warnings: [expect.stringContaining('/project/.tlc.json')],
@@ -433,7 +466,7 @@ describe('task-router-config', () => {
433
466
  fs,
434
467
  });
435
468
 
436
- expect(result.models).toEqual(['claude']);
469
+ expect(result.models).toEqual(['codex']);
437
470
  expect(result.strategy).toBe('single');
438
471
  expect(result.source).toBe('shipped-defaults');
439
472
  expect(result.warnings).toHaveLength(2);