maestro-flow 0.3.16 → 0.3.18
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/.claude/agents/workflow-planner.md +24 -8
- package/.claude/commands/spec-add.md +13 -11
- package/.codex/skills/maestro-plan/SKILL.md +30 -2
- package/dashboard/dist-server/dashboard/src/server/routes/install-utils.js +2 -2
- package/dashboard/dist-server/dashboard/src/server/routes/install-utils.js.map +1 -1
- package/dashboard/dist-server/dashboard/src/server/routes/wiki.js +3 -1
- package/dashboard/dist-server/dashboard/src/server/routes/wiki.js.map +1 -1
- package/dashboard/dist-server/dashboard/src/server/wiki/stress.test.js +1 -0
- package/dashboard/dist-server/dashboard/src/server/wiki/stress.test.js.map +1 -1
- package/dashboard/dist-server/dashboard/src/server/wiki/virtual-wiki-adapters.js +2 -0
- package/dashboard/dist-server/dashboard/src/server/wiki/virtual-wiki-adapters.js.map +1 -1
- package/dashboard/dist-server/dashboard/src/server/wiki/wiki-indexer.d.ts +5 -0
- package/dashboard/dist-server/dashboard/src/server/wiki/wiki-indexer.js +106 -32
- package/dashboard/dist-server/dashboard/src/server/wiki/wiki-indexer.js.map +1 -1
- package/dashboard/dist-server/dashboard/src/server/wiki/wiki-types.d.ts +6 -0
- package/dashboard/dist-server/dashboard/src/server/wiki/writer.js +9 -1
- package/dashboard/dist-server/dashboard/src/server/wiki/writer.js.map +1 -1
- package/dashboard/dist-server/src/config/paths.d.ts +1 -0
- package/dashboard/dist-server/src/config/paths.js +1 -0
- package/dashboard/dist-server/src/config/paths.js.map +1 -1
- package/dist/src/commands/install-backend.d.ts.map +1 -1
- package/dist/src/commands/install-backend.js +9 -4
- package/dist/src/commands/install-backend.js.map +1 -1
- package/dist/src/commands/install-ui/ExecutionView.d.ts.map +1 -1
- package/dist/src/commands/install-ui/ExecutionView.js +4 -1
- package/dist/src/commands/install-ui/ExecutionView.js.map +1 -1
- package/dist/src/commands/install-ui/InstallExecution.d.ts.map +1 -1
- package/dist/src/commands/install-ui/InstallExecution.js +4 -1
- package/dist/src/commands/install-ui/InstallExecution.js.map +1 -1
- package/dist/src/commands/install.d.ts.map +1 -1
- package/dist/src/commands/install.js +13 -7
- package/dist/src/commands/install.js.map +1 -1
- package/dist/src/commands/spec.d.ts.map +1 -1
- package/dist/src/commands/spec.js +82 -17
- package/dist/src/commands/spec.js.map +1 -1
- package/dist/src/commands/update.d.ts.map +1 -1
- package/dist/src/commands/update.js +76 -45
- package/dist/src/commands/update.js.map +1 -1
- package/dist/src/commands/wiki.d.ts.map +1 -1
- package/dist/src/commands/wiki.js +5 -0
- package/dist/src/commands/wiki.js.map +1 -1
- package/dist/src/config/paths.d.ts +1 -0
- package/dist/src/config/paths.d.ts.map +1 -1
- package/dist/src/config/paths.js +1 -0
- package/dist/src/config/paths.js.map +1 -1
- package/dist/src/core/manifest.d.ts +8 -1
- package/dist/src/core/manifest.d.ts.map +1 -1
- package/dist/src/core/manifest.js +3 -1
- package/dist/src/core/manifest.js.map +1 -1
- package/dist/src/tools/spec-init.d.ts +5 -1
- package/dist/src/tools/spec-init.d.ts.map +1 -1
- package/dist/src/tools/spec-init.js +6 -2
- package/dist/src/tools/spec-init.js.map +1 -1
- package/dist/src/tools/spec-loader.d.ts +23 -6
- package/dist/src/tools/spec-loader.d.ts.map +1 -1
- package/dist/src/tools/spec-loader.js +122 -20
- package/dist/src/tools/spec-loader.js.map +1 -1
- package/package.json +1 -1
- package/workflows/plan.md +12 -0
- package/workflows/specs-add.md +44 -16
- package/workflows/specs-load.md +21 -11
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../../../src/core/manifest.ts"],"names":[],"mappings":"AAuBA,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,GAAG,KAAK,CAAC;CACtB;AAED,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,QAAQ,GAAG,SAAS,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,aAAa,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../../../src/core/manifest.ts"],"names":[],"mappings":"AAuBA,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,GAAG,KAAK,CAAC;CACtB;AAED,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,QAAQ,GAAG,SAAS,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,aAAa,EAAE,CAAC;IACzB,wEAAwE;IACxE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,wEAAwE;IACxE,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC;CACjC;AAsBD,wBAAgB,cAAc,CAC5B,KAAK,EAAE,QAAQ,GAAG,SAAS,EAC3B,UAAU,EAAE,MAAM,EAClB,IAAI,CAAC,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,GAC7D,QAAQ,CAYV;AAED,wBAAgB,OAAO,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAElE;AAED,wBAAgB,MAAM,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAEhE;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,CAOvD;AAeD,wBAAgB,YAAY,CAAC,KAAK,EAAE,QAAQ,GAAG,SAAS,EAAE,UAAU,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI,CAa7F;AAED,wBAAgB,eAAe,IAAI,QAAQ,EAAE,CAgB5C;AAED,wBAAgB,cAAc,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAGvD;AA+DD,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,QAAQ,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CA+C3F"}
|
|
@@ -21,7 +21,7 @@ function manifestFile(id) {
|
|
|
21
21
|
// ---------------------------------------------------------------------------
|
|
22
22
|
// CRUD
|
|
23
23
|
// ---------------------------------------------------------------------------
|
|
24
|
-
export function createManifest(scope, targetPath) {
|
|
24
|
+
export function createManifest(scope, targetPath, opts) {
|
|
25
25
|
const ts = new Date().toISOString().replace(/[-:]/g, '').replace('T', '-').split('.')[0];
|
|
26
26
|
return {
|
|
27
27
|
id: `${scope}-${ts}`,
|
|
@@ -30,6 +30,8 @@ export function createManifest(scope, targetPath) {
|
|
|
30
30
|
targetPath,
|
|
31
31
|
installedAt: new Date().toISOString(),
|
|
32
32
|
entries: [],
|
|
33
|
+
hookLevel: opts?.hookLevel,
|
|
34
|
+
selectedComponentIds: opts?.selectedComponentIds,
|
|
33
35
|
};
|
|
34
36
|
}
|
|
35
37
|
export function addFile(manifest, filePath) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../../src/core/manifest.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,wBAAwB;AACxB,4DAA4D;AAC5D,qDAAqD;AACrD,8EAA8E;AAE9E,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EACL,UAAU,EACV,SAAS,EACT,WAAW,EACX,YAAY,EACZ,aAAa,EACb,UAAU,EACV,MAAM,GAEP,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../../src/core/manifest.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
* Initialize .workflow/specs/ directory with frontmatter-enabled seed documents.
|
|
5
5
|
* Idempotent: skips existing files, only creates missing ones.
|
|
6
6
|
*/
|
|
7
|
+
import { type SpecScope } from './spec-loader.js';
|
|
7
8
|
export interface InitResult {
|
|
8
9
|
created: string[];
|
|
9
10
|
skipped: string[];
|
|
@@ -12,6 +13,9 @@ export interface InitResult {
|
|
|
12
13
|
/**
|
|
13
14
|
* Initialize the spec system directory structure and seed documents.
|
|
14
15
|
* Idempotent: creates directories if missing, writes seed files only when absent.
|
|
16
|
+
*
|
|
17
|
+
* @param scope Target scope: 'project' (default), 'global', 'team', or 'personal'.
|
|
18
|
+
* @param uid Required when scope is 'personal'.
|
|
15
19
|
*/
|
|
16
|
-
export declare function initSpecSystem(projectPath: string): InitResult;
|
|
20
|
+
export declare function initSpecSystem(projectPath: string, scope?: SpecScope, uid?: string): InitResult;
|
|
17
21
|
//# sourceMappingURL=spec-init.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"spec-init.d.ts","sourceRoot":"","sources":["../../../src/tools/spec-init.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;
|
|
1
|
+
{"version":3,"file":"spec-init.d.ts","sourceRoot":"","sources":["../../../src/tools/spec-init.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EAAE,KAAK,SAAS,EAAkB,MAAM,kBAAkB,CAAC;AAMlE,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AA8KD;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,GAAE,SAAqB,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,UAAU,CA0B1G"}
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
*/
|
|
7
7
|
import { existsSync, mkdirSync, writeFileSync } from 'node:fs';
|
|
8
8
|
import { join } from 'node:path';
|
|
9
|
+
import { resolveSpecDir } from './spec-loader.js';
|
|
9
10
|
// ============================================================================
|
|
10
11
|
// Seed Documents
|
|
11
12
|
// ============================================================================
|
|
@@ -164,10 +165,13 @@ function formatFrontmatter(fm) {
|
|
|
164
165
|
/**
|
|
165
166
|
* Initialize the spec system directory structure and seed documents.
|
|
166
167
|
* Idempotent: creates directories if missing, writes seed files only when absent.
|
|
168
|
+
*
|
|
169
|
+
* @param scope Target scope: 'project' (default), 'global', 'team', or 'personal'.
|
|
170
|
+
* @param uid Required when scope is 'personal'.
|
|
167
171
|
*/
|
|
168
|
-
export function initSpecSystem(projectPath) {
|
|
172
|
+
export function initSpecSystem(projectPath, scope = 'project', uid) {
|
|
169
173
|
const result = { created: [], skipped: [], directories: [] };
|
|
170
|
-
const specsDir =
|
|
174
|
+
const specsDir = resolveSpecDir(projectPath, scope, uid);
|
|
171
175
|
// Create directory
|
|
172
176
|
if (!existsSync(specsDir)) {
|
|
173
177
|
mkdirSync(specsDir, { recursive: true });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"spec-init.js","sourceRoot":"","sources":["../../../src/tools/spec-init.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC/D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"spec-init.js","sourceRoot":"","sources":["../../../src/tools/spec-init.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC/D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAkB,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAwBlE,+EAA+E;AAC/E,iBAAiB;AACjB,+EAA+E;AAE/E,MAAM,SAAS,GAAc;IAC3B;QACE,QAAQ,EAAE,uBAAuB;QACjC,WAAW,EAAE;YACX,KAAK,EAAE,oBAAoB;YAC3B,QAAQ,EAAE,UAAU;YACpB,QAAQ,EAAE,MAAM;YAChB,QAAQ,EAAE,QAAQ;YAClB,QAAQ,EAAE,CAAC,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,YAAY,EAAE,YAAY,CAAC;SAC/E;QACD,IAAI,EAAE;;;;;;;;;;;;CAYT;KACE;IACD;QACE,QAAQ,EAAE,6BAA6B;QACvC,WAAW,EAAE;YACX,KAAK,EAAE,0BAA0B;YACjC,QAAQ,EAAE,UAAU;YACpB,QAAQ,EAAE,MAAM;YAChB,QAAQ,EAAE,MAAM;YAChB,QAAQ,EAAE,CAAC,cAAc,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,CAAC;SACrF;QACD,IAAI,EAAE;;;;;;;;;;;;CAYT;KACE;IACD;QACE,QAAQ,EAAE,cAAc;QACxB,WAAW,EAAE;YACX,KAAK,EAAE,WAAW;YAClB,QAAQ,EAAE,UAAU;YACpB,QAAQ,EAAE,QAAQ;YAClB,QAAQ,EAAE,UAAU;YACpB,QAAQ,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,CAAC;SAClD;QACD,IAAI,EAAE;;;;;;CAMT;KACE;IACD;QACE,QAAQ,EAAE,kBAAkB;QAC5B,WAAW,EAAE;YACX,KAAK,EAAE,eAAe;YACtB,QAAQ,EAAE,UAAU;YACpB,QAAQ,EAAE,QAAQ;YAClB,QAAQ,EAAE,SAAS;YACnB,QAAQ,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,CAAC;SACrD;QACD,IAAI,EAAE;;;;CAIT;KACE;IACD;QACE,QAAQ,EAAE,gBAAgB;QAC1B,WAAW,EAAE;YACX,KAAK,EAAE,aAAa;YACpB,QAAQ,EAAE,UAAU;YACpB,QAAQ,EAAE,QAAQ;YAClB,QAAQ,EAAE,OAAO;YACjB,QAAQ,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,QAAQ,CAAC;SACnE;QACD,IAAI,EAAE;;;;CAIT;KACE;IACD;QACE,QAAQ,EAAE,qBAAqB;QAC/B,WAAW,EAAE;YACX,KAAK,EAAE,kBAAkB;YACzB,QAAQ,EAAE,UAAU;YACpB,QAAQ,EAAE,MAAM;YAChB,QAAQ,EAAE,MAAM;YAChB,QAAQ,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,WAAW,CAAC;SAC5E;QACD,IAAI,EAAE;;;;;;;;;;;;CAYT;KACE;IACD;QACE,QAAQ,EAAE,qBAAqB;QAC/B,WAAW,EAAE;YACX,KAAK,EAAE,kBAAkB;YACzB,QAAQ,EAAE,UAAU;YACpB,QAAQ,EAAE,QAAQ;YAClB,QAAQ,EAAE,QAAQ;YAClB,QAAQ,EAAE,CAAC,QAAQ,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,CAAC;SAClE;QACD,IAAI,EAAE;;;;CAIT;KACE;CACF,CAAC;AAEF,+EAA+E;AAC/E,UAAU;AACV,+EAA+E;AAE/E,SAAS,iBAAiB,CAAC,EAA0B;IACnD,MAAM,YAAY,GAAG,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjE,OAAO;QACL,KAAK;QACL,WAAW,EAAE,CAAC,KAAK,GAAG;QACtB,aAAa,EAAE,CAAC,QAAQ,EAAE;QAC1B,aAAa,EAAE,CAAC,QAAQ,EAAE;QAC1B,aAAa,EAAE,CAAC,QAAQ,EAAE;QAC1B,WAAW;QACX,YAAY;QACZ,KAAK;KACN,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,+EAA+E;AAC/E,aAAa;AACb,+EAA+E;AAE/E;;;;;;GAMG;AACH,MAAM,UAAU,cAAc,CAAC,WAAmB,EAAE,QAAmB,SAAS,EAAE,GAAY;IAC5F,MAAM,MAAM,GAAe,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC;IAEzE,MAAM,QAAQ,GAAG,cAAc,CAAC,WAAW,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;IAEzD,mBAAmB;IACnB,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1B,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACzC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACpC,CAAC;IAED,uBAAuB;IACvB,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;QAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC;QAE9C,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YACzB,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC9B,SAAS;QACX,CAAC;QAED,MAAM,OAAO,GAAG,iBAAiB,CAAC,GAAG,CAAC,WAAW,CAAC,GAAG,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC;QACvE,aAAa,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QAC1C,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAChC,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
* returns concatenated content.
|
|
7
7
|
*/
|
|
8
8
|
export type SpecCategory = 'coding' | 'arch' | 'quality' | 'debug' | 'test' | 'review' | 'learning';
|
|
9
|
+
export type SpecScope = 'project' | 'global' | 'team' | 'personal';
|
|
9
10
|
export interface SpecLoadResult {
|
|
10
11
|
content: string;
|
|
11
12
|
matchedSpecs: string[];
|
|
@@ -13,19 +14,35 @@ export interface SpecLoadResult {
|
|
|
13
14
|
}
|
|
14
15
|
export declare const CATEGORY_MAP: Record<string, SpecCategory>;
|
|
15
16
|
export declare const TEAM_SPECS_DIR = ".workflow/collab/specs";
|
|
17
|
+
/**
|
|
18
|
+
* Resolve the directory for a given spec scope.
|
|
19
|
+
*
|
|
20
|
+
* | scope | directory |
|
|
21
|
+
* |------------|-------------------------------------|
|
|
22
|
+
* | project | .workflow/specs/ |
|
|
23
|
+
* | global | ~/.maestro/specs/ |
|
|
24
|
+
* | team | .workflow/collab/specs/ |
|
|
25
|
+
* | personal | .workflow/collab/specs/{uid}/ |
|
|
26
|
+
*/
|
|
27
|
+
export declare function resolveSpecDir(projectPath: string, scope: SpecScope, uid?: string): string;
|
|
16
28
|
/**
|
|
17
29
|
* Load spec files from one or more directories.
|
|
18
30
|
*
|
|
19
|
-
*
|
|
31
|
+
* Layer scanning order (lowest → highest priority):
|
|
32
|
+
* 0. ~/.maestro/specs/ (global — when `scope` includes global)
|
|
20
33
|
* 1. .workflow/specs/ (baseline)
|
|
21
|
-
* 2. .workflow/collab/specs/ (team shared)
|
|
22
|
-
* 3. .workflow/collab/specs/{uid}/ (personal)
|
|
34
|
+
* 2. .workflow/collab/specs/ (team shared — when `uid` is provided)
|
|
35
|
+
* 3. .workflow/collab/specs/{uid}/ (personal — when `uid` is provided)
|
|
23
36
|
*
|
|
24
37
|
* Content from later layers is appended (never replaces earlier content).
|
|
25
38
|
* Each layer's content is prefixed with a header for clarity.
|
|
26
39
|
*
|
|
27
|
-
*
|
|
28
|
-
*
|
|
40
|
+
* @param scope Controls which extra layers to include beyond baseline.
|
|
41
|
+
* - 'project': baseline only (default)
|
|
42
|
+
* - 'global': global + baseline
|
|
43
|
+
* - 'team': baseline + team shared
|
|
44
|
+
* - 'personal': baseline + team shared + personal (requires uid)
|
|
45
|
+
* - undefined: same as 'project'; uid alone still triggers team+personal for backward compat
|
|
29
46
|
*/
|
|
30
|
-
export declare function loadSpecs(projectPath: string, category?: SpecCategory, uid?: string, keyword?: string): SpecLoadResult;
|
|
47
|
+
export declare function loadSpecs(projectPath: string, category?: SpecCategory, uid?: string, keyword?: string, scope?: SpecScope): SpecLoadResult;
|
|
31
48
|
//# sourceMappingURL=spec-loader.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"spec-loader.d.ts","sourceRoot":"","sources":["../../../src/tools/spec-loader.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;
|
|
1
|
+
{"version":3,"file":"spec-loader.d.ts","sourceRoot":"","sources":["../../../src/tools/spec-loader.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAWH,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,MAAM,GAAG,SAAS,GAAG,OAAO,GAAG,MAAM,GAAG,QAAQ,GAAG,UAAU,CAAC;AAEpG,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,CAAC;AAEnE,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;CACrB;AAMD,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAQrD,CAAC;AAGF,eAAO,MAAM,cAAc,2BAA2B,CAAC;AAcvD;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAW1F;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,SAAS,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,YAAY,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,SAAS,GAAG,cAAc,CAsCzI"}
|
|
@@ -5,9 +5,10 @@
|
|
|
5
5
|
* Reads .workflow/specs/*.md, filters by category via static mapping,
|
|
6
6
|
* returns concatenated content.
|
|
7
7
|
*/
|
|
8
|
-
import { readFileSync, existsSync, readdirSync } from 'node:fs';
|
|
8
|
+
import { readFileSync, existsSync, readdirSync, mkdirSync, writeFileSync } from 'node:fs';
|
|
9
9
|
import { join } from 'node:path';
|
|
10
10
|
import { parseSpecEntries, formatSpecEntries } from './spec-entry-parser.js';
|
|
11
|
+
import { paths } from '../config/paths.js';
|
|
11
12
|
// ============================================================================
|
|
12
13
|
// Filename → Category mapping (single source of truth)
|
|
13
14
|
// ============================================================================
|
|
@@ -24,6 +25,7 @@ const SPECS_DIR = '.workflow/specs';
|
|
|
24
25
|
export const TEAM_SPECS_DIR = '.workflow/collab/specs';
|
|
25
26
|
/** Layer labels used as section headers when multi-directory scanning is active. */
|
|
26
27
|
const LAYER_LABELS = {
|
|
28
|
+
global: '# Global Specs',
|
|
27
29
|
baseline: '# Baseline Specs',
|
|
28
30
|
team: '# Team Specs',
|
|
29
31
|
// personal label is dynamic — includes uid
|
|
@@ -31,32 +33,67 @@ const LAYER_LABELS = {
|
|
|
31
33
|
// ============================================================================
|
|
32
34
|
// Public API
|
|
33
35
|
// ============================================================================
|
|
36
|
+
/**
|
|
37
|
+
* Resolve the directory for a given spec scope.
|
|
38
|
+
*
|
|
39
|
+
* | scope | directory |
|
|
40
|
+
* |------------|-------------------------------------|
|
|
41
|
+
* | project | .workflow/specs/ |
|
|
42
|
+
* | global | ~/.maestro/specs/ |
|
|
43
|
+
* | team | .workflow/collab/specs/ |
|
|
44
|
+
* | personal | .workflow/collab/specs/{uid}/ |
|
|
45
|
+
*/
|
|
46
|
+
export function resolveSpecDir(projectPath, scope, uid) {
|
|
47
|
+
switch (scope) {
|
|
48
|
+
case 'global': return paths.specs;
|
|
49
|
+
case 'team': return join(projectPath, TEAM_SPECS_DIR);
|
|
50
|
+
case 'personal': {
|
|
51
|
+
if (!uid)
|
|
52
|
+
throw new Error('personal scope requires uid');
|
|
53
|
+
return join(projectPath, TEAM_SPECS_DIR, uid);
|
|
54
|
+
}
|
|
55
|
+
case 'project':
|
|
56
|
+
default: return join(projectPath, SPECS_DIR);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
34
59
|
/**
|
|
35
60
|
* Load spec files from one or more directories.
|
|
36
61
|
*
|
|
37
|
-
*
|
|
62
|
+
* Layer scanning order (lowest → highest priority):
|
|
63
|
+
* 0. ~/.maestro/specs/ (global — when `scope` includes global)
|
|
38
64
|
* 1. .workflow/specs/ (baseline)
|
|
39
|
-
* 2. .workflow/collab/specs/ (team shared)
|
|
40
|
-
* 3. .workflow/collab/specs/{uid}/ (personal)
|
|
65
|
+
* 2. .workflow/collab/specs/ (team shared — when `uid` is provided)
|
|
66
|
+
* 3. .workflow/collab/specs/{uid}/ (personal — when `uid` is provided)
|
|
41
67
|
*
|
|
42
68
|
* Content from later layers is appended (never replaces earlier content).
|
|
43
69
|
* Each layer's content is prefixed with a header for clarity.
|
|
44
70
|
*
|
|
45
|
-
*
|
|
46
|
-
*
|
|
71
|
+
* @param scope Controls which extra layers to include beyond baseline.
|
|
72
|
+
* - 'project': baseline only (default)
|
|
73
|
+
* - 'global': global + baseline
|
|
74
|
+
* - 'team': baseline + team shared
|
|
75
|
+
* - 'personal': baseline + team shared + personal (requires uid)
|
|
76
|
+
* - undefined: same as 'project'; uid alone still triggers team+personal for backward compat
|
|
47
77
|
*/
|
|
48
|
-
export function loadSpecs(projectPath, category, uid, keyword) {
|
|
78
|
+
export function loadSpecs(projectPath, category, uid, keyword, scope) {
|
|
49
79
|
// Build ordered list of (directory, label) pairs to scan
|
|
50
|
-
const layers = buildLayers(projectPath, uid);
|
|
80
|
+
const layers = buildLayers(projectPath, uid, scope);
|
|
81
|
+
// Auto-init only baseline and global layers.
|
|
82
|
+
// Team/personal are per-user — auto-creating them for arbitrary uids is wrong.
|
|
83
|
+
autoInitSeeds(join(projectPath, SPECS_DIR));
|
|
84
|
+
if (scope === 'global') {
|
|
85
|
+
autoInitSeeds(paths.specs);
|
|
86
|
+
}
|
|
51
87
|
const allSections = [];
|
|
52
88
|
const allMatched = [];
|
|
53
89
|
let totalCount = 0;
|
|
90
|
+
const multiLayer = layers.length > 1;
|
|
54
91
|
for (const { dir, label } of layers) {
|
|
55
92
|
const { sections, matched } = loadFromDir(dir, category, keyword);
|
|
56
93
|
if (sections.length === 0)
|
|
57
94
|
continue;
|
|
58
|
-
//
|
|
59
|
-
if (
|
|
95
|
+
// Add layer headers when multi-layer mode is active (global or uid)
|
|
96
|
+
if (multiLayer) {
|
|
60
97
|
allSections.push(`${label}\n\n${sections.join('\n\n---\n\n')}`);
|
|
61
98
|
}
|
|
62
99
|
else {
|
|
@@ -73,18 +110,26 @@ export function loadSpecs(projectPath, category, uid, keyword) {
|
|
|
73
110
|
totalLoaded: totalCount,
|
|
74
111
|
};
|
|
75
112
|
}
|
|
76
|
-
function buildLayers(projectPath, uid) {
|
|
77
|
-
const
|
|
113
|
+
function buildLayers(projectPath, uid, scope) {
|
|
114
|
+
const layers = [];
|
|
115
|
+
// Global layer — lowest priority
|
|
116
|
+
if (scope === 'global') {
|
|
117
|
+
layers.push({ dir: paths.specs, label: LAYER_LABELS.global });
|
|
118
|
+
}
|
|
119
|
+
// Baseline — always included
|
|
120
|
+
layers.push({
|
|
78
121
|
dir: join(projectPath, SPECS_DIR),
|
|
79
122
|
label: LAYER_LABELS.baseline,
|
|
80
|
-
};
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
123
|
+
});
|
|
124
|
+
// Team + personal layers
|
|
125
|
+
// Activated by scope='team'|'personal', or by uid (backward compat)
|
|
126
|
+
if (scope === 'team' || scope === 'personal' || uid) {
|
|
127
|
+
layers.push({ dir: join(projectPath, TEAM_SPECS_DIR), label: LAYER_LABELS.team });
|
|
128
|
+
if (uid) {
|
|
129
|
+
layers.push({ dir: join(projectPath, TEAM_SPECS_DIR, uid), label: `# Personal Specs (${uid})` });
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
return layers;
|
|
88
133
|
}
|
|
89
134
|
/**
|
|
90
135
|
* Load spec files from a single directory. Returns empty arrays if the
|
|
@@ -174,4 +219,61 @@ function stripFrontmatter(raw) {
|
|
|
174
219
|
return raw;
|
|
175
220
|
return trimmed.substring(endIdx + 4).trim();
|
|
176
221
|
}
|
|
222
|
+
// ============================================================================
|
|
223
|
+
// Auto-init seed files
|
|
224
|
+
// ============================================================================
|
|
225
|
+
/** Directories already checked this process — skip re-checking. */
|
|
226
|
+
const autoInitChecked = new Set();
|
|
227
|
+
/** Minimal seed files (filename + header). */
|
|
228
|
+
const AUTO_INIT_SEEDS = [
|
|
229
|
+
['coding-conventions.md', '# Coding Conventions\n\n## Entries\n\n'],
|
|
230
|
+
['architecture-constraints.md', '# Architecture Constraints\n\n## Entries\n\n'],
|
|
231
|
+
['learnings.md', '# Learnings\n\n## Entries\n\n'],
|
|
232
|
+
['quality-rules.md', '# Quality Rules\n\n## Entries\n\n'],
|
|
233
|
+
['debug-notes.md', '# Debug Notes\n\n## Entries\n\n'],
|
|
234
|
+
['test-conventions.md', '# Test Conventions\n\n## Entries\n\n'],
|
|
235
|
+
['review-standards.md', '# Review Standards\n\n## Entries\n\n'],
|
|
236
|
+
];
|
|
237
|
+
/**
|
|
238
|
+
* Auto-create a specs directory with seed files if it does not exist.
|
|
239
|
+
* Applies to every layer (global, baseline, team, personal).
|
|
240
|
+
*
|
|
241
|
+
* For project-local dirs: only runs when `.workflow/` already exists
|
|
242
|
+
* (i.e. the project is maestro-managed).
|
|
243
|
+
* For global (`~/.maestro/specs/`): always creates — the home dir exists by definition.
|
|
244
|
+
*
|
|
245
|
+
* Synchronous, per-directory dedup, best-effort — never throws.
|
|
246
|
+
*/
|
|
247
|
+
function autoInitSeeds(specsDir) {
|
|
248
|
+
if (autoInitChecked.has(specsDir))
|
|
249
|
+
return;
|
|
250
|
+
autoInitChecked.add(specsDir);
|
|
251
|
+
if (existsSync(specsDir))
|
|
252
|
+
return;
|
|
253
|
+
// For project-local paths, only auto-init when .workflow/ already exists.
|
|
254
|
+
// Global path (under ~/.maestro/) always qualifies.
|
|
255
|
+
const isGlobal = specsDir === paths.specs;
|
|
256
|
+
if (!isGlobal) {
|
|
257
|
+
// Walk up to check if .workflow/ parent exists
|
|
258
|
+
// specsDir patterns: <project>/.workflow/specs, <project>/.workflow/collab/specs[/<uid>]
|
|
259
|
+
const workflowIdx = specsDir.replace(/\\/g, '/').indexOf('.workflow/');
|
|
260
|
+
if (workflowIdx !== -1) {
|
|
261
|
+
const workflowDir = specsDir.substring(0, workflowIdx + '.workflow'.length);
|
|
262
|
+
if (!existsSync(workflowDir))
|
|
263
|
+
return;
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
try {
|
|
267
|
+
mkdirSync(specsDir, { recursive: true });
|
|
268
|
+
for (const [filename, content] of AUTO_INIT_SEEDS) {
|
|
269
|
+
const filePath = join(specsDir, filename);
|
|
270
|
+
if (!existsSync(filePath)) {
|
|
271
|
+
writeFileSync(filePath, content, 'utf-8');
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
catch {
|
|
276
|
+
// Best-effort — don't block loading
|
|
277
|
+
}
|
|
278
|
+
}
|
|
177
279
|
//# sourceMappingURL=spec-loader.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"spec-loader.js","sourceRoot":"","sources":["../../../src/tools/spec-loader.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"spec-loader.js","sourceRoot":"","sources":["../../../src/tools/spec-loader.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/workflows/plan.md
CHANGED
|
@@ -147,6 +147,12 @@ default → Create Mode: P1 → P2 → P3 → P4 → P4.5 → P5
|
|
|
147
147
|
|
|
148
148
|
Spawn `workflow-planner` agent with: context.md, spec-ref, doc-index.json, explorationContext (incl. implementationScope), clarificationContext, phase goal + success_criteria, templates (plan.json, task.json).
|
|
149
149
|
|
|
150
|
+
**Task count guard**: Before spawning, assess scope complexity:
|
|
151
|
+
- Single feature / simple change → expect **1-2 tasks** max
|
|
152
|
+
- Medium feature (multiple files, one module) → expect **2-4 tasks** max
|
|
153
|
+
- Large feature (cross-module) → expect **4-8 tasks** max
|
|
154
|
+
- If planner outputs more tasks than these thresholds, re-prompt with explicit instruction to merge.
|
|
155
|
+
|
|
150
156
|
Agent responsibilities:
|
|
151
157
|
1. Decompose goal into tasks (when implementationScope exists: 1 scope item → 1 task)
|
|
152
158
|
2. Assign task IDs (TASK-001, TASK-002, ...), determine dependencies
|
|
@@ -157,6 +163,12 @@ Agent responsibilities:
|
|
|
157
163
|
|
|
158
164
|
Output: `plan.json` (summary, approach, task_ids[], task_count, complexity, waves[]) + `.task/TASK-{NNN}.json` per task.
|
|
159
165
|
|
|
166
|
+
**Anti-splitting rules** (pass to planner; re-prompt if violated):
|
|
167
|
+
- One feature = one task (even if 3-5 files); never split a feature into per-file tasks
|
|
168
|
+
- Group simple unrelated changes into a batch task to minimize agent spawns
|
|
169
|
+
- depends_on only for genuine output dependencies; most tasks should be parallel
|
|
170
|
+
- Each task must be substantial (15-60 min); sub-5-min changes must be merged
|
|
171
|
+
|
|
160
172
|
### Deep Work Rules (MANDATORY for all modes)
|
|
161
173
|
|
|
162
174
|
Every TASK-*.json MUST include these fields — they are NOT optional:
|
package/workflows/specs-add.md
CHANGED
|
@@ -5,45 +5,70 @@ Add a `<spec-entry>` closed-tag entry to a single target spec file by category.
|
|
|
5
5
|
## Arguments
|
|
6
6
|
|
|
7
7
|
```
|
|
8
|
-
$ARGUMENTS: "<category> <content>"
|
|
8
|
+
$ARGUMENTS: "[--scope <scope>] [--uid <uid>] <category> <content>"
|
|
9
9
|
|
|
10
|
+
--scope -- target scope: project (default) | global | team | personal
|
|
11
|
+
--uid -- user id for personal scope (auto-detected from git if omitted)
|
|
10
12
|
category -- one of: coding, arch, quality, debug, test, review, learning
|
|
11
13
|
content -- free-text description of the entry
|
|
12
14
|
```
|
|
13
15
|
|
|
14
|
-
##
|
|
16
|
+
## Scope-to-Directory Mapping
|
|
17
|
+
|
|
18
|
+
| Scope | Target directory | uid needed |
|
|
19
|
+
|-------|-----------------|------------|
|
|
20
|
+
| `project` (default) | `.workflow/specs/` | no |
|
|
21
|
+
| `global` | `~/.maestro/specs/` | no |
|
|
22
|
+
| `team` | `.workflow/collab/specs/` | no |
|
|
23
|
+
| `personal` | `.workflow/collab/specs/{uid}/` | yes (auto or `--uid`) |
|
|
24
|
+
|
|
25
|
+
## Category-to-File Mapping (1:1, same filename in every scope)
|
|
15
26
|
|
|
16
27
|
| Category | Target file |
|
|
17
28
|
|----------|------------|
|
|
18
|
-
| `coding` |
|
|
19
|
-
| `arch` |
|
|
20
|
-
| `quality` |
|
|
21
|
-
| `debug` |
|
|
22
|
-
| `test` |
|
|
23
|
-
| `review` |
|
|
24
|
-
| `learning` |
|
|
29
|
+
| `coding` | `coding-conventions.md` |
|
|
30
|
+
| `arch` | `architecture-constraints.md` |
|
|
31
|
+
| `quality` | `quality-rules.md` |
|
|
32
|
+
| `debug` | `debug-notes.md` |
|
|
33
|
+
| `test` | `test-conventions.md` |
|
|
34
|
+
| `review` | `review-standards.md` |
|
|
35
|
+
| `learning` | `learnings.md` |
|
|
25
36
|
|
|
26
37
|
## Prerequisites
|
|
27
38
|
|
|
28
|
-
-
|
|
39
|
+
- Target specs directory must exist:
|
|
40
|
+
- `project`: `.workflow/specs/` (run `/spec-setup` or `maestro spec init`)
|
|
41
|
+
- `global`: `~/.maestro/specs/` (run `maestro spec init --scope global`)
|
|
42
|
+
- `team`: `.workflow/collab/specs/` (run `maestro spec init --scope team`)
|
|
43
|
+
- `personal`: `.workflow/collab/specs/{uid}/` (run `maestro spec init --scope personal`)
|
|
29
44
|
|
|
30
45
|
## Execution Steps
|
|
31
46
|
|
|
32
47
|
### Step 1: Parse Arguments
|
|
33
48
|
|
|
34
49
|
```
|
|
35
|
-
Parse:
|
|
36
|
-
|
|
37
|
-
|
|
50
|
+
Parse $ARGUMENTS:
|
|
51
|
+
1. Extract --scope <value> (default: project)
|
|
52
|
+
2. Extract --uid <value> if present
|
|
53
|
+
3. category = first remaining word
|
|
54
|
+
4. content = remaining text
|
|
55
|
+
Validate:
|
|
56
|
+
- scope ∈ {project, global, team, personal}
|
|
57
|
+
- category ∈ {coding, arch, quality, debug, test, review, learning}
|
|
58
|
+
- content non-empty
|
|
59
|
+
- personal scope requires uid (resolve from `maestro collab whoami` if --uid not given)
|
|
60
|
+
On failure: show usage `/spec-add [--scope <scope>] <category> <content>`, exit
|
|
38
61
|
```
|
|
39
62
|
|
|
40
63
|
### Step 2: Resolve Target File
|
|
41
64
|
|
|
42
|
-
|
|
65
|
+
Resolve directory from scope (see table above), then append `<target_file>` from category mapping.
|
|
66
|
+
|
|
67
|
+
If file does not exist, create it with a basic header.
|
|
43
68
|
|
|
44
69
|
Check for near-duplicate entries:
|
|
45
70
|
```bash
|
|
46
|
-
grep -i "<content_first_10_words>"
|
|
71
|
+
grep -i "<content_first_10_words>" <resolved_dir>/<target_file> | tail -5
|
|
47
72
|
```
|
|
48
73
|
|
|
49
74
|
### Step 3: Extract Keywords
|
|
@@ -70,7 +95,10 @@ Read target file. Append the formatted `<spec-entry>` block at the end. Write fi
|
|
|
70
95
|
|
|
71
96
|
### Step 6: Confirm
|
|
72
97
|
|
|
73
|
-
Display: category, target file, keywords, and verify command
|
|
98
|
+
Display: category, scope, target file path, keywords, and verify command:
|
|
99
|
+
```
|
|
100
|
+
maestro spec load --scope <scope> --keyword <kw1>
|
|
101
|
+
```
|
|
74
102
|
|
|
75
103
|
## Output
|
|
76
104
|
|
package/workflows/specs-load.md
CHANGED
|
@@ -1,20 +1,22 @@
|
|
|
1
1
|
# Workflow: specs-load
|
|
2
2
|
|
|
3
|
-
Load spec files
|
|
3
|
+
Load spec files filtered by category. Supports project, global, team, and personal scopes.
|
|
4
4
|
|
|
5
5
|
## Arguments
|
|
6
6
|
|
|
7
7
|
```
|
|
8
|
-
$ARGUMENTS: "[--category <type>] [keyword]"
|
|
8
|
+
$ARGUMENTS: "[--scope <scope>] [--uid <uid>] [--category <type>] [keyword]"
|
|
9
9
|
|
|
10
|
+
--scope -- load scope: project (default) | global | team | personal
|
|
11
|
+
--uid -- user id for personal scope (auto-detected from git if omitted)
|
|
10
12
|
--category -- filter by category (1:1 mapping to file):
|
|
11
13
|
coding | arch | quality | debug | test | review | learning | all
|
|
12
14
|
keyword -- optional, grep within loaded specs for matching sections
|
|
13
15
|
```
|
|
14
16
|
|
|
15
|
-
## Category
|
|
17
|
+
## Category -> File Mapping (1:1)
|
|
16
18
|
|
|
17
|
-
Each category loads exactly one file. Same mapping as spec-add.
|
|
19
|
+
Each category loads exactly one file per layer. Same mapping as spec-add.
|
|
18
20
|
|
|
19
21
|
| Category | File loaded |
|
|
20
22
|
|----------|------------|
|
|
@@ -27,22 +29,30 @@ Each category loads exactly one file. Same mapping as spec-add.
|
|
|
27
29
|
| `learning` | `learnings.md` |
|
|
28
30
|
| `all` (default) | All `.md` files in specs/ |
|
|
29
31
|
|
|
32
|
+
## Layer Order by Scope
|
|
33
|
+
|
|
34
|
+
| Scope | Layers loaded (lowest -> highest priority) |
|
|
35
|
+
|-------|-------------------------------------------|
|
|
36
|
+
| `project` | baseline only |
|
|
37
|
+
| `global` | global + baseline |
|
|
38
|
+
| `team` | baseline + team shared |
|
|
39
|
+
| `personal` | baseline + team shared + personal (requires uid) |
|
|
40
|
+
|
|
41
|
+
Each layer is prefixed with a section header when multi-layer.
|
|
42
|
+
|
|
30
43
|
## Execution Steps
|
|
31
44
|
|
|
32
45
|
### Step 1: Parse Arguments
|
|
33
46
|
|
|
34
|
-
Extract `--category <type>`
|
|
47
|
+
Extract `--scope`, `--uid`, `--category <type>` and remaining text (keyword for grep).
|
|
35
48
|
|
|
36
49
|
### Step 2: Load Specs via CLI
|
|
37
50
|
|
|
38
51
|
```bash
|
|
39
|
-
maestro spec load --category <category>
|
|
52
|
+
maestro spec load --scope <scope> [--uid <uid>] [--category <category>] [--keyword <word>]
|
|
40
53
|
```
|
|
41
54
|
|
|
42
|
-
If `maestro spec load` CLI is unavailable, read files directly
|
|
43
|
-
```bash
|
|
44
|
-
cat .workflow/specs/<matched-file>
|
|
45
|
-
```
|
|
55
|
+
If `maestro spec load` CLI is unavailable, read files directly from the resolved directory.
|
|
46
56
|
|
|
47
57
|
### Step 3: Keyword Filter (optional)
|
|
48
58
|
|
|
@@ -55,5 +65,5 @@ grep -n -i -C 3 "$KEYWORD" <loaded content>
|
|
|
55
65
|
|
|
56
66
|
Output loaded specs content. If no specs found, show:
|
|
57
67
|
```
|
|
58
|
-
(No specs found. Run "maestro spec init
|
|
68
|
+
(No specs found. Run "maestro spec init --scope <scope>" to initialize.)
|
|
59
69
|
```
|