@vegastack/skills 0.13.0 → 0.16.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +45 -8
- package/dist/index.js +184 -67
- package/package.json +1 -1
- package/skill/dev-implement/SKILL.md +1 -0
- package/skill/dev-review/SKILL.md +9 -2
- package/skill/dev-review/references/dispatch-prompts.md +12 -0
- package/skill/dev-review/references/security-axis.md +13 -1
- package/skill/dev-review/scripts/skill-scan.mjs +774 -0
- package/skill/dev-setup/SKILL.md +3 -0
- package/skill/dev-setup/assets/dev-profile.md.template +1 -0
- package/skill/skill-maintainer/SKILL.md +3 -1
- package/skill/skill-maintainer/references/standards.md +44 -0
- package/skill/skill-maintainer/refresh/REFRESH.md +2 -2
- package/skill/skillify/assets/templates/README.md.template +1 -1
- package/skill/skillify/refresh/REFRESH.md +1 -1
- package/skill/skillify/scripts/scaffold-skill.mjs +15 -4
- package/skill-integrity.json +38 -13
package/skill/dev-setup/SKILL.md
CHANGED
|
@@ -26,6 +26,8 @@ Facts are your job; decisions are the user's. Gather these silently and present
|
|
|
26
26
|
| existing labels | `gh label list` |
|
|
27
27
|
| native issue types | `gh api orgs/<org>/issue-types` — an `Epic` type routes parents to it; absent endpoint or type → the `epic` label fallback ([conventions](references/conventions.md)) |
|
|
28
28
|
| Codex CLI (cross-agent review) | `command -v codex` — absent → record the gap in dev.md `## Environments` and recommend installing it |
|
|
29
|
+
| agent skills in the repo | a directory holding skill folders, flat or one group deep — each folder carrying its own entry point — drafts the `skill-scan:` knob at that path; none found drafts `none`. Declare it **once**: a second `skill-scan:` line with a different value, even in a prose example, makes the profile ambiguous and the guard refuses. Where the project builds a flattened bundle the knob names the **built** directory, because unpackaged test fixtures are deliberately adversarial and score higher than anything that ships |
|
|
30
|
+
| SkillSpector (skill scanning) | `command -v skillspector` — absent while `skill-scan:` is set → record it in `## Environments` with `uv tool install git+https://github.com/NVIDIA/skillspector.git`; the guard refuses rather than skipping, so this is a real gap |
|
|
29
31
|
|
|
30
32
|
Not a git repo, or no origin remote → this is a **greenfield run, not an error**: follow the greenfield playbook in [stack-playbooks](references/stack-playbooks.md) — interview for the intended stack, offer `git init` and `gh repo create` each on its own yes, and render dev.md from the chosen playbook's conventions with TODO lines where machinery doesn't exist yet. A declined remote skips labels and records the TODO plainly.
|
|
31
33
|
|
|
@@ -47,6 +49,7 @@ Ask with your harness's question tool — AskUserQuestion in Claude Code, `reque
|
|
|
47
49
|
- Playbook matched → show the drafted `## Ship` runbook (each step `auto:`, `ask:`, or `guard:` — every `guard:` line carries its runnable command inline), the `changelog:` convention, and the `release:` knob (per-merge or on-request) for confirmation; a keep-a-changelog convention with no CHANGELOG.md yet → offer to seed the skeleton; no machinery → "Ship: merge only" and move on
|
|
48
50
|
- Guards drafted → offer to write their CI backstop steps into the project's workflow files (the local `guard:` lines run without CI); each file on the user's yes — release guards only, never general CI
|
|
49
51
|
- Environments or run commands detected → confirm the drafted `## Environments` and `## Verify` bullets
|
|
52
|
+
- Agent skills detected → confirm the drafted `skill-scan:` root, the `## Verify` bullet running the guard (preceded by the build command when the root is a build output), and a blocking `guard:` line in `## Ship` before the publish step — the published artifact is what the world installs. Skills detected but the operator declines the scan → `skill-scan: none`, said plainly, not silently omitted
|
|
50
53
|
- Evidence repo (`ui-evidence: playwright`) → default is the owner's **shared** `<owner>/dev-review-evidence`; if it doesn't exist, offer `gh repo create <owner>/dev-review-evidence --private --add-readme` + the layout/retention README — created once, every project points at it. An org naming policy that rejects the name → pick the closest compliant name with the user and record it in the knob (the name is a knob value, not a contract)
|
|
51
54
|
- App architecture detected → confirm the drafted `## Architecture` (hosting, stage, and kind are what detection usually can't fill — ask those); nothing detected → delete the section, the `stack:` line is enough
|
|
52
55
|
- A legacy `.vegastack/arch.md` exists → fold its knob lines into `## Architecture`, offer each dated `notes:` line to the decision register on the user's yes, then offer to delete arch.md
|
|
@@ -14,6 +14,7 @@ ui-evidence: playwright # playwright | none
|
|
|
14
14
|
evidence-repo: {{owner}}/dev-review-evidence # shared across projects; this project's folder = repo name; delete the line when ui-evidence is none
|
|
15
15
|
gates: 3 # 3 = approve/PR/merge · 2 = approve + one "ship it" · 1 = direct-to-main, ship word merges locally and pushes, no PR
|
|
16
16
|
tests: required # required | logic-only
|
|
17
|
+
skill-scan: none # ONE line only — directory holding the agent skills to scan (the BUILT one where a bundle is generated) | none. dev-review's guard reads this and refuses if a second line gives a different value
|
|
17
18
|
merge: squash
|
|
18
19
|
branch: <type>/<issue>-<slug> # type: feat | fix | docs | chore | refactor — the only place this list lives
|
|
19
20
|
labels: needs-operator needs-plan ready working for-operator risky research quick-build full-plan epic # epic label marks map parents only where the org has no native Epic issue type
|
|
@@ -37,7 +37,9 @@ Groups are this skill's responsibility: the repo shape, its `GROUP.md` files, an
|
|
|
37
37
|
2. **Put skills in it** — skillify's scaffolder places a new skill with `--group <name>`; it refuses — before writing anything — an unknown group, a malformed `GROUP.md`, a group with no README section, and a skill name already used at either depth, so a mistyped group never creates a stray family and the flat bundle never gets two skills of one name. Moving an existing skill into a group is a `git mv` plus its README row and its test's validator-import depth; `structure.mjs check` names anything left inconsistent.
|
|
38
38
|
3. **Check the shape** — `node packages/cli/scripts/structure.mjs check` blocks on illegal depth, name collisions, a missing or malformed `GROUP.md`, two groups sharing one `GROUP.md` title, a group with no README section, stray files in a group, a skill missing a contract meta file, packaging entries that disagree with the authored tree, a group-qualified packaging key, and README rows that are absent, duplicated, mispathed, or in the wrong section. It warns — without blocking, so warnings never fail `bun run check` — on an empty group, a group of one, and scaffolded placeholder text; `--strict` makes warnings exit 1. Dot-prefixed files and directories under `skills/` are ignored everywhere — discovery, this check, and the packaging build alike: they are tool and OS leftovers, not skills.
|
|
39
39
|
|
|
40
|
-
A group never reaches an
|
|
40
|
+
A group never reaches an installed **path**: the bundle is flat, so `GROUP.md` ships nowhere and an installed skill is always `<surface>/<bare-name>/`. A group is a *selection*, and the installer does expose it — `add`, `verify`, and `remove` each take one of a skill name, `--group <name>`, or `--all`, and a group install is one all-or-nothing transaction. Ungrouped skills at `skills/<name>/` stay fully supported; grouping is a choice, not a migration.
|
|
41
|
+
|
|
42
|
+
Two skills are marked repo-only in `packages/cli/repo-only.json`: `skill-maintainer` and `skillify` operate on this repository and do nothing useful elsewhere, so `--all` skips them while naming one explicitly still installs it. That list is data, validated by the build against the authored skills — never inferred from a skill's prose. Repo-only and group membership are independent: a group says where a skill is authored, the marker says who should install it.
|
|
41
43
|
|
|
42
44
|
## Workflow: scaffold a new skill
|
|
43
45
|
|
|
@@ -68,6 +68,8 @@ Source: https://hermes-agent.nousresearch.com/docs/user-guide/features/skills. <
|
|
|
68
68
|
|
|
69
69
|
Installer implication: the `@vegastack/skills` installer must treat Hermes as global-only — a "project install" for Hermes does not exist.
|
|
70
70
|
|
|
71
|
+
These paths are the harnesses' own discovery rules and are unaffected by how skills are selected. The installer's `--group` and `--all` flags choose *which* skills to act on; an installed skill is always `<surface>/<bare-name>/`, never `<surface>/<group>/<name>/`.
|
|
72
|
+
|
|
71
73
|
## Portability rules (this repo's policy)
|
|
72
74
|
|
|
73
75
|
One authored tree, three harnesses. Every skill in `skills/` follows all seven:
|
|
@@ -82,6 +84,48 @@ One authored tree, three harnesses. Every skill in `skills/` follows all seven:
|
|
|
82
84
|
|
|
83
85
|
Repo enforcement: `packages/cli/scripts/validate-skill.mjs` (run by `bun run check`) accepts exactly the spec six (`name`, `description`, `license`, `compatibility`, `allowed-tools`, `metadata`) and rejects everything else, enforces the full name grammar (lowercase-letter start, no consecutive hyphens, ≤64 chars, name equals the skill directory name), and rejects empty or over-length descriptions and angle brackets. Policy (rule 1) is stricter than the validator; the minimal two keys are the default.
|
|
84
86
|
|
|
87
|
+
## Skill scanning and the suppression baseline
|
|
88
|
+
|
|
89
|
+
Every skill this repo ships is scanned by [NVIDIA SkillSpector](https://github.com/NVIDIA/skillspector) through `dev-review`'s `scripts/skill-scan.mjs`, at the Verify gate before a push and again as a blocking `guard:` before publish. The guard blocks on any unsuppressed **HIGH or CRITICAL** finding and ignores the aggregate risk score: a skills repo documents the very mechanics the scanner matches on, so the score reflects our subject matter more than our risk.
|
|
90
|
+
|
|
91
|
+
Suppressions live in `.vegastack/skillspector-baseline.json` — a real SkillSpector baseline, passed with `--baseline`, so nothing here forks the scanner's own matching and upstream changes to it arrive for free. The rules this repo adds on top:
|
|
92
|
+
|
|
93
|
+
- **A suppression needs the operator's word.** It is a security decision on the record, the same as an operator dismissal appended to `.vegastack/review-known-patterns.md` — never a step taken to get a guard green.
|
|
94
|
+
- **Matchers must be LITERAL — the guard rejects `*`, `?`, `[` and `]` outright.** This is not a style preference: a rule of `{"id": "*"}` silenced all 39 findings while the guard reported "pass with warnings", and a first fix that rejected `*` and `**` was bypassed by `?*` on the next attempt. Matching wildcard *spellings* is an arms race; "name the thing" is the only mechanically checkable form of "scope a rule as narrowly as its cause". Two files means two rules, which reads better in a diff anyway. (Consequence worth knowing: a filename that literally contains `[` or `]` cannot be suppressed by a rule — the scanner would glob-interpret it too. Use a fingerprint.)
|
|
95
|
+
- **Scope a rule as narrowly as its cause.** `{"id": "P2"}` alone silences prompt injection across every skill forever; `{"id": "P2", "path": "references/conventions.md"}` silences one documented protocol in one file. A rule with no `path` needs a reason that explains why the whole repo is the cause.
|
|
96
|
+
- **`path` and `file` are the same matcher, `id` and `rule_id` likewise** — SkillSpector resolves `path = raw.get("path") or raw.get("file")`. Both spellings are accepted and both go through the literal check.
|
|
97
|
+
- **A baseline carrying `fingerprints:` must also set `scanner_version`** — the scanner refuses it otherwise, once per skill, and the guard catches that up front so one misconfiguration does not surface as a dozen unreadable-report failures.
|
|
98
|
+
- **Every `reason` carries a "Still flag if:" clause**, naming the condition that makes the pattern a real finding again. The guard blocks on a missing, empty, scanner-placeholder, or clause-less reason — this is enforced, not trusted.
|
|
99
|
+
- **`fingerprints:` are for one-off accepted findings only.** They are content-hashed, so any edit to the surrounding file re-triggers them — which is their re-trigger condition, and why they need a real reason but not the clause. A structural pattern suppressed by fingerprint will reappear at the worst possible moment; use a rule.
|
|
100
|
+
- **Never `--use-shipped-baseline`.** A baseline discovered inside a scanned skill was written by whoever wrote that skill.
|
|
101
|
+
- **The scan reads the built bundle** (`packages/cli/skill/`), not `skills/`: the authored tree carries unpackaged `tests/` fixtures that are deliberately adversarial and score higher than anything that ships. Build before scanning.
|
|
102
|
+
- **The semantic pass (`--llm`) is advisory and never a gate.** It is non-deterministic, and a run whose LLM calls partially fail reports a higher score than a clean one.
|
|
103
|
+
### Triaging a scan finding — the decision order
|
|
104
|
+
|
|
105
|
+
Work down this list; stop at the first that fits. Every acceptance needs the operator's word and a `reason` carrying its "Still flag if:" clause.
|
|
106
|
+
|
|
107
|
+
1. **Is it real?** Trace it before anything else. A real finding gets fixed, not accepted. Two on this repo turned out real and were fixed at source — a detection row whose wording introduced an `AE1`, and a template placeholder that shipped a literal `<group>`.
|
|
108
|
+
2. **Is the cause one file, shared by many skills?** Use a **rule** with a literal `id` + `path`. One cause, one entry, however many skills report it — the `references/conventions.md` marker protocol produces ten findings from one rule.
|
|
109
|
+
3. **Is it a one-off in specific content?** Use a **fingerprint**. Content-hashed, so it re-triggers the moment that content changes. Beware: the scanner's own `skillspector baseline` **deduplicates** what it emits, so a group of occurrences can come back as fewer hashes than the matcher needs — check the count actually drops before trusting it.
|
|
110
|
+
4. **Is it a completeness signal rather than a behaviour?** Use a **`coverage:`** entry, naming the skill, the file, and the file's `sha256`. This is ours, not the scanner's — SkillSpector's baseline suppresses findings only, and has no way to accept "I could not finish reading this". `AE1` belongs here despite arriving as a HIGH finding: its own text is *"Referenced artifact was not completely inspected."* Two things to know when writing one:
|
|
111
|
+
- **It is content-bound and expires.** Edit the accepted file and the acceptance stops applying, and the skill blocks until you re-adjudicate. That is the point: an acceptance that outlives the file it describes is a reason with nothing behind it. Refresh the digest **after** the final `bun run build`, since the bundle is what gets scanned — and note that editing the guard's own script invalidates its own entry.
|
|
112
|
+
- **Say what it hides.** A coverage entry accepts every `AE1` on that file and the degradation of every analyzer for that skill. Name the reason code and the number of degraded analyzers in the reason, so the next reader can tell whether the cause is still the one that was accepted.
|
|
113
|
+
|
|
114
|
+
5. **Write the "Still flag if:" clause so it can actually fire.** A clause naming something already true is decoration. Check it against the file before committing: "still flag if it gains a shell invocation" is worthless on a file that already shells out. Good clauses name a *change* — a different reason code, more degraded analyzers, a rule id the entry does not cover.
|
|
115
|
+
6. **None of the above?** Park it with a written ruling. Do not widen an entry to make a guard green — that is the failure this whole system exists to prevent.
|
|
116
|
+
|
|
117
|
+
### Known SkillSpector behaviours on this repo
|
|
118
|
+
|
|
119
|
+
Recorded so nobody re-derives them. All traced in issue 62.
|
|
120
|
+
|
|
121
|
+
- **A JavaScript template literal in assignment position degrades the static analyzers for the whole skill.** ``const at = `${a.file}:${a.line}`;`` trips the bounded shell parser, which reads the backticks as command substitution and exhausts its span limit. Verified experimentally: string concatenation scans clean, and forty template literals *inside function calls* do not degrade at all. It is the shape, not the volume. Any skill shipping a script with this idiom needs a `coverage:` entry — the alternative is banning ordinary JavaScript from skills.
|
|
122
|
+
- **`AE1` on a `SKILL.md` usually means its references, not its behaviour** — either repo-root paths that cannot resolve relative to a skill directory (correct for a repo-scoped meta-skill), or a file it links to that the parser could not finish. Check which before accepting.
|
|
123
|
+
- **`P2` fires on every HTML comment**, because a hidden instruction is a genuine injection vector. This repo uses HTML comments as machine-readable markers — `vsk:v1`, `vsk-dev:start`, `<!-- source: … -->`, `<!-- mirrored -->` — so the finding is the documentation of a mechanism, not an instance of one. Scope the rule to the file, never to the id alone.
|
|
124
|
+
- **`RA1` on a `refresh/REFRESH.md` is correct about the pattern.** The refresh contract genuinely instructs an agent to rewrite the skill's own files. It is acceptable only because the runner is the only writer, it edits marked sections, checksums are runner-only, and every change lands as a reviewed PR — write those bounds into the reason.
|
|
125
|
+
- **The aggregate risk score is not a gate.** It is inflated by unresolvable-path artifacts in meta-content and deflated by unrelated suppressions.
|
|
126
|
+
|
|
127
|
+
- **A skill authored elsewhere is scanned the same way, before it reaches an agent** — `--root <path to the skill>`. This repo does not yet redistribute anyone else's skill; when it does, the curation, audit, upstream-drift, release, and retirement rules are this skill's to own, and a curated skill is never hand-edited locally (a local fix is overwritten by the next upstream sync and forks us from its author). Scanning a third-party skill you are evaluating works today and needs none of that.
|
|
128
|
+
|
|
85
129
|
## UNVERIFIED register
|
|
86
130
|
|
|
87
131
|
Do not assert any of these; if one becomes load-bearing, verify against the live source first and move it into a marked sentence:
|
|
@@ -13,10 +13,10 @@ Instructions for the scheduled refresh agent (and any human running a manual ref
|
|
|
13
13
|
The deterministic runner is repo-shared, hosted at `tooling/refresh/`. Run from the repo root:
|
|
14
14
|
|
|
15
15
|
1. **Deterministic pass first** (no LLM judgment):
|
|
16
|
-
`node tooling/refresh/refresh-evidence.mjs --registry skills/skill-maintainer/refresh/sources.json`
|
|
16
|
+
`node tooling/refresh/refresh-evidence.mjs --registry skills/repo-tooling/skill-maintainer/refresh/sources.json`
|
|
17
17
|
drift/stale/unavailable results are the work-list. Exit 1 with a critical entry means fail-closed: the run must not be silently skipped. All four sources here are critical.
|
|
18
18
|
2. **Accept verified changes** in the same code path:
|
|
19
|
-
`node tooling/refresh/refresh-evidence.mjs --registry skills/skill-maintainer/refresh/sources.json --accept-baselines`
|
|
19
|
+
`node tooling/refresh/refresh-evidence.mjs --registry skills/repo-tooling/skill-maintainer/refresh/sources.json --accept-baselines`
|
|
20
20
|
This writes registry, cache, and drift report together — never hand-edit checksums, versions, or timestamps; they must always come from a run. Baselines are runner-seeded; when a new source is added or a verified change is accepted, this accept-baselines invocation is the only sanctioned way to update them.
|
|
21
21
|
3. **Semantic verification** for every source the deterministic pass flagged: read the changed page (fetch the registry URL), decide whether any `<!-- source: X -->` marked sentence in `references/standards.md` (or the mirrored SKILL.md hard-limits row) is now wrong, and propose the minimal edit. Unlike version-pin registries, checksum drift here is presumed meaningful until a human reads the diff — these pages define the standards themselves. Editorial churn may be accepted silently only after that read.
|
|
22
22
|
4. **One standing refresh PR**, branch `refresh/weekly`, force-updated on every run (never stacked duplicates; the weekly workflow .github/workflows/refresh.yml maintains it). PR body lists: each changed source, old→new checksum, links to the evidence, and which marked sentences changed and why. A maintainer review is mandatory before merge.
|
|
@@ -9,7 +9,7 @@ Instructions for the scheduled refresh agent (and any human running a manual ref
|
|
|
9
9
|
- the numeric limits and harness listing budgets table in `references/authoring.md` (marked `<!-- mirrored -->`);
|
|
10
10
|
- the model guidance section in `references/eval-playbook.md` (marked `<!-- volatile -->`).
|
|
11
11
|
|
|
12
|
-
Both mirror facts whose sources of truth are the agent-skills standards sources tracked in the **skill-maintainer** registry (`skills/skill-maintainer/refresh/sources.json`). `sources` here is therefore deliberately empty, and the refresh runner treats this registry as valid with nothing to fetch.
|
|
12
|
+
Both mirror facts whose sources of truth are the agent-skills standards sources tracked in the **skill-maintainer** registry (`skills/repo-tooling/skill-maintainer/refresh/sources.json`). `sources` here is therefore deliberately empty, and the refresh runner treats this registry as valid with nothing to fetch.
|
|
13
13
|
|
|
14
14
|
## How to refresh
|
|
15
15
|
|
|
@@ -222,14 +222,18 @@ export async function scaffoldSkill({ name, dir, group = null, write = false, no
|
|
|
222
222
|
// Every refusal belongs in this pre-flight. wireReadme runs after the tree is renamed into
|
|
223
223
|
// place and the packaging entry written, so anything discovered there would leave a half-wired
|
|
224
224
|
// skill on disk while reporting a refusal - or, worse, report success with no row at all.
|
|
225
|
+
// When a README exists, its row target must be resolvable BEFORE the tree is staged, so a
|
|
226
|
+
// refusal writes nothing. A wholly absent README or packaging.json keeps the documented
|
|
227
|
+
// degrade-to-`skipped:` contract (skillify's README, and the bare-repo test) - tightening that
|
|
228
|
+
// is a behaviour change of its own, tracked separately.
|
|
225
229
|
const readmePath = join(repoRoot, 'README.md')
|
|
226
230
|
if ((await entryAt(readmePath))?.isFile()) {
|
|
227
231
|
const lines = (await readFile(readmePath, 'utf8')).split('\n')
|
|
228
|
-
const
|
|
229
|
-
if (
|
|
232
|
+
const rowTarget = findRowInsertion(lines, group, groupHeading)
|
|
233
|
+
if (rowTarget?.missingSection) {
|
|
230
234
|
throw new Error(`README.md has no "### ${groupHeading}" section for group "${group}" - create it with structure.mjs create-group`)
|
|
231
235
|
}
|
|
232
|
-
if (!
|
|
236
|
+
if (!rowTarget) {
|
|
233
237
|
throw new Error(`README.md has no ${group ? `table under "### ${groupHeading}"` : 'ungrouped Skills table'} to add a row to - every skill needs its row, so refusing rather than scaffolding a skill the structure check would block`)
|
|
234
238
|
}
|
|
235
239
|
}
|
|
@@ -237,6 +241,9 @@ export async function scaffoldSkill({ name, dir, group = null, write = false, no
|
|
|
237
241
|
// The generated test imports the repo validator by relative path, so its depth follows the
|
|
238
242
|
// skill's: skills/<name>/tests/ is three levels up, skills/<group>/<name>/tests/ is four.
|
|
239
243
|
const validatorPath = `${group ? '../../../..' : '../../..'}/packages/cli/scripts/validate-skill.mjs`
|
|
244
|
+
// Only a grouped skill gets the family-install line; an ungrouped one would otherwise ship a
|
|
245
|
+
// command naming a group that does not exist.
|
|
246
|
+
const groupInstallLine = group ? `\nnpx @vegastack/skills add --group ${group} # or the whole ${group} family` : ''
|
|
240
247
|
|
|
241
248
|
const outputs = templateFiles.map(([source, output]) => [source, output ?? `tests/${name}.test.ts`])
|
|
242
249
|
const plan = { name, group, target, files: outputs.map(([, output]) => output), wrote: false }
|
|
@@ -247,7 +254,11 @@ export async function scaffoldSkill({ name, dir, group = null, write = false, no
|
|
|
247
254
|
try {
|
|
248
255
|
for (const [source, output] of outputs) {
|
|
249
256
|
const body = await readFile(join(templatesRoot, source), 'utf8')
|
|
250
|
-
const rendered = body
|
|
257
|
+
const rendered = body
|
|
258
|
+
.replaceAll('{{name}}', name)
|
|
259
|
+
.replaceAll('{{date}}', date)
|
|
260
|
+
.replaceAll('{{validatorPath}}', validatorPath)
|
|
261
|
+
.replaceAll('{{groupInstallLine}}', groupInstallLine)
|
|
251
262
|
const destination = join(staging, output)
|
|
252
263
|
await mkdir(dirname(destination), { recursive: true })
|
|
253
264
|
await writeFile(destination, rendered)
|
package/skill-integrity.json
CHANGED
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
"schemaVersion": 2,
|
|
3
3
|
"skills": {
|
|
4
4
|
"dev-architect": {
|
|
5
|
+
"group": "dev-skills",
|
|
6
|
+
"repoOnly": false,
|
|
5
7
|
"files": {
|
|
6
8
|
"SKILL.md": "74150dde2d3c83598769a4c9f8cd295a7496d9eb9a5e920a29cba8464eb58128",
|
|
7
9
|
"agents/openai.yaml": "99023b056d5c568ff3acc059e5bb7a4e6cfa5261cd0d35a525407f9e159de562",
|
|
@@ -20,6 +22,8 @@
|
|
|
20
22
|
}
|
|
21
23
|
},
|
|
22
24
|
"dev-chronicle": {
|
|
25
|
+
"group": "dev-skills",
|
|
26
|
+
"repoOnly": false,
|
|
23
27
|
"files": {
|
|
24
28
|
"SKILL.md": "23c6266758726d6435de38cb0cc142a94a0b55f2329f7ab6404e42fa5d0dee3a",
|
|
25
29
|
"agents/openai.yaml": "765b12e17b7fce88c53ca0fae735bf0efceb843cc3703b91bc1801ab5cac06b4",
|
|
@@ -29,6 +33,8 @@
|
|
|
29
33
|
}
|
|
30
34
|
},
|
|
31
35
|
"dev-debug": {
|
|
36
|
+
"group": "dev-skills",
|
|
37
|
+
"repoOnly": false,
|
|
32
38
|
"files": {
|
|
33
39
|
"SKILL.md": "38ba9e67c00925f4e4738be333dc398218008df929fcf17b61398966ce4deee1",
|
|
34
40
|
"agents/openai.yaml": "4aa52b5c620b0bf4de7f1609867956ce762d83dc4297ab5670a68c206ae63075",
|
|
@@ -39,8 +45,10 @@
|
|
|
39
45
|
}
|
|
40
46
|
},
|
|
41
47
|
"dev-implement": {
|
|
48
|
+
"group": "dev-skills",
|
|
49
|
+
"repoOnly": false,
|
|
42
50
|
"files": {
|
|
43
|
-
"SKILL.md": "
|
|
51
|
+
"SKILL.md": "f79f4d312f6c03ffdcf2e2fd44169e48520445900389e2d469c0946811be3801",
|
|
44
52
|
"agents/openai.yaml": "1abab383deca54d32749fd9156f9a6211fe96e02e0166dc8a16ff8459ac31b74",
|
|
45
53
|
"references/conventions.md": "815f5189daff1b71b3251b7a57de183a4a387fcdedbd5875e673d5bd3de398fc",
|
|
46
54
|
"references/ledger-and-resume.md": "5e3deae2af67735940564e04adcbc23c0c0dc86da2f6c80d68b8c1207c8f5900",
|
|
@@ -52,6 +60,8 @@
|
|
|
52
60
|
}
|
|
53
61
|
},
|
|
54
62
|
"dev-intake": {
|
|
63
|
+
"group": "dev-skills",
|
|
64
|
+
"repoOnly": false,
|
|
55
65
|
"files": {
|
|
56
66
|
"SKILL.md": "4754383297822d3f6e0ad8a391ac76499d83c74f424b90b928199d6c2649dc71",
|
|
57
67
|
"agents/openai.yaml": "5473d2d3efffc518c07dfa8e6788c6535a5054ceca696119c5856ad265ef5581",
|
|
@@ -63,6 +73,8 @@
|
|
|
63
73
|
}
|
|
64
74
|
},
|
|
65
75
|
"dev-plan": {
|
|
76
|
+
"group": "dev-skills",
|
|
77
|
+
"repoOnly": false,
|
|
66
78
|
"files": {
|
|
67
79
|
"SKILL.md": "eb2ce1542b1769fa6e7d9dc7be9fc9c84df8b353ded16e39e1e578ee372c1aca",
|
|
68
80
|
"agents/openai.yaml": "4b9ccc9870b4eafb73c1bc4492a0b5a530097bbcbae11dbf3235160f4f05587b",
|
|
@@ -74,24 +86,29 @@
|
|
|
74
86
|
}
|
|
75
87
|
},
|
|
76
88
|
"dev-review": {
|
|
89
|
+
"group": "dev-skills",
|
|
90
|
+
"repoOnly": false,
|
|
77
91
|
"files": {
|
|
78
|
-
"SKILL.md": "
|
|
92
|
+
"SKILL.md": "561e0232d20fc7e6893b38a4c3d7deb41862d60d7b545a98d3ce7ba1d3c7ac06",
|
|
79
93
|
"agents/openai.yaml": "3f35d3dc60f179d4ac2526997c4d10173ba3018d06f0dbe77e209ce2978fa702",
|
|
80
94
|
"assets/review-known-patterns.md.template": "2fe7dbcc4d0eeac542e7624111130265b2bb4f08806f20dbd2087842cbb22b5c",
|
|
81
95
|
"references/conventions.md": "815f5189daff1b71b3251b7a57de183a4a387fcdedbd5875e673d5bd3de398fc",
|
|
82
96
|
"references/cross-agent.md": "3541715d0563703373ea3d93582119b80356d1cbdee19ce17f958c0f7c914884",
|
|
83
|
-
"references/dispatch-prompts.md": "
|
|
84
|
-
"references/security-axis.md": "
|
|
97
|
+
"references/dispatch-prompts.md": "cb8134a7b6ff9e20ec4db02d0af2f8767f71bf13fa9a21b28b7a586c2747ec1d",
|
|
98
|
+
"references/security-axis.md": "e207071fc48f761f2deb24c73ef4f5ebcf28c130264dab7c3061ae6c0eee6543",
|
|
85
99
|
"refresh/REFRESH.md": "242c1efe630327abe12bf9db4c4085aaf05b262a4dbd885b12b0f29cdd4a285d",
|
|
86
|
-
"refresh/sources.json": "a7ba2340964dc70410626087686145b5790a0e763a18ef2c4d9aa37e950f2e04"
|
|
100
|
+
"refresh/sources.json": "a7ba2340964dc70410626087686145b5790a0e763a18ef2c4d9aa37e950f2e04",
|
|
101
|
+
"scripts/skill-scan.mjs": "2d74ebd63ffd66cca5208b5dab2984ace47ef4e832e188f6811ff7c2e303095d"
|
|
87
102
|
}
|
|
88
103
|
},
|
|
89
104
|
"dev-setup": {
|
|
105
|
+
"group": "dev-skills",
|
|
106
|
+
"repoOnly": false,
|
|
90
107
|
"files": {
|
|
91
|
-
"SKILL.md": "
|
|
108
|
+
"SKILL.md": "4b29049b8ce165fb03f554c8784e095cbe97cef16752b57b86321352a1017ce7",
|
|
92
109
|
"agents/openai.yaml": "be790c04fdf910e71642cfadf1a7c07c217bf7fad18581610feb4c31a79651f2",
|
|
93
110
|
"assets/agents-section.md.template": "6c9591d50f73e1e05e78c8969c7836767432cf32487af7205b2cb9f4a410440e",
|
|
94
|
-
"assets/dev-profile.md.template": "
|
|
111
|
+
"assets/dev-profile.md.template": "b42b633b5e236bd8448648c2475978488afcac23c99342619a71670abbd7122c",
|
|
95
112
|
"references/conventions.md": "815f5189daff1b71b3251b7a57de183a4a387fcdedbd5875e673d5bd3de398fc",
|
|
96
113
|
"references/harness-facts.md": "2be1d81f6a616d40dc865aaeefaf53c61bc13ade4ba1de8fb406c520bf15be40",
|
|
97
114
|
"references/stack-playbooks.md": "8f457c3d0f96e3c99d745b04332590fdf8af53a9694541181d9c878ae0718ea2",
|
|
@@ -100,6 +117,8 @@
|
|
|
100
117
|
}
|
|
101
118
|
},
|
|
102
119
|
"dev-ship": {
|
|
120
|
+
"group": "dev-skills",
|
|
121
|
+
"repoOnly": false,
|
|
103
122
|
"files": {
|
|
104
123
|
"SKILL.md": "aa3bd8b0a1ac076309190f2008896f24ebe1216352872ff428c1b88b55c06e65",
|
|
105
124
|
"agents/openai.yaml": "8f18cfd505131557eb4c9f7b7f54e9069f787be4c162403fc30253eed49a06ea",
|
|
@@ -111,6 +130,8 @@
|
|
|
111
130
|
}
|
|
112
131
|
},
|
|
113
132
|
"dev-status": {
|
|
133
|
+
"group": "dev-skills",
|
|
134
|
+
"repoOnly": false,
|
|
114
135
|
"files": {
|
|
115
136
|
"SKILL.md": "56415c2f69bb1a2fcb488b9846a20e632eb902b05c5b2b58ae9206d3eaffd77b",
|
|
116
137
|
"agents/openai.yaml": "72435947f5afef0c8a2c170e987b14fe6057b174318c16b6b538ae8d129791fb",
|
|
@@ -121,20 +142,24 @@
|
|
|
121
142
|
}
|
|
122
143
|
},
|
|
123
144
|
"skill-maintainer": {
|
|
145
|
+
"group": "repo-tooling",
|
|
146
|
+
"repoOnly": true,
|
|
124
147
|
"files": {
|
|
125
|
-
"SKILL.md": "
|
|
148
|
+
"SKILL.md": "1733d2f1fa756cbb37c74ecee0d48ddd9abf31155c4dd72eba10af31c33d88ec",
|
|
126
149
|
"agents/openai.yaml": "0b89d4e6416cf20b448f5322f3d7433cfde333d2b4a05b42ed53db3759701fb4",
|
|
127
150
|
"references/release-ops.md": "b5df1922b34daf7751c332c019a0ea770a48283aaa2e25f83c9851bef47999b1",
|
|
128
|
-
"references/standards.md": "
|
|
129
|
-
"refresh/REFRESH.md": "
|
|
151
|
+
"references/standards.md": "b44122822a320a305728ee023ed8e3140bf87aaaef400a43d45b778e53ad2c02",
|
|
152
|
+
"refresh/REFRESH.md": "d3ba44be2c264b849d8a815111c049e782720428d5d0c5cea23998b05e50d58f",
|
|
130
153
|
"refresh/sources.json": "4977152381d53555196ac676f95e61b4eaa301309a17560da5cda722010eb80f"
|
|
131
154
|
}
|
|
132
155
|
},
|
|
133
156
|
"skillify": {
|
|
157
|
+
"group": "repo-tooling",
|
|
158
|
+
"repoOnly": true,
|
|
134
159
|
"files": {
|
|
135
160
|
"SKILL.md": "310ac32ff4d557cc166a470fd1866060dfc5f03898e8ff3da9c406b84580742b",
|
|
136
161
|
"agents/openai.yaml": "df320cf32a8db06c213f7892844dab810b7e96cfbf32502d25185d4a4167ef87",
|
|
137
|
-
"assets/templates/README.md.template": "
|
|
162
|
+
"assets/templates/README.md.template": "49dccb4e9b5bdb07c254f9142502b3fd11fd5b083d8661b0ae6a567dec79de74",
|
|
138
163
|
"assets/templates/REFRESH.md.template": "ff86afade565d668333e7f6d0432213760fd68a62b8ba22897a8601b74c94ac0",
|
|
139
164
|
"assets/templates/SKILL.md.template": "b038775f97b13b54227fe41a767a48cdaa922a93d1732f22c2d1d79bff52ca00",
|
|
140
165
|
"assets/templates/openai.yaml.template": "2fbf488369825109d6cad4f17e7b729a40d9e3c43c7f01bc5dfa16361d59c086",
|
|
@@ -143,9 +168,9 @@
|
|
|
143
168
|
"assets/templates/trigger-queries.json.template": "37517e5f3dc66819f61f5a7bb8ace1921282415f10551d2defa5c3eb0985b570",
|
|
144
169
|
"references/authoring.md": "de61bc54140e07bb1910d5adac4e988e10fea9bd11b3e27234c0c699aa7bbf0d",
|
|
145
170
|
"references/eval-playbook.md": "1f463dfea8d69b7022712776794369892643aa020186fe3a3707c493a6c2d4e9",
|
|
146
|
-
"refresh/REFRESH.md": "
|
|
171
|
+
"refresh/REFRESH.md": "695f3283b27c14accf4095137898ce1f6dc40749483c5a5705e80aa9693f08c2",
|
|
147
172
|
"refresh/sources.json": "e554e80c72c16dc70587361804db9e0cf2716c128820b2612d5983a009b2b242",
|
|
148
|
-
"scripts/scaffold-skill.mjs": "
|
|
173
|
+
"scripts/scaffold-skill.mjs": "8bc3314f800fcff0bf5f797fdd82424ceb16a45ac03c4ee0eebcc416dfc41b97"
|
|
149
174
|
}
|
|
150
175
|
}
|
|
151
176
|
}
|