@chief-clancy/plan 0.4.2 → 0.5.1

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/README.md CHANGED
@@ -111,7 +111,7 @@ Clancy also tries to update the brief file's `<!-- planned:1,2 -->` marker to `<
111
111
 
112
112
  The argument decides which path runs:
113
113
 
114
- - **Plan-file stem** (e.g. `add-dark-mode-2`): writes the local marker. The board push offer for local plan stems lands in a future PR
114
+ - **Plan-file stem** (e.g. `add-dark-mode-2`): writes the local marker, then optionally pushes the approved plan to the source board ticket as a comment. The push is interactive by default — `/clancy:approve-plan add-dark-mode-2` prompts `Push approved plan to {KEY} as a comment? [y/N]` (default No, never surprise-write to a board). Use `--push` to skip the prompt and push immediately, `--ticket KEY` to override the auto-detected key from the plan file's `**Source:**` header, and `--afk` to combine with `--push` for unattended automation. If the push fails (HTTP error, network issue, key/board mismatch), the local marker stays in place and an exact retry command is printed
115
115
  - **Board ticket key** (e.g. `PROJ-123`): runs the full board comment-to-description transport flow — fetches the plan comment, appends it to the ticket description, edits the plan comment with an approval note, swaps the ticket labels (`CLANCY_LABEL_PLAN` → `CLANCY_LABEL_BUILD`, both with sensible defaults), and — only if `CLANCY_STATUS_PLANNED` is configured — transitions the ticket status. Label swaps are mandatory; status transitions are opt-in via the `CLANCY_STATUS_PLANNED` env var
116
116
 
117
117
  The plan-file lookup runs first, so plan stems win on collision (`PROJ-123.md` exists locally AND `PROJ-123` is a valid ticket key → the local plan wins).
package/bin/plan.js CHANGED
@@ -39,6 +39,9 @@ const require = createRequire(import.meta.url);
39
39
  const pkg = require('../package.json');
40
40
 
41
41
  const planRoot = join(dirname(fileURLToPath(import.meta.url)), '..');
42
+ const scanRoot = join(
43
+ dirname(require.resolve('@chief-clancy/scan/package.json')),
44
+ );
42
45
 
43
46
  const sources = {
44
47
  commandsDir: join(planRoot, 'src', 'commands'),
@@ -85,6 +88,15 @@ const ask = (label) => new Promise((resolve) => rl.question(label, resolve));
85
88
 
86
89
  const COMMAND_FILES = ['approve-plan.md', 'board-setup.md', 'plan.md'];
87
90
  const WORKFLOW_FILES = ['approve-plan.md', 'board-setup.md', 'plan.md'];
91
+ const SCAN_AGENT_FILES = [
92
+ 'arch-agent.md',
93
+ 'concerns-agent.md',
94
+ 'design-agent.md',
95
+ 'quality-agent.md',
96
+ 'tech-agent.md',
97
+ ];
98
+ const SCAN_COMMAND_FILES = ['map-codebase.md', 'update-docs.md'];
99
+ const SCAN_WORKFLOW_FILES = ['map-codebase.md', 'update-docs.md'];
88
100
 
89
101
  // ---------------------------------------------------------------------------
90
102
  // Installer
@@ -111,11 +123,12 @@ function copyChecked(src, dest) {
111
123
  function inlineWorkflows(commandsDest, workflowsDest) {
112
124
  const WORKFLOW_REF = /^@\.claude\/clancy\/workflows\/([^/\\]+\.md)\r?$/gm;
113
125
 
114
- COMMAND_FILES.forEach((file) => {
126
+ [...COMMAND_FILES, ...SCAN_COMMAND_FILES].forEach((file) => {
115
127
  const cmdPath = join(commandsDest, file);
116
128
  const content = readFileSync(cmdPath, 'utf8');
117
129
  const resolved = content.replace(WORKFLOW_REF, (match, fileName) => {
118
130
  const wfPath = join(workflowsDest, fileName);
131
+ rejectSymlink(wfPath);
119
132
  if (!existsSync(wfPath)) return match;
120
133
  return readFileSync(wfPath, 'utf8');
121
134
  });
@@ -154,37 +167,14 @@ async function chooseMode() {
154
167
  }
155
168
 
156
169
  // ---------------------------------------------------------------------------
157
- // Main
170
+ // Install helpers
158
171
  // ---------------------------------------------------------------------------
159
172
 
160
- async function main() {
161
- console.log('');
162
- console.log(blue(' Clancy Plan'));
163
- console.log(
164
- ` ${bold(`v${pkg.version}`)}${dim(' Implementation planner for Claude Code.')}`,
165
- );
166
- console.log('');
167
-
168
- const mode = flag ?? (await chooseMode());
169
-
170
- if (flag) {
171
- console.log(dim(` Mode: ${flag} (--${flag} flag)`));
172
- }
173
-
174
- const cwd = process.cwd();
175
- const baseDir =
176
- mode === 'global' ? join(homeDir, '.claude') : join(cwd, '.claude');
173
+ /** Copy all plan + scan files and write version marker. */
174
+ function installFiles(dest, mode) {
175
+ const { commandsDest, workflowsDest, agentsDest } = dest;
177
176
 
178
- const commandsDest = join(baseDir, 'commands', 'clancy');
179
- const workflowsDest = join(baseDir, 'clancy', 'workflows');
180
-
181
- console.log(dim(` Installing to: ${commandsDest}`));
182
-
183
- // Create directories
184
- mkdirSync(commandsDest, { recursive: true });
185
- mkdirSync(workflowsDest, { recursive: true });
186
-
187
- // Copy files
177
+ // Plan files
188
178
  COMMAND_FILES.forEach((f) =>
189
179
  copyChecked(join(sources.commandsDir, f), join(commandsDest, f)),
190
180
  );
@@ -192,17 +182,26 @@ async function main() {
192
182
  copyChecked(join(sources.workflowsDir, f), join(workflowsDest, f)),
193
183
  );
194
184
 
195
- // Inline workflows for global mode
196
- if (mode === 'global') {
197
- inlineWorkflows(commandsDest, workflowsDest);
198
- }
185
+ // Scan files (agents, commands, workflows from @chief-clancy/scan)
186
+ SCAN_AGENT_FILES.forEach((f) =>
187
+ copyChecked(join(scanRoot, 'src', 'agents', f), join(agentsDest, f)),
188
+ );
189
+ SCAN_COMMAND_FILES.forEach((f) =>
190
+ copyChecked(join(scanRoot, 'src', 'commands', f), join(commandsDest, f)),
191
+ );
192
+ SCAN_WORKFLOW_FILES.forEach((f) =>
193
+ copyChecked(join(scanRoot, 'src', 'workflows', f), join(workflowsDest, f)),
194
+ );
195
+
196
+ if (mode === 'global') inlineWorkflows(commandsDest, workflowsDest);
199
197
 
200
- // Write version marker
201
198
  const versionPath = join(commandsDest, 'VERSION.plan');
202
199
  rejectSymlink(versionPath);
203
200
  writeFileSync(versionPath, pkg.version);
201
+ }
204
202
 
205
- // Success
203
+ /** Print the install success output. */
204
+ function printSuccess() {
206
205
  console.log('');
207
206
  console.log(green(' ✓ Clancy Plan installed successfully.'));
208
207
  console.log('');
@@ -216,10 +215,19 @@ async function main() {
216
215
  console.log(
217
216
  ` ${cyan('/clancy:board-setup')} ${dim('Configure board credentials (optional)')}`,
218
217
  );
218
+ console.log(
219
+ ` ${cyan('/clancy:map-codebase')} ${dim('Scan codebase and generate .clancy/docs/')}`,
220
+ );
221
+ console.log(
222
+ ` ${cyan('/clancy:update-docs')} ${dim('Refresh .clancy/docs/ incrementally')}`,
223
+ );
219
224
  console.log('');
220
225
  console.log(' Next steps:');
221
226
  console.log(` 1. Open a project in Claude Code`);
222
- console.log(` 2. Run: ${cyan('/clancy:plan TICKET-123')}`);
227
+ console.log(
228
+ ` 2. Optional: ${cyan('/clancy:map-codebase')} ${dim('for better plans')}`,
229
+ );
230
+ console.log(` 3. Run: ${cyan('/clancy:plan TICKET-123')}`);
223
231
  console.log('');
224
232
  console.log(dim(' Want to plan board tickets?'));
225
233
  console.log(dim(` Run: ${cyan('/clancy:board-setup')}`));
@@ -229,6 +237,42 @@ async function main() {
229
237
  );
230
238
  console.log(dim(` npx chief-clancy`));
231
239
  console.log('');
240
+ }
241
+
242
+ // ---------------------------------------------------------------------------
243
+ // Main
244
+ // ---------------------------------------------------------------------------
245
+
246
+ async function main() {
247
+ console.log('');
248
+ console.log(blue(' Clancy Plan'));
249
+ console.log(
250
+ ` ${bold(`v${pkg.version}`)}${dim(' Implementation planner for Claude Code.')}`,
251
+ );
252
+ console.log('');
253
+
254
+ const mode = flag ?? (await chooseMode());
255
+
256
+ if (flag) {
257
+ console.log(dim(` Mode: ${flag} (--${flag} flag)`));
258
+ }
259
+
260
+ const cwd = process.cwd();
261
+ const baseDir =
262
+ mode === 'global' ? join(homeDir, '.claude') : join(cwd, '.claude');
263
+
264
+ const commandsDest = join(baseDir, 'commands', 'clancy');
265
+ const workflowsDest = join(baseDir, 'clancy', 'workflows');
266
+ const agentsDest = join(baseDir, 'clancy', 'agents');
267
+
268
+ console.log(dim(` Installing to: ${commandsDest}`));
269
+
270
+ mkdirSync(commandsDest, { recursive: true });
271
+ mkdirSync(workflowsDest, { recursive: true });
272
+ mkdirSync(agentsDest, { recursive: true });
273
+
274
+ installFiles({ commandsDest, workflowsDest, agentsDest }, mode);
275
+ printSuccess();
232
276
 
233
277
  rl.close();
234
278
  }
@@ -4,11 +4,15 @@ export type PlanInstallMode = 'global' | 'local';
4
4
  export type PlanInstallPaths = {
5
5
  readonly commandsDest: string;
6
6
  readonly workflowsDest: string;
7
+ readonly agentsDest: string;
7
8
  };
8
9
  /** Source directories within the npm package. */
9
10
  type PlanInstallSources = {
10
11
  readonly commandsDir: string;
11
12
  readonly workflowsDir: string;
13
+ readonly scanAgentsDir: string;
14
+ readonly scanCommandsDir: string;
15
+ readonly scanWorkflowsDir: string;
12
16
  };
13
17
  /**
14
18
  * File system operations the installer performs.
@@ -1 +1 @@
1
- {"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../src/installer/install.ts"],"names":[],"mappings":"AAaA,wEAAwE;AACxE,MAAM,MAAM,eAAe,GAAG,QAAQ,GAAG,OAAO,CAAC;AAEjD,8DAA8D;AAC9D,MAAM,MAAM,gBAAgB,GAAG;IAC7B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;CAChC,CAAC;AAEF,iDAAiD;AACjD,KAAK,kBAAkB,GAAG;IACxB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;CAC/B,CAAC;AAEF;;;;GAIG;AACH,KAAK,eAAe,GAAG;IACrB,QAAQ,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;IAC3C,QAAQ,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;IAC5C,QAAQ,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5D,QAAQ,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,QAAQ,CAAC,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACvD,oEAAoE;IACpE,QAAQ,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;CAC/C,CAAC;AAEF,0CAA0C;AAC1C,MAAM,MAAM,qBAAqB,GAAG;IAClC,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC;IAC/B,QAAQ,CAAC,KAAK,EAAE,gBAAgB,CAAC;IACjC,QAAQ,CAAC,OAAO,EAAE,kBAAkB,CAAC;IACrC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,EAAE,EAAE,eAAe,CAAC;CAC9B,CAAC;AAuBF;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,GAC/B,MAAM,SAAS,MAAM,EAAE,KACtB,eAAe,GAAG,IAKpB,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,uBAAuB,GAClC,MAAM,eAAe,EACrB,SAAS,MAAM,EACf,KAAK,MAAM,KACV,gBAQF,CAAC;AA4EF;;;;;;;;GAQG;AACH,eAAO,MAAM,cAAc,GAAI,SAAS,qBAAqB,KAAG,IAuB/D,CAAC"}
1
+ {"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../src/installer/install.ts"],"names":[],"mappings":"AAaA,wEAAwE;AACxE,MAAM,MAAM,eAAe,GAAG,QAAQ,GAAG,OAAO,CAAC;AAEjD,8DAA8D;AAC9D,MAAM,MAAM,gBAAgB,GAAG;IAC7B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B,CAAC;AAEF,iDAAiD;AACjD,KAAK,kBAAkB,GAAG;IACxB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;CACnC,CAAC;AAEF;;;;GAIG;AACH,KAAK,eAAe,GAAG;IACrB,QAAQ,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;IAC3C,QAAQ,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;IAC5C,QAAQ,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5D,QAAQ,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,QAAQ,CAAC,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACvD,oEAAoE;IACpE,QAAQ,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;CAC/C,CAAC;AAEF,0CAA0C;AAC1C,MAAM,MAAM,qBAAqB,GAAG;IAClC,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC;IAC/B,QAAQ,CAAC,KAAK,EAAE,gBAAgB,CAAC;IACjC,QAAQ,CAAC,OAAO,EAAE,kBAAkB,CAAC;IACrC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,EAAE,EAAE,eAAe,CAAC;CAC9B,CAAC;AAsCF;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,GAC/B,MAAM,SAAS,MAAM,EAAE,KACtB,eAAe,GAAG,IAKpB,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,uBAAuB,GAClC,MAAM,eAAe,EACrB,SAAS,MAAM,EACf,KAAK,MAAM,KACV,gBASF,CAAC;AA+EF;;;;;;;;GAQG;AACH,eAAO,MAAM,cAAc,GAAI,SAAS,qBAAqB,KAAG,IAyC/D,CAAC"}
@@ -17,6 +17,18 @@ const WORKFLOW_FILES = [
17
17
  'board-setup.md',
18
18
  'plan.md',
19
19
  ];
20
+ /** Scan agent files from @chief-clancy/scan. */
21
+ const SCAN_AGENT_FILES = [
22
+ 'arch-agent.md',
23
+ 'concerns-agent.md',
24
+ 'design-agent.md',
25
+ 'quality-agent.md',
26
+ 'tech-agent.md',
27
+ ];
28
+ /** Scan command files from @chief-clancy/scan. */
29
+ const SCAN_COMMAND_FILES = ['map-codebase.md', 'update-docs.md'];
30
+ /** Scan workflow files from @chief-clancy/scan. */
31
+ const SCAN_WORKFLOW_FILES = ['map-codebase.md', 'update-docs.md'];
20
32
  /** Matches `@.claude/clancy/workflows/<filename>.md` on its own line. */
21
33
  const WORKFLOW_REF = /^@\.claude\/clancy\/workflows\/([^/\\]+\.md)\r?$/gm;
22
34
  // ---------------------------------------------------------------------------
@@ -48,6 +60,7 @@ export const resolvePlanInstallPaths = (mode, homeDir, cwd) => {
48
60
  return {
49
61
  commandsDest: join(baseDir, 'commands', 'clancy'),
50
62
  workflowsDest: join(baseDir, 'clancy', 'workflows'),
63
+ agentsDest: join(baseDir, 'clancy', 'agents'),
51
64
  };
52
65
  };
53
66
  // ---------------------------------------------------------------------------
@@ -62,6 +75,7 @@ const rejectSymlink = (path, isSymlink) => {
62
75
  /** Copy a list of files from src dir to dest dir with symlink protection. */
63
76
  const copyFiles = (options) => {
64
77
  const { files, srcDir, destDir, fs } = options;
78
+ rejectSymlink(destDir, fs.isSymlink);
65
79
  fs.mkdir(destDir);
66
80
  files.forEach((file) => {
67
81
  const src = join(srcDir, file);
@@ -81,12 +95,15 @@ const copyFiles = (options) => {
81
95
  * @-file resolution.
82
96
  */
83
97
  const inlineWorkflow = (commandsDest, workflowsDest, fs) => {
84
- COMMAND_FILES.forEach((file) => {
98
+ [...COMMAND_FILES, ...SCAN_COMMAND_FILES].forEach((file) => {
85
99
  const cmdPath = join(commandsDest, file);
86
100
  const content = fs.readFile(cmdPath);
87
101
  const resolved = content.replace(WORKFLOW_REF, (match, fileName) => {
88
102
  const wfPath = join(workflowsDest, fileName);
89
- return fs.exists(wfPath) ? fs.readFile(wfPath) : match;
103
+ rejectSymlink(wfPath, fs.isSymlink);
104
+ if (!fs.exists(wfPath))
105
+ return match;
106
+ return fs.readFile(wfPath);
90
107
  });
91
108
  if (resolved !== content) {
92
109
  rejectSymlink(cmdPath, fs.isSymlink);
@@ -120,6 +137,24 @@ export const runPlanInstall = (options) => {
120
137
  destDir: paths.workflowsDest,
121
138
  fs,
122
139
  });
140
+ copyFiles({
141
+ files: SCAN_AGENT_FILES,
142
+ srcDir: sources.scanAgentsDir,
143
+ destDir: paths.agentsDest,
144
+ fs,
145
+ });
146
+ copyFiles({
147
+ files: SCAN_COMMAND_FILES,
148
+ srcDir: sources.scanCommandsDir,
149
+ destDir: paths.commandsDest,
150
+ fs,
151
+ });
152
+ copyFiles({
153
+ files: SCAN_WORKFLOW_FILES,
154
+ srcDir: sources.scanWorkflowsDir,
155
+ destDir: paths.workflowsDest,
156
+ fs,
157
+ });
123
158
  if (mode === 'global') {
124
159
  inlineWorkflow(paths.commandsDest, paths.workflowsDest, fs);
125
160
  }
@@ -1 +1 @@
1
- {"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/installer/install.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/installer/install.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@chief-clancy/plan",
3
- "version": "0.4.2",
3
+ "version": "0.5.1",
4
4
  "private": false,
5
5
  "description": "Implementation planner for Claude Code — decompose briefs into actionable plans",
6
6
  "author": "Alex Clapperton",
@@ -39,6 +39,9 @@
39
39
  "src/commands",
40
40
  "src/workflows"
41
41
  ],
42
+ "dependencies": {
43
+ "@chief-clancy/scan": "0.2.0"
44
+ },
42
45
  "scripts": {
43
46
  "build": "rm -rf dist tsconfig.build.tsbuildinfo && tsc --project tsconfig.build.json && tsc-alias --project tsconfig.build.json",
44
47
  "test": "vitest run",
@@ -17,7 +17,9 @@ Examples:
17
17
  Optional flags:
18
18
 
19
19
  - **Skip confirmation:** `--afk` — auto-confirm without prompting (for automation)
20
+ - **Push approved plan to a board ticket:** `--push` — when approving a local plan stem in standalone+board mode, skip the interactive `[y/N]` prompt and push the approved plan to the source ticket as a comment immediately. Combined with `--afk`, this is the unattended-automation path. Without `--push`, an interactive approval still gets a `[y/N]` prompt (default No — never surprise-write to a board); an `--afk` approval without `--push` stays local-only and logs `LOCAL_ONLY` to `.clancy/progress.txt`. `--push` is also the **retry path** for a previously failed push: re-running `/clancy:approve-plan {stem} --push --ticket {KEY}` after a board push failure falls through Step 4a's `EEXIST` check (the marker stays in place) and re-attempts the Step 4c push.
21
+ - **Override the auto-detected ticket key:** `--ticket {KEY}` — bypass the `**Source:**` auto-detect from the plan file and push to the explicit `{KEY}` instead. The override `{KEY}` is validated against the configured board's regex before any push attempt — a malformed key is a hard error. Useful when the brief Source field is missing, ambiguous, or points at the wrong ticket. `--ticket` is **ignored** under `--afk` without `--push` (no push happens, so there is nothing to override).
20
22
 
21
23
  @.claude/clancy/workflows/approve-plan.md
22
24
 
23
- Follow the approve-plan workflow above. Detect the install context, resolve the argument (plan-file stem or ticket key), and either write the local marker (Step 4a/4b) or run the existing board transport flow (Steps 5/5b/6). Do not implement anything — approval only.
25
+ Follow the approve-plan workflow above. Detect the install context, resolve the argument (plan-file stem or ticket key), and either write the local marker (Step 4a/4b) followed by an optional board push (Step 4c) or run the existing board transport flow (Steps 5/5b/6). Do not implement anything — approval only.