@tacuchi/agent-workflow-cli 14.0.0 → 14.1.1
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 +1 -1
- package/dist/application/plugin-doctor/skills.d.ts.map +1 -1
- package/dist/application/plugin-doctor/skills.js +78 -32
- package/dist/application/plugin-doctor/skills.js.map +1 -1
- package/dist/application/session-resolver.d.ts.map +1 -1
- package/dist/application/session-resolver.js +10 -1
- package/dist/application/session-resolver.js.map +1 -1
- package/dist/application/skill-index-service.d.ts.map +1 -1
- package/dist/application/skill-index-service.js +5 -24
- package/dist/application/skill-index-service.js.map +1 -1
- package/dist/application/skills-resolver-service.d.ts +25 -1
- package/dist/application/skills-resolver-service.d.ts.map +1 -1
- package/dist/application/skills-resolver-service.js +84 -0
- package/dist/application/skills-resolver-service.js.map +1 -1
- package/dist/cli/commands/skills.d.ts.map +1 -1
- package/dist/cli/commands/skills.js +8 -2
- package/dist/cli/commands/skills.js.map +1 -1
- package/dist/domain/skill-frontmatter.d.ts +26 -0
- package/dist/domain/skill-frontmatter.d.ts.map +1 -0
- package/dist/domain/skill-frontmatter.js +141 -0
- package/dist/domain/skill-frontmatter.js.map +1 -0
- package/package.json +1 -1
- package/skills/w/SKILL.md +2 -2
- package/skills/w/commands/spec-refine.md +1 -1
- package/skills/w/loops/plan-exec-loop/SKILL.md +11 -13
- package/skills/w/loops/spec-refine-loop/SKILL.md +12 -2
- package/skills/w/roles/README.md +1 -1
package/README.md
CHANGED
|
@@ -23,7 +23,7 @@ The harness has three layers plus a permanent `docs/` zone:
|
|
|
23
23
|
- **Layer 2 · Loops** — the AI runs them whole: `spec-refine-loop` (chassis) · `plan-new-loop` · `plan-exec-loop` · `quick-loop`. Each loop is a **persistent goal** that runs until its success criteria are green (verification-first); gap-driven, with **structured-choice** lifecycle control (compact/close — `AskUserQuestion` on Claude Code, numbered markdown elsewhere) and resumable `CHECKPOINT`.
|
|
24
24
|
- **Layer 3 · Sessions + artifacts** — internal, ephemeral process state under `.workflow/sessions/` (`SESSION` · `CHECKPOINT` · `BACKLOG` · `SCRIPTS.sql` · `ANALYSIS-FILE` · `CONCLUSIONS` · `DECISION` · …). Sessions are slug-named folders, created by loops, never by the user.
|
|
25
25
|
|
|
26
|
-
**Pluggable capabilities.** Loops compose capability **roles** (`ui-design`, `sql`, `git`, `research`, `diagrams`, `overview`); the concrete skill bound to each role is resolved via `.workflow/skills.toml` (cascade: built-in default → `~/.workflow/skills.toml` → workspace). Inspect bindings with `aw skills
|
|
26
|
+
**Pluggable capabilities.** Loops compose capability **roles** (`ui-design`, `sql`, `git`, `research`, `diagrams`, `overview`); the concrete skill bound to each role is resolved via `.workflow/skills.toml` (cascade: built-in default → `~/.workflow/skills.toml` → workspace). Inspect bindings with `aw skills` (advisory: it also warns when a bound skill is not installed in the standard skill roots — the binding itself is not auto-validated). Code/testing/writing conventions **and tool authoring** (`creating-tools`) are **not** roles — they're ambient skills the host auto-applies when present, independent of the workflow. Per-source launch scripts live under `.workflow/launch/` (machine-specific, gitignored); created tools live under `docs/tools/`.
|
|
27
27
|
|
|
28
28
|
**Invariants.** No auto-export (only `export-*` writes `docs/`); the spec and plan are documents, not artifacts; DB scripts-only (never executes DML/DDL); git-safe (verifies the per-source working branch before edits; proposes commits).
|
|
29
29
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../../../src/application/plugin-doctor/skills.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../../../src/application/plugin-doctor/skills.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,oBAAoB,EAAwB,MAAM,aAAa,CAAC;AAUlG,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,oBAAoB,EAAE,CAAC;IACnC,QAAQ,EAAE,aAAa,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,iBAAiB;IAChC,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,gBAAgB,EAAE,OAAO,GAAG,IAAI,CAAC;IACjC,QAAQ,EAAE,aAAa,EAAE,CAAC;CAC3B;AAED,wBAAsB,sBAAsB,CAC1C,SAAS,EAAE,MAAM,EACjB,EAAE,EAAE,cAAc,GACjB,OAAO,CAAC,iBAAiB,CAAC,CAqB5B;AAED,wBAAsB,eAAe,CACnC,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,EACnB,EAAE,EAAE,cAAc,GACjB,OAAO,CAAC,iBAAiB,CAAC,CA+B5B;AAED,wBAAsB,iCAAiC,CACrD,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,EAAE,EAAE,cAAc,GACjB,OAAO,CAAC,aAAa,EAAE,CAAC,CAgB1B"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { join, relative, sep } from "node:path";
|
|
2
|
+
import { getSkillVersion, parseSkillFrontmatter, } from "../../domain/skill-frontmatter.js";
|
|
2
3
|
import { collectMarkdownFiles } from "./common.js";
|
|
3
4
|
const SESSION_SPECIFIC_MARKERS = [
|
|
4
5
|
"session034",
|
|
@@ -15,16 +16,16 @@ export async function checkSkillsFrontmatter(skillsDir, fs) {
|
|
|
15
16
|
const skillMd = join(sd, "SKILL.md");
|
|
16
17
|
const dirName = sd.split(sep).pop() ?? "";
|
|
17
18
|
const parsed = await parseSkillFile(skillMd, fs);
|
|
18
|
-
if (parsed.error) {
|
|
19
|
-
findings.push({ level: "error", file: skillMd, msg: parsed.error });
|
|
19
|
+
if (parsed.error || !parsed.fm) {
|
|
20
|
+
findings.push({ level: "error", file: skillMd, msg: parsed.error ?? "invalid frontmatter" });
|
|
20
21
|
skillsInfo.push({ dir: dirName, name: null, version: null });
|
|
21
22
|
continue;
|
|
22
23
|
}
|
|
23
|
-
validateSkillFrontmatter(skillMd, dirName, parsed.
|
|
24
|
+
validateSkillFrontmatter(skillMd, dirName, parsed.fm, findings);
|
|
24
25
|
skillsInfo.push({
|
|
25
26
|
dir: dirName,
|
|
26
|
-
name: parsed.
|
|
27
|
-
version: parsed.
|
|
27
|
+
name: parsed.fm.fields.name ?? null,
|
|
28
|
+
version: getSkillVersion(parsed.fm),
|
|
28
29
|
});
|
|
29
30
|
}
|
|
30
31
|
return { skillsCount: skillDirs.length, skillsInfo, findings };
|
|
@@ -102,49 +103,94 @@ async function parseSkillFile(skillMd, fs) {
|
|
|
102
103
|
content = await fs.readText(skillMd);
|
|
103
104
|
}
|
|
104
105
|
catch (e) {
|
|
105
|
-
return {
|
|
106
|
+
return { fm: null, error: `cannot read: ${e.message}` };
|
|
106
107
|
}
|
|
107
|
-
const
|
|
108
|
-
if (
|
|
109
|
-
return {
|
|
110
|
-
}
|
|
111
|
-
let endIdx = -1;
|
|
112
|
-
for (let i = 1; i < lines.length; i++) {
|
|
113
|
-
if ((lines[i] ?? "").trim() === "---") {
|
|
114
|
-
endIdx = i;
|
|
115
|
-
break;
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
if (endIdx === -1) {
|
|
119
|
-
return { frontmatter: {}, error: "missing frontmatter closing ---" };
|
|
120
|
-
}
|
|
121
|
-
const fm = {};
|
|
122
|
-
for (let i = 1; i < endIdx; i++) {
|
|
123
|
-
const m = (lines[i] ?? "").match(/^(\w+):\s*(.+)$/);
|
|
124
|
-
if (m?.[1] && m[2] !== undefined)
|
|
125
|
-
fm[m[1]] = m[2].trim();
|
|
126
|
-
}
|
|
127
|
-
return { frontmatter: fm, error: null };
|
|
108
|
+
const fm = parseSkillFrontmatter(content);
|
|
109
|
+
if (!fm)
|
|
110
|
+
return { fm: null, error: "missing or unclosed frontmatter (---)" };
|
|
111
|
+
return { fm, error: null };
|
|
128
112
|
}
|
|
113
|
+
// Limits from the Agent Skills standard (agentskills.io/specification).
|
|
114
|
+
const NAME_MAX = 64;
|
|
115
|
+
const DESCRIPTION_MAX = 1024;
|
|
116
|
+
const NAME_PATTERN = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;
|
|
117
|
+
const ALLOWED_TOP_LEVEL_KEYS = new Set([
|
|
118
|
+
"name",
|
|
119
|
+
"description",
|
|
120
|
+
"license",
|
|
121
|
+
"allowed-tools",
|
|
122
|
+
"metadata",
|
|
123
|
+
"compatibility",
|
|
124
|
+
]);
|
|
129
125
|
function validateSkillFrontmatter(skillMd, dirName, fm, findings) {
|
|
130
|
-
|
|
126
|
+
checkName(skillMd, dirName, fm.fields.name, findings);
|
|
127
|
+
checkDescription(skillMd, fm.fields.description, findings);
|
|
128
|
+
checkTopLevelKeys(skillMd, fm.fields, findings);
|
|
129
|
+
checkVersion(skillMd, getSkillVersion(fm), findings);
|
|
130
|
+
}
|
|
131
|
+
function checkName(skillMd, dirName, name, findings) {
|
|
131
132
|
if (!name) {
|
|
132
133
|
findings.push({ level: "error", file: skillMd, msg: "missing 'name' in frontmatter" });
|
|
134
|
+
return;
|
|
133
135
|
}
|
|
134
|
-
|
|
136
|
+
if (name !== dirName) {
|
|
135
137
|
findings.push({
|
|
136
138
|
level: "warn",
|
|
137
139
|
file: skillMd,
|
|
138
140
|
msg: `frontmatter name '${name}' differs from directory '${dirName}'`,
|
|
139
141
|
});
|
|
140
142
|
}
|
|
143
|
+
if (name.length > NAME_MAX) {
|
|
144
|
+
findings.push({
|
|
145
|
+
level: "warn",
|
|
146
|
+
file: skillMd,
|
|
147
|
+
msg: `name is ${name.length} chars; the Agent Skills standard caps it at ${NAME_MAX}`,
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
if (!NAME_PATTERN.test(name)) {
|
|
151
|
+
findings.push({
|
|
152
|
+
level: "warn",
|
|
153
|
+
file: skillMd,
|
|
154
|
+
msg: `name '${name}' is not lowercase alphanumeric + single hyphens (no leading/trailing or doubled '-')`,
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
function checkDescription(skillMd, description, findings) {
|
|
141
159
|
if (!description) {
|
|
142
160
|
findings.push({ level: "error", file: skillMd, msg: "missing 'description' in frontmatter" });
|
|
161
|
+
return;
|
|
143
162
|
}
|
|
144
|
-
if (
|
|
145
|
-
findings.push({
|
|
163
|
+
if (description.length > DESCRIPTION_MAX) {
|
|
164
|
+
findings.push({
|
|
165
|
+
level: "warn",
|
|
166
|
+
file: skillMd,
|
|
167
|
+
msg: `description is ${description.length} chars; the Agent Skills standard caps it at ${DESCRIPTION_MAX} — lenient clients truncate the overflow (often the cross-skill 'For X load Y' pointers)`,
|
|
168
|
+
});
|
|
146
169
|
}
|
|
147
|
-
|
|
170
|
+
}
|
|
171
|
+
function checkTopLevelKeys(skillMd, fields, findings) {
|
|
172
|
+
if ("version" in fields) {
|
|
173
|
+
findings.push({
|
|
174
|
+
level: "warn",
|
|
175
|
+
file: skillMd,
|
|
176
|
+
msg: "top-level 'version' is non-standard; move it to metadata.version (the Agent Skills standard rejects unknown top-level keys)",
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
for (const key of Object.keys(fields)) {
|
|
180
|
+
if (key === "version" || ALLOWED_TOP_LEVEL_KEYS.has(key))
|
|
181
|
+
continue;
|
|
182
|
+
findings.push({
|
|
183
|
+
level: "warn",
|
|
184
|
+
file: skillMd,
|
|
185
|
+
msg: `unknown top-level frontmatter key '${key}'; the Agent Skills standard allows only ${[...ALLOWED_TOP_LEVEL_KEYS].join(", ")} (extra data goes under metadata)`,
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
function checkVersion(skillMd, version, findings) {
|
|
190
|
+
// version is OPTIONAL per the Agent Skills standard (metadata.version); only a
|
|
191
|
+
// malformed value is worth a warning. Skills registered in plugin.json
|
|
192
|
+
// exportedSkills still require a version — that is enforced in exported-skills.ts.
|
|
193
|
+
if (version && !/^\d+\.\d+\.\d+$/.test(version)) {
|
|
148
194
|
findings.push({
|
|
149
195
|
level: "warn",
|
|
150
196
|
file: skillMd,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skills.js","sourceRoot":"","sources":["../../../src/application/plugin-doctor/skills.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"skills.js","sourceRoot":"","sources":["../../../src/application/plugin-doctor/skills.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-resolver.d.ts","sourceRoot":"","sources":["../../src/application/session-resolver.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAE9D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAMvD,8DAA8D;AAC9D,eAAO,MAAM,aAAa,YAAY,CAAC;AAEvC,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,8CAA8C;IAC9C,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,YAAY,CAAC;IACpB,gEAAgE;IAChE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG;IAClD,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;CACd,CAUA;AAED,MAAM,WAAW,iBAAiB;IAChC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,wBAAsB,iBAAiB,CACrC,EAAE,EAAE,cAAc,EAClB,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,YAAY,CAAC,CAwBvB;AAED,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,YAAY,EACnB,GAAG,EAAE,MAAM,EACX,OAAO,GAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAO,GAClC,YAAY,CAId;AAED,wBAAsB,kBAAkB,CACtC,EAAE,EAAE,cAAc,EAClB,GAAG,EAAE,MAAM,GACV,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EAAE,CAAC,CAW3C;AAED,wBAAsB,cAAc,CAClC,EAAE,EAAE,cAAc,EAClB,GAAG,EAAE,OAAO,EACZ,KAAK,EAAE,YAAY,EACnB,WAAW,EAAE,MAAM,GAAG,SAAS,EAC/B,QAAQ,UAAQ,GACf,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"session-resolver.d.ts","sourceRoot":"","sources":["../../src/application/session-resolver.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAE9D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAMvD,8DAA8D;AAC9D,eAAO,MAAM,aAAa,YAAY,CAAC;AAEvC,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,8CAA8C;IAC9C,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,YAAY,CAAC;IACpB,gEAAgE;IAChE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG;IAClD,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;CACd,CAUA;AAED,MAAM,WAAW,iBAAiB;IAChC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,wBAAsB,iBAAiB,CACrC,EAAE,EAAE,cAAc,EAClB,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,YAAY,CAAC,CAwBvB;AAED,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,YAAY,EACnB,GAAG,EAAE,MAAM,EACX,OAAO,GAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAO,GAClC,YAAY,CAId;AAED,wBAAsB,kBAAkB,CACtC,EAAE,EAAE,cAAc,EAClB,GAAG,EAAE,MAAM,GACV,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EAAE,CAAC,CAW3C;AAED,wBAAsB,cAAc,CAClC,EAAE,EAAE,cAAc,EAClB,GAAG,EAAE,OAAO,EACZ,KAAK,EAAE,YAAY,EACnB,WAAW,EAAE,MAAM,GAAG,SAAS,EAC/B,QAAQ,UAAQ,GACf,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CA8C9B"}
|
|
@@ -68,7 +68,16 @@ export async function resolveSession(fs, env, paths, sessionCode, anyState = fal
|
|
|
68
68
|
const lookupCode = normalizeCode(sessionCode);
|
|
69
69
|
for (const folder of folders) {
|
|
70
70
|
const { code } = parseSessionFolder(folder.name);
|
|
71
|
-
|
|
71
|
+
// Match the legacy numeric code, an exact new-model folder name, or a
|
|
72
|
+
// prefix up to a `-` word boundary. The boundary matters: a bare
|
|
73
|
+
// `startsWith(code)` lets "100" fuzzy-match "1000-…" (reachable once the
|
|
74
|
+
// global counter passes 999 and 4-digit prefixes coexist with 3-digit
|
|
75
|
+
// ones) or "01" match "012-…", silently resolving the wrong session.
|
|
76
|
+
// Anchor on the normalized `lookupCode` so abbreviated numeric codes
|
|
77
|
+
// (e.g. `--code 1`) resolve consistently too.
|
|
78
|
+
if (code === lookupCode ||
|
|
79
|
+
folder.name === lookupCode ||
|
|
80
|
+
folder.name.startsWith(`${lookupCode}-`)) {
|
|
72
81
|
return buildSessionEntry(fs, folder.path, folder.name);
|
|
73
82
|
}
|
|
74
83
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-resolver.js","sourceRoot":"","sources":["../../src/application/session-resolver.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"session-resolver.js","sourceRoot":"","sources":["../../src/application/session-resolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skill-index-service.d.ts","sourceRoot":"","sources":["../../src/application/skill-index-service.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"skill-index-service.d.ts","sourceRoot":"","sources":["../../src/application/skill-index-service.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAE9D,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,QAAQ,EAAE,OAAO,CAAC;IAClB,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,cAAc,EAAE,OAAO,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,eAAe;IAC9B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,OAAO,CAAC;IACvB,MAAM,EAAE,cAAc,EAAE,CAAC;CAC1B;AAED,wBAAsB,aAAa,CACjC,EAAE,EAAE,cAAc,EAClB,GAAG,EAAE,OAAO,EACZ,KAAK,EAAE,eAAe,GACrB,OAAO,CAAC,gBAAgB,CAAC,CAY3B"}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { join, posix as posixPath, relative } from "node:path";
|
|
2
2
|
import { HARNESSES } from "../domain/harnesses.js";
|
|
3
|
-
|
|
4
|
-
const FRONTMATTER_MAX_LINES = 60;
|
|
3
|
+
import { getSkillVersion, parseSkillFrontmatter } from "../domain/skill-frontmatter.js";
|
|
5
4
|
export async function runSkillIndex(fs, env, input) {
|
|
6
5
|
const pluginRoot = input.pluginRoot ?? env.cwd();
|
|
7
6
|
const pluginName = await readPluginName(fs, pluginRoot);
|
|
@@ -44,7 +43,7 @@ async function buildIndex(fs, pluginRoot) {
|
|
|
44
43
|
if (!(await fs.exists(skillMd)))
|
|
45
44
|
continue;
|
|
46
45
|
const text = await fs.readText(skillMd);
|
|
47
|
-
const fm =
|
|
46
|
+
const fm = parseSkillFrontmatter(text);
|
|
48
47
|
const relPath = toPosixRelative(skillMd, pluginRoot);
|
|
49
48
|
if (!fm) {
|
|
50
49
|
items.push({
|
|
@@ -57,11 +56,11 @@ async function buildIndex(fs, pluginRoot) {
|
|
|
57
56
|
});
|
|
58
57
|
continue;
|
|
59
58
|
}
|
|
60
|
-
const name = fm.name ?? dir.name;
|
|
59
|
+
const name = fm.fields.name ?? dir.name;
|
|
61
60
|
items.push({
|
|
62
61
|
name,
|
|
63
|
-
description: fm.description ?? null,
|
|
64
|
-
version: fm
|
|
62
|
+
description: fm.fields.description ?? null,
|
|
63
|
+
version: getSkillVersion(fm),
|
|
65
64
|
exported: false,
|
|
66
65
|
registry_version: null,
|
|
67
66
|
since_export: null,
|
|
@@ -72,24 +71,6 @@ async function buildIndex(fs, pluginRoot) {
|
|
|
72
71
|
items.sort((a, b) => a.name.localeCompare(b.name));
|
|
73
72
|
return items;
|
|
74
73
|
}
|
|
75
|
-
function parseFrontmatter(text) {
|
|
76
|
-
const lines = text.split("\n");
|
|
77
|
-
if ((lines[0] ?? "").trim() !== FRONTMATTER_DELIMITER)
|
|
78
|
-
return null;
|
|
79
|
-
const fm = {};
|
|
80
|
-
for (let i = 1; i <= FRONTMATTER_MAX_LINES && i < lines.length; i++) {
|
|
81
|
-
const line = lines[i];
|
|
82
|
-
if (line === undefined)
|
|
83
|
-
return null;
|
|
84
|
-
if (line.trim() === FRONTMATTER_DELIMITER)
|
|
85
|
-
return fm;
|
|
86
|
-
const m = line.match(/^(\w+):\s*(.+)$/);
|
|
87
|
-
if (m?.[1] && m[2] !== undefined) {
|
|
88
|
-
fm[m[1]] = m[2].trim();
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
return null;
|
|
92
|
-
}
|
|
93
74
|
function toPosixRelative(path, base) {
|
|
94
75
|
const rel = relative(base, path);
|
|
95
76
|
return rel.split(/[\\/]/).join(posixPath.sep);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skill-index-service.js","sourceRoot":"","sources":["../../src/application/skill-index-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,KAAK,IAAI,SAAS,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC/D,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"skill-index-service.js","sourceRoot":"","sources":["../../src/application/skill-index-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { type ResolvedSkills } from "../domain/skills.js";
|
|
1
|
+
import { type ResolvedSkills, type SkillBindingSource, type SkillRole } from "../domain/skills.js";
|
|
2
|
+
import type { EnvPort } from "../ports/env.js";
|
|
2
3
|
import type { FileSystemPort } from "../ports/file-system.js";
|
|
3
4
|
import type { PathsService } from "./paths-service.js";
|
|
4
5
|
export interface SkillsResolution {
|
|
@@ -19,4 +20,27 @@ export interface SkillsResolution {
|
|
|
19
20
|
* and never crash resolution (this runs for every command).
|
|
20
21
|
*/
|
|
21
22
|
export declare function resolveSkills(fs: FileSystemPort, paths: PathsService): Promise<SkillsResolution>;
|
|
23
|
+
/** One bound role checked against the skills actually installed in the host. */
|
|
24
|
+
export interface BindingCheck {
|
|
25
|
+
role: SkillRole;
|
|
26
|
+
skill: string;
|
|
27
|
+
source: SkillBindingSource;
|
|
28
|
+
installed: boolean;
|
|
29
|
+
}
|
|
30
|
+
export interface BindingValidation {
|
|
31
|
+
checks: BindingCheck[];
|
|
32
|
+
warnings: string[];
|
|
33
|
+
rootsScanned: string[];
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Best-effort, ADVISORY check of `skills.toml` bindings against installed skills.
|
|
37
|
+
*
|
|
38
|
+
* The resolver itself never validates that a bound skill exists, and never falls
|
|
39
|
+
* back to the default — a typo'd binding silently leaves the role mute. This scans
|
|
40
|
+
* the standard skill roots (cwd + home × each host's skillsDirs) and warns when a
|
|
41
|
+
* user-set binding names a skill that is neither a built-in default nor found
|
|
42
|
+
* installed. It never blocks: a not-found is a hint, not an error (the skill may
|
|
43
|
+
* live somewhere this scan does not cover).
|
|
44
|
+
*/
|
|
45
|
+
export declare function checkInstalledBindings(fs: FileSystemPort, env: EnvPort, resolution: SkillsResolution): Promise<BindingValidation>;
|
|
22
46
|
//# sourceMappingURL=skills-resolver-service.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skills-resolver-service.d.ts","sourceRoot":"","sources":["../../src/application/skills-resolver-service.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"skills-resolver-service.d.ts","sourceRoot":"","sources":["../../src/application/skills-resolver-service.ts"],"names":[],"mappings":"AAIA,OAAO,EAEL,KAAK,cAAc,EAEnB,KAAK,kBAAkB,EACvB,KAAK,SAAS,EAEf,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvD,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,cAAc,CAAC;IACvB,2DAA2D;IAC3D,OAAO,EAAE;QAAE,MAAM,EAAE,OAAO,CAAC;QAAC,SAAS,EAAE,OAAO,CAAA;KAAE,CAAC;IACjD,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAID;;;;;;;GAOG;AACH,wBAAsB,aAAa,CACjC,EAAE,EAAE,cAAc,EAClB,KAAK,EAAE,YAAY,GAClB,OAAO,CAAC,gBAAgB,CAAC,CAkB3B;AA+BD,gFAAgF;AAChF,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,SAAS,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,kBAAkB,CAAC;IAC3B,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAID;;;;;;;;;GASG;AACH,wBAAsB,sBAAsB,CAC1C,EAAE,EAAE,cAAc,EAClB,GAAG,EAAE,OAAO,EACZ,UAAU,EAAE,gBAAgB,GAC3B,OAAO,CAAC,iBAAiB,CAAC,CAyB5B"}
|
|
@@ -1,4 +1,7 @@
|
|
|
1
|
+
import { join } from "node:path";
|
|
1
2
|
import { parse as parseToml } from "smol-toml";
|
|
3
|
+
import { HARNESSES } from "../domain/harnesses.js";
|
|
4
|
+
import { parseSkillFrontmatter } from "../domain/skill-frontmatter.js";
|
|
2
5
|
import { BUILTIN_DEFAULT_SKILLS, SKILL_ROLES, isSkillRole, } from "../domain/skills.js";
|
|
3
6
|
const OFF = "off";
|
|
4
7
|
/**
|
|
@@ -52,6 +55,87 @@ async function readSkillsTable(fs, path, warnings) {
|
|
|
52
55
|
return null;
|
|
53
56
|
}
|
|
54
57
|
}
|
|
58
|
+
const BUILTIN_SKILL_NAMES = new Set(Object.values(BUILTIN_DEFAULT_SKILLS));
|
|
59
|
+
/**
|
|
60
|
+
* Best-effort, ADVISORY check of `skills.toml` bindings against installed skills.
|
|
61
|
+
*
|
|
62
|
+
* The resolver itself never validates that a bound skill exists, and never falls
|
|
63
|
+
* back to the default — a typo'd binding silently leaves the role mute. This scans
|
|
64
|
+
* the standard skill roots (cwd + home × each host's skillsDirs) and warns when a
|
|
65
|
+
* user-set binding names a skill that is neither a built-in default nor found
|
|
66
|
+
* installed. It never blocks: a not-found is a hint, not an error (the skill may
|
|
67
|
+
* live somewhere this scan does not cover).
|
|
68
|
+
*/
|
|
69
|
+
export async function checkInstalledBindings(fs, env, resolution) {
|
|
70
|
+
const roots = skillRoots(env);
|
|
71
|
+
const installed = await enumerateInstalledSkills(fs, roots);
|
|
72
|
+
const checks = [];
|
|
73
|
+
const warnings = [];
|
|
74
|
+
for (const role of SKILL_ROLES) {
|
|
75
|
+
const r = resolution.skills[role];
|
|
76
|
+
if (!r.enabled || r.skill === null || r.source === "default")
|
|
77
|
+
continue;
|
|
78
|
+
const skill = r.skill;
|
|
79
|
+
if (BUILTIN_SKILL_NAMES.has(skill)) {
|
|
80
|
+
checks.push({ role, skill, source: r.source, installed: true });
|
|
81
|
+
continue;
|
|
82
|
+
}
|
|
83
|
+
const leaf = skill.includes("/") ? (skill.split("/").pop() ?? skill) : skill;
|
|
84
|
+
const installedHere = installed.has(skill) || installed.has(leaf);
|
|
85
|
+
checks.push({ role, skill, source: r.source, installed: installedHere });
|
|
86
|
+
if (!installedHere) {
|
|
87
|
+
warnings.push(`role '${role}' is bound to '${skill}' (${r.source}) but no installed skill by that name was found in the standard skill roots (${roots.join(", ")}). The binding is advisory — the CLI does not auto-fallback. Install it (e.g. \`npx skills add <owner/repo>\`) or fix the name; if it lives elsewhere, ignore this.`);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
return { checks, warnings, rootsScanned: roots };
|
|
91
|
+
}
|
|
92
|
+
/** cwd + home crossed with every host's skill directory (deduped). */
|
|
93
|
+
function skillRoots(env) {
|
|
94
|
+
const dirs = [...new Set(HARNESSES.flatMap((h) => [...h.skillsDirs]))];
|
|
95
|
+
const roots = [];
|
|
96
|
+
for (const d of dirs) {
|
|
97
|
+
roots.push(join(env.cwd(), d));
|
|
98
|
+
roots.push(join(env.homeDir(), d));
|
|
99
|
+
}
|
|
100
|
+
return [...new Set(roots)];
|
|
101
|
+
}
|
|
102
|
+
/** Collect the names of skills installed under the given roots (dir name + frontmatter name). */
|
|
103
|
+
async function enumerateInstalledSkills(fs, roots) {
|
|
104
|
+
const names = new Set();
|
|
105
|
+
for (const root of roots) {
|
|
106
|
+
await collectNamesFromRoot(fs, root, names);
|
|
107
|
+
}
|
|
108
|
+
return names;
|
|
109
|
+
}
|
|
110
|
+
async function collectNamesFromRoot(fs, root, names) {
|
|
111
|
+
if (!(await fs.exists(root)))
|
|
112
|
+
return;
|
|
113
|
+
let entries;
|
|
114
|
+
try {
|
|
115
|
+
entries = await fs.list(root);
|
|
116
|
+
}
|
|
117
|
+
catch {
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
for (const entry of entries) {
|
|
121
|
+
if (entry.type !== "dir")
|
|
122
|
+
continue;
|
|
123
|
+
names.add(entry.name);
|
|
124
|
+
await addFrontmatterName(fs, join(entry.path, "SKILL.md"), names);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
async function addFrontmatterName(fs, skillMd, names) {
|
|
128
|
+
if (!(await fs.exists(skillMd)))
|
|
129
|
+
return;
|
|
130
|
+
try {
|
|
131
|
+
const fm = parseSkillFrontmatter(await fs.readText(skillMd));
|
|
132
|
+
if (fm?.fields.name)
|
|
133
|
+
names.add(fm.fields.name);
|
|
134
|
+
}
|
|
135
|
+
catch {
|
|
136
|
+
// ignore unreadable skill files
|
|
137
|
+
}
|
|
138
|
+
}
|
|
55
139
|
/** Merge one cascade level's `[skills]` table onto the resolved bindings. */
|
|
56
140
|
function applyLevel(skills, table, source, path, warnings) {
|
|
57
141
|
for (const [key, value] of Object.entries(table)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skills-resolver-service.js","sourceRoot":"","sources":["../../src/application/skills-resolver-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,EACL,sBAAsB,EAEtB,WAAW,
|
|
1
|
+
{"version":3,"file":"skills-resolver-service.js","sourceRoot":"","sources":["../../src/application/skills-resolver-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/skills.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/skills.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAGjD,eAAO,MAAM,aAAa,EAAE,UAa3B,CAAC"}
|
|
@@ -1,9 +1,15 @@
|
|
|
1
|
-
import { resolveSkills } from "../../application/skills-resolver-service.js";
|
|
1
|
+
import { checkInstalledBindings, resolveSkills, } from "../../application/skills-resolver-service.js";
|
|
2
2
|
export const skillsCommand = {
|
|
3
3
|
name: "skills",
|
|
4
4
|
describe: "Show resolved capability→skill bindings (skills.toml cascade).",
|
|
5
5
|
async execute(_args, ctx) {
|
|
6
|
-
const
|
|
6
|
+
const resolution = await resolveSkills(ctx.fs, ctx.paths);
|
|
7
|
+
const validation = await checkInstalledBindings(ctx.fs, ctx.env, resolution);
|
|
8
|
+
const data = {
|
|
9
|
+
...resolution,
|
|
10
|
+
bindingChecks: validation.checks,
|
|
11
|
+
warnings: [...resolution.warnings, ...validation.warnings],
|
|
12
|
+
};
|
|
7
13
|
return { ok: true, data, exitCode: 0 };
|
|
8
14
|
},
|
|
9
15
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skills.js","sourceRoot":"","sources":["../../../src/cli/commands/skills.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"skills.js","sourceRoot":"","sources":["../../../src/cli/commands/skills.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,sBAAsB,EACtB,aAAa,GACd,MAAM,8CAA8C,CAAC;AAMtD,MAAM,CAAC,MAAM,aAAa,GAAe;IACvC,IAAI,EAAE,QAAQ;IACd,QAAQ,EAAE,gEAAgE;IAC1E,KAAK,CAAC,OAAO,CAAC,KAAiB,EAAE,GAAe;QAC9C,MAAM,UAAU,GAAG,MAAM,aAAa,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC;QAC1D,MAAM,UAAU,GAAG,MAAM,sBAAsB,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;QAC7E,MAAM,IAAI,GAAG;YACX,GAAG,UAAU;YACb,aAAa,EAAE,UAAU,CAAC,MAAM;YAChC,QAAQ,EAAE,CAAC,GAAG,UAAU,CAAC,QAAQ,EAAE,GAAG,UAAU,CAAC,QAAQ,CAAC;SAC3D,CAAC;QACF,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;IACzC,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parser for SKILL.md YAML frontmatter, aligned with the Agent Skills standard
|
|
3
|
+
* (agentskills.io/specification).
|
|
4
|
+
*
|
|
5
|
+
* Handles what our skills actually use and what the standard defines:
|
|
6
|
+
* - plain scalars (`name: foo`), optionally quoted
|
|
7
|
+
* - block scalars (`description: >-`, `>`, `|`, with `-`/`+` chomping) — the common
|
|
8
|
+
* authoring form for long descriptions; a naive `^(\w+):\s*(.+)$` regex would
|
|
9
|
+
* capture the `>-` indicator as the value instead of the folded text
|
|
10
|
+
* - hyphenated keys (`allowed-tools`)
|
|
11
|
+
* - a one-level nested `metadata:` mapping (home of the optional `version`)
|
|
12
|
+
*
|
|
13
|
+
* Deliberately a focused parser over the closed set of frontmatter we author, not a
|
|
14
|
+
* general YAML engine — no runtime YAML dependency is added to the CLI.
|
|
15
|
+
*/
|
|
16
|
+
export interface ParsedFrontmatter {
|
|
17
|
+
/** Top-level scalar fields (block scalars folded), e.g. name, description, license, allowed-tools. */
|
|
18
|
+
fields: Record<string, string>;
|
|
19
|
+
/** The nested `metadata:` mapping, e.g. author, version. */
|
|
20
|
+
metadata: Record<string, string>;
|
|
21
|
+
}
|
|
22
|
+
/** Parse SKILL.md frontmatter. Returns null when there is no closed `---` block. */
|
|
23
|
+
export declare function parseSkillFrontmatter(text: string): ParsedFrontmatter | null;
|
|
24
|
+
/** Version per the standard lives under metadata.version; fall back to a legacy top-level version. */
|
|
25
|
+
export declare function getSkillVersion(fm: ParsedFrontmatter): string | null;
|
|
26
|
+
//# sourceMappingURL=skill-frontmatter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-frontmatter.d.ts","sourceRoot":"","sources":["../../src/domain/skill-frontmatter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAOH,MAAM,WAAW,iBAAiB;IAChC,sGAAsG;IACtG,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,4DAA4D;IAC5D,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAED,oFAAoF;AACpF,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI,CAa5E;AAqCD,sGAAsG;AACtG,wBAAgB,eAAe,CAAC,EAAE,EAAE,iBAAiB,GAAG,MAAM,GAAG,IAAI,CAEpE"}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parser for SKILL.md YAML frontmatter, aligned with the Agent Skills standard
|
|
3
|
+
* (agentskills.io/specification).
|
|
4
|
+
*
|
|
5
|
+
* Handles what our skills actually use and what the standard defines:
|
|
6
|
+
* - plain scalars (`name: foo`), optionally quoted
|
|
7
|
+
* - block scalars (`description: >-`, `>`, `|`, with `-`/`+` chomping) — the common
|
|
8
|
+
* authoring form for long descriptions; a naive `^(\w+):\s*(.+)$` regex would
|
|
9
|
+
* capture the `>-` indicator as the value instead of the folded text
|
|
10
|
+
* - hyphenated keys (`allowed-tools`)
|
|
11
|
+
* - a one-level nested `metadata:` mapping (home of the optional `version`)
|
|
12
|
+
*
|
|
13
|
+
* Deliberately a focused parser over the closed set of frontmatter we author, not a
|
|
14
|
+
* general YAML engine — no runtime YAML dependency is added to the CLI.
|
|
15
|
+
*/
|
|
16
|
+
const DELIMITER = "---";
|
|
17
|
+
const TOP_KEY = /^([A-Za-z0-9_-]+):\s*(.*)$/;
|
|
18
|
+
const NESTED_KEY = /^(\s+)([A-Za-z0-9_-]+):\s*(.*)$/;
|
|
19
|
+
const BLOCK_SCALAR = /^([|>])([+-]?)\s*$/;
|
|
20
|
+
/** Parse SKILL.md frontmatter. Returns null when there is no closed `---` block. */
|
|
21
|
+
export function parseSkillFrontmatter(text) {
|
|
22
|
+
const lines = text.split(/\r?\n/);
|
|
23
|
+
if ((lines[0] ?? "").trim() !== DELIMITER)
|
|
24
|
+
return null;
|
|
25
|
+
const end = findClosingDelimiter(lines);
|
|
26
|
+
if (end === -1)
|
|
27
|
+
return null;
|
|
28
|
+
const fields = {};
|
|
29
|
+
const metadata = {};
|
|
30
|
+
let i = 1;
|
|
31
|
+
while (i < end) {
|
|
32
|
+
i = consumeEntry(lines, i, end, fields, metadata);
|
|
33
|
+
}
|
|
34
|
+
return { fields, metadata };
|
|
35
|
+
}
|
|
36
|
+
function findClosingDelimiter(lines) {
|
|
37
|
+
for (let i = 1; i < lines.length; i++) {
|
|
38
|
+
if ((lines[i] ?? "").trim() === DELIMITER)
|
|
39
|
+
return i;
|
|
40
|
+
}
|
|
41
|
+
return -1;
|
|
42
|
+
}
|
|
43
|
+
/** Consume one top-level entry starting at `i`; returns the next line index to process. */
|
|
44
|
+
function consumeEntry(lines, i, end, fields, metadata) {
|
|
45
|
+
const line = lines[i] ?? "";
|
|
46
|
+
if (line.trim() === "")
|
|
47
|
+
return i + 1;
|
|
48
|
+
const m = line.match(TOP_KEY);
|
|
49
|
+
if (!m?.[1])
|
|
50
|
+
return i + 1;
|
|
51
|
+
const key = m[1];
|
|
52
|
+
const rest = (m[2] ?? "").trim();
|
|
53
|
+
if (key === "metadata" && rest === "") {
|
|
54
|
+
return readNestedMapping(lines, i + 1, end, metadata);
|
|
55
|
+
}
|
|
56
|
+
const block = rest.match(BLOCK_SCALAR);
|
|
57
|
+
if (block?.[1]) {
|
|
58
|
+
const parsed = readBlockScalar(lines, i + 1, end, block[1]);
|
|
59
|
+
fields[key] = parsed.value;
|
|
60
|
+
return parsed.nextIndex;
|
|
61
|
+
}
|
|
62
|
+
fields[key] = stripQuotes(rest);
|
|
63
|
+
return i + 1;
|
|
64
|
+
}
|
|
65
|
+
/** Version per the standard lives under metadata.version; fall back to a legacy top-level version. */
|
|
66
|
+
export function getSkillVersion(fm) {
|
|
67
|
+
return fm.metadata.version ?? fm.fields.version ?? null;
|
|
68
|
+
}
|
|
69
|
+
/** Read an indented `key: value` mapping until the first dedented line. Returns the next line index. */
|
|
70
|
+
function readNestedMapping(lines, start, end, out) {
|
|
71
|
+
let i = start;
|
|
72
|
+
for (; i < end; i++) {
|
|
73
|
+
const sub = lines[i] ?? "";
|
|
74
|
+
if (sub.trim() === "")
|
|
75
|
+
continue;
|
|
76
|
+
const m = sub.match(NESTED_KEY);
|
|
77
|
+
if (!m?.[2])
|
|
78
|
+
break;
|
|
79
|
+
out[m[2]] = stripQuotes((m[3] ?? "").trim());
|
|
80
|
+
}
|
|
81
|
+
return i;
|
|
82
|
+
}
|
|
83
|
+
/** Read a block scalar body (lines more indented than the key). Returns the folded/literal value. */
|
|
84
|
+
function readBlockScalar(lines, start, end, style) {
|
|
85
|
+
const { raw, nextIndex } = collectBlockLines(lines, start, end);
|
|
86
|
+
const stripped = dedent(raw);
|
|
87
|
+
const value = style === "|" ? stripped.join("\n") : foldLines(stripped);
|
|
88
|
+
return { value, nextIndex };
|
|
89
|
+
}
|
|
90
|
+
/** Gather lines belonging to the block (indented or blank) until the first dedented line. */
|
|
91
|
+
function collectBlockLines(lines, start, end) {
|
|
92
|
+
const raw = [];
|
|
93
|
+
let i = start;
|
|
94
|
+
for (; i < end; i++) {
|
|
95
|
+
const l = lines[i] ?? "";
|
|
96
|
+
if (l.trim() === "" || /^\s/.test(l)) {
|
|
97
|
+
raw.push(l.trim() === "" ? "" : l);
|
|
98
|
+
continue;
|
|
99
|
+
}
|
|
100
|
+
break;
|
|
101
|
+
}
|
|
102
|
+
while (raw.length > 0 && raw[raw.length - 1] === "")
|
|
103
|
+
raw.pop();
|
|
104
|
+
return { raw, nextIndex: i };
|
|
105
|
+
}
|
|
106
|
+
/** Strip the common leading indentation from non-empty lines. */
|
|
107
|
+
function dedent(raw) {
|
|
108
|
+
const indents = raw.filter((l) => l !== "").map((l) => (l.match(/^(\s*)/)?.[1] ?? "").length);
|
|
109
|
+
const minIndent = indents.length > 0 ? Math.min(...indents) : 0;
|
|
110
|
+
return raw.map((l) => (l === "" ? "" : l.slice(minIndent)));
|
|
111
|
+
}
|
|
112
|
+
/** Folded (">") style: join consecutive non-empty lines with spaces; a blank line is a break. */
|
|
113
|
+
function foldLines(stripped) {
|
|
114
|
+
const paragraphs = [];
|
|
115
|
+
let current = [];
|
|
116
|
+
for (const l of stripped) {
|
|
117
|
+
if (l === "") {
|
|
118
|
+
if (current.length > 0) {
|
|
119
|
+
paragraphs.push(current.join(" "));
|
|
120
|
+
current = [];
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
else {
|
|
124
|
+
current.push(l);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
if (current.length > 0)
|
|
128
|
+
paragraphs.push(current.join(" "));
|
|
129
|
+
return paragraphs.join("\n");
|
|
130
|
+
}
|
|
131
|
+
function stripQuotes(s) {
|
|
132
|
+
if (s.length < 2)
|
|
133
|
+
return s;
|
|
134
|
+
const first = s[0];
|
|
135
|
+
const last = s[s.length - 1];
|
|
136
|
+
if ((first === '"' && last === '"') || (first === "'" && last === "'")) {
|
|
137
|
+
return s.slice(1, -1);
|
|
138
|
+
}
|
|
139
|
+
return s;
|
|
140
|
+
}
|
|
141
|
+
//# sourceMappingURL=skill-frontmatter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-frontmatter.js","sourceRoot":"","sources":["../../src/domain/skill-frontmatter.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tacuchi/agent-workflow-cli",
|
|
3
|
-
"version": "14.
|
|
3
|
+
"version": "14.1.1",
|
|
4
4
|
"description": "Agnostic runtime CLI for AI development workflows — a stages + loops + artifacts harness. Bundles the universal `w` skill set under `skills/w/` (slash commands `/w:*`: spec-new/spec-refine, plan-new/plan-exec, quick, workspace-init, export-*); `self install --target <host>` copies SKILL + commands + hooks into the host. Pluggable capability skills via `.workflow/skills.toml`. Multi-empresa parametrization via `profile.json` cascade. Namespace auto-detected from any `.<ns>/sessions/` dir in CWD; default `workflow`.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
package/skills/w/SKILL.md
CHANGED
|
@@ -71,12 +71,12 @@ Antes de cualquier loop, la IA resuelve su **contexto operativo** en **cada prom
|
|
|
71
71
|
|
|
72
72
|
| ¿Workspace? | Trigger | → Comportamiento + ruteo |
|
|
73
73
|
|---|---|---|
|
|
74
|
-
| **Sí** | **comando de flujo** (`quick`·`spec-*`·`plan-*`) | crea sesión **nueva
|
|
74
|
+
| **Sí** | **comando de flujo** (`quick`·`spec-*`·`plan-*`) | **nueva línea de trabajo** → crea sesión **nueva** (salvo re-run del mismo flujo sobre la misma entrada: `create_or_resume` reabre la existente), arranca el loop → artefactos a **esa** sesión (`SCRIPTS.sql`, …) |
|
|
75
75
|
| **Sí** | **prompt sin comando** (relacionado) | **continúa/reabre la sesión más reciente** → los scripts editan **su** `SCRIPTS.sql` (no crea otra) |
|
|
76
76
|
| **Sí** | **prompt sin comando** (no-relacionado / sin sesión) | **sin flujo**: trabajo directo → escribe en `docs/` por convención + numeración (`aw next-number`) |
|
|
77
77
|
| **No** | cualquiera | **vanilla** — sin workspace ni flujo, la IA es libre (nativo) |
|
|
78
78
|
|
|
79
|
-
**Regla de continuidad:** el **comando** señala "nueva línea de trabajo" (sesión nueva); un **prompt sin comando** es "sigo en la misma" → por default continúa/reabre la más reciente (la *última iniciada*); solo si es claramente no-relacionado ofrece elegir (`continuar NNN` | `trabajo nuevo`) o cae a "sin flujo". Convergencia cierra la sesión; un prompt relacionado posterior la **reabre** (el resume quita `.closed`). Es la cara **inter-turno** del *objetivo persistente* (mismo `CHECKPOINT`+resume, aplicado al próximo prompt) — **doctrina agnóstica**, no un hook del host. Aplica a **todo artefacto** (`SCRIPTS.sql` es el ejemplo trabajado); ver `loops/quick-loop/SKILL.md` para el caso QUICK.
|
|
79
|
+
**Regla de continuidad:** el **comando** señala "nueva línea de trabajo" (sesión nueva) — **salvo re-correr el mismo comando sobre la misma entrada** (ej. `/w:spec-refine` sobre el mismo spec), que **no** abre otra línea: `create_or_resume` localiza la sesión de ese flujo (por descriptor + `## Origin`) y la **reanuda o reabre** (quita `.closed`), sin duplicarla; un **prompt sin comando** es "sigo en la misma" → por default continúa/reabre la más reciente (la *última iniciada*); solo si es claramente no-relacionado ofrece elegir (`continuar NNN` | `trabajo nuevo`) o cae a "sin flujo". Convergencia cierra la sesión; un prompt relacionado posterior la **reabre** (el resume quita `.closed`). Es la cara **inter-turno** del *objetivo persistente* (mismo `CHECKPOINT`+resume, aplicado al próximo prompt) — **doctrina agnóstica**, no un hook del host. Aplica a **todo artefacto** (`SCRIPTS.sql` es el ejemplo trabajado); ver `loops/quick-loop/SKILL.md` para el caso QUICK.
|
|
80
80
|
|
|
81
81
|
### The commands (`/w:` namespace)
|
|
82
82
|
|
|
@@ -30,7 +30,7 @@ El skill detecta el estado previo antes de arrancar, **keyando off el `CHECKPOIN
|
|
|
30
30
|
1. Busca la sesión de refinamiento del spec en `.workflow/sessions/` y su `CHECKPOINT.md`.
|
|
31
31
|
2. **En curso** (existe CHECKPOINT) → continúa desde el avance previo (gaps resueltos, Q&A).
|
|
32
32
|
3. **Sin avance** (sin CHECKPOINT y el spec **no** tiene `## Refinement decisions`/`## Q&A traceability`) → arranca desde cero leyendo el spec (`NNN-spec*.md`).
|
|
33
|
-
4. **Ya refinado** (sin CHECKPOINT abierto pero el spec **ya tiene** `## Refinement decisions`/`## Q&A traceability`) → re-
|
|
33
|
+
4. **Ya refinado / re-refine a demanda** (sin CHECKPOINT abierto pero el spec **ya tiene** `## Refinement decisions`/`## Q&A traceability`) → **soportado de primera clase**: mientras el flujo siga en SPEC podés re-correr este comando sobre el mismo spec **las veces que haga falta** (nuevos requerimientos, cambios de scope, re-lectura). El loop hace `create_or_resume` — localiza la refine session existente (aunque esté cerrada) y la **reabre** en vez de duplicarla — y re-refina leyendo el **spec mismo**; al `Guardar`, edita in place con confirmación.
|
|
34
34
|
|
|
35
35
|
> **Compat (legacy):** el glob `NNN-spec*.md` también captura specs viejos `NNN-spec.md` / `NNN-spec-refined.md`. Re-correr spec-refine los edita in place de ahí en adelante.
|
|
36
36
|
|
|
@@ -3,19 +3,17 @@ name: plan-exec-loop
|
|
|
3
3
|
description: >-
|
|
4
4
|
Ejecuta un plan de implementación (docs/plans/PPP-plan-<slug>.md) como living
|
|
5
5
|
doc: lo lee y actualiza fase a fase mientras edita el código real, gestiona BD
|
|
6
|
-
y git. Heir del chasis spec-refine-loop: reusa su motor gap-driven
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
export-*). Compone git y sql. Lo arranca
|
|
18
|
-
/w:plan-exec y es reanudable. Invocar para implementar un plan ya generado.
|
|
6
|
+
y git. Heir del chasis spec-refine-loop: reusa su motor gap-driven, research
|
|
7
|
+
inline (regla BD read-only), structured-choice (≤3 preguntas + control flow
|
|
8
|
+
Compactar/Cerrar) y artefactos como log vivo (CHECKPOINT siempre, BACKLOG solo
|
|
9
|
+
si difiere). Deltas: una sola session por run (resume vía checkbox del plan-doc
|
|
10
|
+
+ CHECKPOINT); git seguro (verifica la rama antes de editar, propone commits por
|
|
11
|
+
fuente, nunca push/--amend/--no-verify); la IA NUNCA ejecuta DML/DDL (las
|
|
12
|
+
migraciones se redactan en SCRIPTS.sql, solo read-only se ejecuta); validación
|
|
13
|
+
por fase y final (lo dependiente de migración no aplicada se difiere a DBA); y
|
|
14
|
+
SIN auto-export (escribe solo docs/plans; el resto queda como artefacto para
|
|
15
|
+
export-*). Compone git y sql. Lo arranca /w:plan-exec, es reanudable. Invocar
|
|
16
|
+
para implementar un plan ya generado.
|
|
19
17
|
---
|
|
20
18
|
|
|
21
19
|
# plan-exec-loop
|
|
@@ -53,7 +53,7 @@ Está **modelado en cómo se comporta el `/goal` de Claude Code** (declarás un
|
|
|
53
53
|
|
|
54
54
|
> Los heirs heredan el frame: `plan-new`/`plan-exec` persiguen el plan hasta su gate; `quick-loop` es la encarnación más directa (el prompt *es* el objetivo) — el "símil a `/goal`" del modelo.
|
|
55
55
|
|
|
56
|
-
> **Continuidad inter-turno (contexto operativo).** El mismo `CHECKPOINT`+resume que sobrevive la compactación gobierna también el **próximo prompt**: dentro de un workspace, un prompt **sin comando** **continúa/reabre la sesión más reciente** (la *última iniciada*) en vez de arrancar trabajo suelto — el objetivo persiste **entre turnos**, no solo dentro del run. Un **comando de flujo** señala "nueva línea de trabajo" (sesión nueva); la convergencia cierra la sesión y un prompt relacionado posterior la **reabre** (resume quita `.closed`). Es la fila 2 de la matriz de contexto operativo (ver [`../../SKILL.md`](../../SKILL.md) § *Contexto operativo*) — doctrina agnóstica que la IA evalúa en cada turno, no un Stop hook del host.
|
|
56
|
+
> **Continuidad inter-turno (contexto operativo).** El mismo `CHECKPOINT`+resume que sobrevive la compactación gobierna también el **próximo prompt**: dentro de un workspace, un prompt **sin comando** **continúa/reabre la sesión más reciente** (la *última iniciada*) en vez de arrancar trabajo suelto — el objetivo persiste **entre turnos**, no solo dentro del run. Un **comando de flujo** señala "nueva línea de trabajo" (sesión nueva) — **salvo re-correr el mismo flujo sobre la misma entrada** (mismo spec), que hace `create_or_resume`: reanuda/reabre la refine session existente en vez de duplicarla (ver *Compact / resume*, caso 3); la convergencia cierra la sesión y un prompt relacionado posterior la **reabre** (resume quita `.closed`). Es la fila 2 de la matriz de contexto operativo (ver [`../../SKILL.md`](../../SKILL.md) § *Contexto operativo*) — doctrina agnóstica que la IA evalúa en cada turno, no un Stop hook del host.
|
|
57
57
|
|
|
58
58
|
## Verification-first (chasis — heredado por todos los loops)
|
|
59
59
|
|
|
@@ -72,6 +72,15 @@ El objetivo persistente necesita una **condición de término checkable** — si
|
|
|
72
72
|
|
|
73
73
|
> El **convergence gate** (sección *Convergence / exit*) es, operacionalmente, **"todos los `Success criteria` en verde"**. Los gates por-heir (analyze gate, coherencia del plan, validación final, validación puntual proporcional) son **instancias** de esto, con los criterios sembrados al inicio.
|
|
74
74
|
|
|
75
|
+
**Integridad del gate (anti-gaming + verificación independiente).** El gate solo vale si no se hace trampa para pasarlo. El loop **no**:
|
|
76
|
+
|
|
77
|
+
- modifica el check ni afloja un `Success criterion` para forzar verde;
|
|
78
|
+
- debilita, borra ni saltea tests/validaciones;
|
|
79
|
+
- usa asserts triviales o tautológicos que siempre pasan (el valor esperado sale de una fuente independiente, no del propio output);
|
|
80
|
+
- parchea el test en lugar de arreglar la causa (preferir arreglar producción).
|
|
81
|
+
|
|
82
|
+
Ante un blocker real **para y lo reporta** (→ `Open questions`/`BACKLOG`) en vez de gamear la métrica. El veredicto cuenta **solo el output del check, no la auto-declaración** del implementador: cuando el deliverable lo justifica, la verificación final la hace una pasada **independiente** (subagente o re-lectura limpia) que no asume correcta la implementación — *only command output counts*.
|
|
83
|
+
|
|
75
84
|
## Artifacts as a live log — ciclo artifact-first (chasis — heredado por todos los loops)
|
|
76
85
|
|
|
77
86
|
El loop trabaja **artifact-first**: el artefacto se **siembra antes** de ejecutar y se **actualiza después**, no solo al cerrar. Cada gap/fase/tarea corre el ciclo de **3 tiempos**:
|
|
@@ -199,6 +208,7 @@ La investigación es **inline**: una actividad **dentro de la session actual del
|
|
|
199
208
|
- elección de MCP (regla BD) — antes de ejecutar queries;
|
|
200
209
|
- en **convergencia**, acción: `Guardar especificación refinada` | `Preguntar algo más`.
|
|
201
210
|
- **Batching**: agrupar hasta 3 gaps de humano en una sola llamada. Si hay más de 3 pendientes, priorizar (los que desbloquean otros gaps primero) y diferir el resto a la próxima vuelta.
|
|
211
|
+
- **Respuesta recomendada por pregunta**: cada pregunta de contenido lleva **siempre** la respuesta que la IA recomienda — como primera opción (marcada *recomendada*) en `AskUserQuestion`, o señalada en el markdown numerado al degradar. Nunca se pregunta "a secas": el humano ratifica o corrige una propuesta, no parte de cero. La IA recomienda en base a lo investigado (regla ask-vs-research), no por defecto vacío.
|
|
202
212
|
|
|
203
213
|
## Sequence
|
|
204
214
|
|
|
@@ -277,7 +287,7 @@ El resume **keya off el `CHECKPOINT`** de la refine session, no de la existencia
|
|
|
277
287
|
|
|
278
288
|
1. **En curso** (existe `CHECKPOINT.md` en la refine session) → reanuda desde el avance (gaps resueltos, Q&A, `attempts`, research inline en curso).
|
|
279
289
|
2. **Sin avance** (no hay CHECKPOINT y el spec **no** tiene `Refinement decisions`/`Q&A traceability`) → arranca desde cero leyendo el spec (`NNN-spec*.md`).
|
|
280
|
-
3. **Ya refinado** (no hay CHECKPOINT abierto pero el spec **ya tiene** `Refinement decisions`/`Q&A traceability`) → re-refinamiento incremental leyendo el **spec mismo**; al `Guardar`, edita in place con confirmación.
|
|
290
|
+
3. **Ya refinado / re-refine on demand** (no hay CHECKPOINT abierto pero el spec **ya tiene** `Refinement decisions`/`Q&A traceability`) → **operación de primera clase**: mientras el flujo siga en SPEC, re-correr `/w:spec-refine` sobre el mismo spec **cuantas veces haga falta** (nuevos requerimientos, cambios de scope, tras re-leerlo) está soportado. `create_or_resume` detecta la refine session existente —típicamente **cerrada** tras converger— por descriptor + `## Origin` y la **reabre** (ver *Internal sessions*: detección con `aw sessions --state all` / `aw resume-summary --include-recent-closed`, reapertura con `aw session-resume --code <NNN> --reopen`); re-refinamiento incremental leyendo el **spec mismo**; al `Guardar`, edita in place con confirmación.
|
|
281
291
|
|
|
282
292
|
> **`Compactar`** (control `flow`, transversal a los 3 casos) → escribe `CHECKPOINT.md` en la refine session (spec en progreso, gaps restantes, Q&A, `attempts`) → dispara la **compactación** del arnés (en Claude Code: `/compact`; ver `../../harness/SKILL.md`) → reanuda leyendo el checkpoint.
|
|
283
293
|
|
package/skills/w/roles/README.md
CHANGED
|
@@ -74,7 +74,7 @@ sql = "off" # disable the sql capability
|
|
|
74
74
|
ui-design = "acme/figma-spec"
|
|
75
75
|
```
|
|
76
76
|
|
|
77
|
-
`acme/figma-spec` must be installed on the host (e.g. via `skills.sh install acme/figma-spec`). The
|
|
77
|
+
`acme/figma-spec` must be installed on the host (e.g. via `skills.sh install acme/figma-spec`). The binding is **advisory**: the resolver emits the name as-is — it does **not** verify the skill is installed and does **not** auto-fall-back to the built-in default. A typo'd name silently leaves the role bound to a skill that does not exist. Verify the resolution with `aw skills`, which warns when a bound skill is not found in the standard skill roots.
|
|
78
78
|
|
|
79
79
|
### Override: disable a capability
|
|
80
80
|
|