@chief-clancy/terminal 0.1.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.
- package/LICENSE +21 -0
- package/README.md +62 -0
- package/dist/hooks/clancy-branch-guard.js +1 -0
- package/dist/hooks/clancy-check-update.js +2 -0
- package/dist/hooks/clancy-context-monitor.js +9 -0
- package/dist/hooks/clancy-credential-guard.js +2 -0
- package/dist/hooks/clancy-drift-detector.js +1 -0
- package/dist/hooks/clancy-notification.js +1 -0
- package/dist/hooks/clancy-post-compact.js +2 -0
- package/dist/hooks/clancy-statusline.js +1 -0
- package/dist/index.d.ts +24 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +23 -0
- package/dist/index.js.map +1 -0
- package/dist/installer/file-ops/file-ops.d.ts +35 -0
- package/dist/installer/file-ops/file-ops.d.ts.map +1 -0
- package/dist/installer/file-ops/file-ops.js +95 -0
- package/dist/installer/file-ops/file-ops.js.map +1 -0
- package/dist/installer/file-ops/index.d.ts +2 -0
- package/dist/installer/file-ops/index.d.ts.map +1 -0
- package/dist/installer/file-ops/index.js +2 -0
- package/dist/installer/file-ops/index.js.map +1 -0
- package/dist/installer/hook-installer/hook-installer.d.ts +22 -0
- package/dist/installer/hook-installer/hook-installer.d.ts.map +1 -0
- package/dist/installer/hook-installer/hook-installer.js +213 -0
- package/dist/installer/hook-installer/hook-installer.js.map +1 -0
- package/dist/installer/hook-installer/index.d.ts +2 -0
- package/dist/installer/hook-installer/index.d.ts.map +1 -0
- package/dist/installer/hook-installer/index.js +2 -0
- package/dist/installer/hook-installer/index.js.map +1 -0
- package/dist/installer/install/index.d.ts +3 -0
- package/dist/installer/install/index.d.ts.map +1 -0
- package/dist/installer/install/index.js +2 -0
- package/dist/installer/install/index.js.map +1 -0
- package/dist/installer/install/install.d.ts +124 -0
- package/dist/installer/install/install.d.ts.map +1 -0
- package/dist/installer/install/install.js +255 -0
- package/dist/installer/install/install.js.map +1 -0
- package/dist/installer/manifest/index.d.ts +2 -0
- package/dist/installer/manifest/index.d.ts.map +1 -0
- package/dist/installer/manifest/index.js +2 -0
- package/dist/installer/manifest/index.js.map +1 -0
- package/dist/installer/manifest/manifest.d.ts +46 -0
- package/dist/installer/manifest/manifest.d.ts.map +1 -0
- package/dist/installer/manifest/manifest.js +180 -0
- package/dist/installer/manifest/manifest.js.map +1 -0
- package/dist/installer/prompts/index.d.ts +2 -0
- package/dist/installer/prompts/index.d.ts.map +1 -0
- package/dist/installer/prompts/index.js +2 -0
- package/dist/installer/prompts/index.js.map +1 -0
- package/dist/installer/prompts/prompts.d.ts +34 -0
- package/dist/installer/prompts/prompts.d.ts.map +1 -0
- package/dist/installer/prompts/prompts.js +28 -0
- package/dist/installer/prompts/prompts.js.map +1 -0
- package/dist/installer/role-filter/index.d.ts +2 -0
- package/dist/installer/role-filter/index.d.ts.map +1 -0
- package/dist/installer/role-filter/index.js +2 -0
- package/dist/installer/role-filter/index.js.map +1 -0
- package/dist/installer/role-filter/role-filter.d.ts +33 -0
- package/dist/installer/role-filter/role-filter.d.ts.map +1 -0
- package/dist/installer/role-filter/role-filter.js +91 -0
- package/dist/installer/role-filter/role-filter.js.map +1 -0
- package/dist/installer/shared/fs-errors/fs-errors.d.ts +3 -0
- package/dist/installer/shared/fs-errors/fs-errors.d.ts.map +1 -0
- package/dist/installer/shared/fs-errors/fs-errors.js +7 -0
- package/dist/installer/shared/fs-errors/fs-errors.js.map +1 -0
- package/dist/installer/shared/fs-errors/index.d.ts +2 -0
- package/dist/installer/shared/fs-errors/index.d.ts.map +1 -0
- package/dist/installer/shared/fs-errors/index.js +2 -0
- package/dist/installer/shared/fs-errors/index.js.map +1 -0
- package/dist/installer/shared/fs-guards/fs-guards.d.ts +3 -0
- package/dist/installer/shared/fs-guards/fs-guards.d.ts.map +1 -0
- package/dist/installer/shared/fs-guards/fs-guards.js +18 -0
- package/dist/installer/shared/fs-guards/fs-guards.js.map +1 -0
- package/dist/installer/shared/fs-guards/index.d.ts +2 -0
- package/dist/installer/shared/fs-guards/index.d.ts.map +1 -0
- package/dist/installer/shared/fs-guards/index.js +2 -0
- package/dist/installer/shared/fs-guards/index.js.map +1 -0
- package/dist/installer/shared/type-guards/index.d.ts +2 -0
- package/dist/installer/shared/type-guards/index.d.ts.map +1 -0
- package/dist/installer/shared/type-guards/index.js +2 -0
- package/dist/installer/shared/type-guards/index.js.map +1 -0
- package/dist/installer/shared/type-guards/type-guards.d.ts +8 -0
- package/dist/installer/shared/type-guards/type-guards.d.ts.map +1 -0
- package/dist/installer/shared/type-guards/type-guards.js +10 -0
- package/dist/installer/shared/type-guards/type-guards.js.map +1 -0
- package/dist/installer/ui/index.d.ts +2 -0
- package/dist/installer/ui/index.d.ts.map +1 -0
- package/dist/installer/ui/index.js +2 -0
- package/dist/installer/ui/index.js.map +1 -0
- package/dist/installer/ui/ui.d.ts +23 -0
- package/dist/installer/ui/ui.d.ts.map +1 -0
- package/dist/installer/ui/ui.js +121 -0
- package/dist/installer/ui/ui.js.map +1 -0
- package/dist/runner/autopilot/autopilot.d.ts +71 -0
- package/dist/runner/autopilot/autopilot.d.ts.map +1 -0
- package/dist/runner/autopilot/autopilot.js +206 -0
- package/dist/runner/autopilot/autopilot.js.map +1 -0
- package/dist/runner/autopilot/index.d.ts +2 -0
- package/dist/runner/autopilot/index.d.ts.map +1 -0
- package/dist/runner/autopilot/index.js +2 -0
- package/dist/runner/autopilot/index.js.map +1 -0
- package/dist/runner/cli-bridge/cli-bridge.d.ts +34 -0
- package/dist/runner/cli-bridge/cli-bridge.d.ts.map +1 -0
- package/dist/runner/cli-bridge/cli-bridge.js +53 -0
- package/dist/runner/cli-bridge/cli-bridge.js.map +1 -0
- package/dist/runner/cli-bridge/index.d.ts +2 -0
- package/dist/runner/cli-bridge/index.d.ts.map +1 -0
- package/dist/runner/cli-bridge/index.js +2 -0
- package/dist/runner/cli-bridge/index.js.map +1 -0
- package/dist/runner/dep-factory/deliver-phase.d.ts +24 -0
- package/dist/runner/dep-factory/deliver-phase.d.ts.map +1 -0
- package/dist/runner/dep-factory/deliver-phase.js +57 -0
- package/dist/runner/dep-factory/deliver-phase.js.map +1 -0
- package/dist/runner/dep-factory/dep-factory.d.ts +38 -0
- package/dist/runner/dep-factory/dep-factory.d.ts.map +1 -0
- package/dist/runner/dep-factory/dep-factory.js +193 -0
- package/dist/runner/dep-factory/dep-factory.js.map +1 -0
- package/dist/runner/dep-factory/index.d.ts +2 -0
- package/dist/runner/dep-factory/index.d.ts.map +1 -0
- package/dist/runner/dep-factory/index.js +2 -0
- package/dist/runner/dep-factory/index.js.map +1 -0
- package/dist/runner/dep-factory/invoke-phase.d.ts +20 -0
- package/dist/runner/dep-factory/invoke-phase.d.ts.map +1 -0
- package/dist/runner/dep-factory/invoke-phase.js +45 -0
- package/dist/runner/dep-factory/invoke-phase.js.map +1 -0
- package/dist/runner/implement/implement.d.ts +38 -0
- package/dist/runner/implement/implement.d.ts.map +1 -0
- package/dist/runner/implement/implement.js +61 -0
- package/dist/runner/implement/implement.js.map +1 -0
- package/dist/runner/implement/index.d.ts +2 -0
- package/dist/runner/implement/index.d.ts.map +1 -0
- package/dist/runner/implement/index.js +2 -0
- package/dist/runner/implement/index.js.map +1 -0
- package/dist/runner/notify/index.d.ts +2 -0
- package/dist/runner/notify/index.d.ts.map +1 -0
- package/dist/runner/notify/index.js +2 -0
- package/dist/runner/notify/index.js.map +1 -0
- package/dist/runner/notify/notify.d.ts +49 -0
- package/dist/runner/notify/notify.d.ts.map +1 -0
- package/dist/runner/notify/notify.js +90 -0
- package/dist/runner/notify/notify.js.map +1 -0
- package/dist/runner/prompt-builder/index.d.ts +2 -0
- package/dist/runner/prompt-builder/index.d.ts.map +1 -0
- package/dist/runner/prompt-builder/index.js +2 -0
- package/dist/runner/prompt-builder/index.js.map +1 -0
- package/dist/runner/prompt-builder/prompt-builder.d.ts +53 -0
- package/dist/runner/prompt-builder/prompt-builder.d.ts.map +1 -0
- package/dist/runner/prompt-builder/prompt-builder.js +122 -0
- package/dist/runner/prompt-builder/prompt-builder.js.map +1 -0
- package/dist/runner/session-report/index.d.ts +2 -0
- package/dist/runner/session-report/index.d.ts.map +1 -0
- package/dist/runner/session-report/index.js +2 -0
- package/dist/runner/session-report/index.js.map +1 -0
- package/dist/runner/session-report/session-report.d.ts +81 -0
- package/dist/runner/session-report/session-report.d.ts.map +1 -0
- package/dist/runner/session-report/session-report.js +227 -0
- package/dist/runner/session-report/session-report.js.map +1 -0
- package/dist/runner/shared/types.d.ts +30 -0
- package/dist/runner/shared/types.d.ts.map +1 -0
- package/dist/runner/shared/types.js +2 -0
- package/dist/runner/shared/types.js.map +1 -0
- package/dist/shared/ansi/ansi.d.ts +59 -0
- package/dist/shared/ansi/ansi.d.ts.map +1 -0
- package/dist/shared/ansi/ansi.js +59 -0
- package/dist/shared/ansi/ansi.js.map +1 -0
- package/dist/shared/ansi/index.d.ts +2 -0
- package/dist/shared/ansi/index.d.ts.map +1 -0
- package/dist/shared/ansi/index.js +2 -0
- package/dist/shared/ansi/index.js.map +1 -0
- package/package.json +52 -0
- package/src/agents/agents.test.ts +57 -0
- package/src/agents/arch-agent.md +80 -0
- package/src/agents/concerns-agent.md +96 -0
- package/src/agents/design-agent.md +146 -0
- package/src/agents/devils-advocate.md +54 -0
- package/src/agents/quality-agent.md +178 -0
- package/src/agents/tech-agent.md +101 -0
- package/src/agents/verification-gate.md +128 -0
- package/src/roles/implementer/commands/autopilot.md +11 -0
- package/src/roles/implementer/commands/dry-run.md +15 -0
- package/src/roles/implementer/commands/implement.md +19 -0
- package/src/roles/implementer/workflows/autopilot.md +136 -0
- package/src/roles/implementer/workflows/implement.md +161 -0
- package/src/roles/planner/commands/approve-plan.md +11 -0
- package/src/roles/planner/commands/plan.md +22 -0
- package/src/roles/planner/workflows/approve-plan.md +970 -0
- package/src/roles/planner/workflows/plan.md +868 -0
- package/src/roles/reviewer/commands/logs.md +7 -0
- package/src/roles/reviewer/commands/review.md +9 -0
- package/src/roles/reviewer/commands/status.md +9 -0
- package/src/roles/reviewer/workflows/logs.md +109 -0
- package/src/roles/reviewer/workflows/review.md +197 -0
- package/src/roles/reviewer/workflows/status.md +142 -0
- package/src/roles/roles.test.ts +87 -0
- package/src/roles/setup/commands/doctor.md +7 -0
- package/src/roles/setup/commands/help.md +80 -0
- package/src/roles/setup/commands/init.md +7 -0
- package/src/roles/setup/commands/map-codebase.md +17 -0
- package/src/roles/setup/commands/settings.md +7 -0
- package/src/roles/setup/commands/uninstall.md +5 -0
- package/src/roles/setup/commands/update-docs.md +9 -0
- package/src/roles/setup/commands/update.md +13 -0
- package/src/roles/setup/workflows/doctor.md +131 -0
- package/src/roles/setup/workflows/init.md +1096 -0
- package/src/roles/setup/workflows/map-codebase.md +130 -0
- package/src/roles/setup/workflows/scaffold.md +872 -0
- package/src/roles/setup/workflows/settings.md +958 -0
- package/src/roles/setup/workflows/uninstall.md +170 -0
- package/src/roles/setup/workflows/update-docs.md +95 -0
- package/src/roles/setup/workflows/update.md +287 -0
- package/src/roles/strategist/commands/approve-brief.md +23 -0
- package/src/roles/strategist/commands/brief.md +29 -0
- package/src/roles/strategist/workflows/approve-brief.md +1540 -0
- package/src/roles/strategist/workflows/brief.md +1330 -0
- package/src/templates/CLAUDE.md +101 -0
- package/src/templates/templates.test.ts +53 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hook-installer.js","sourceRoot":"","sources":["../../../src/installer/hook-installer/hook-installer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/installer/hook-installer/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/installer/hook-installer/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/installer/install/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,WAAW,EACX,YAAY,EACZ,iBAAiB,GAClB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,iBAAiB,EACjB,gBAAgB,EAChB,mBAAmB,EACnB,UAAU,EACV,eAAe,GAChB,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/installer/install/index.ts"],"names":[],"mappings":"AAKA,OAAO,EACL,iBAAiB,EACjB,gBAAgB,EAChB,mBAAmB,EACnB,UAAU,EACV,eAAe,GAChB,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Installer orchestrator — decomposed pipeline for `npx chief-clancy`.
|
|
3
|
+
*
|
|
4
|
+
* Coordinates all installer modules (file-ops, manifest, role-filter,
|
|
5
|
+
* hook-installer, prompts, ui) into a single installation flow.
|
|
6
|
+
* Pure helpers are exported for testing; pipeline steps are boundary functions.
|
|
7
|
+
*/
|
|
8
|
+
import type { EnvFileSystem } from '@chief-clancy/core';
|
|
9
|
+
/** The install target — global (`~/.claude`) or local (`./.claude`). */
|
|
10
|
+
export type InstallMode = 'global' | 'local';
|
|
11
|
+
/** Source directories within the npm package. */
|
|
12
|
+
type InstallSources = {
|
|
13
|
+
readonly rolesDir: string;
|
|
14
|
+
readonly hooksDir: string;
|
|
15
|
+
readonly bundleDir: string;
|
|
16
|
+
readonly agentsDir: string;
|
|
17
|
+
};
|
|
18
|
+
/** All resolved destination paths for an installation. */
|
|
19
|
+
export type InstallPaths = {
|
|
20
|
+
readonly commandsDest: string;
|
|
21
|
+
readonly workflowsDest: string;
|
|
22
|
+
readonly claudeConfigDir: string;
|
|
23
|
+
readonly manifestPath: string;
|
|
24
|
+
readonly workflowsManifestPath: string;
|
|
25
|
+
readonly patchesDir: string;
|
|
26
|
+
readonly clancyProjectDir: string;
|
|
27
|
+
};
|
|
28
|
+
/**
|
|
29
|
+
* File system operations the orchestrator performs directly.
|
|
30
|
+
*
|
|
31
|
+
* `mkdir` must be idempotent (recursive, ignoring EEXIST) — the pipeline
|
|
32
|
+
* calls it unconditionally on paths that may already exist during updates.
|
|
33
|
+
*/
|
|
34
|
+
type InstallerFs = {
|
|
35
|
+
readonly exists: (path: string) => boolean;
|
|
36
|
+
readonly readFile: (path: string) => string;
|
|
37
|
+
readonly writeFile: (path: string, content: string) => void;
|
|
38
|
+
/** Create a directory recursively (must not throw on existing dirs). */
|
|
39
|
+
readonly mkdir: (path: string) => void;
|
|
40
|
+
readonly copyFile: (src: string, dest: string) => void;
|
|
41
|
+
/** Throw if the given path is a symlink. Swallow ENOENT. */
|
|
42
|
+
readonly rejectSymlink: (path: string) => void;
|
|
43
|
+
};
|
|
44
|
+
/**
|
|
45
|
+
* Prompt API used by the orchestrator.
|
|
46
|
+
*
|
|
47
|
+
* Only `ask` is called by {@link runInstall}. The caller owns the prompt
|
|
48
|
+
* lifecycle — create before calling `runInstall`, close after it returns.
|
|
49
|
+
*/
|
|
50
|
+
type InstallerPrompts = {
|
|
51
|
+
readonly ask: (label: string) => Promise<string>;
|
|
52
|
+
};
|
|
53
|
+
/** Options for {@link runInstall}. */
|
|
54
|
+
export type RunInstallOptions = {
|
|
55
|
+
readonly mode: InstallMode;
|
|
56
|
+
readonly paths: InstallPaths;
|
|
57
|
+
readonly sources: InstallSources;
|
|
58
|
+
readonly version: string;
|
|
59
|
+
readonly nonInteractive: boolean;
|
|
60
|
+
readonly prompts: InstallerPrompts;
|
|
61
|
+
readonly fs: InstallerFs;
|
|
62
|
+
readonly cwd: string;
|
|
63
|
+
readonly now?: () => string;
|
|
64
|
+
};
|
|
65
|
+
/**
|
|
66
|
+
* Parse `--global` / `--local` from CLI arguments.
|
|
67
|
+
*
|
|
68
|
+
* When present the installer runs non-interactively — no prompts are shown.
|
|
69
|
+
* Used by the `/clancy:update` workflow for unattended updates.
|
|
70
|
+
*
|
|
71
|
+
* @param args - CLI arguments (typically `process.argv.slice(2)`).
|
|
72
|
+
* @returns The install mode, or `null` if no flag was provided.
|
|
73
|
+
*/
|
|
74
|
+
export declare function parseInstallFlag(args: readonly string[]): InstallMode | null;
|
|
75
|
+
/**
|
|
76
|
+
* Compute all destination paths for an installation.
|
|
77
|
+
*
|
|
78
|
+
* Global installs target `~/.claude`; local installs target `<cwd>/.claude`.
|
|
79
|
+
* The `.clancy/` project directory always resolves to `cwd` regardless of
|
|
80
|
+
* mode — runtime scripts run relative to the project root.
|
|
81
|
+
*
|
|
82
|
+
* @param mode - Global or local install target.
|
|
83
|
+
* @param homeDir - The user's home directory.
|
|
84
|
+
* @param cwd - The current working directory.
|
|
85
|
+
* @returns All resolved destination paths.
|
|
86
|
+
*/
|
|
87
|
+
export declare function resolveInstallPaths(mode: InstallMode, homeDir: string, cwd: string): InstallPaths;
|
|
88
|
+
/**
|
|
89
|
+
* Parse enabled optional roles from the project's `.clancy/.env` file.
|
|
90
|
+
*
|
|
91
|
+
* Returns `null` when no `.clancy/.env` exists (first install — install all
|
|
92
|
+
* roles as a safe default). Returns an empty set when the file exists but
|
|
93
|
+
* `CLANCY_ROLES` is unset or empty, so optional roles are truly opt-in.
|
|
94
|
+
*
|
|
95
|
+
* @param projectRoot - The project root containing `.clancy/`.
|
|
96
|
+
* @param fs - File system operations (injected for testability).
|
|
97
|
+
* @returns A set of enabled role names, or `null` for first install.
|
|
98
|
+
*/
|
|
99
|
+
export declare function parseEnabledRoles(projectRoot: string, fs: EnvFileSystem): ReadonlySet<string> | null;
|
|
100
|
+
/**
|
|
101
|
+
* Validate that all required source directories and files exist.
|
|
102
|
+
*
|
|
103
|
+
* Guards against a corrupted npm package. Throws on the first missing path.
|
|
104
|
+
* `agentsDir` is intentionally not validated — the verification gate prompt
|
|
105
|
+
* is read best-effort in {@link registerHooks} and skipped if missing.
|
|
106
|
+
*
|
|
107
|
+
* @param sources - The source directories to check.
|
|
108
|
+
* @param exists - File existence check (injected for testability).
|
|
109
|
+
* @returns Nothing — throws on the first missing path.
|
|
110
|
+
*/
|
|
111
|
+
export declare function validateSources(sources: InstallSources, exists: (path: string) => boolean): void;
|
|
112
|
+
/**
|
|
113
|
+
* Run the full installation pipeline.
|
|
114
|
+
*
|
|
115
|
+
* Validates sources, handles existing installations (detect modified, prompt,
|
|
116
|
+
* backup), copies role files, writes metadata, sets up the project runtime
|
|
117
|
+
* directory, and registers hooks. Returns normally on success or user abort.
|
|
118
|
+
*
|
|
119
|
+
* @param options - All dependencies and configuration for the install.
|
|
120
|
+
* @returns Resolves on success or user abort.
|
|
121
|
+
*/
|
|
122
|
+
export declare function runInstall(options: RunInstallOptions): Promise<void>;
|
|
123
|
+
export {};
|
|
124
|
+
//# sourceMappingURL=install.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../../src/installer/install/install.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
import { dirname, join } from 'node:path';
|
|
2
|
+
import { inlineWorkflows } from '../../installer/file-ops/file-ops.js';
|
|
3
|
+
import { installHooks } from '../../installer/hook-installer/hook-installer.js';
|
|
4
|
+
import { backupModifiedFiles, buildManifest, detectModifiedFiles, } from '../../installer/manifest/manifest.js';
|
|
5
|
+
import { copyRoleFiles } from '../../installer/role-filter/role-filter.js';
|
|
6
|
+
import { printSuccess } from '../../installer/ui/ui.js';
|
|
7
|
+
import { blue, dim, green } from '../../shared/ansi/index.js';
|
|
8
|
+
import { loadClancyEnv } from '@chief-clancy/core';
|
|
9
|
+
// ---------------------------------------------------------------------------
|
|
10
|
+
// Constants
|
|
11
|
+
// ---------------------------------------------------------------------------
|
|
12
|
+
/** Bundled runtime scripts that are copied to `.clancy/` in the project. */
|
|
13
|
+
const BUNDLE_SCRIPTS = ['clancy-implement.js', 'clancy-autopilot.js'];
|
|
14
|
+
// ---------------------------------------------------------------------------
|
|
15
|
+
// Pure functions
|
|
16
|
+
// ---------------------------------------------------------------------------
|
|
17
|
+
/**
|
|
18
|
+
* Parse `--global` / `--local` from CLI arguments.
|
|
19
|
+
*
|
|
20
|
+
* When present the installer runs non-interactively — no prompts are shown.
|
|
21
|
+
* Used by the `/clancy:update` workflow for unattended updates.
|
|
22
|
+
*
|
|
23
|
+
* @param args - CLI arguments (typically `process.argv.slice(2)`).
|
|
24
|
+
* @returns The install mode, or `null` if no flag was provided.
|
|
25
|
+
*/
|
|
26
|
+
export function parseInstallFlag(args) {
|
|
27
|
+
if (args.includes('--global'))
|
|
28
|
+
return 'global';
|
|
29
|
+
if (args.includes('--local'))
|
|
30
|
+
return 'local';
|
|
31
|
+
return null;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Compute all destination paths for an installation.
|
|
35
|
+
*
|
|
36
|
+
* Global installs target `~/.claude`; local installs target `<cwd>/.claude`.
|
|
37
|
+
* The `.clancy/` project directory always resolves to `cwd` regardless of
|
|
38
|
+
* mode — runtime scripts run relative to the project root.
|
|
39
|
+
*
|
|
40
|
+
* @param mode - Global or local install target.
|
|
41
|
+
* @param homeDir - The user's home directory.
|
|
42
|
+
* @param cwd - The current working directory.
|
|
43
|
+
* @returns All resolved destination paths.
|
|
44
|
+
*/
|
|
45
|
+
export function resolveInstallPaths(mode, homeDir, cwd) {
|
|
46
|
+
const baseDir = mode === 'global' ? join(homeDir, '.claude') : join(cwd, '.claude');
|
|
47
|
+
return {
|
|
48
|
+
commandsDest: join(baseDir, 'commands', 'clancy'),
|
|
49
|
+
workflowsDest: join(baseDir, 'clancy', 'workflows'),
|
|
50
|
+
claudeConfigDir: baseDir,
|
|
51
|
+
manifestPath: join(baseDir, 'clancy', 'manifest.json'),
|
|
52
|
+
workflowsManifestPath: join(baseDir, 'clancy', 'workflows-manifest.json'),
|
|
53
|
+
patchesDir: join(baseDir, 'clancy', 'local-patches'),
|
|
54
|
+
clancyProjectDir: join(cwd, '.clancy'),
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Parse enabled optional roles from the project's `.clancy/.env` file.
|
|
59
|
+
*
|
|
60
|
+
* Returns `null` when no `.clancy/.env` exists (first install — install all
|
|
61
|
+
* roles as a safe default). Returns an empty set when the file exists but
|
|
62
|
+
* `CLANCY_ROLES` is unset or empty, so optional roles are truly opt-in.
|
|
63
|
+
*
|
|
64
|
+
* @param projectRoot - The project root containing `.clancy/`.
|
|
65
|
+
* @param fs - File system operations (injected for testability).
|
|
66
|
+
* @returns A set of enabled role names, or `null` for first install.
|
|
67
|
+
*/
|
|
68
|
+
export function parseEnabledRoles(projectRoot, fs) {
|
|
69
|
+
const env = loadClancyEnv(projectRoot, fs);
|
|
70
|
+
if (!env)
|
|
71
|
+
return null;
|
|
72
|
+
const roles = env.CLANCY_ROLES;
|
|
73
|
+
if (!roles)
|
|
74
|
+
return new Set();
|
|
75
|
+
const normalised = roles
|
|
76
|
+
.split(',')
|
|
77
|
+
.map((r) => r.trim().toLowerCase())
|
|
78
|
+
.filter(Boolean);
|
|
79
|
+
return new Set(normalised);
|
|
80
|
+
}
|
|
81
|
+
/** Throw if a required path does not exist. */
|
|
82
|
+
function requirePath(label, path, exists) {
|
|
83
|
+
if (!exists(path)) {
|
|
84
|
+
throw new Error(`${label} not found: ${path}`);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Validate that all required source directories and files exist.
|
|
89
|
+
*
|
|
90
|
+
* Guards against a corrupted npm package. Throws on the first missing path.
|
|
91
|
+
* `agentsDir` is intentionally not validated — the verification gate prompt
|
|
92
|
+
* is read best-effort in {@link registerHooks} and skipped if missing.
|
|
93
|
+
*
|
|
94
|
+
* @param sources - The source directories to check.
|
|
95
|
+
* @param exists - File existence check (injected for testability).
|
|
96
|
+
* @returns Nothing — throws on the first missing path.
|
|
97
|
+
*/
|
|
98
|
+
export function validateSources(sources, exists) {
|
|
99
|
+
requirePath('Roles source', sources.rolesDir, exists);
|
|
100
|
+
requirePath('Hooks source', sources.hooksDir, exists);
|
|
101
|
+
requirePath('Runtime bundles source', sources.bundleDir, exists);
|
|
102
|
+
BUNDLE_SCRIPTS.forEach((script) => {
|
|
103
|
+
requirePath(`Bundled script ${script}`, join(sources.bundleDir, script), exists);
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
// ---------------------------------------------------------------------------
|
|
107
|
+
// Pipeline steps
|
|
108
|
+
// ---------------------------------------------------------------------------
|
|
109
|
+
/** Print a list of modified files the user should know about. */
|
|
110
|
+
function printModifiedFiles(modified) {
|
|
111
|
+
console.log(blue(' Modified files detected:'));
|
|
112
|
+
modified.forEach(({ rel }) => console.log(` ${dim('•')} ${rel}`));
|
|
113
|
+
console.log('');
|
|
114
|
+
console.log(dim(' These will be backed up before overwriting.'));
|
|
115
|
+
console.log('');
|
|
116
|
+
}
|
|
117
|
+
/** Back up modified files and log the result. */
|
|
118
|
+
function backupAndReport(modified, patchesDir) {
|
|
119
|
+
const backedUp = backupModifiedFiles(modified, patchesDir);
|
|
120
|
+
const message = backedUp
|
|
121
|
+
? green('\n ✓ Modified files backed up to local-patches/')
|
|
122
|
+
: dim('\n No files needed backup (removed before copy).');
|
|
123
|
+
console.log(message);
|
|
124
|
+
}
|
|
125
|
+
/** Confirm overwrite — auto-accepts in non-interactive mode. */
|
|
126
|
+
async function confirmOverwrite(nonInteractive, prompts) {
|
|
127
|
+
if (nonInteractive) {
|
|
128
|
+
console.log(dim(' Auto-overwriting (non-interactive mode).'));
|
|
129
|
+
return true;
|
|
130
|
+
}
|
|
131
|
+
const answer = await prompts.ask(blue(` Overwrite existing installation? [y/N] `));
|
|
132
|
+
return answer.trim().toLowerCase().startsWith('y');
|
|
133
|
+
}
|
|
134
|
+
/** Detect modified files, prompt for overwrite, and back up if needed. */
|
|
135
|
+
async function handleExistingInstall(options) {
|
|
136
|
+
const { paths, nonInteractive, prompts, exists } = options;
|
|
137
|
+
const hasExisting = exists(paths.commandsDest) || exists(paths.workflowsDest);
|
|
138
|
+
if (!hasExisting)
|
|
139
|
+
return true;
|
|
140
|
+
const cmdModified = detectModifiedFiles(paths.commandsDest, paths.manifestPath);
|
|
141
|
+
const wfModified = detectModifiedFiles(paths.workflowsDest, paths.workflowsManifestPath);
|
|
142
|
+
const allModified = [...cmdModified, ...wfModified];
|
|
143
|
+
if (allModified.length > 0)
|
|
144
|
+
printModifiedFiles(allModified);
|
|
145
|
+
const confirmed = await confirmOverwrite(nonInteractive, prompts);
|
|
146
|
+
if (!confirmed)
|
|
147
|
+
return false;
|
|
148
|
+
if (allModified.length > 0)
|
|
149
|
+
backupAndReport(allModified, paths.patchesDir);
|
|
150
|
+
return true;
|
|
151
|
+
}
|
|
152
|
+
/** Copy role files, inline workflows, and write manifests. */
|
|
153
|
+
function installContent(options) {
|
|
154
|
+
const { mode, paths, sources, version, enabledRoles, fs } = options;
|
|
155
|
+
copyRoleFiles({
|
|
156
|
+
rolesDir: sources.rolesDir,
|
|
157
|
+
subdir: 'commands',
|
|
158
|
+
dest: paths.commandsDest,
|
|
159
|
+
enabledRoles,
|
|
160
|
+
});
|
|
161
|
+
copyRoleFiles({
|
|
162
|
+
rolesDir: sources.rolesDir,
|
|
163
|
+
subdir: 'workflows',
|
|
164
|
+
dest: paths.workflowsDest,
|
|
165
|
+
enabledRoles,
|
|
166
|
+
});
|
|
167
|
+
if (mode === 'global') {
|
|
168
|
+
inlineWorkflows(paths.commandsDest, paths.workflowsDest);
|
|
169
|
+
}
|
|
170
|
+
const versionPath = join(paths.commandsDest, 'VERSION');
|
|
171
|
+
fs.rejectSymlink(versionPath);
|
|
172
|
+
fs.writeFile(versionPath, version);
|
|
173
|
+
fs.mkdir(dirname(paths.manifestPath));
|
|
174
|
+
const cmdManifest = JSON.stringify(buildManifest(paths.commandsDest), null, 2);
|
|
175
|
+
const wfManifest = JSON.stringify(buildManifest(paths.workflowsDest), null, 2);
|
|
176
|
+
fs.rejectSymlink(paths.manifestPath);
|
|
177
|
+
fs.rejectSymlink(paths.workflowsManifestPath);
|
|
178
|
+
fs.writeFile(paths.manifestPath, cmdManifest);
|
|
179
|
+
fs.writeFile(paths.workflowsManifestPath, wfManifest);
|
|
180
|
+
}
|
|
181
|
+
/** Copy runtime bundles and write project-level metadata. */
|
|
182
|
+
function setupProjectRuntime(options) {
|
|
183
|
+
const { paths, sources, version, fs } = options;
|
|
184
|
+
fs.rejectSymlink(paths.clancyProjectDir);
|
|
185
|
+
fs.mkdir(paths.clancyProjectDir);
|
|
186
|
+
BUNDLE_SCRIPTS.forEach((script) => {
|
|
187
|
+
const dest = join(paths.clancyProjectDir, script);
|
|
188
|
+
fs.rejectSymlink(dest);
|
|
189
|
+
fs.copyFile(join(sources.bundleDir, script), dest);
|
|
190
|
+
});
|
|
191
|
+
const pkgJsonPath = join(paths.clancyProjectDir, 'package.json');
|
|
192
|
+
fs.rejectSymlink(pkgJsonPath);
|
|
193
|
+
fs.writeFile(pkgJsonPath, JSON.stringify({ type: 'module' }, null, 2) + '\n');
|
|
194
|
+
const versionJsonPath = join(paths.clancyProjectDir, 'version.json');
|
|
195
|
+
const versionMeta = { version, installedAt: options.now() };
|
|
196
|
+
fs.rejectSymlink(versionJsonPath);
|
|
197
|
+
fs.writeFile(versionJsonPath, JSON.stringify(versionMeta, null, 2) + '\n');
|
|
198
|
+
}
|
|
199
|
+
/** Register Clancy hooks in Claude's settings.json. */
|
|
200
|
+
function registerHooks(options) {
|
|
201
|
+
const { paths, sources, fs } = options;
|
|
202
|
+
const gatePromptPath = join(sources.agentsDir, 'verification-gate.md');
|
|
203
|
+
const verificationGatePrompt = fs.exists(gatePromptPath)
|
|
204
|
+
? fs.readFile(gatePromptPath)
|
|
205
|
+
: undefined;
|
|
206
|
+
const success = installHooks({
|
|
207
|
+
claudeConfigDir: paths.claudeConfigDir,
|
|
208
|
+
hooksSourceDir: sources.hooksDir,
|
|
209
|
+
verificationGatePrompt,
|
|
210
|
+
});
|
|
211
|
+
if (!success) {
|
|
212
|
+
console.log(dim(' Warning: hooks could not be installed. Configure manually.'));
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
// ---------------------------------------------------------------------------
|
|
216
|
+
// Main pipeline
|
|
217
|
+
// ---------------------------------------------------------------------------
|
|
218
|
+
/**
|
|
219
|
+
* Run the full installation pipeline.
|
|
220
|
+
*
|
|
221
|
+
* Validates sources, handles existing installations (detect modified, prompt,
|
|
222
|
+
* backup), copies role files, writes metadata, sets up the project runtime
|
|
223
|
+
* directory, and registers hooks. Returns normally on success or user abort.
|
|
224
|
+
*
|
|
225
|
+
* @param options - All dependencies and configuration for the install.
|
|
226
|
+
* @returns Resolves on success or user abort.
|
|
227
|
+
*/
|
|
228
|
+
export async function runInstall(options) {
|
|
229
|
+
const { mode, paths, sources, version, nonInteractive, prompts, fs, cwd } = options;
|
|
230
|
+
const now = options.now ?? (() => new Date().toISOString());
|
|
231
|
+
validateSources(sources, fs.exists);
|
|
232
|
+
console.log('');
|
|
233
|
+
console.log(dim(` Installing to: ${paths.commandsDest}`));
|
|
234
|
+
const shouldContinue = await handleExistingInstall({
|
|
235
|
+
paths,
|
|
236
|
+
nonInteractive,
|
|
237
|
+
prompts,
|
|
238
|
+
exists: fs.exists,
|
|
239
|
+
});
|
|
240
|
+
if (!shouldContinue) {
|
|
241
|
+
console.log('\n Aborted. No files changed.');
|
|
242
|
+
return;
|
|
243
|
+
}
|
|
244
|
+
const enabledRoles = mode === 'global'
|
|
245
|
+
? null
|
|
246
|
+
: parseEnabledRoles(cwd, {
|
|
247
|
+
exists: fs.exists,
|
|
248
|
+
readFile: fs.readFile,
|
|
249
|
+
});
|
|
250
|
+
installContent({ mode, paths, sources, version, enabledRoles, fs });
|
|
251
|
+
setupProjectRuntime({ paths, sources, version, fs, now });
|
|
252
|
+
registerHooks({ paths, sources, fs });
|
|
253
|
+
printSuccess(enabledRoles);
|
|
254
|
+
}
|
|
255
|
+
//# sourceMappingURL=install.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install.js","sourceRoot":"","sources":["../../../src/installer/install/install.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/installer/manifest/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EACnB,aAAa,EACb,mBAAmB,GACpB,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/installer/manifest/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EACnB,aAAa,EACb,mBAAmB,GACpB,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Manifest-based change detection for installed files.
|
|
3
|
+
*
|
|
4
|
+
* Tracks SHA-256 hashes of installed files so that user modifications can
|
|
5
|
+
* be detected and backed up before an update overwrites them.
|
|
6
|
+
*/
|
|
7
|
+
/** A file that has been modified by the user since last install. */
|
|
8
|
+
type ModifiedFile = {
|
|
9
|
+
readonly rel: string;
|
|
10
|
+
readonly absPath: string;
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* Build a manifest of installed files with SHA-256 hashes.
|
|
14
|
+
*
|
|
15
|
+
* Recursively walks a directory and records the hash of every file.
|
|
16
|
+
* Symlinks and non-file entries are skipped.
|
|
17
|
+
*
|
|
18
|
+
* @param baseDir - Root directory to scan.
|
|
19
|
+
* @returns A record mapping relative paths to their SHA-256 hashes.
|
|
20
|
+
*/
|
|
21
|
+
export declare function buildManifest(baseDir: string): Record<string, string>;
|
|
22
|
+
/**
|
|
23
|
+
* Detect files modified by the user since last install.
|
|
24
|
+
*
|
|
25
|
+
* Compares current file hashes against the stored manifest to find changes.
|
|
26
|
+
* Manifest keys containing path traversal sequences are rejected.
|
|
27
|
+
*
|
|
28
|
+
* @param baseDir - The installed directory to check.
|
|
29
|
+
* @param manifestPath - Path to the stored manifest JSON.
|
|
30
|
+
* @returns Array of modified file records with relative and absolute paths.
|
|
31
|
+
*/
|
|
32
|
+
export declare function detectModifiedFiles(baseDir: string, manifestPath: string): readonly ModifiedFile[];
|
|
33
|
+
/**
|
|
34
|
+
* Back up modified files to a patches directory.
|
|
35
|
+
*
|
|
36
|
+
* Copies each modified file and writes a `backup-meta.json` with metadata.
|
|
37
|
+
* Files that vanish between detection and backup are silently skipped.
|
|
38
|
+
* Paths that escape the patches directory are rejected.
|
|
39
|
+
*
|
|
40
|
+
* @param modified - Array of modified file records.
|
|
41
|
+
* @param patchesDir - Directory to store backups.
|
|
42
|
+
* @returns The patches directory path, or `null` if no files were backed up.
|
|
43
|
+
*/
|
|
44
|
+
export declare function backupModifiedFiles(modified: readonly ModifiedFile[], patchesDir: string): string | null;
|
|
45
|
+
export {};
|
|
46
|
+
//# sourceMappingURL=manifest.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../../../src/installer/manifest/manifest.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAeH,oEAAoE;AACpE,KAAK,YAAY,GAAG;IAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAqDvE;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAErE;AAsDD;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,MAAM,GACnB,SAAS,YAAY,EAAE,CASzB;AA6BD;;;;;;;;;;GAUG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,SAAS,YAAY,EAAE,EACjC,UAAU,EAAE,MAAM,GACjB,MAAM,GAAG,IAAI,CAsBf"}
|