@soleri/cli 9.15.0 → 9.16.7
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/dist/commands/add-domain.js +65 -0
- package/dist/commands/add-domain.js.map +1 -1
- package/dist/commands/chat.d.ts +11 -0
- package/dist/commands/chat.js +295 -0
- package/dist/commands/chat.js.map +1 -0
- package/dist/commands/create.js +11 -9
- package/dist/commands/create.js.map +1 -1
- package/dist/commands/dev.js +19 -0
- package/dist/commands/dev.js.map +1 -1
- package/dist/commands/hooks.js +29 -0
- package/dist/commands/hooks.js.map +1 -1
- package/dist/commands/knowledge.d.ts +9 -0
- package/dist/commands/knowledge.js +99 -0
- package/dist/commands/knowledge.js.map +1 -0
- package/dist/commands/pack.js +164 -3
- package/dist/commands/pack.js.map +1 -1
- package/dist/commands/schedule.d.ts +11 -0
- package/dist/commands/schedule.js +130 -0
- package/dist/commands/schedule.js.map +1 -0
- package/dist/commands/staging.d.ts +2 -17
- package/dist/commands/staging.js +4 -4
- package/dist/commands/staging.js.map +1 -1
- package/dist/main.js +6 -0
- package/dist/main.js.map +1 -1
- package/package.json +1 -1
- package/src/__tests__/hook-packs.test.ts +0 -18
- package/src/__tests__/hooks-convert.test.ts +0 -28
- package/src/__tests__/hooks-sync.test.ts +109 -0
- package/src/__tests__/hooks.test.ts +0 -20
- package/src/__tests__/update.test.ts +0 -19
- package/src/__tests__/validator.test.ts +0 -16
- package/src/commands/add-domain.ts +89 -1
- package/src/commands/chat.ts +373 -0
- package/src/commands/create.ts +11 -8
- package/src/commands/dev.ts +21 -0
- package/src/commands/hooks.ts +32 -0
- package/src/commands/knowledge.ts +124 -0
- package/src/commands/pack.ts +219 -1
- package/src/commands/schedule.ts +150 -0
- package/src/commands/staging.ts +5 -5
- package/src/main.ts +6 -0
- package/src/__tests__/dream.test.ts +0 -119
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Schedule CLI — manage autonomous scheduled agent tasks.
|
|
3
|
+
*
|
|
4
|
+
* `soleri schedule create --name X --cron "0 2 * * *" --prompt "run dream"`
|
|
5
|
+
* `soleri schedule list`
|
|
6
|
+
* `soleri schedule delete --id <id>`
|
|
7
|
+
* `soleri schedule pause --id <id>`
|
|
8
|
+
* `soleri schedule resume --id <id>`
|
|
9
|
+
*/
|
|
10
|
+
import * as p from '@clack/prompts';
|
|
11
|
+
import { detectAgent } from '../utils/agent-context.js';
|
|
12
|
+
import * as log from '../utils/logger.js';
|
|
13
|
+
export function registerSchedule(program) {
|
|
14
|
+
const schedule = program
|
|
15
|
+
.command('schedule')
|
|
16
|
+
.description('Manage autonomous scheduled agent tasks');
|
|
17
|
+
// ─── create ────────────────────────────────────────────────────────
|
|
18
|
+
schedule
|
|
19
|
+
.command('create')
|
|
20
|
+
.description('Create a new scheduled task')
|
|
21
|
+
.requiredOption('--name <name>', 'Task name (unique per agent)')
|
|
22
|
+
.requiredOption('--cron <expr>', 'Cron expression (5-field, min 1-hour interval)')
|
|
23
|
+
.requiredOption('--prompt <text>', 'Prompt passed to claude -p when task fires')
|
|
24
|
+
.option('--project-dir <path>', 'Agent project directory (default: current directory)')
|
|
25
|
+
.action(async (opts) => {
|
|
26
|
+
const agent = detectAgent();
|
|
27
|
+
if (!agent) {
|
|
28
|
+
log.fail('Not in a Soleri agent project', 'Run from an agent directory');
|
|
29
|
+
process.exit(1);
|
|
30
|
+
}
|
|
31
|
+
const { Scheduler, InMemorySchedulerStore, validateCron } = await import('@soleri/core');
|
|
32
|
+
const cronError = validateCron(opts.cron);
|
|
33
|
+
if (cronError) {
|
|
34
|
+
log.fail('Invalid cron expression', cronError);
|
|
35
|
+
process.exit(1);
|
|
36
|
+
}
|
|
37
|
+
const s = p.spinner();
|
|
38
|
+
s.start('Creating scheduled task...');
|
|
39
|
+
try {
|
|
40
|
+
const scheduler = new Scheduler(undefined, new InMemorySchedulerStore());
|
|
41
|
+
const result = await scheduler.create({
|
|
42
|
+
name: opts.name,
|
|
43
|
+
cronExpression: opts.cron,
|
|
44
|
+
prompt: opts.prompt,
|
|
45
|
+
projectPath: opts.projectDir ?? agent.agentPath,
|
|
46
|
+
});
|
|
47
|
+
if ('error' in result) {
|
|
48
|
+
s.stop('Failed');
|
|
49
|
+
log.fail(result.error);
|
|
50
|
+
process.exit(1);
|
|
51
|
+
}
|
|
52
|
+
s.stop('Task created');
|
|
53
|
+
log.pass(`Task "${opts.name}" scheduled`, `ID: ${result.id}`);
|
|
54
|
+
p.log.info(`Cron: ${opts.cron}`);
|
|
55
|
+
p.log.info(`Platform ID: ${result.platformId ?? 'pending'}`);
|
|
56
|
+
}
|
|
57
|
+
catch (err) {
|
|
58
|
+
s.stop('Failed');
|
|
59
|
+
log.fail(err instanceof Error ? err.message : String(err));
|
|
60
|
+
process.exit(1);
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
// ─── list ──────────────────────────────────────────────────────────
|
|
64
|
+
schedule
|
|
65
|
+
.command('list')
|
|
66
|
+
.description('List all scheduled tasks')
|
|
67
|
+
.action(async () => {
|
|
68
|
+
const { Scheduler, InMemorySchedulerStore } = await import('@soleri/core');
|
|
69
|
+
const scheduler = new Scheduler(undefined, new InMemorySchedulerStore());
|
|
70
|
+
const tasks = await scheduler.list();
|
|
71
|
+
if (tasks.length === 0) {
|
|
72
|
+
p.log.info('No scheduled tasks. Use: soleri schedule create');
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
log.heading(`Scheduled Tasks (${tasks.length})`);
|
|
76
|
+
for (const t of tasks) {
|
|
77
|
+
const status = t.enabled ? 'enabled' : 'paused';
|
|
78
|
+
const sync = t.platformSynced ? 'synced' : 'not synced';
|
|
79
|
+
p.log.info(`${t.name} [${status}] [${sync}]`);
|
|
80
|
+
p.log.info(` ID: ${t.id} Cron: ${t.cronExpression}`);
|
|
81
|
+
p.log.info(` Prompt: ${t.prompt.slice(0, 60)}${t.prompt.length > 60 ? '...' : ''}`);
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
// ─── delete ────────────────────────────────────────────────────────
|
|
85
|
+
schedule
|
|
86
|
+
.command('delete')
|
|
87
|
+
.description('Delete a scheduled task')
|
|
88
|
+
.requiredOption('--id <id>', 'Task ID to delete')
|
|
89
|
+
.action(async (opts) => {
|
|
90
|
+
const { Scheduler, InMemorySchedulerStore } = await import('@soleri/core');
|
|
91
|
+
const scheduler = new Scheduler(undefined, new InMemorySchedulerStore());
|
|
92
|
+
const result = await scheduler.delete(opts.id);
|
|
93
|
+
if (!result.deleted) {
|
|
94
|
+
log.fail(result.error ?? 'Delete failed');
|
|
95
|
+
process.exit(1);
|
|
96
|
+
}
|
|
97
|
+
log.pass(`Task ${opts.id} deleted`);
|
|
98
|
+
});
|
|
99
|
+
// ─── pause ─────────────────────────────────────────────────────────
|
|
100
|
+
schedule
|
|
101
|
+
.command('pause')
|
|
102
|
+
.description('Pause a scheduled task without deleting it')
|
|
103
|
+
.requiredOption('--id <id>', 'Task ID to pause')
|
|
104
|
+
.action(async (opts) => {
|
|
105
|
+
const { Scheduler, InMemorySchedulerStore } = await import('@soleri/core');
|
|
106
|
+
const scheduler = new Scheduler(undefined, new InMemorySchedulerStore());
|
|
107
|
+
const result = await scheduler.pause(opts.id);
|
|
108
|
+
if (!result.paused) {
|
|
109
|
+
log.fail(result.error ?? 'Pause failed');
|
|
110
|
+
process.exit(1);
|
|
111
|
+
}
|
|
112
|
+
log.pass(`Task ${opts.id} paused`);
|
|
113
|
+
});
|
|
114
|
+
// ─── resume ────────────────────────────────────────────────────────
|
|
115
|
+
schedule
|
|
116
|
+
.command('resume')
|
|
117
|
+
.description('Resume a paused scheduled task')
|
|
118
|
+
.requiredOption('--id <id>', 'Task ID to resume')
|
|
119
|
+
.action(async (opts) => {
|
|
120
|
+
const { Scheduler, InMemorySchedulerStore } = await import('@soleri/core');
|
|
121
|
+
const scheduler = new Scheduler(undefined, new InMemorySchedulerStore());
|
|
122
|
+
const result = await scheduler.resume(opts.id);
|
|
123
|
+
if (!result.resumed) {
|
|
124
|
+
log.fail(result.error ?? 'Resume failed');
|
|
125
|
+
process.exit(1);
|
|
126
|
+
}
|
|
127
|
+
log.pass(`Task ${opts.id} resumed`);
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
//# sourceMappingURL=schedule.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schedule.js","sourceRoot":"","sources":["../../src/commands/schedule.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,27 +1,11 @@
|
|
|
1
1
|
import type { Command } from 'commander';
|
|
2
|
-
|
|
3
|
-
export interface StagedEntry {
|
|
2
|
+
interface StagedEntry {
|
|
4
3
|
id: string;
|
|
5
4
|
timestamp: string;
|
|
6
5
|
path: string;
|
|
7
6
|
size: number;
|
|
8
7
|
isDirectory: boolean;
|
|
9
8
|
}
|
|
10
|
-
/**
|
|
11
|
-
* Walk a directory tree and collect all items with their relative paths.
|
|
12
|
-
*/
|
|
13
|
-
export declare function walkDir(dir: string, base: string): {
|
|
14
|
-
relPath: string;
|
|
15
|
-
size: number;
|
|
16
|
-
}[];
|
|
17
|
-
/**
|
|
18
|
-
* List all staged entries.
|
|
19
|
-
*/
|
|
20
|
-
export declare function listStaged(): StagedEntry[];
|
|
21
|
-
/**
|
|
22
|
-
* Parse a duration string like "7d", "24h", "30m" into milliseconds.
|
|
23
|
-
*/
|
|
24
|
-
export declare function parseDuration(duration: string): number | null;
|
|
25
9
|
export declare function formatSize(bytes: number): string;
|
|
26
10
|
export interface StaleStagingInfo {
|
|
27
11
|
/** Entries older than maxAge. */
|
|
@@ -49,3 +33,4 @@ export declare function getStaleStagingInfo(maxAgeMs?: number): StaleStagingInfo
|
|
|
49
33
|
*/
|
|
50
34
|
export declare function purgeStagingEntries(entries: StagedEntry[]): number;
|
|
51
35
|
export declare function registerStaging(program: Command): void;
|
|
36
|
+
export {};
|
package/dist/commands/staging.js
CHANGED
|
@@ -2,13 +2,13 @@ import { existsSync, readdirSync, statSync, rmSync, cpSync, mkdirSync } from 'no
|
|
|
2
2
|
import { join, relative } from 'node:path';
|
|
3
3
|
import { homedir } from 'node:os';
|
|
4
4
|
import * as log from '../utils/logger.js';
|
|
5
|
-
|
|
5
|
+
const STAGING_ROOT = join(homedir(), '.soleri', 'staging');
|
|
6
6
|
/** Default max age for stale staging entries (7 days). */
|
|
7
7
|
const DEFAULT_MAX_AGE_MS = 7 * 24 * 60 * 60 * 1000;
|
|
8
8
|
/**
|
|
9
9
|
* Walk a directory tree and collect all items with their relative paths.
|
|
10
10
|
*/
|
|
11
|
-
|
|
11
|
+
function walkDir(dir, base) {
|
|
12
12
|
const results = [];
|
|
13
13
|
if (!existsSync(dir))
|
|
14
14
|
return results;
|
|
@@ -29,7 +29,7 @@ export function walkDir(dir, base) {
|
|
|
29
29
|
/**
|
|
30
30
|
* List all staged entries.
|
|
31
31
|
*/
|
|
32
|
-
|
|
32
|
+
function listStaged() {
|
|
33
33
|
if (!existsSync(STAGING_ROOT))
|
|
34
34
|
return [];
|
|
35
35
|
const entries = [];
|
|
@@ -54,7 +54,7 @@ export function listStaged() {
|
|
|
54
54
|
/**
|
|
55
55
|
* Parse a duration string like "7d", "24h", "30m" into milliseconds.
|
|
56
56
|
*/
|
|
57
|
-
|
|
57
|
+
function parseDuration(duration) {
|
|
58
58
|
const match = duration.match(/^(\d+)(d|h|m)$/);
|
|
59
59
|
if (!match)
|
|
60
60
|
return null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"staging.js","sourceRoot":"","sources":["../../src/commands/staging.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACvF,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,KAAK,GAAG,MAAM,oBAAoB,CAAC;AAE1C,MAAM,
|
|
1
|
+
{"version":3,"file":"staging.js","sourceRoot":"","sources":["../../src/commands/staging.ts"],"names":[],"mappings":"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"}
|
package/dist/main.js
CHANGED
|
@@ -31,6 +31,9 @@ import { registerDream } from './commands/dream.js';
|
|
|
31
31
|
import { registerUpdate } from './commands/update.js';
|
|
32
32
|
import { registerBrain } from './commands/brain.js';
|
|
33
33
|
import { registerValidateSkills } from './commands/validate-skills.js';
|
|
34
|
+
import { registerKnowledge } from './commands/knowledge.js';
|
|
35
|
+
import { registerSchedule } from './commands/schedule.js';
|
|
36
|
+
import { registerChat } from './commands/chat.js';
|
|
34
37
|
const require = createRequire(import.meta.url);
|
|
35
38
|
const { version } = require('../package.json');
|
|
36
39
|
const RESET = '\x1b[0m';
|
|
@@ -92,5 +95,8 @@ registerDream(program);
|
|
|
92
95
|
registerUpdate(program);
|
|
93
96
|
registerBrain(program);
|
|
94
97
|
registerValidateSkills(program);
|
|
98
|
+
registerKnowledge(program);
|
|
99
|
+
registerSchedule(program);
|
|
100
|
+
registerChat(program);
|
|
95
101
|
program.parse();
|
|
96
102
|
//# sourceMappingURL=main.js.map
|
package/dist/main.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":";AAEA,MAAM,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;AAC7D,IAAI,KAAK,GAAG,EAAE,EAAE,CAAC;IACf,OAAO,CAAC,KAAK,CACX,yDAAyD,OAAO,CAAC,QAAQ,CAAC,IAAI,sCAAsC,CACrH,CAAC;IACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAC;AAC3E,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -23,24 +23,6 @@ describe('hook-packs', () => {
|
|
|
23
23
|
});
|
|
24
24
|
|
|
25
25
|
describe('registry', () => {
|
|
26
|
-
it('should list all 10 built-in packs', () => {
|
|
27
|
-
const packs = listPacks();
|
|
28
|
-
expect(packs.length).toBe(10);
|
|
29
|
-
const names = packs.map((p) => p.name).sort();
|
|
30
|
-
expect(names).toEqual([
|
|
31
|
-
'a11y',
|
|
32
|
-
'clean-commits',
|
|
33
|
-
'css-discipline',
|
|
34
|
-
'flock-guard',
|
|
35
|
-
'full',
|
|
36
|
-
'marketing-research',
|
|
37
|
-
'rtk',
|
|
38
|
-
'safety',
|
|
39
|
-
'typescript-safety',
|
|
40
|
-
'yolo-safety',
|
|
41
|
-
]);
|
|
42
|
-
});
|
|
43
|
-
|
|
44
26
|
it('should get a specific pack by name', () => {
|
|
45
27
|
const pack = getPack('typescript-safety');
|
|
46
28
|
expect(pack).not.toBeNull();
|
|
@@ -222,22 +222,6 @@ describe('hooks convert', () => {
|
|
|
222
222
|
});
|
|
223
223
|
});
|
|
224
224
|
|
|
225
|
-
describe('constants', () => {
|
|
226
|
-
it('HOOK_EVENTS should contain all 5 events', () => {
|
|
227
|
-
expect(HOOK_EVENTS).toEqual([
|
|
228
|
-
'PreToolUse',
|
|
229
|
-
'PostToolUse',
|
|
230
|
-
'PreCompact',
|
|
231
|
-
'Notification',
|
|
232
|
-
'Stop',
|
|
233
|
-
]);
|
|
234
|
-
});
|
|
235
|
-
|
|
236
|
-
it('ACTION_LEVELS should contain all 3 levels', () => {
|
|
237
|
-
expect(ACTION_LEVELS).toEqual(['remind', 'warn', 'block']);
|
|
238
|
-
});
|
|
239
|
-
});
|
|
240
|
-
|
|
241
225
|
describe('validation', () => {
|
|
242
226
|
it('should reject invalid event', () => {
|
|
243
227
|
const invalidEvent = 'InvalidEvent';
|
|
@@ -248,18 +232,6 @@ describe('hooks convert', () => {
|
|
|
248
232
|
const invalidAction = 'destroy';
|
|
249
233
|
expect(ACTION_LEVELS.includes(invalidAction as any)).toBe(false);
|
|
250
234
|
});
|
|
251
|
-
|
|
252
|
-
it('should accept all valid events', () => {
|
|
253
|
-
for (const event of HOOK_EVENTS) {
|
|
254
|
-
expect(HOOK_EVENTS.includes(event)).toBe(true);
|
|
255
|
-
}
|
|
256
|
-
});
|
|
257
|
-
|
|
258
|
-
it('should accept all valid action levels', () => {
|
|
259
|
-
for (const action of ACTION_LEVELS) {
|
|
260
|
-
expect(ACTION_LEVELS.includes(action)).toBe(true);
|
|
261
|
-
}
|
|
262
|
-
});
|
|
263
235
|
});
|
|
264
236
|
|
|
265
237
|
describe('directory structure', () => {
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
2
|
+
import { Command } from 'commander';
|
|
3
|
+
|
|
4
|
+
// ─── Mocks ─────────────────────────────────────────────────────────────────
|
|
5
|
+
|
|
6
|
+
const mockSyncHooksToClaudeSettings = vi.fn();
|
|
7
|
+
|
|
8
|
+
vi.mock('@soleri/core', () => ({
|
|
9
|
+
syncHooksToClaudeSettings: mockSyncHooksToClaudeSettings,
|
|
10
|
+
}));
|
|
11
|
+
|
|
12
|
+
const mockDetectAgent = vi.fn();
|
|
13
|
+
|
|
14
|
+
vi.mock('../utils/agent-context.js', () => ({
|
|
15
|
+
detectAgent: mockDetectAgent,
|
|
16
|
+
}));
|
|
17
|
+
|
|
18
|
+
// Silence logger output during tests
|
|
19
|
+
vi.mock('../utils/logger.js', () => ({
|
|
20
|
+
pass: vi.fn(),
|
|
21
|
+
fail: vi.fn(),
|
|
22
|
+
warn: vi.fn(),
|
|
23
|
+
info: vi.fn(),
|
|
24
|
+
dim: vi.fn(),
|
|
25
|
+
heading: vi.fn(),
|
|
26
|
+
}));
|
|
27
|
+
|
|
28
|
+
// ─── Helpers ────────────────────────────────────────────────────────────────
|
|
29
|
+
|
|
30
|
+
async function runSyncCommand(): Promise<void> {
|
|
31
|
+
// Import after mocks are established
|
|
32
|
+
const { registerHooks } = await import('../commands/hooks.js');
|
|
33
|
+
const program = new Command();
|
|
34
|
+
program.exitOverride(); // prevent process.exit from killing the test runner
|
|
35
|
+
registerHooks(program);
|
|
36
|
+
await program.parseAsync(['node', 'cli', 'hooks', 'sync']);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// ─── Tests ──────────────────────────────────────────────────────────────────
|
|
40
|
+
|
|
41
|
+
describe('hooks sync command', () => {
|
|
42
|
+
beforeEach(() => {
|
|
43
|
+
vi.resetModules();
|
|
44
|
+
vi.clearAllMocks();
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
it('calls syncHooksToClaudeSettings with the agentId when detectAgent returns a valid context', async () => {
|
|
48
|
+
mockDetectAgent.mockReturnValue({
|
|
49
|
+
agentId: 'myagent',
|
|
50
|
+
agentPath: '/some/path',
|
|
51
|
+
format: 'typescript',
|
|
52
|
+
packageName: 'myagent-mcp',
|
|
53
|
+
hasBrain: false,
|
|
54
|
+
});
|
|
55
|
+
mockSyncHooksToClaudeSettings.mockReturnValue({
|
|
56
|
+
installed: ['SessionStart', 'PreCompact', 'Stop'],
|
|
57
|
+
updated: [],
|
|
58
|
+
skipped: [],
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
await runSyncCommand();
|
|
62
|
+
|
|
63
|
+
expect(mockSyncHooksToClaudeSettings).toHaveBeenCalledTimes(1);
|
|
64
|
+
expect(mockSyncHooksToClaudeSettings).toHaveBeenCalledWith('myagent');
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
it('does NOT call syncHooksToClaudeSettings and exits non-zero when detectAgent returns null', async () => {
|
|
68
|
+
mockDetectAgent.mockReturnValue(null);
|
|
69
|
+
|
|
70
|
+
let exitCode: number | undefined;
|
|
71
|
+
const exitSpy = vi
|
|
72
|
+
.spyOn(process, 'exit')
|
|
73
|
+
.mockImplementation((code?: number | string | null) => {
|
|
74
|
+
exitCode = typeof code === 'number' ? code : 1;
|
|
75
|
+
throw new Error(`process.exit(${exitCode})`);
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
try {
|
|
79
|
+
await runSyncCommand();
|
|
80
|
+
} catch {
|
|
81
|
+
// Expected — process.exit throws via our mock
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
expect(mockSyncHooksToClaudeSettings).not.toHaveBeenCalled();
|
|
85
|
+
expect(exitCode).toBeGreaterThan(0);
|
|
86
|
+
|
|
87
|
+
exitSpy.mockRestore();
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
it('calls syncHooksToClaudeSettings with correct agentId for a file-tree agent context', async () => {
|
|
91
|
+
mockDetectAgent.mockReturnValue({
|
|
92
|
+
agentId: 'my-filetree-agent',
|
|
93
|
+
agentPath: '/path/to/agent',
|
|
94
|
+
format: 'filetree',
|
|
95
|
+
packageName: 'my-filetree-agent',
|
|
96
|
+
hasBrain: true,
|
|
97
|
+
});
|
|
98
|
+
mockSyncHooksToClaudeSettings.mockReturnValue({
|
|
99
|
+
installed: ['SessionStart'],
|
|
100
|
+
updated: ['Stop'],
|
|
101
|
+
skipped: ['PreCompact'],
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
await runSyncCommand();
|
|
105
|
+
|
|
106
|
+
expect(mockSyncHooksToClaudeSettings).toHaveBeenCalledTimes(1);
|
|
107
|
+
expect(mockSyncHooksToClaudeSettings).toHaveBeenCalledWith('my-filetree-agent');
|
|
108
|
+
});
|
|
109
|
+
});
|
|
@@ -3,7 +3,6 @@ import { mkdirSync, rmSync, writeFileSync, existsSync, readFileSync } from 'node
|
|
|
3
3
|
import { join } from 'node:path';
|
|
4
4
|
import { tmpdir } from 'node:os';
|
|
5
5
|
import { installHooks, removeHooks, detectInstalledHooks } from '../hooks/generator.js';
|
|
6
|
-
import { SUPPORTED_EDITORS } from '../hooks/templates.js';
|
|
7
6
|
|
|
8
7
|
describe('hooks commands', () => {
|
|
9
8
|
let tempDir: string;
|
|
@@ -110,24 +109,5 @@ describe('hooks commands', () => {
|
|
|
110
109
|
expect(installed).toContain('claude-code');
|
|
111
110
|
expect(installed).not.toContain('windsurf');
|
|
112
111
|
});
|
|
113
|
-
|
|
114
|
-
it('should detect all 4 editors when all installed', () => {
|
|
115
|
-
for (const editor of SUPPORTED_EDITORS) {
|
|
116
|
-
installHooks(editor, agentDir);
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
const installed = detectInstalledHooks(agentDir);
|
|
120
|
-
expect(installed).toHaveLength(4);
|
|
121
|
-
});
|
|
122
|
-
});
|
|
123
|
-
|
|
124
|
-
describe('SUPPORTED_EDITORS', () => {
|
|
125
|
-
it('should have 4 editors', () => {
|
|
126
|
-
expect(SUPPORTED_EDITORS).toHaveLength(4);
|
|
127
|
-
expect(SUPPORTED_EDITORS).toContain('claude-code');
|
|
128
|
-
expect(SUPPORTED_EDITORS).toContain('cursor');
|
|
129
|
-
expect(SUPPORTED_EDITORS).toContain('windsurf');
|
|
130
|
-
expect(SUPPORTED_EDITORS).toContain('copilot');
|
|
131
|
-
});
|
|
132
112
|
});
|
|
133
113
|
});
|
|
@@ -45,25 +45,6 @@ describe('update command', () => {
|
|
|
45
45
|
vi.clearAllMocks();
|
|
46
46
|
});
|
|
47
47
|
|
|
48
|
-
it('exports registerUpdate function', () => {
|
|
49
|
-
expect(typeof registerUpdate).toBe('function');
|
|
50
|
-
});
|
|
51
|
-
|
|
52
|
-
it('registers a command named "update" on the program', () => {
|
|
53
|
-
const mockCommand = {
|
|
54
|
-
command: vi.fn().mockReturnThis(),
|
|
55
|
-
description: vi.fn().mockReturnThis(),
|
|
56
|
-
action: vi.fn().mockReturnThis(),
|
|
57
|
-
};
|
|
58
|
-
const mockProgram = { command: vi.fn(() => mockCommand) };
|
|
59
|
-
|
|
60
|
-
registerUpdate(mockProgram as never);
|
|
61
|
-
|
|
62
|
-
expect(mockProgram.command).toHaveBeenCalledWith('update');
|
|
63
|
-
expect(mockCommand.description).toHaveBeenCalledWith(expect.stringContaining('Update'));
|
|
64
|
-
expect(mockCommand.action).toHaveBeenCalledWith(expect.any(Function));
|
|
65
|
-
});
|
|
66
|
-
|
|
67
48
|
it('prints already-on-latest when current version matches latest', async () => {
|
|
68
49
|
// getCurrentVersion() reads ../../package.json → packages/cli/package.json.
|
|
69
50
|
// Return the same version from npm view to trigger the "already on latest" branch.
|
|
@@ -52,22 +52,6 @@ describe('validator', () => {
|
|
|
52
52
|
expect(fixtures).toHaveLength(15);
|
|
53
53
|
});
|
|
54
54
|
|
|
55
|
-
it('matching PreToolUse fixtures should have shouldMatch: true', () => {
|
|
56
|
-
const fixtures = generateFixtures('PreToolUse', 'Bash');
|
|
57
|
-
const matching = fixtures.filter((f) => f.shouldMatch);
|
|
58
|
-
for (const f of matching) {
|
|
59
|
-
expect(f.shouldMatch).toBe(true);
|
|
60
|
-
}
|
|
61
|
-
});
|
|
62
|
-
|
|
63
|
-
it('non-matching PreToolUse fixtures should have shouldMatch: false', () => {
|
|
64
|
-
const fixtures = generateFixtures('PreToolUse', 'Write');
|
|
65
|
-
const nonMatching = fixtures.filter((f) => !f.shouldMatch);
|
|
66
|
-
for (const f of nonMatching) {
|
|
67
|
-
expect(f.shouldMatch).toBe(false);
|
|
68
|
-
}
|
|
69
|
-
});
|
|
70
|
-
|
|
71
55
|
it('PreToolUse matching fixtures should contain tool_name and tool_input', () => {
|
|
72
56
|
const fixtures = generateFixtures('PreToolUse', 'Write|Edit');
|
|
73
57
|
const matching = fixtures.filter((f) => f.shouldMatch);
|