@erclx/canon 4.67.0 → 4.68.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/claude/.claude-plugin/plugin.json +1 -1
- package/claude/skills/{claude-autoship → auto-ship}/REQUIREMENT.md +3 -3
- package/claude/skills/{claude-autoship → auto-ship}/SKILL.md +36 -36
- package/claude/skills/canon-cli/REQUIREMENT.md +2 -2
- package/claude/skills/canon-cli/SKILL.md +2 -2
- package/claude/skills/canon-feedback-triage/REQUIREMENT.md +1 -1
- package/claude/skills/canon-feedback-triage/SKILL.md +3 -3
- package/claude/skills/canon-operator/REQUIREMENT.md +1 -1
- package/claude/skills/canon-operator/SKILL.md +4 -4
- package/claude/skills/canon-rollout/REQUIREMENT.md +6 -6
- package/claude/skills/canon-rollout/SKILL.md +7 -7
- package/claude/skills/{claude-design-extract → design-extract}/REQUIREMENT.md +4 -4
- package/claude/skills/{claude-design-extract → design-extract}/SKILL.md +1 -1
- package/claude/skills/{claude-docs → docs-fold}/REQUIREMENT.md +3 -3
- package/claude/skills/{claude-docs → docs-fold}/SKILL.md +14 -14
- package/claude/skills/{claude-docs → docs-fold}/references/anchor-sweep.md +1 -1
- package/claude/skills/{claude-docs → docs-fold}/references/wireframe-sweep.md +1 -1
- package/claude/skills/docs-sync/REQUIREMENT.md +3 -3
- package/claude/skills/docs-sync/SKILL.md +1 -1
- package/claude/skills/draft-and-pick/REQUIREMENT.md +4 -4
- package/claude/skills/draft-and-pick/SKILL.md +6 -6
- package/claude/skills/draft-context/REQUIREMENT.md +2 -2
- package/claude/skills/draft-context/SKILL.md +3 -3
- package/claude/skills/{claude-diagram → draft-diagram}/REQUIREMENT.md +4 -4
- package/claude/skills/{claude-diagram → draft-diagram}/SKILL.md +3 -3
- package/claude/skills/draft-docs/REQUIREMENT.md +1 -1
- package/claude/skills/draft-wireframes/REQUIREMENT.md +1 -1
- package/claude/skills/draft-wireframes/SKILL.md +2 -2
- package/claude/skills/git-followup/REQUIREMENT.md +1 -1
- package/claude/skills/git-followup/SKILL.md +1 -1
- package/claude/skills/git-pr/SKILL.md +3 -3
- package/claude/skills/git-ship/REQUIREMENT.md +2 -2
- package/claude/skills/git-ship/SKILL.md +8 -8
- package/claude/skills/git-worktree/REQUIREMENT.md +2 -2
- package/claude/skills/git-worktree/SKILL.md +3 -3
- package/claude/skills/identity/REQUIREMENT.md +2 -2
- package/claude/skills/identity/SKILL.md +3 -3
- package/claude/skills/{claude-markdown-propose → markdown-propose}/REQUIREMENT.md +8 -8
- package/claude/skills/{claude-markdown-propose → markdown-propose}/SKILL.md +5 -5
- package/claude/skills/{claude-markdown-propose → markdown-propose}/references/format.md +1 -1
- package/claude/skills/{claude-memory-capture → memory-capture}/REQUIREMENT.md +5 -5
- package/claude/skills/{claude-memory-capture → memory-capture}/SKILL.md +13 -13
- package/claude/skills/{claude-memory-review → memory-review}/REQUIREMENT.md +4 -4
- package/claude/skills/{claude-memory-review → memory-review}/SKILL.md +10 -10
- package/claude/skills/migration-context/SKILL.md +1 -1
- package/claude/skills/migration-standards-drop/REQUIREMENT.md +1 -1
- package/claude/skills/migration-superseded/REQUIREMENT.md +1 -1
- package/claude/skills/{claude-feature → plan-feature}/REQUIREMENT.md +4 -4
- package/claude/skills/{claude-feature → plan-feature}/SKILL.md +4 -4
- package/claude/skills/{claude-groundwork → plan-groundwork}/REQUIREMENT.md +5 -5
- package/claude/skills/{claude-groundwork → plan-groundwork}/SKILL.md +8 -8
- package/claude/skills/{claude-intake → plan-intake}/REQUIREMENT.md +6 -6
- package/claude/skills/{claude-intake → plan-intake}/SKILL.md +10 -10
- package/claude/skills/{claude-intake-answer → plan-intake-answer}/REQUIREMENT.md +4 -4
- package/claude/skills/{claude-intake-answer → plan-intake-answer}/SKILL.md +5 -5
- package/claude/skills/{claude-address-review → review-address}/REQUIREMENT.md +5 -5
- package/claude/skills/{claude-address-review → review-address}/SKILL.md +6 -6
- package/claude/skills/{claude-address-review → review-address}/references/rebase-conflicts.md +1 -1
- package/claude/skills/{claude-review → review-branch}/REQUIREMENT.md +4 -4
- package/claude/skills/{claude-review → review-branch}/SKILL.md +4 -4
- package/claude/skills/{claude-pr-review → review-pr}/REQUIREMENT.md +5 -5
- package/claude/skills/{claude-pr-review → review-pr}/SKILL.md +11 -11
- package/claude/skills/{claude-orchestrate → role-orchestrator}/REQUIREMENT.md +5 -5
- package/claude/skills/{claude-orchestrate → role-orchestrator}/SKILL.md +20 -20
- package/claude/skills/{claude-orchestrate → role-orchestrator}/references/orchestrator-dispatch.md +30 -30
- package/claude/skills/{claude-orchestrate → role-orchestrator}/references/orchestrator-handoff.md +2 -2
- package/claude/skills/{claude-orchestrate → role-orchestrator}/references/orchestrator-parked.md +8 -8
- package/claude/skills/{claude-orchestrate → role-orchestrator}/references/orchestrator-poll.md +8 -8
- package/claude/skills/{claude-orchestrate → role-orchestrator}/references/orchestrator-resume.md +1 -1
- package/claude/skills/{claude-orchestrate → role-orchestrator}/references/orchestrator-sweep.md +1 -1
- package/claude/skills/{claude-orchestrate → role-orchestrator}/scripts/poll.sh +6 -6
- package/claude/skills/{claude-planner → role-planner}/REQUIREMENT.md +12 -12
- package/claude/skills/{claude-planner → role-planner}/SKILL.md +4 -4
- package/claude/skills/{claude-worker → role-worker}/REQUIREMENT.md +8 -8
- package/claude/skills/{claude-worker → role-worker}/SKILL.md +6 -6
- package/claude/skills/{claude-seed-sync → seed-sync}/REQUIREMENT.md +2 -2
- package/claude/skills/{claude-seed-sync → seed-sync}/SKILL.md +3 -3
- package/claude/skills/session-map/REQUIREMENT.md +2 -2
- package/claude/skills/session-map/SKILL.md +2 -2
- package/claude/skills/session-resume/REQUIREMENT.md +2 -2
- package/claude/skills/session-resume/SKILL.md +2 -2
- package/claude/skills/{claude-worktree → session-worktree}/REQUIREMENT.md +3 -3
- package/claude/skills/{claude-worktree → session-worktree}/SKILL.md +6 -6
- package/claude/skills/setup-plugins/references/plugin-catalog.md +1 -1
- package/claude/skills/{claude-standards-audit → standards-audit}/REQUIREMENT.md +2 -2
- package/claude/skills/{claude-standards-audit → standards-audit}/SKILL.md +2 -2
- package/claude/skills/systematic-debugging/REQUIREMENT.md +1 -1
- package/claude/skills/{claude-tasks → task-board}/REQUIREMENT.md +3 -3
- package/claude/skills/{claude-tasks → task-board}/SKILL.md +7 -7
- package/claude/skills/{claude-teach → teach-workspace}/REQUIREMENT.md +2 -2
- package/claude/skills/{claude-teach → teach-workspace}/SKILL.md +4 -4
- package/claude/skills/test-first/REQUIREMENT.md +2 -2
- package/claude/skills/{claude-ui-test → ui-test}/REQUIREMENT.md +3 -3
- package/claude/skills/{claude-ui-test → ui-test}/SKILL.md +3 -3
- package/claude/skills/{claude-ux-audit → ux-audit}/REQUIREMENT.md +6 -6
- package/claude/skills/{claude-ux-audit → ux-audit}/SKILL.md +5 -5
- package/claude/skills/{claude-ux-measure → ux-measure}/REQUIREMENT.md +5 -5
- package/claude/skills/{claude-ux-measure → ux-measure}/SKILL.md +5 -5
- package/docs/agents/install-and-sync.md +1 -1
- package/docs/agents/key-changes.md +3 -3
- package/docs/agents/markdown-audit.md +1 -1
- package/docs/agents/restated.md +1 -1
- package/docs/agents/review-classification.md +1 -1
- package/docs/agents/sessions.md +1 -1
- package/docs/agents/state-scoped-risk.md +1 -1
- package/docs/agents/targets.md +1 -1
- package/docs/agents/tasks.md +4 -4
- package/docs/agents/teach.md +1 -1
- package/docs/target-projects.md +10 -10
- package/docs/workflow/ai-workflow.md +84 -84
- package/docs/workflow/operating-model.md +17 -17
- package/docs/workflow/visual-design-workflow.md +6 -6
- package/governance/rules/core/045-memory.md +1 -1
- package/governance/rules/core/085-worktrees.md +1 -1
- package/package.json +1 -1
- package/scripts/core/regen-agent-fixture.sh +1 -1
- package/scripts/core/regen-hero.sh +7 -7
- package/snippets/claude/decision-memo.md +1 -1
- package/src/autoship/paths.ts +1 -1
- package/src/claude/cases/all.ts +2 -2
- package/src/claude/cases/{claude-workflow.ts → workflow.ts} +33 -33
- package/src/commands/sync.ts +3 -3
- package/src/design/tokens.ts +1 -1
- package/src/gov/restated.ts +2 -2
- package/src/markdown/structure.ts +1 -1
- package/src/migrate/rename.ts +4 -3
- package/src/pr/bijection.ts +1 -1
- package/src/pr/paths.ts +2 -2
- package/src/shipped/references.ts +1 -1
- package/src/sync/seeds-report.ts +1 -1
- package/src/targets/pulls.ts +2 -2
- package/src/tasks/answers.ts +1 -1
- package/src/tasks/archive.ts +4 -4
- package/src/tasks/record.ts +2 -2
- package/src/tasks/validate.ts +1 -1
- package/standards/groundwork.md +1 -1
- package/standards/snippets.md +1 -1
- package/standards/tasks.md +3 -3
- package/standards/teach.md +2 -2
- package/tooling/base/configs/.husky/post-merge +3 -3
- package/tooling/claude/reference.md +5 -5
- package/tooling/claude/seeds/.claude/hooks/pr-create-log.sh +2 -2
- /package/claude/skills/{claude-memory-review → memory-review}/references/receipt-format.md +0 -0
- /package/claude/skills/{claude-orchestrate → role-orchestrator}/scripts/watch.sh +0 -0
- /package/claude/skills/{claude-teach → teach-workspace}/references/lesson-craft.md +0 -0
- /package/claude/skills/{claude-teach → teach-workspace}/references/pedagogy.md +0 -0
- /package/claude/skills/{claude-teach → teach-workspace}/references/promotion.md +0 -0
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import type { SkillCase } from '@/claude/skills-rank'
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
|
-
* The
|
|
5
|
-
*
|
|
4
|
+
* The session workflow skills: feature planning, review, and the artifacts
|
|
5
|
+
* that coordinate work across sessions.
|
|
6
6
|
*
|
|
7
7
|
* Every positive is phrased away from its skill's own quoted trigger, since a
|
|
8
8
|
* verbatim trigger passes by construction and proves nothing about a prompt in
|
|
@@ -10,33 +10,33 @@ import type { SkillCase } from '@/claude/skills-rank'
|
|
|
10
10
|
* an explicit `Do NOT` boundary against each other, since a boundary in a
|
|
11
11
|
* body does not reach the field a router reads.
|
|
12
12
|
*/
|
|
13
|
-
export const
|
|
13
|
+
export const WORKFLOW_CASES: readonly SkillCase[] = [
|
|
14
14
|
{
|
|
15
15
|
prompt: 'Go fix everything the reviewer flagged on my open PR.',
|
|
16
|
-
expect: '
|
|
16
|
+
expect: 'review-address',
|
|
17
17
|
},
|
|
18
18
|
{
|
|
19
19
|
prompt:
|
|
20
20
|
'Run the whole implement, verify, review, and ship pipeline for the approved plan.',
|
|
21
|
-
expect: '
|
|
21
|
+
expect: 'auto-ship',
|
|
22
22
|
},
|
|
23
23
|
{
|
|
24
24
|
prompt: "Pull together a design system from what's already in the app.",
|
|
25
|
-
expect: '
|
|
25
|
+
expect: 'design-extract',
|
|
26
26
|
},
|
|
27
27
|
{
|
|
28
28
|
prompt: 'Draw me a diagram of how the pieces of this system connect.',
|
|
29
|
-
expect: '
|
|
29
|
+
expect: 'draft-diagram',
|
|
30
30
|
},
|
|
31
31
|
{
|
|
32
32
|
prompt:
|
|
33
33
|
'Bring the internal planning docs under .claude up to date with what we decided this session.',
|
|
34
|
-
expect: '
|
|
34
|
+
expect: 'docs-fold',
|
|
35
35
|
},
|
|
36
36
|
{
|
|
37
37
|
prompt:
|
|
38
38
|
'Sketch out a plan for adding this new capability before we touch any code.',
|
|
39
|
-
expect: '
|
|
39
|
+
expect: 'plan-feature',
|
|
40
40
|
},
|
|
41
41
|
{
|
|
42
42
|
prompt:
|
|
@@ -46,43 +46,43 @@ export const CLAUDE_WORKFLOW_CASES: readonly SkillCase[] = [
|
|
|
46
46
|
{
|
|
47
47
|
prompt:
|
|
48
48
|
'We need to measure this properly before committing to an approach.',
|
|
49
|
-
expect: '
|
|
49
|
+
expect: 'plan-groundwork',
|
|
50
50
|
},
|
|
51
51
|
{
|
|
52
52
|
prompt: 'Take this pile of raw notes and turn it into filed items.',
|
|
53
|
-
expect: '
|
|
53
|
+
expect: 'plan-intake',
|
|
54
54
|
},
|
|
55
55
|
{
|
|
56
56
|
prompt: 'Walk me through the open intake items so I can decide on each.',
|
|
57
|
-
expect: '
|
|
57
|
+
expect: 'plan-intake-answer',
|
|
58
58
|
},
|
|
59
59
|
{
|
|
60
60
|
prompt:
|
|
61
61
|
"Draft a diff-based proposal for tightening this passage in the standard, don't just edit it.",
|
|
62
|
-
expect: '
|
|
62
|
+
expect: 'markdown-propose',
|
|
63
63
|
},
|
|
64
64
|
{
|
|
65
65
|
prompt: 'Pull the durable lessons out of this session before it ends.',
|
|
66
|
-
expect: '
|
|
66
|
+
expect: 'memory-capture',
|
|
67
67
|
},
|
|
68
68
|
{
|
|
69
69
|
prompt:
|
|
70
70
|
'Go through the memory folder and propose what to do with each entry.',
|
|
71
|
-
expect: '
|
|
71
|
+
expect: 'memory-review',
|
|
72
72
|
},
|
|
73
73
|
{
|
|
74
74
|
prompt:
|
|
75
75
|
'Take on the orchestrator role and coordinate the parallel feature builds.',
|
|
76
|
-
expect: '
|
|
76
|
+
expect: 'role-orchestrator',
|
|
77
77
|
},
|
|
78
78
|
{
|
|
79
79
|
prompt:
|
|
80
80
|
'I am writing the plan for a row another session will build. What may I write, and where do I read what is already in flight?',
|
|
81
|
-
expect: '
|
|
81
|
+
expect: 'role-planner',
|
|
82
82
|
},
|
|
83
83
|
{
|
|
84
84
|
prompt: 'Post a formal review with findings on that open pull request.',
|
|
85
|
-
expect: '
|
|
85
|
+
expect: 'review-pr',
|
|
86
86
|
},
|
|
87
87
|
{
|
|
88
88
|
prompt:
|
|
@@ -92,7 +92,7 @@ export const CLAUDE_WORKFLOW_CASES: readonly SkillCase[] = [
|
|
|
92
92
|
{
|
|
93
93
|
prompt:
|
|
94
94
|
'Look over everything that changed on this branch for bugs and edge cases.',
|
|
95
|
-
expect: '
|
|
95
|
+
expect: 'review-branch',
|
|
96
96
|
},
|
|
97
97
|
{
|
|
98
98
|
prompt: 'Draft me a script with beats for a screencast recording.',
|
|
@@ -101,7 +101,7 @@ export const CLAUDE_WORKFLOW_CASES: readonly SkillCase[] = [
|
|
|
101
101
|
{
|
|
102
102
|
prompt:
|
|
103
103
|
"Check whether my installed Claude seed docs have drifted from the toolkit's.",
|
|
104
|
-
expect: '
|
|
104
|
+
expect: 'seed-sync',
|
|
105
105
|
},
|
|
106
106
|
{
|
|
107
107
|
prompt: 'Turn this topic into a slide deck I can render.',
|
|
@@ -110,37 +110,37 @@ export const CLAUDE_WORKFLOW_CASES: readonly SkillCase[] = [
|
|
|
110
110
|
{
|
|
111
111
|
prompt:
|
|
112
112
|
'Check whether the markdown I changed violates any authoring standards.',
|
|
113
|
-
expect: '
|
|
113
|
+
expect: 'standards-audit',
|
|
114
114
|
},
|
|
115
115
|
{
|
|
116
116
|
prompt: 'Open a new entry on the task board for this piece of work.',
|
|
117
|
-
expect: '
|
|
117
|
+
expect: 'task-board',
|
|
118
118
|
},
|
|
119
119
|
{
|
|
120
120
|
prompt: 'Open a learning workspace so I can study this topic properly.',
|
|
121
|
-
expect: '
|
|
121
|
+
expect: 'teach-workspace',
|
|
122
122
|
},
|
|
123
123
|
{
|
|
124
124
|
prompt: 'Generate the Playwright tests I need after this UI change.',
|
|
125
|
-
expect: '
|
|
125
|
+
expect: 'ui-test',
|
|
126
126
|
},
|
|
127
127
|
{
|
|
128
128
|
prompt:
|
|
129
129
|
'Look over the interface and tell me what feels unfinished or confusing.',
|
|
130
|
-
expect: '
|
|
130
|
+
expect: 'ux-audit',
|
|
131
131
|
},
|
|
132
132
|
{
|
|
133
133
|
prompt: 'Tell me the paint and layout cost of this page right now.',
|
|
134
|
-
expect: '
|
|
134
|
+
expect: 'ux-measure',
|
|
135
135
|
},
|
|
136
136
|
{
|
|
137
137
|
prompt:
|
|
138
138
|
'I am building this branch for another session. What am I on the hook for, and what is off limits?',
|
|
139
|
-
expect: '
|
|
139
|
+
expect: 'role-worker',
|
|
140
140
|
},
|
|
141
141
|
{
|
|
142
142
|
prompt: 'Get me set up in a fresh Claude Code worktree for this branch.',
|
|
143
|
-
expect: '
|
|
143
|
+
expect: 'session-worktree',
|
|
144
144
|
},
|
|
145
145
|
|
|
146
146
|
// Negatives: pairs whose bodies already carry an explicit Do NOT boundary.
|
|
@@ -151,23 +151,23 @@ export const CLAUDE_WORKFLOW_CASES: readonly SkillCase[] = [
|
|
|
151
151
|
},
|
|
152
152
|
{
|
|
153
153
|
prompt: 'Sort through this brain dump and write it up as findings.',
|
|
154
|
-
expect: '
|
|
154
|
+
expect: 'plan-intake',
|
|
155
155
|
},
|
|
156
156
|
{
|
|
157
157
|
prompt:
|
|
158
158
|
"Go through what's still unanswered in the intake folder and decide.",
|
|
159
|
-
expect: '
|
|
159
|
+
expect: 'plan-intake-answer',
|
|
160
160
|
},
|
|
161
161
|
{
|
|
162
162
|
prompt: 'Check this markdown against the house style rules.',
|
|
163
|
-
expect: '
|
|
163
|
+
expect: 'standards-audit',
|
|
164
164
|
},
|
|
165
165
|
{
|
|
166
166
|
prompt: 'Find the rough, unfinished-feeling spots in this interface.',
|
|
167
|
-
expect: '
|
|
167
|
+
expect: 'ux-audit',
|
|
168
168
|
},
|
|
169
169
|
{
|
|
170
170
|
prompt: 'Tell me the render cost of this page in the browser.',
|
|
171
|
-
expect: '
|
|
171
|
+
expect: 'ux-measure',
|
|
172
172
|
},
|
|
173
173
|
]
|
package/src/commands/sync.ts
CHANGED
|
@@ -265,7 +265,7 @@ function renderTooling(report: CheckReport): void {
|
|
|
265
265
|
/**
|
|
266
266
|
* Seeds print their own section because no sync command applies them. A `stale`
|
|
267
267
|
* seed is safe to take whole and a `drifted` one holds edits, which is the split
|
|
268
|
-
* `
|
|
268
|
+
* `seed-sync` reads to decide what needs a section-level merge.
|
|
269
269
|
*/
|
|
270
270
|
function renderSeeds(report: CheckReport): void {
|
|
271
271
|
const notable = report.seeds.entries.filter(
|
|
@@ -283,7 +283,7 @@ function renderSeeds(report: CheckReport): void {
|
|
|
283
283
|
logWarn(`${entry.rel} (${entry.state})`)
|
|
284
284
|
}
|
|
285
285
|
|
|
286
|
-
logInfo('Run /canon:
|
|
286
|
+
logInfo('Run /canon:seed-sync to reconcile these section by section.')
|
|
287
287
|
}
|
|
288
288
|
|
|
289
289
|
/**
|
|
@@ -399,7 +399,7 @@ async function runSync(target: string): Promise<number> {
|
|
|
399
399
|
|
|
400
400
|
if (existsSync(join(resolved, '.claude'))) {
|
|
401
401
|
process.stderr.write(
|
|
402
|
-
`${GREY}Tip: run \`/
|
|
402
|
+
`${GREY}Tip: run \`/seed-sync\` to audit seed drift per section, preserving local customizations.${NC}\n`,
|
|
403
403
|
)
|
|
404
404
|
}
|
|
405
405
|
|
package/src/design/tokens.ts
CHANGED
|
@@ -354,7 +354,7 @@ export const TOKENS: DesignTokens = {
|
|
|
354
354
|
'Motion is not used. No transition, animation, or keyframe declaration appears on any rendered surface, and the capture pipeline screenshots a static frame.',
|
|
355
355
|
|
|
356
356
|
iconography:
|
|
357
|
-
"No icon library is installed. `assets/brand/mark.svg` is the one authored icon, embedded inline in the hero topbar, and the surfaces otherwise draw literal glyph characters: `│ ├ ✓ ! ✗ + - ◆ ◇ ❯` for the terminal framing. The same mark also ships as a favicon on every rendered surface, as three independently-maintained copies that track different accents by design rather than by drift: `regen-hero.sh` derives one from the live SVG colored with whatever `--color-accent` (`#e0724b`) the fetched token CSS carries, `src/design/render.ts` carries the path data as a hardcoded literal colored via `colorValue('light-accent')` (`#a4471c`), since a data URI has no CSS context and that page renders on light chrome, and `
|
|
357
|
+
"No icon library is installed. `assets/brand/mark.svg` is the one authored icon, embedded inline in the hero topbar, and the surfaces otherwise draw literal glyph characters: `│ ├ ✓ ! ✗ + - ◆ ◇ ❯` for the terminal framing. The same mark also ships as a favicon on every rendered surface, as three independently-maintained copies that track different accents by design rather than by drift: `regen-hero.sh` derives one from the live SVG colored with whatever `--color-accent` (`#e0724b`) the fetched token CSS carries, `src/design/render.ts` carries the path data as a hardcoded literal colored via `colorValue('light-accent')` (`#a4471c`), since a data URI has no CSS context and that page renders on light chrome, and `teach-workspace`'s `SKILL.md` names one in prose colored `rgb(224,114,75)`, the same value as the dark accent written as decimal rather than hex to clear the shipped-references gate's commit-sha check. Unifying the three or repairing the one that looks drifted would break the fit each was chosen for.",
|
|
358
358
|
}
|
|
359
359
|
|
|
360
360
|
/** A role's value, or `undefined` where the record declares no such role. */
|
package/src/gov/restated.ts
CHANGED
|
@@ -24,7 +24,7 @@ export const RULES_REL = join('governance', 'rules')
|
|
|
24
24
|
/**
|
|
25
25
|
* Path pairs whose duplication is deliberate and already recorded.
|
|
26
26
|
*
|
|
27
|
-
* The seed is authored from the always-loaded file and `
|
|
27
|
+
* The seed is authored from the always-loaded file and `seed-sync`
|
|
28
28
|
* exists to reconcile the two, so a bullet appearing in both is the design
|
|
29
29
|
* rather than a defect. Excluding by pair rather than by content is what the
|
|
30
30
|
* plan settled on: the duplication is a location fact this repository already
|
|
@@ -574,7 +574,7 @@ function authorityFor(
|
|
|
574
574
|
if (candidate.kind === 'seed') {
|
|
575
575
|
return {
|
|
576
576
|
authority: 'claude-md',
|
|
577
|
-
reason: `${INSTRUCTIONS_REL} is authored first and the seed carries it to a target, so an edit starts there and reaches the seed through
|
|
577
|
+
reason: `${INSTRUCTIONS_REL} is authored first and the seed carries it to a target, so an edit starts there and reaches the seed through seed-sync`,
|
|
578
578
|
}
|
|
579
579
|
}
|
|
580
580
|
|
|
@@ -26,7 +26,7 @@ const HEADING = /^#{1,6}\s/
|
|
|
26
26
|
* run and a false one shortens every run around it until the measure stops
|
|
27
27
|
* reporting, which is the dearer of the two.
|
|
28
28
|
*
|
|
29
|
-
* A colon ends most markers and not all of them. `
|
|
29
|
+
* A colon ends most markers and not all of them. `review-pr` writes
|
|
30
30
|
* three colon-less ones into every body it posts and a bold path heading for
|
|
31
31
|
* each file it reviews, so requiring the colon held a real seam out. Two
|
|
32
32
|
* signals stand in where the colon is absent, because the shape a marker has to
|
package/src/migrate/rename.ts
CHANGED
|
@@ -46,8 +46,9 @@ export interface RenameRuleSpec {
|
|
|
46
46
|
* A rename whose tokens are whole names wants this, and one whose tokens are
|
|
47
47
|
* word stems cannot have it. `aitk` is a stem that legitimately carries a
|
|
48
48
|
* suffix, as in `aitk-allow-superseded`, so requiring a boundary there would
|
|
49
|
-
* leave every hyphenated form behind. A skill name is not a stem, and
|
|
50
|
-
*
|
|
49
|
+
* leave every hyphenated form behind. A skill name is not a stem, and the
|
|
50
|
+
* spelling below is the pre-rename one on purpose (canon-keep-retired):
|
|
51
|
+
* `claude-worktree` inside `claude-worktrees` is a different subject, the
|
|
51
52
|
* wiki page about the harness feature, which the rename must not move.
|
|
52
53
|
*/
|
|
53
54
|
readonly wholeToken?: boolean
|
|
@@ -88,7 +89,7 @@ const NEVER_MATCHES = '(?!)'
|
|
|
88
89
|
*
|
|
89
90
|
* A plain word boundary rejects a following letter and accepts a following
|
|
90
91
|
* hyphen, since `\b` reads a hyphen as the end of a word. That leaves
|
|
91
|
-
* `
|
|
92
|
+
* `plan-intake` matching inside `plan-intake-answer`, with the ordering of
|
|
92
93
|
* the alternation the only thing standing between them. Naming the characters
|
|
93
94
|
* that continue an identifier holds on both, so the ordering and the boundary
|
|
94
95
|
* each cover what the other could miss, and a slash, a dot, or a backtick
|
package/src/pr/bijection.ts
CHANGED
|
@@ -99,7 +99,7 @@ function owesNoBullet(path: string): boolean {
|
|
|
99
99
|
* names.
|
|
100
100
|
*
|
|
101
101
|
* An unanchored claim matches on a segment-anchored suffix, which is what lets
|
|
102
|
-
* `
|
|
102
|
+
* `role-worker/SKILL.md` credit `claude/skills/role-worker/SKILL.md`. That
|
|
103
103
|
* asymmetry is deliberate: a partial spelling can confirm a changed file was
|
|
104
104
|
* named and never accuse one of being absent, because nothing here separates a
|
|
105
105
|
* path written short from a path written wrong.
|
package/src/pr/paths.ts
CHANGED
|
@@ -20,7 +20,7 @@ export interface PathClaim {
|
|
|
20
20
|
* True when the first segment names an entry the tree actually holds.
|
|
21
21
|
*
|
|
22
22
|
* An unanchored claim is a path written partially, such as
|
|
23
|
-
* `
|
|
23
|
+
* `role-worker/SKILL.md` for a file under `claude/skills/`. It can confirm
|
|
24
24
|
* that a changed file was named and can never accuse one of being absent,
|
|
25
25
|
* because the comparison has no way to tell a partial spelling from a
|
|
26
26
|
* genuinely wrong one.
|
|
@@ -145,7 +145,7 @@ function maskSpans(text: string): string {
|
|
|
145
145
|
* that came out. A path past the comma was left out of the claim set entirely
|
|
146
146
|
* and fell to the unnamed direction, accepted here on the ground that the
|
|
147
147
|
* direction reports without grading. It graded anyway, one consumer removed:
|
|
148
|
-
* `
|
|
148
|
+
* `review-pr` reads `unnamed` as a question to put to the branch author,
|
|
149
149
|
* and on 2026-09-01 the question went to three pull requests over bullets that
|
|
150
150
|
* had named the files all along, with `#1329` gaining bullets it did not need.
|
|
151
151
|
*
|
|
@@ -61,7 +61,7 @@ export const REFERENCE_MARKER = 'canon-allow-reference'
|
|
|
61
61
|
* The leading boundary is what excludes the repair form by construction rather
|
|
62
62
|
* than by exemption, and that is load bearing. A lookbehind rejecting a word
|
|
63
63
|
* character before `#` never matches `erclx/canon#1299`, so a qualified
|
|
64
|
-
* reference passes with no marker, and `claude/skills/
|
|
64
|
+
* reference passes with no marker, and `claude/skills/session-worktree/SKILL.md`
|
|
65
65
|
* already ships `anthropics/claude-code#58345` in exactly that form.
|
|
66
66
|
*
|
|
67
67
|
* The trailing boundary is what the first shape of this pattern lacked, and it
|
package/src/sync/seeds-report.ts
CHANGED
|
@@ -34,7 +34,7 @@ export interface SeedsReport {
|
|
|
34
34
|
* Classifies every seed the toolkit ships against the target's copy, and never
|
|
35
35
|
* returns a change. Seeds are copy-once files a project is expected to edit, so
|
|
36
36
|
* the engine's copy path would overwrite `CLAUDE.md` wholesale. Reporting alone
|
|
37
|
-
* is what lets `
|
|
37
|
+
* is what lets `seed-sync` merge one section at a time instead.
|
|
38
38
|
*
|
|
39
39
|
* Attribution reuses the history reader rather than the engine's own recovery
|
|
40
40
|
* pass, which is private and takes a `SyncAdapter` seeds have no way to supply.
|
package/src/targets/pulls.ts
CHANGED
|
@@ -7,8 +7,8 @@ const GH_TIMEOUT_MS = 30_000
|
|
|
7
7
|
/**
|
|
8
8
|
* The two headings a review pass posts under.
|
|
9
9
|
*
|
|
10
|
-
* Owned by `
|
|
11
|
-
* the way `
|
|
10
|
+
* Owned by `review-pr`, which states the full set once, and pinned here
|
|
11
|
+
* the way `role-orchestrator/scripts/poll.sh` pins them. All three surfaces
|
|
12
12
|
* ship separately, so a heading added in that skill goes stale here with
|
|
13
13
|
* nothing comparing the copies.
|
|
14
14
|
*/
|
package/src/tasks/answers.ts
CHANGED
|
@@ -186,7 +186,7 @@ export function resolvePlanReference(
|
|
|
186
186
|
}
|
|
187
187
|
|
|
188
188
|
// An archived plan answers every question and would report as launchable, so
|
|
189
|
-
// the name would clear a dispatch that `
|
|
189
|
+
// the name would clear a dispatch that `auto-ship` Step 1 then refuses
|
|
190
190
|
// as already-shipped work. Catching it here is a step earlier than the worker.
|
|
191
191
|
// Both roots, for the reason `resolveLivePlan` carries: the reference is a
|
|
192
192
|
// string a caller wrote, and one spelling the root this tree has since left is
|
package/src/tasks/archive.ts
CHANGED
|
@@ -269,7 +269,7 @@ function isRowFor(line: string, target: string): boolean {
|
|
|
269
269
|
|
|
270
270
|
/**
|
|
271
271
|
* Resolves the `Plan:` target against the board and against the project root
|
|
272
|
-
* both, which is how `
|
|
272
|
+
* both, which is how `docs-fold` reads the same line. It accepts `../plans/x.md`
|
|
273
273
|
* and `.canon/plans/x.md` as one file, so a gate reading only the first form
|
|
274
274
|
* would pass the second and strand the plan this exists to protect.
|
|
275
275
|
*
|
|
@@ -323,7 +323,7 @@ function atOneRoot(path: string, plans: string[], root: string): string {
|
|
|
323
323
|
|
|
324
324
|
/**
|
|
325
325
|
* Names the other live tasks whose `Plan:` line lands on the same file. This is
|
|
326
|
-
* the rule `
|
|
326
|
+
* the rule `docs-fold` applies before it archives a plan, held here so one
|
|
327
327
|
* question has one implementation: a plan another live task still cites is a
|
|
328
328
|
* plan the sweep is correct to leave, and a guard that read the folder instead
|
|
329
329
|
* refused every task sharing one plan and deadlocked the board against the
|
|
@@ -380,7 +380,7 @@ export type CitationOutcome = PlanCitations | ArchiveRefused
|
|
|
380
380
|
|
|
381
381
|
/**
|
|
382
382
|
* Answers where one task's plan sits and who else holds it, which is the whole
|
|
383
|
-
* of the last-live-citation rule. `
|
|
383
|
+
* of the last-live-citation rule. `docs-fold` reads this rather than scanning
|
|
384
384
|
* the board itself, so the sweep that moves a plan and the gate that refuses a
|
|
385
385
|
* task archive cannot drift into disagreeing about which plan is free.
|
|
386
386
|
*
|
|
@@ -564,7 +564,7 @@ async function resolveStem(
|
|
|
564
564
|
|
|
565
565
|
/**
|
|
566
566
|
* Archives one task as a single unit: the move, the ordering-row removal, and
|
|
567
|
-
* the index regen. The hook and `
|
|
567
|
+
* the index regen. The hook and `task-board` both call this, so every gate
|
|
568
568
|
* refuses rather than reports. A caller with nobody watching cannot act on a
|
|
569
569
|
* warning, and two callers gating differently is the drift this exists to stop.
|
|
570
570
|
*/
|
package/src/tasks/record.ts
CHANGED
|
@@ -311,7 +311,7 @@ export async function recordPullRequest(
|
|
|
311
311
|
|
|
312
312
|
/**
|
|
313
313
|
* Records a plan's path on the task it belongs to, as the task's `Plan:` line.
|
|
314
|
-
* `
|
|
314
|
+
* `plan-feature` runs this right after the plan file lands, resolving the
|
|
315
315
|
* reference the same two ways `canon tasks plan-answers` does, through
|
|
316
316
|
* `planCandidates`, so a bare slug and a board-relative path both resolve.
|
|
317
317
|
*
|
|
@@ -346,7 +346,7 @@ export async function recordPlan(
|
|
|
346
346
|
}
|
|
347
347
|
|
|
348
348
|
/**
|
|
349
|
-
* Marks the named outcomes `[x]` in place. `
|
|
349
|
+
* Marks the named outcomes `[x]` in place. `docs-fold` runs this against a
|
|
350
350
|
* board it can read and cannot edit from a linked worktree, and the positions
|
|
351
351
|
* come from the read it already made.
|
|
352
352
|
*/
|
package/src/tasks/validate.ts
CHANGED
|
@@ -557,7 +557,7 @@ async function listTaskStems(dir: string): Promise<string[]> {
|
|
|
557
557
|
|
|
558
558
|
/**
|
|
559
559
|
* Resolves a pointer against the board and against the project root both, the
|
|
560
|
-
* way `
|
|
560
|
+
* way `docs-fold` reads the same line. A fragment is dropped first, since an
|
|
561
561
|
* anchor is part of the link and never part of the path.
|
|
562
562
|
*/
|
|
563
563
|
function resolves(target: string, dir: string, root: string): boolean {
|
package/standards/groundwork.md
CHANGED
|
@@ -156,7 +156,7 @@ A lean is weaker than the suggestion a plan file carries. It records the current
|
|
|
156
156
|
## Conventions
|
|
157
157
|
|
|
158
158
|
- State a number with what it settles. The strongest sections are the ones where a measurement answers a named question and says so.
|
|
159
|
-
- Route a finding that would change an existing standard or rule through `
|
|
159
|
+
- Route a finding that would change an existing standard or rule through `plan-intake`. Only a demonstrated failure changes one.
|
|
160
160
|
- Let the file count follow the number of genuinely separable questions, not the importance of the topic. A large topic with one question is a small folder.
|
|
161
161
|
|
|
162
162
|
## Anti-patterns
|
package/standards/snippets.md
CHANGED
|
@@ -38,7 +38,7 @@ Overlapping a skill that does the same job is not disqualifying on its own. A sn
|
|
|
38
38
|
## Use patterns
|
|
39
39
|
|
|
40
40
|
- Run-as-is: invoke and send immediately. The snippet is self-contained and needs no extra context.
|
|
41
|
-
- Invoke-then-add-context: invoke the snippet, then append specifics in the same message (e.g. invoke `
|
|
41
|
+
- Invoke-then-add-context: invoke the snippet, then append specifics in the same message (e.g. invoke `plan-feature`, then add the feature name or extra constraints)
|
|
42
42
|
- Invoke-on-history: invoke after a discussion. The snippet uses prior conversation as implicit context with no additional input needed (e.g. invoke `claude-figma` after discussing a design).
|
|
43
43
|
|
|
44
44
|
## Authoring
|
package/standards/tasks.md
CHANGED
|
@@ -47,7 +47,7 @@ The handoff takes one file per session for the reason a task does. A single shar
|
|
|
47
47
|
|
|
48
48
|
The catalog is the one reader that filters nothing, so it carries a row per sibling alongside the tasks. That is what a folder catalog is for, and the handoffs are what make it worth stating: a board accumulates one row per session that ever wrote one, with nothing pruning them. Anything reading the catalog as the backlog therefore does its own filtering, and a reader that takes every row as a task reports the handoffs as queued work.
|
|
49
49
|
|
|
50
|
-
The `
|
|
50
|
+
The `task-board` skill creates and archives task files, and the archive carries the task's plan with it. `docs-fold` marks outcomes `[x]` in an existing file. Neither does the other's job.
|
|
51
51
|
|
|
52
52
|
## Ordering
|
|
53
53
|
|
|
@@ -219,9 +219,9 @@ A project that archived plans before the folder nested under `.canon/plans/` hol
|
|
|
219
219
|
|
|
220
220
|
One plan per task. A plan cited by two tasks is a misfile rather than a shape to design for, which is why the sweep counts citations before archiving: the count is a guard against the misfile stranding a pointer, not support for the shape.
|
|
221
221
|
|
|
222
|
-
`canon tasks plan-link <task> <plan>` writes or corrects the `Plan:` line, mirroring how `canon tasks pull-request` writes its own. `
|
|
222
|
+
`canon tasks plan-link <task> <plan>` writes or corrects the `Plan:` line, mirroring how `canon tasks pull-request` writes its own. `plan-feature` calls it right after the plan file lands, when an existing task names the feature, so the line is a mechanical write rather than hand-edited markdown.
|
|
223
223
|
|
|
224
|
-
`Groundwork:` points at `../groundwork/<slug>/`, the folder `
|
|
224
|
+
`Groundwork:` points at `../groundwork/<slug>/`, the folder `plan-groundwork` fills. It names the surface it points at the way `Plan:` does. Use this key alone. `Research record` and `Decision record` are earlier spellings of the same thing and both convert to it.
|
|
225
225
|
|
|
226
226
|
`Intake:` points at `../intake/<slug>/`, the folder an intake pass fills. Use it rather than `Groundwork:`, because a groundwork track measures one question in depth while an intake dispositions many across a tree, and one key covering both loses which kind of pass produced the task. The line names the folder rather than an item inside it. A task routinely promotes several items at once, so an anchored line would name one and drop the rest, and the item numbers belong in that task's `## Findings`.
|
|
227
227
|
|
package/standards/teach.md
CHANGED
|
@@ -15,7 +15,7 @@ Governs a learning workspace under `.canon/teach/<nn>-<topic>/`: folder layout,
|
|
|
15
15
|
|
|
16
16
|
Does not govern:
|
|
17
17
|
|
|
18
|
-
- The frontmatter, entry shape, and ordering of the glossary the workspace holds: the `
|
|
18
|
+
- The frontmatter, entry shape, and ordering of the glossary the workspace holds: the `teach-workspace` skill, which carries that reference
|
|
19
19
|
- What a lesson teaches, how it sequences difficulty, and what makes one worth returning to, which belong to the surface driving the workspace
|
|
20
20
|
- Where a durable page goes once it leaves the workspace, which belongs to the routing test the destination surface states
|
|
21
21
|
- One question measured in depth before anyone can plan against it: `groundwork.md`
|
|
@@ -113,7 +113,7 @@ Take the date and the rung from what the surface driving the workspace reports r
|
|
|
113
113
|
|
|
114
114
|
## GLOSSARY.md
|
|
115
115
|
|
|
116
|
-
Required in every workspace, holding one entry per term the subject defines. The glossary reference the `canon:
|
|
116
|
+
Required in every workspace, holding one entry per term the subject defines. The glossary reference the `canon:teach-workspace` skill carries fixes what an entry looks like, how the file orders and groups them, and which terms it carries, so this standard states only that the file exists and sits at the workspace root. That reference ships with the plugin rather than installing here, because a promoted glossary keeps its shape wherever it lands and no project folder covers every destination. Say so and stop rather than working the shape from memory when the project has no plugin to read it from.
|
|
117
117
|
|
|
118
118
|
Name the lesson or reference page a term first appears in as that reference requires. A workspace is the case it was written for, so a glossary here has a first appearance to name.
|
|
119
119
|
|
|
@@ -7,10 +7,10 @@
|
|
|
7
7
|
# to hand a worker. This is the only event that lands after a merge.
|
|
8
8
|
#
|
|
9
9
|
# Candidates rather than closed tasks, because an all-`[x]` board entry does not
|
|
10
|
-
# mean the work merged. `
|
|
10
|
+
# mean the work merged. `docs-fold` marks outcomes on the branch as step 1 of
|
|
11
11
|
# the ship chain, so a task can read closed while its pull request is still open
|
|
12
12
|
# or already abandoned. The board is gitignored and an archived task has nothing
|
|
13
|
-
# to recover it, so `
|
|
13
|
+
# to recover it, so `task-board` confirms the work is on `main` before moving
|
|
14
14
|
# anything and this output says so rather than implying the check is done.
|
|
15
15
|
#
|
|
16
16
|
# It announces and never moves a file. The board is gitignored, so a shell-side
|
|
@@ -58,4 +58,4 @@ done
|
|
|
58
58
|
|
|
59
59
|
printf '\n📋 %s archive candidate(s) on the board:\n%s\n' "$count" "$closed"
|
|
60
60
|
printf 'Outcomes are marked on the branch, so each still needs its work confirmed\n'
|
|
61
|
-
printf 'on main. Run /
|
|
61
|
+
printf 'on main. Run /task-board, which checks that and sweeps the plan first.\n\n'
|
|
@@ -20,8 +20,8 @@ The claude stack installs the `.claude/` workflow directory into a project. Stat
|
|
|
20
20
|
.canon/
|
|
21
21
|
├── tasks/ ← seeded. One file per task plus a generated index.md, local scratch only. `archive/` holds the tasks that shipped.
|
|
22
22
|
├── diagrams/ ← seeded. Per-kind Mermaid views. `index.md` is the discovery anchor. `<kind>.md` files hold one diagram each, grouped by the `category` frontmatter field.
|
|
23
|
-
├── plans/ ← execution detail for multi-step tasks. `feature-*.md` entries swept by
|
|
24
|
-
├── review/ ← one subfolder per producer. `branch/` for
|
|
23
|
+
├── plans/ ← execution detail for multi-step tasks. `feature-*.md` entries swept by docs-fold into `archive/`.
|
|
24
|
+
├── review/ ← one subfolder per producer. `branch/` for review-branch, `feedback/` for canon feedback, `memory/` for memory-review with its own `archive/`, `design/` for canon design render.
|
|
25
25
|
├── tmp/ ← ephemeral scratch space, safe to delete without loss
|
|
26
26
|
└── memory/ ← session facts no context entry owns. `index.md` regenerated by a hook.
|
|
27
27
|
```
|
|
@@ -48,7 +48,7 @@ Convert by hand, once per project:
|
|
|
48
48
|
|
|
49
49
|
## Upgrading a hand-appended memory index
|
|
50
50
|
|
|
51
|
-
A project installed before the memory folder gained a generated index still holds `.canon/memory/MEMORY.md`, and its entries still carry `name` and `type` frontmatter. Nothing migrates it. `
|
|
51
|
+
A project installed before the memory folder gained a generated index still holds `.canon/memory/MEMORY.md`, and its entries still carry `name` and `type` frontmatter. Nothing migrates it. `memory-capture` stops appending rows once the new seed lands, so the old file freezes at whatever it held while the folder keeps growing past it.
|
|
52
52
|
|
|
53
53
|
Convert by hand, once per project:
|
|
54
54
|
|
|
@@ -58,7 +58,7 @@ Convert by hand, once per project:
|
|
|
58
58
|
|
|
59
59
|
## Upgrading from a single-file diagram set
|
|
60
60
|
|
|
61
|
-
A project installed before the diagram surface became a folder still holds `.claude/DIAGRAMS.md`. Unlike the board, this one migrates itself. The `
|
|
61
|
+
A project installed before the diagram surface became a folder still holds `.claude/DIAGRAMS.md`. Unlike the board, this one migrates itself. The `draft-diagram` skill reads the flat file when `.canon/diagrams/` holds no entries, splits it by kind into the folder, and reports what it wrote. The old file stays on disk so the split can be compared against its source, and deleting it is a manual step once that check passes.
|
|
62
62
|
|
|
63
63
|
## Gitignore
|
|
64
64
|
|
|
@@ -79,7 +79,7 @@ The first entry covers the whole record root, so a record folder added later nee
|
|
|
79
79
|
- Ships as a seed with placeholder project name, description, and key paths. Fill these in after init.
|
|
80
80
|
- Section layout: `Context`, `Indexes`, `Markdown`, `Key paths`, `Spelling`, `Snippets`, `Tasks`, `Memory`. Each section groups rules that share a surface so skills can detect, extend, or skip by heading.
|
|
81
81
|
- The memory rules favor signal over volume. Saving only after a second occurrence or an explicit user correction keeps entries focused on patterns worth preventing, not first-occurrence slips. The 3-line cap stops the built-in auto-memory from drifting into narrative writeups that bury the rule underneath the recovery story.
|
|
82
|
-
- The `Context` section points at `.claude/` state docs one line. `
|
|
82
|
+
- The `Context` section points at `.claude/` state docs one line. `plan-feature` does the parallel read when invoked. The seed intentionally does not re-list every file.
|
|
83
83
|
|
|
84
84
|
## Seed docs
|
|
85
85
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env bash
|
|
2
2
|
|
|
3
3
|
# Reminds a worker session of the pull-request announcement it owes and logs
|
|
4
|
-
# the creation as a denominator for the miss rate `
|
|
4
|
+
# the creation as a denominator for the miss rate `role-worker` cannot
|
|
5
5
|
# measure on its own. Follows path-form.sh's precedent: a PostToolUse hook
|
|
6
6
|
# returning hookSpecificOutput.additionalContext is the shipped route back
|
|
7
7
|
# into a session's own turn.
|
|
@@ -51,5 +51,5 @@ mkdir -p "$log_dir"
|
|
|
51
51
|
session=$(printf '%s' "$input" | jq -r '.session_id // "unknown"')
|
|
52
52
|
printf -- '- %s session=%s pr=%s\n' "$(date -u +%Y-%m-%dT%H:%M:%SZ)" "$session" "$url" >>"$log_dir/log.md"
|
|
53
53
|
|
|
54
|
-
msg="Pull request $url just opened. If this session holds a worker's channel obligation, announce it to the controller now, per
|
|
54
|
+
msg="Pull request $url just opened. If this session holds a worker's channel obligation, announce it to the controller now, per role-worker."
|
|
55
55
|
jq -nc --arg msg "$msg" '{hookSpecificOutput:{hookEventName:"PostToolUse",additionalContext:$msg}}'
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|