chief-clancy 0.8.23 → 0.9.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 (94) hide show
  1. package/bin/clancy.js +153 -0
  2. package/package.json +8 -88
  3. package/README.md +0 -292
  4. package/dist/bundle/clancy-afk.js +0 -6
  5. package/dist/bundle/clancy-once.js +0 -239
  6. package/dist/installer/file-ops/file-ops.d.ts +0 -32
  7. package/dist/installer/file-ops/file-ops.d.ts.map +0 -1
  8. package/dist/installer/file-ops/file-ops.js +0 -58
  9. package/dist/installer/file-ops/file-ops.js.map +0 -1
  10. package/dist/installer/hook-installer/hook-installer.d.ts +0 -31
  11. package/dist/installer/hook-installer/hook-installer.d.ts.map +0 -1
  12. package/dist/installer/hook-installer/hook-installer.js +0 -137
  13. package/dist/installer/hook-installer/hook-installer.js.map +0 -1
  14. package/dist/installer/install.d.ts +0 -3
  15. package/dist/installer/install.d.ts.map +0 -1
  16. package/dist/installer/install.js +0 -270
  17. package/dist/installer/install.js.map +0 -1
  18. package/dist/installer/manifest/manifest.d.ts +0 -41
  19. package/dist/installer/manifest/manifest.d.ts.map +0 -1
  20. package/dist/installer/manifest/manifest.js +0 -97
  21. package/dist/installer/manifest/manifest.js.map +0 -1
  22. package/dist/installer/prompts/prompts.d.ts +0 -33
  23. package/dist/installer/prompts/prompts.d.ts.map +0 -1
  24. package/dist/installer/prompts/prompts.js +0 -55
  25. package/dist/installer/prompts/prompts.js.map +0 -1
  26. package/dist/installer/role-filter/role-filter.d.ts +0 -15
  27. package/dist/installer/role-filter/role-filter.d.ts.map +0 -1
  28. package/dist/installer/role-filter/role-filter.js +0 -48
  29. package/dist/installer/role-filter/role-filter.js.map +0 -1
  30. package/dist/installer/ui/ui.d.ts +0 -9
  31. package/dist/installer/ui/ui.d.ts.map +0 -1
  32. package/dist/installer/ui/ui.js +0 -94
  33. package/dist/installer/ui/ui.js.map +0 -1
  34. package/dist/scripts/shared/env-parser/env-parser.d.ts +0 -30
  35. package/dist/scripts/shared/env-parser/env-parser.d.ts.map +0 -1
  36. package/dist/scripts/shared/env-parser/env-parser.js +0 -64
  37. package/dist/scripts/shared/env-parser/env-parser.js.map +0 -1
  38. package/dist/utils/ansi/ansi.d.ts +0 -55
  39. package/dist/utils/ansi/ansi.d.ts.map +0 -1
  40. package/dist/utils/ansi/ansi.js +0 -55
  41. package/dist/utils/ansi/ansi.js.map +0 -1
  42. package/hooks/clancy-branch-guard.js +0 -128
  43. package/hooks/clancy-check-update.js +0 -114
  44. package/hooks/clancy-context-monitor.js +0 -189
  45. package/hooks/clancy-credential-guard.js +0 -120
  46. package/hooks/clancy-drift-detector.js +0 -96
  47. package/hooks/clancy-notification.js +0 -105
  48. package/hooks/clancy-post-compact.js +0 -53
  49. package/hooks/clancy-statusline.js +0 -82
  50. package/hooks/package.json +0 -3
  51. package/registry/boards.json +0 -44
  52. package/src/agents/arch-agent.md +0 -72
  53. package/src/agents/concerns-agent.md +0 -89
  54. package/src/agents/design-agent.md +0 -130
  55. package/src/agents/devils-advocate.md +0 -53
  56. package/src/agents/quality-agent.md +0 -161
  57. package/src/agents/tech-agent.md +0 -92
  58. package/src/agents/verification-gate.md +0 -128
  59. package/src/roles/implementer/commands/dry-run.md +0 -14
  60. package/src/roles/implementer/commands/once.md +0 -17
  61. package/src/roles/implementer/commands/run.md +0 -11
  62. package/src/roles/implementer/workflows/once.md +0 -146
  63. package/src/roles/implementer/workflows/run.md +0 -127
  64. package/src/roles/planner/commands/approve-plan.md +0 -10
  65. package/src/roles/planner/commands/plan.md +0 -20
  66. package/src/roles/planner/workflows/approve-plan.md +0 -535
  67. package/src/roles/planner/workflows/plan.md +0 -536
  68. package/src/roles/reviewer/commands/logs.md +0 -7
  69. package/src/roles/reviewer/commands/review.md +0 -9
  70. package/src/roles/reviewer/commands/status.md +0 -9
  71. package/src/roles/reviewer/workflows/logs.md +0 -104
  72. package/src/roles/reviewer/workflows/review.md +0 -186
  73. package/src/roles/reviewer/workflows/status.md +0 -134
  74. package/src/roles/setup/commands/doctor.md +0 -7
  75. package/src/roles/setup/commands/help.md +0 -80
  76. package/src/roles/setup/commands/init.md +0 -7
  77. package/src/roles/setup/commands/map-codebase.md +0 -16
  78. package/src/roles/setup/commands/settings.md +0 -7
  79. package/src/roles/setup/commands/uninstall.md +0 -5
  80. package/src/roles/setup/commands/update-docs.md +0 -9
  81. package/src/roles/setup/commands/update.md +0 -12
  82. package/src/roles/setup/workflows/doctor.md +0 -124
  83. package/src/roles/setup/workflows/init.md +0 -1073
  84. package/src/roles/setup/workflows/map-codebase.md +0 -125
  85. package/src/roles/setup/workflows/scaffold.md +0 -845
  86. package/src/roles/setup/workflows/settings.md +0 -944
  87. package/src/roles/setup/workflows/uninstall.md +0 -161
  88. package/src/roles/setup/workflows/update-docs.md +0 -92
  89. package/src/roles/setup/workflows/update.md +0 -277
  90. package/src/roles/strategist/commands/approve-brief.md +0 -21
  91. package/src/roles/strategist/commands/brief.md +0 -27
  92. package/src/roles/strategist/workflows/approve-brief.md +0 -834
  93. package/src/roles/strategist/workflows/brief.md +0 -890
  94. package/src/templates/CLAUDE.md +0 -87
@@ -1,32 +0,0 @@
1
- /** Minimal directory-entry shape returned by `readdirSync({ withFileTypes: true })`. */
2
- export type DirentLike = {
3
- name: string;
4
- isDirectory(): boolean;
5
- };
6
- /**
7
- * Compute the SHA-256 hash of a file.
8
- *
9
- * @param filePath - Absolute path to the file.
10
- * @returns The hex-encoded SHA-256 hash string.
11
- *
12
- * @example
13
- * ```ts
14
- * const hash = fileHash('/path/to/file.md');
15
- * // 'e3b0c44298fc1c149afbf4c8996fb924...'
16
- * ```
17
- */
18
- export declare function fileHash(filePath: string): string;
19
- /**
20
- * Recursively copy a directory, throwing if the destination is a symlink.
21
- *
22
- * @param src - Source directory path.
23
- * @param dest - Destination directory path.
24
- * @throws If the destination is a symlink.
25
- *
26
- * @example
27
- * ```ts
28
- * copyDir('src/roles/implementer/commands', '/home/user/.claude/commands/clancy');
29
- * ```
30
- */
31
- export declare function copyDir(src: string, dest: string): void;
32
- //# sourceMappingURL=file-ops.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"file-ops.d.ts","sourceRoot":"","sources":["../../../src/installer/file-ops/file-ops.ts"],"names":[],"mappings":"AAgBA,wFAAwF;AACxF,MAAM,MAAM,UAAU,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,WAAW,IAAI,OAAO,CAAA;CAAE,CAAC;AAElE;;;;;;;;;;;GAWG;AACH,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAGjD;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAuBvD"}
@@ -1,58 +0,0 @@
1
- /**
2
- * Low-level file system helpers for the installer.
3
- *
4
- * Provides SHA-256 hashing and recursive directory copying with symlink detection.
5
- */
6
- import { createHash } from 'node:crypto';
7
- import { copyFileSync, existsSync, lstatSync, mkdirSync, readFileSync, readdirSync, } from 'node:fs';
8
- import { join } from 'node:path';
9
- /**
10
- * Compute the SHA-256 hash of a file.
11
- *
12
- * @param filePath - Absolute path to the file.
13
- * @returns The hex-encoded SHA-256 hash string.
14
- *
15
- * @example
16
- * ```ts
17
- * const hash = fileHash('/path/to/file.md');
18
- * // 'e3b0c44298fc1c149afbf4c8996fb924...'
19
- * ```
20
- */
21
- export function fileHash(filePath) {
22
- const content = readFileSync(filePath);
23
- return createHash('sha256').update(content).digest('hex');
24
- }
25
- /**
26
- * Recursively copy a directory, throwing if the destination is a symlink.
27
- *
28
- * @param src - Source directory path.
29
- * @param dest - Destination directory path.
30
- * @throws If the destination is a symlink.
31
- *
32
- * @example
33
- * ```ts
34
- * copyDir('src/roles/implementer/commands', '/home/user/.claude/commands/clancy');
35
- * ```
36
- */
37
- export function copyDir(src, dest) {
38
- if (existsSync(dest)) {
39
- const stat = lstatSync(dest);
40
- if (stat.isSymbolicLink()) {
41
- throw new Error(`${dest} is a symlink. Remove it first before installing.`);
42
- }
43
- }
44
- mkdirSync(dest, { recursive: true });
45
- for (const entry of readdirSync(src, {
46
- withFileTypes: true,
47
- })) {
48
- const s = join(src, entry.name);
49
- const d = join(dest, entry.name);
50
- if (entry.isDirectory()) {
51
- copyDir(s, d);
52
- }
53
- else {
54
- copyFileSync(s, d);
55
- }
56
- }
57
- }
58
- //# sourceMappingURL=file-ops.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"file-ops.js","sourceRoot":"","sources":["../../../src/installer/file-ops/file-ops.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EACL,YAAY,EACZ,UAAU,EACV,SAAS,EACT,SAAS,EACT,YAAY,EACZ,WAAW,GACZ,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAKjC;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,QAAQ,CAAC,QAAgB;IACvC,MAAM,OAAO,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;IACvC,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC5D,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,OAAO,CAAC,GAAW,EAAE,IAAY;IAC/C,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACrB,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;QAC7B,IAAI,IAAI,CAAC,cAAc,EAAE,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CACb,GAAG,IAAI,mDAAmD,CAC3D,CAAC;QACJ,CAAC;IACH,CAAC;IAED,SAAS,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAErC,KAAK,MAAM,KAAK,IAAI,WAAW,CAAC,GAAG,EAAE;QACnC,aAAa,EAAE,IAAI;KACpB,CAAiB,EAAE,CAAC;QACnB,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAChC,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QACjC,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAChB,CAAC;aAAM,CAAC;YACN,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACrB,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -1,31 +0,0 @@
1
- /** Options for the hook installer. */
2
- type HookInstallerOptions = {
3
- /** The Claude config directory (e.g., `~/.claude` or `./.claude`). */
4
- claudeConfigDir: string;
5
- /** Path to the directory containing compiled hook JS files. */
6
- hooksSourceDir: string;
7
- /** Optional prompt text for the verification gate Stop agent hook. */
8
- verificationGatePrompt?: string;
9
- };
10
- /**
11
- * Install Clancy hooks into the Claude config directory.
12
- *
13
- * Copies hook scripts, writes a CommonJS `package.json` to the hooks dir,
14
- * and merges hook registrations into `settings.json`.
15
- *
16
- * Best-effort — never throws. Returns `false` if installation fails.
17
- *
18
- * @param options - The hook installer options.
19
- * @returns `true` if hooks were installed successfully.
20
- *
21
- * @example
22
- * ```ts
23
- * installHooks({
24
- * claudeConfigDir: '/home/user/.claude',
25
- * hooksSourceDir: '/path/to/clancy/hooks',
26
- * });
27
- * ```
28
- */
29
- export declare function installHooks(options: HookInstallerOptions): boolean;
30
- export {};
31
- //# sourceMappingURL=hook-installer.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"hook-installer.d.ts","sourceRoot":"","sources":["../../../src/installer/hook-installer/hook-installer.ts"],"names":[],"mappings":"AAwBA,sCAAsC;AACtC,KAAK,oBAAoB,GAAG;IAC1B,sEAAsE;IACtE,eAAe,EAAE,MAAM,CAAC;IACxB,+DAA+D;IAC/D,cAAc,EAAE,MAAM,CAAC;IACvB,sEAAsE;IACtE,sBAAsB,CAAC,EAAE,MAAM,CAAC;CACjC,CAAC;AAkEF;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CA0GnE"}
@@ -1,137 +0,0 @@
1
- /**
2
- * Hook installer for Claude Code settings.
3
- *
4
- * Copies compiled hook scripts into the Claude config directory and
5
- * registers them in `settings.json` without clobbering existing config.
6
- */
7
- import { copyFileSync, existsSync, mkdirSync, readFileSync, writeFileSync, } from 'node:fs';
8
- import { join } from 'node:path';
9
- /**
10
- * Add a hook command to a settings event array if not already registered.
11
- *
12
- * @param hooks - The hooks record from settings.json.
13
- * @param event - The hook event name (e.g., `'SessionStart'`).
14
- * @param command - The shell command to register.
15
- */
16
- function registerHook(hooks, event, command) {
17
- if (!hooks[event])
18
- hooks[event] = [];
19
- const already = hooks[event].some((h) => h.hooks &&
20
- h.hooks.some((hh) => hh.type === 'command' && 'command' in hh && hh.command === command));
21
- if (!already) {
22
- hooks[event].push({ hooks: [{ type: 'command', command }] });
23
- }
24
- }
25
- /**
26
- * Add an agent hook to a settings event array if not already registered.
27
- *
28
- * Agent hooks are identified by their prompt content (first 100 chars) to
29
- * avoid duplicates on re-install.
30
- *
31
- * @param hooks - The hooks record from settings.json.
32
- * @param event - The hook event name (e.g., `'Stop'`).
33
- * @param prompt - The agent prompt text.
34
- * @param timeout - Timeout in seconds for the agent hook.
35
- */
36
- function registerAgentHook(hooks, event, prompt, timeout) {
37
- if (!hooks[event])
38
- hooks[event] = [];
39
- const fingerprint = prompt.slice(0, 100);
40
- const already = hooks[event].some((h) => h.hooks &&
41
- h.hooks.some((hh) => hh.type === 'agent' &&
42
- 'prompt' in hh &&
43
- hh.prompt.slice(0, 100) === fingerprint));
44
- if (!already) {
45
- hooks[event].push({ hooks: [{ type: 'agent', prompt, timeout }] });
46
- }
47
- }
48
- /**
49
- * Install Clancy hooks into the Claude config directory.
50
- *
51
- * Copies hook scripts, writes a CommonJS `package.json` to the hooks dir,
52
- * and merges hook registrations into `settings.json`.
53
- *
54
- * Best-effort — never throws. Returns `false` if installation fails.
55
- *
56
- * @param options - The hook installer options.
57
- * @returns `true` if hooks were installed successfully.
58
- *
59
- * @example
60
- * ```ts
61
- * installHooks({
62
- * claudeConfigDir: '/home/user/.claude',
63
- * hooksSourceDir: '/path/to/clancy/hooks',
64
- * });
65
- * ```
66
- */
67
- export function installHooks(options) {
68
- const { claudeConfigDir, hooksSourceDir } = options;
69
- const hooksInstallDir = join(claudeConfigDir, 'hooks');
70
- const settingsFile = join(claudeConfigDir, 'settings.json');
71
- const hookFiles = [
72
- 'clancy-check-update.js',
73
- 'clancy-statusline.js',
74
- 'clancy-context-monitor.js',
75
- 'clancy-credential-guard.js',
76
- 'clancy-branch-guard.js',
77
- 'clancy-post-compact.js',
78
- 'clancy-notification.js',
79
- 'clancy-drift-detector.js',
80
- ];
81
- try {
82
- mkdirSync(hooksInstallDir, { recursive: true });
83
- for (const f of hookFiles) {
84
- copyFileSync(join(hooksSourceDir, f), join(hooksInstallDir, f));
85
- }
86
- // Force CommonJS resolution for hook files — projects with "type":"module"
87
- // in their package.json would otherwise treat .js files as ESM.
88
- writeFileSync(join(hooksInstallDir, 'package.json'), JSON.stringify({ type: 'commonjs' }, null, 2) + '\n');
89
- // Merge hooks into settings.json without clobbering existing config
90
- let settings = {};
91
- if (existsSync(settingsFile)) {
92
- try {
93
- settings = JSON.parse(readFileSync(settingsFile, 'utf8'));
94
- }
95
- catch {
96
- // Ignore parse errors — start fresh
97
- }
98
- }
99
- if (!settings.hooks)
100
- settings.hooks = {};
101
- const hooks = settings.hooks;
102
- const updateScript = join(hooksInstallDir, 'clancy-check-update.js');
103
- const statuslineScript = join(hooksInstallDir, 'clancy-statusline.js');
104
- const monitorScript = join(hooksInstallDir, 'clancy-context-monitor.js');
105
- const guardScript = join(hooksInstallDir, 'clancy-credential-guard.js');
106
- const branchGuardScript = join(hooksInstallDir, 'clancy-branch-guard.js');
107
- const postCompactScript = join(hooksInstallDir, 'clancy-post-compact.js');
108
- registerHook(hooks, 'SessionStart', `node ${JSON.stringify(updateScript)}`);
109
- registerHook(hooks, 'PostToolUse', `node ${JSON.stringify(monitorScript)}`);
110
- registerHook(hooks, 'PreToolUse', `node ${JSON.stringify(guardScript)}`);
111
- registerHook(hooks, 'PreToolUse', `node ${JSON.stringify(branchGuardScript)}`);
112
- registerHook(hooks, 'PostCompact', `node ${JSON.stringify(postCompactScript)}`);
113
- const notificationScript = join(hooksInstallDir, 'clancy-notification.js');
114
- const driftDetectorScript = join(hooksInstallDir, 'clancy-drift-detector.js');
115
- registerHook(hooks, 'Notification', `node ${JSON.stringify(notificationScript)}`);
116
- registerHook(hooks, 'PostToolUse', `node ${JSON.stringify(driftDetectorScript)}`);
117
- // Verification gate: registered as a Stop agent hook with the prompt inline.
118
- // The prompt is read from the agents directory at install time.
119
- if (options.verificationGatePrompt) {
120
- registerAgentHook(hooks, 'Stop', options.verificationGatePrompt, 120);
121
- }
122
- // Statusline: registered as top-level key, not inside hooks
123
- if (!settings.statusLine) {
124
- settings.statusLine = {
125
- type: 'command',
126
- command: `node ${JSON.stringify(statuslineScript)}`,
127
- };
128
- }
129
- writeFileSync(settingsFile, JSON.stringify(settings, null, 2) + '\n');
130
- return true;
131
- }
132
- catch {
133
- // Hook registration is best-effort — don't fail the install
134
- return false;
135
- }
136
- }
137
- //# sourceMappingURL=hook-installer.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"hook-installer.js","sourceRoot":"","sources":["../../../src/installer/hook-installer/hook-installer.ts"],"names":[],"mappings":"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"}
@@ -1,3 +0,0 @@
1
- #!/usr/bin/env node
2
- export {};
3
- //# sourceMappingURL=install.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../src/installer/install.ts"],"names":[],"mappings":""}
@@ -1,270 +0,0 @@
1
- #!/usr/bin/env node
2
- /**
3
- * Clancy installer — interactive CLI entry point.
4
- *
5
- * Prompts the user to choose global (~/.claude) or local (./.claude) install,
6
- * copies commands and workflows, inlines workflow references for global installs,
7
- * detects and backs up user-modified files, and registers hooks in Claude settings.
8
- */
9
- import { copyFileSync, existsSync, mkdirSync, readFileSync, readdirSync, writeFileSync, } from 'node:fs';
10
- import { createRequire } from 'node:module';
11
- import { dirname, join } from 'node:path';
12
- import { fileURLToPath } from 'node:url';
13
- import { installHooks } from '../installer/hook-installer/hook-installer.js';
14
- import { backupModifiedFiles, buildManifest, detectModifiedFiles, } from '../installer/manifest/manifest.js';
15
- import { ask, choose, closePrompts } from '../installer/prompts/prompts.js';
16
- import { copyRoleFiles } from '../installer/role-filter/role-filter.js';
17
- import { printBanner, printSuccess } from '../installer/ui/ui.js';
18
- import { loadClancyEnv } from '../scripts/shared/env-parser/env-parser.js';
19
- import { blue, dim, green, red } from '../utils/ansi/ansi.js';
20
- // ---------------------------------------------------------------------------
21
- // Paths
22
- // ---------------------------------------------------------------------------
23
- const __filename = fileURLToPath(import.meta.url);
24
- const __dirname = dirname(__filename);
25
- const require = createRequire(import.meta.url);
26
- const PKG = require('../../package.json');
27
- const ROLES_SRC = join(__dirname, '..', '..', 'src', 'roles');
28
- const HOOKS_SRC = join(__dirname, '..', '..', 'hooks');
29
- const BUNDLE_SRC = join(__dirname, '..', 'bundle');
30
- const AGENTS_SRC = join(__dirname, '..', '..', 'src', 'agents');
31
- const _homeDir = process.env.HOME ?? process.env.USERPROFILE;
32
- if (!_homeDir) {
33
- process.stderr.write('\x1b[31m\n Error: HOME or USERPROFILE environment variable is not set.\x1b[0m\n');
34
- process.exit(1);
35
- }
36
- const homeDir = _homeDir;
37
- const GLOBAL_DEST = join(homeDir, '.claude', 'commands', 'clancy');
38
- const LOCAL_DEST = join(process.cwd(), '.claude', 'commands', 'clancy');
39
- const GLOBAL_WORKFLOWS_DEST = join(homeDir, '.claude', 'clancy', 'workflows');
40
- const LOCAL_WORKFLOWS_DEST = join(process.cwd(), '.claude', 'clancy', 'workflows');
41
- // ---------------------------------------------------------------------------
42
- // Workflow inlining
43
- // ---------------------------------------------------------------------------
44
- /** Regex matching an @-file workflow reference in a command file. */
45
- const WORKFLOW_REF = /^@\.claude\/clancy\/workflows\/(.+\.md)$/m;
46
- /**
47
- * Inline workflow file content into global command files.
48
- *
49
- * For global installs, @-file references resolve relative to the project root
50
- * (not ~/.claude), so the workflow files won't be found at runtime. This
51
- * replaces the @-file reference with the actual workflow content.
52
- *
53
- * @param commandsDir - The installed commands directory.
54
- * @param workflowsDir - The installed workflows directory.
55
- */
56
- function inlineWorkflows(commandsDir, workflowsDir) {
57
- for (const file of readdirSync(commandsDir)) {
58
- if (!file.endsWith('.md'))
59
- continue;
60
- const cmdPath = join(commandsDir, file);
61
- const content = readFileSync(cmdPath, 'utf8');
62
- const match = content.match(WORKFLOW_REF);
63
- if (!match)
64
- continue;
65
- const workflowFile = join(workflowsDir, match[1]);
66
- if (!existsSync(workflowFile))
67
- continue;
68
- const workflowContent = readFileSync(workflowFile, 'utf8');
69
- writeFileSync(cmdPath, content.replace(match[0], workflowContent));
70
- }
71
- }
72
- // ---------------------------------------------------------------------------
73
- // Role directory copying
74
- // ---------------------------------------------------------------------------
75
- /**
76
- * Parse the CLANCY_ROLES env var from `.clancy/.env` in the current project.
77
- *
78
- * Returns a Set of enabled optional role names, or null if no `.clancy/.env`
79
- * exists yet (first install — install all roles as a safe default).
80
- *
81
- * When `.clancy/.env` exists but CLANCY_ROLES is unset or empty, returns an
82
- * empty Set so optional roles are truly opt-in.
83
- */
84
- function parseEnabledRoles() {
85
- const env = loadClancyEnv(process.cwd());
86
- if (!env)
87
- return null;
88
- const roles = env.CLANCY_ROLES;
89
- if (!roles)
90
- return new Set();
91
- return new Set(roles
92
- .split(',')
93
- .map((r) => r.trim().toLowerCase())
94
- .filter(Boolean));
95
- }
96
- // ---------------------------------------------------------------------------
97
- // CLI flag parsing
98
- // ---------------------------------------------------------------------------
99
- /**
100
- * Parse `--global` / `--local` from process.argv.
101
- *
102
- * When present the installer runs non-interactively — no prompts are shown.
103
- * This is used by the `/clancy:update` workflow so the update can run
104
- * without user interaction.
105
- */
106
- function parseInstallFlag() {
107
- const args = process.argv.slice(2);
108
- if (args.includes('--global'))
109
- return 'global';
110
- if (args.includes('--local'))
111
- return 'local';
112
- return null;
113
- }
114
- // ---------------------------------------------------------------------------
115
- // Main
116
- // ---------------------------------------------------------------------------
117
- async function main() {
118
- const flag = parseInstallFlag();
119
- const nonInteractive = flag !== null;
120
- printBanner(PKG.version);
121
- let dest;
122
- let workflowsDest;
123
- if (flag === 'global') {
124
- dest = GLOBAL_DEST;
125
- workflowsDest = GLOBAL_WORKFLOWS_DEST;
126
- console.log(dim(' Mode: global (--global flag)'));
127
- }
128
- else if (flag === 'local') {
129
- dest = LOCAL_DEST;
130
- workflowsDest = LOCAL_WORKFLOWS_DEST;
131
- console.log(dim(' Mode: local (--local flag)'));
132
- }
133
- else {
134
- const installChoice = await choose('Where would you like to install?', [
135
- `Global ${dim('(~/.claude)')} — available in all projects`,
136
- `Local ${dim('(./.claude)')} — this project only`,
137
- ]);
138
- if (installChoice === '1' || installChoice.toLowerCase() === 'global') {
139
- dest = GLOBAL_DEST;
140
- workflowsDest = GLOBAL_WORKFLOWS_DEST;
141
- }
142
- else if (installChoice === '2' ||
143
- installChoice.toLowerCase() === 'local') {
144
- dest = LOCAL_DEST;
145
- workflowsDest = LOCAL_WORKFLOWS_DEST;
146
- }
147
- else {
148
- console.log(red('\n Invalid choice. Run npx chief-clancy again and enter 1 or 2.'));
149
- closePrompts();
150
- process.exit(1);
151
- }
152
- }
153
- // Validate source directories — guards against corrupted npm package
154
- for (const [label, src] of [
155
- ['Roles', ROLES_SRC],
156
- ['Runtime bundles', BUNDLE_SRC],
157
- ]) {
158
- if (!existsSync(src)) {
159
- console.error(red(`\n Error: ${label} source not found: ${src}`));
160
- console.error(red(' The npm package may be corrupted. Try: npm cache clean --force'));
161
- closePrompts();
162
- process.exit(1);
163
- }
164
- }
165
- // Validate individual bundle files exist
166
- for (const script of ['clancy-once.js', 'clancy-afk.js']) {
167
- if (!existsSync(join(BUNDLE_SRC, script))) {
168
- console.error(red(`\n Error: Bundled script not found: ${script}`));
169
- console.error(red(' The npm package may be corrupted. Try: npm cache clean --force'));
170
- closePrompts();
171
- process.exit(1);
172
- }
173
- }
174
- console.log('');
175
- console.log(dim(` Installing to: ${dest}`));
176
- try {
177
- const claudeDir = dirname(dirname(dest)); // .claude/
178
- const manifestPath = join(claudeDir, 'clancy', 'manifest.json');
179
- const workflowsManifestPath = join(claudeDir, 'clancy', 'workflows-manifest.json');
180
- const patchesDir = join(claudeDir, 'clancy', 'local-patches');
181
- // Handle existing installation
182
- if (existsSync(dest) || existsSync(workflowsDest)) {
183
- console.log('');
184
- const modified = detectModifiedFiles(dest, manifestPath);
185
- const modifiedWorkflows = detectModifiedFiles(workflowsDest, workflowsManifestPath);
186
- const allModified = [...modified, ...modifiedWorkflows];
187
- if (allModified.length > 0) {
188
- console.log(blue(' Modified files detected:'));
189
- for (const { rel } of allModified) {
190
- console.log(` ${dim('•')} ${rel}`);
191
- }
192
- console.log('');
193
- console.log(dim(' These will be backed up to .claude/clancy/local-patches/'));
194
- console.log(dim(' before overwriting. You can reapply them after the update.'));
195
- console.log('');
196
- }
197
- if (nonInteractive) {
198
- console.log(dim(' Auto-overwriting existing installation (non-interactive mode).'));
199
- }
200
- else {
201
- const overwrite = await ask(blue(` Commands already exist at ${dest}. Overwrite? [y/N] `));
202
- if (!overwrite.trim().toLowerCase().startsWith('y')) {
203
- console.log('\n Aborted. No files changed.');
204
- closePrompts();
205
- process.exit(0);
206
- }
207
- }
208
- if (allModified.length > 0) {
209
- backupModifiedFiles(allModified, patchesDir);
210
- console.log(green(`\n ✓ ${allModified.length} modified file(s) backed up to local-patches/`));
211
- }
212
- }
213
- // Copy commands and workflows from role directories (flat output)
214
- // Global installs always include all roles (no per-project .env to read)
215
- const enabledRoles = dest === GLOBAL_DEST ? null : parseEnabledRoles();
216
- copyRoleFiles(ROLES_SRC, 'commands', dest, enabledRoles);
217
- copyRoleFiles(ROLES_SRC, 'workflows', workflowsDest, enabledRoles);
218
- // Inline workflows for global installs
219
- if (dest === GLOBAL_DEST) {
220
- inlineWorkflows(dest, workflowsDest);
221
- }
222
- // Write VERSION file
223
- writeFileSync(join(dest, 'VERSION'), PKG.version);
224
- // Write manifests for future update detection
225
- mkdirSync(dirname(manifestPath), { recursive: true });
226
- writeFileSync(manifestPath, JSON.stringify(buildManifest(dest), null, 2));
227
- writeFileSync(workflowsManifestPath, JSON.stringify(buildManifest(workflowsDest), null, 2));
228
- // Copy bundled runtime scripts to .clancy/ in the current project.
229
- // Always use cwd — workflows run `node .clancy/clancy-once.js` relative
230
- // to the project root, regardless of global vs local install.
231
- const clancyProjectDir = join(process.cwd(), '.clancy');
232
- mkdirSync(clancyProjectDir, { recursive: true });
233
- for (const script of ['clancy-once.js', 'clancy-afk.js']) {
234
- copyFileSync(join(BUNDLE_SRC, script), join(clancyProjectDir, script));
235
- }
236
- // Ensure .clancy is treated as an ESM package so Node runs clancy-*.js as ESM
237
- writeFileSync(join(clancyProjectDir, 'package.json'), JSON.stringify({ type: 'module' }, null, 2) + '\n');
238
- // Write version.json for drift detection
239
- writeFileSync(join(clancyProjectDir, 'version.json'), JSON.stringify({ version: PKG.version, installedAt: new Date().toISOString() }, null, 2) + '\n');
240
- // Install hooks
241
- const claudeConfigDir = dest === GLOBAL_DEST
242
- ? join(homeDir, '.claude')
243
- : join(process.cwd(), '.claude');
244
- // Read verification gate agent prompt (best-effort — skip if missing)
245
- let verificationGatePrompt;
246
- const gatePromptPath = join(AGENTS_SRC, 'verification-gate.md');
247
- if (existsSync(gatePromptPath)) {
248
- verificationGatePrompt = readFileSync(gatePromptPath, 'utf8');
249
- }
250
- installHooks({
251
- claudeConfigDir,
252
- hooksSourceDir: HOOKS_SRC,
253
- verificationGatePrompt,
254
- });
255
- printSuccess(enabledRoles);
256
- }
257
- catch (err) {
258
- const message = err instanceof Error ? err.message : String(err);
259
- console.error(red(`\n Install failed: ${message}`));
260
- closePrompts();
261
- process.exit(1);
262
- }
263
- closePrompts();
264
- }
265
- main().catch((err) => {
266
- const message = err instanceof Error ? err.message : String(err);
267
- console.error(red(`\n Install failed: ${message}`));
268
- process.exit(1);
269
- });
270
- //# sourceMappingURL=install.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/installer/install.ts"],"names":[],"mappings":"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"}
@@ -1,41 +0,0 @@
1
- /** A file that has been modified by the user since last install. */
2
- export type ModifiedFile = {
3
- rel: string;
4
- absPath: string;
5
- };
6
- /**
7
- * Build a manifest of installed files with SHA-256 hashes.
8
- *
9
- * Recursively walks a directory and records the hash of every file.
10
- *
11
- * @param baseDir - Root directory to scan.
12
- * @returns A record mapping relative paths to their SHA-256 hashes.
13
- *
14
- * @example
15
- * ```ts
16
- * const manifest = buildManifest('/path/to/.claude/commands/clancy');
17
- * // { "init.md": "abc123...", "run.md": "def456..." }
18
- * ```
19
- */
20
- export declare function buildManifest(baseDir: string): Record<string, string>;
21
- /**
22
- * Detect files modified by the user since last install.
23
- *
24
- * Compares current file hashes against the stored manifest to find changes.
25
- *
26
- * @param baseDir - The installed directory to check.
27
- * @param manifestPath - Path to the stored manifest JSON.
28
- * @returns Array of modified file records with relative and absolute paths.
29
- */
30
- export declare function detectModifiedFiles(baseDir: string, manifestPath: string): ModifiedFile[];
31
- /**
32
- * Back up modified files to a patches directory.
33
- *
34
- * Copies each modified file and writes a `backup-meta.json` with metadata.
35
- *
36
- * @param modified - Array of modified file records.
37
- * @param patchesDir - Directory to store backups.
38
- * @returns The patches directory path, or `null` if no files were backed up.
39
- */
40
- export declare function backupModifiedFiles(modified: ModifiedFile[], patchesDir: string): string | null;
41
- //# sourceMappingURL=manifest.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../../../src/installer/manifest/manifest.ts"],"names":[],"mappings":"AAmBA,oEAAoE;AACpE,MAAM,MAAM,YAAY,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAE5D;;;;;;;;;;;;;GAaG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAoBrE;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,MAAM,GACnB,YAAY,EAAE,CA0BhB;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,YAAY,EAAE,EACxB,UAAU,EAAE,MAAM,GACjB,MAAM,GAAG,IAAI,CAwBf"}