maestro-flow 0.3.24 → 0.3.26

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 (79) hide show
  1. package/.claude/agents/cli-explore-agent.md +2 -2
  2. package/.claude/commands/learn-investigate.md +26 -0
  3. package/.claude/commands/maestro.md +8 -9
  4. package/dashboard/dist-server/dashboard/src/server/agents/codex-cli-adapter.d.ts +2 -0
  5. package/dashboard/dist-server/dashboard/src/server/agents/codex-cli-adapter.js +32 -7
  6. package/dashboard/dist-server/dashboard/src/server/agents/codex-cli-adapter.js.map +1 -1
  7. package/dashboard/dist-server/src/agents/cli-agent-runner.d.ts +2 -0
  8. package/dashboard/dist-server/src/agents/cli-agent-runner.js +62 -4
  9. package/dashboard/dist-server/src/agents/cli-agent-runner.js.map +1 -1
  10. package/dashboard/dist-server/src/commands/delegate.d.ts +2 -0
  11. package/dashboard/dist-server/src/commands/delegate.js +1 -0
  12. package/dashboard/dist-server/src/commands/delegate.js.map +1 -1
  13. package/dashboard/dist-server/src/config/paths.d.ts +1 -0
  14. package/dashboard/dist-server/src/config/paths.js +1 -0
  15. package/dashboard/dist-server/src/config/paths.js.map +1 -1
  16. package/dashboard/dist-server/src/tools/spec-entry-parser.d.ts +55 -0
  17. package/dashboard/dist-server/src/tools/spec-entry-parser.js +222 -0
  18. package/dashboard/dist-server/src/tools/spec-entry-parser.js.map +1 -0
  19. package/dashboard/dist-server/src/tools/spec-loader.d.ts +51 -0
  20. package/dashboard/dist-server/src/tools/spec-loader.js +267 -0
  21. package/dashboard/dist-server/src/tools/spec-loader.js.map +1 -0
  22. package/dist/src/agents/cli-agent-runner.d.ts +2 -0
  23. package/dist/src/agents/cli-agent-runner.d.ts.map +1 -1
  24. package/dist/src/agents/cli-agent-runner.js +62 -4
  25. package/dist/src/agents/cli-agent-runner.js.map +1 -1
  26. package/dist/src/cli.js +2 -0
  27. package/dist/src/cli.js.map +1 -1
  28. package/dist/src/commands/config-ui/ConfigSourcesView.d.ts +6 -0
  29. package/dist/src/commands/config-ui/ConfigSourcesView.d.ts.map +1 -0
  30. package/dist/src/commands/config-ui/ConfigSourcesView.js +25 -0
  31. package/dist/src/commands/config-ui/ConfigSourcesView.js.map +1 -0
  32. package/dist/src/commands/config-ui/SkillConfigDashboard.d.ts +9 -0
  33. package/dist/src/commands/config-ui/SkillConfigDashboard.d.ts.map +1 -0
  34. package/dist/src/commands/config-ui/SkillConfigDashboard.js +64 -0
  35. package/dist/src/commands/config-ui/SkillConfigDashboard.js.map +1 -0
  36. package/dist/src/commands/config-ui/SkillParamEditor.d.ts +12 -0
  37. package/dist/src/commands/config-ui/SkillParamEditor.d.ts.map +1 -0
  38. package/dist/src/commands/config-ui/SkillParamEditor.js +162 -0
  39. package/dist/src/commands/config-ui/SkillParamEditor.js.map +1 -0
  40. package/dist/src/commands/config-ui/SkillsList.d.ts +12 -0
  41. package/dist/src/commands/config-ui/SkillsList.d.ts.map +1 -0
  42. package/dist/src/commands/config-ui/SkillsList.js +91 -0
  43. package/dist/src/commands/config-ui/SkillsList.js.map +1 -0
  44. package/dist/src/commands/config.d.ts +8 -0
  45. package/dist/src/commands/config.d.ts.map +1 -0
  46. package/dist/src/commands/config.js +172 -0
  47. package/dist/src/commands/config.js.map +1 -0
  48. package/dist/src/commands/delegate.d.ts +2 -0
  49. package/dist/src/commands/delegate.d.ts.map +1 -1
  50. package/dist/src/commands/delegate.js +1 -0
  51. package/dist/src/commands/delegate.js.map +1 -1
  52. package/dist/src/config/argument-hint-parser.d.ts +49 -0
  53. package/dist/src/config/argument-hint-parser.d.ts.map +1 -0
  54. package/dist/src/config/argument-hint-parser.js +283 -0
  55. package/dist/src/config/argument-hint-parser.js.map +1 -0
  56. package/dist/src/config/paths.d.ts +1 -0
  57. package/dist/src/config/paths.d.ts.map +1 -1
  58. package/dist/src/config/paths.js +1 -0
  59. package/dist/src/config/paths.js.map +1 -1
  60. package/dist/src/config/skill-config.d.ts +56 -0
  61. package/dist/src/config/skill-config.d.ts.map +1 -0
  62. package/dist/src/config/skill-config.js +188 -0
  63. package/dist/src/config/skill-config.js.map +1 -0
  64. package/dist/src/hooks/skill-context.d.ts +12 -2
  65. package/dist/src/hooks/skill-context.d.ts.map +1 -1
  66. package/dist/src/hooks/skill-context.js +126 -39
  67. package/dist/src/hooks/skill-context.js.map +1 -1
  68. package/package.json +1 -1
  69. package/templates/cli/protocols/analysis-protocol.md +121 -121
  70. package/templates/cli/protocols/write-protocol.md +138 -138
  71. package/workflows/debug.md +35 -0
  72. package/workflows/execute.md +23 -0
  73. package/workflows/maestro-chain-execute.md +204 -0
  74. package/workflows/maestro.md +21 -99
  75. package/workflows/milestone-audit.md +28 -0
  76. package/workflows/plan.md +17 -0
  77. package/workflows/review.md +46 -0
  78. package/workflows/test-gen.md +28 -0
  79. package/workflows/verify.md +38 -0
@@ -0,0 +1,283 @@
1
+ // ---------------------------------------------------------------------------
2
+ // argument-hint parser — extracts structured SkillParamDef[] from command
3
+ // frontmatter `argument-hint` strings.
4
+ //
5
+ // Drives TUI form generation and skill config validation.
6
+ // ---------------------------------------------------------------------------
7
+ import { readdirSync, readFileSync } from 'node:fs';
8
+ import { join } from 'node:path';
9
+ import { homedir } from 'node:os';
10
+ function extractFrontmatter(content) {
11
+ const fmMatch = content.match(/^---\s*\n([\s\S]*?)\n---/);
12
+ if (!fmMatch)
13
+ return null;
14
+ const block = fmMatch[1];
15
+ const get = (key) => {
16
+ const m = block.match(new RegExp(`^${key}:\\s*(.*)$`, 'm'));
17
+ if (!m)
18
+ return '';
19
+ // Strip surrounding quotes
20
+ return m[1].replace(/^["']|["']$/g, '').trim();
21
+ };
22
+ const name = get('name');
23
+ if (!name)
24
+ return null;
25
+ return {
26
+ name,
27
+ description: get('description'),
28
+ argumentHint: get('argument-hint'),
29
+ };
30
+ }
31
+ // ---------------------------------------------------------------------------
32
+ // argument-hint tokenizer
33
+ // ---------------------------------------------------------------------------
34
+ /**
35
+ * Tokenize an argument-hint string into bracket-delimited or bare segments.
36
+ *
37
+ * Examples:
38
+ * "[phase] [--auto-commit] <path>"
39
+ * → ["[phase]", "[--auto-commit]", "<path>"]
40
+ *
41
+ * "[--method agent|codex|auto]"
42
+ * → ["[--method agent|codex|auto]"]
43
+ *
44
+ * "\"intent text\" [-y]"
45
+ * → ["\"intent text\"", "[-y]"]
46
+ */
47
+ function tokenize(hint) {
48
+ const tokens = [];
49
+ let i = 0;
50
+ while (i < hint.length) {
51
+ // Skip whitespace
52
+ while (i < hint.length && /\s/.test(hint[i]))
53
+ i++;
54
+ if (i >= hint.length)
55
+ break;
56
+ const ch = hint[i];
57
+ if (ch === '[') {
58
+ // Bracket-delimited optional
59
+ const end = findMatchingBracket(hint, i, '[', ']');
60
+ tokens.push(hint.slice(i, end + 1));
61
+ i = end + 1;
62
+ }
63
+ else if (ch === '<') {
64
+ // Angle-bracket required
65
+ const end = findMatchingBracket(hint, i, '<', '>');
66
+ tokens.push(hint.slice(i, end + 1));
67
+ i = end + 1;
68
+ }
69
+ else if (ch === '"') {
70
+ // Quoted positional
71
+ const end = hint.indexOf('"', i + 1);
72
+ if (end === -1) {
73
+ tokens.push(hint.slice(i));
74
+ break;
75
+ }
76
+ tokens.push(hint.slice(i, end + 1));
77
+ i = end + 1;
78
+ }
79
+ else {
80
+ // Bare word (rare)
81
+ const end = hint.indexOf(' ', i);
82
+ if (end === -1) {
83
+ tokens.push(hint.slice(i));
84
+ break;
85
+ }
86
+ tokens.push(hint.slice(i, end));
87
+ i = end;
88
+ }
89
+ }
90
+ return tokens;
91
+ }
92
+ function findMatchingBracket(s, start, open, close) {
93
+ let depth = 0;
94
+ for (let i = start; i < s.length; i++) {
95
+ if (s[i] === open)
96
+ depth++;
97
+ if (s[i] === close) {
98
+ depth--;
99
+ if (depth === 0)
100
+ return i;
101
+ }
102
+ }
103
+ return s.length - 1;
104
+ }
105
+ // ---------------------------------------------------------------------------
106
+ // Token → SkillParamDef parser
107
+ // ---------------------------------------------------------------------------
108
+ /**
109
+ * Parse a single token into one or more SkillParamDef entries.
110
+ *
111
+ * Supported patterns:
112
+ * [--flag] → boolean
113
+ * [-y] → boolean
114
+ * [-y|-c] → multiple booleans
115
+ * [--name val1|val2|val3] → enum
116
+ * [--name <placeholder>] → string
117
+ * [--name N] → number
118
+ * [--name "text"] → string
119
+ * [positional] → positional string
120
+ * <positional> → required positional string
121
+ * "quoted text" → positional string
122
+ * [<subcommand> [options]] → positional string (e.g. manage-issue)
123
+ */
124
+ function parseToken(token) {
125
+ // Determine wrapping
126
+ const isRequired = token.startsWith('<') && token.endsWith('>');
127
+ const isOptional = token.startsWith('[') && token.endsWith(']');
128
+ const isQuoted = token.startsWith('"') && token.endsWith('"');
129
+ // Unwrap
130
+ let inner;
131
+ if (isOptional || isRequired) {
132
+ inner = token.slice(1, -1).trim();
133
+ }
134
+ else if (isQuoted) {
135
+ inner = token.slice(1, -1).trim();
136
+ return [{ name: inner, type: 'string', positional: true, required: false }];
137
+ }
138
+ else {
139
+ inner = token.trim();
140
+ }
141
+ // Handle grouped short flags: -y|-c
142
+ if (/^-[a-zA-Z](\|-[a-zA-Z])+$/.test(inner)) {
143
+ return inner.split('|').map(flag => ({
144
+ name: flag,
145
+ type: 'boolean',
146
+ required: false,
147
+ }));
148
+ }
149
+ // Handle --flag or -x (standalone boolean)
150
+ if (/^-{1,2}[a-zA-Z][\w-]*$/.test(inner)) {
151
+ return [{ name: inner, type: 'boolean', required: isRequired }];
152
+ }
153
+ // Handle --name with value: split at first space
154
+ const spaceIdx = inner.indexOf(' ');
155
+ if (spaceIdx !== -1 && inner.startsWith('-')) {
156
+ const paramName = inner.slice(0, spaceIdx);
157
+ const valueSpec = inner.slice(spaceIdx + 1).trim();
158
+ // Enum: val1|val2|val3 (no angle brackets, no N)
159
+ if (valueSpec.includes('|') && !valueSpec.startsWith('<')) {
160
+ const choices = valueSpec.split('|').map(c => c.trim());
161
+ return [{ name: paramName, type: 'enum', choices, required: isRequired }];
162
+ }
163
+ // Number: single uppercase N or digits pattern
164
+ if (/^N$/i.test(valueSpec)) {
165
+ return [{ name: paramName, type: 'number', required: isRequired }];
166
+ }
167
+ // String: <placeholder> or "text" or other
168
+ return [{ name: paramName, type: 'string', required: isRequired }];
169
+ }
170
+ // Handle special: nested brackets like <create|list|status|...>
171
+ if (inner.includes('|') && !inner.startsWith('-')) {
172
+ // Positional enum
173
+ const choices = inner.split('|').map(c => c.trim().replace(/[<>\[\]]/g, ''));
174
+ const name = choices.join('|').length > 30
175
+ ? choices[0]
176
+ : inner.replace(/[<>\[\]]/g, '');
177
+ return [{ name, type: 'enum', choices, positional: true, required: isRequired }];
178
+ }
179
+ // Plain positional: [phase], <path>, [description], etc.
180
+ // Strip nested angle brackets: [<version>] → version
181
+ const cleaned = inner.replace(/[<>]/g, '').trim();
182
+ if (!cleaned || cleaned.startsWith('[')) {
183
+ // Complex nested optional like [<subcommand> [options]] — treat as string positional
184
+ const first = cleaned.split(/\s/)[0] || 'arg';
185
+ return [{ name: first, type: 'string', positional: true, required: isRequired }];
186
+ }
187
+ return [{ name: cleaned, type: 'string', positional: true, required: isRequired }];
188
+ }
189
+ // ---------------------------------------------------------------------------
190
+ // Public API
191
+ // ---------------------------------------------------------------------------
192
+ /**
193
+ * Parse an argument-hint string into structured parameter definitions.
194
+ */
195
+ export function parseArgumentHint(hint) {
196
+ if (!hint || !hint.trim())
197
+ return [];
198
+ const tokens = tokenize(hint);
199
+ const params = [];
200
+ for (const token of tokens) {
201
+ params.push(...parseToken(token));
202
+ }
203
+ return params;
204
+ }
205
+ /**
206
+ * Load all command definitions from a `.claude/commands/` directory.
207
+ * Returns a Map of command name → CommandDef.
208
+ */
209
+ export function loadCommandDefs(commandsDir) {
210
+ const defs = new Map();
211
+ let files;
212
+ try {
213
+ files = readdirSync(commandsDir).filter(f => f.endsWith('.md'));
214
+ }
215
+ catch {
216
+ return defs;
217
+ }
218
+ for (const file of files) {
219
+ try {
220
+ const content = readFileSync(join(commandsDir, file), 'utf8');
221
+ const fm = extractFrontmatter(content);
222
+ if (!fm)
223
+ continue;
224
+ defs.set(fm.name, {
225
+ name: fm.name,
226
+ argumentHint: fm.argumentHint,
227
+ description: fm.description,
228
+ params: parseArgumentHint(fm.argumentHint),
229
+ });
230
+ }
231
+ catch {
232
+ // Skip unreadable files
233
+ }
234
+ }
235
+ return defs;
236
+ }
237
+ /**
238
+ * Discover command directories — checks both global and project-scoped locations.
239
+ * Returns array of existing directories.
240
+ */
241
+ export function discoverCommandDirs(projectDir) {
242
+ const dirs = [];
243
+ // Global commands
244
+ const globalDir = join(homedir(), '.claude', 'commands');
245
+ try {
246
+ readdirSync(globalDir);
247
+ dirs.push(globalDir);
248
+ }
249
+ catch { /* */ }
250
+ // Project commands
251
+ if (projectDir) {
252
+ const projectCmdDir = join(projectDir, '.claude', 'commands');
253
+ try {
254
+ readdirSync(projectCmdDir);
255
+ dirs.push(projectCmdDir);
256
+ }
257
+ catch { /* */ }
258
+ }
259
+ return dirs;
260
+ }
261
+ /**
262
+ * Load all command definitions from all discoverable directories.
263
+ * Project-scoped commands override global ones with the same name.
264
+ */
265
+ export function loadAllCommandDefs(projectDir) {
266
+ const merged = new Map();
267
+ const dirs = discoverCommandDirs(projectDir);
268
+ for (const dir of dirs) {
269
+ const defs = loadCommandDefs(dir);
270
+ for (const [name, def] of defs) {
271
+ merged.set(name, def); // Later dirs (project) override earlier (global)
272
+ }
273
+ }
274
+ return merged;
275
+ }
276
+ /**
277
+ * Get only the configurable (non-positional) parameters for a skill.
278
+ * These are the params users typically want to set defaults for.
279
+ */
280
+ export function getConfigurableParams(params) {
281
+ return params.filter(p => !p.positional);
282
+ }
283
+ //# sourceMappingURL=argument-hint-parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"argument-hint-parser.js","sourceRoot":"","sources":["../../../src/config/argument-hint-parser.ts"],"names":[],"mappings":"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"}
@@ -6,6 +6,7 @@ export declare const paths: {
6
6
  readonly data: string;
7
7
  readonly logs: string;
8
8
  readonly cliHistory: string;
9
+ readonly skillConfig: string;
9
10
  readonly project: (root: string) => {
10
11
  root: string;
11
12
  workflow: string;
@@ -1 +1 @@
1
- {"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../../src/config/paths.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,KAAK;;;;;;;;6BASF,MAAM;;;;;+BAQJ,MAAM,EAAE;CAOhB,CAAC"}
1
+ {"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../../src/config/paths.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,KAAK;;;;;;;;;6BAUF,MAAM;;;;;+BAQJ,MAAM,EAAE;CAOhB,CAAC"}
@@ -10,6 +10,7 @@ export const paths = {
10
10
  data: join(MAESTRO_HOME, 'data'),
11
11
  logs: join(MAESTRO_HOME, 'logs'),
12
12
  cliHistory: join(MAESTRO_HOME, 'cli-history'),
13
+ skillConfig: join(MAESTRO_HOME, 'skill-config.json'),
13
14
  project(root) {
14
15
  return {
15
16
  root: resolve(root),
@@ -1 +1 @@
1
- {"version":3,"file":"paths.js","sourceRoot":"","sources":["../../../src/config/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAEhD,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,UAAU,CAAC,CAAC;AAE7E,MAAM,CAAC,MAAM,KAAK,GAAG;IACnB,IAAI,EAAE,YAAY;IAClB,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,aAAa,CAAC;IACzC,KAAK,EAAE,IAAI,CAAC,YAAY,EAAE,OAAO,CAAC;IAClC,UAAU,EAAE,IAAI,CAAC,YAAY,EAAE,YAAY,CAAC;IAC5C,IAAI,EAAE,IAAI,CAAC,YAAY,EAAE,MAAM,CAAC;IAChC,IAAI,EAAE,IAAI,CAAC,YAAY,EAAE,MAAM,CAAC;IAChC,UAAU,EAAE,IAAI,CAAC,YAAY,EAAE,aAAa,CAAC;IAE7C,OAAO,CAAC,IAAY;QAClB,OAAO;YACL,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC;YACnB,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC;YACjC,SAAS,EAAE,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC;SACnC,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,GAAG,IAAc;QACtB,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBACrB,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACtC,CAAC;QACH,CAAC;IACH,CAAC;CACO,CAAC"}
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../../../src/config/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAEhD,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,UAAU,CAAC,CAAC;AAE7E,MAAM,CAAC,MAAM,KAAK,GAAG;IACnB,IAAI,EAAE,YAAY;IAClB,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,aAAa,CAAC;IACzC,KAAK,EAAE,IAAI,CAAC,YAAY,EAAE,OAAO,CAAC;IAClC,UAAU,EAAE,IAAI,CAAC,YAAY,EAAE,YAAY,CAAC;IAC5C,IAAI,EAAE,IAAI,CAAC,YAAY,EAAE,MAAM,CAAC;IAChC,IAAI,EAAE,IAAI,CAAC,YAAY,EAAE,MAAM,CAAC;IAChC,UAAU,EAAE,IAAI,CAAC,YAAY,EAAE,aAAa,CAAC;IAC7C,WAAW,EAAE,IAAI,CAAC,YAAY,EAAE,mBAAmB,CAAC;IAEpD,OAAO,CAAC,IAAY;QAClB,OAAO;YACL,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC;YACnB,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC;YACjC,SAAS,EAAE,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC;SACnC,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,GAAG,IAAc;QACtB,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBACrB,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACtC,CAAC;QACH,CAAC;IACH,CAAC;CACO,CAAC"}
@@ -0,0 +1,56 @@
1
+ export interface SkillDefaults {
2
+ /** Parameter name → default value */
3
+ params: Record<string, string | boolean | number>;
4
+ /** Last updated timestamp (ISO 8601) */
5
+ updated?: string;
6
+ }
7
+ export interface SkillConfigFile {
8
+ version: string;
9
+ /** key = skill name (e.g. "maestro-execute") */
10
+ skills: Record<string, SkillDefaults>;
11
+ }
12
+ /**
13
+ * Load skill config with workspace overrides.
14
+ *
15
+ * Priority: {workDir}/.maestro/skill-config.json > ~/.maestro/skill-config.json
16
+ *
17
+ * Merge: per-skill params are deep-merged (workspace overrides same-name params).
18
+ */
19
+ export declare function loadSkillConfig(workDir?: string): SkillConfigFile;
20
+ /**
21
+ * Synchronous loader for hook context (hooks must be synchronous).
22
+ * Same merge logic as loadSkillConfig.
23
+ */
24
+ export declare function loadSkillConfigSync(workDir?: string): SkillConfigFile;
25
+ /**
26
+ * Save skill config to the specified scope.
27
+ * Reads existing config, deep-merges the update, and writes back.
28
+ */
29
+ export declare function saveSkillConfig(update: Partial<SkillConfigFile>, scope: 'global' | 'workspace', workDir?: string): void;
30
+ /**
31
+ * Set a single parameter default for a skill.
32
+ */
33
+ export declare function setSkillParam(skill: string, param: string, value: string | boolean | number, scope: 'global' | 'workspace', workDir?: string): void;
34
+ /**
35
+ * Remove a single parameter default for a skill.
36
+ */
37
+ export declare function unsetSkillParam(skill: string, param: string, scope: 'global' | 'workspace', workDir?: string): void;
38
+ /**
39
+ * Reset all defaults for a skill (or all skills).
40
+ */
41
+ export declare function resetSkillConfig(skill: string | undefined, scope: 'global' | 'workspace', workDir?: string): void;
42
+ /**
43
+ * Get defaults for a specific skill from the merged config.
44
+ * Returns null if no defaults configured.
45
+ */
46
+ export declare function getSkillDefaults(skill: string, workDir?: string): SkillDefaults | null;
47
+ /**
48
+ * Load global and workspace configs separately (un-merged) for introspection.
49
+ */
50
+ export declare function loadSkillConfigSources(workDir?: string): {
51
+ globalPath: string;
52
+ global: SkillConfigFile | null;
53
+ workspacePath: string | null;
54
+ workspace: SkillConfigFile | null;
55
+ };
56
+ //# sourceMappingURL=skill-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-config.d.ts","sourceRoot":"","sources":["../../../src/config/skill-config.ts"],"names":[],"mappings":"AAkBA,MAAM,WAAW,aAAa;IAC5B,qCAAqC;IACrC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC,CAAC;IAClD,wCAAwC;IACxC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,gDAAgD;IAChD,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;CACvC;AAwBD;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,eAAe,CA4BjE;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,eAAe,CAErE;AAMD;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,MAAM,EAAE,OAAO,CAAC,eAAe,CAAC,EAChC,KAAK,EAAE,QAAQ,GAAG,WAAW,EAC7B,OAAO,CAAC,EAAE,MAAM,GACf,IAAI,CAmCN;AAMD;;GAEG;AACH,wBAAgB,aAAa,CAC3B,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,EAChC,KAAK,EAAE,QAAQ,GAAG,WAAW,EAC7B,OAAO,CAAC,EAAE,MAAM,GACf,IAAI,CASN;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,QAAQ,GAAG,WAAW,EAC7B,OAAO,CAAC,EAAE,MAAM,GACf,IAAI,CAkBN;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,KAAK,EAAE,QAAQ,GAAG,WAAW,EAC7B,OAAO,CAAC,EAAE,MAAM,GACf,IAAI,CAeN;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,MAAM,GACf,aAAa,GAAG,IAAI,CAGtB;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG;IACxD,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,eAAe,GAAG,IAAI,CAAC;IAC/B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,SAAS,EAAE,eAAe,GAAG,IAAI,CAAC;CACnC,CAYA"}
@@ -0,0 +1,188 @@
1
+ // ---------------------------------------------------------------------------
2
+ // Skill config — per-skill parameter defaults with dual-scope (global/project)
3
+ //
4
+ // Follows the same pattern as cli-tools-config.ts:
5
+ // Global: ~/.maestro/skill-config.json
6
+ // Workspace: {project}/.maestro/skill-config.json
7
+ // Merge: workspace overrides global (per-skill, params deep-merged)
8
+ // ---------------------------------------------------------------------------
9
+ import { readFileSync, writeFileSync, existsSync, mkdirSync } from 'node:fs';
10
+ import { join, dirname } from 'node:path';
11
+ import { paths } from './paths.js';
12
+ // ---------------------------------------------------------------------------
13
+ // Defaults
14
+ // ---------------------------------------------------------------------------
15
+ const DEFAULT_CONFIG = {
16
+ version: '1.0.0',
17
+ skills: {},
18
+ };
19
+ // ---------------------------------------------------------------------------
20
+ // Loader
21
+ // ---------------------------------------------------------------------------
22
+ function readConfigFile(filePath) {
23
+ if (!existsSync(filePath))
24
+ return null;
25
+ try {
26
+ return JSON.parse(readFileSync(filePath, 'utf8'));
27
+ }
28
+ catch {
29
+ return null;
30
+ }
31
+ }
32
+ /**
33
+ * Load skill config with workspace overrides.
34
+ *
35
+ * Priority: {workDir}/.maestro/skill-config.json > ~/.maestro/skill-config.json
36
+ *
37
+ * Merge: per-skill params are deep-merged (workspace overrides same-name params).
38
+ */
39
+ export function loadSkillConfig(workDir) {
40
+ const global = readConfigFile(paths.skillConfig) ?? { ...DEFAULT_CONFIG };
41
+ if (!workDir)
42
+ return global;
43
+ const workspacePath = join(workDir, '.maestro', 'skill-config.json');
44
+ const workspace = readConfigFile(workspacePath);
45
+ if (!workspace)
46
+ return global;
47
+ // Deep merge: per-skill, params-level merge
48
+ const merged = {
49
+ version: workspace.version ?? global.version,
50
+ skills: { ...global.skills },
51
+ };
52
+ for (const [skill, defaults] of Object.entries(workspace.skills)) {
53
+ const existing = merged.skills[skill];
54
+ if (existing) {
55
+ merged.skills[skill] = {
56
+ params: { ...existing.params, ...defaults.params },
57
+ updated: defaults.updated ?? existing.updated,
58
+ };
59
+ }
60
+ else {
61
+ merged.skills[skill] = defaults;
62
+ }
63
+ }
64
+ return merged;
65
+ }
66
+ /**
67
+ * Synchronous loader for hook context (hooks must be synchronous).
68
+ * Same merge logic as loadSkillConfig.
69
+ */
70
+ export function loadSkillConfigSync(workDir) {
71
+ return loadSkillConfig(workDir);
72
+ }
73
+ // ---------------------------------------------------------------------------
74
+ // Persistence
75
+ // ---------------------------------------------------------------------------
76
+ /**
77
+ * Save skill config to the specified scope.
78
+ * Reads existing config, deep-merges the update, and writes back.
79
+ */
80
+ export function saveSkillConfig(update, scope, workDir) {
81
+ const configPath = scope === 'global'
82
+ ? paths.skillConfig
83
+ : join(workDir ?? process.cwd(), '.maestro', 'skill-config.json');
84
+ // Read existing
85
+ const existing = readConfigFile(configPath) ?? { ...DEFAULT_CONFIG };
86
+ // Merge skills
87
+ const mergedSkills = { ...existing.skills };
88
+ if (update.skills) {
89
+ for (const [skill, defaults] of Object.entries(update.skills)) {
90
+ const prev = mergedSkills[skill];
91
+ if (prev) {
92
+ mergedSkills[skill] = {
93
+ params: { ...prev.params, ...defaults.params },
94
+ updated: defaults.updated ?? new Date().toISOString(),
95
+ };
96
+ }
97
+ else {
98
+ mergedSkills[skill] = {
99
+ ...defaults,
100
+ updated: defaults.updated ?? new Date().toISOString(),
101
+ };
102
+ }
103
+ }
104
+ }
105
+ const merged = {
106
+ version: update.version ?? existing.version ?? '1.0.0',
107
+ skills: mergedSkills,
108
+ };
109
+ // Ensure directory and write
110
+ mkdirSync(dirname(configPath), { recursive: true });
111
+ writeFileSync(configPath, JSON.stringify(merged, null, 2) + '\n');
112
+ }
113
+ // ---------------------------------------------------------------------------
114
+ // Mutation helpers
115
+ // ---------------------------------------------------------------------------
116
+ /**
117
+ * Set a single parameter default for a skill.
118
+ */
119
+ export function setSkillParam(skill, param, value, scope, workDir) {
120
+ saveSkillConfig({
121
+ skills: {
122
+ [skill]: {
123
+ params: { [param]: value },
124
+ updated: new Date().toISOString(),
125
+ },
126
+ },
127
+ }, scope, workDir);
128
+ }
129
+ /**
130
+ * Remove a single parameter default for a skill.
131
+ */
132
+ export function unsetSkillParam(skill, param, scope, workDir) {
133
+ const configPath = scope === 'global'
134
+ ? paths.skillConfig
135
+ : join(workDir ?? process.cwd(), '.maestro', 'skill-config.json');
136
+ const config = readConfigFile(configPath);
137
+ if (!config?.skills[skill])
138
+ return;
139
+ delete config.skills[skill].params[param];
140
+ config.skills[skill].updated = new Date().toISOString();
141
+ // Clean up empty skill entries
142
+ if (Object.keys(config.skills[skill].params).length === 0) {
143
+ delete config.skills[skill];
144
+ }
145
+ mkdirSync(dirname(configPath), { recursive: true });
146
+ writeFileSync(configPath, JSON.stringify(config, null, 2) + '\n');
147
+ }
148
+ /**
149
+ * Reset all defaults for a skill (or all skills).
150
+ */
151
+ export function resetSkillConfig(skill, scope, workDir) {
152
+ const configPath = scope === 'global'
153
+ ? paths.skillConfig
154
+ : join(workDir ?? process.cwd(), '.maestro', 'skill-config.json');
155
+ const config = readConfigFile(configPath);
156
+ if (!config)
157
+ return;
158
+ if (skill) {
159
+ delete config.skills[skill];
160
+ }
161
+ else {
162
+ config.skills = {};
163
+ }
164
+ writeFileSync(configPath, JSON.stringify(config, null, 2) + '\n');
165
+ }
166
+ /**
167
+ * Get defaults for a specific skill from the merged config.
168
+ * Returns null if no defaults configured.
169
+ */
170
+ export function getSkillDefaults(skill, workDir) {
171
+ const config = loadSkillConfig(workDir);
172
+ return config.skills[skill] ?? null;
173
+ }
174
+ /**
175
+ * Load global and workspace configs separately (un-merged) for introspection.
176
+ */
177
+ export function loadSkillConfigSources(workDir) {
178
+ const gp = paths.skillConfig;
179
+ const g = readConfigFile(gp);
180
+ let wp = null;
181
+ let w = null;
182
+ if (workDir) {
183
+ wp = join(workDir, '.maestro', 'skill-config.json');
184
+ w = readConfigFile(wp);
185
+ }
186
+ return { globalPath: gp, global: g, workspacePath: wp, workspace: w };
187
+ }
188
+ //# sourceMappingURL=skill-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-config.js","sourceRoot":"","sources":["../../../src/config/skill-config.ts"],"names":[],"mappings":"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"}
@@ -33,8 +33,18 @@ export interface SkillContextInput {
33
33
  */
34
34
  export declare function parseSkillInvocation(prompt: string): SkillMatch | null;
35
35
  /**
36
- * Evaluate skill context and return workflow state + artifact tree.
37
- * Returns null if no skill invocation detected or no workflow exists.
36
+ * Parse any /command-name invocation from user prompt (generalized).
37
+ * Used for skill config parameter injection works with all commands,
38
+ * not just workflow-specific ones.
39
+ */
40
+ export declare function parseAnySkillInvocation(prompt: string): string | null;
41
+ /**
42
+ * Evaluate skill context and return workflow state + artifact tree + param defaults.
43
+ * Returns null if no skill invocation detected.
44
+ *
45
+ * Two independent concern layers:
46
+ * 1. Workflow context (state, artifacts, outcomes) — requires workflow state.json
47
+ * 2. Skill config param injection — works for ANY /command, no workflow required
38
48
  */
39
49
  export declare function evaluateSkillContext(data: SkillContextInput): HookOutput | null;
40
50
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"skill-context.d.ts","sourceRoot":"","sources":["../../../src/hooks/skill-context.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAWH,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;CACb;AAED,UAAU,UAAU;IAClB,kBAAkB,EAAE;QAClB,aAAa,EAAE,MAAM,CAAC;QACtB,iBAAiB,EAAE,MAAM,CAAC;KAC3B,CAAC;CACH;AA6CD,MAAM,WAAW,iBAAiB;IAChC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAuBD;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAStE;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,iBAAiB,GAAG,UAAU,GAAG,IAAI,CAsD/E"}
1
+ {"version":3,"file":"skill-context.d.ts","sourceRoot":"","sources":["../../../src/hooks/skill-context.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAYH,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;CACb;AAED,UAAU,UAAU;IAClB,kBAAkB,EAAE;QAClB,aAAa,EAAE,MAAM,CAAC;QACtB,iBAAiB,EAAE,MAAM,CAAC;KAC3B,CAAC;CACH;AA6CD,MAAM,WAAW,iBAAiB;IAChC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAuBD;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAStE;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAGrE;AAqFD;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,iBAAiB,GAAG,UAAU,GAAG,IAAI,CA4D/E"}