@refrakt-md/plan 0.9.8 → 0.10.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 (40) hide show
  1. package/dist/cli-plugin.d.ts.map +1 -1
  2. package/dist/cli-plugin.js +132 -15
  3. package/dist/cli-plugin.js.map +1 -1
  4. package/dist/commands/bundle-behaviors.d.ts +4 -0
  5. package/dist/commands/bundle-behaviors.d.ts.map +1 -1
  6. package/dist/commands/bundle-behaviors.js +13 -2
  7. package/dist/commands/bundle-behaviors.js.map +1 -1
  8. package/dist/commands/create.d.ts.map +1 -1
  9. package/dist/commands/create.js +5 -3
  10. package/dist/commands/create.js.map +1 -1
  11. package/dist/commands/init.d.ts +25 -3
  12. package/dist/commands/init.d.ts.map +1 -1
  13. package/dist/commands/init.js +296 -98
  14. package/dist/commands/init.js.map +1 -1
  15. package/dist/commands/migrate.d.ts +40 -0
  16. package/dist/commands/migrate.d.ts.map +1 -0
  17. package/dist/commands/migrate.js +110 -0
  18. package/dist/commands/migrate.js.map +1 -0
  19. package/dist/commands/project-setup.d.ts +30 -0
  20. package/dist/commands/project-setup.d.ts.map +1 -0
  21. package/dist/commands/project-setup.js +123 -0
  22. package/dist/commands/project-setup.js.map +1 -0
  23. package/dist/commands/templates.d.ts +0 -22
  24. package/dist/commands/templates.d.ts.map +1 -1
  25. package/dist/commands/templates.js +0 -46
  26. package/dist/commands/templates.js.map +1 -1
  27. package/dist/commands/validate.d.ts.map +1 -1
  28. package/dist/commands/validate.js +39 -1
  29. package/dist/commands/validate.js.map +1 -1
  30. package/dist/index.d.ts.map +1 -1
  31. package/dist/index.js +2 -12
  32. package/dist/index.js.map +1 -1
  33. package/dist/tags/spec.d.ts.map +1 -1
  34. package/dist/tags/spec.js +2 -1
  35. package/dist/tags/spec.js.map +1 -1
  36. package/dist/util.d.ts +5 -0
  37. package/dist/util.d.ts.map +1 -1
  38. package/dist/util.js +7 -1
  39. package/dist/util.js.map +1 -1
  40. package/package.json +20 -8
@@ -1,26 +1,34 @@
1
- import { existsSync, mkdirSync, writeFileSync, readFileSync, appendFileSync } from 'fs';
1
+ import { existsSync, mkdirSync, writeFileSync, readFileSync, appendFileSync, chmodSync } from 'fs';
2
2
  import { join, dirname } from 'path';
3
+ import { fileURLToPath } from 'url';
3
4
  import { runCreate } from './create.js';
4
- import { STATUS_PAGES, renderStatusPage, renderTypeIndexPage } from './templates.js';
5
+ import { idExists } from './next-id.js';
6
+ import { findInstallRoot, detectPackageManager, installCommand } from './project-setup.js';
5
7
  export const EXIT_SUCCESS = 0;
6
8
  export const EXIT_ALREADY_EXISTS = 1;
7
- /** Map of agent tool names to their instruction file paths (relative to project root). */
9
+ /**
10
+ * Tool-specific agent instruction files that get a brief plan summary
11
+ * appended, pointing to plan/INSTRUCTIONS.md for the full reference.
12
+ */
8
13
  export const AGENT_FILES = {
9
14
  claude: 'CLAUDE.md',
10
15
  cursor: '.cursorrules',
11
16
  copilot: '.github/copilot-instructions.md',
12
17
  windsurf: '.windsurfrules',
13
18
  cline: '.clinerules',
19
+ agents: 'AGENTS.md',
14
20
  };
15
- /** Short pointer appended to agent instruction files. */
16
- const POINTER_SECTION = `
17
- ## Plan
18
-
19
- Project planning content lives in \`plan/\` using \`@refrakt-md/plan\`. See \`plan/INSTRUCTIONS.md\` for the full workflow guide.
21
+ /**
22
+ * Brief plan summary appended to agent instruction files.
23
+ * Points to plan/INSTRUCTIONS.md for the full reference.
24
+ */
25
+ const PLAN_SUMMARY = `\n\n## Plan
20
26
 
21
- Quick start: \`refrakt plan next\` | \`refrakt plan status\` | \`refrakt plan create work --title "..."\`
27
+ Project planning lives in \`plan/\` as Markdoc files. Use \`refrakt plan\` commands to manage items — never edit plan files by hand. Run \`refrakt plan next\` to find work. See [plan/INSTRUCTIONS.md](plan/INSTRUCTIONS.md) for the full workflow reference.
22
28
  `;
23
- /** Full tool-agnostic workflow guide written to plan/INSTRUCTIONS.md. */
29
+ /** Markers used to detect that a file already contains our plan section. */
30
+ const PLAN_MARKERS = ['plan/INSTRUCTIONS.md', 'refrakt plan next', 'See [AGENTS.md]'];
31
+ /** Full tool-agnostic workflow guide written to plan/INSTRUCTIONS.md (kept for reference inside plan/). */
24
32
  const INSTRUCTIONS_CONTENT = `# Plan — Workflow Guide
25
33
 
26
34
  This directory contains project planning content using the \`@refrakt-md/plan\` runes package. All files are Markdoc (\`.md\` with \`{% %}\` tags).
@@ -30,7 +38,8 @@ This directory contains project planning content using the \`@refrakt-md/plan\`
30
38
  \`\`\`
31
39
  plan/
32
40
  specs/ — Specifications (what to build)
33
- work/ — Work items and bugs (how to build it)
41
+ work/ — Work items (how to build it)
42
+ bugs/ — Bug reports (what is broken)
34
43
  decisions/ — Architecture decision records (why it's built this way)
35
44
  milestones/ — Named release targets with scope and goals
36
45
  \`\`\`
@@ -83,14 +92,106 @@ refrakt plan create milestone --id v1.0 --title "Description"
83
92
  - **Bug**: A defect report. Use instead of a work item when something is broken rather than missing.
84
93
  - **Decision**: An architectural choice that needs to be recorded for future reference.
85
94
 
95
+ ## Runes in Prose
96
+
97
+ Plan content is text-first, but a curated set of runes may be used inside entity bodies (specs, work items, bugs, decisions, milestones) when they genuinely clarify the prose.
98
+
99
+ - **\`sandbox\`** — embed a small runnable component or layout preview
100
+ - **\`diagram\`** — render a structured diagram (architecture, sequence, state)
101
+ - **\`chart\`** — render a chart from inline data
102
+ - **\`datatable\`** — render a structured data table with search/filter/sort
103
+ - **\`budget\`** — structured monetary budget block (costs, spend allocations)
104
+
105
+ Run \`refrakt reference <name>\` to get the exact Markdoc syntax for any rune (e.g. \`refrakt reference sandbox\`).
106
+
107
+ Prefer prose over runes by default — reach for a rune only when it is meaningfully clearer than plain text or a Markdown table.
108
+
86
109
  ## JSON Output
87
110
 
88
111
  All commands support \`--format json\` for machine-readable output. This is useful for scripting, CI pipelines, and programmatic integration.
89
112
  `;
90
113
  /**
91
- * Detect which agent instruction files already exist in the project root.
92
- * Returns the relative file paths of existing files.
114
+ * Shell command written into .claude/settings.json SessionStart hook.
115
+ *
116
+ * Detection order mirrors detectPackageManager in project-setup.ts:
117
+ * 1. Corepack `packageManager` field in package.json (authoritative)
118
+ * 2. The most recently modified lockfile (newest mtime wins — handles stale
119
+ * pnpm-lock.yaml / yarn.lock leftovers in an npm-workspaces repo)
120
+ * 3. Default to npm
93
121
  */
122
+ const HOOK_COMMAND = `[ -x node_modules/.bin/refrakt ] || { pm=""; if [ -f package.json ]; then pm=$(sed -n 's/.*"packageManager"[[:space:]]*:[[:space:]]*"\\([a-z]*\\)@.*/\\1/p' package.json | head -n1); fi; case "$pm" in npm|pnpm|yarn|bun) ;; *) pm="" ;; esac; if [ -z "$pm" ]; then newest=""; for f in bun.lockb bun.lock pnpm-lock.yaml yarn.lock package-lock.json; do [ -f "$f" ] || continue; if [ -z "$newest" ] || [ "$f" -nt "$newest" ]; then newest=$f; fi; done; case "$newest" in bun.lock*) pm=bun ;; pnpm-lock.yaml) pm=pnpm ;; yarn.lock) pm=yarn ;; *) pm=npm ;; esac; fi; case "$pm" in bun) bun install ;; pnpm) pnpm install ;; yarn) yarn install ;; *) npm install ;; esac; }`;
123
+ /**
124
+ * Wrapper script body. Works under any POSIX shell with `-nt` support
125
+ * (dash, bash, ksh, zsh, busybox sh). Installs deps on first run using the
126
+ * detected package manager, then defers to `npx refrakt plan`.
127
+ */
128
+ const WRAPPER_SCRIPT = `#!/usr/bin/env sh
129
+ set -e
130
+
131
+ # Detection order:
132
+ # 1. Corepack packageManager field in package.json (authoritative)
133
+ # 2. Newest lockfile by mtime (so a stale pnpm-lock.yaml next to a fresh
134
+ # package-lock.json correctly resolves to npm)
135
+ # 3. Default to npm
136
+ detect_pm() {
137
+ pm=""
138
+ if [ -f package.json ]; then
139
+ pm=$(sed -n 's/.*"packageManager"[[:space:]]*:[[:space:]]*"\\([a-z]*\\)@.*/\\1/p' package.json | head -n1)
140
+ fi
141
+ case "$pm" in
142
+ npm|pnpm|yarn|bun) echo "$pm"; return ;;
143
+ esac
144
+ newest=""
145
+ for f in bun.lockb bun.lock pnpm-lock.yaml yarn.lock package-lock.json; do
146
+ [ -f "$f" ] || continue
147
+ if [ -z "$newest" ] || [ "$f" -nt "$newest" ]; then
148
+ newest=$f
149
+ fi
150
+ done
151
+ case "$newest" in
152
+ bun.lock*) echo bun ;;
153
+ pnpm-lock.yaml) echo pnpm ;;
154
+ yarn.lock) echo yarn ;;
155
+ *) echo npm ;;
156
+ esac
157
+ }
158
+
159
+ if [ ! -x node_modules/.bin/refrakt ]; then
160
+ case "$(detect_pm)" in
161
+ bun) bun install ;;
162
+ pnpm) pnpm install ;;
163
+ yarn) yarn install ;;
164
+ *) npm install ;;
165
+ esac
166
+ fi
167
+ exec npx refrakt plan "$@"
168
+ `;
169
+ /**
170
+ * Read this plan package's own version so we can pin host devDependencies
171
+ * to a range compatible with the CLI that's running init.
172
+ */
173
+ function getOwnVersion() {
174
+ const here = dirname(fileURLToPath(import.meta.url));
175
+ // Built: dist/commands/init.js → ../../package.json
176
+ // Source (vitest via tsx): src/commands/init.ts → ../../package.json
177
+ const candidates = [
178
+ join(here, '..', '..', 'package.json'),
179
+ join(here, '..', '..', '..', 'package.json'),
180
+ ];
181
+ for (const p of candidates) {
182
+ try {
183
+ const pkg = JSON.parse(readFileSync(p, 'utf-8'));
184
+ if (pkg && pkg.name === '@refrakt-md/plan' && typeof pkg.version === 'string') {
185
+ return pkg.version;
186
+ }
187
+ }
188
+ catch {
189
+ // try next candidate
190
+ }
191
+ }
192
+ return '*';
193
+ }
194
+ /** Detect which agent instruction files already exist in the project root. */
94
195
  function detectAgentFiles(projectRoot) {
95
196
  const found = [];
96
197
  for (const relPath of Object.values(AGENT_FILES)) {
@@ -100,36 +201,144 @@ function detectAgentFiles(projectRoot) {
100
201
  }
101
202
  return found;
102
203
  }
204
+ function hasPlanMarker(content) {
205
+ return PLAN_MARKERS.some(m => content.includes(m));
206
+ }
103
207
  /**
104
- * Append the plan pointer section to an agent instruction file.
208
+ * Append the brief plan summary to an agent instruction file.
105
209
  * Creates the file (and parent directories) if it doesn't exist.
106
210
  * Returns true if the file was updated.
107
211
  */
108
- function appendPointer(projectRoot, relPath) {
212
+ function appendPlanSummary(projectRoot, relPath) {
109
213
  const filePath = join(projectRoot, relPath);
110
214
  if (existsSync(filePath)) {
111
215
  const content = readFileSync(filePath, 'utf-8');
112
- if (content.includes('plan/INSTRUCTIONS.md') || content.includes('refrakt plan next')) {
216
+ if (hasPlanMarker(content)) {
113
217
  return false;
114
218
  }
115
- appendFileSync(filePath, POINTER_SECTION);
219
+ appendFileSync(filePath, PLAN_SUMMARY);
116
220
  return true;
117
221
  }
118
222
  const dir = dirname(filePath);
119
223
  if (!existsSync(dir)) {
120
224
  mkdirSync(dir, { recursive: true });
121
225
  }
122
- writeFileSync(filePath, POINTER_SECTION.trimStart());
226
+ writeFileSync(filePath, PLAN_SUMMARY.trimStart());
123
227
  return true;
124
228
  }
125
229
  /**
126
- * Initialize a plan directory structure with example files.
230
+ * Merge plan-related entries into an existing package.json or create one.
231
+ * Never overwrites existing keys. Returns true if the file was modified.
232
+ */
233
+ function updateHostPackageJson(pkgJsonPath, versions) {
234
+ let pkg = {};
235
+ try {
236
+ pkg = JSON.parse(readFileSync(pkgJsonPath, 'utf-8'));
237
+ }
238
+ catch {
239
+ return false;
240
+ }
241
+ let changed = false;
242
+ if (!pkg.scripts || typeof pkg.scripts !== 'object') {
243
+ pkg.scripts = {};
244
+ }
245
+ if (!pkg.scripts.plan) {
246
+ pkg.scripts.plan = 'refrakt plan';
247
+ changed = true;
248
+ }
249
+ if (!pkg.devDependencies || typeof pkg.devDependencies !== 'object') {
250
+ pkg.devDependencies = {};
251
+ }
252
+ const deps = pkg.devDependencies;
253
+ const alreadyInDeps = (name) => (pkg.dependencies && pkg.dependencies[name]) ||
254
+ (pkg.devDependencies && pkg.devDependencies[name]);
255
+ if (!alreadyInDeps('@refrakt-md/cli')) {
256
+ deps['@refrakt-md/cli'] = `^${versions.cli}`;
257
+ changed = true;
258
+ }
259
+ if (!alreadyInDeps('@refrakt-md/plan')) {
260
+ deps['@refrakt-md/plan'] = `^${versions.plan}`;
261
+ changed = true;
262
+ }
263
+ if (changed) {
264
+ writeFileSync(pkgJsonPath, JSON.stringify(pkg, null, 2) + '\n');
265
+ }
266
+ return changed;
267
+ }
268
+ /**
269
+ * Write (or merge into) .claude/settings.json with a SessionStart hook that
270
+ * installs dependencies if `refrakt` isn't resolvable. If the file already
271
+ * contains our hook command, leave it alone.
272
+ */
273
+ function writeClaudeHook(projectRoot) {
274
+ const settingsDir = join(projectRoot, '.claude');
275
+ const settingsPath = join(settingsDir, 'settings.json');
276
+ let settings = {};
277
+ if (existsSync(settingsPath)) {
278
+ try {
279
+ settings = JSON.parse(readFileSync(settingsPath, 'utf-8'));
280
+ }
281
+ catch {
282
+ return false;
283
+ }
284
+ }
285
+ if (!settings.hooks)
286
+ settings.hooks = {};
287
+ if (!Array.isArray(settings.hooks.SessionStart))
288
+ settings.hooks.SessionStart = [];
289
+ for (const block of settings.hooks.SessionStart) {
290
+ if (!block.hooks)
291
+ continue;
292
+ if (block.hooks.some(h => h.command === HOOK_COMMAND)) {
293
+ return false;
294
+ }
295
+ }
296
+ settings.hooks.SessionStart.push({
297
+ hooks: [{ type: 'command', command: HOOK_COMMAND }],
298
+ });
299
+ if (!existsSync(settingsDir)) {
300
+ mkdirSync(settingsDir, { recursive: true });
301
+ }
302
+ writeFileSync(settingsPath, JSON.stringify(settings, null, 2) + '\n');
303
+ return true;
304
+ }
305
+ /**
306
+ * Write a ./plan.sh wrapper script and mark it executable. We use `.sh`
307
+ * because the default content directory is also called `plan/` and a file
308
+ * named `plan` can't coexist with a directory of the same name in a single
309
+ * parent. Users run `./plan.sh next` (or just `npm run plan -- next`).
310
+ */
311
+ function writeWrapperScript(projectRoot) {
312
+ const scriptPath = join(projectRoot, 'plan.sh');
313
+ if (existsSync(scriptPath)) {
314
+ const existing = readFileSync(scriptPath, 'utf-8');
315
+ if (existing === WRAPPER_SCRIPT)
316
+ return false;
317
+ // A different file already exists at ./plan.sh — don't clobber it.
318
+ return false;
319
+ }
320
+ writeFileSync(scriptPath, WRAPPER_SCRIPT);
321
+ try {
322
+ chmodSync(scriptPath, 0o755);
323
+ }
324
+ catch {
325
+ // Best-effort on platforms without POSIX perms (Windows).
326
+ }
327
+ return true;
328
+ }
329
+ /**
330
+ * Initialize a plan directory structure, wire the host project for agent use,
331
+ * and (optionally) install a Claude SessionStart hook + ./plan wrapper.
127
332
  */
128
333
  export function runInit(options) {
129
- const { dir, projectRoot = '.', agent } = options;
334
+ const { dir, projectRoot = '.', agent, noPackageJson = false, noHooks = false, noWrapper = false, } = options;
335
+ const versions = options.versions ?? (() => {
336
+ const v = getOwnVersion();
337
+ return { cli: v, plan: v };
338
+ })();
130
339
  const created = [];
131
- // Create directories
132
- const dirs = ['work', 'specs', 'decisions', 'milestones'];
340
+ // --- 1. plan/ scaffolding ------------------------------------------------
341
+ const dirs = ['work', 'bugs', 'specs', 'decisions', 'milestones'];
133
342
  for (const sub of dirs) {
134
343
  const path = join(dir, sub);
135
344
  if (!existsSync(path)) {
@@ -137,96 +346,85 @@ export function runInit(options) {
137
346
  created.push(path + '/');
138
347
  }
139
348
  }
140
- // Create example files — use runCreate which generates slug-based filenames
141
349
  const examples = [
142
- { type: 'spec', id: 'SPEC-001', title: 'Example Spec', subDir: 'specs', slug: 'example-spec.md' },
143
- { type: 'work', id: 'WORK-001', title: 'Example Work Item', subDir: 'work', slug: 'example-work-item.md', attrs: { priority: 'medium', complexity: 'simple', tags: '' } },
144
- { type: 'decision', id: 'ADR-001', title: 'Example Decision', subDir: 'decisions', slug: 'example-decision.md' },
145
- { type: 'milestone', id: 'v0.1.0', title: 'First Release', subDir: 'milestones', slug: 'first-release.md' },
350
+ { type: 'spec', id: 'SPEC-001', title: 'Example Spec' },
351
+ { type: 'work', id: 'WORK-001', title: 'Example Work Item', attrs: { priority: 'medium', complexity: 'simple', tags: '' } },
352
+ { type: 'decision', id: 'ADR-001', title: 'Example Decision' },
353
+ { type: 'milestone', id: 'v0.1.0', title: 'First Release' },
146
354
  ];
147
355
  for (const ex of examples) {
148
- const filePath = join(dir, ex.subDir, ex.slug);
149
- if (!existsSync(filePath)) {
150
- runCreate({ dir, type: ex.type, id: ex.id, title: ex.title, attrs: ex.attrs });
151
- created.push(filePath);
152
- }
153
- }
154
- // Create status filter pages for each type
155
- for (const def of STATUS_PAGES) {
156
- const slug = `${def.status}.md`;
157
- const filePath = join(dir, def.typeDir, slug);
158
- if (!existsSync(filePath)) {
159
- writeFileSync(filePath, renderStatusPage(def));
160
- created.push(filePath);
161
- }
162
- }
163
- // Create type-level index pages with links to status filter pages
164
- const typeDirs = [...new Set(STATUS_PAGES.map(p => p.typeDir))];
165
- for (const typeDir of typeDirs) {
166
- const filePath = join(dir, typeDir, 'index.md');
167
- if (!existsSync(filePath)) {
168
- writeFileSync(filePath, renderTypeIndexPage(typeDir));
169
- created.push(filePath);
170
- }
356
+ // Existing projects commonly already use the IDs we seed (SPEC-001, WORK-001,
357
+ // ADR-001, v0.1.0). Skip the example silently instead of crashing — the
358
+ // user has their own content, they don't need placeholders.
359
+ if (idExists(dir, ex.id))
360
+ continue;
361
+ const result = runCreate({ dir, type: ex.type, id: ex.id, title: ex.title, attrs: ex.attrs });
362
+ created.push(result.file);
171
363
  }
172
- // Create index.md
173
- const indexFile = join(dir, 'index.md');
174
- if (!existsSync(indexFile)) {
175
- writeFileSync(indexFile, `# Project Plan
176
-
177
- This directory contains project planning content.
178
-
179
- ## Structure
180
-
181
- - [Specifications](specs/) — What to build
182
- - [Work Items](work/) — How to build it
183
- - [Decisions](decisions/) — Why it's built this way
184
- - [Milestones](milestones/) — Named release targets
185
-
186
- ## Quick Start
187
-
188
- \`\`\`bash
189
- refrakt plan next # Find next work item
190
- refrakt plan status # Project overview
191
- refrakt plan create work --id WORK-002 --title "My task"
192
- \`\`\`
193
- `);
194
- created.push(indexFile);
195
- }
196
- // Create INSTRUCTIONS.md
197
364
  const instructionsFile = join(dir, 'INSTRUCTIONS.md');
198
365
  if (!existsSync(instructionsFile)) {
199
366
  writeFileSync(instructionsFile, INSTRUCTIONS_CONTENT);
200
367
  created.push(instructionsFile);
201
368
  }
202
- // Update agent instruction files
369
+ // --- 2. Append plan summary to agent instruction files ------------------
203
370
  const agentFilesUpdated = [];
204
- if (agent === 'none') {
205
- // Skip user explicitly opted out
206
- }
207
- else if (agent) {
208
- // Specific agent requested
209
- const relPath = AGENT_FILES[agent];
210
- if (relPath && appendPointer(projectRoot, relPath)) {
211
- agentFilesUpdated.push(relPath);
212
- }
213
- }
214
- else {
215
- // Auto-detect: append to all existing agent files, fallback to CLAUDE.md
216
- const existing = detectAgentFiles(projectRoot);
217
- if (existing.length > 0) {
218
- for (const relPath of existing) {
219
- if (appendPointer(projectRoot, relPath)) {
220
- agentFilesUpdated.push(relPath);
221
- }
371
+ if (agent !== 'none') {
372
+ const update = (relPath) => {
373
+ if (appendPlanSummary(projectRoot, relPath)) {
374
+ agentFilesUpdated.push(relPath);
222
375
  }
376
+ };
377
+ if (agent) {
378
+ const relPath = AGENT_FILES[agent];
379
+ if (relPath)
380
+ update(relPath);
223
381
  }
224
382
  else {
225
- if (appendPointer(projectRoot, AGENT_FILES.claude)) {
226
- agentFilesUpdated.push(AGENT_FILES.claude);
227
- }
383
+ const existing = detectAgentFiles(projectRoot);
384
+ for (const relPath of existing)
385
+ update(relPath);
228
386
  }
229
387
  }
230
- return { dir, created, agentFilesUpdated };
388
+ // --- 3. Host package.json wiring ---------------------------------------
389
+ const installRootInfo = findInstallRoot(projectRoot);
390
+ const packageManager = installRootInfo ? detectPackageManager(installRootInfo.rootDir) : null;
391
+ let packageJsonUpdated = false;
392
+ if (!noPackageJson && installRootInfo) {
393
+ packageJsonUpdated = updateHostPackageJson(installRootInfo.packageJsonPath, versions);
394
+ }
395
+ // --- 4. Claude SessionStart hook (gated) -------------------------------
396
+ let hookWritten = false;
397
+ const shouldWriteHook = (() => {
398
+ if (noHooks)
399
+ return false;
400
+ if (agent === 'none')
401
+ return false;
402
+ if (agent === 'claude')
403
+ return true;
404
+ if (agent)
405
+ return false; // explicit non-claude agent
406
+ // auto-detect: write if CLAUDE.md exists or was just created
407
+ return existsSync(join(projectRoot, AGENT_FILES.claude));
408
+ })();
409
+ if (shouldWriteHook) {
410
+ hookWritten = writeClaudeHook(projectRoot);
411
+ }
412
+ // --- 5. ./plan.sh wrapper script ---------------------------------------
413
+ let wrapperWritten = false;
414
+ if (!noWrapper && agent !== 'none') {
415
+ wrapperWritten = writeWrapperScript(projectRoot);
416
+ }
417
+ return {
418
+ dir,
419
+ created,
420
+ agentFilesUpdated,
421
+ packageJsonUpdated,
422
+ hookWritten,
423
+ wrapperWritten,
424
+ installRoot: installRootInfo ? installRootInfo.rootDir : null,
425
+ packageManager,
426
+ };
231
427
  }
428
+ // Re-export for consumers that want to introspect the install command logic.
429
+ export { installCommand };
232
430
  //# sourceMappingURL=init.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ export declare const EXIT_SUCCESS = 0;
2
+ export declare const EXIT_ERRORS = 1;
3
+ export declare const EXIT_INVALID_ARGS = 2;
4
+ export interface MigrateFilenamesOptions {
5
+ dir: string;
6
+ apply?: boolean;
7
+ useGit?: boolean;
8
+ }
9
+ export interface PlannedRename {
10
+ id: string;
11
+ from: string;
12
+ to: string;
13
+ }
14
+ export interface MigrateFilenamesError {
15
+ file: string;
16
+ reason: string;
17
+ }
18
+ export interface MigrateFilenamesResult {
19
+ mode: 'dry-run' | 'apply';
20
+ scanned: number;
21
+ planned: PlannedRename[];
22
+ applied: PlannedRename[];
23
+ skipped: {
24
+ milestones: number;
25
+ alreadyCorrect: number;
26
+ };
27
+ errors: MigrateFilenamesError[];
28
+ exitCode: number;
29
+ }
30
+ /**
31
+ * Scan a plan directory, compute target filenames of the form
32
+ * `{ID}-{slug}.md` for every auto-ID entity, and either preview the
33
+ * renames (dry-run, default) or apply them.
34
+ *
35
+ * Milestones are skipped — they use semver names, not the numeric ID
36
+ * scheme. Files whose current name already matches the target are
37
+ * counted as `alreadyCorrect` and not touched.
38
+ */
39
+ export declare function runMigrateFilenames(options: MigrateFilenamesOptions): MigrateFilenamesResult;
40
+ //# sourceMappingURL=migrate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrate.d.ts","sourceRoot":"","sources":["../../src/commands/migrate.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,YAAY,IAAI,CAAC;AAC9B,eAAO,MAAM,WAAW,IAAI,CAAC;AAC7B,eAAO,MAAM,iBAAiB,IAAI,CAAC;AAKnC,MAAM,WAAW,uBAAuB;IACvC,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;CACX;AAED,MAAM,WAAW,qBAAqB;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,sBAAsB;IACtC,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,aAAa,EAAE,CAAC;IACzB,OAAO,EAAE,aAAa,EAAE,CAAC;IACzB,OAAO,EAAE;QACR,UAAU,EAAE,MAAM,CAAC;QACnB,cAAc,EAAE,MAAM,CAAC;KACvB,CAAC;IACF,MAAM,EAAE,qBAAqB,EAAE,CAAC;IAChC,QAAQ,EAAE,MAAM,CAAC;CACjB;AAuBD;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,uBAAuB,GAAG,sBAAsB,CAkF5F"}