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.
Files changed (102) hide show
  1. package/.claude-plugin/marketplace.json +18 -0
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/CHANGELOG.md +7 -1
  4. package/README.md +16 -12
  5. package/agents/ace-code-discovery-analyst.md +245 -245
  6. package/agents/ace-code-integration-analyst.md +248 -248
  7. package/agents/ace-code-reviewer.md +375 -375
  8. package/agents/ace-product-owner.md +365 -361
  9. package/agents/ace-project-researcher.md +606 -606
  10. package/agents/ace-technical-application-architect.md +315 -315
  11. package/bin/install.js +587 -173
  12. package/hooks/ace-check-update.js +15 -14
  13. package/hooks/ace-statusline.js +30 -12
  14. package/hooks/hooks.json +14 -0
  15. package/package.json +3 -2
  16. package/shared/lib/ace-core.js +53 -0
  17. package/shared/lib/ace-core.test.js +308 -308
  18. package/shared/lib/ace-story.test.js +250 -250
  19. package/skills/execute-story/SKILL.md +116 -110
  20. package/skills/execute-story/script.js +13 -27
  21. package/skills/execute-story/script.test.js +261 -261
  22. package/skills/execute-story/story-template.xml +451 -451
  23. package/skills/execute-story/workflow.xml +3 -1
  24. package/skills/help/SKILL.md +71 -69
  25. package/skills/help/script.js +32 -35
  26. package/skills/help/script.test.js +183 -183
  27. package/skills/help/workflow.xml +14 -3
  28. package/skills/init-coding-standards/SKILL.md +91 -72
  29. package/skills/init-coding-standards/coding-standards-template.xml +531 -531
  30. package/skills/init-coding-standards/script.js +50 -59
  31. package/skills/init-coding-standards/script.test.js +70 -70
  32. package/skills/init-coding-standards/workflow.xml +1 -1
  33. package/skills/map-cross-cutting/SKILL.md +126 -89
  34. package/skills/map-cross-cutting/workflow.xml +1 -1
  35. package/skills/map-guide/SKILL.md +126 -89
  36. package/skills/map-guide/workflow.xml +1 -1
  37. package/skills/map-pattern/SKILL.md +125 -89
  38. package/skills/map-pattern/workflow.xml +1 -1
  39. package/skills/map-story/SKILL.md +180 -127
  40. package/skills/map-story/templates/tech-debt-index.xml +125 -125
  41. package/skills/map-story/workflow.xml +2 -2
  42. package/skills/map-subsystem/SKILL.md +155 -111
  43. package/skills/map-subsystem/script.js +51 -60
  44. package/skills/map-subsystem/script.test.js +68 -68
  45. package/skills/map-subsystem/templates/subsystem-architecture.xml +343 -343
  46. package/skills/map-subsystem/templates/subsystem-structure.xml +234 -234
  47. package/skills/map-subsystem/workflow.xml +1173 -1173
  48. package/skills/map-sys-doc/SKILL.md +125 -90
  49. package/skills/map-sys-doc/workflow.xml +1 -1
  50. package/skills/map-system/SKILL.md +103 -85
  51. package/skills/map-system/script.js +75 -84
  52. package/skills/map-system/script.test.js +73 -73
  53. package/skills/map-system/templates/system-structure.xml +177 -177
  54. package/skills/map-system/templates/testing-framework.xml +283 -283
  55. package/skills/map-system/workflow.xml +667 -667
  56. package/skills/map-walkthrough/SKILL.md +140 -92
  57. package/skills/map-walkthrough/workflow.xml +457 -457
  58. package/skills/plan-backlog/SKILL.md +93 -75
  59. package/skills/plan-backlog/script.js +121 -136
  60. package/skills/plan-backlog/script.test.js +83 -83
  61. package/skills/plan-backlog/workflow.xml +1348 -1348
  62. package/skills/plan-feature/SKILL.md +99 -76
  63. package/skills/plan-feature/feature-template.xml +361 -361
  64. package/skills/plan-feature/script.js +131 -148
  65. package/skills/plan-feature/script.test.js +80 -80
  66. package/skills/plan-feature/workflow.xml +1 -1
  67. package/skills/plan-product-vision/SKILL.md +91 -75
  68. package/skills/plan-product-vision/product-vision-template.xml +227 -227
  69. package/skills/plan-product-vision/script.js +51 -60
  70. package/skills/plan-product-vision/script.test.js +69 -69
  71. package/skills/plan-product-vision/workflow.xml +337 -337
  72. package/skills/plan-story/SKILL.md +125 -102
  73. package/skills/plan-story/script.js +18 -49
  74. package/skills/plan-story/story-template.xml +8 -1
  75. package/skills/plan-story/workflow.xml +17 -1
  76. package/skills/research-external-solution/SKILL.md +120 -107
  77. package/skills/research-external-solution/external-solution-template.xml +832 -832
  78. package/skills/research-external-solution/script.js +229 -238
  79. package/skills/research-external-solution/script.test.js +134 -134
  80. package/skills/research-external-solution/workflow.xml +657 -657
  81. package/skills/research-integration-solution/SKILL.md +121 -98
  82. package/skills/research-integration-solution/integration-solution-template.xml +1015 -1015
  83. package/skills/research-integration-solution/script.js +223 -231
  84. package/skills/research-integration-solution/script.test.js +134 -134
  85. package/skills/research-integration-solution/workflow.xml +711 -711
  86. package/skills/research-story-wiki/SKILL.md +101 -92
  87. package/skills/research-story-wiki/script.js +223 -231
  88. package/skills/research-story-wiki/script.test.js +138 -138
  89. package/skills/research-story-wiki/story-wiki-template.xml +194 -194
  90. package/skills/research-story-wiki/workflow.xml +473 -473
  91. package/skills/research-technical-solution/SKILL.md +131 -103
  92. package/skills/research-technical-solution/script.js +223 -231
  93. package/skills/research-technical-solution/script.test.js +134 -134
  94. package/skills/research-technical-solution/technical-solution-template.xml +1025 -1025
  95. package/skills/research-technical-solution/workflow.xml +761 -761
  96. package/skills/review-story/SKILL.md +99 -100
  97. package/skills/review-story/script.js +8 -16
  98. package/skills/review-story/script.test.js +169 -169
  99. package/skills/review-story/story-template.xml +451 -451
  100. package/skills/review-story/workflow.xml +1 -1
  101. package/skills/update/SKILL.md +65 -53
  102. 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
- const cwd = process.cwd();
33
- const args = process.argv.slice(2);
34
- const raw = args.includes('--raw');
35
- const cmd = args[0];
36
-
37
- switch (cmd) {
38
- case 'init':
39
- cmdInit(cwd, raw, args.slice(1).filter(a => a !== '--raw'));
40
- break;
41
- case 'resolve-fields':
42
- resolveFields(cwd, raw, args.slice(1).filter(a => a !== '--raw'));
43
- break;
44
- case 'create-issue':
45
- createIssue(cwd, raw, args.slice(1).filter(a => a !== '--raw'));
46
- break;
47
- case 'update-issue':
48
- updateIssue(cwd, raw, args.slice(1).filter(a => a !== '--raw'));
49
- break;
50
- case 'generate-slug': {
51
- const text = args.slice(1).filter(a => a !== '--raw').join(' ');
52
- if (!text) error('generate-slug requires text argument');
53
- const slug = generateSlug(text);
54
- output({ slug }, raw, slug);
55
- break;
56
- }
57
- case 'verify-path-exists': {
58
- const targetPath = args.slice(1).filter(a => a !== '--raw').join(' ');
59
- if (!targetPath) error('verify-path-exists requires path argument');
60
- const exists = pathExists(cwd, targetPath);
61
- output({ exists, path: targetPath }, raw, String(exists));
62
- break;
63
- }
64
- default:
65
- error(`Unknown command: ${cmd}\nAvailable: init, resolve-fields, create-issue, update-issue, generate-slug, verify-path-exists`);
66
- }
67
-
68
- // ─── Init: Plan Feature ─────────────────────────────────────────────────────
69
-
70
- function cmdInit(cwd, raw) {
71
- const config = loadConfig(cwd);
72
- const brownfield = detectBrownfieldStatus(cwd);
73
-
74
- // Wiki detection — system-wide
75
- const wikiSystemDir = '.docs/wiki/system-wide';
76
- const has_wiki_system_wide = pathExists(cwd, wikiSystemDir);
77
- const has_system_architecture = pathExists(cwd, path.join(wikiSystemDir, 'system-architecture.md'));
78
- const has_system_structure = pathExists(cwd, path.join(wikiSystemDir, 'system-structure.md'));
79
- const has_testing_framework = pathExists(cwd, path.join(wikiSystemDir, 'testing-framework.md'));
80
-
81
- // Wiki detection — subsystems
82
- const wikiSubsystemsDir = '.docs/wiki/subsystems';
83
- const has_wiki_subsystems = pathExists(cwd, wikiSubsystemsDir);
84
-
85
- let wiki_subsystem_names = [];
86
- if (has_wiki_subsystems) {
87
- try {
88
- const entries = fs.readdirSync(path.join(cwd, wikiSubsystemsDir), { withFileTypes: true });
89
- wiki_subsystem_names = entries
90
- .filter(e => e.isDirectory())
91
- .map(e => e.name);
92
- } catch {}
93
- }
94
-
95
- const has_wiki = has_wiki_system_wide || has_wiki_subsystems;
96
-
97
- const result = {
98
- // Models
99
- product_owner_model: resolveModel(cwd, 'ace-product-owner'),
100
- researcher_model: resolveModel(cwd, 'ace-project-researcher'),
101
-
102
- // Config
103
- commit_docs: config.commit_docs,
104
-
105
- // Product artifacts
106
- has_product_vision: pathExists(cwd, '.docs/product/product-vision.md'),
107
- has_product_backlog: pathExists(cwd, '.ace/artifacts/product/product-backlog.md'),
108
-
109
- // Wiki analysis cache (from previous runs)
110
- has_wiki_analysis: pathExists(cwd, '.ace/artifacts/wiki/wiki-analysis.md'),
111
-
112
- // Brownfield detection
113
- ...brownfield,
114
-
115
- // Wiki state system-wide
116
- has_wiki,
117
- has_wiki_system_wide,
118
- has_system_architecture,
119
- has_system_structure,
120
- has_testing_framework,
121
-
122
- // Wiki state — subsystems
123
- has_wiki_subsystems,
124
- wiki_subsystem_names,
125
-
126
- // Git state
127
- has_git: pathExists(cwd, '.git'),
128
-
129
- // GitHub CLI
130
- has_gh_cli: (() => {
131
- try {
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
- Read all files referenced by the invoking command's execution-context before starting.
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
- # Plan Product Vision
12
-
13
- Create or update the product vision through architecture-aware questioning and guided writing.
14
-
15
- ## When to Use
16
-
17
- - During `/ace:help` — as part of initial project setup
18
- - After `/ace:map-system` — once codebase is mapped, leverage architecture context
19
- - Anytime — to create or refresh the product vision for a project
20
- - Starting a new project and want to define the product vision (greenfield or brownfield)
21
- - Existing product vision is outdated or missing
22
- - System architecture has been mapped and you want to align vision with subsystem capabilities
23
- - Pivoting the product direction and need to rewrite the vision
24
-
25
- ## Input
26
-
27
- ### Optional
28
-
29
- - **`context`** — Existing PRD, specs, or notes to use as a starting point. Will be refined through the interview process, not used as-is.
30
-
31
- ## Environment Context (preprocessed)
32
-
33
- !`node "${CLAUDE_SKILL_DIR}/script.js" init "$ARGUMENTS" 2>/dev/null`
34
-
35
- ## Supporting Resources
36
-
37
- Read ALL of these before starting the workflow:
38
-
39
- - **Workflow**: Read [workflow.xml](workflow.xml) — complete orchestration process with all steps
40
- - **Product vision template**: Read [product-vision-template.xml](product-vision-template.xml) — output format for the product vision
41
- - **Questioning guide**: Read `${CLAUDE_SKILL_DIR}/../../shared/utils/questioning.xml` — deep questioning techniques
42
- - **UI formatting**: Read `${CLAUDE_SKILL_DIR}/../../shared/utils/ui-formatting.md` — ACE output formatting rules
43
-
44
- ## Process
45
-
46
- Use the `ace-product-owner` agent for requirements gathering, deep questioning, and vision specification.
47
-
48
- The Environment Context above contains the preprocessed INIT JSON — use it directly instead of running the init script manually. The workflow's step 1 setup can skip the init bash call since that data is already available.
49
-
50
- Read all supporting resources listed above, then execute the workflow defined in [workflow.xml](workflow.xml) end-to-end. Preserve all workflow gates (validation, approvals, commits).
51
-
52
- ## Artifacts
53
-
54
- ```
55
- .docs/product/product-vision.md
56
- ```
57
-
58
- ## Example Usage
59
-
60
- ```
61
- # Create a new product vision from scratch
62
- /ace:plan-product-vision
63
-
64
- # Create vision with existing PRD as seed
65
- /ace:plan-product-vision context="path/to/existing-prd.md"
66
-
67
- # Update vision after architecture changes
68
- /ace:plan-product-vision
69
- ```
70
-
71
- ## Next Steps
72
-
73
- - `/ace:init-coding-standards` — Establish coding standards for the project
74
- - `/ace:map-system` — Map codebase structure and architecture
75
- - `/ace:help` — Check project initialization status and next steps
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
+ ```