@erclx/aitk 0.82.1 → 0.83.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-docs/SKILL.md +3 -1
- package/docs/agents/capture.md +3 -1
- package/docs/agents/install-and-sync.md +3 -1
- package/docs/agents/markdown-audit.md +6 -2
- package/docs/agents/records.md +3 -0
- package/docs/ai-workflow.md +6 -2
- package/docs/target-projects.md +7 -1
- package/docs/visual-design-workflow.md +3 -1
- package/package.json +1 -1
- package/standards/index.md +1 -1
- package/standards/markdown.md +1 -0
- package/standards/publish.md +13 -3
- package/standards/tasks.md +3 -1
- package/tooling/claude/manifest.toml +1 -1
|
@@ -213,7 +213,9 @@ A plan can serve more than one task, and archiving on the first task to close st
|
|
|
213
213
|
|
|
214
214
|
Write the retarget as a markdown link, `Plan: [feature-<slug>](../plans-archive/feature-<slug>.md)`, updating both halves so the text and the target stay in step. This branch is the only writer that produces a `Plan:` line nobody authored by hand, so a retarget that emits a bare path converts every task to the old form as it closes and drifts the board back to two shapes on its own.
|
|
215
215
|
|
|
216
|
-
**Reviews.** Derive `<slug>` per `.claude/standards/slug.md`, or `${CLAUDE_SKILL_DIR}/../../standards/slug.md` when the project does not have it. Fall back to `latest` on an empty result.
|
|
216
|
+
**Reviews.** Derive `<slug>` per `.claude/standards/slug.md`, or `${CLAUDE_SKILL_DIR}/../../standards/slug.md` when the project does not have it. Fall back to `latest` on an empty result.
|
|
217
|
+
|
|
218
|
+
If `.claude/review/review-<slug>.md` exists, delete it. `claude-review` writes with this convention. Do not sweep any other `review-*.md` file.
|
|
217
219
|
|
|
218
220
|
Do not sweep `ui-checklist-*.md` (pending human verification) or `ux-audit-*.md` (standalone deliverable).
|
|
219
221
|
|
package/docs/agents/capture.md
CHANGED
|
@@ -13,7 +13,9 @@ aitk capture assets/install.html
|
|
|
13
13
|
aitk capture assets --out .claude/review/captures
|
|
14
14
|
```
|
|
15
15
|
|
|
16
|
-
`assets/` now holds two sources, so a bare `aitk capture` rebuilds both. `install.html` is hand-authored and its text came from a real run. `hero.html` is generated by `scripts/core/regen-hero.sh` from the CLI catalogs and must not be edited by hand, since `bun run check` regenerates it and fails on the difference.
|
|
16
|
+
`assets/` now holds two sources, so a bare `aitk capture` rebuilds both. `install.html` is hand-authored and its text came from a real run. `hero.html` is generated by `scripts/core/regen-hero.sh` from the CLI catalogs and must not be edited by hand, since `bun run check` regenerates it and fails on the difference.
|
|
17
|
+
|
|
18
|
+
Only the HTML is asserted for drift. The PNG is a chromium render whose bytes move with the browser version, so rebuild it with `aitk capture assets/hero.html` when the check reports the HTML changed.
|
|
17
19
|
|
|
18
20
|
| Option | Behavior |
|
|
19
21
|
| ------------------ | ------------------------------------------------- |
|
|
@@ -271,7 +271,9 @@ so this section reports and gates nothing.
|
|
|
271
271
|
`aitk init` installs up to six core domains and reports each one independently. A
|
|
272
272
|
domain that fails does not abort the run, so the command finishes the rest and
|
|
273
273
|
exits 1 naming the failures. Passing any flag skips the confirmation prompt,
|
|
274
|
-
which is what makes it scriptable.
|
|
274
|
+
which is what makes it scriptable.
|
|
275
|
+
|
|
276
|
+
`--stack` defaults to `base`, and the default
|
|
275
277
|
does not read as a passed flag, so a bare `aitk init` installs governance and
|
|
276
278
|
still prompts. `--skip` takes `wiki`, `standards`, and `governance`, and warns
|
|
277
279
|
without aborting on any other value. `--standards` defaults to `all` and reaches
|
|
@@ -96,9 +96,11 @@ Exit codes are `0` for a completed run with no gating finding, `1` for a refusal
|
|
|
96
96
|
|
|
97
97
|
A banned character is a fact rather than a judgment, which is the test that admits it to a gate. What held it back was that gating on day one against a corpus never checked mechanically fails loudly on work nobody has had a chance to fix. The order was to land the verb reporting, measure the corpus once, fix what it finds, and turn the gate on as its own change, and the gate is the last of the four.
|
|
98
98
|
|
|
99
|
-
Measured at `4b7b13a2` across 444 files with the paragraph checkpoint at 600: 8 word hits, no character or spelling hits, 119 heavy bullets, 221 heavy paragraphs across 86 files, and 41 files carrying a run past the depth checkpoint. Of the paragraphs, 88 fire on weight alone.
|
|
99
|
+
Measured at `4b7b13a2` across 444 files with the paragraph checkpoint at 600: 8 word hits, no character or spelling hits, 119 heavy bullets, 221 heavy paragraphs across 86 files, and 41 files carrying a run past the depth checkpoint. Of the paragraphs, 88 fire on weight alone. That is the baseline the corpus sweep started from, and the ban count is the only one of the five a gate should ever read.
|
|
100
100
|
|
|
101
|
-
The ban half
|
|
101
|
+
The ban half reached zero, which was the precondition the gate waited on, and it was re-measured against the same corpus at the moment the gate landed. Three sweep slices then took the structural half, and the corpus reports 1 heavy bullet and 22 heavy paragraphs across 6 files on 2026-08-06, every one on a ground the triage record holds as exempt.
|
|
102
|
+
|
|
103
|
+
Depth is the one measure no slice triaged, so its figure moved with the sweep rather than with the corpus. Read all four structural counts from a run rather than from this paragraph.
|
|
102
104
|
|
|
103
105
|
### What a hit asks of an author
|
|
104
106
|
|
|
@@ -146,4 +148,6 @@ The verb reads the two attribute standards and nothing else. The five standards
|
|
|
146
148
|
|
|
147
149
|
`publish.md` describes a scan applying the same punctuation bans to finished text on its way out. No code implemented that scan before this command, so nothing is duplicated, and a later surface should call this verb rather than build a second one.
|
|
148
150
|
|
|
151
|
+
That standard's cross-reference rule is out of reach rather than merely unimplemented. It resolves by destination, bare where the destination auto-links a pull request or issue number and backticked where it does not, so this verb sees only the half where the backticked form is correct. A check here would report every compliant reference in the tree and reach none of the published text that goes wrong, which is why the rule holds on reading alone.
|
|
152
|
+
|
|
149
153
|
The list-density rule at `standards/markdown.md` is out of scope on purpose, since it carries no number and what a density figure should measure is still open.
|
package/docs/agents/records.md
CHANGED
|
@@ -78,8 +78,11 @@ A person creates the records repository once per machine, and the verbs refuse w
|
|
|
78
78
|
```bash
|
|
79
79
|
git --git-dir=.claude/.records.git init
|
|
80
80
|
git --git-dir=.claude/.records.git remote add origin <private-repo-url>
|
|
81
|
+
printf '.claude/.records.git/\n' >> .gitignore
|
|
81
82
|
```
|
|
82
83
|
|
|
84
|
+
The ignore line is part of the setup rather than part of the installed gitignore group, because the person running these commands is the one who creates the directory. Every path that group ships is written by a toolkit command without anyone asking, and this one is not, so a project that never sets up records would carry a rule for a directory it will never hold. Leaving it out and adding it here puts the rule where whoever creates the directory reads it.
|
|
85
|
+
|
|
83
86
|
Point it at a private repository, and at one that is not a remote of the project. Records carry the memory pen, the review reports, and the groundwork trails, so a public project publishes all of it to anyone who fetches all refs. `push` compares the configured origin against every remote of the project and refuses on a match. A read of that list which fails refuses as well, since an empty list clears the comparison for every origin and a gate that passes on its own failure is no gate.
|
|
84
87
|
|
|
85
88
|
### Refusals
|
package/docs/ai-workflow.md
CHANGED
|
@@ -89,7 +89,9 @@ An execution that picks other than the suggestion rewrites the `- Suggested:` li
|
|
|
89
89
|
|
|
90
90
|
`aitk records validate plans` reports where a plan and that standard disagree: a filename that is not `feature-<slug>.md`, a missing required section, a files-to-touch entry naming no file, and a question carrying a suggestion with no answer slot. The same verb takes `groundwork`, `intake`, and `memory`, which are governed the same way and were unreachable for the same reason. Nothing fires it automatically, because all four folders are gitignored and every check the repository runs reads changed files from git. It reports and never writes, since the folders are per-machine scratch with no history to recover a wrong repair from.
|
|
91
91
|
|
|
92
|
-
`aitk records push` carries these folders off the disk they live on, and `aitk records pull` brings them back. Eight of them are backed: `groundwork`, `intake`, `memory`, `plans`, `plans-archive`, `review`, `task-archive`, and `tasks`. The history lives in a second git directory at `.claude/.records.git` with `.claude/` as its work tree, so every path a task file cites stays where it is.
|
|
92
|
+
`aitk records push` carries these folders off the disk they live on, and `aitk records pull` brings them back. Eight of them are backed: `groundwork`, `intake`, `memory`, `plans`, `plans-archive`, `review`, `task-archive`, and `tasks`. The history lives in a second git directory at `.claude/.records.git` with `.claude/` as its work tree, so every path a task file cites stays where it is.
|
|
93
|
+
|
|
94
|
+
A person points it at a private repository once and both verbs refuse until they have, and `push` refuses when that origin is also a remote of the project, since the payload is the memory pen and the groundwork trails. `.husky/post-merge` runs the push after its archive loop, on every merge rather than only on one that closed a task. See [records](agents/records.md) for the refusal table.
|
|
93
95
|
|
|
94
96
|
A plan that ships is archived, never deleted. `aitk:claude-docs` moves it to `.claude/plans-archive/` and retargets the task file's `Plan:` line at the new location, so a completed task still leads to the reasoning behind it. Both folders are gitignored, which is why a deleted plan had no recovery path. A plan cited by more than one task stays put until the last of them closes, since moving it early would strand every other pointer.
|
|
95
97
|
|
|
@@ -97,7 +99,9 @@ The sweep reads the whole board rather than the tasks the session touched. It is
|
|
|
97
99
|
|
|
98
100
|
`aitk:claude-docs` decides which task closed by reading the diff rather than the conversation. It resolves a merge base against `origin/main`, unions the committed diff with the working tree and untracked files, then matches unchecked outcomes on the board against what shipped. A task that shipped without ever being discussed still gets marked. Requirements, architecture, and design stay session-sourced, because a diff cannot carry a judgment.
|
|
99
101
|
|
|
100
|
-
`.claude/tasks/` is gitignored and resolves at the main worktree root, so every session shares one board. One file per task is what keeps concurrent sessions from overwriting each other, since a gitignored board has no history to recover a lost write from. Its `index.md` is generated by a hook rather than by `bun run check`, because the whole-repo index walk skips gitignored folders.
|
|
102
|
+
`.claude/tasks/` is gitignored and resolves at the main worktree root, so every session shares one board. One file per task is what keeps concurrent sessions from overwriting each other, since a gitignored board has no history to recover a lost write from. Its `index.md` is generated by a hook rather than by `bun run check`, because the whole-repo index walk skips gitignored folders.
|
|
103
|
+
|
|
104
|
+
`.claude/memory/` carries the same arrangement, its own hook regenerating `index.md` from each entry's `title`, `description`, and `category`. A hand-maintained `priority.md` sits beside it carrying execution order and what each task is waiting on, which the alphabetical index cannot express.
|
|
101
105
|
|
|
102
106
|
`aitk tasks validate` checks what those rows claim against what the tree holds: every plan pointer resolves, every row and task file map one to one, no task sits in two groups, and no two rows marked ready touch the same file. That last check is the half a reader cannot run by eye, and it is what keeps two workers from being handed colliding work. It reports and never writes, because a row is the orchestrator's claim and a validator repairing one would assert the claim it exists to test. Nothing fires it automatically, since the board is gitignored per-machine scratch with no shared moment to hang a hook on, so the orchestrator's sweep calls it at the point the readiness claim is made.
|
|
103
107
|
|
package/docs/target-projects.md
CHANGED
|
@@ -124,7 +124,13 @@ That third one matters most on an older project. Before it existed, a target hol
|
|
|
124
124
|
|
|
125
125
|
The fourth cause runs backwards. Every one above starts from what the toolkit ships and asks whether the target matches, so a folder the toolkit dropped appears in none of them. `reverse` walks the target instead and reports a folder sitting at a top-level path the toolkit once shipped and has since deleted.
|
|
126
126
|
|
|
127
|
-
Each entry carries a verdict, since a dropped folder and one the project wrote are the same bytes at the same path.
|
|
127
|
+
Each entry carries a verdict, since a dropped folder and one the project wrote are the same bytes at the same path.
|
|
128
|
+
|
|
129
|
+
- `dropped` names the commit that published the content
|
|
130
|
+
- `unattributed` means the toolkit shipped that path and the content matches no version it published
|
|
131
|
+
- `project` means the folder only shares a retired name
|
|
132
|
+
|
|
133
|
+
Nothing acts on any of them, and the verdict is what makes the list safe to read.
|
|
128
134
|
|
|
129
135
|
The same field names a proposal-only skill with a live case here under `migrations`, which is how `aitk:migration-claude-md` and `aitk:migration-context` become reachable. Each entry carries the measurement behind the proposal rather than the proposal alone.
|
|
130
136
|
|
|
@@ -14,7 +14,9 @@ Two tools anchor tier 1 and tier 2. [Stitch](../wiki/tools/stitch.md) is the age
|
|
|
14
14
|
|
|
15
15
|
## Tier 0: prose only
|
|
16
16
|
|
|
17
|
-
The default. `.claude/DESIGN.md` holds visual intent as prose plus token tables for color, typography, spacing, borders, motion, and iconography. `.claude/WIREFRAMES.md` holds ASCII layouts.
|
|
17
|
+
The default. `.claude/DESIGN.md` holds visual intent as prose plus token tables for color, typography, spacing, borders, motion, and iconography. `.claude/WIREFRAMES.md` holds ASCII layouts.
|
|
18
|
+
|
|
19
|
+
Claude Code reads both and writes the implementation. Works for CLI tools, internal dashboards, admin panels, and backend-focused projects.
|
|
18
20
|
|
|
19
21
|
### Seed shape
|
|
20
22
|
|
package/package.json
CHANGED
package/standards/index.md
CHANGED
|
@@ -17,7 +17,7 @@ Reference docs for consistent authoring across the toolkit and target projects.
|
|
|
17
17
|
- [Memory reference](memory.md): Filename and type prefix, frontmatter, the body shape per type, links between entries, and the lifecycle from write to retire
|
|
18
18
|
- [Plan reference](plan.md): Filename and slug, required sections, the suggested-and-answer contract, and the lifecycle from the live folder to the archive
|
|
19
19
|
- [Prose reference](prose.md): Voice, language, and frontmatter wording for reference markdown
|
|
20
|
-
- [Publish reference](publish.md): Scan
|
|
20
|
+
- [Publish reference](publish.md): Scan an author runs against finished text, the cross-reference form each destination takes, and the response to an unreadable source
|
|
21
21
|
- [Readme reference](readme.md): Readme voice, structure, and content conventions
|
|
22
22
|
- [Requirements reference](requirements.md): Shape and content rules for .claude/REQUIREMENTS.md
|
|
23
23
|
- [Governance rule reference](rule.md): Rule frontmatter, body shape, and voice for .claude/rules files
|
package/standards/markdown.md
CHANGED
|
@@ -17,6 +17,7 @@ Does not govern:
|
|
|
17
17
|
- What sections a document has, or what belongs in each: the standard for that document type
|
|
18
18
|
- The text inside a fenced block, which follows the conventions of its own language rather than these
|
|
19
19
|
- The scan that applies the punctuation bans to finished text on its way out: `publish.md`
|
|
20
|
+
- Whether a pull request or issue number is backticked, which turns on where the text is published rather than on the text: `publish.md`
|
|
20
21
|
|
|
21
22
|
## Headings
|
|
22
23
|
|
package/standards/publish.md
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
---
|
|
2
2
|
title: Publish reference
|
|
3
|
-
description: Scan
|
|
3
|
+
description: Scan an author runs against finished text, the cross-reference form each destination takes, and the response to an unreadable source
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Publish reference
|
|
7
7
|
|
|
8
8
|
## Scope
|
|
9
9
|
|
|
10
|
-
Governs the scan an author runs against finished text on its way out, and the responses available when a source it reaches for cannot be read. It is an attribute standard rather than a document-type one, so it applies
|
|
10
|
+
Governs the scan an author runs against finished text on its way out, the form a pull request or issue reference takes in every destination, and the responses available when a source it reaches for cannot be read. It is an attribute standard rather than a document-type one, so it applies wherever no automated check covers the text, whether that text is leaving through a channel or sitting in the repository, and it carries no template because a scan has no document to shape.
|
|
11
11
|
|
|
12
12
|
Does not govern:
|
|
13
13
|
|
|
@@ -32,7 +32,17 @@ Restructure the sentence rather than substituting the character. A semicolon swa
|
|
|
32
32
|
|
|
33
33
|
`versioning.md` holds the label rule and the table of surfaces. Read it at scan time rather than working the format from memory.
|
|
34
34
|
|
|
35
|
-
Scope this check by destination. Text published to a remote takes it. Text scanned on its way into the repository, where the reader has the task board,
|
|
35
|
+
Scope this check by destination. Text published to a remote takes it. Text scanned on its way into the repository, where the reader has the task board, skips it.
|
|
36
|
+
|
|
37
|
+
## Cross-reference form
|
|
38
|
+
|
|
39
|
+
A number referring to a pull request or an issue takes the form its destination renders. Write it bare where the destination auto-links it, and in backticks where it does not. Both spellings are correct, each in one place, so a reference moved from one destination to the other is rewritten rather than copied.
|
|
40
|
+
|
|
41
|
+
Text published to a remote is the auto-linking half: a pull request body, an issue body, a comment on either, and a commit message. Write `#123` there, and `owner/repo#123` where the reference crosses repositories, which the same auto-linking reaches. A markdown file browsed from the repository tree is the other half, where neither spelling links and the backticked one marks the number as an identifier.
|
|
42
|
+
|
|
43
|
+
A commit message takes the bare form even though it is also read through the log, where nothing links. The remote is what the form is chosen for, since a reader in the log loses only a link that plain text never carried.
|
|
44
|
+
|
|
45
|
+
Text quoted from another surface keeps the spelling it arrived with. A reference inside a quotation belongs to what is being quoted rather than to the text doing the quoting, so rewriting it reports the source as having said something it never said.
|
|
36
46
|
|
|
37
47
|
## An unreadable source
|
|
38
48
|
|
package/standards/tasks.md
CHANGED
|
@@ -54,7 +54,9 @@ Readiness is three groups under fixed headings, `## Run now`, `## Up next`, and
|
|
|
54
54
|
- `## Up next`: a written plan exists, and the task carries a stated reason it cannot start. The `Waiting on` column names that reason.
|
|
55
55
|
- `## Needs a plan`: everything else. The task has no plan, or the plan it carries no longer describes the work.
|
|
56
56
|
|
|
57
|
-
Each group fixes its own columns, which follow from the test above it rather than from preference. Neither half of the `## Run now` test is checkable without the file set and the plan sitting beside the task.
|
|
57
|
+
Each group fixes its own columns, which follow from the test above it rather than from preference. Neither half of the `## Run now` test is checkable without the file set and the plan sitting beside the task.
|
|
58
|
+
|
|
59
|
+
The `Waiting on` column under `## Up next` carries that reason in one of three forms. `## Needs a plan` states no file set at all, because a task with no plan has no bounded one to state. A group with no rows keeps its heading and its header row.
|
|
58
60
|
|
|
59
61
|
Under `## Up next` a collision names the file held by the task already running, a sibling task names that task, and an external condition names both the condition and what would satisfy it. Naming what would satisfy it is what separates a blocked row from one nobody has examined, so a cell stating a condition with no way out of it fails the test. The header text is the contract the way the group names are, because anything reading the cell resolves the column by header rather than by position.
|
|
60
62
|
|
|
@@ -8,4 +8,4 @@ runtime = ""
|
|
|
8
8
|
scaffold = ""
|
|
9
9
|
|
|
10
10
|
[gitignore]
|
|
11
|
-
"# Claude" = [".claude/.
|
|
11
|
+
"# Claude" = [".claude/.tmp/", ".claude/groundwork/", ".claude/intake/", ".claude/memory/", ".claude/plans/", ".claude/plans-archive/", ".claude/review/", ".claude/task-archive/", ".claude/worktrees/", ".claude/tasks/"]
|