agile-context-engineering 0.5.0 → 0.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +18 -0
- package/.claude-plugin/plugin.json +1 -1
- package/CHANGELOG.md +7 -1
- package/README.md +16 -12
- package/agents/ace-code-discovery-analyst.md +245 -245
- package/agents/ace-code-integration-analyst.md +248 -248
- package/agents/ace-code-reviewer.md +375 -375
- package/agents/ace-product-owner.md +365 -361
- package/agents/ace-project-researcher.md +606 -606
- package/agents/ace-technical-application-architect.md +315 -315
- package/bin/install.js +587 -173
- package/hooks/ace-check-update.js +15 -14
- package/hooks/ace-statusline.js +30 -12
- package/hooks/hooks.json +14 -0
- package/package.json +3 -2
- package/shared/lib/ace-core.js +53 -0
- package/shared/lib/ace-core.test.js +308 -308
- package/shared/lib/ace-story.test.js +250 -250
- package/skills/execute-story/SKILL.md +116 -110
- package/skills/execute-story/script.js +13 -27
- package/skills/execute-story/script.test.js +261 -261
- package/skills/execute-story/story-template.xml +451 -451
- package/skills/execute-story/workflow.xml +3 -1
- package/skills/help/SKILL.md +71 -69
- package/skills/help/script.js +32 -35
- package/skills/help/script.test.js +183 -183
- package/skills/help/workflow.xml +14 -3
- package/skills/init-coding-standards/SKILL.md +91 -72
- package/skills/init-coding-standards/coding-standards-template.xml +531 -531
- package/skills/init-coding-standards/script.js +50 -59
- package/skills/init-coding-standards/script.test.js +70 -70
- package/skills/init-coding-standards/workflow.xml +1 -1
- package/skills/map-cross-cutting/SKILL.md +126 -89
- package/skills/map-cross-cutting/workflow.xml +1 -1
- package/skills/map-guide/SKILL.md +126 -89
- package/skills/map-guide/workflow.xml +1 -1
- package/skills/map-pattern/SKILL.md +125 -89
- package/skills/map-pattern/workflow.xml +1 -1
- package/skills/map-story/SKILL.md +180 -127
- package/skills/map-story/templates/tech-debt-index.xml +125 -125
- package/skills/map-story/workflow.xml +2 -2
- package/skills/map-subsystem/SKILL.md +155 -111
- package/skills/map-subsystem/script.js +51 -60
- package/skills/map-subsystem/script.test.js +68 -68
- package/skills/map-subsystem/templates/subsystem-architecture.xml +343 -343
- package/skills/map-subsystem/templates/subsystem-structure.xml +234 -234
- package/skills/map-subsystem/workflow.xml +1173 -1173
- package/skills/map-sys-doc/SKILL.md +125 -90
- package/skills/map-sys-doc/workflow.xml +1 -1
- package/skills/map-system/SKILL.md +103 -85
- package/skills/map-system/script.js +75 -84
- package/skills/map-system/script.test.js +73 -73
- package/skills/map-system/templates/system-structure.xml +177 -177
- package/skills/map-system/templates/testing-framework.xml +283 -283
- package/skills/map-system/workflow.xml +667 -667
- package/skills/map-walkthrough/SKILL.md +140 -92
- package/skills/map-walkthrough/workflow.xml +457 -457
- package/skills/plan-backlog/SKILL.md +93 -75
- package/skills/plan-backlog/script.js +121 -136
- package/skills/plan-backlog/script.test.js +83 -83
- package/skills/plan-backlog/workflow.xml +1348 -1348
- package/skills/plan-feature/SKILL.md +99 -76
- package/skills/plan-feature/feature-template.xml +361 -361
- package/skills/plan-feature/script.js +131 -148
- package/skills/plan-feature/script.test.js +80 -80
- package/skills/plan-feature/workflow.xml +1 -1
- package/skills/plan-product-vision/SKILL.md +91 -75
- package/skills/plan-product-vision/product-vision-template.xml +227 -227
- package/skills/plan-product-vision/script.js +51 -60
- package/skills/plan-product-vision/script.test.js +69 -69
- package/skills/plan-product-vision/workflow.xml +337 -337
- package/skills/plan-story/SKILL.md +125 -102
- package/skills/plan-story/script.js +18 -49
- package/skills/plan-story/story-template.xml +8 -1
- package/skills/plan-story/workflow.xml +17 -1
- package/skills/research-external-solution/SKILL.md +120 -107
- package/skills/research-external-solution/external-solution-template.xml +832 -832
- package/skills/research-external-solution/script.js +229 -238
- package/skills/research-external-solution/script.test.js +134 -134
- package/skills/research-external-solution/workflow.xml +657 -657
- package/skills/research-integration-solution/SKILL.md +121 -98
- package/skills/research-integration-solution/integration-solution-template.xml +1015 -1015
- package/skills/research-integration-solution/script.js +223 -231
- package/skills/research-integration-solution/script.test.js +134 -134
- package/skills/research-integration-solution/workflow.xml +711 -711
- package/skills/research-story-wiki/SKILL.md +101 -92
- package/skills/research-story-wiki/script.js +223 -231
- package/skills/research-story-wiki/script.test.js +138 -138
- package/skills/research-story-wiki/story-wiki-template.xml +194 -194
- package/skills/research-story-wiki/workflow.xml +473 -473
- package/skills/research-technical-solution/SKILL.md +131 -103
- package/skills/research-technical-solution/script.js +223 -231
- package/skills/research-technical-solution/script.test.js +134 -134
- package/skills/research-technical-solution/technical-solution-template.xml +1025 -1025
- package/skills/research-technical-solution/workflow.xml +761 -761
- package/skills/review-story/SKILL.md +99 -100
- package/skills/review-story/script.js +8 -16
- package/skills/review-story/script.test.js +169 -169
- package/skills/review-story/story-template.xml +451 -451
- package/skills/review-story/workflow.xml +1 -1
- package/skills/update/SKILL.md +65 -53
- package/skills/update/workflow.xml +21 -5
|
@@ -1,148 +1,131 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* plan-feature skill script — Entry point for ace-tools operations
|
|
5
|
-
* needed by the plan-feature skill.
|
|
6
|
-
*
|
|
7
|
-
* Subcommands:
|
|
8
|
-
* init [args] Environment detection for plan-feature workflow
|
|
9
|
-
* resolve-fields [args] Resolve GitHub Project field IDs
|
|
10
|
-
* create-issue [args] Create a GitHub issue in a project
|
|
11
|
-
* update-issue [args] Update a GitHub issue
|
|
12
|
-
* generate-slug <text> Generate a URL-safe slug from text
|
|
13
|
-
* verify-path-exists <path> Check if a file/directory exists
|
|
14
|
-
*
|
|
15
|
-
* Usage: node script.js <subcommand> [args] [--raw]
|
|
16
|
-
*/
|
|
17
|
-
|
|
18
|
-
const fs = require('fs');
|
|
19
|
-
const path = require('path');
|
|
20
|
-
|
|
21
|
-
const {
|
|
22
|
-
loadConfig, pathExists, generateSlug, resolveModel,
|
|
23
|
-
detectBrownfieldStatus, loadSettings, output, error,
|
|
24
|
-
} = require('../../shared/lib/ace-core');
|
|
25
|
-
|
|
26
|
-
const {
|
|
27
|
-
resolveFields, createIssue, updateIssue,
|
|
28
|
-
} = require('../../shared/lib/ace-github');
|
|
29
|
-
|
|
30
|
-
// ─── CLI Dispatch ────────────────────────────────────────────────────────────
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
const
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
//
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
//
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
//
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
//
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
const { execSync } = require('child_process');
|
|
133
|
-
execSync('gh --version', { stdio: 'pipe' });
|
|
134
|
-
return true;
|
|
135
|
-
} catch {
|
|
136
|
-
return false;
|
|
137
|
-
}
|
|
138
|
-
})(),
|
|
139
|
-
|
|
140
|
-
// GitHub Project settings (from settings.json)
|
|
141
|
-
github_project: (() => {
|
|
142
|
-
const settings = loadSettings(cwd);
|
|
143
|
-
return settings.github_project;
|
|
144
|
-
})(),
|
|
145
|
-
};
|
|
146
|
-
|
|
147
|
-
output(result, raw);
|
|
148
|
-
}
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* plan-feature skill script — Entry point for ace-tools operations
|
|
5
|
+
* needed by the plan-feature skill.
|
|
6
|
+
*
|
|
7
|
+
* Subcommands:
|
|
8
|
+
* init [args] Environment detection for plan-feature workflow
|
|
9
|
+
* resolve-fields [args] Resolve GitHub Project field IDs
|
|
10
|
+
* create-issue [args] Create a GitHub issue in a project
|
|
11
|
+
* update-issue [args] Update a GitHub issue
|
|
12
|
+
* generate-slug <text> Generate a URL-safe slug from text
|
|
13
|
+
* verify-path-exists <path> Check if a file/directory exists
|
|
14
|
+
*
|
|
15
|
+
* Usage: node script.js <subcommand> [args] [--raw]
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
const fs = require('fs');
|
|
19
|
+
const path = require('path');
|
|
20
|
+
|
|
21
|
+
const {
|
|
22
|
+
loadConfig, pathExists, generateSlug, resolveModel,
|
|
23
|
+
detectBrownfieldStatus, loadSettings, output, error, runSkillScript,
|
|
24
|
+
} = require('../../shared/lib/ace-core');
|
|
25
|
+
|
|
26
|
+
const {
|
|
27
|
+
resolveFields, createIssue, updateIssue,
|
|
28
|
+
} = require('../../shared/lib/ace-github');
|
|
29
|
+
|
|
30
|
+
// ─── CLI Dispatch ────────────────────────────────────────────────────────────
|
|
31
|
+
|
|
32
|
+
runSkillScript({
|
|
33
|
+
init: cmdInit,
|
|
34
|
+
'resolve-fields': (cwd, raw, args) => resolveFields(cwd, raw, args),
|
|
35
|
+
'create-issue': (cwd, raw, args) => createIssue(cwd, raw, args),
|
|
36
|
+
'update-issue': (cwd, raw, args) => updateIssue(cwd, raw, args),
|
|
37
|
+
'generate-slug': (cwd, raw, args, parsed) => {
|
|
38
|
+
const text = parsed._positional || args.join(' ');
|
|
39
|
+
if (!text) error('generate-slug requires text argument');
|
|
40
|
+
const slug = generateSlug(text);
|
|
41
|
+
output({ slug }, raw, slug);
|
|
42
|
+
},
|
|
43
|
+
'verify-path-exists': (cwd, raw, args, parsed) => {
|
|
44
|
+
const targetPath = parsed._positional || args.join(' ');
|
|
45
|
+
if (!targetPath) error('verify-path-exists requires path argument');
|
|
46
|
+
const exists = pathExists(cwd, targetPath);
|
|
47
|
+
output({ exists, path: targetPath }, raw, String(exists));
|
|
48
|
+
},
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
// ─── Init: Plan Feature ─────────────────────────────────────────────────────
|
|
52
|
+
|
|
53
|
+
function cmdInit(cwd, raw, args, parsed) {
|
|
54
|
+
const config = loadConfig(cwd);
|
|
55
|
+
const brownfield = detectBrownfieldStatus(cwd);
|
|
56
|
+
|
|
57
|
+
// Wiki detection — system-wide
|
|
58
|
+
const wikiSystemDir = '.docs/wiki/system-wide';
|
|
59
|
+
const has_wiki_system_wide = pathExists(cwd, wikiSystemDir);
|
|
60
|
+
const has_system_architecture = pathExists(cwd, path.join(wikiSystemDir, 'system-architecture.md'));
|
|
61
|
+
const has_system_structure = pathExists(cwd, path.join(wikiSystemDir, 'system-structure.md'));
|
|
62
|
+
const has_testing_framework = pathExists(cwd, path.join(wikiSystemDir, 'testing-framework.md'));
|
|
63
|
+
|
|
64
|
+
// Wiki detection — subsystems
|
|
65
|
+
const wikiSubsystemsDir = '.docs/wiki/subsystems';
|
|
66
|
+
const has_wiki_subsystems = pathExists(cwd, wikiSubsystemsDir);
|
|
67
|
+
|
|
68
|
+
let wiki_subsystem_names = [];
|
|
69
|
+
if (has_wiki_subsystems) {
|
|
70
|
+
try {
|
|
71
|
+
const entries = fs.readdirSync(path.join(cwd, wikiSubsystemsDir), { withFileTypes: true });
|
|
72
|
+
wiki_subsystem_names = entries
|
|
73
|
+
.filter(e => e.isDirectory())
|
|
74
|
+
.map(e => e.name);
|
|
75
|
+
} catch {}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
const has_wiki = has_wiki_system_wide || has_wiki_subsystems;
|
|
79
|
+
|
|
80
|
+
const result = {
|
|
81
|
+
// Models
|
|
82
|
+
product_owner_model: resolveModel(cwd, 'ace-product-owner'),
|
|
83
|
+
researcher_model: resolveModel(cwd, 'ace-project-researcher'),
|
|
84
|
+
|
|
85
|
+
// Config
|
|
86
|
+
commit_docs: config.commit_docs,
|
|
87
|
+
|
|
88
|
+
// Product artifacts
|
|
89
|
+
has_product_vision: pathExists(cwd, '.docs/product/product-vision.md'),
|
|
90
|
+
has_product_backlog: pathExists(cwd, '.ace/artifacts/product/product-backlog.md'),
|
|
91
|
+
|
|
92
|
+
// Wiki analysis cache (from previous runs)
|
|
93
|
+
has_wiki_analysis: pathExists(cwd, '.ace/artifacts/wiki/wiki-analysis.md'),
|
|
94
|
+
|
|
95
|
+
// Brownfield detection
|
|
96
|
+
...brownfield,
|
|
97
|
+
|
|
98
|
+
// Wiki state — system-wide
|
|
99
|
+
has_wiki,
|
|
100
|
+
has_wiki_system_wide,
|
|
101
|
+
has_system_architecture,
|
|
102
|
+
has_system_structure,
|
|
103
|
+
has_testing_framework,
|
|
104
|
+
|
|
105
|
+
// Wiki state — subsystems
|
|
106
|
+
has_wiki_subsystems,
|
|
107
|
+
wiki_subsystem_names,
|
|
108
|
+
|
|
109
|
+
// Git state
|
|
110
|
+
has_git: pathExists(cwd, '.git'),
|
|
111
|
+
|
|
112
|
+
// GitHub CLI
|
|
113
|
+
has_gh_cli: (() => {
|
|
114
|
+
try {
|
|
115
|
+
const { execSync } = require('child_process');
|
|
116
|
+
execSync('gh --version', { stdio: 'pipe' });
|
|
117
|
+
return true;
|
|
118
|
+
} catch {
|
|
119
|
+
return false;
|
|
120
|
+
}
|
|
121
|
+
})(),
|
|
122
|
+
|
|
123
|
+
// GitHub Project settings (from settings.json)
|
|
124
|
+
github_project: (() => {
|
|
125
|
+
const settings = loadSettings(cwd);
|
|
126
|
+
return settings.github_project;
|
|
127
|
+
})(),
|
|
128
|
+
};
|
|
129
|
+
|
|
130
|
+
output(result, raw);
|
|
131
|
+
}
|
|
@@ -1,80 +1,80 @@
|
|
|
1
|
-
const { describe, it, before, after } = require('node:test');
|
|
2
|
-
const assert = require('node:assert');
|
|
3
|
-
const { execSync } = require('child_process');
|
|
4
|
-
const fs = require('fs');
|
|
5
|
-
const path = require('path');
|
|
6
|
-
const os = require('os');
|
|
7
|
-
|
|
8
|
-
const SCRIPT = path.join(__dirname, 'script.js');
|
|
9
|
-
|
|
10
|
-
function createTestProject() {
|
|
11
|
-
const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'ace-test-'));
|
|
12
|
-
|
|
13
|
-
const aceDir = path.join(tmpDir, '.ace');
|
|
14
|
-
fs.mkdirSync(aceDir, { recursive: true });
|
|
15
|
-
fs.writeFileSync(path.join(aceDir, 'config.json'), JSON.stringify({
|
|
16
|
-
version: '0.1.0',
|
|
17
|
-
projectName: 'test-project',
|
|
18
|
-
model_profile: 'quality',
|
|
19
|
-
commit_docs: true,
|
|
20
|
-
github: { enabled: false },
|
|
21
|
-
}, null, 2));
|
|
22
|
-
|
|
23
|
-
fs.writeFileSync(path.join(aceDir, 'settings.json'), JSON.stringify({
|
|
24
|
-
model_profile: 'quality',
|
|
25
|
-
commit_docs: true,
|
|
26
|
-
agent_teams: false,
|
|
27
|
-
github_project: { enabled: false, gh_installed: false, repo: '', project_number: null, owner: '' },
|
|
28
|
-
}, null, 2));
|
|
29
|
-
|
|
30
|
-
return tmpDir;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
function runScript(subcommand, args, cwd) {
|
|
34
|
-
return execSync(`node "${SCRIPT}" ${subcommand} ${args}`, {
|
|
35
|
-
cwd,
|
|
36
|
-
encoding: 'utf-8',
|
|
37
|
-
timeout: 10000,
|
|
38
|
-
});
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
function cleanup(tmpDir) {
|
|
42
|
-
fs.rmSync(tmpDir, { recursive: true, force: true });
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
describe('plan-feature script', () => {
|
|
46
|
-
it('errors on unknown command', () => {
|
|
47
|
-
assert.throws(() => {
|
|
48
|
-
execSync(`node "${SCRIPT}" bogus`, { encoding: 'utf-8', stdio: 'pipe' });
|
|
49
|
-
});
|
|
50
|
-
});
|
|
51
|
-
|
|
52
|
-
describe('init', () => {
|
|
53
|
-
let tmpDir;
|
|
54
|
-
|
|
55
|
-
before(() => { tmpDir = createTestProject(); });
|
|
56
|
-
after(() => { cleanup(tmpDir); });
|
|
57
|
-
|
|
58
|
-
it('init returns valid JSON', () => {
|
|
59
|
-
const result = JSON.parse(runScript('init', '', tmpDir));
|
|
60
|
-
assert.ok(typeof result === 'object');
|
|
61
|
-
assert.ok(result.product_owner_model, 'should have product_owner_model');
|
|
62
|
-
assert.ok(result.researcher_model, 'should have researcher_model');
|
|
63
|
-
assert.strictEqual(typeof result.commit_docs, 'boolean');
|
|
64
|
-
assert.strictEqual(typeof result.has_git, 'boolean');
|
|
65
|
-
assert.strictEqual(typeof result.is_brownfield, 'boolean');
|
|
66
|
-
assert.strictEqual(typeof result.has_product_vision, 'boolean');
|
|
67
|
-
assert.strictEqual(typeof result.has_product_backlog, 'boolean');
|
|
68
|
-
assert.strictEqual(typeof result.has_wiki, 'boolean');
|
|
69
|
-
assert.strictEqual(typeof result.has_gh_cli, 'boolean');
|
|
70
|
-
assert.ok(result.github_project !== undefined, 'should have github_project');
|
|
71
|
-
});
|
|
72
|
-
|
|
73
|
-
it('returns brownfield detection fields', () => {
|
|
74
|
-
const result = JSON.parse(runScript('init', '', tmpDir));
|
|
75
|
-
assert.strictEqual(typeof result.is_brownfield, 'boolean');
|
|
76
|
-
assert.strictEqual(typeof result.is_greenfield, 'boolean');
|
|
77
|
-
assert.strictEqual(result.is_brownfield, !result.is_greenfield);
|
|
78
|
-
});
|
|
79
|
-
});
|
|
80
|
-
});
|
|
1
|
+
const { describe, it, before, after } = require('node:test');
|
|
2
|
+
const assert = require('node:assert');
|
|
3
|
+
const { execSync } = require('child_process');
|
|
4
|
+
const fs = require('fs');
|
|
5
|
+
const path = require('path');
|
|
6
|
+
const os = require('os');
|
|
7
|
+
|
|
8
|
+
const SCRIPT = path.join(__dirname, 'script.js');
|
|
9
|
+
|
|
10
|
+
function createTestProject() {
|
|
11
|
+
const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'ace-test-'));
|
|
12
|
+
|
|
13
|
+
const aceDir = path.join(tmpDir, '.ace');
|
|
14
|
+
fs.mkdirSync(aceDir, { recursive: true });
|
|
15
|
+
fs.writeFileSync(path.join(aceDir, 'config.json'), JSON.stringify({
|
|
16
|
+
version: '0.1.0',
|
|
17
|
+
projectName: 'test-project',
|
|
18
|
+
model_profile: 'quality',
|
|
19
|
+
commit_docs: true,
|
|
20
|
+
github: { enabled: false },
|
|
21
|
+
}, null, 2));
|
|
22
|
+
|
|
23
|
+
fs.writeFileSync(path.join(aceDir, 'settings.json'), JSON.stringify({
|
|
24
|
+
model_profile: 'quality',
|
|
25
|
+
commit_docs: true,
|
|
26
|
+
agent_teams: false,
|
|
27
|
+
github_project: { enabled: false, gh_installed: false, repo: '', project_number: null, owner: '' },
|
|
28
|
+
}, null, 2));
|
|
29
|
+
|
|
30
|
+
return tmpDir;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
function runScript(subcommand, args, cwd) {
|
|
34
|
+
return execSync(`node "${SCRIPT}" ${subcommand} ${args}`, {
|
|
35
|
+
cwd,
|
|
36
|
+
encoding: 'utf-8',
|
|
37
|
+
timeout: 10000,
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
function cleanup(tmpDir) {
|
|
42
|
+
fs.rmSync(tmpDir, { recursive: true, force: true });
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
describe('plan-feature script', () => {
|
|
46
|
+
it('errors on unknown command', () => {
|
|
47
|
+
assert.throws(() => {
|
|
48
|
+
execSync(`node "${SCRIPT}" bogus`, { encoding: 'utf-8', stdio: 'pipe' });
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
describe('init', () => {
|
|
53
|
+
let tmpDir;
|
|
54
|
+
|
|
55
|
+
before(() => { tmpDir = createTestProject(); });
|
|
56
|
+
after(() => { cleanup(tmpDir); });
|
|
57
|
+
|
|
58
|
+
it('init returns valid JSON', () => {
|
|
59
|
+
const result = JSON.parse(runScript('init', '', tmpDir));
|
|
60
|
+
assert.ok(typeof result === 'object');
|
|
61
|
+
assert.ok(result.product_owner_model, 'should have product_owner_model');
|
|
62
|
+
assert.ok(result.researcher_model, 'should have researcher_model');
|
|
63
|
+
assert.strictEqual(typeof result.commit_docs, 'boolean');
|
|
64
|
+
assert.strictEqual(typeof result.has_git, 'boolean');
|
|
65
|
+
assert.strictEqual(typeof result.is_brownfield, 'boolean');
|
|
66
|
+
assert.strictEqual(typeof result.has_product_vision, 'boolean');
|
|
67
|
+
assert.strictEqual(typeof result.has_product_backlog, 'boolean');
|
|
68
|
+
assert.strictEqual(typeof result.has_wiki, 'boolean');
|
|
69
|
+
assert.strictEqual(typeof result.has_gh_cli, 'boolean');
|
|
70
|
+
assert.ok(result.github_project !== undefined, 'should have github_project');
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
it('returns brownfield detection fields', () => {
|
|
74
|
+
const result = JSON.parse(runScript('init', '', tmpDir));
|
|
75
|
+
assert.strictEqual(typeof result.is_brownfield, 'boolean');
|
|
76
|
+
assert.strictEqual(typeof result.is_greenfield, 'boolean');
|
|
77
|
+
assert.strictEqual(result.is_brownfield, !result.is_greenfield);
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
});
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
</purpose>
|
|
17
17
|
|
|
18
18
|
<mandatory-context>
|
|
19
|
-
|
|
19
|
+
All supporting resource files are auto-loaded in the skill prompt above. Do NOT re-read them.
|
|
20
20
|
Also read any document or text passed as parameter ($ARGUMENTS) in the invoking command.
|
|
21
21
|
</mandatory-context>
|
|
22
22
|
|
|
@@ -1,75 +1,91 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: plan-product-vision
|
|
3
|
-
description: Create or update the product vision through architecture-aware questioning and guided writing
|
|
4
|
-
argument-hint: "[optional: context='PRD, specs, or notes to build on']"
|
|
5
|
-
disable-model-invocation: true
|
|
6
|
-
allowed-tools: Read, Bash, Write, Task, AskUserQuestion
|
|
7
|
-
model: opus
|
|
8
|
-
effort: high
|
|
9
|
-
---
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
##
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
-
|
|
40
|
-
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
-
|
|
74
|
-
|
|
75
|
-
|
|
1
|
+
---
|
|
2
|
+
name: plan-product-vision
|
|
3
|
+
description: Create or update the product vision through architecture-aware questioning and guided writing
|
|
4
|
+
argument-hint: "[optional: context='PRD, specs, or notes to build on']"
|
|
5
|
+
disable-model-invocation: true
|
|
6
|
+
allowed-tools: Read, Bash, Write, Task, AskUserQuestion
|
|
7
|
+
model: opus
|
|
8
|
+
effort: high
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## Environment Context (preprocessed)
|
|
12
|
+
|
|
13
|
+
!`node "${CLAUDE_SKILL_DIR}/script.js" init 2>/dev/null`
|
|
14
|
+
|
|
15
|
+
## Supporting Resources (auto-loaded)
|
|
16
|
+
|
|
17
|
+
!`cat "${CLAUDE_SKILL_DIR}/workflow.xml"`
|
|
18
|
+
|
|
19
|
+
!`cat "${CLAUDE_SKILL_DIR}/product-vision-template.xml"`
|
|
20
|
+
|
|
21
|
+
!`cat "${CLAUDE_SKILL_DIR}/../../shared/utils/questioning.xml"`
|
|
22
|
+
|
|
23
|
+
!`cat "${CLAUDE_SKILL_DIR}/../../shared/utils/ui-formatting.md"`
|
|
24
|
+
|
|
25
|
+
```xml
|
|
26
|
+
<command>
|
|
27
|
+
|
|
28
|
+
<execution-time>
|
|
29
|
+
<runs-after>
|
|
30
|
+
<trigger>During /ace:help — as part of initial project setup</trigger>
|
|
31
|
+
<trigger>After /ace:map-system — once codebase is mapped, leverage architecture context</trigger>
|
|
32
|
+
<trigger>Anytime — to create or refresh the product vision for a project</trigger>
|
|
33
|
+
</runs-after>
|
|
34
|
+
<use-when>
|
|
35
|
+
<condition>Starting a new project and want to define the product vision (greenfield or brownfield)</condition>
|
|
36
|
+
<condition>Existing product vision is outdated or missing</condition>
|
|
37
|
+
<condition>System architecture has been mapped and you want to align vision with subsystem capabilities</condition>
|
|
38
|
+
<condition>Pivoting the product direction and need to rewrite the vision</condition>
|
|
39
|
+
</use-when>
|
|
40
|
+
</execution-time>
|
|
41
|
+
|
|
42
|
+
<input>
|
|
43
|
+
<flags>
|
|
44
|
+
</flags>
|
|
45
|
+
|
|
46
|
+
<parameters>
|
|
47
|
+
<required>
|
|
48
|
+
</required>
|
|
49
|
+
|
|
50
|
+
<optional>
|
|
51
|
+
<param name="context" type="file | text">
|
|
52
|
+
Existing PRD, specs, or notes to use as a starting point.
|
|
53
|
+
Will be refined through the interview process, not used as-is.
|
|
54
|
+
</param>
|
|
55
|
+
</optional>
|
|
56
|
+
</parameters>
|
|
57
|
+
</input>
|
|
58
|
+
|
|
59
|
+
<execution-context>
|
|
60
|
+
<!-- All supporting files are auto-loaded in the Supporting Resources section above.
|
|
61
|
+
The model does NOT need to Read these files — they are already in context. -->
|
|
62
|
+
</execution-context>
|
|
63
|
+
|
|
64
|
+
<output>
|
|
65
|
+
<objective>
|
|
66
|
+
Detect the project's brownfield/greenfield status and architecture context.
|
|
67
|
+
If brownfield with system architecture, use the Subsystem Responsibility Matrix
|
|
68
|
+
to inform high-level capabilities. Interview the user about their product vision,
|
|
69
|
+
goals, and audience. Generate a comprehensive product-vision.md.
|
|
70
|
+
</objective>
|
|
71
|
+
|
|
72
|
+
<artifacts>
|
|
73
|
+
.docs/product/product-vision.md
|
|
74
|
+
</artifacts>
|
|
75
|
+
</output>
|
|
76
|
+
|
|
77
|
+
<process>
|
|
78
|
+
Execute the plan-product-vision workflow from
|
|
79
|
+
`workflow.xml` end-to-end.
|
|
80
|
+
Preserve all workflow gates (validation, approvals, commits).
|
|
81
|
+
</process>
|
|
82
|
+
|
|
83
|
+
<next-steps>
|
|
84
|
+
**After this command:**
|
|
85
|
+
- `/ace:init-coding-standards` — Establish coding standards for the project
|
|
86
|
+
- `/ace:map-system` — Map codebase structure and architecture
|
|
87
|
+
- `/ace:help` — Check project initialization status and next steps
|
|
88
|
+
</next-steps>
|
|
89
|
+
|
|
90
|
+
</command>
|
|
91
|
+
```
|