@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.
- package/README.md +1 -1
- package/claude/.claude-plugin/plugin.json +1 -1
- package/claude/skills/api-design/REQUIREMENT.md +15 -31
- package/claude/skills/auto-ship/REQUIREMENT.md +14 -25
- package/claude/skills/backlog-triage/REQUIREMENT.md +12 -23
- package/claude/skills/build-in-slices/REQUIREMENT.md +15 -25
- package/claude/skills/canon-cli/REQUIREMENT.md +15 -27
- package/claude/skills/canon-cli/SKILL.md +0 -1
- package/claude/skills/canon-feedback/REQUIREMENT.md +10 -18
- package/claude/skills/canon-feedback-triage/REQUIREMENT.md +10 -15
- package/claude/skills/canvas-board/REQUIREMENT.md +14 -28
- package/claude/skills/ci-workflow/REQUIREMENT.md +12 -21
- package/claude/skills/code-craft/REQUIREMENT.md +14 -28
- package/claude/skills/codebase-layout/REQUIREMENT.md +14 -31
- package/claude/skills/context-fold/REQUIREMENT.md +15 -39
- package/claude/skills/context-fold/references/context.md +3 -3
- package/claude/skills/create-rule/REQUIREMENT.md +10 -24
- package/claude/skills/create-rule/SKILL.md +3 -0
- package/claude/skills/create-skill/REQUIREMENT.md +10 -21
- package/claude/skills/decision-escalate/REQUIREMENT.md +12 -24
- package/claude/skills/deploy-app/REQUIREMENT.md +12 -22
- package/claude/skills/deprecation-migration/REQUIREMENT.md +14 -42
- package/claude/skills/design-identity/REQUIREMENT.md +14 -20
- package/claude/skills/design-taste/REQUIREMENT.md +16 -57
- package/claude/skills/docs-sync/REQUIREMENT.md +14 -23
- package/claude/skills/document-health/REQUIREMENT.md +15 -29
- package/claude/skills/document-health/SKILL.md +2 -2
- package/claude/skills/document-repair/REQUIREMENT.md +32 -0
- package/claude/skills/document-repair/SKILL.md +76 -0
- package/claude/skills/document-repair/references/batches.md +44 -0
- package/claude/skills/draft-and-pick/REQUIREMENT.md +4 -3
- package/claude/skills/draft-doc/REQUIREMENT.md +4 -3
- package/claude/skills/draft-figure/REQUIREMENT.md +4 -3
- package/claude/skills/draft-identity/REQUIREMENT.md +4 -3
- package/claude/skills/draft-ready/REQUIREMENT.md +4 -3
- package/claude/skills/draft-screencast/REQUIREMENT.md +4 -3
- package/claude/skills/draft-slides/REQUIREMENT.md +4 -3
- package/claude/skills/draw-figure/REQUIREMENT.md +15 -39
- package/claude/skills/git-branch/REQUIREMENT.md +12 -26
- package/claude/skills/git-commit/REQUIREMENT.md +11 -15
- package/claude/skills/git-followup/REQUIREMENT.md +11 -22
- package/claude/skills/git-issue/REQUIREMENT.md +9 -15
- package/claude/skills/git-pr/REQUIREMENT.md +13 -32
- package/claude/skills/git-pr/SKILL.md +10 -2
- package/claude/skills/git-pr/references/closing-issues.md +47 -0
- package/claude/skills/git-pr/references/pr.md +4 -0
- package/claude/skills/git-ship/REQUIREMENT.md +13 -26
- package/claude/skills/git-split/REQUIREMENT.md +10 -17
- package/claude/skills/git-stage/REQUIREMENT.md +12 -18
- package/claude/skills/git-worktree/REQUIREMENT.md +15 -19
- package/claude/skills/make-deck/REQUIREMENT.md +13 -21
- package/claude/skills/markdown-craft/REQUIREMENT.md +9 -3
- package/claude/skills/pick-by-eye/REQUIREMENT.md +17 -67
- package/claude/skills/plan-feature/REQUIREMENT.md +15 -24
- package/claude/skills/plan-groundwork/REQUIREMENT.md +12 -28
- package/claude/skills/plan-groundwork/SKILL.md +5 -2
- package/claude/skills/plan-groundwork/references/output.md +47 -1
- package/claude/skills/plan-intake/REQUIREMENT.md +11 -26
- package/claude/skills/plan-intake/references/intake.md +2 -2
- package/claude/skills/plan-intake-answer/REQUIREMENT.md +14 -29
- package/claude/skills/plan-intake-answer/SKILL.md +7 -1
- package/claude/skills/plan-ready/REQUIREMENT.md +17 -36
- package/claude/skills/pr-evidence/REQUIREMENT.md +11 -17
- package/claude/skills/read-frames/REQUIREMENT.md +3 -8
- package/claude/skills/record-screencast/REQUIREMENT.md +14 -17
- package/claude/skills/review-address/REQUIREMENT.md +14 -38
- package/claude/skills/review-craft/REQUIREMENT.md +14 -32
- package/claude/skills/review-pr/REQUIREMENT.md +15 -34
- package/claude/skills/review-ui/REQUIREMENT.md +14 -39
- package/claude/skills/role-orchestrator/REQUIREMENT.md +16 -99
- package/claude/skills/role-orchestrator/references/orchestrator-refill.md +5 -0
- package/claude/skills/role-orchestrator/references/orchestrator-review-dispatch.md +9 -0
- package/claude/skills/role-planner/REQUIREMENT.md +15 -73
- package/claude/skills/role-reviewer/REQUIREMENT.md +15 -65
- package/claude/skills/role-reviewer/SKILL.md +5 -1
- package/claude/skills/role-worker/REQUIREMENT.md +13 -41
- package/claude/skills/role-worker/SKILL.md +2 -0
- package/claude/skills/script-screencast/REQUIREMENT.md +10 -16
- package/claude/skills/search-craft/REQUIREMENT.md +12 -36
- package/claude/skills/search-craft/SKILL.md +1 -1
- package/claude/skills/search-craft/references/adopted.md +2 -2
- package/claude/skills/session-compact/REQUIREMENT.md +13 -23
- package/claude/skills/session-map/REQUIREMENT.md +13 -29
- package/claude/skills/session-relay/REQUIREMENT.md +14 -58
- package/claude/skills/session-relay/SKILL.md +6 -0
- package/claude/skills/session-resume/REQUIREMENT.md +13 -27
- package/claude/skills/session-worktree/REQUIREMENT.md +14 -43
- package/claude/skills/systematic-debugging/REQUIREMENT.md +13 -34
- package/claude/skills/target-check/REQUIREMENT.md +16 -23
- package/claude/skills/target-setup/REQUIREMENT.md +11 -34
- package/claude/skills/target-setup/SKILL.md +2 -2
- package/claude/skills/target-setup/references/detect.md +0 -1
- package/claude/skills/target-setup/references/verify.md +2 -2
- package/claude/skills/task-board/REQUIREMENT.md +13 -22
- package/claude/skills/task-board/SKILL.md +7 -0
- package/claude/skills/task-board/references/tasks.md +1 -1
- package/claude/skills/task-complete/REQUIREMENT.md +11 -24
- package/claude/skills/task-complete/references/archive.md +1 -0
- package/claude/skills/teach-workspace/REQUIREMENT.md +14 -45
- package/claude/skills/teach-workspace/references/promotion.md +5 -5
- package/claude/skills/test-craft/REQUIREMENT.md +15 -46
- package/claude/skills/test-first/REQUIREMENT.md +14 -20
- package/claude/skills/ui-checklist/REQUIREMENT.md +14 -29
- package/claude/skills/ux-audit/REQUIREMENT.md +3 -7
- package/claude/skills/ux-measure/REQUIREMENT.md +14 -28
- package/claude/skills/video-craft/REQUIREMENT.md +14 -27
- package/claude/skills/write-doc/REQUIREMENT.md +14 -24
- package/claude/skills/write-human/REQUIREMENT.md +15 -27
- package/claude/skills/youtube-transcripts/REQUIREMENT.md +9 -15
- package/docs/agents/context-audit.md +19 -12
- package/docs/agents/install-and-sync.md +2 -2
- package/docs/agents/markdown-audit.md +15 -10
- package/docs/agents/output-shape.md +1 -2
- package/docs/target/migrations.md +18 -0
- package/docs/target/projects.md +3 -2
- package/docs/target/scenarios.md +4 -1
- package/docs/workflow/skill-map-on-request.md +1 -1
- package/docs/workflow/skill-map.md +6 -5
- package/governance/detect.toml +4 -0
- package/governance/ledger/lang/go.md +61 -0
- package/governance/ledger/lang/php.md +50 -0
- package/governance/ledger/lang/python.md +68 -0
- package/governance/ledger/lang/typescript.md +64 -0
- package/governance/ledger/lib/database.md +65 -0
- package/governance/ledger/lib/e2e-reliability.md +57 -0
- package/governance/ledger/lib/pydantic.md +61 -0
- package/governance/ledger/lib/security-server.md +62 -0
- package/governance/ledger/lib/security-web.md +51 -0
- package/governance/ledger/lib/tanstack-query.md +57 -0
- package/governance/ledger/lib/test-scope.md +43 -0
- package/governance/ledger/lib/testing-go.md +57 -0
- package/governance/ledger/lib/testing-php.md +51 -0
- package/governance/ledger/lib/testing-py.md +67 -0
- package/governance/ledger/lib/testing-ts.md +63 -0
- package/governance/ledger/lib/zod.md +47 -0
- package/governance/ledger/tooling/ci-workflow.md +33 -0
- package/governance/ledger/tooling/code-comments.md +48 -0
- package/governance/ledger/tooling/config-comments.md +27 -0
- package/governance/ledger/tooling/dependencies.md +38 -0
- package/governance/ledger/ui/a11y.md +55 -0
- package/governance/ledger/ui/copy.md +49 -0
- package/governance/ledger/ui/design-reference.md +42 -0
- package/governance/ledger/ui/design-taste.md +19 -0
- package/governance/ledger/ui/forms.md +71 -0
- package/governance/ledger/ui/interface-casing.md +47 -0
- package/governance/ledger/ui/keyboard.md +68 -0
- package/governance/ledger/ui/link-behavior.md +29 -0
- package/governance/ledger/ui/motion.md +33 -0
- package/governance/ledger/ui/surface-capture.md +69 -0
- package/governance/ledger/ui/ux-completeness.md +79 -0
- package/governance/renames.toml +0 -2
- package/governance/rules/claude/output.md +5 -1
- package/governance/rules/code/routing.md +5 -1
- package/governance/rules/lang/go.md +7 -16
- package/governance/rules/lang/php.md +3 -3
- package/governance/rules/lang/python.md +9 -18
- package/governance/rules/lang/typescript.md +9 -19
- package/governance/rules/lib/database.md +5 -5
- package/governance/rules/lib/e2e-reliability.md +4 -6
- package/governance/rules/lib/pydantic.md +14 -16
- package/governance/rules/lib/security-server.md +4 -4
- package/governance/rules/lib/security-web.md +6 -10
- package/governance/rules/lib/tanstack-query.md +10 -12
- package/governance/rules/lib/test-scope.md +4 -4
- package/governance/rules/lib/testing-go.md +1 -2
- package/governance/rules/lib/testing-php.md +4 -5
- package/governance/rules/lib/testing-py.md +11 -19
- package/governance/rules/lib/testing-ts.md +7 -16
- package/governance/rules/lib/zod.md +6 -8
- package/governance/rules/tooling/code-comments.md +2 -4
- package/governance/rules/tooling/config-comments.md +1 -4
- package/governance/rules/tooling/dependencies.md +1 -1
- package/governance/rules/ui/a11y.md +16 -45
- package/governance/rules/ui/copy.md +6 -9
- package/governance/rules/ui/forms.md +13 -19
- package/governance/rules/ui/interface-casing.md +5 -7
- package/governance/rules/ui/keyboard.md +38 -0
- package/governance/rules/ui/link-behavior.md +3 -3
- package/governance/rules/ui/motion.md +3 -3
- package/governance/rules/ui/surface-capture.md +15 -27
- package/governance/rules/ui/ux-completeness.md +16 -39
- package/governance/stacks/base.toml +0 -1
- package/package.json +1 -1
- package/scripts/core/install-check.sh +1 -1
- package/src/claude/cases/workflow.ts +12 -0
- package/src/cli/help.ts +0 -1
- package/src/cli.ts +0 -2
- package/src/commands/context.ts +57 -3
- package/src/commands/gov.ts +4 -0
- package/src/commands/init.ts +2 -2
- package/src/commands/labels.ts +83 -3
- package/src/commands/markdown.ts +188 -21
- package/src/commands/sessions.ts +36 -3
- package/src/commands/tasks.ts +180 -0
- package/src/commands/tooling.ts +18 -5
- package/src/commands/worktrees.ts +2 -0
- package/src/context/coverage.ts +210 -0
- package/src/context/gate.ts +12 -3
- package/src/design/components.ts +1 -1
- package/src/gate/stages.ts +1 -1
- package/src/gov/audit.ts +22 -2
- package/src/init/plan.ts +1 -8
- package/src/init/steps.ts +44 -7
- package/src/intake/items.ts +14 -0
- package/src/inventory/subjects.ts +1 -1
- package/src/labels/closing.ts +46 -0
- package/src/markdown/gated.ts +250 -0
- package/src/markdown/scope.ts +119 -2
- package/src/migrate/rename.ts +6 -0
- package/src/migrate/scratch-evidence.ts +12 -4
- package/src/records/backup.ts +3 -3
- package/src/records/validate.ts +3 -3
- package/src/roots/record.ts +17 -8
- package/src/sessions/claim.ts +7 -0
- package/src/sessions/live.ts +53 -6
- package/src/sessions/registry.ts +11 -0
- package/src/sessions/resolve.ts +32 -5
- package/src/tasks/closes.ts +136 -0
- package/src/tasks/record.ts +1 -1
- package/src/tooling/inject.ts +26 -7
- package/src/tooling/package.ts +32 -0
- package/src/tooling/read.ts +46 -3
- package/src/tooling/scan.ts +8 -2
- package/src/worktrees/reclaim.ts +16 -1
- package/tooling/astro/reference.md +64 -93
- package/tooling/base/configs/.github/workflows/phase-label-gate.yml +1 -1
- package/tooling/base/configs/scripts/verify.ts +2 -2
- package/tooling/base/reference.md +1 -9
- package/tooling/base/seeds/canon/context/{ci.md → development/ci.md} +1 -1
- package/tooling/base/seeds/canon/context/development/index.md +11 -0
- package/tooling/base/seeds/canon/context/{development.md → development/setup.md} +8 -12
- package/tooling/base/seeds/canon/context/index.md +1 -2
- package/tooling/claude/manifest.toml +1 -5
- package/tooling/claude/reference.md +36 -59
- package/tooling/claude/seeds/.claude/hooks/board-validate.sh +1 -1
- package/tooling/claude/seeds/.claude/hooks/index-reminder.sh +2 -7
- package/tooling/claude/seeds/.claude/hooks/pr-create-log.sh +2 -7
- package/tooling/claude/seeds/.claude/hooks/scratch-guard.sh +3 -10
- package/tooling/claude/seeds/.claude/hooks/search-reminder.sh +2 -7
- package/tooling/claude/seeds/.claude/hooks/standards-audit.sh +2 -4
- package/tooling/claude/seeds/CLAUDE.md +2 -2
- package/tooling/nextjs/reference.md +0 -6
- package/tooling/php/reference.md +0 -4
- package/tooling/web/configs/.github/workflows/verify.yml +28 -0
- package/tooling/web/configs/.oxlintrc.json +7 -0
- package/tooling/web/configs/e2e/capture-types.ts +35 -0
- package/tooling/web/configs/e2e/screenshot.ts +23 -72
- package/tooling/web/manifest.toml +1 -1
- package/tooling/web/reference.md +77 -124
- package/tooling/web/seeds/e2e/capture/cases.ts +47 -0
- package/governance/rules/canon/task-scope.md +0 -12
- package/src/commands/wiki.ts +0 -100
- 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.
|
package/src/commands/wiki.ts
DELETED
|
@@ -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
|
-
}
|