maestro-agent-sdk 0.1.4 → 0.1.6
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 +197 -10
- package/dist/agents/contracts.d.ts +10 -0
- package/dist/agents/contracts.d.ts.map +1 -1
- package/dist/index.d.ts +9 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -5
- package/dist/index.js.map +1 -1
- package/dist/memory/reminder.d.ts +9 -9
- package/dist/memory/reminder.d.ts.map +1 -1
- package/dist/memory/reminder.js +21 -15
- package/dist/memory/reminder.js.map +1 -1
- package/dist/platform/version.d.ts +13 -0
- package/dist/platform/version.d.ts.map +1 -0
- package/dist/platform/version.js +13 -0
- package/dist/platform/version.js.map +1 -0
- package/dist/provider.d.ts +62 -0
- package/dist/provider.d.ts.map +1 -1
- package/dist/provider.js +161 -22
- package/dist/provider.js.map +1 -1
- package/dist/registry.d.ts.map +1 -1
- package/dist/registry.js +16 -1
- package/dist/registry.js.map +1 -1
- package/dist/session-store.d.ts +95 -4
- package/dist/session-store.d.ts.map +1 -1
- package/dist/session-store.js +144 -13
- package/dist/session-store.js.map +1 -1
- package/dist/skills/curator.d.ts +8 -6
- package/dist/skills/curator.d.ts.map +1 -1
- package/dist/skills/curator.js +13 -7
- package/dist/skills/curator.js.map +1 -1
- package/dist/skills/loader.d.ts +45 -20
- package/dist/skills/loader.d.ts.map +1 -1
- package/dist/skills/loader.js +56 -11
- package/dist/skills/loader.js.map +1 -1
- package/dist/state/tasks.d.ts +107 -0
- package/dist/state/tasks.d.ts.map +1 -0
- package/dist/state/tasks.js +398 -0
- package/dist/state/tasks.js.map +1 -0
- package/dist/sub-agent/runner.d.ts +1 -1
- package/dist/sub-agent/runner.js +3 -3
- package/dist/tools/builtin/glob.d.ts +17 -0
- package/dist/tools/builtin/glob.d.ts.map +1 -0
- package/dist/tools/builtin/glob.js +235 -0
- package/dist/tools/builtin/glob.js.map +1 -0
- package/dist/tools/builtin/grep.d.ts +3 -0
- package/dist/tools/builtin/grep.d.ts.map +1 -0
- package/dist/tools/builtin/grep.js +272 -0
- package/dist/tools/builtin/grep.js.map +1 -0
- package/dist/tools/builtin/skill_write.d.ts +53 -0
- package/dist/tools/builtin/skill_write.d.ts.map +1 -0
- package/dist/tools/builtin/skill_write.js +264 -0
- package/dist/tools/builtin/skill_write.js.map +1 -0
- package/dist/tools/builtin/tasks.d.ts +34 -0
- package/dist/tools/builtin/tasks.d.ts.map +1 -0
- package/dist/tools/builtin/tasks.js +258 -0
- package/dist/tools/builtin/tasks.js.map +1 -0
- package/dist/types.d.ts +95 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/dist/state/todos.d.ts +0 -95
- package/dist/state/todos.d.ts.map +0 -1
- package/dist/state/todos.js +0 -198
- package/dist/state/todos.js.map +0 -1
- package/dist/tools/builtin/todo_write.d.ts +0 -29
- package/dist/tools/builtin/todo_write.d.ts.map +0 -1
- package/dist/tools/builtin/todo_write.js +0 -96
- package/dist/tools/builtin/todo_write.js.map +0 -1
package/dist/session-store.js
CHANGED
|
@@ -15,6 +15,17 @@
|
|
|
15
15
|
* `[Tool: ...]` text annotations (those only happen on cross-agent rollouts,
|
|
16
16
|
* which by definition came from another provider's log).
|
|
17
17
|
*
|
|
18
|
+
* File layout (since v0.1.5):
|
|
19
|
+
* line 1 — `{"_meta": {...}}` header (cwd, userId, createdAt, sdkVersion,
|
|
20
|
+
* and any host-supplied `metadata`). Optional — files written by
|
|
21
|
+
* older SDK versions skip this line, and the loader treats them
|
|
22
|
+
* as meta-less without error.
|
|
23
|
+
* line 2…N — ProviderMessage per line (one user/assistant turn each).
|
|
24
|
+
*
|
|
25
|
+
* The meta header lets a future per-cwd indexer / forensic sweep recover
|
|
26
|
+
* locality without changing the on-disk directory structure (flat
|
|
27
|
+
* `<sessionId>.jsonl` stays). Hosts that don't care can ignore it.
|
|
28
|
+
*
|
|
18
29
|
* Two writer paths share the same file format:
|
|
19
30
|
* - `saveMaestroSession` — verbatim dump from the live loop.
|
|
20
31
|
* - `writeMaestroRollout` — synthesized from a provider-agnostic
|
|
@@ -26,9 +37,10 @@ import { existsSync, readdirSync, readFileSync, statSync, unlinkSync } from "nod
|
|
|
26
37
|
import { join } from "node:path";
|
|
27
38
|
import { DATA_DIR } from "./platform/config.js";
|
|
28
39
|
import { assertUuidLike, ensureCwdExists, extractChatPairs, } from "./agents/rollout/shared.js";
|
|
29
|
-
import {
|
|
40
|
+
import { MAESTRO_SDK_VERSION } from "./platform/version.js";
|
|
41
|
+
import { dropTaskStore } from "./state/tasks.js";
|
|
30
42
|
import { dropFileStateTracker } from "./tools/file-state.js";
|
|
31
|
-
import {
|
|
43
|
+
import { writeJsonlFile } from "./platform/jsonl.js";
|
|
32
44
|
import { logger } from "./platform/logger.js";
|
|
33
45
|
/**
|
|
34
46
|
* Root directory for maestro session/rollout files.
|
|
@@ -36,7 +48,7 @@ import { logger } from "./platform/logger.js";
|
|
|
36
48
|
* Resolves under `DATA_DIR` (which the host can pin via the
|
|
37
49
|
* `MAESTRO_DATA_DIR` env var — see `platform/config`). One canonical knob
|
|
38
50
|
* for "where SDK state lives" keeps the sessions, skill-usage counters,
|
|
39
|
-
* and
|
|
51
|
+
* and task stores all under the same root.
|
|
40
52
|
*
|
|
41
53
|
* Re-reads `DATA_DIR` on every call so a host that sets the env var late
|
|
42
54
|
* (before the first session save) still gets the override. The penalty
|
|
@@ -49,11 +61,35 @@ export function maestroSessionsDir() {
|
|
|
49
61
|
export function maestroSessionPath(sessionId) {
|
|
50
62
|
return join(maestroSessionsDir(), `${sessionId}.jsonl`);
|
|
51
63
|
}
|
|
64
|
+
/** Discriminator key — the first line of a v0.1.5+ rollout starts with this. */
|
|
65
|
+
const META_KEY = "_meta";
|
|
66
|
+
/** Type guard for a parsed first-line object that carries the meta header. */
|
|
67
|
+
function isMetaLine(value) {
|
|
68
|
+
if (!value || typeof value !== "object")
|
|
69
|
+
return false;
|
|
70
|
+
const obj = value;
|
|
71
|
+
const m = obj[META_KEY];
|
|
72
|
+
return Boolean(m) && typeof m === "object" && m.version === 1;
|
|
73
|
+
}
|
|
74
|
+
/** Parse one JSONL line tolerantly; returns null on parse error. */
|
|
75
|
+
function tryParseLine(line) {
|
|
76
|
+
try {
|
|
77
|
+
return JSON.parse(line);
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
return null;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
52
83
|
/**
|
|
53
84
|
* Load the persisted ProviderMessage[] for a sessionId, or `null` if no
|
|
54
85
|
* file exists (i.e. this is a fresh session). Malformed lines are skipped
|
|
55
86
|
* with a warning rather than crashing the loop — a corrupt entry in the
|
|
56
87
|
* middle of history is better than losing a working session entirely.
|
|
88
|
+
*
|
|
89
|
+
* Backward-compat: files written by SDK <= 0.1.4 had no `_meta` header — the
|
|
90
|
+
* loader treats their first line as a regular message. Files written by v0.1.5+
|
|
91
|
+
* carry the meta header on line 1; we skip it here so callers only see real
|
|
92
|
+
* messages. Use `loadMaestroSessionMeta` for the meta payload.
|
|
57
93
|
*/
|
|
58
94
|
export function loadMaestroSession(sessionId) {
|
|
59
95
|
const path = maestroSessionPath(sessionId);
|
|
@@ -61,21 +97,104 @@ export function loadMaestroSession(sessionId) {
|
|
|
61
97
|
return null;
|
|
62
98
|
try {
|
|
63
99
|
const raw = readFileSync(path, "utf8");
|
|
64
|
-
|
|
100
|
+
const lines = raw.trim().split("\n").filter(Boolean);
|
|
101
|
+
if (lines.length === 0)
|
|
102
|
+
return [];
|
|
103
|
+
const first = tryParseLine(lines[0]);
|
|
104
|
+
const startIdx = isMetaLine(first) ? 1 : 0;
|
|
105
|
+
const out = [];
|
|
106
|
+
for (let i = startIdx; i < lines.length; i++) {
|
|
107
|
+
const parsed = tryParseLine(lines[i]);
|
|
108
|
+
if (parsed !== null)
|
|
109
|
+
out.push(parsed);
|
|
110
|
+
}
|
|
111
|
+
return out;
|
|
65
112
|
}
|
|
66
113
|
catch (err) {
|
|
67
114
|
logger.warn({ err, sessionId, path }, "loadMaestroSession: read/parse failed, starting fresh session");
|
|
68
115
|
return null;
|
|
69
116
|
}
|
|
70
117
|
}
|
|
118
|
+
/**
|
|
119
|
+
* Read just the `_meta` header for a sessionId, or `null` if the file is
|
|
120
|
+
* missing or has no meta header (pre-0.1.5 file). Useful for host-side
|
|
121
|
+
* indexers that want to attribute a session to its cwd / userId without
|
|
122
|
+
* loading the full message history.
|
|
123
|
+
*/
|
|
124
|
+
export function loadMaestroSessionMeta(sessionId) {
|
|
125
|
+
const path = maestroSessionPath(sessionId);
|
|
126
|
+
if (!existsSync(path))
|
|
127
|
+
return null;
|
|
128
|
+
try {
|
|
129
|
+
// Read just enough bytes to cover a reasonably sized meta line. 16KB is
|
|
130
|
+
// generous — meta is typically <1KB. Falls through to a full read if the
|
|
131
|
+
// newline isn't found in the first chunk (degenerate single-line files).
|
|
132
|
+
const raw = readFileSync(path, "utf8");
|
|
133
|
+
const newline = raw.indexOf("\n");
|
|
134
|
+
const firstLine = newline >= 0 ? raw.slice(0, newline) : raw;
|
|
135
|
+
const parsed = tryParseLine(firstLine.trim());
|
|
136
|
+
if (!isMetaLine(parsed))
|
|
137
|
+
return null;
|
|
138
|
+
return parsed[META_KEY];
|
|
139
|
+
}
|
|
140
|
+
catch (err) {
|
|
141
|
+
logger.warn({ err, sessionId, path }, "loadMaestroSessionMeta: read/parse failed");
|
|
142
|
+
return null;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Build a complete `MaestroSessionMeta` from a partial input. If an existing
|
|
147
|
+
* meta is found on disk, its `createdAt` is preserved (the "first write"
|
|
148
|
+
* timestamp shouldn't drift across subsequent overwrites). All other fields
|
|
149
|
+
* come from the live input so a session that moves cwd / changes metadata
|
|
150
|
+
* mid-flight gets its current state recorded.
|
|
151
|
+
*/
|
|
152
|
+
function buildMeta(sessionId, input) {
|
|
153
|
+
const existing = loadMaestroSessionMeta(sessionId);
|
|
154
|
+
const meta = {
|
|
155
|
+
version: 1,
|
|
156
|
+
cwd: input.cwd ?? existing?.cwd ?? "",
|
|
157
|
+
createdAt: existing?.createdAt ?? input.createdAt ?? new Date().toISOString(),
|
|
158
|
+
sdkVersion: MAESTRO_SDK_VERSION,
|
|
159
|
+
};
|
|
160
|
+
const userId = input.userId ?? existing?.userId;
|
|
161
|
+
if (userId !== undefined)
|
|
162
|
+
meta.userId = userId;
|
|
163
|
+
const skillsDir = input.skillsDir ?? existing?.skillsDir;
|
|
164
|
+
if (skillsDir !== undefined)
|
|
165
|
+
meta.skillsDir = skillsDir;
|
|
166
|
+
const skillKey = input.skillKey ?? existing?.skillKey;
|
|
167
|
+
if (skillKey !== undefined)
|
|
168
|
+
meta.skillKey = skillKey;
|
|
169
|
+
const metadata = input.metadata ?? existing?.metadata;
|
|
170
|
+
if (metadata !== undefined)
|
|
171
|
+
meta.metadata = metadata;
|
|
172
|
+
return meta;
|
|
173
|
+
}
|
|
71
174
|
/**
|
|
72
175
|
* Overwrite (or create) the persisted session file with the provided
|
|
73
176
|
* messages. Each turn's final state is written atomically — partial-history
|
|
74
177
|
* writes can leave the next resume looking at a stale prefix.
|
|
178
|
+
*
|
|
179
|
+
* The optional `meta` input is merged with any existing on-disk meta header
|
|
180
|
+
* (preserving `createdAt`) and re-stamped on every save. Omitting `meta`
|
|
181
|
+
* still preserves a previously-written meta header — the SDK will re-read
|
|
182
|
+
* and re-write it transparently so a host that doesn't supply meta doesn't
|
|
183
|
+
* lose the one a previous turn wrote.
|
|
75
184
|
*/
|
|
76
|
-
export function saveMaestroSession(sessionId, messages) {
|
|
185
|
+
export function saveMaestroSession(sessionId, messages, meta) {
|
|
77
186
|
assertUuidLike("sessionId", sessionId);
|
|
78
|
-
|
|
187
|
+
const existing = loadMaestroSessionMeta(sessionId);
|
|
188
|
+
// Skip the meta line entirely only when: caller didn't pass one AND no
|
|
189
|
+
// meta was previously written. Pre-0.1.5 files with no header stay that
|
|
190
|
+
// way unless the caller opts in by passing meta on the first save.
|
|
191
|
+
if (!meta && !existing) {
|
|
192
|
+
writeJsonlFile(maestroSessionPath(sessionId), messages);
|
|
193
|
+
return;
|
|
194
|
+
}
|
|
195
|
+
const built = buildMeta(sessionId, meta ?? {});
|
|
196
|
+
const lines = [{ [META_KEY]: built }, ...messages];
|
|
197
|
+
writeJsonlFile(maestroSessionPath(sessionId), lines);
|
|
79
198
|
}
|
|
80
199
|
/**
|
|
81
200
|
* Remove a session's backing file and drop its in-memory file-state tracker.
|
|
@@ -91,13 +210,14 @@ export function deleteMaestroSession(sessionId) {
|
|
|
91
210
|
logger.warn({ err: e, sessionId }, "deleteMaestroSession: unlink failed (non-ENOENT)");
|
|
92
211
|
// Still drop the in-memory caches — caller treats the session as gone.
|
|
93
212
|
dropFileStateTracker(sessionId);
|
|
94
|
-
|
|
213
|
+
dropTaskStore(sessionId);
|
|
95
214
|
throw e;
|
|
96
215
|
}
|
|
97
216
|
}
|
|
98
217
|
dropFileStateTracker(sessionId);
|
|
99
|
-
// Drops the in-memory store AND unlinks the on-disk `.
|
|
100
|
-
|
|
218
|
+
// Drops the in-memory store AND unlinks the on-disk `.tasks.json` sidecar
|
|
219
|
+
// (plus the legacy `.todos.json` if a migration hasn't fired yet).
|
|
220
|
+
dropTaskStore(sessionId);
|
|
101
221
|
}
|
|
102
222
|
/**
|
|
103
223
|
* Flatten chat pairs (from cross-agent extractChatPairs output) into the
|
|
@@ -125,6 +245,11 @@ function pairsToMessages(pairs) {
|
|
|
125
245
|
*
|
|
126
246
|
* Used by `set_agent` cross-agent bridging (X → maestro) and by
|
|
127
247
|
* `maestroRegistry.forkSession`.
|
|
248
|
+
*
|
|
249
|
+
* Always writes a `_meta` header (v0.1.5+) — the rollout is the first line
|
|
250
|
+
* to disk for the new session, so there's nothing to preserve from a prior
|
|
251
|
+
* write. The meta carries `cwd`, optional `userId`/`metadata`, and the SDK
|
|
252
|
+
* version stamp.
|
|
128
253
|
*/
|
|
129
254
|
export function writeMaestroRollout(opts) {
|
|
130
255
|
const sessionId = opts.sessionId ?? randomUUID();
|
|
@@ -133,7 +258,13 @@ export function writeMaestroRollout(opts) {
|
|
|
133
258
|
const pairs = opts.pairs ?? extractChatPairs(opts.entries ?? []);
|
|
134
259
|
const messages = pairsToMessages(pairs);
|
|
135
260
|
const path = maestroSessionPath(sessionId);
|
|
136
|
-
|
|
261
|
+
const metaInput = { cwd: opts.cwd };
|
|
262
|
+
if (opts.userId !== undefined)
|
|
263
|
+
metaInput.userId = opts.userId;
|
|
264
|
+
if (opts.metadata !== undefined)
|
|
265
|
+
metaInput.metadata = opts.metadata;
|
|
266
|
+
const meta = buildMeta(sessionId, metaInput);
|
|
267
|
+
writeJsonlFile(path, [{ [META_KEY]: meta }, ...messages]);
|
|
137
268
|
logger.info({ sessionId, path, pairs: pairs.length }, "writeMaestroRollout: synthetic session placed");
|
|
138
269
|
return { sessionId, rolloutPath: path };
|
|
139
270
|
}
|
|
@@ -274,8 +405,8 @@ export function cleanupStaleMaestroSessions(maxAgeMs = DEFAULT_MAESTRO_SESSION_T
|
|
|
274
405
|
unlinkSync(path);
|
|
275
406
|
removed++;
|
|
276
407
|
dropFileStateTracker(sessionId);
|
|
277
|
-
// Also unlinks the on-disk `.
|
|
278
|
-
|
|
408
|
+
// Also unlinks the on-disk `.tasks.json` sidecar (+ legacy `.todos.json`).
|
|
409
|
+
dropTaskStore(sessionId);
|
|
279
410
|
}
|
|
280
411
|
catch (e) {
|
|
281
412
|
if (e?.code !== "ENOENT") {
|
|
@@ -284,7 +415,7 @@ export function cleanupStaleMaestroSessions(maxAgeMs = DEFAULT_MAESTRO_SESSION_T
|
|
|
284
415
|
else {
|
|
285
416
|
// ENOENT mid-loop = raced. File gone → caches moot.
|
|
286
417
|
dropFileStateTracker(sessionId);
|
|
287
|
-
|
|
418
|
+
dropTaskStore(sessionId);
|
|
288
419
|
}
|
|
289
420
|
}
|
|
290
421
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-store.js","sourceRoot":"","sources":["../src/session-store.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"session-store.js","sourceRoot":"","sources":["../src/session-store.ts"],"names":[],"mappings":"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"}
|
package/dist/skills/curator.d.ts
CHANGED
|
@@ -18,12 +18,14 @@ import { type SkillCounters } from "../skills/usage.js";
|
|
|
18
18
|
* it via skill_view if the user explicitly names it, but
|
|
19
19
|
* it stops costing tokens on every turn.
|
|
20
20
|
*
|
|
21
|
-
* The `bundled` vs `agent-created` provenance bit is
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
*
|
|
21
|
+
* The `bundled` vs `agent-created` provenance bit is no longer derivable
|
|
22
|
+
* from path under the `(cwd, skillKey)` model — every skill lives under
|
|
23
|
+
* `<cwd>/.skills/<skillKey>/` regardless of origin. `isBundled` returns
|
|
24
|
+
* true for everything, which protects project-shipped skills from
|
|
25
|
+
* archival; the side effect is that agent-created skills also persist
|
|
26
|
+
* indefinitely. If accumulation becomes a problem, a future release can
|
|
27
|
+
* re-introduce provenance via a frontmatter marker (e.g.
|
|
28
|
+
* `provenance: agent`).
|
|
27
29
|
*
|
|
28
30
|
* The state file lives at `${DATA_DIR}/agents/maestro/skills/state.json`.
|
|
29
31
|
* Like the usage sidecar it's process-local + atomic-write — a host loop
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"curator.d.ts","sourceRoot":"","sources":["../../src/skills/curator.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAa,KAAK,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAI/D
|
|
1
|
+
{"version":3,"file":"curator.d.ts","sourceRoot":"","sources":["../../src/skills/curator.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAa,KAAK,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAI/D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AAEH,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,OAAO,GAAG,UAAU,CAAC;AAE7D,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,cAAc,CAAC;IAC1B,4DAA4D;IAC5D,SAAS,EAAE,MAAM,CAAC;IAClB,oEAAoE;IACpE,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,aAAa,EAAE,CAAC,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;CACpC;AAID;kCACkC;AAClC,eAAO,MAAM,gBAAgB,KAAK,CAAC;AACnC;8EAC8E;AAC9E,eAAO,MAAM,kBAAkB,KAAK,CAAC;AAIrC,2EAA2E;AAC3E,wBAAgB,gBAAgB,IAAI,MAAM,CAKzC;AAWD;iEACiE;AACjE,wBAAgB,SAAS,CAAC,IAAI,GAAE,MAA2B,GAAG,cAAc,CAM3E;AAyCD;;;;;;;;;;;GAWG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,aAAa,GAAG,SAAS,EACnC,OAAO,EAAE,OAAO,EAChB,GAAG,GAAE,IAAiB,GACrB,cAAc,CAYhB;AAED,MAAM,WAAW,aAAa;IAC5B,gDAAgD;IAChD,GAAG,CAAC,EAAE,IAAI,CAAC;IACX,yCAAyC;IACzC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,yCAAyC;IACzC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,0DAA0D;IAC1D,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,UAAU,CAAC;IAClB,KAAK,EAAE,UAAU,CAAC;CACnB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,UAAU,EAAE,EAAE,IAAI,GAAE,aAAkB,GAAG,YAAY,EAAE,CAoD3F;AAED;;yEAEyE;AACzE,wBAAgB,eAAe,IAAI,IAAI,CAEtC"}
|
package/dist/skills/curator.js
CHANGED
|
@@ -57,13 +57,19 @@ function writeAtomic(path, contents) {
|
|
|
57
57
|
writeFileSync(tmp, JSON.stringify(contents, null, 2));
|
|
58
58
|
renameSync(tmp, path);
|
|
59
59
|
}
|
|
60
|
-
/** A skill is `bundled` if
|
|
61
|
-
*
|
|
62
|
-
*
|
|
63
|
-
*
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
60
|
+
/** A skill is `bundled` if the operator (or project) shipped it deliberately,
|
|
61
|
+
* vs `agent-created` if it was synthesized at runtime by the model.
|
|
62
|
+
*
|
|
63
|
+
* In the `(cwd, skillKey)` model every skill lives under
|
|
64
|
+
* `<cwd>/.skills/<skillKey>/`, so path alone can't tell the two apart —
|
|
65
|
+
* both end up in the same directory. We treat everything as bundled so
|
|
66
|
+
* the curator never archives a project-shipped skill. Agent-created
|
|
67
|
+
* skills also stop archiving as a side effect; if accumulation becomes
|
|
68
|
+
* a problem, a future release can re-introduce provenance via a marker
|
|
69
|
+
* in SKILL.md frontmatter (`provenance: agent` etc.) rather than by
|
|
70
|
+
* path heuristics that the new layout doesn't support. */
|
|
71
|
+
function isBundled(_skill) {
|
|
72
|
+
return true;
|
|
67
73
|
}
|
|
68
74
|
/**
|
|
69
75
|
* Decide the lifecycle for one skill given its counters + provenance + a
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"curator.js","sourceRoot":"","sources":["../../src/skills/curator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACzF,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAE1C,OAAO,EAAE,SAAS,EAAsB,MAAM,gBAAgB,CAAC;AAC/D,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"curator.js","sourceRoot":"","sources":["../../src/skills/curator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACzF,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAE1C,OAAO,EAAE,SAAS,EAAsB,MAAM,gBAAgB,CAAC;AAC/D,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAsD3C,MAAM,cAAc,GAAG,CAAC,CAAC;AAEzB;kCACkC;AAClC,MAAM,CAAC,MAAM,gBAAgB,GAAG,EAAE,CAAC;AACnC;8EAC8E;AAC9E,MAAM,CAAC,MAAM,kBAAkB,GAAG,EAAE,CAAC;AAErC,MAAM,MAAM,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAEnC,2EAA2E;AAC3E,MAAM,UAAU,gBAAgB;IAC9B,OAAO,CACL,OAAO,CAAC,GAAG,CAAC,wBAAwB;QACpC,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,YAAY,CAAC,CAC5D,CAAC;AACJ,CAAC;AAED,SAAS,SAAS;IAChB,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;AACvD,CAAC;AAED,2EAA2E;AAC3E,2EAA2E;AAC3E,4EAA4E;AAC5E,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAA0B,CAAC;AAE3D;iEACiE;AACjE,MAAM,UAAU,SAAS,CAAC,OAAe,gBAAgB,EAAE;IACzD,MAAM,MAAM,GAAG,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC1C,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC;IAC1B,MAAM,KAAK,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;IACtC,gBAAgB,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAClC,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAY;IACrC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,SAAS,EAAE,CAAC;IAC1C,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACvC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAmB,CAAC;QACjD,IAAI,MAAM,CAAC,aAAa,KAAK,cAAc,IAAI,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;YACjF,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,iDAAiD,CAAC,CAAC;YACzE,OAAO,SAAS,EAAE,CAAC;QACrB,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,mDAAmD,CAAC,CAAC;QAChF,OAAO,SAAS,EAAE,CAAC;IACrB,CAAC;AACH,CAAC;AAED,iCAAiC;AACjC,SAAS,WAAW,CAAC,IAAY,EAAE,QAAwB;IACzD,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9C,MAAM,GAAG,GAAG,GAAG,IAAI,QAAQ,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;IACvD,aAAa,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IACtD,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;AACxB,CAAC;AAED;;;;;;;;;;2DAU2D;AAC3D,SAAS,SAAS,CAAC,MAAkB;IACnC,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,eAAe,CAC7B,QAAmC,EACnC,OAAgB,EAChB,MAAY,IAAI,IAAI,EAAE;IAEtB,IAAI,CAAC,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAC/B,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;IACvD,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IACnD,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC;IAC5B,IAAI,QAAQ,CAAC,SAAS,GAAG,CAAC,EAAE,CAAC;QAC3B,MAAM,QAAQ,GAAG,CAAC,KAAK,GAAG,WAAW,CAAC,GAAG,MAAM,CAAC;QAChD,OAAO,QAAQ,IAAI,gBAAgB,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC;IAC3D,CAAC;IACD,IAAI,OAAO;QAAE,OAAO,QAAQ,CAAC;IAC7B,MAAM,OAAO,GAAG,CAAC,KAAK,GAAG,SAAS,CAAC,GAAG,MAAM,CAAC;IAC7C,OAAO,OAAO,IAAI,kBAAkB,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC;AAC/D,CAAC;AAkBD;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,YAAY,CAAC,MAAoB,EAAE,OAAsB,EAAE;IACzE,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC;IAC/C,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACxC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC;IACnC,MAAM,IAAI,GAAmB,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;IAC3E,MAAM,GAAG,GAAmB,EAAE,CAAC;IAC/B,IAAI,OAAO,GAAG,KAAK,CAAC;IAEpB,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,OAAO,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;QACjC,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACnC,MAAM,SAAS,GAAG,eAAe,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC;QAC1D,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC5C,IAAI,SAAiB,CAAC;QACtB,IAAI,UAAU,IAAI,UAAU,CAAC,SAAS,KAAK,SAAS,IAAI,UAAU,CAAC,OAAO,KAAK,OAAO,EAAE,CAAC;YACvF,mDAAmD;YACnD,SAAS,GAAG,UAAU,CAAC,SAAS,CAAC;QACnC,CAAC;aAAM,CAAC;YACN,SAAS,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC;YAC9B,OAAO,GAAG,IAAI,CAAC;QACjB,CAAC;QACD,MAAM,KAAK,GAAe,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC;QAC5D,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;QAChC,IAAI,SAAS,KAAK,UAAU;YAAE,GAAG,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IAC3D,CAAC;IAED,sEAAsE;IACtE,mEAAmE;IACnE,mEAAmE;IACnE,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;QAChD,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;YAC1B,OAAO,GAAG,IAAI,CAAC;YACf,MAAM;QACR,CAAC;IACH,CAAC;IAED,IAAI,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC9B,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,IAAI,gBAAgB,EAAE,CAAC;QAClD,IAAI,CAAC;YACH,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YACxB,iEAAiE;YACjE,sEAAsE;YACtE,gBAAgB,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACnC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,IAAI,CACT,EAAE,GAAG,EAAE,IAAI,EAAE,EACb,sEAAsE,CACvE,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;yEAEyE;AACzE,MAAM,UAAU,eAAe;IAC7B,gBAAgB,CAAC,KAAK,EAAE,CAAC;AAC3B,CAAC"}
|
package/dist/skills/loader.d.ts
CHANGED
|
@@ -1,23 +1,29 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Skill loader for the Maestro TS port — accepts two on-disk conventions:
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* model consumes via `skill_view`.
|
|
4
|
+
* 1. **Upstream v0.13.0** — `SKILL.md` (UPPERCASE) with a leading
|
|
5
|
+
* `---\nYAML\n---\n` frontmatter block carrying `name` + `description`
|
|
6
|
+
* and an optional `platforms` filter.
|
|
8
7
|
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
8
|
+
* 2. **Clawgram body-based** — `skill.md` (lowercase) with no YAML
|
|
9
|
+
* block; the first `# Heading` is treated as the display title and
|
|
10
|
+
* a `> **Description**: ...` blockquote on a single line carries the
|
|
11
|
+
* trigger keywords / summary. Canonical `name` falls back to the
|
|
12
|
+
* parent directory's kebab-case identifier so the rest of the
|
|
13
|
+
* pipeline (index, skill_view, usage counters) is convention-agnostic.
|
|
15
14
|
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
15
|
+
* Both filename casings and both metadata sources are merged transparently
|
|
16
|
+
* — a SKILL.md with frontmatter wins on conflicting fields, and a project
|
|
17
|
+
* can mix the two styles in the same `.skills/<key>/` tree without
|
|
18
|
+
* configuration. The full YAML parser is still avoided; the minimal
|
|
19
|
+
* fallback parser (top-level scalars + flat `platforms: [...]` list)
|
|
20
|
+
* covers every real-world frontmatter we've seen.
|
|
21
|
+
*
|
|
22
|
+
* Directory layout (both styles):
|
|
23
|
+
* <root>/<category>/<skill-name>/{SKILL.md|skill.md}
|
|
18
24
|
* The penultimate path segment is treated as `category` (used for the
|
|
19
|
-
* Skills index grouping); a
|
|
20
|
-
* "general".
|
|
25
|
+
* Skills index grouping); a skill file at the root level is bucketed
|
|
26
|
+
* under "general".
|
|
21
27
|
*
|
|
22
28
|
* Filters:
|
|
23
29
|
* - Hidden / build dirs (`.git`, `.github`, `.archive`, `.hub`) are
|
|
@@ -46,11 +52,16 @@ export interface SkillEntry {
|
|
|
46
52
|
* `platforms: [macos, linux]`) are joined with `,`. */
|
|
47
53
|
frontmatter: Record<string, string>;
|
|
48
54
|
}
|
|
49
|
-
/** Description length cap for the rendered index.
|
|
50
|
-
*
|
|
51
|
-
*
|
|
52
|
-
*
|
|
53
|
-
|
|
55
|
+
/** Description length cap for the rendered index. Raised from 60 → 300 in
|
|
56
|
+
* v0.1.5 because the original 60-char ceiling truncated the "trigger
|
|
57
|
+
* keywords" line that clawgram-style skills rely on for activation —
|
|
58
|
+
* hosts intentionally pack a comma-separated list of search terms into
|
|
59
|
+
* the description, and chopping it at 60 chars regularly lost half the
|
|
60
|
+
* keywords. 300 is generous enough that every real-world description we
|
|
61
|
+
* audited fits intact, while still keeping the per-skill system-prompt
|
|
62
|
+
* footprint bounded if a runaway author writes a 5KB description. The
|
|
63
|
+
* full description still ships with `skill_view` for the body view. */
|
|
64
|
+
export declare const SKILL_INDEX_DESCRIPTION_CAP = 300;
|
|
54
65
|
/**
|
|
55
66
|
* Walk `rootDir` recursively and return one `SkillEntry` per SKILL.md found,
|
|
56
67
|
* subject to platform compatibility + the skip-dir filter.
|
|
@@ -60,6 +71,20 @@ export declare const SKILL_INDEX_DESCRIPTION_CAP = 60;
|
|
|
60
71
|
* upstream `scan_skill_commands`.
|
|
61
72
|
*/
|
|
62
73
|
export declare function loadSkills(rootDir: string): SkillEntry[];
|
|
74
|
+
/**
|
|
75
|
+
* Pull a `> **Description**: ...` (or `> Description: ...`) blockquote out
|
|
76
|
+
* of a markdown body. Matches the clawgram convention where a single-line
|
|
77
|
+
* blockquote near the top of the file carries the trigger keywords.
|
|
78
|
+
*
|
|
79
|
+
* Case-insensitive on the label, tolerant of either `**Description**` or
|
|
80
|
+
* plain `Description`. Only the first match is returned — multi-line
|
|
81
|
+
* blockquotes get joined into one line by trimming trailing whitespace and
|
|
82
|
+
* collapsing inner newlines.
|
|
83
|
+
*
|
|
84
|
+
* Returns "" when no blockquote matches, so the caller can decide whether
|
|
85
|
+
* to fall back to a different source.
|
|
86
|
+
*/
|
|
87
|
+
export declare function extractBlockquoteDescription(body: string): string;
|
|
63
88
|
/**
|
|
64
89
|
* Parse a `---\n...\n---\n` YAML frontmatter block into a flat string map.
|
|
65
90
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/skills/loader.ts"],"names":[],"mappings":"AAIA
|
|
1
|
+
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/skills/loader.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAEH,wFAAwF;AACxF,MAAM,WAAW,UAAU;IACzB,2EAA2E;IAC3E,IAAI,EAAE,MAAM,CAAC;IACb,oEAAoE;IACpE,WAAW,EAAE,MAAM,CAAC;IACpB,qFAAqF;IACrF,QAAQ,EAAE,MAAM,CAAC;IACjB;;gDAE4C;IAC5C,QAAQ,EAAE,MAAM,CAAC;IACjB,wCAAwC;IACxC,MAAM,EAAE,MAAM,CAAC;IACf;+CAC2C;IAC3C,GAAG,EAAE,MAAM,CAAC;IACZ;4DACwD;IACxD,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACrC;AAMD;;;;;;;;wEAQwE;AACxE,eAAO,MAAM,2BAA2B,MAAM,CAAC;AAE/C;;;;;;;GAOG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,EAAE,CAgBxD;AAsGD;;;;;;;;;;;;GAYG;AACH,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAMjE;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG;IACjD,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,IAAI,EAAE,MAAM,CAAC;CACd,CAkCA;AAaD;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAC7B,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACnC,QAAQ,GAAE,MAAyB,GAClC,OAAO,CAaT;AA8CD;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,EAAE,CAoB9D;AAED;mEACmE;AACnE,wBAAgB,qBAAqB,IAAI,IAAI,CAE5C;AAED;8CAC8C;AAC9C,wBAAgB,eAAe,CAAC,MAAM,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAYrF"}
|
package/dist/skills/loader.js
CHANGED
|
@@ -4,11 +4,16 @@ import { logger } from "../platform/logger.js";
|
|
|
4
4
|
/** Sub-directory names we never descend into. Mirrors upstream
|
|
5
5
|
* `scan_skill_commands` skip set. */
|
|
6
6
|
const SKIP_DIRS = new Set([".git", ".github", ".hub", ".archive", "node_modules"]);
|
|
7
|
-
/** Description length cap for the rendered index.
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
|
|
7
|
+
/** Description length cap for the rendered index. Raised from 60 → 300 in
|
|
8
|
+
* v0.1.5 because the original 60-char ceiling truncated the "trigger
|
|
9
|
+
* keywords" line that clawgram-style skills rely on for activation —
|
|
10
|
+
* hosts intentionally pack a comma-separated list of search terms into
|
|
11
|
+
* the description, and chopping it at 60 chars regularly lost half the
|
|
12
|
+
* keywords. 300 is generous enough that every real-world description we
|
|
13
|
+
* audited fits intact, while still keeping the per-skill system-prompt
|
|
14
|
+
* footprint bounded if a runaway author writes a 5KB description. The
|
|
15
|
+
* full description still ships with `skill_view` for the body view. */
|
|
16
|
+
export const SKILL_INDEX_DESCRIPTION_CAP = 300;
|
|
12
17
|
/**
|
|
13
18
|
* Walk `rootDir` recursively and return one `SkillEntry` per SKILL.md found,
|
|
14
19
|
* subject to platform compatibility + the skip-dir filter.
|
|
@@ -35,6 +40,12 @@ export function loadSkills(rootDir) {
|
|
|
35
40
|
});
|
|
36
41
|
return out;
|
|
37
42
|
}
|
|
43
|
+
/** Filenames recognized as skill manifests. SKILL.md is upstream v0.13.0;
|
|
44
|
+
* skill.md is the clawgram convention. Both are accepted at the same
|
|
45
|
+
* layout position, and if a directory somehow contains both (mixed-style
|
|
46
|
+
* hand-edit), SKILL.md wins because it's the original format and we
|
|
47
|
+
* don't want a silent semantic shift if a host migrates incrementally. */
|
|
48
|
+
const SKILL_FILENAMES = ["SKILL.md", "skill.md"];
|
|
38
49
|
function walk(root, dir, out, seenNames) {
|
|
39
50
|
let entries;
|
|
40
51
|
try {
|
|
@@ -59,7 +70,10 @@ function walk(root, dir, out, seenNames) {
|
|
|
59
70
|
walk(root, path, out, seenNames);
|
|
60
71
|
continue;
|
|
61
72
|
}
|
|
62
|
-
if (!stat.isFile()
|
|
73
|
+
if (!stat.isFile())
|
|
74
|
+
continue;
|
|
75
|
+
const base = basename(path);
|
|
76
|
+
if (!SKILL_FILENAMES.includes(base))
|
|
63
77
|
continue;
|
|
64
78
|
const entry = parseSkillFile(root, path);
|
|
65
79
|
if (!entry)
|
|
@@ -85,7 +99,9 @@ function parseSkillFile(root, mdPath) {
|
|
|
85
99
|
return null;
|
|
86
100
|
}
|
|
87
101
|
const { frontmatter, body } = parseFrontmatter(raw);
|
|
88
|
-
|
|
102
|
+
// Strip the trailing skill-file basename to recover the skill's directory,
|
|
103
|
+
// regardless of which casing was used (SKILL.md vs skill.md).
|
|
104
|
+
const skillDir = mdPath.slice(0, -("/" + basename(mdPath)).length);
|
|
89
105
|
const dirName = basename(skillDir);
|
|
90
106
|
const name = (frontmatter.name ?? dirName).trim();
|
|
91
107
|
if (!name)
|
|
@@ -95,14 +111,22 @@ function parseSkillFile(root, mdPath) {
|
|
|
95
111
|
const rel = skillDir.slice(root.length).replace(/^[/\\]+/, "");
|
|
96
112
|
const parts = rel.split(sep).filter(Boolean);
|
|
97
113
|
const category = parts.length > 1 ? parts.slice(0, -1).join("/") : "general";
|
|
98
|
-
// Description
|
|
99
|
-
//
|
|
100
|
-
//
|
|
114
|
+
// Description resolution order:
|
|
115
|
+
// 1. YAML frontmatter `description:` (upstream v0.13.0 convention)
|
|
116
|
+
// 2. `> **Description**: ...` blockquote anywhere in the body
|
|
117
|
+
// (clawgram body-based convention — single line, optional bold,
|
|
118
|
+
// case-insensitive label)
|
|
119
|
+
// 3. First non-blank, non-heading, non-blockquote line of the body
|
|
120
|
+
// (last-resort fallback so a SKILL.md without either still surfaces
|
|
121
|
+
// something useful in the index)
|
|
122
|
+
// Empty string is valid — index-builder renders without the `: ...` suffix.
|
|
101
123
|
let description = (frontmatter.description ?? "").trim();
|
|
124
|
+
if (!description)
|
|
125
|
+
description = extractBlockquoteDescription(body);
|
|
102
126
|
if (!description) {
|
|
103
127
|
for (const line of body.split("\n")) {
|
|
104
128
|
const t = line.trim();
|
|
105
|
-
if (!t || t.startsWith("#"))
|
|
129
|
+
if (!t || t.startsWith("#") || t.startsWith(">"))
|
|
106
130
|
continue;
|
|
107
131
|
description = t;
|
|
108
132
|
break;
|
|
@@ -120,6 +144,27 @@ function parseSkillFile(root, mdPath) {
|
|
|
120
144
|
frontmatter,
|
|
121
145
|
};
|
|
122
146
|
}
|
|
147
|
+
/**
|
|
148
|
+
* Pull a `> **Description**: ...` (or `> Description: ...`) blockquote out
|
|
149
|
+
* of a markdown body. Matches the clawgram convention where a single-line
|
|
150
|
+
* blockquote near the top of the file carries the trigger keywords.
|
|
151
|
+
*
|
|
152
|
+
* Case-insensitive on the label, tolerant of either `**Description**` or
|
|
153
|
+
* plain `Description`. Only the first match is returned — multi-line
|
|
154
|
+
* blockquotes get joined into one line by trimming trailing whitespace and
|
|
155
|
+
* collapsing inner newlines.
|
|
156
|
+
*
|
|
157
|
+
* Returns "" when no blockquote matches, so the caller can decide whether
|
|
158
|
+
* to fall back to a different source.
|
|
159
|
+
*/
|
|
160
|
+
export function extractBlockquoteDescription(body) {
|
|
161
|
+
// ^> +(\*\*)?Description(\*\*)?:?\s*(rest of line)
|
|
162
|
+
const re = /^[ \t]*>[ \t]*(?:\*\*)?\s*description\s*(?:\*\*)?[ \t]*:?[ \t]*(.+)$/im;
|
|
163
|
+
const m = re.exec(body);
|
|
164
|
+
if (!m)
|
|
165
|
+
return "";
|
|
166
|
+
return m[1].replace(/\s+/g, " ").trim();
|
|
167
|
+
}
|
|
123
168
|
/**
|
|
124
169
|
* Parse a `---\n...\n---\n` YAML frontmatter block into a flat string map.
|
|
125
170
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/skills/loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC1E,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/skills/loader.ts"],"names":[],"mappings":"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"}
|