@erclx/aitk 3.15.0 → 3.17.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.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "aitk",
3
3
  "description": "Automated governance, versioning, and discovery tools for Claude Code.",
4
- "version": "3.15.0",
4
+ "version": "3.17.0",
5
5
  "author": {
6
6
  "name": "Eric Le",
7
7
  "url": "https://github.com/erclx"
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: bash-script
3
- description: Generates production Bash scripts with a visual timeline UI, state-based interactive prompts, and strict error handling. Use when asked to write an interactive or human-facing bash or shell script, or a DevOps tool with framed terminal output. Do NOT use for a non-interactive automation, CI, or pipeline script, that is `cli-script`.
3
+ description: Generates production Bash scripts with a visual timeline UI, state-based interactive prompts, and strict error handling. Use when asked for "a human-facing shell tool", an interactive bash script, or a DevOps tool with framed terminal output. Do NOT use for a non-interactive automation, CI, or pipeline script, that is `cli-script`.
4
4
  ---
5
5
 
6
6
  # Bash script
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: ci-workflow
3
- description: Generates GitHub Actions CI workflow files with parallel jobs, emoji job names, and gated deploy stages. Use when asked to write a CI workflow, add GitHub Actions, set up a CI pipeline, or create a `.github/workflows` file.
3
+ description: Generates GitHub Actions CI workflow files with parallel jobs, emoji job names, and gated deploy stages. Use when asked to "write a CI workflow", add GitHub Actions, set up a CI pipeline, or create a `.github/workflows` file.
4
4
  ---
5
5
 
6
6
  # CI workflow
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: cli-script
3
- description: Generates non-interactive Bash scripts for automation, CI, and agent-run tasks. Lean functional style with structured logging, strict error handling, and a clean stdout, no interactive UI. Use when asked for an automation script, a CI or cron script, a pipeline helper, or a non-interactive shell script. Do NOT use for a human-facing interactive tool with prompts or a visual timeline UI, that is `bash-script`.
3
+ description: Generates non-interactive Bash scripts for automation, CI, and agent-run tasks. Lean functional style with structured logging, strict error handling, and a clean stdout, no interactive UI. Use when asked for "a non-interactive shell script", an automation script, a CI or cron script, or a pipeline helper. Do NOT use for a human-facing interactive tool with prompts or a visual timeline UI, that is `bash-script`.
4
4
  ---
5
5
 
6
6
  # CLI script
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: create-skill
3
- description: Creates a new `SKILL.md` in `.claude/skills/`. Use when asked to create a skill, add a skill, or make a new skill.
3
+ description: Creates a new `SKILL.md` in `.claude/skills/`. Use when asked to "create a skill", add a skill, or make a new skill.
4
4
  disable-model-invocation: true
5
5
  ---
6
6
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: create-snippet
3
- description: Creates a new snippet file in `snippets/` or `.claude/snippets/`. Use when asked to create a snippet, add a snippet, write a reusable prompt, or make a new snippet. Do NOT use to edit an existing snippet.
3
+ description: Creates a new snippet file in `snippets/` or `.claude/snippets/`. Use when asked to "create a snippet", add a snippet, write a reusable prompt, or make a new snippet. Do NOT use to edit an existing snippet.
4
4
  ---
5
5
 
6
6
  # Create snippet
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: create-standard
3
- description: Creates a new standard file in `standards/`. Use when asked to create a standard, add a standard, or write a new authoring convention. Do NOT use to edit an existing standard.
3
+ description: Creates a new standard file in `standards/`. Use when asked to "create a standard", add a standard, or write a new authoring convention. Do NOT use to edit an existing standard.
4
4
  ---
5
5
 
6
6
  # Create standard
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: decision-escalate
3
- description: Collects every open decision whose answer turns on the operator's preference, puts them as one batch of questions each carrying options and a recommended default, then waits. Use when asked to "escalate this", "ask me the open questions", "batch the open decisions", "what do you need from me", or "stop and ask before you pick". Do NOT use for a judgment call the session can settle, which is a pick with the tradeoff stated in one sentence.
3
+ description: Collects every open decision whose answer turns on the operator's preference, since only they know what they need, puts them as one batch of questions each carrying options and a recommended default, then waits. Use when asked to "escalate this", "ask me the open questions", "batch the open decisions", "what do you need from me", or "stop and ask before you pick". Do NOT use for a judgment call the session can settle, which is a pick with the tradeoff stated in one sentence.
4
4
  disable-model-invocation: true
5
5
  ---
6
6
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: git-branch
3
- description: Generates and validates conventional branch names. Use for any branch naming or renaming.
3
+ description: Generates and validates conventional branch names. Use for any branch naming or renaming, such as when asked to "name this branch".
4
4
  ---
5
5
 
6
6
  # Git branch
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: git-pr
3
- description: Generates pull request titles and descriptions from git diffs. Use for any PR creation or update.
3
+ description: Generates pull request titles and descriptions from git diffs. Use for any PR creation or update, such as when asked to "open a pull request".
4
4
  ---
5
5
 
6
6
  # Git PR
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: git-stage
3
- description: Groups staged files by concern and generates one conventional commit per group. Use when staged changes span multiple concerns and need to ship as separate commits. Do NOT use on a single-concern staged set. That is `git-commit`, which also preserves a hunk-level selection this skill's unstage and restage over whole files would widen.
3
+ description: Groups staged files by concern and generates one conventional commit per group. Use when asked to "group these changes into commits", or when staged changes span multiple concerns and need to ship as separate commits. Do NOT use on a single-concern staged set. That is `git-commit`, which also preserves a hunk-level selection this skill's unstage and restage over whole files would widen.
4
4
  ---
5
5
 
6
6
  # Git stage
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: youtube-transcripts
3
- description: Fetches a YouTube video transcript with metadata frontmatter into the current repo via `aitk transcripts`. Use when the user pastes a YouTube URL and asks to grab the transcript, pull captions, or save a transcript for context. Do NOT use for downloading the video file, summarizing a transcript that already exists, or non-YouTube links.
3
+ description: Fetches a YouTube video transcript with metadata frontmatter into the current repo via `aitk transcripts`. Use when the user pastes a YouTube URL and asks to "grab the transcript", pull captions, or save a transcript for context. Do NOT use for downloading the video file, summarizing a transcript that already exists, or non-YouTube links.
4
4
  ---
5
5
 
6
6
  # YouTube transcripts
@@ -22,11 +22,11 @@ aitk audits list --json
22
22
 
23
23
  ## What it runs
24
24
 
25
- Eighteen verbs, listed by `aitk audits list`. Each runs once in its fullest form, and the aggregate reads that verb's own record rather than imposing a shared envelope on it. Every one of those records already has consumers naming its keys, so a common shape would be a breaking change bought for tidiness.
25
+ Nineteen verbs, listed by `aitk audits list`. Each runs once in its fullest form, and the aggregate reads that verb's own record rather than imposing a shared envelope on it. Every one of those records already has consumers naming its keys, so a common shape would be a breaking change bought for tidiness.
26
26
 
27
27
  The verbs walk separate trees and share no state, so they run together. Measured on the authoring machine at twelve verbs, a run finished in 0.8 seconds of wall clock against 4.4 seconds of processor, which is under every other stage in `bun run check`. `aitk deps audit` is the one that changes that reading, since it reaches a network rather than a tree and its latency is the index's rather than this machine's.
28
28
 
29
- Fifteen of the eighteen read a tree on this disk, the one added by `restated.md` and the one added by `census.md` among them, since the first reads three such trees against each other and the second counts every file in one. The two added by `state-scoped-risk.md` read committed state rather than an arriving change, which is the gap every review surface here leaves by construction, and the one added by `label-coverage.md` reads a branch range against a map the project declares.
29
+ Sixteen of the nineteen read a tree on this disk, the one added by `restated.md` and the one added by `census.md` among them, since the first reads three such trees against each other and the second counts every file in one. The two added by `state-scoped-risk.md` read committed state rather than an arriving change, which is the gap every review surface here leaves by construction, and the one added by `label-coverage.md` reads a branch range against a map the project declares.
30
30
 
31
31
  Each is invoked as the CLI the caller is running rather than as a global `aitk`. A globally installed binary resolves to the main checkout no matter which worktree is executing, so the aggregate would measure a tree the branch never touched and report a pass over it.
32
32
 
@@ -57,7 +57,7 @@ The verdict is published as a field as well as an exit code. A reader branching
57
57
 
58
58
  A per-machine folder that is not on this disk reports as `absent` and moves neither the verdict nor the exit code. Every one of those folders is gitignored, so a fresh clone and every CI run carry none of them, and counting six expected absences as failures pins the verdict at `incomplete` forever. A signal that never changes is one nobody reads after the second time they see it.
59
59
 
60
- Which refusals count as an absence is declared per audit rather than inferred from the corpus alone. A per-machine corpus counts a missing folder. An upstream corpus counts every reason the advisory verb publishes, since each of the three means there is nothing resolved to measure. Several tracked audits override that default too, wherever the corpus not being there is the ordinary state of a target rather than a broken checkout: the secret scan for a project that publishes nothing, the skill corpora and the citation reach check for a project holding no skills tree, and the context audit for a project that adopted none of the folders it measures.
60
+ Which refusals count as an absence is declared per audit rather than inferred from the corpus alone. A per-machine corpus counts a missing folder. An upstream corpus counts every reason the advisory verb publishes, since each of the three means there is nothing resolved to measure. Several tracked audits override that default too, wherever the corpus not being there is the ordinary state of a target rather than a broken checkout: the secret scan for a project that publishes nothing, the skill corpora, the citation reach check, and the routing measure for a project holding no skills tree, and the context audit for a project that adopted none of the folders it measures.
61
61
 
62
62
  Everything else stays `unmeasured`. That covers a tree git cannot list, which is a broken checkout, and a package declaring no `files` field, where a publish would pack the whole tree and the scan read none of it. Both are a corpus that exists and went unread, so softening either would report a pass over a shipped tree nobody measured.
63
63
 
@@ -37,6 +37,7 @@ Full help: `aitk <command> --help`. Behavior notes for the install and sync verb
37
37
  | `aitk teach resource` | Record sources and leads in a workspace, repeating `--read` or `--lead` as `<title>=<url>` (`--json`) |
38
38
  | `aitk teach glossary` | Add terms to a workspace glossary alphabetically, repeating `--term <term>=<definition>` (`--json`) |
39
39
  | `aitk records validate` | Report a session record or a standard against the standard governing it, per kind (`--json`) |
40
+ | `aitk records migrate` | Rewrite the records a validate finding names a recoverable transform for (`--write`, `--json`) |
40
41
  | `aitk records size` | Report what each record folder holds and how much of it is recent, heaviest first (`--json`) |
41
42
  | `aitk records push` | Commit the nine backed record folders and push them to a private records remote (`--json`) |
42
43
  | `aitk records pull` | Fetch the records remote and write it back, refusing rather than discarding unpushed records (`--json`) |
@@ -47,6 +48,7 @@ Full help: `aitk <command> --help`. Behavior notes for the install and sync verb
47
48
  | `aitk claude skills audit` | Report both skill corpora against the mechanical rules in `standards/skill.md` |
48
49
  | `aitk claude skills drift` | Name the shipped skill bodies rewritten between a given ref and `HEAD`, and the installed version against the newest published (`--json`) |
49
50
  | `aitk claude skills reach` | Report the shipped bodies citing a toolkit path no target project receives, exiting 2 on an unqualified one |
51
+ | `aitk claude skills rank` | Score the shipped catalog's descriptions against a hand-authored case corpus by TF-IDF cosine similarity, reporting rank-one and top-three |
50
52
  | `aitk claude routing` | Report per `CLAUDE.md` section how many bullets name a path and how many of those a path-scoped rule already covers (`--json`) |
51
53
  | `aitk gov test-order` | Report where an implementation reached history ahead of the test covering it (`--json`) |
52
54
  | `aitk gov superseded` | Report where the tree still asserts a value a changed convention no longer produces, keyed on the value (`--json`) |
@@ -66,27 +68,27 @@ Full help: `aitk <command> --help`. Behavior notes for the install and sync verb
66
68
 
67
69
  Each domain exposes a consistent shape where applicable: `list`, `install`, `sync`, `create`.
68
70
 
69
- | Domain | Subcommands |
70
- | ----------- | ---------------------------------------------------------------------------------------------------------------------- |
71
- | `tooling` | `list`, `sync`, `ref`, `create`, `verify`, `inject`, `prune-gitignore` |
72
- | `snippets` | `list`, `install`, `sync`, `create` |
73
- | `standards` | `list`, `<name>` |
74
- | `gov` | `list`, `install`, `sync`, `build`, `regen`, `test-order`, `superseded` |
75
- | `claude` | `init`, `sync`, `routing`, `seeds list`, `skills list`, `skills audit`, `skills drift`, `skills reach`, `setup [dest]` |
76
- | `demo` | `compile`, `run` |
77
- | `wiki` | `init` |
78
- | `design` | `render` |
79
- | `slides` | `render`, `list` |
80
- | `tasks` | `archive`, `validate` |
81
- | `intake` | `list`, `answer` |
82
- | `teach` | `list`, `open`, `resource`, `glossary` |
83
- | `comments` | `scan` |
84
- | `context` | `audit` |
85
- | `markdown` | `audit` |
86
- | `secrets` | `scan` |
87
- | `deps` | `audit` |
88
- | `labels` | `audit` |
89
- | `audits` | `run`, `list` |
71
+ | Domain | Subcommands |
72
+ | ----------- | ------------------------------------------------------------------------------------------------------------------------------------- |
73
+ | `tooling` | `list`, `sync`, `ref`, `create`, `verify`, `inject`, `prune-gitignore` |
74
+ | `snippets` | `list`, `install`, `sync`, `create` |
75
+ | `standards` | `list`, `<name>` |
76
+ | `gov` | `list`, `install`, `sync`, `build`, `regen`, `test-order`, `superseded` |
77
+ | `claude` | `init`, `sync`, `routing`, `seeds list`, `skills list`, `skills audit`, `skills drift`, `skills reach`, `skills rank`, `setup [dest]` |
78
+ | `demo` | `compile`, `run` |
79
+ | `wiki` | `init` |
80
+ | `design` | `render` |
81
+ | `slides` | `render`, `list` |
82
+ | `tasks` | `archive`, `validate` |
83
+ | `intake` | `list`, `answer` |
84
+ | `teach` | `list`, `open`, `resource`, `glossary` |
85
+ | `comments` | `scan` |
86
+ | `context` | `audit` |
87
+ | `markdown` | `audit` |
88
+ | `secrets` | `scan` |
89
+ | `deps` | `audit` |
90
+ | `labels` | `audit` |
91
+ | `audits` | `run`, `list` |
90
92
 
91
93
  Common patterns:
92
94
 
@@ -24,7 +24,7 @@ CLI catalog and invocation rules for agents, split by command domain. Start with
24
24
  - [Markdown audit](markdown-audit.md): Running the audit over any markdown path, where its bans and checkpoints are read from, what each check reports, and why the ban half gates while the structural half reports
25
25
  - [Output shape](output-shape.md): Two framed shapes every command renders into, how JSON and --names modes keep stdout clean, and the exit discipline that lets piped output drain
26
26
  - [Overview](overview.md): What this folder covers, the invocation rules every command inherits, and where domain behavior is documented instead
27
- - [Records](records.md): Validating the session records under .claude/ and the standards corpus, the per-kind checks, the refusal reasons, reading each folder's size and growth, backing the folders to a private remote, and which root each kind defaults to
27
+ - [Records](records.md): Validating the session records under .claude/ and the standards corpus, the per-kind checks, the refusal reasons, migrating a record a frontmatter change orphaned, reading each folder's size and growth, backing the folders to a private remote, and which root each kind defaults to
28
28
  - [Restated instructions](restated.md): Counting the instructions the always-loaded file shares with the seed and the shipped skill bodies, how a match is decided, the three classes, which surface a later edit starts from, and why the sweep reports rather than gates
29
29
  - [Routing report](routing.md): Reading per CLAUDE.md section how many bullets name a path, what counts as naming one, when a rule counts as covering it, the two refusals, and why the verb reports rather than gates
30
30
  - [Sandbox](sandbox.md): Scenario routing, the expectation scoring surface, and the coverage census over scenarios and skills
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  title: Records
3
- description: Validating the session records under .claude/ and the standards corpus, the per-kind checks, the refusal reasons, reading each folder's size and growth, backing the folders to a private remote, and which root each kind defaults to
3
+ description: Validating the session records under .claude/ and the standards corpus, the per-kind checks, the refusal reasons, migrating a record a frontmatter change orphaned, reading each folder's size and growth, backing the folders to a private remote, and which root each kind defaults to
4
4
  ---
5
5
 
6
6
  # Records
@@ -72,6 +72,28 @@ aitk records validate plans --json | jq -r '.findings[] | "\(.kind): \(.subject)
72
72
 
73
73
  For the shapes each check enforces, see `.claude/standards/plan.md`, `.claude/standards/groundwork.md`, `.claude/standards/intake.md`, `.claude/standards/memory.md`, and `.claude/standards/standard.md`.
74
74
 
75
+ ## Migrate
76
+
77
+ `aitk records migrate <kind>` rewrites the records a `validate` finding names a transform for. A standard that redefines its own required frontmatter breaks every record already written to the old shape, and this is the repair `validate` could only report until now.
78
+
79
+ ```bash
80
+ aitk records migrate memory
81
+ aitk records migrate memory --write
82
+ aitk records migrate memory --json
83
+ ```
84
+
85
+ | Option | Behavior |
86
+ | --------------- | ------------------------------------------------------------------- |
87
+ | `--json` | Add a machine-readable record on stdout |
88
+ | `--write` | Rewrite every record a transform can repair |
89
+ | `--root <path>` | Project root, defaulting to the main worktree except on `standards` |
90
+
91
+ It writes nothing until `--write` is passed, matching the write-flag contract `aitk tooling sync` carries: a session record has no history to undo a wrong repair from, so naming a kind is not consent to rewrite every record inside it. A dry run reports which records it would touch and exits non-zero either way, headless or not, since there is nothing to prompt for.
92
+
93
+ A transform runs only where the missing value is recoverable from the file itself. The one shipped today repairs a memory record missing `category` alone, deriving it from the same filename prefix `checkMemory` already reads it from. `title` and `description` are prose nobody wrote down, so a finding naming either carries no transform and stays for a session to fix by hand, and `validate` keeps reporting it. The transform re-reads the file rather than trusting a value captured at validate time, so a check and its repair cannot disagree about the same record.
94
+
95
+ Exit codes: `0` nothing carried a known transform, or `--write` repaired everything it found. `1` refused for a reason `validate` shares, every candidate it found failed to repair, or `--write` repaired only some of them. `2` a record carries a known transform and `--write` was not passed.
96
+
75
97
  ## Size
76
98
 
77
99
  `aitk records size` reports what each record folder holds and how much of it is recent. It reads the ten backed folders named under Push and pull, plus `.claude/.tmp`, and it gates nothing.
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@erclx/aitk",
3
3
  "type": "module",
4
- "version": "3.15.0",
4
+ "version": "3.17.0",
5
5
  "description": "Infrastructure and quality tooling for developer workflows",
6
6
  "license": "MIT",
7
7
  "bin": {
@@ -1,4 +1,5 @@
1
1
  import type { SkillsAuditRefusal } from '@/claude/skills-audit'
2
+ import type { RankRefusal } from '@/claude/skills-rank'
2
3
  import type { ReachRefusal } from '@/claude/skills-reach'
3
4
  import type { ContextAuditRefusal } from '@/context/audit'
4
5
  import type { AuditRefusal } from '@/deps/audit'
@@ -306,6 +307,24 @@ function reachCounts(record: unknown): Record<string, number> | undefined {
306
307
  return allOf({ unqualifiedCitations: lengthOf(root.unqualified) })
307
308
  }
308
309
 
310
+ /**
311
+ * Reads the routing measure's miss and unmeasurable counts, leaving `rank1`
312
+ * and `top3` out. Both move in lockstep with `misses` over a fixed-size
313
+ * corpus, so carrying them would report one movement three times, the same
314
+ * reasoning `restatedCounts` already takes over its own pair of derived
315
+ * totals. `unmeasurable` is retained separately, since it counts a defect in
316
+ * the instrument rather than a collision the catalog itself carries.
317
+ */
318
+ function rankCounts(record: unknown): Record<string, number> | undefined {
319
+ const root = asObject(record)
320
+ if (root === undefined) return undefined
321
+
322
+ return allOf({
323
+ misses: lengthOf(root.misses),
324
+ unmeasurable: lengthOf(root.unmeasurable),
325
+ })
326
+ }
327
+
309
328
  function boardCounts(record: unknown): Record<string, number> | undefined {
310
329
  const root = asObject(record)
311
330
  if (root === undefined) return undefined
@@ -518,6 +537,22 @@ export const AUDITS: readonly AuditSpec[] = [
518
537
  absentReasons: ['no-skills'] satisfies ReachRefusal[],
519
538
  counts: reachCounts,
520
539
  },
540
+ {
541
+ id: 'skills-rank',
542
+ label: 'Skill routing measure',
543
+ argv: ['claude', 'skills', 'rank', '--json'],
544
+ // Reports rather than gates. The corpus is a first run with no baseline to
545
+ // fail a push against, and a lexical ranker bounds a necessary condition
546
+ // rather than reporting real routing behavior, so a push failing on a
547
+ // moved rank would teach a contributor to route around the stage.
548
+ gatingExits: [],
549
+ corpus: 'tracked',
550
+ // The one reason this verb refuses for, and it is an absence for the same
551
+ // reason the reach check's is: a project carrying no `claude/skills/` has
552
+ // adopted no skill convention this audit reads.
553
+ absentReasons: ['no-skills'] satisfies RankRefusal[],
554
+ counts: rankCounts,
555
+ },
521
556
  {
522
557
  id: 'tasks',
523
558
  label: 'Task board',
@@ -0,0 +1,24 @@
1
+ import type { SkillCase } from '@/claude/skills-rank'
2
+ import { AUTHORING_CASES } from '@/claude/cases/authoring'
3
+ import { CLAUDE_WORKFLOW_CASES } from '@/claude/cases/claude-workflow'
4
+ import { GIT_CASES } from '@/claude/cases/git'
5
+ import { MISC_CASES } from '@/claude/cases/misc'
6
+ import { SETUP_CASES } from '@/claude/cases/setup'
7
+
8
+ /**
9
+ * The full routing case corpus, one file per domain so a description change
10
+ * in one family touches only the file beside it.
11
+ *
12
+ * Bootstrapped from each skill's own quoted trigger phrases and then
13
+ * rephrased and supplemented rather than shipped verbatim, since a positive
14
+ * lifted unchanged from a trigger passes by construction and never tests a
15
+ * person's own words. See `.claude/groundwork/42-ai-blueprint/08-spikes.md`
16
+ * for the extraction arm this corpus replaces as the shipped measure.
17
+ */
18
+ export const SKILL_CASES: readonly SkillCase[] = [
19
+ ...CLAUDE_WORKFLOW_CASES,
20
+ ...GIT_CASES,
21
+ ...SETUP_CASES,
22
+ ...AUTHORING_CASES,
23
+ ...MISC_CASES,
24
+ ]
@@ -0,0 +1,53 @@
1
+ import type { SkillCase } from '@/claude/skills-rank'
2
+
3
+ /**
4
+ * Script, skill, snippet, standard, and doc authoring, plus the two prose
5
+ * skills that revise rather than generate.
6
+ */
7
+ export const AUTHORING_CASES: readonly SkillCase[] = [
8
+ {
9
+ prompt:
10
+ 'I need a shell tool with prompts and a nice terminal UI for people to run by hand.',
11
+ expect: 'bash-script',
12
+ },
13
+ {
14
+ prompt:
15
+ 'Wire up a GitHub Actions pipeline with parallel jobs for this repo.',
16
+ expect: 'ci-workflow',
17
+ },
18
+ {
19
+ prompt:
20
+ 'Write me a headless automation script with no interactive prompts.',
21
+ expect: 'cli-script',
22
+ },
23
+ {
24
+ prompt: 'Scaffold a brand-new SKILL.md for this capability.',
25
+ expect: 'create-skill',
26
+ },
27
+ {
28
+ prompt: 'I need a new reusable prompt snippet added to the corpus.',
29
+ expect: 'create-snippet',
30
+ },
31
+ {
32
+ prompt: 'Write a fresh authoring convention as a new standard file.',
33
+ expect: 'create-standard',
34
+ },
35
+ {
36
+ prompt:
37
+ "The docs folder and README are stale against what's on main, refresh them.",
38
+ expect: 'docs-sync',
39
+ },
40
+ {
41
+ prompt: 'Say what that dense answer actually means in plain terms.',
42
+ expect: 'restate',
43
+ },
44
+ {
45
+ prompt: 'This passage reads flat and robotic, give it some real cadence.',
46
+ expect: 'write-human',
47
+ },
48
+ {
49
+ prompt:
50
+ 'Pull the captions off this YouTube link and save them with metadata.',
51
+ expect: 'youtube-transcripts',
52
+ },
53
+ ]
@@ -0,0 +1,153 @@
1
+ import type { SkillCase } from '@/claude/skills-rank'
2
+
3
+ /**
4
+ * The `claude-*` skill family: feature planning, review, and the session
5
+ * artifacts that coordinate work across sessions.
6
+ *
7
+ * Every positive is phrased away from its skill's own quoted trigger, since a
8
+ * verbatim trigger passes by construction and proves nothing about a prompt in
9
+ * someone's own words. Negatives target the pairs whose bodies already state
10
+ * an explicit `Do NOT` boundary against each other, since a boundary in a
11
+ * body does not reach the field a router reads.
12
+ */
13
+ export const CLAUDE_WORKFLOW_CASES: readonly SkillCase[] = [
14
+ {
15
+ prompt: 'Go fix everything the reviewer flagged on my open PR.',
16
+ expect: 'claude-address-review',
17
+ },
18
+ {
19
+ prompt:
20
+ 'Run the whole implement, verify, review, and ship pipeline for the approved plan.',
21
+ expect: 'claude-autoship',
22
+ },
23
+ {
24
+ prompt: "Pull together a design system from what's already in the app.",
25
+ expect: 'claude-design-extract',
26
+ },
27
+ {
28
+ prompt: 'Draw me a diagram of how the pieces of this system connect.',
29
+ expect: 'claude-diagram',
30
+ },
31
+ {
32
+ prompt:
33
+ 'Bring the internal planning docs under .claude up to date with what we decided this session.',
34
+ expect: 'claude-docs',
35
+ },
36
+ {
37
+ prompt:
38
+ 'Sketch out a plan for adding this new capability before we touch any code.',
39
+ expect: 'claude-feature',
40
+ },
41
+ {
42
+ prompt:
43
+ 'We need to measure this properly before committing to an approach.',
44
+ expect: 'claude-groundwork',
45
+ },
46
+ {
47
+ prompt: 'Take this pile of raw notes and turn it into filed items.',
48
+ expect: 'claude-intake',
49
+ },
50
+ {
51
+ prompt: 'Walk me through the open intake items so I can decide on each.',
52
+ expect: 'claude-intake-answer',
53
+ },
54
+ {
55
+ prompt:
56
+ "Draft a diff-based proposal for tightening this passage in the standard, don't just edit it.",
57
+ expect: 'claude-markdown-propose',
58
+ },
59
+ {
60
+ prompt: 'Pull the durable lessons out of this session before it ends.',
61
+ expect: 'claude-memory-capture',
62
+ },
63
+ {
64
+ prompt:
65
+ 'Go through the memory folder and propose what to do with each entry.',
66
+ expect: 'claude-memory-review',
67
+ },
68
+ {
69
+ prompt:
70
+ 'Take on the orchestrator role and coordinate the parallel feature builds.',
71
+ expect: 'claude-orchestrate',
72
+ },
73
+ {
74
+ prompt: 'Post a formal review with findings on that open pull request.',
75
+ expect: 'claude-pr-review',
76
+ },
77
+ {
78
+ prompt:
79
+ 'Look over everything that changed on this branch for bugs and edge cases.',
80
+ expect: 'claude-review',
81
+ },
82
+ {
83
+ prompt: 'Draft me a script with beats for a screencast recording.',
84
+ expect: 'claude-screencast',
85
+ },
86
+ {
87
+ prompt:
88
+ "Check whether my installed Claude seed docs have drifted from the toolkit's.",
89
+ expect: 'claude-seed-sync',
90
+ },
91
+ {
92
+ prompt: 'Turn this topic into a slide deck I can render.',
93
+ expect: 'claude-slides-draft',
94
+ },
95
+ {
96
+ prompt:
97
+ 'Check whether the markdown I changed violates any authoring standards.',
98
+ expect: 'claude-standards-audit',
99
+ },
100
+ {
101
+ prompt: 'Open a new entry on the task board for this piece of work.',
102
+ expect: 'claude-tasks',
103
+ },
104
+ {
105
+ prompt: 'Open a learning workspace so I can study this topic properly.',
106
+ expect: 'claude-teach',
107
+ },
108
+ {
109
+ prompt: 'Generate the Playwright tests I need after this UI change.',
110
+ expect: 'claude-ui-test',
111
+ },
112
+ {
113
+ prompt:
114
+ 'Look over the interface and tell me what feels unfinished or confusing.',
115
+ expect: 'claude-ux-audit',
116
+ },
117
+ {
118
+ prompt: 'Tell me the paint and layout cost of this page right now.',
119
+ expect: 'claude-ux-measure',
120
+ },
121
+ {
122
+ prompt: 'Get me set up in a fresh Claude Code worktree for this branch.',
123
+ expect: 'claude-worktree',
124
+ },
125
+
126
+ // Negatives: pairs whose bodies already carry an explicit Do NOT boundary.
127
+ {
128
+ prompt:
129
+ 'Refresh the stale sections of README and the docs folder based on what changed.',
130
+ expect: 'docs-sync',
131
+ },
132
+ {
133
+ prompt: 'Sort through this brain dump and write it up as findings.',
134
+ expect: 'claude-intake',
135
+ },
136
+ {
137
+ prompt:
138
+ "Go through what's still unanswered in the intake folder and decide.",
139
+ expect: 'claude-intake-answer',
140
+ },
141
+ {
142
+ prompt: 'Check this markdown against the house style rules.',
143
+ expect: 'claude-standards-audit',
144
+ },
145
+ {
146
+ prompt: 'Find the rough, unfinished-feeling spots in this interface.',
147
+ expect: 'claude-ux-audit',
148
+ },
149
+ {
150
+ prompt: 'Tell me the render cost of this page in the browser.',
151
+ expect: 'claude-ux-measure',
152
+ },
153
+ ]
@@ -0,0 +1,44 @@
1
+ import type { SkillCase } from '@/claude/skills-rank'
2
+
3
+ /** The `git-*` skill family: branch, commit, and pull-request mechanics. */
4
+ export const GIT_CASES: readonly SkillCase[] = [
5
+ {
6
+ prompt: 'Come up with a conventional name for this branch.',
7
+ expect: 'git-branch',
8
+ },
9
+ {
10
+ prompt: "Turn what's staged into one commit message.",
11
+ expect: 'git-commit',
12
+ },
13
+ {
14
+ prompt: "Push a quick follow-up fix onto the PR that's already open.",
15
+ expect: 'git-followup',
16
+ },
17
+ {
18
+ prompt: 'Turn this bug into a GitHub issue and file it.',
19
+ expect: 'git-issue',
20
+ },
21
+ {
22
+ prompt: 'Write the title and body for this pull request.',
23
+ expect: 'git-pr',
24
+ },
25
+ {
26
+ prompt: 'Take this finished feature all the way through to an opened PR.',
27
+ expect: 'git-ship',
28
+ },
29
+ {
30
+ prompt:
31
+ 'This branch has unrelated commits mixed together, break it into separate branches.',
32
+ expect: 'git-split',
33
+ },
34
+ {
35
+ prompt:
36
+ 'These staged changes cover more than one concern, commit them separately.',
37
+ expect: 'git-stage',
38
+ },
39
+ {
40
+ prompt:
41
+ 'Show me the linked worktrees and clear out the ones already merged.',
42
+ expect: 'git-worktree',
43
+ },
44
+ ]
@@ -0,0 +1,27 @@
1
+ import type { SkillCase } from '@/claude/skills-rank'
2
+
3
+ /** Skills that share no prefix with any other domain file here. */
4
+ export const MISC_CASES: readonly SkillCase[] = [
5
+ {
6
+ prompt:
7
+ 'Bundle up every open call that only I can make and ask me all at once.',
8
+ expect: 'decision-escalate',
9
+ },
10
+ {
11
+ prompt: 'Fire up the dev server the way this project documents it.',
12
+ expect: 'project-commands',
13
+ },
14
+ {
15
+ prompt:
16
+ "We're about to hit the context limit, write the handoff before we lose state.",
17
+ expect: 'session-map',
18
+ },
19
+ {
20
+ prompt: 'Catch me up on what was in progress before this session started.',
21
+ expect: 'session-resume',
22
+ },
23
+ {
24
+ prompt: "This test just started failing and I don't know why yet.",
25
+ expect: 'systematic-debugging',
26
+ },
27
+ ]