maestro-flow 0.4.15 → 0.4.16

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.
Files changed (90) hide show
  1. package/.agents/skills/maestro/SKILL.md +17 -17
  2. package/.agents/skills/maestro-plan/SKILL.md +10 -9
  3. package/.agents/skills/maestro-ralph/SKILL.md +21 -17
  4. package/.agents/skills/maestro-ralph-execute/SKILL.md +54 -71
  5. package/.agents/skills/manage-knowledge-audit/SKILL.md +90 -0
  6. package/.agy/skills/maestro/SKILL.md +17 -17
  7. package/.agy/skills/maestro-plan/SKILL.md +10 -9
  8. package/.agy/skills/maestro-ralph/SKILL.md +21 -17
  9. package/.agy/skills/maestro-ralph-execute/SKILL.md +54 -71
  10. package/.agy/skills/manage-knowledge-audit/SKILL.md +90 -0
  11. package/.claude/commands/maestro-plan.md +10 -9
  12. package/.claude/commands/maestro-ralph-execute.md +54 -71
  13. package/.claude/commands/maestro-ralph.md +21 -17
  14. package/.claude/commands/maestro.md +17 -17
  15. package/.claude/commands/manage-knowledge-audit.md +88 -0
  16. package/dist/src/cli.js +1 -0
  17. package/dist/src/cli.js.map +1 -1
  18. package/dist/src/commands/font-guide.d.ts +13 -0
  19. package/dist/src/commands/font-guide.d.ts.map +1 -0
  20. package/dist/src/commands/font-guide.js +114 -0
  21. package/dist/src/commands/font-guide.js.map +1 -0
  22. package/dist/src/commands/install.d.ts.map +1 -1
  23. package/dist/src/commands/install.js +5 -0
  24. package/dist/src/commands/install.js.map +1 -1
  25. package/dist/src/commands/ralph.d.ts +6 -0
  26. package/dist/src/commands/ralph.d.ts.map +1 -0
  27. package/dist/src/commands/ralph.js +133 -0
  28. package/dist/src/commands/ralph.js.map +1 -0
  29. package/dist/src/core/manifest.d.ts +2 -0
  30. package/dist/src/core/manifest.d.ts.map +1 -1
  31. package/dist/src/core/manifest.js.map +1 -1
  32. package/dist/src/hooks/statusline.d.ts.map +1 -1
  33. package/dist/src/hooks/statusline.js +189 -81
  34. package/dist/src/hooks/statusline.js.map +1 -1
  35. package/dist/src/ralph/cmd-check.d.ts +9 -0
  36. package/dist/src/ralph/cmd-check.d.ts.map +1 -0
  37. package/dist/src/ralph/cmd-check.js +53 -0
  38. package/dist/src/ralph/cmd-check.js.map +1 -0
  39. package/dist/src/ralph/cmd-complete.d.ts +10 -0
  40. package/dist/src/ralph/cmd-complete.d.ts.map +1 -0
  41. package/dist/src/ralph/cmd-complete.js +91 -0
  42. package/dist/src/ralph/cmd-complete.js.map +1 -0
  43. package/dist/src/ralph/cmd-next.d.ts +5 -0
  44. package/dist/src/ralph/cmd-next.d.ts.map +1 -0
  45. package/dist/src/ralph/cmd-next.js +158 -0
  46. package/dist/src/ralph/cmd-next.js.map +1 -0
  47. package/dist/src/ralph/cmd-session.d.ts +5 -0
  48. package/dist/src/ralph/cmd-session.d.ts.map +1 -0
  49. package/dist/src/ralph/cmd-session.js +52 -0
  50. package/dist/src/ralph/cmd-session.js.map +1 -0
  51. package/dist/src/ralph/cmd-skills.d.ts +6 -0
  52. package/dist/src/ralph/cmd-skills.d.ts.map +1 -0
  53. package/dist/src/ralph/cmd-skills.js +55 -0
  54. package/dist/src/ralph/cmd-skills.js.map +1 -0
  55. package/dist/src/ralph/skill-resolver.d.ts +40 -0
  56. package/dist/src/ralph/skill-resolver.d.ts.map +1 -0
  57. package/dist/src/ralph/skill-resolver.js +162 -0
  58. package/dist/src/ralph/skill-resolver.js.map +1 -0
  59. package/dist/src/ralph/skill-scanner.d.ts +15 -0
  60. package/dist/src/ralph/skill-scanner.d.ts.map +1 -0
  61. package/dist/src/ralph/skill-scanner.js +122 -0
  62. package/dist/src/ralph/skill-scanner.js.map +1 -0
  63. package/dist/src/ralph/status-checker.d.ts +7 -0
  64. package/dist/src/ralph/status-checker.d.ts.map +1 -0
  65. package/dist/src/ralph/status-checker.js +139 -0
  66. package/dist/src/ralph/status-checker.js.map +1 -0
  67. package/dist/src/ralph/status-schema.d.ts +94 -0
  68. package/dist/src/ralph/status-schema.d.ts.map +1 -0
  69. package/dist/src/ralph/status-schema.js +9 -0
  70. package/dist/src/ralph/status-schema.js.map +1 -0
  71. package/dist/src/ralph/status-store.d.ts +20 -0
  72. package/dist/src/ralph/status-store.d.ts.map +1 -0
  73. package/dist/src/ralph/status-store.js +70 -0
  74. package/dist/src/ralph/status-store.js.map +1 -0
  75. package/dist/src/tui/install-ui/ExecutionView.d.ts.map +1 -1
  76. package/dist/src/tui/install-ui/ExecutionView.js +1 -0
  77. package/dist/src/tui/install-ui/ExecutionView.js.map +1 -1
  78. package/dist/src/tui/install-ui/InstallExecution.d.ts.map +1 -1
  79. package/dist/src/tui/install-ui/InstallExecution.js +2 -0
  80. package/dist/src/tui/install-ui/InstallExecution.js.map +1 -1
  81. package/dist/src/tui/install-ui/InstallFlow.d.ts.map +1 -1
  82. package/dist/src/tui/install-ui/InstallFlow.js +28 -14
  83. package/dist/src/tui/install-ui/InstallFlow.js.map +1 -1
  84. package/dist/src/tui/install-ui/InstallResult.d.ts.map +1 -1
  85. package/dist/src/tui/install-ui/InstallResult.js +1 -1
  86. package/dist/src/tui/install-ui/InstallResult.js.map +1 -1
  87. package/dist/src/utils/update-notices.js +12 -0
  88. package/dist/src/utils/update-notices.js.map +1 -1
  89. package/package.json +1 -1
  90. package/workflows/knowledge-audit.md +358 -0
@@ -0,0 +1,91 @@
1
+ // ---------------------------------------------------------------------------
2
+ // `maestro ralph complete <idx> --status <S>` — write completion + clear active_step.
3
+ //
4
+ // Consistency rules (all hard errors):
5
+ // E008 idx must equal session.active_step_index
6
+ // E009 target step.status must be "running"
7
+ //
8
+ // Status semantics:
9
+ // DONE → completed, completion_confirmed=true
10
+ // DONE_WITH_CONCERNS → completed, completion_confirmed=true, .concerns recorded
11
+ // NEEDS_RETRY → pending, retried=true, completion_confirmed=false
12
+ // BLOCKED → step.status=failed, session.status=paused
13
+ //
14
+ // NEEDS_CONTEXT is NOT accepted — context shortage is no longer a valid
15
+ // completion verdict (Claude Code harness auto-compacts; genuine ambiguity is
16
+ // resolved in-place via AskUserQuestion in the command itself).
17
+ // ---------------------------------------------------------------------------
18
+ import { resolveSession, writeStatus, workflowRoot } from './status-store.js';
19
+ export async function runComplete(opts) {
20
+ const resolved = resolveSession(workflowRoot(), opts.sessionId);
21
+ if (!resolved) {
22
+ console.error('[ralph complete] no ralph-* session found');
23
+ return 1;
24
+ }
25
+ const { sessionId, statusPath, data } = resolved;
26
+ if (opts.index < 0 || opts.index >= data.steps.length) {
27
+ console.error(`[ralph complete] step index ${opts.index} out of range (0..${data.steps.length - 1})`);
28
+ return 1;
29
+ }
30
+ const active = data.active_step_index;
31
+ if (active !== opts.index) {
32
+ console.error(`[ralph complete] E008: index ${opts.index} != active_step_index ${active === null || active === undefined ? '(none)' : active}`);
33
+ console.error(' → edit status.json manually to recover');
34
+ return 1;
35
+ }
36
+ const step = data.steps[opts.index];
37
+ if (step.status !== 'running') {
38
+ console.error(`[ralph complete] E009: step ${opts.index}.status is "${step.status}", expected "running"`);
39
+ return 1;
40
+ }
41
+ const now = new Date().toISOString();
42
+ applyStatus(data, step, now, opts);
43
+ writeStatus(statusPath, data);
44
+ console.error(`[ralph complete] session=${sessionId} step=${opts.index} status=${opts.status}`);
45
+ return 0;
46
+ }
47
+ function applyStatus(session, step, now, opts) {
48
+ const evidence = opts.evidence.length === 0
49
+ ? null
50
+ : opts.evidence.length === 1 ? opts.evidence[0] : opts.evidence;
51
+ switch (opts.status) {
52
+ case 'DONE':
53
+ step.status = 'completed';
54
+ step.completion_confirmed = true;
55
+ step.completion_status = 'DONE';
56
+ step.completion_evidence = evidence;
57
+ step.completed_at = now;
58
+ step.concerns = null;
59
+ session.active_step_index = null;
60
+ break;
61
+ case 'DONE_WITH_CONCERNS':
62
+ step.status = 'completed';
63
+ step.completion_confirmed = true;
64
+ step.completion_status = 'DONE_WITH_CONCERNS';
65
+ step.completion_evidence = evidence;
66
+ step.concerns = opts.concerns ?? null;
67
+ step.completed_at = now;
68
+ session.active_step_index = null;
69
+ break;
70
+ case 'NEEDS_RETRY':
71
+ step.status = 'pending';
72
+ step.retried = true;
73
+ step.completion_confirmed = false;
74
+ step.completion_status = 'NEEDS_RETRY';
75
+ step.completion_evidence = evidence;
76
+ step.completed_at = null;
77
+ session.active_step_index = null;
78
+ break;
79
+ case 'BLOCKED':
80
+ step.status = 'failed';
81
+ step.completion_confirmed = false;
82
+ step.completion_status = 'BLOCKED';
83
+ step.completion_evidence = evidence;
84
+ step.concerns = opts.reason ?? null;
85
+ step.completed_at = now;
86
+ session.status = 'paused';
87
+ session.active_step_index = null;
88
+ break;
89
+ }
90
+ }
91
+ //# sourceMappingURL=cmd-complete.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cmd-complete.js","sourceRoot":"","sources":["../../../src/ralph/cmd-complete.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export interface NextCmdOptions {
2
+ sessionId?: string;
3
+ }
4
+ export declare function runNext(opts: NextCmdOptions): Promise<number>;
5
+ //# sourceMappingURL=cmd-next.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cmd-next.d.ts","sourceRoot":"","sources":["../../../src/ralph/cmd-next.ts"],"names":[],"mappings":"AA4BA,MAAM,WAAW,cAAc;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAsB,OAAO,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAsFnE"}
@@ -0,0 +1,158 @@
1
+ // ---------------------------------------------------------------------------
2
+ // `maestro ralph next` — load next pending step.
3
+ //
4
+ // Flow:
5
+ // 1. Resolve session (must be `running`)
6
+ // 2. Consistency check: active_step_index must be null (or point to a
7
+ // completed step we can clear). Decision nodes are skipped — caller
8
+ // (ralph-execute.md) handles those via Skill("maestro-ralph") handoff.
9
+ // 3. Pick next `status==pending` execution step.
10
+ // 4. Load command_path .md + required_reading (via skill-resolver).
11
+ // 5. Write status.json: active_step_index = N, step.status = "running",
12
+ // step.load.* populated.
13
+ // 6. stdout: framed prompt block + completion protocol.
14
+ //
15
+ // Exit codes:
16
+ // 0 — printed a step
17
+ // 2 — no more pending steps; session may need completion
18
+ // 3 — refused due to active_step_index already held (caller must complete first)
19
+ // 1 — generic error (E007 missing required_reading, etc.)
20
+ // ---------------------------------------------------------------------------
21
+ import { RALPH_PROTOCOL_VERSION } from './status-schema.js';
22
+ import { resolveSession, writeStatus, workflowRoot } from './status-store.js';
23
+ import { checkStatus } from './status-checker.js';
24
+ import { hasErrors } from './cmd-check.js';
25
+ import { loadSkill, normalizeStoredPath } from './skill-resolver.js';
26
+ export async function runNext(opts) {
27
+ const resolved = resolveSession(workflowRoot(), opts.sessionId);
28
+ if (!resolved) {
29
+ console.error('[ralph next] no ralph-* session found');
30
+ return 1;
31
+ }
32
+ const { sessionId, statusPath, data } = resolved;
33
+ if (data.status !== 'running') {
34
+ console.error(`[ralph next] session is "${data.status}", not running — edit status.json to resume`);
35
+ return 1;
36
+ }
37
+ // E-level prerequisites — refuse if any.
38
+ const findings = checkStatus(data);
39
+ if (hasErrors(findings)) {
40
+ console.error('[ralph next] status.json has errors:');
41
+ for (const f of findings) {
42
+ if (f.level !== 'E')
43
+ continue;
44
+ const loc = f.step_index !== undefined ? ` [step ${f.step_index}]` : '';
45
+ console.error(` ${f.code}${loc}: ${f.message}`);
46
+ }
47
+ console.error(' → edit status.json manually, then retry');
48
+ return 1;
49
+ }
50
+ // Auto-clear stale active_step_index pointing to a completed step (W005).
51
+ if (data.active_step_index !== null && data.active_step_index !== undefined) {
52
+ const cur = data.steps[data.active_step_index];
53
+ if (cur && cur.status === 'completed') {
54
+ data.active_step_index = null;
55
+ }
56
+ else {
57
+ console.error(`[ralph next] step ${data.active_step_index} is still active (status=${cur?.status})`);
58
+ console.error(` → run: maestro ralph complete ${data.active_step_index} --status DONE|...`);
59
+ console.error(' or: maestro ralph retry ' + data.active_step_index);
60
+ return 3;
61
+ }
62
+ }
63
+ // Pick next pending execution step (skip decision nodes — those are handed
64
+ // back to /maestro-ralph by ralph-execute.md, not loaded by this CLI).
65
+ const next = data.steps.find(s => s.status === 'pending' && !s.decision);
66
+ if (!next) {
67
+ // All execution steps done. Surface decision nodes as a hint.
68
+ const pendingDecision = data.steps.find(s => s.status === 'pending' && s.decision);
69
+ if (pendingDecision) {
70
+ console.error(`[ralph next] no pending execution step; next is a decision node: ${pendingDecision.decision}`);
71
+ console.error(' → ralph-execute should hand off to /maestro-ralph for evaluation');
72
+ return 2;
73
+ }
74
+ console.error('[ralph next] no pending steps — all complete');
75
+ return 2;
76
+ }
77
+ // Validate command_path one more time at load time.
78
+ if (!next.command_path) {
79
+ console.error(`[ralph next] step ${next.index} has no command_path (skill="${next.skill}")`);
80
+ return 1;
81
+ }
82
+ let loaded;
83
+ try {
84
+ loaded = loadSkill(normalizeStoredPath(next.command_path));
85
+ }
86
+ catch (err) {
87
+ console.error(`[ralph next] ${err instanceof Error ? err.message : String(err)}`);
88
+ return 1;
89
+ }
90
+ // Persist load record + mark running.
91
+ const now = new Date().toISOString();
92
+ const loadRecord = {
93
+ loaded_at: now,
94
+ required_files: loaded.requiredPaths,
95
+ deferred_files: loaded.deferredPaths,
96
+ resolve_version: '1',
97
+ };
98
+ next.load = loadRecord;
99
+ next.deferred_reads = loaded.deferredPaths;
100
+ next.status = 'running';
101
+ data.active_step_index = next.index;
102
+ data.ralph_protocol_version = data.ralph_protocol_version ?? RALPH_PROTOCOL_VERSION;
103
+ writeStatus(statusPath, data);
104
+ // stdout: framed prompt
105
+ emitPrompt(sessionId, data, next, loaded);
106
+ return 0;
107
+ }
108
+ function emitPrompt(sessionId, session, step, loaded) {
109
+ const total = session.steps.length;
110
+ const idx = step.index;
111
+ const args = (step.args ?? '').trim();
112
+ // Inline <required_reading> @ references with their actual content so the
113
+ // LLM sees a fully-expanded skill body (no separate banner blocks).
114
+ const body = inlineRequiredReading(loaded.body, loaded.requiredBodies);
115
+ const argsLine = args ? ` args=${JSON.stringify(args)}` : '';
116
+ const meta = [
117
+ '',
118
+ `<!-- maestro ralph: step [${idx}/${total}] skill=${step.skill}${argsLine} session=${sessionId} -->`,
119
+ '<!-- On finish, run exactly one of:',
120
+ ` maestro ralph complete ${idx} --status DONE [--evidence <path>]`,
121
+ ` maestro ralph complete ${idx} --status DONE_WITH_CONCERNS --concerns "..."`,
122
+ ` maestro ralph retry ${idx}`,
123
+ ` maestro ralph complete ${idx} --status BLOCKED --reason "<external blocker>" -->`,
124
+ ].join('\n');
125
+ process.stdout.write(body + meta + '\n');
126
+ }
127
+ /**
128
+ * Replace every `@path` line inside the `<required_reading>` block with the
129
+ * actual file content. Iterates `requiredBodies` in declaration order — the
130
+ * same order `parseSkillManifest` produced them. If there are extra @ lines
131
+ * without a matching loaded body (shouldn't happen if loadSkill succeeded),
132
+ * they're left untouched.
133
+ */
134
+ function inlineRequiredReading(body, requiredBodies) {
135
+ const re = /<required_reading>([\s\S]*?)<\/required_reading>/i;
136
+ const match = re.exec(body);
137
+ if (!match)
138
+ return body;
139
+ const inner = match[1];
140
+ const lines = inner.split(/\r?\n/);
141
+ const out = [];
142
+ let i = 0;
143
+ for (const line of lines) {
144
+ const m = /@(\S+)/.exec(line);
145
+ if (m && i < requiredBodies.length) {
146
+ out.push(`<!-- inlined @${m[1]} -->`);
147
+ out.push(requiredBodies[i].content);
148
+ out.push('<!-- /inlined -->');
149
+ i++;
150
+ continue;
151
+ }
152
+ out.push(line);
153
+ }
154
+ return body.slice(0, match.index) +
155
+ `<required_reading>\n${out.join('\n')}\n</required_reading>` +
156
+ body.slice(match.index + match[0].length);
157
+ }
158
+ //# sourceMappingURL=cmd-next.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cmd-next.js","sourceRoot":"","sources":["../../../src/ralph/cmd-next.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export interface SessionCmdOptions {
2
+ sessionId?: string;
3
+ }
4
+ export declare function runSession(opts: SessionCmdOptions): Promise<number>;
5
+ //# sourceMappingURL=cmd-session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cmd-session.d.ts","sourceRoot":"","sources":["../../../src/ralph/cmd-session.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,iBAAiB;IAChC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAsB,UAAU,CAAC,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,CAgDzE"}
@@ -0,0 +1,52 @@
1
+ // ---------------------------------------------------------------------------
2
+ // `maestro ralph session` — show current ralph session summary.
3
+ // ---------------------------------------------------------------------------
4
+ import { resolveSession, workflowRoot } from './status-store.js';
5
+ export async function runSession(opts) {
6
+ const resolved = resolveSession(workflowRoot(), opts.sessionId);
7
+ if (!resolved) {
8
+ if (opts.sessionId) {
9
+ console.error(`[ralph session] not found: ${opts.sessionId}`);
10
+ }
11
+ else {
12
+ console.error('[ralph session] no ralph-* sessions found');
13
+ console.error(' use /maestro-ralph "<intent>" to create one');
14
+ }
15
+ return 1;
16
+ }
17
+ const s = resolved.data;
18
+ const completed = s.steps.filter(x => x.status === 'completed').length;
19
+ const total = s.steps.length;
20
+ const active = s.active_step_index;
21
+ console.log(`session: ${resolved.sessionId}`);
22
+ console.log(`status: ${s.status}`);
23
+ console.log(`lifecycle: ${s.lifecycle_position}`);
24
+ console.log(`phase: ${s.phase ?? '(n/a)'}${s.phase_is_new ? ' (new)' : ''}`);
25
+ console.log(`milestone: ${s.milestone || '(n/a)'}`);
26
+ console.log(`quality_mode: ${s.quality_mode ?? '(n/a)'}`);
27
+ console.log(`planning_mode: ${s.planning_mode ?? '(n/a)'}`);
28
+ console.log(`protocol_version: ${s.ralph_protocol_version ?? '0 (legacy)'}`);
29
+ console.log(`progress: ${completed}/${total}`);
30
+ console.log(`active_step_index: ${active === null || active === undefined ? '(idle)' : active}`);
31
+ if (active !== null && active !== undefined && s.steps[active]) {
32
+ const step = s.steps[active];
33
+ console.log('');
34
+ console.log(` ▸ step ${active}: ${step.decision ? `◆ ${step.decision}` : step.skill}`);
35
+ console.log(` status: ${step.status}`);
36
+ if (step.command_path)
37
+ console.log(` command: ${step.command_path}`);
38
+ if (step.load?.loaded_at)
39
+ console.log(` loaded: ${step.load.loaded_at} (req: ${step.load.required_files.length}, def: ${step.load.deferred_files.length})`);
40
+ }
41
+ if (s.task_decomposition && s.task_decomposition.length > 0) {
42
+ const done = s.task_decomposition.filter(g => g.status === 'done').length;
43
+ console.log('');
44
+ console.log(` sub-goals: ${done}/${s.task_decomposition.length}`);
45
+ for (const g of s.task_decomposition) {
46
+ const mark = g.status === 'done' ? '[x]' : '[ ]';
47
+ console.log(` ${mark} ${g.id}: ${g.goal}`);
48
+ }
49
+ }
50
+ return 0;
51
+ }
52
+ //# sourceMappingURL=cmd-session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cmd-session.js","sourceRoot":"","sources":["../../../src/ralph/cmd-session.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export interface SkillsCmdOptions {
2
+ json?: boolean;
3
+ quiet?: boolean;
4
+ }
5
+ export declare function runSkills(opts: SkillsCmdOptions): Promise<number>;
6
+ //# sourceMappingURL=cmd-skills.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cmd-skills.d.ts","sourceRoot":"","sources":["../../../src/ralph/cmd-skills.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,gBAAgB;IAC/B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,wBAAsB,SAAS,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,CA4CvE"}
@@ -0,0 +1,55 @@
1
+ // ---------------------------------------------------------------------------
2
+ // `maestro ralph skills` — list effective commands + skills.
3
+ // ---------------------------------------------------------------------------
4
+ import { scanAllSkills } from './skill-scanner.js';
5
+ export async function runSkills(opts) {
6
+ const all = scanAllSkills();
7
+ if (opts.json) {
8
+ for (const s of all) {
9
+ process.stdout.write(JSON.stringify({
10
+ type: s.type,
11
+ scope: s.scope,
12
+ name: s.name,
13
+ path: s.filePath,
14
+ hint: s.argumentHint,
15
+ description: s.description,
16
+ required: s.requiredCount,
17
+ deferred: s.deferredCount,
18
+ missing_required: s.missingRequired,
19
+ }) + '\n');
20
+ }
21
+ return 0;
22
+ }
23
+ if (!opts.quiet) {
24
+ const header = pad('TYPE', 9) + pad('SCOPE', 9) + pad('NAME', 32) + pad('HINT', 28) + 'REQ DEF';
25
+ console.log(header);
26
+ console.log('─'.repeat(Math.max(80, header.length)));
27
+ }
28
+ for (const s of all) {
29
+ const hint = s.argumentHint || '—';
30
+ const missingMark = s.missingRequired.length > 0 ? '!' : ' ';
31
+ const line = pad(s.type, 9) +
32
+ pad(s.scope, 9) +
33
+ pad(s.name, 32) +
34
+ pad(hint.slice(0, 26), 28) +
35
+ `${String(s.requiredCount).padStart(3)} ${String(s.deferredCount).padStart(3)} ${missingMark}`;
36
+ console.log(line);
37
+ }
38
+ if (!opts.quiet) {
39
+ const counts = countByType(all);
40
+ const missing = all.filter(s => s.missingRequired.length > 0).length;
41
+ console.log('');
42
+ console.log(` ${all.length} entries (${counts.command} command, ${counts.skill} skill)` +
43
+ (missing > 0 ? ` — ${missing} with missing required_reading (!)` : ''));
44
+ }
45
+ return 0;
46
+ }
47
+ function pad(s, width) {
48
+ if (s.length >= width)
49
+ return s.slice(0, width - 1) + ' ';
50
+ return s + ' '.repeat(width - s.length);
51
+ }
52
+ function countByType(all) {
53
+ return all.reduce((acc, s) => { acc[s.type] += 1; return acc; }, { command: 0, skill: 0 });
54
+ }
55
+ //# sourceMappingURL=cmd-skills.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cmd-skills.js","sourceRoot":"","sources":["../../../src/ralph/cmd-skills.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ export interface SkillFrontmatter {
2
+ name?: string;
3
+ description?: string;
4
+ 'argument-hint'?: string;
5
+ 'allowed-tools'?: string[];
6
+ [key: string]: unknown;
7
+ }
8
+ export interface SkillManifest {
9
+ filePath: string;
10
+ frontmatter: SkillFrontmatter;
11
+ body: string;
12
+ requiredPaths: string[];
13
+ deferredPaths: string[];
14
+ missingRequired: string[];
15
+ }
16
+ export interface LoadedSkill extends SkillManifest {
17
+ requiredBodies: Array<{
18
+ path: string;
19
+ content: string;
20
+ }>;
21
+ }
22
+ /** Expand `~/`, `@~/`, and resolve relative paths.
23
+ *
24
+ * Resolution rules (first match wins):
25
+ * 1. `~/foo` / `@~/foo` → `<homedir>/foo`
26
+ * 2. absolute path → as-is
27
+ * 3. starts with `.claude/` → scope-root-relative (walk up baseDir
28
+ * until we find the parent that contains the `.claude/` segment, treat
29
+ * that parent as root). Used by skill SKILL.md files that reference
30
+ * sibling files via `@.claude/skills/<name>/specs/...`.
31
+ * 4. otherwise → relative to baseDir (.md's directory)
32
+ */
33
+ /** Normalize a stored absolute-ish path: expand `~/` to homedir, leave others. */
34
+ export declare function normalizeStoredPath(p: string): string;
35
+ export declare function expandPath(raw: string, baseDir: string): string;
36
+ /** Parse manifest only — does NOT read required files. */
37
+ export declare function parseSkillManifest(filePath: string): SkillManifest;
38
+ /** Parse + read all required files. Throws on first missing required. */
39
+ export declare function loadSkill(filePath: string): LoadedSkill;
40
+ //# sourceMappingURL=skill-resolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-resolver.d.ts","sourceRoot":"","sources":["../../../src/ralph/skill-resolver.ts"],"names":[],"mappings":"AAgBA,MAAM,WAAW,gBAAgB;IAC/B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,gBAAgB,CAAC;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,eAAe,EAAE,MAAM,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,WAAY,SAAQ,aAAa;IAChD,cAAc,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC1D;AAMD;;;;;;;;;;GAUG;AACH,kFAAkF;AAClF,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAOrD;AAED,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAmB/D;AA8DD,0DAA0D;AAC1D,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,aAAa,CAiBlE;AAED,yEAAyE;AACzE,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW,CAWvD"}
@@ -0,0 +1,162 @@
1
+ // ---------------------------------------------------------------------------
2
+ // Skill resolver — parses a command/skill .md file:
3
+ // - YAML frontmatter (name, description, argument-hint, allowed-tools)
4
+ // - <required_reading> block @paths (must all be readable)
5
+ // - <deferred_reading> block @paths (recorded only)
6
+ //
7
+ // Path expansion:
8
+ // - `@~/foo` and `~/foo` → `<homedir>/foo`
9
+ // - relative `@foo` resolves against the .md file's directory
10
+ // - absolute paths kept as-is
11
+ // ---------------------------------------------------------------------------
12
+ import { existsSync, readFileSync } from 'node:fs';
13
+ import { homedir } from 'node:os';
14
+ import { dirname, isAbsolute, join, resolve } from 'node:path';
15
+ const FRONTMATTER_RE = /^---\r?\n([\s\S]*?)\r?\n---\r?\n?/;
16
+ const REQUIRED_BLOCK_RE = /<required_reading>([\s\S]*?)<\/required_reading>/i;
17
+ const DEFERRED_BLOCK_RE = /<deferred_reading>([\s\S]*?)<\/deferred_reading>/i;
18
+ /** Expand `~/`, `@~/`, and resolve relative paths.
19
+ *
20
+ * Resolution rules (first match wins):
21
+ * 1. `~/foo` / `@~/foo` → `<homedir>/foo`
22
+ * 2. absolute path → as-is
23
+ * 3. starts with `.claude/` → scope-root-relative (walk up baseDir
24
+ * until we find the parent that contains the `.claude/` segment, treat
25
+ * that parent as root). Used by skill SKILL.md files that reference
26
+ * sibling files via `@.claude/skills/<name>/specs/...`.
27
+ * 4. otherwise → relative to baseDir (.md's directory)
28
+ */
29
+ /** Normalize a stored absolute-ish path: expand `~/` to homedir, leave others. */
30
+ export function normalizeStoredPath(p) {
31
+ if (!p)
32
+ return p;
33
+ if (p === '~')
34
+ return homedir();
35
+ if (p.startsWith('~/') || p.startsWith('~\\')) {
36
+ return join(homedir(), p.slice(2));
37
+ }
38
+ return p;
39
+ }
40
+ export function expandPath(raw, baseDir) {
41
+ let p = raw.trim();
42
+ if (p.startsWith('@'))
43
+ p = p.slice(1);
44
+ if (p === '~' || p.startsWith('~/') || p.startsWith('~\\')) {
45
+ p = join(homedir(), p.slice(p.startsWith('~/') || p.startsWith('~\\') ? 2 : 1));
46
+ }
47
+ if (isAbsolute(p))
48
+ return p;
49
+ if (p.startsWith('.claude/') || p.startsWith('.claude\\')) {
50
+ // Find the deepest `.claude` segment in baseDir and treat its parent as root.
51
+ const matches = [...baseDir.matchAll(/[\\/]\.claude[\\/]/g)];
52
+ if (matches.length > 0) {
53
+ const last = matches[matches.length - 1];
54
+ return resolve(baseDir.slice(0, last.index), p);
55
+ }
56
+ // baseDir ends in `.claude` with no trailing separator (rare; skill at root)
57
+ const trailing = /(.*)[\\/]\.claude$/.exec(baseDir);
58
+ if (trailing)
59
+ return resolve(trailing[1], p);
60
+ }
61
+ return resolve(baseDir, p);
62
+ }
63
+ /** Minimal YAML frontmatter parser — supports scalar + bracket-list arrays. */
64
+ function parseFrontmatter(raw) {
65
+ const out = {};
66
+ const lines = raw.split(/\r?\n/);
67
+ let currentListKey = null;
68
+ for (const line of lines) {
69
+ if (!line.trim()) {
70
+ currentListKey = null;
71
+ continue;
72
+ }
73
+ // List continuation (` - value`)
74
+ const listItem = /^\s+-\s+(.+)$/.exec(line);
75
+ if (listItem && currentListKey) {
76
+ const arr = out[currentListKey] ?? [];
77
+ arr.push(listItem[1].trim().replace(/^["']|["']$/g, ''));
78
+ out[currentListKey] = arr;
79
+ continue;
80
+ }
81
+ const kv = /^([A-Za-z0-9_-]+):\s*(.*)$/.exec(line);
82
+ if (!kv) {
83
+ currentListKey = null;
84
+ continue;
85
+ }
86
+ const key = kv[1];
87
+ const val = kv[2];
88
+ if (val === '' || val === '|' || val === '>') {
89
+ // Treat empty-value key as start of a list (next lines have `- ...`)
90
+ out[key] = [];
91
+ currentListKey = key;
92
+ continue;
93
+ }
94
+ // Inline array: `[a, b]`
95
+ const arrMatch = /^\[(.*)\]$/.exec(val);
96
+ if (arrMatch) {
97
+ out[key] = arrMatch[1].split(',').map(s => s.trim().replace(/^["']|["']$/g, '')).filter(Boolean);
98
+ currentListKey = null;
99
+ continue;
100
+ }
101
+ out[key] = val.replace(/^["']|["']$/g, '');
102
+ currentListKey = null;
103
+ }
104
+ return out;
105
+ }
106
+ function extractPathsFromBlock(block) {
107
+ // Match `@path` tokens AND lines starting with `- ` containing paths.
108
+ const out = [];
109
+ const lines = block.split(/\r?\n/);
110
+ for (const line of lines) {
111
+ const trimmed = line.trim();
112
+ if (!trimmed)
113
+ continue;
114
+ // Direct @path tokens
115
+ const atMatches = trimmed.match(/@[^\s,()<>]+/g);
116
+ if (atMatches) {
117
+ for (const m of atMatches)
118
+ out.push(m);
119
+ continue;
120
+ }
121
+ // Markdown-style `- [label](path)` or `- path` (deferred)
122
+ const mdLink = /^-\s+\[[^\]]*\]\(([^)]+)\)/.exec(trimmed);
123
+ if (mdLink) {
124
+ out.push(mdLink[1]);
125
+ continue;
126
+ }
127
+ const bullet = /^-\s+(\S+)/.exec(trimmed);
128
+ if (bullet)
129
+ out.push(bullet[1]);
130
+ }
131
+ return out;
132
+ }
133
+ /** Parse manifest only — does NOT read required files. */
134
+ export function parseSkillManifest(filePath) {
135
+ const text = readFileSync(filePath, 'utf-8');
136
+ const fmMatch = FRONTMATTER_RE.exec(text);
137
+ const frontmatter = fmMatch ? parseFrontmatter(fmMatch[1]) : {};
138
+ const body = fmMatch ? text.slice(fmMatch[0].length) : text;
139
+ const baseDir = dirname(filePath);
140
+ const reqMatch = REQUIRED_BLOCK_RE.exec(body);
141
+ const defMatch = DEFERRED_BLOCK_RE.exec(body);
142
+ const requiredRaw = reqMatch ? extractPathsFromBlock(reqMatch[1]) : [];
143
+ const deferredRaw = defMatch ? extractPathsFromBlock(defMatch[1]) : [];
144
+ const requiredPaths = requiredRaw.map(p => expandPath(p, baseDir));
145
+ const deferredPaths = deferredRaw.map(p => expandPath(p, baseDir));
146
+ const missingRequired = requiredPaths.filter(p => !existsSync(p));
147
+ return { filePath, frontmatter, body, requiredPaths, deferredPaths, missingRequired };
148
+ }
149
+ /** Parse + read all required files. Throws on first missing required. */
150
+ export function loadSkill(filePath) {
151
+ const manifest = parseSkillManifest(filePath);
152
+ if (manifest.missingRequired.length > 0) {
153
+ const list = manifest.missingRequired.map(p => ` - ${p}`).join('\n');
154
+ throw new Error(`E007: required_reading file(s) missing for ${filePath}:\n${list}`);
155
+ }
156
+ const requiredBodies = manifest.requiredPaths.map(p => ({
157
+ path: p,
158
+ content: readFileSync(p, 'utf-8'),
159
+ }));
160
+ return { ...manifest, requiredBodies };
161
+ }
162
+ //# sourceMappingURL=skill-resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-resolver.js","sourceRoot":"","sources":["../../../src/ralph/skill-resolver.ts"],"names":[],"mappings":"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"}