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.
- package/.claude/commands/tlc/build.md +33 -13
- package/.claude/commands/tlc/recall.md +59 -87
- package/.claude/commands/tlc/remember.md +76 -71
- package/.claude/commands/tlc/review.md +76 -21
- package/.claude/hooks/tlc-capture-exchange.sh +50 -21
- package/.claude/hooks/tlc-session-init.sh +30 -0
- package/bin/init.js +12 -3
- package/package.json +1 -1
- package/server/lib/capture/classifier.js +71 -0
- package/server/lib/capture/classifier.test.js +71 -0
- package/server/lib/capture/claude-capture.js +140 -0
- package/server/lib/capture/claude-capture.test.js +152 -0
- package/server/lib/capture/codex-capture.js +79 -0
- package/server/lib/capture/codex-capture.test.js +161 -0
- package/server/lib/capture/codex-event-parser.js +76 -0
- package/server/lib/capture/codex-event-parser.test.js +83 -0
- package/server/lib/capture/ensure-ready.js +56 -0
- package/server/lib/capture/ensure-ready.test.js +135 -0
- package/server/lib/capture/envelope.js +77 -0
- package/server/lib/capture/envelope.test.js +169 -0
- package/server/lib/capture/extractor.js +51 -0
- package/server/lib/capture/extractor.test.js +92 -0
- package/server/lib/capture/generic-capture.js +96 -0
- package/server/lib/capture/generic-capture.test.js +171 -0
- package/server/lib/capture/index.js +117 -0
- package/server/lib/capture/index.test.js +263 -0
- package/server/lib/capture/redactor.js +68 -0
- package/server/lib/capture/redactor.test.js +93 -0
- package/server/lib/capture/spool-processor.js +155 -0
- package/server/lib/capture/spool-processor.test.js +278 -0
- package/server/lib/health-check.js +255 -0
- package/server/lib/health-check.test.js +243 -0
- package/server/lib/orchestration/cli-dispatch.js +200 -0
- package/server/lib/orchestration/cli-dispatch.test.js +242 -0
- package/server/lib/orchestration/prompt-builder.js +118 -0
- package/server/lib/orchestration/prompt-builder.test.js +200 -0
- package/server/lib/orchestration/standalone-compat.js +39 -0
- package/server/lib/orchestration/standalone-compat.test.js +144 -0
- package/server/lib/orchestration/worktree-manager.js +43 -0
- package/server/lib/orchestration/worktree-manager.test.js +50 -0
- package/server/lib/task-router-config.js +22 -5
- 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('
|
|
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]).
|
|
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
|
|
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: ['
|
|
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(['
|
|
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: ['
|
|
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: ['
|
|
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(['
|
|
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);
|