@erclx/canon 5.44.0 → 5.46.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 (253) hide show
  1. package/README.md +1 -1
  2. package/claude/.claude-plugin/plugin.json +1 -1
  3. package/claude/skills/api-design/REQUIREMENT.md +15 -31
  4. package/claude/skills/auto-ship/REQUIREMENT.md +14 -25
  5. package/claude/skills/backlog-triage/REQUIREMENT.md +12 -23
  6. package/claude/skills/build-in-slices/REQUIREMENT.md +15 -25
  7. package/claude/skills/canon-cli/REQUIREMENT.md +15 -27
  8. package/claude/skills/canon-cli/SKILL.md +0 -1
  9. package/claude/skills/canon-feedback/REQUIREMENT.md +10 -18
  10. package/claude/skills/canon-feedback-triage/REQUIREMENT.md +10 -15
  11. package/claude/skills/canvas-board/REQUIREMENT.md +14 -28
  12. package/claude/skills/ci-workflow/REQUIREMENT.md +12 -21
  13. package/claude/skills/code-craft/REQUIREMENT.md +14 -28
  14. package/claude/skills/codebase-layout/REQUIREMENT.md +14 -31
  15. package/claude/skills/context-fold/REQUIREMENT.md +15 -39
  16. package/claude/skills/context-fold/references/context.md +3 -3
  17. package/claude/skills/create-rule/REQUIREMENT.md +10 -24
  18. package/claude/skills/create-rule/SKILL.md +3 -0
  19. package/claude/skills/create-skill/REQUIREMENT.md +10 -21
  20. package/claude/skills/decision-escalate/REQUIREMENT.md +12 -24
  21. package/claude/skills/deploy-app/REQUIREMENT.md +12 -22
  22. package/claude/skills/deprecation-migration/REQUIREMENT.md +14 -42
  23. package/claude/skills/design-identity/REQUIREMENT.md +14 -20
  24. package/claude/skills/design-taste/REQUIREMENT.md +16 -57
  25. package/claude/skills/docs-sync/REQUIREMENT.md +14 -23
  26. package/claude/skills/document-health/REQUIREMENT.md +15 -29
  27. package/claude/skills/document-health/SKILL.md +2 -2
  28. package/claude/skills/document-repair/REQUIREMENT.md +32 -0
  29. package/claude/skills/document-repair/SKILL.md +76 -0
  30. package/claude/skills/document-repair/references/batches.md +44 -0
  31. package/claude/skills/draft-and-pick/REQUIREMENT.md +4 -3
  32. package/claude/skills/draft-doc/REQUIREMENT.md +4 -3
  33. package/claude/skills/draft-figure/REQUIREMENT.md +4 -3
  34. package/claude/skills/draft-identity/REQUIREMENT.md +4 -3
  35. package/claude/skills/draft-ready/REQUIREMENT.md +4 -3
  36. package/claude/skills/draft-screencast/REQUIREMENT.md +4 -3
  37. package/claude/skills/draft-slides/REQUIREMENT.md +4 -3
  38. package/claude/skills/draw-figure/REQUIREMENT.md +15 -39
  39. package/claude/skills/git-branch/REQUIREMENT.md +12 -26
  40. package/claude/skills/git-commit/REQUIREMENT.md +11 -15
  41. package/claude/skills/git-followup/REQUIREMENT.md +11 -22
  42. package/claude/skills/git-issue/REQUIREMENT.md +9 -15
  43. package/claude/skills/git-pr/REQUIREMENT.md +13 -32
  44. package/claude/skills/git-pr/SKILL.md +10 -2
  45. package/claude/skills/git-pr/references/closing-issues.md +47 -0
  46. package/claude/skills/git-pr/references/pr.md +4 -0
  47. package/claude/skills/git-ship/REQUIREMENT.md +13 -26
  48. package/claude/skills/git-split/REQUIREMENT.md +10 -17
  49. package/claude/skills/git-stage/REQUIREMENT.md +12 -18
  50. package/claude/skills/git-worktree/REQUIREMENT.md +15 -19
  51. package/claude/skills/make-deck/REQUIREMENT.md +13 -21
  52. package/claude/skills/markdown-craft/REQUIREMENT.md +9 -3
  53. package/claude/skills/pick-by-eye/REQUIREMENT.md +17 -67
  54. package/claude/skills/plan-feature/REQUIREMENT.md +15 -24
  55. package/claude/skills/plan-groundwork/REQUIREMENT.md +12 -28
  56. package/claude/skills/plan-groundwork/SKILL.md +5 -2
  57. package/claude/skills/plan-groundwork/references/output.md +47 -1
  58. package/claude/skills/plan-intake/REQUIREMENT.md +11 -26
  59. package/claude/skills/plan-intake/references/intake.md +2 -2
  60. package/claude/skills/plan-intake-answer/REQUIREMENT.md +14 -29
  61. package/claude/skills/plan-intake-answer/SKILL.md +7 -1
  62. package/claude/skills/plan-ready/REQUIREMENT.md +17 -36
  63. package/claude/skills/pr-evidence/REQUIREMENT.md +11 -17
  64. package/claude/skills/read-frames/REQUIREMENT.md +3 -8
  65. package/claude/skills/record-screencast/REQUIREMENT.md +14 -17
  66. package/claude/skills/review-address/REQUIREMENT.md +14 -38
  67. package/claude/skills/review-craft/REQUIREMENT.md +14 -32
  68. package/claude/skills/review-pr/REQUIREMENT.md +15 -34
  69. package/claude/skills/review-ui/REQUIREMENT.md +14 -39
  70. package/claude/skills/role-orchestrator/REQUIREMENT.md +16 -99
  71. package/claude/skills/role-orchestrator/references/orchestrator-refill.md +5 -0
  72. package/claude/skills/role-orchestrator/references/orchestrator-review-dispatch.md +9 -0
  73. package/claude/skills/role-planner/REQUIREMENT.md +15 -73
  74. package/claude/skills/role-reviewer/REQUIREMENT.md +15 -65
  75. package/claude/skills/role-reviewer/SKILL.md +5 -1
  76. package/claude/skills/role-worker/REQUIREMENT.md +13 -41
  77. package/claude/skills/role-worker/SKILL.md +2 -0
  78. package/claude/skills/script-screencast/REQUIREMENT.md +10 -16
  79. package/claude/skills/search-craft/REQUIREMENT.md +12 -36
  80. package/claude/skills/search-craft/SKILL.md +1 -1
  81. package/claude/skills/search-craft/references/adopted.md +2 -2
  82. package/claude/skills/session-compact/REQUIREMENT.md +13 -23
  83. package/claude/skills/session-map/REQUIREMENT.md +13 -29
  84. package/claude/skills/session-relay/REQUIREMENT.md +14 -58
  85. package/claude/skills/session-relay/SKILL.md +6 -0
  86. package/claude/skills/session-resume/REQUIREMENT.md +13 -27
  87. package/claude/skills/session-worktree/REQUIREMENT.md +14 -43
  88. package/claude/skills/systematic-debugging/REQUIREMENT.md +13 -34
  89. package/claude/skills/target-check/REQUIREMENT.md +16 -23
  90. package/claude/skills/target-setup/REQUIREMENT.md +11 -34
  91. package/claude/skills/target-setup/SKILL.md +2 -2
  92. package/claude/skills/target-setup/references/detect.md +0 -1
  93. package/claude/skills/target-setup/references/verify.md +2 -2
  94. package/claude/skills/task-board/REQUIREMENT.md +13 -22
  95. package/claude/skills/task-board/SKILL.md +7 -0
  96. package/claude/skills/task-board/references/tasks.md +1 -1
  97. package/claude/skills/task-complete/REQUIREMENT.md +11 -24
  98. package/claude/skills/task-complete/references/archive.md +1 -0
  99. package/claude/skills/teach-workspace/REQUIREMENT.md +14 -45
  100. package/claude/skills/teach-workspace/references/promotion.md +5 -5
  101. package/claude/skills/test-craft/REQUIREMENT.md +15 -46
  102. package/claude/skills/test-first/REQUIREMENT.md +14 -20
  103. package/claude/skills/ui-checklist/REQUIREMENT.md +14 -29
  104. package/claude/skills/ux-audit/REQUIREMENT.md +3 -7
  105. package/claude/skills/ux-measure/REQUIREMENT.md +14 -28
  106. package/claude/skills/video-craft/REQUIREMENT.md +14 -27
  107. package/claude/skills/write-doc/REQUIREMENT.md +14 -24
  108. package/claude/skills/write-human/REQUIREMENT.md +15 -27
  109. package/claude/skills/youtube-transcripts/REQUIREMENT.md +9 -15
  110. package/docs/agents/context-audit.md +19 -12
  111. package/docs/agents/install-and-sync.md +2 -2
  112. package/docs/agents/markdown-audit.md +15 -10
  113. package/docs/agents/output-shape.md +1 -2
  114. package/docs/target/migrations.md +18 -0
  115. package/docs/target/projects.md +3 -2
  116. package/docs/target/scenarios.md +4 -1
  117. package/docs/workflow/skill-map-on-request.md +1 -1
  118. package/docs/workflow/skill-map.md +6 -5
  119. package/governance/detect.toml +4 -0
  120. package/governance/ledger/lang/go.md +61 -0
  121. package/governance/ledger/lang/php.md +50 -0
  122. package/governance/ledger/lang/python.md +68 -0
  123. package/governance/ledger/lang/typescript.md +64 -0
  124. package/governance/ledger/lib/database.md +65 -0
  125. package/governance/ledger/lib/e2e-reliability.md +57 -0
  126. package/governance/ledger/lib/pydantic.md +61 -0
  127. package/governance/ledger/lib/security-server.md +62 -0
  128. package/governance/ledger/lib/security-web.md +51 -0
  129. package/governance/ledger/lib/tanstack-query.md +57 -0
  130. package/governance/ledger/lib/test-scope.md +43 -0
  131. package/governance/ledger/lib/testing-go.md +57 -0
  132. package/governance/ledger/lib/testing-php.md +51 -0
  133. package/governance/ledger/lib/testing-py.md +67 -0
  134. package/governance/ledger/lib/testing-ts.md +63 -0
  135. package/governance/ledger/lib/zod.md +47 -0
  136. package/governance/ledger/tooling/ci-workflow.md +33 -0
  137. package/governance/ledger/tooling/code-comments.md +48 -0
  138. package/governance/ledger/tooling/config-comments.md +27 -0
  139. package/governance/ledger/tooling/dependencies.md +38 -0
  140. package/governance/ledger/ui/a11y.md +55 -0
  141. package/governance/ledger/ui/copy.md +49 -0
  142. package/governance/ledger/ui/design-reference.md +42 -0
  143. package/governance/ledger/ui/design-taste.md +19 -0
  144. package/governance/ledger/ui/forms.md +71 -0
  145. package/governance/ledger/ui/interface-casing.md +47 -0
  146. package/governance/ledger/ui/keyboard.md +68 -0
  147. package/governance/ledger/ui/link-behavior.md +29 -0
  148. package/governance/ledger/ui/motion.md +33 -0
  149. package/governance/ledger/ui/surface-capture.md +69 -0
  150. package/governance/ledger/ui/ux-completeness.md +79 -0
  151. package/governance/renames.toml +0 -2
  152. package/governance/rules/claude/output.md +5 -1
  153. package/governance/rules/code/routing.md +5 -1
  154. package/governance/rules/lang/go.md +7 -16
  155. package/governance/rules/lang/php.md +3 -3
  156. package/governance/rules/lang/python.md +9 -18
  157. package/governance/rules/lang/typescript.md +9 -19
  158. package/governance/rules/lib/database.md +5 -5
  159. package/governance/rules/lib/e2e-reliability.md +4 -6
  160. package/governance/rules/lib/pydantic.md +14 -16
  161. package/governance/rules/lib/security-server.md +4 -4
  162. package/governance/rules/lib/security-web.md +6 -10
  163. package/governance/rules/lib/tanstack-query.md +10 -12
  164. package/governance/rules/lib/test-scope.md +4 -4
  165. package/governance/rules/lib/testing-go.md +1 -2
  166. package/governance/rules/lib/testing-php.md +4 -5
  167. package/governance/rules/lib/testing-py.md +11 -19
  168. package/governance/rules/lib/testing-ts.md +7 -16
  169. package/governance/rules/lib/zod.md +6 -8
  170. package/governance/rules/tooling/code-comments.md +2 -4
  171. package/governance/rules/tooling/config-comments.md +1 -4
  172. package/governance/rules/tooling/dependencies.md +1 -1
  173. package/governance/rules/ui/a11y.md +16 -45
  174. package/governance/rules/ui/copy.md +6 -9
  175. package/governance/rules/ui/forms.md +13 -19
  176. package/governance/rules/ui/interface-casing.md +5 -7
  177. package/governance/rules/ui/keyboard.md +38 -0
  178. package/governance/rules/ui/link-behavior.md +3 -3
  179. package/governance/rules/ui/motion.md +3 -3
  180. package/governance/rules/ui/surface-capture.md +15 -27
  181. package/governance/rules/ui/ux-completeness.md +16 -39
  182. package/governance/stacks/base.toml +0 -1
  183. package/package.json +1 -1
  184. package/scripts/core/install-check.sh +1 -1
  185. package/src/claude/cases/workflow.ts +12 -0
  186. package/src/cli/help.ts +0 -1
  187. package/src/cli.ts +0 -2
  188. package/src/commands/context.ts +57 -3
  189. package/src/commands/gov.ts +4 -0
  190. package/src/commands/init.ts +2 -2
  191. package/src/commands/labels.ts +83 -3
  192. package/src/commands/markdown.ts +188 -21
  193. package/src/commands/sessions.ts +36 -3
  194. package/src/commands/tasks.ts +180 -0
  195. package/src/commands/tooling.ts +18 -5
  196. package/src/commands/worktrees.ts +2 -0
  197. package/src/context/coverage.ts +210 -0
  198. package/src/context/gate.ts +12 -3
  199. package/src/design/components.ts +1 -1
  200. package/src/gate/stages.ts +1 -1
  201. package/src/gov/audit.ts +22 -2
  202. package/src/init/plan.ts +1 -8
  203. package/src/init/steps.ts +44 -7
  204. package/src/intake/items.ts +14 -0
  205. package/src/inventory/subjects.ts +1 -1
  206. package/src/labels/closing.ts +46 -0
  207. package/src/markdown/gated.ts +250 -0
  208. package/src/markdown/scope.ts +119 -2
  209. package/src/migrate/rename.ts +6 -0
  210. package/src/migrate/scratch-evidence.ts +12 -4
  211. package/src/records/backup.ts +3 -3
  212. package/src/records/validate.ts +3 -3
  213. package/src/roots/record.ts +17 -8
  214. package/src/sessions/claim.ts +7 -0
  215. package/src/sessions/live.ts +53 -6
  216. package/src/sessions/registry.ts +11 -0
  217. package/src/sessions/resolve.ts +32 -5
  218. package/src/tasks/closes.ts +136 -0
  219. package/src/tasks/record.ts +1 -1
  220. package/src/tooling/inject.ts +26 -7
  221. package/src/tooling/package.ts +32 -0
  222. package/src/tooling/read.ts +46 -3
  223. package/src/tooling/scan.ts +8 -2
  224. package/src/worktrees/reclaim.ts +16 -1
  225. package/tooling/astro/reference.md +64 -93
  226. package/tooling/base/configs/.github/workflows/phase-label-gate.yml +1 -1
  227. package/tooling/base/configs/scripts/verify.ts +2 -2
  228. package/tooling/base/reference.md +1 -9
  229. package/tooling/base/seeds/canon/context/{ci.md → development/ci.md} +1 -1
  230. package/tooling/base/seeds/canon/context/development/index.md +11 -0
  231. package/tooling/base/seeds/canon/context/{development.md → development/setup.md} +8 -12
  232. package/tooling/base/seeds/canon/context/index.md +1 -2
  233. package/tooling/claude/manifest.toml +1 -5
  234. package/tooling/claude/reference.md +36 -59
  235. package/tooling/claude/seeds/.claude/hooks/board-validate.sh +1 -1
  236. package/tooling/claude/seeds/.claude/hooks/index-reminder.sh +2 -7
  237. package/tooling/claude/seeds/.claude/hooks/pr-create-log.sh +2 -7
  238. package/tooling/claude/seeds/.claude/hooks/scratch-guard.sh +3 -10
  239. package/tooling/claude/seeds/.claude/hooks/search-reminder.sh +2 -7
  240. package/tooling/claude/seeds/.claude/hooks/standards-audit.sh +2 -4
  241. package/tooling/claude/seeds/CLAUDE.md +2 -2
  242. package/tooling/nextjs/reference.md +0 -6
  243. package/tooling/php/reference.md +0 -4
  244. package/tooling/web/configs/.github/workflows/verify.yml +28 -0
  245. package/tooling/web/configs/.oxlintrc.json +7 -0
  246. package/tooling/web/configs/e2e/capture-types.ts +35 -0
  247. package/tooling/web/configs/e2e/screenshot.ts +23 -72
  248. package/tooling/web/manifest.toml +1 -1
  249. package/tooling/web/reference.md +77 -124
  250. package/tooling/web/seeds/e2e/capture/cases.ts +47 -0
  251. package/governance/rules/canon/task-scope.md +0 -12
  252. package/src/commands/wiki.ts +0 -100
  253. package/src/wiki/init.ts +0 -85
@@ -0,0 +1,47 @@
1
+ import type { CaptureCase, CaptureSection } from '../capture-types'
2
+
3
+ /** Where a case flagged `evidence: true` writes its committed frames. */
4
+ export const EVIDENCE_ROOT = 'e2e/evidence'
5
+
6
+ /**
7
+ * The landing page's own beats, top to bottom. Every entry is a section a
8
+ * reviewer reads on its own, so a diff lands on the part that moved rather
9
+ * than on one image of the whole page.
10
+ */
11
+ const HOME_SECTIONS: CaptureSection[] = [
12
+ { name: 'top', selector: '#top' },
13
+ { name: 'proof', selector: '#proof' },
14
+ { name: 'ask', selector: '#ask' },
15
+ { name: 'rules', selector: '#rules' },
16
+ { name: 'skills', selector: '#skills' },
17
+ { name: 'plan', selector: '#plan' },
18
+ { name: 'dispatch', selector: '#dispatch' },
19
+ { name: 'workers', selector: '#workers' },
20
+ { name: 'gate', selector: '#gate' },
21
+ { name: 'evidence', selector: '#evidence' },
22
+ { name: 'loop', selector: '#loop' },
23
+ { name: 'merge', selector: '#merge' },
24
+ { name: 'provenance', selector: '#provenance' },
25
+ { name: 'start', selector: '#start' },
26
+ { name: 'field', selector: '#field' },
27
+ { name: 'close', selector: '#close' },
28
+ ]
29
+
30
+ export const CASES: CaptureCase[] = [
31
+ {
32
+ section: 'home',
33
+ theme: 'default',
34
+ route: '/',
35
+ evidence: true,
36
+ mask: ['.version'],
37
+ sections: HOME_SECTIONS,
38
+ },
39
+ {
40
+ section: 'home',
41
+ theme: 'dark',
42
+ route: '/',
43
+ mask: ['.version'],
44
+ sections: HOME_SECTIONS,
45
+ setup: (page) => page.emulateMedia({ colorScheme: 'dark' }),
46
+ },
47
+ ]
@@ -1,12 +0,0 @@
1
- ---
2
- description: Scope, size, and link a task file correctly
3
- ---
4
-
5
- # Tasks standards
6
-
7
- ## Task files
8
-
9
- - Only create a task for work that spans multiple sessions or has real dependencies. Handle small edits immediately without a task entry.
10
- - Do not add tasks retroactively for work already completed. Completed work is visible in git.
11
- - Write a plan in `.canon/plans/` when a task needs execution detail beyond its own file, and link it from the task's intro paragraph.
12
- - Write that plan in the same session as the task, since the executing session would otherwise re-derive the reasoning behind it.
@@ -1,100 +0,0 @@
1
- import { resolve } from 'node:path'
2
- import type { Command } from 'commander'
3
- import { PROJECT_ROOT } from '@/roots/project'
4
- import {
5
- intro,
6
- logAdd,
7
- logError,
8
- logInfo,
9
- logStep,
10
- logWarn,
11
- outro,
12
- palette,
13
- select,
14
- } from '@/cli/ui'
15
- import {
16
- applyWikiInit,
17
- isWikiTarget,
18
- LEGACY_WIKI_DIR_REL,
19
- planWikiInit,
20
- WIKI_DIR_REL,
21
- WIKI_INDEX_REL,
22
- } from '@/wiki/init'
23
-
24
- export function register(program: Command): void {
25
- const wiki = program
26
- .command('wiki')
27
- .description('Wiki commands (init)')
28
- .helpOption('-h, --help', 'Show this help message')
29
-
30
- wiki
31
- .command('init')
32
- .description('Scaffold .claude/wiki/ with a stub index.md')
33
- .argument('[target]', 'Target directory', '.')
34
- .helpOption('-h, --help', 'Show this help message')
35
- .action(async (target: string) => {
36
- process.exitCode = await runInit(target)
37
- })
38
- }
39
-
40
- async function runInit(target: string): Promise<number> {
41
- intro('canon wiki')
42
-
43
- const resolved = resolve(target)
44
-
45
- if (!isWikiTarget(resolved)) {
46
- logError(`Target directory not found: ${target}`)
47
- outro()
48
- return 1
49
- }
50
-
51
- if (resolved === PROJECT_ROOT) {
52
- logError(
53
- 'Cannot run against toolkit root. Files here are the source of truth.',
54
- )
55
- outro()
56
- return 1
57
- }
58
-
59
- const plan = planWikiInit(resolved)
60
- const { GREEN, NC } = palette(process.stderr)
61
-
62
- logStep(`Scanning ${WIKI_DIR_REL}`)
63
- if (plan.changes.includes('dir')) logAdd(WIKI_DIR_REL)
64
- if (plan.hasIndex) logInfo(WIKI_INDEX_REL)
65
- else logAdd(WIKI_INDEX_REL)
66
-
67
- if (plan.hasLegacyWiki) {
68
- logWarn(`${LEGACY_WIKI_DIR_REL} found at the target root, not migrated`)
69
- }
70
-
71
- const count = plan.changes.length
72
- if (count === 0) {
73
- outro()
74
- process.stderr.write(`${GREEN}✓ Wiki already initialized${NC}\n`)
75
- return 0
76
- }
77
-
78
- const shouldApply = await select({
79
- message: `Apply ${count} change(s)?`,
80
- options: [
81
- { value: true, label: 'Apply all' },
82
- { value: false, label: 'Cancel' },
83
- ],
84
- nonInteractiveDefault: true,
85
- })
86
-
87
- if (!shouldApply) {
88
- logWarn('Cancelled')
89
- outro()
90
- return 0
91
- }
92
-
93
- logStep('Applying changes')
94
- await applyWikiInit(resolved, plan)
95
- if (plan.changes.includes('index')) logAdd(WIKI_INDEX_REL)
96
-
97
- outro()
98
- process.stderr.write(`${GREEN}✓ Wiki ready${NC}\n`)
99
- return 0
100
- }
package/src/wiki/init.ts DELETED
@@ -1,85 +0,0 @@
1
- import { existsSync, statSync } from 'node:fs'
2
- import { mkdir, writeFile } from 'node:fs/promises'
3
- import { join } from 'node:path'
4
-
5
- const WIKI_DIR = join('.claude', 'wiki')
6
- const LEGACY_WIKI_DIR = 'wiki'
7
- const INDEX_FILE = 'index.md'
8
-
9
- export const WIKI_DIR_REL = `${WIKI_DIR}/`
10
- export const WIKI_INDEX_REL = join(WIKI_DIR, INDEX_FILE)
11
- export const LEGACY_WIKI_DIR_REL = `${LEGACY_WIKI_DIR}/`
12
-
13
- const INDEX_SEED = `---
14
- title: Wiki
15
- subtitle: Reference pages for tools, workflows, and concepts
16
- ---
17
-
18
- # Wiki
19
-
20
- Reference pages for tools, workflows, and concepts.
21
- `
22
-
23
- export type WikiChange = 'dir' | 'index'
24
-
25
- export interface WikiPlan {
26
- readonly changes: readonly WikiChange[]
27
- readonly hasIndex: boolean
28
- readonly hasLegacyWiki: boolean
29
- }
30
-
31
- export function wikiDir(target: string): string {
32
- return join(target, WIKI_DIR)
33
- }
34
-
35
- /**
36
- * A target scaffolded before the wiki moved under `.claude/` keeps its pages at
37
- * the root. The verb reports that folder rather than moving it, because a move
38
- * is a migration and the `migration-*` skills own those.
39
- */
40
- export function legacyWikiDir(target: string): string {
41
- return join(target, LEGACY_WIKI_DIR)
42
- }
43
-
44
- /**
45
- * Stands in for the `cd "$target"` in the bash `guard_root`, which validated
46
- * the target existed as a side effect. Without it a typo'd path scaffolds a
47
- * whole new tree, since the apply step creates parents.
48
- */
49
- export function isWikiTarget(target: string): boolean {
50
- try {
51
- return statSync(target).isDirectory()
52
- } catch {
53
- return false
54
- }
55
- }
56
-
57
- /**
58
- * Reports what a scaffold would create without writing. The directory and the
59
- * index are tracked separately because a target can carry one without the
60
- * other, and only the index has content worth preserving.
61
- */
62
- export function planWikiInit(target: string): WikiPlan {
63
- const dir = wikiDir(target)
64
- const index = join(dir, INDEX_FILE)
65
- const changes: WikiChange[] = []
66
-
67
- if (!existsSync(dir)) changes.push('dir')
68
-
69
- const hasIndex = existsSync(index)
70
- if (!hasIndex) changes.push('index')
71
-
72
- return { changes, hasIndex, hasLegacyWiki: existsSync(legacyWikiDir(target)) }
73
- }
74
-
75
- export async function applyWikiInit(
76
- target: string,
77
- plan: WikiPlan,
78
- ): Promise<void> {
79
- const dir = wikiDir(target)
80
- await mkdir(dir, { recursive: true })
81
-
82
- if (plan.changes.includes('index')) {
83
- await writeFile(join(dir, INDEX_FILE), INDEX_SEED)
84
- }
85
- }