@mmerterden/multi-agent-pipeline 11.1.0 → 11.2.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/CHANGELOG.md +21 -0
- package/install/_common.mjs +9 -1
- package/install/claude.mjs +12 -3
- package/package.json +1 -1
- package/pipeline/scripts/build-stack-plugins.mjs +1 -1
- package/pipeline/scripts/fixtures/install-layout.tsv +2 -2
- package/pipeline/skills/.skills-index.json +20 -2
- package/pipeline/skills/shared/external/backlog/BACKLOG.md +32 -0
- package/pipeline/skills/shared/external/backlog/SKILL.md +49 -0
- package/pipeline/skills/shared/external/skill-creator/SKILL.md +48 -0
- package/pipeline/skills/shared/external/skill-creator/audit.md +59 -0
- package/pipeline/skills/shared/external/skill-creator/checklist.md +32 -0
- package/pipeline/skills/shared/external/skill-creator/examples.md +65 -0
- package/pipeline/skills/shared/external/skill-creator/label-check.md +43 -0
- package/pipeline/skills/shared/external/skill-creator/scripts/audit-panel.js +83 -0
- package/pipeline/skills/shared/external/skill-creator/template.md +67 -0
- package/pipeline/skills/skills-index.md +3 -1
package/CHANGELOG.md
CHANGED
|
@@ -14,6 +14,27 @@ Internal file-layout changes that don't affect the slash-command surface are sti
|
|
|
14
14
|
|
|
15
15
|
---
|
|
16
16
|
|
|
17
|
+
## [11.2.0] - 2026-07-07
|
|
18
|
+
|
|
19
|
+
Skill mining + an install-safety fix.
|
|
20
|
+
|
|
21
|
+
- **Fix (data-loss): `install.js` no longer clobbers user-owned rules.** `rules/`
|
|
22
|
+
is authored/evolved locally and is deliberately never synced back to the repo
|
|
23
|
+
(privacy). The installer used to `wipe + copy` it on every update, which
|
|
24
|
+
reverted local edits (including the git attribution rule). Rules now install
|
|
25
|
+
write-if-missing: new baseline rules are added, existing local rules are
|
|
26
|
+
preserved untouched. New `copyDir({ skipExisting })` option backs this.
|
|
27
|
+
- **Two skills mined from the corporate iOS toolkit and genericized into
|
|
28
|
+
`ai-common-engineering-toolkit` (v0.1.2):**
|
|
29
|
+
- `skill-creator` — the house rules for authoring skills (description-first
|
|
30
|
+
discovery, lean SKILL.md as an index, progressive disclosure, reference vs
|
|
31
|
+
workflow vs tool layers, no-prefix naming, grow-from-failure), with a
|
|
32
|
+
template, pre-ship checklist, good/bad examples, and a multi-architect audit
|
|
33
|
+
script. All corporate references scrubbed.
|
|
34
|
+
- `backlog` — a deferred-work registry where every deferred job lands with its
|
|
35
|
+
full spec + origin + unblock condition (deferred -> ready -> in-progress ->
|
|
36
|
+
done, never deleted), so deferral never means loss.
|
|
37
|
+
|
|
17
38
|
## [11.1.0] - 2026-07-07
|
|
18
39
|
|
|
19
40
|
Harness-hardening pass: four techniques adapted from studying cross-harness agent
|
package/install/_common.mjs
CHANGED
|
@@ -59,7 +59,7 @@ export function ensureDir(dir) {
|
|
|
59
59
|
* @param {{ exclude?: Array<string|RegExp>, useSymlinks?: boolean }} [opts]
|
|
60
60
|
*/
|
|
61
61
|
export function copyDir(src, dest, opts = {}) {
|
|
62
|
-
const { exclude = [], useSymlinks = false } = opts;
|
|
62
|
+
const { exclude = [], useSymlinks = false, skipExisting = false } = opts;
|
|
63
63
|
if (useSymlinks) {
|
|
64
64
|
symlinkDir(src, dest);
|
|
65
65
|
return;
|
|
@@ -69,6 +69,14 @@ export function copyDir(src, dest, opts = {}) {
|
|
|
69
69
|
return;
|
|
70
70
|
}
|
|
71
71
|
ensureDir(dest);
|
|
72
|
+
// skipExisting: never overwrite a file that already exists in dest. Used for
|
|
73
|
+
// user-owned trees (rules/) so an update adds new baseline files but preserves
|
|
74
|
+
// the user's locally-evolved copies. cpSync with force:false + errorOnExist:false
|
|
75
|
+
// silently skips existing files.
|
|
76
|
+
if (skipExisting) {
|
|
77
|
+
cpSync(src, dest, { recursive: true, force: false, errorOnExist: false });
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
72
80
|
if (exclude.length === 0) {
|
|
73
81
|
cpSync(src, dest, { recursive: true, force: true });
|
|
74
82
|
return;
|
package/install/claude.mjs
CHANGED
|
@@ -108,9 +108,18 @@ function installRules(pipelineSrc, dest, useSymlinks) {
|
|
|
108
108
|
console.log(" [Claude Code] Installing rules...");
|
|
109
109
|
const rulesSrc = join(pipelineSrc, "rules");
|
|
110
110
|
if (!existsSync(rulesSrc)) return;
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
111
|
+
// rules/ is USER-OWNED: users evolve their global rules locally and the sync
|
|
112
|
+
// deliberately never pushes rules/ back to the repo (privacy). So an update
|
|
113
|
+
// must NOT wipe+overwrite them (that reverts local edits, including the git
|
|
114
|
+
// attribution rule). Install only files that do not already exist; leave the
|
|
115
|
+
// user's existing rules untouched. (Symlink mode is a dev choice and keeps its
|
|
116
|
+
// link-replace behavior.)
|
|
117
|
+
if (useSymlinks) {
|
|
118
|
+
copyDir(rulesSrc, dest, { useSymlinks });
|
|
119
|
+
} else {
|
|
120
|
+
copyDir(rulesSrc, dest, { skipExisting: true });
|
|
121
|
+
}
|
|
122
|
+
console.log(` -> rules present (existing local rules preserved)`);
|
|
114
123
|
}
|
|
115
124
|
|
|
116
125
|
function installSchemas(pipelineSrc, dest, useSymlinks) {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mmerterden/multi-agent-pipeline",
|
|
3
|
-
"version": "11.
|
|
3
|
+
"version": "11.2.0",
|
|
4
4
|
"description": "8-phase AI development pipeline with full orchestration on Claude Code and Copilot CLI. Analysis, planning, TDD, CLI-aware parallel review with consensus surfacing + Fable triage, default-FAIL evidence gates, secret + intent guards, per-phase cost ledger, persistent learnings memory, wiki generation, commit automation. Token-preserving uninstall.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "index.js",
|
|
@@ -36,7 +36,7 @@ const EXTERNAL = join(PIPE_ROOT, 'pipeline/skills/shared/external');
|
|
|
36
36
|
const DRY = args.includes('--dry-run');
|
|
37
37
|
|
|
38
38
|
const COMMON_PLUGIN = 'ai-common-engineering-toolkit';
|
|
39
|
-
const COMMON_SKILLS = ['accessibility-compliance-accessibility-audit', 'firebase', 'humanizer', 'council', 'search-first', 'agent-introspection-debugging'];
|
|
39
|
+
const COMMON_SKILLS = ['accessibility-compliance-accessibility-audit', 'firebase', 'humanizer', 'council', 'search-first', 'agent-introspection-debugging', 'skill-creator', 'backlog'];
|
|
40
40
|
|
|
41
41
|
// Apple/Xcode-only skills that match no stack pattern → iOS plugin only.
|
|
42
42
|
const APPLE_ONLY = [
|
|
@@ -7,10 +7,10 @@
|
|
|
7
7
|
.claude/schemas 23
|
|
8
8
|
.claude/scripts 180
|
|
9
9
|
.claude/settings.json 1
|
|
10
|
-
.claude/skills
|
|
10
|
+
.claude/skills 572
|
|
11
11
|
.copilot/agents 8
|
|
12
12
|
.copilot/copilot-instructions.md 1
|
|
13
13
|
.copilot/lib 24
|
|
14
14
|
.copilot/schemas 23
|
|
15
15
|
.copilot/scripts 180
|
|
16
|
-
.copilot/skills
|
|
16
|
+
.copilot/skills 609
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": "1.0.0",
|
|
3
|
-
"generatedAt": "2026-07-
|
|
4
|
-
"skillCount":
|
|
3
|
+
"generatedAt": "2026-07-07T16:08:36.778Z",
|
|
4
|
+
"skillCount": 228,
|
|
5
5
|
"entries": [
|
|
6
6
|
{
|
|
7
7
|
"name": "accessibility-compliance-accessibility-audit",
|
|
@@ -201,6 +201,15 @@
|
|
|
201
201
|
"triggerPaths": [],
|
|
202
202
|
"relativePath": "shared/external/background-processing/SKILL.md"
|
|
203
203
|
},
|
|
204
|
+
{
|
|
205
|
+
"name": "backlog",
|
|
206
|
+
"description": "The engineering backlog registry for deferred-but-approved work in this codebase. Every job the user defers ('defer it', 'add it to the list', 'later', 'not now') lands HERE with its full spec, origin, and unblock condition, so deferral never means loss. Load when the user defers work, asks 'what's ",
|
|
207
|
+
"platform": null,
|
|
208
|
+
"group": "external",
|
|
209
|
+
"triggerKeywords": [],
|
|
210
|
+
"triggerPaths": [],
|
|
211
|
+
"relativePath": "shared/external/backlog/SKILL.md"
|
|
212
|
+
},
|
|
204
213
|
{
|
|
205
214
|
"name": "callkit-voip",
|
|
206
215
|
"description": "Implement VoIP calling with CallKit and PushKit. Use when building incoming/outgoing call flows, registering for VoIP push notifications, configuring CXProvider and CXCallController, handling call actions, coordinating audio sessions, or creating Call Directory extensions for caller ID and call bloc",
|
|
@@ -1605,6 +1614,15 @@
|
|
|
1605
1614
|
"triggerPaths": [],
|
|
1606
1615
|
"relativePath": "shared/external/shareplay-activities/SKILL.md"
|
|
1607
1616
|
},
|
|
1617
|
+
{
|
|
1618
|
+
"name": "skill-creator",
|
|
1619
|
+
"description": "Author and refine skills for a plugin/toolkit efficiently. Use when creating a new skill, trimming or splitting an existing one, writing a skill's description, or choosing skill vs command vs agent vs CLAUDE.md. Encodes the house rules — lean SKILL.md as an index, progressive disclosure into bundled",
|
|
1620
|
+
"platform": null,
|
|
1621
|
+
"group": "external",
|
|
1622
|
+
"triggerKeywords": [],
|
|
1623
|
+
"triggerPaths": [],
|
|
1624
|
+
"relativePath": "shared/external/skill-creator/SKILL.md"
|
|
1625
|
+
},
|
|
1608
1626
|
{
|
|
1609
1627
|
"name": "speech-recognition",
|
|
1610
1628
|
"description": "Transcribe speech to text using Apple's Speech framework. Use when implementing live microphone transcription with AVAudioEngine, recognizing recorded audio files, handling speech and microphone authorization, choosing on-device vs server-backed SFSpeechRecognizer behavior, or adopting SpeechAnalyze",
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# Backlog
|
|
2
|
+
|
|
3
|
+
Deferred-but-approved work, kept whole. Entries move `deferred` -> `ready` -> `in-progress` -> `done` and are never deleted. The full spec travels verbatim from when the job was deferred.
|
|
4
|
+
|
|
5
|
+
## Ready
|
|
6
|
+
|
|
7
|
+
_(nothing yet)_
|
|
8
|
+
|
|
9
|
+
## Deferred
|
|
10
|
+
|
|
11
|
+
_(nothing yet)_
|
|
12
|
+
|
|
13
|
+
## In progress
|
|
14
|
+
|
|
15
|
+
_(nothing yet)_
|
|
16
|
+
|
|
17
|
+
## Done
|
|
18
|
+
|
|
19
|
+
_(nothing yet)_
|
|
20
|
+
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
### Entry template
|
|
24
|
+
|
|
25
|
+
```
|
|
26
|
+
#### <id> — <title>
|
|
27
|
+
- state: deferred | ready | in-progress | done
|
|
28
|
+
- origin: <task / PR / finding / conversation that spawned it>
|
|
29
|
+
- unblock: <condition that makes it actionable, or "none">
|
|
30
|
+
- spec: |
|
|
31
|
+
<FULL description, verbatim from when it was deferred. Not a summary.>
|
|
32
|
+
```
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: backlog
|
|
3
|
+
version: 1.0.0
|
|
4
|
+
description: "The engineering backlog registry for deferred-but-approved work in this codebase. Every job the user defers ('defer it', 'add it to the list', 'later', 'not now') lands HERE with its full spec, origin, and unblock condition, so deferral never means loss. Load when the user defers work, asks 'what's on the backlog / the list', says 'work the backlog' / 'pick up <item>', or when completing an item. The bundled BACKLOG.md is the registry; entries move deferred -> ready -> in-progress -> done and are never deleted."
|
|
5
|
+
user-invocable: true
|
|
6
|
+
argument-hint: [list | add | pick <id> | done <id>]
|
|
7
|
+
allowed-tools: Read, Grep, Glob, Edit, Write
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# backlog — deferred work, kept whole
|
|
11
|
+
|
|
12
|
+
> **Layer:** workflow — the deterministic registry routine for deferred jobs.
|
|
13
|
+
> **Bundled:** [BACKLOG.md](BACKLOG.md) — the registry. The heart of this skill.
|
|
14
|
+
> **Iron rule:** moving a job onto this list is a MOVE, never a rewrite — the FULL spec
|
|
15
|
+
> travels verbatim. A compressed one-liner is a loss; the point of the backlog is that
|
|
16
|
+
> deferring costs nothing later.
|
|
17
|
+
|
|
18
|
+
## When to load
|
|
19
|
+
|
|
20
|
+
- The user defers work: "defer it", "add it to the list", "later", "not now", "backlog this".
|
|
21
|
+
- The user asks about it: "what's on the backlog", "what's on the list", "what's owed".
|
|
22
|
+
- The user works it: "work the backlog", "pick up <id>", "do the next one".
|
|
23
|
+
- An item completes: mark it done (never delete).
|
|
24
|
+
|
|
25
|
+
## The registry contract
|
|
26
|
+
|
|
27
|
+
Every entry in `BACKLOG.md` carries, verbatim:
|
|
28
|
+
|
|
29
|
+
- **id** — short stable slug (`kebab-case`), assigned on add.
|
|
30
|
+
- **title** — one line.
|
|
31
|
+
- **state** — `deferred` -> `ready` -> `in-progress` -> `done`. Entries only move forward; nothing is deleted.
|
|
32
|
+
- **origin** — where it came from (the task/PR/finding/conversation that spawned it).
|
|
33
|
+
- **spec** — the FULL description, verbatim from when it was deferred. Not a summary.
|
|
34
|
+
- **unblock** — the condition that makes it actionable (a dependency, a decision, a date). `deferred` items without an unblock condition are just `ready`.
|
|
35
|
+
|
|
36
|
+
Prefer an append-only markdown table or section list in `BACKLOG.md`; never overwrite an entry's spec on a state change — only its `state` line moves.
|
|
37
|
+
|
|
38
|
+
## Operations
|
|
39
|
+
|
|
40
|
+
| Command | Action |
|
|
41
|
+
|---|---|
|
|
42
|
+
| `list` | Show entries grouped by state (ready first, then deferred, then in-progress; done collapsed). |
|
|
43
|
+
| `add` | Capture the deferred job with its full spec + origin + unblock condition. Assign an id. |
|
|
44
|
+
| `pick <id>` | Move `ready`/`deferred` -> `in-progress`; surface the full spec so work resumes with zero context loss. |
|
|
45
|
+
| `done <id>` | Move -> `done`. Keep the entry (it becomes the record of what was owed and delivered). |
|
|
46
|
+
|
|
47
|
+
## Why keep it whole
|
|
48
|
+
|
|
49
|
+
The failure mode this skill prevents: an agent defers a job with a one-line note, the surrounding context evaporates, and picking it up later means re-deriving the spec (or silently dropping it). Storing the full spec at defer-time makes deferral safe — the cost of "later" is paid once, up front, not lost.
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: skill-creator
|
|
3
|
+
version: 1.0.0
|
|
4
|
+
description: "Author and refine skills for a plugin/toolkit efficiently. Use when creating a new skill, trimming or splitting an existing one, writing a skill's description, or choosing skill vs command vs agent vs CLAUDE.md. Encodes the house rules — lean SKILL.md as an index, progressive disclosure into bundled files, the reference (descriptive) vs workflow (imperative) split, no-prefix naming, and growing a skill from observed failures. Bundles a template, a pre-ship checklist, and good/bad description examples."
|
|
5
|
+
user-invocable: true
|
|
6
|
+
argument-hint: [new | trim | description]
|
|
7
|
+
allowed-tools: Read, Write, Edit, Glob
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# skill-creator — how to write skills here
|
|
11
|
+
|
|
12
|
+
> **Layer:** reference (knowledge)
|
|
13
|
+
> **Use when:** creating/trimming a skill, writing a description, or choosing skill vs command/agent/CLAUDE.md.
|
|
14
|
+
> **Bundled (read on demand):** [template.md](template.md) · [checklist.md](checklist.md) · [examples.md](examples.md) · [label-check.md](label-check.md) · [audit.md](audit.md)
|
|
15
|
+
|
|
16
|
+
## 1. Is a skill the right tool?
|
|
17
|
+
- **CLAUDE.md** — broad facts/rules true *every* session.
|
|
18
|
+
- **Skill** — on-demand procedure or knowledge for a recurring task.
|
|
19
|
+
- **Subagent/agent** — needs independent reasoning + its own context/tools.
|
|
20
|
+
- **MCP server** — structured integration with an external system's API.
|
|
21
|
+
|
|
22
|
+
## 2. The description is discovery (the 90% lever)
|
|
23
|
+
It's the *only* thing the model sees when deciding to load the skill. **Write it first.** Include **what + when + trigger words + one example trigger**, in third person. (Anthropic's data: vague→specific lifts activation ~20%→50%; adding examples ~72%→90%.) Good/bad pairs in [examples.md](examples.md).
|
|
24
|
+
|
|
25
|
+
## 3. Keep it lean (it stays in context every turn once loaded)
|
|
26
|
+
- `SKILL.md` is an **index** — aim for ~1 page, hard cap ~500 lines.
|
|
27
|
+
- Push detail into bundled files **one level deep** (reference, examples, scripts). They cost zero tokens until read; nested-deeper files get partially read — don't nest.
|
|
28
|
+
- A **script executes without its source entering context** — prefer a script over asking the model to regenerate code.
|
|
29
|
+
- Challenge every line: *"would Claude err without this?"* If no, cut it.
|
|
30
|
+
|
|
31
|
+
## 4. Pick the right degree of freedom (= our layers)
|
|
32
|
+
- **reference skill → descriptive:** invariants, conventions + pointers to canonical files, decision heuristics, pitfalls, escape hatches. **No numbered procedures.**
|
|
33
|
+
- **workflow skill → imperative spine:** a numbered procedure **only** for deterministic/irreversible steps (branch/PR, codegen, build/verify). Cite reference skills for the judgment.
|
|
34
|
+
- **tool skill → thin index over a script/CLI:** lean SKILL.md (when + the run command + sub-commands at a glance), heavy detail in a bundled `reference.md`; the script is the engine (e.g. `tools/figma-utility`).
|
|
35
|
+
|
|
36
|
+
## 5. Naming
|
|
37
|
+
No platform prefix — the toolkit name + description already carry it. Reference = aspect noun (`navigation`); workflow = verb-phrase (`branch-and-pr`). Avoid vague/reserved (`helper`, `utils`, `claude-*`). For a name/title/strict-rule label that must carry its **whole intent**, validate it with the fresh-subagent inference test in [label-check.md](label-check.md) before committing.
|
|
38
|
+
|
|
39
|
+
## 6. Grow it from real usage — don't pre-write
|
|
40
|
+
1. Do the task **without** a skill; note where Claude actually fails.
|
|
41
|
+
2. Write the **minimum** that fixes those gaps.
|
|
42
|
+
3. Watch Claude use it: move reused detail up into SKILL.md, cut detail it ignores, sharpen the description if it didn't trigger.
|
|
43
|
+
|
|
44
|
+
## Before shipping
|
|
45
|
+
Start from [template.md](template.md); run [checklist.md](checklist.md). For a new or
|
|
46
|
+
substantially-changed skill that must be trusted, run the **multi-architect audit**
|
|
47
|
+
([audit.md](audit.md)) — a panel of distinct-lens reviewers + synthesis, looped
|
|
48
|
+
fix → re-audit until no blockers/majors remain.
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# Multi-architect audit — adversarial quality gate for a skill
|
|
2
|
+
|
|
3
|
+
The [checklist](checklist.md) is the self-review floor. This is the **high-confidence
|
|
4
|
+
gate**: a panel of N independent reviewers, each a *distinct lens*, reads the skill
|
|
5
|
+
against the rubric + ground truth, then a synthesizer dedups and rules. You **loop
|
|
6
|
+
fix → re-audit until it passes** (no blockers/majors). Run it before shipping a new
|
|
7
|
+
or substantially-changed skill, or whenever a skill must be trusted.
|
|
8
|
+
|
|
9
|
+
Use the [Workflow tool](scripts/audit-panel.js) to fan the panel out — it returns
|
|
10
|
+
`{remaining, clearsBar, verdict}`.
|
|
11
|
+
|
|
12
|
+
## The loop (run to convergence)
|
|
13
|
+
1. **Panel** — N agents, one lens each, read-only. Each returns specific findings
|
|
14
|
+
(severity · file:location · problem · concrete fix). Empty if its lens is clean.
|
|
15
|
+
2. **Synthesize** — dedup overlaps; **drop false positives** (verify each against the
|
|
16
|
+
real files/repo before keeping); classify blocker / major / minor / nit;
|
|
17
|
+
`clearsBar = no blockers and no majors remain`.
|
|
18
|
+
3. **If not clean** — apply the do-now set (blockers + majors + cheap high-value
|
|
19
|
+
minors), then run a **fresh** panel (see "Fresh each round") and repeat.
|
|
20
|
+
4. **Stop** when `clearsBar` is true. The later/nit list is optional polish.
|
|
21
|
+
|
|
22
|
+
## Rules that make it trustworthy
|
|
23
|
+
- **Fresh panel each round.** After a fix, re-run the panel anew so agents read the
|
|
24
|
+
*current* files — do not reuse a prior run's cached results (they reflect the old
|
|
25
|
+
state and will report fixed issues as open / miss regressions).
|
|
26
|
+
- **Verify before keeping.** Every finding must be confirmed against the actual file
|
|
27
|
+
or repo. The synthesizer drops anything it can't reproduce. Prefer findings that
|
|
28
|
+
cite a line and a reproduction.
|
|
29
|
+
- **Ground-truth, not vibes.** Give the panel the rubric ([SKILL.md](SKILL.md) +
|
|
30
|
+
[checklist.md](checklist.md)), an exemplar skill, and the real source the skill
|
|
31
|
+
describes (e.g. the iOS repo). Agents read; they don't assume.
|
|
32
|
+
- **Watch for regressions.** A fix can break something — the red-team lens and the
|
|
33
|
+
fresh re-audit exist to catch it (e.g. a broadened check that now false-positives).
|
|
34
|
+
- **clearsBar gates the merge.** Don't merge with an open blocker/major.
|
|
35
|
+
|
|
36
|
+
## Lenses — pick the set for the task
|
|
37
|
+
One distinct lens per agent (+ a synthesizer). Two ready-made sets:
|
|
38
|
+
|
|
39
|
+
**General skill audit** — discovery · leanness · shape/layer · scripts · accuracy-vs-source · domain-correctness · wiring · boundaries · red-team → synthesis.
|
|
40
|
+
|
|
41
|
+
**Prompt-engineering audit** (when the concern is *prompt quality* — descriptions,
|
|
42
|
+
instructions, triggering):
|
|
43
|
+
1. **description-as-discovery** — what + when + trigger words + example; would it activate on a real task?
|
|
44
|
+
2. **disambiguation** — distinct from siblings; a reader can tell when to pick this vs a neighbor.
|
|
45
|
+
3. **trigger coverage** — the real user phrasings (and synonyms) are covered.
|
|
46
|
+
4. **instruction clarity** — steps are unambiguous, ordered, single-interpretation; no vague directives.
|
|
47
|
+
5. **degrees of freedom / layer fit** — reference=descriptive (no numbered procedure), workflow=spine, tool=thin-index; freedom matches the task.
|
|
48
|
+
6. **progressive disclosure / leanness** — SKILL.md is an index; detail bundled one level deep; no duplication.
|
|
49
|
+
7. **token efficiency** — every line is load-bearing; nothing restates what the model already knows.
|
|
50
|
+
8. **consistency** — terminology, naming, paths, cross-references, examples all agree.
|
|
51
|
+
9. **anti-patterns / misfire** — would the model over-apply it, skip a gate, hallucinate a path, or follow it into a wrong output?
|
|
52
|
+
10. **red-team** — adversarially try to make it not trigger, trigger wrongly, or produce broken output; hunt overclaims (says X, the script doesn't).
|
|
53
|
+
|
|
54
|
+
Scale the panel to risk: a quick check is ~3 lenses; a thorough gate is ~10.
|
|
55
|
+
|
|
56
|
+
## Scope of fixes per round
|
|
57
|
+
Fix **blockers + majors** always; fold in **cheap, high-value minors** while you're
|
|
58
|
+
in the file. Defer speculative nits and pre-existing/out-of-scope drift to the
|
|
59
|
+
"later" list (and `log()`/note them — don't silently drop coverage).
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# Pre-ship checklist
|
|
2
|
+
|
|
3
|
+
Run before considering a skill done.
|
|
4
|
+
|
|
5
|
+
## Discovery
|
|
6
|
+
- [ ] `description` says **what + when + trigger words**, third person, and names the platform (iOS/SwiftUI).
|
|
7
|
+
- [ ] Description disambiguates from sibling skills (a reader can tell when to pick this vs a neighbor).
|
|
8
|
+
- [ ] Tested: in a fresh task that should trigger it, does the model actually reach for it? If not, sharpen the description.
|
|
9
|
+
|
|
10
|
+
## Leanness
|
|
11
|
+
- [ ] `SKILL.md` reads like an index, ~1 page (hard cap ~500 lines).
|
|
12
|
+
- [ ] Detail lives in bundled files **one level deep** — no nested-deeper references.
|
|
13
|
+
- [ ] Every line survives "would Claude err without this?" — no over-explaining, no restating what the model knows.
|
|
14
|
+
- [ ] Deterministic code is a **script**, not prose asking the model to regenerate it.
|
|
15
|
+
|
|
16
|
+
## Shape
|
|
17
|
+
- [ ] Layer is explicit (reference or workflow) and matches the content.
|
|
18
|
+
- [ ] **Reference** skill has **no numbered procedures** — heuristics + pointers only.
|
|
19
|
+
- [ ] **Workflow** skill's numbered steps are **only** the deterministic/irreversible spine, and it has a **verification gate**.
|
|
20
|
+
- [ ] Conventions **point to canonical files** rather than pasting code that will rot.
|
|
21
|
+
|
|
22
|
+
## Naming & wiring
|
|
23
|
+
- [ ] Name has **no platform prefix**; reference = aspect noun, workflow = verb-phrase; not vague/reserved.
|
|
24
|
+
- [ ] Registered in the plugin manifest (`<plugin>/.claude-plugin/plugin.json` `skills` array) and the marketplace version bumped (`.github/plugin/marketplace.json`).
|
|
25
|
+
- [ ] Listed in the `index` skill's route table.
|
|
26
|
+
|
|
27
|
+
## House rules
|
|
28
|
+
- [ ] No AI/Claude/Anthropic attribution anywhere in the skill or its examples.
|
|
29
|
+
- [ ] Escape hatches name the skill to hand off to when this one doesn't apply.
|
|
30
|
+
|
|
31
|
+
## High-confidence gate (new / substantially-changed skills)
|
|
32
|
+
- [ ] Ran the multi-architect audit ([audit.md](audit.md)) and looped fix → re-audit until `clearsBar` (no blockers/majors).
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
# Examples — descriptions & shape
|
|
2
|
+
|
|
3
|
+
## Descriptions: the discovery lever
|
|
4
|
+
|
|
5
|
+
**Bad (vague — rarely triggers):**
|
|
6
|
+
```yaml
|
|
7
|
+
description: Helps with navigation
|
|
8
|
+
```
|
|
9
|
+
Why it fails: no "when", no trigger words, no platform — the router can't tell what task this matches.
|
|
10
|
+
|
|
11
|
+
**Good (what + when + triggers + platform):**
|
|
12
|
+
```yaml
|
|
13
|
+
description: "In-app navigation for a SwiftUI iOS app — the coordinator-per-domain pattern, the tab shell, cross-domain navigation, deep links, and modals. Reach for this when adding a screen, a tab, a deep link, or a modal, or deciding how one screen reaches another."
|
|
14
|
+
```
|
|
15
|
+
Why it works: states the domain, lists concrete triggers ("adding a screen, a tab, a deep link"), names the platform, and implies the boundary.
|
|
16
|
+
|
|
17
|
+
**Workflow example (action + when to run):**
|
|
18
|
+
```yaml
|
|
19
|
+
description: "Branch, commit, push, and open a PR for this repo. Owns the git/PR spine and house guardrails — type-first branch names, no AI attribution, no force-push, correct base branch. Reach for this whenever a change is ready to ship."
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
### Recipe
|
|
23
|
+
`<what it covers/does> + <concrete when/trigger phrases> + <platform> + <implied boundary vs siblings>`
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
## Shape: reference vs workflow
|
|
28
|
+
|
|
29
|
+
**Wrong — a reference skill drifting into a procedure:**
|
|
30
|
+
```markdown
|
|
31
|
+
## Procedures
|
|
32
|
+
1. Open the file
|
|
33
|
+
2. Add the wrapper
|
|
34
|
+
3. Register the route
|
|
35
|
+
4. Build and run
|
|
36
|
+
```
|
|
37
|
+
A reference (knowledge) skill should describe *the rule and where the canonical example lives*, not script the keystrokes.
|
|
38
|
+
|
|
39
|
+
**Right — reference stays descriptive:**
|
|
40
|
+
```markdown
|
|
41
|
+
## Decision rules
|
|
42
|
+
- New screen in a domain → add `<Name>Screen` under its Presentation layer,
|
|
43
|
+
wrap content in the domain's container, route via the domain coordinator.
|
|
44
|
+
Canonical: `<repo>/Features/Profile/ProfileScreen.swift`.
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
**Right — workflow earns its numbered steps** (deterministic/irreversible spine):
|
|
48
|
+
```markdown
|
|
49
|
+
## Procedures
|
|
50
|
+
1. Pre-flight: `git status` clean? on base branch?
|
|
51
|
+
2. Branch: `git checkout -b <type>/<scope>/<desc>`
|
|
52
|
+
3. Commit: stage; conventional message; strip any AI co-author trailer.
|
|
53
|
+
4. Push; never force-push a protected branch.
|
|
54
|
+
5. PR: `gh pr create --base <base> …` (no AI footer).
|
|
55
|
+
## Verification
|
|
56
|
+
- `git log -1` shows clean message, no AI trailer, correct author.
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
---
|
|
60
|
+
|
|
61
|
+
## Leanness: cut what the model already knows
|
|
62
|
+
|
|
63
|
+
**Bloat:** "PDF files are documents that contain text and images. To read them you first need a library that can parse the binary format…"
|
|
64
|
+
|
|
65
|
+
**Lean:** "Extract text from PDFs with `pdfplumber`."
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# Label intent check — does a title carry its own meaning?
|
|
2
|
+
|
|
3
|
+
A label (rule title, section header, principle/constraint name) is the handle a reader grasps *before* the body. If the handle leaks the wrong shape — ambiguous, one-sided, or off-topic — the reader forms the wrong model and the body has to fight it. This is a cheap test that catches that early: have **fresh subagents infer the rule from the label alone**, then compare against your intended meaning. Convergence = the label is self-carrying.
|
|
4
|
+
|
|
5
|
+
## When to run it
|
|
6
|
+
- Naming a **strict rule** or constraint inside a skill (the kind a reader must obey).
|
|
7
|
+
- A **section header** that gates non-trivial content (phase/principle/constraint names).
|
|
8
|
+
- Any label meant to convey the **whole intent** of its body (not a summary — the intent).
|
|
9
|
+
- Skip it for purely organizational labels ("Examples", "See also") — they carry no intent.
|
|
10
|
+
|
|
11
|
+
## Inputs (collect first)
|
|
12
|
+
1. **Candidate label** — the exact string under test.
|
|
13
|
+
2. **Surrounding context** — one paragraph: which skill/doc, what adjacent labels cover, the domain concepts in play.
|
|
14
|
+
3. **Intended meaning** — 1–3 sentences of ground truth (what the body says / what the reader should walk away believing). **Not** shown to the inference agents. If you can't state it in 3 sentences, the body is unclear — fix that first.
|
|
15
|
+
|
|
16
|
+
## Procedure
|
|
17
|
+
**One iteration = 5 parallel subagents**, each given ONLY the label + context (never the body), each forced to commit:
|
|
18
|
+
```
|
|
19
|
+
Context: <surrounding context — 1 paragraph>.
|
|
20
|
+
The label under test is: **"<candidate label>"**
|
|
21
|
+
You have NOT seen the body. From ONLY this label + context, what do you infer it
|
|
22
|
+
enforces / requires / means? 1–2 concrete sentences, under 80 words. Commit — no
|
|
23
|
+
hedging, no clarifying questions.
|
|
24
|
+
```
|
|
25
|
+
Launch all 5 in the **same** message (parallel) so they're independent by construction.
|
|
26
|
+
|
|
27
|
+
**Convergence (per iteration), comparing the 5 inferences to the intended meaning:**
|
|
28
|
+
- **PASS** — ≥4/5 cover *all* key intent beats (including the bidirectional / edge / scope beat, if the intent has one). Wording drift is fine.
|
|
29
|
+
- **PARTIAL** — they consistently catch one side of a bidirectional rule but miss the other, or over-extend into an adjacent concern. Revise the label, re-run.
|
|
30
|
+
- **FAIL** — inferences diverge wildly or miss the core beat. Revise, re-run.
|
|
31
|
+
|
|
32
|
+
**Idempotency (after a PASS):** run **2 more rounds**, 5 fresh agents each (3×5 = 15 inferences), same prompt. Require **all 3 rounds PASS** with no new systematic miss — confirms the PASS wasn't luck. A regression in round 2/3 → treat as PARTIAL and iterate.
|
|
33
|
+
|
|
34
|
+
**Termination:** converged (3/3 PASS) → apply the label. 3 iterations without a PASS → stop, hand back the best candidate + the persistent miss; don't force a label that won't stick.
|
|
35
|
+
|
|
36
|
+
## Defaults
|
|
37
|
+
5 agents/round · 3 rounds · 80-word inference cap · max 3 iterations before handing back. High-stakes labels (top-level skill names, protocol names) → 7 agents × 3 rounds; throwaway section headers → 3 × 2.
|
|
38
|
+
|
|
39
|
+
## Anti-patterns
|
|
40
|
+
- **Giving agents the body** — defeats the test (you're checking the label's *self-carrying* power).
|
|
41
|
+
- **Running sequentially** — they'd anchor on each other; must be parallel.
|
|
42
|
+
- **Tweaking one word on a FAIL** — step back and rethink the concept the label names, don't polish a wrong handle.
|
|
43
|
+
- **Accepting "mostly right"** — a label that reliably misses a beat misleads every reader the same way. Fix it, or accept the rule is one-sided and split the body.
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
// audit-panel.js — Workflow template for the multi-architect skill audit.
|
|
2
|
+
//
|
|
3
|
+
// Run with the Workflow tool. Edit the CONFIG block for your target, then launch.
|
|
4
|
+
// Returns { remaining, clearsBar, verdict }. If clearsBar is false, apply the
|
|
5
|
+
// `remaining` blockers/majors, then RE-RUN A FRESH copy (do NOT resume — agents
|
|
6
|
+
// must read the current files). Loop until clearsBar. See ../audit.md.
|
|
7
|
+
|
|
8
|
+
export const meta = {
|
|
9
|
+
name: 'skill-audit-panel',
|
|
10
|
+
description: 'Adversarial N-architect audit of a skill against the skill-creator rubric',
|
|
11
|
+
phases: [{ title: 'Audit' }, { title: 'Synthesis' }],
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
// ── CONFIG — edit these ──────────────────────────────────────────────────────
|
|
15
|
+
const TARGET = `
|
|
16
|
+
- <abs path to SKILL.md>
|
|
17
|
+
- <abs path to each bundled file / script>
|
|
18
|
+
`
|
|
19
|
+
const RUBRIC = `<abs path to reference/skill-creator/SKILL.md> + checklist.md`
|
|
20
|
+
const EXEMPLAR = `<abs path to a known-good skill of the same layer>`
|
|
21
|
+
const GROUND_TRUTH = `<abs path to the real source the skill describes (e.g. the iOS repo), with key facts>`
|
|
22
|
+
// Pick a lens set from audit.md (general or prompt-engineering). [label, brief] pairs:
|
|
23
|
+
const LENSES = [
|
|
24
|
+
['discovery', 'description-as-discovery: what+when+trigger words+example; would it activate on a real task?'],
|
|
25
|
+
['disambiguation', 'distinct from sibling skills; a reader can tell when to pick this vs a neighbor.'],
|
|
26
|
+
['triggers', 'real user phrasings + synonyms are covered.'],
|
|
27
|
+
['clarity', 'instructions unambiguous, ordered, single-interpretation; no vague directives.'],
|
|
28
|
+
['layer', 'degrees of freedom match the layer (reference=descriptive / workflow=spine / tool=thin-index).'],
|
|
29
|
+
['leanness', 'SKILL.md is an index; detail bundled one level deep; no duplication or bloat.'],
|
|
30
|
+
['tokens', 'every line load-bearing; nothing restates what the model already knows.'],
|
|
31
|
+
['consistency', 'terminology, naming, paths, cross-refs, examples all agree.'],
|
|
32
|
+
['misfire', 'would the model over-apply, skip a gate, hallucinate a path, or follow it to a wrong output?'],
|
|
33
|
+
['redteam', 'adversarially make it not trigger / trigger wrongly / produce broken output; hunt overclaims (says X, script does not).'],
|
|
34
|
+
]
|
|
35
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
36
|
+
|
|
37
|
+
const COMMON = `
|
|
38
|
+
You are auditing a skill. Read the CURRENT files and report ONLY genuine, specific,
|
|
39
|
+
reproducible findings for YOUR lens. Verify against the rubric + ground truth — do
|
|
40
|
+
not assume. Read-only; do NOT edit. If your lens is clean, return an empty array.
|
|
41
|
+
|
|
42
|
+
TARGET (the skill under audit):${TARGET}
|
|
43
|
+
RUBRIC (the bar): ${RUBRIC}
|
|
44
|
+
EXEMPLAR (known-good of this layer): ${EXEMPLAR}
|
|
45
|
+
GROUND TRUTH (what the skill describes): ${GROUND_TRUTH}
|
|
46
|
+
|
|
47
|
+
Each finding: severity (blocker|major|minor|nit), file:location, the problem, the concrete fix.
|
|
48
|
+
`
|
|
49
|
+
|
|
50
|
+
const FINDING = {
|
|
51
|
+
type: 'object', additionalProperties: false,
|
|
52
|
+
properties: {
|
|
53
|
+
severity: { type: 'string', enum: ['blocker', 'major', 'minor', 'nit'] },
|
|
54
|
+
location: { type: 'string' }, problem: { type: 'string' }, fix: { type: 'string' },
|
|
55
|
+
}, required: ['severity', 'location', 'problem', 'fix'],
|
|
56
|
+
}
|
|
57
|
+
const LENS_SCHEMA = {
|
|
58
|
+
type: 'object', additionalProperties: false,
|
|
59
|
+
properties: { lens: { type: 'string' }, findings: { type: 'array', items: FINDING } },
|
|
60
|
+
required: ['lens', 'findings'],
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
phase('Audit')
|
|
64
|
+
const results = await parallel(LENSES.map(([lens, brief]) => () =>
|
|
65
|
+
agent(`${COMMON}\n\nYOUR LENS — ${lens}: ${brief}`, { label: `audit:${lens}`, phase: 'Audit', schema: LENS_SCHEMA })
|
|
66
|
+
))
|
|
67
|
+
const all = results.filter(Boolean).flatMap(r => r.findings.map(f => ({ ...f, lens: r.lens })))
|
|
68
|
+
|
|
69
|
+
phase('Synthesis')
|
|
70
|
+
const SYNTH = {
|
|
71
|
+
type: 'object', additionalProperties: false,
|
|
72
|
+
properties: {
|
|
73
|
+
remaining: { type: 'array', items: { type: 'object', additionalProperties: false,
|
|
74
|
+
properties: { ...FINDING.properties, lenses: { type: 'string' } },
|
|
75
|
+
required: [...FINDING.required, 'lenses'] } },
|
|
76
|
+
clearsBar: { type: 'boolean' },
|
|
77
|
+
verdict: { type: 'string' },
|
|
78
|
+
}, required: ['remaining', 'clearsBar', 'verdict'],
|
|
79
|
+
}
|
|
80
|
+
return await agent(
|
|
81
|
+
`${COMMON}\n\nYou are the SYNTHESIS architect. Below are ${all.length} raw findings from ${LENSES.length} lenses. Dedup overlaps (note which lenses raised each). DROP false positives — verify against the files before keeping; if you cannot reproduce it, drop it. Classify each survivor; set clearsBar=true ONLY if no blockers and no majors remain. One-paragraph verdict.\n\nRAW:\n${JSON.stringify(all, null, 2)}`,
|
|
82
|
+
{ label: 'synthesis', phase: 'Synthesis', schema: SYNTH }
|
|
83
|
+
)
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
# Skill skeletons
|
|
2
|
+
|
|
3
|
+
Two skeletons — pick by layer. Both stay lean; push detail into one-level-deep bundled files.
|
|
4
|
+
|
|
5
|
+
Frontmatter fields used in this toolkit: `name`, `description` (required-quality), `user-invocable`, `argument-hint` (optional), `allowed-tools`.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Reference skill (descriptive — knowledge)
|
|
10
|
+
|
|
11
|
+
No numbered procedures. Principles + pointers + heuristics.
|
|
12
|
+
|
|
13
|
+
```markdown
|
|
14
|
+
---
|
|
15
|
+
name: <aspect-noun> # e.g. navigation — NO platform prefix
|
|
16
|
+
description: <what it covers + when to reach for it + trigger words. Say "iOS/SwiftUI" so the router can disambiguate.>
|
|
17
|
+
user-invocable: true
|
|
18
|
+
allowed-tools: Read, Grep, Glob, Bash, Edit, Write
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
# <name> — <short title>
|
|
22
|
+
|
|
23
|
+
> **Layer:** reference (knowledge)
|
|
24
|
+
> **Use when:** <trigger> **Hand off to:** <sibling skill>
|
|
25
|
+
|
|
26
|
+
## Scope
|
|
27
|
+
In / out, 1–2 lines.
|
|
28
|
+
|
|
29
|
+
## Invariants <!-- non-negotiables + the why -->
|
|
30
|
+
## Conventions & golden paths <!-- point to canonical files; don't paste code -->
|
|
31
|
+
## Decision rules <!-- if X do A; when unsure, ask/verify -->
|
|
32
|
+
## Pitfalls <!-- known traps -->
|
|
33
|
+
## Escape hatches <!-- when this doesn't apply → which skill -->
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
---
|
|
37
|
+
|
|
38
|
+
## Workflow skill (imperative — action)
|
|
39
|
+
|
|
40
|
+
Has a numbered procedure, but only for the deterministic/irreversible spine. Cite reference skills for judgment. Always include a verification gate.
|
|
41
|
+
|
|
42
|
+
```markdown
|
|
43
|
+
---
|
|
44
|
+
name: <verb-phrase> # e.g. branch-and-pr
|
|
45
|
+
description: <what it does + when to run it + trigger words (iOS/SwiftUI).>
|
|
46
|
+
user-invocable: true
|
|
47
|
+
argument-hint: [<step> | ...]
|
|
48
|
+
allowed-tools: Bash, Read
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
# <name> — <short title>
|
|
52
|
+
|
|
53
|
+
> **Layer:** workflow (action)
|
|
54
|
+
> **Use when:** <trigger> **Don't use when:** <hand off>
|
|
55
|
+
|
|
56
|
+
## Scope
|
|
57
|
+
In / out, 1–2 lines.
|
|
58
|
+
|
|
59
|
+
## Invariants <!-- hard rules / guardrails -->
|
|
60
|
+
## Conventions & golden paths <!-- base branch, auth, canonical commands -->
|
|
61
|
+
## Decision rules <!-- branch when…, escalate when… -->
|
|
62
|
+
## Procedures <!-- IMPERATIVE: only deterministic/irreversible steps -->
|
|
63
|
+
1. ...
|
|
64
|
+
## Verification <!-- IMPERATIVE: prove it worked (build/run/test) -->
|
|
65
|
+
## Pitfalls
|
|
66
|
+
## Escape hatches
|
|
67
|
+
```
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
> Auto-generated by `pipeline/scripts/build-skills-index.mjs` - do not hand-edit.
|
|
4
4
|
> Regenerate with `node pipeline/scripts/build-skills-index.mjs`.
|
|
5
5
|
|
|
6
|
-
**
|
|
6
|
+
**228 skills** across 5 groups.
|
|
7
7
|
|
|
8
8
|
| Group | Name | Platform | Description |
|
|
9
9
|
|-------|------|----------|-------------|
|
|
@@ -29,6 +29,7 @@
|
|
|
29
29
|
| external | `authentication` | - | Implement iOS authentication flows with AuthenticationServices and LocalAuthentication. Use when building Sign in with Apple, passkey/WebAut |
|
|
30
30
|
| external | `avkit` | - | Create media playback experiences using AVKit. Use when adding video players with AVPlayerViewController, enabling Picture-in-Picture, routi |
|
|
31
31
|
| external | `background-processing` | - | Schedule and execute background work on iOS using BGTaskScheduler. Use when registering BGAppRefreshTask for short background fetches, BGPro |
|
|
32
|
+
| external | `backlog` | - | The engineering backlog registry for deferred-but-approved work in this codebase. Every job the user defers ('defer it', 'add it to the list |
|
|
32
33
|
| external | `callkit-voip` | - | Implement VoIP calling with CallKit and PushKit. Use when building incoming/outgoing call flows, registering for VoIP push notifications, co |
|
|
33
34
|
| external | `ci-cd-pipelines` | - | CI/CD pipelines: GitHub Actions workflows, Docker multi-stage builds, environment management, secret management, deployment strategies |
|
|
34
35
|
| external | `clean-code` | - | This skill embodies the principles of \"Clean Code\" by Robert C. Martin (Uncle Bob). Use it to transform \"code that works\" into \"code th |
|
|
@@ -185,6 +186,7 @@
|
|
|
185
186
|
| external | `room-database` | - | Implement Room database persistence on Android with @Entity, @Dao, @Database, Flow-based reactive queries, TypeConverters for complex types, |
|
|
186
187
|
| external | `search-first` | - | \| |
|
|
187
188
|
| external | `shareplay-activities` | - | Build shared real-time experiences using GroupActivities and SharePlay. Use when implementing shared media playback, collaborative app featu |
|
|
189
|
+
| external | `skill-creator` | - | Author and refine skills for a plugin/toolkit efficiently. Use when creating a new skill, trimming or splitting an existing one, writing a s |
|
|
188
190
|
| external | `speech-recognition` | - | Transcribe speech to text using Apple's Speech framework. Use when implementing live microphone transcription with AVAudioEngine, recognizin |
|
|
189
191
|
| external | `spm-build-analysis` | - | Analyze Swift Package Manager dependencies, package plugins, module variants, and CI-oriented build overhead that slow Xcode builds. Use whe |
|
|
190
192
|
| external | `storekit` | - | Implement, review, or improve in-app purchases and subscriptions using StoreKit 2. Use when building paywalls with SubscriptionStoreView or |
|