@pixelcraft-tw/spec 1.0.0

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 (122) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +195 -0
  3. package/dist/bin/pxs.d.ts +2 -0
  4. package/dist/bin/pxs.js +5 -0
  5. package/dist/bin/pxs.js.map +1 -0
  6. package/dist/src/backends/claude.d.ts +9 -0
  7. package/dist/src/backends/claude.js +80 -0
  8. package/dist/src/backends/claude.js.map +1 -0
  9. package/dist/src/backends/codex.d.ts +9 -0
  10. package/dist/src/backends/codex.js +72 -0
  11. package/dist/src/backends/codex.js.map +1 -0
  12. package/dist/src/backends/factory.d.ts +2 -0
  13. package/dist/src/backends/factory.js +14 -0
  14. package/dist/src/backends/factory.js.map +1 -0
  15. package/dist/src/backends/interface.d.ts +15 -0
  16. package/dist/src/backends/interface.js +2 -0
  17. package/dist/src/backends/interface.js.map +1 -0
  18. package/dist/src/cli.d.ts +2 -0
  19. package/dist/src/cli.js +94 -0
  20. package/dist/src/cli.js.map +1 -0
  21. package/dist/src/commands/clarify.d.ts +5 -0
  22. package/dist/src/commands/clarify.js +46 -0
  23. package/dist/src/commands/clarify.js.map +1 -0
  24. package/dist/src/commands/diff.d.ts +1 -0
  25. package/dist/src/commands/diff.js +81 -0
  26. package/dist/src/commands/diff.js.map +1 -0
  27. package/dist/src/commands/implement.d.ts +9 -0
  28. package/dist/src/commands/implement.js +247 -0
  29. package/dist/src/commands/implement.js.map +1 -0
  30. package/dist/src/commands/init.d.ts +6 -0
  31. package/dist/src/commands/init.js +183 -0
  32. package/dist/src/commands/init.js.map +1 -0
  33. package/dist/src/commands/new.d.ts +5 -0
  34. package/dist/src/commands/new.js +186 -0
  35. package/dist/src/commands/new.js.map +1 -0
  36. package/dist/src/commands/refine.d.ts +8 -0
  37. package/dist/src/commands/refine.js +158 -0
  38. package/dist/src/commands/refine.js.map +1 -0
  39. package/dist/src/commands/reset.d.ts +3 -0
  40. package/dist/src/commands/reset.js +44 -0
  41. package/dist/src/commands/reset.js.map +1 -0
  42. package/dist/src/commands/review.d.ts +4 -0
  43. package/dist/src/commands/review.js +70 -0
  44. package/dist/src/commands/review.js.map +1 -0
  45. package/dist/src/commands/status.d.ts +1 -0
  46. package/dist/src/commands/status.js +53 -0
  47. package/dist/src/commands/status.js.map +1 -0
  48. package/dist/src/discovery/project.d.ts +7 -0
  49. package/dist/src/discovery/project.js +135 -0
  50. package/dist/src/discovery/project.js.map +1 -0
  51. package/dist/src/git/operations.d.ts +10 -0
  52. package/dist/src/git/operations.js +56 -0
  53. package/dist/src/git/operations.js.map +1 -0
  54. package/dist/src/parsers/arguments.d.ts +18 -0
  55. package/dist/src/parsers/arguments.js +43 -0
  56. package/dist/src/parsers/arguments.js.map +1 -0
  57. package/dist/src/parsers/plan.d.ts +23 -0
  58. package/dist/src/parsers/plan.js +117 -0
  59. package/dist/src/parsers/plan.js.map +1 -0
  60. package/dist/src/parsers/spec.d.ts +10 -0
  61. package/dist/src/parsers/spec.js +46 -0
  62. package/dist/src/parsers/spec.js.map +1 -0
  63. package/dist/src/state/manager.d.ts +24 -0
  64. package/dist/src/state/manager.js +103 -0
  65. package/dist/src/state/manager.js.map +1 -0
  66. package/dist/src/state/types.d.ts +48 -0
  67. package/dist/src/state/types.js +20 -0
  68. package/dist/src/state/types.js.map +1 -0
  69. package/dist/src/utils/display.d.ts +7 -0
  70. package/dist/src/utils/display.js +42 -0
  71. package/dist/src/utils/display.js.map +1 -0
  72. package/dist/src/utils/prompt.d.ts +15 -0
  73. package/dist/src/utils/prompt.js +139 -0
  74. package/dist/src/utils/prompt.js.map +1 -0
  75. package/package.json +52 -0
  76. package/templates/agents-md-snippet.md +20 -0
  77. package/templates/architectures/clean/csharp-aspnet.md +56 -0
  78. package/templates/architectures/clean/dart-flutter.md +73 -0
  79. package/templates/architectures/clean/go-gin.md +50 -0
  80. package/templates/architectures/clean/go-std.md +49 -0
  81. package/templates/architectures/clean/kotlin-android.md +70 -0
  82. package/templates/architectures/clean/python-fastapi.md +49 -0
  83. package/templates/architectures/clean/swift-ios.md +69 -0
  84. package/templates/architectures/clean/typescript-express.md +60 -0
  85. package/templates/architectures/clean/typescript-nestjs.md +61 -0
  86. package/templates/architectures/ddd/csharp-aspnet.md +55 -0
  87. package/templates/architectures/ddd/go-gin.md +53 -0
  88. package/templates/architectures/ddd/python-fastapi.md +52 -0
  89. package/templates/architectures/ddd/typescript-nestjs.md +62 -0
  90. package/templates/architectures/hexagonal/csharp-aspnet.md +45 -0
  91. package/templates/architectures/hexagonal/go-gin.md +47 -0
  92. package/templates/architectures/hexagonal/python-fastapi.md +43 -0
  93. package/templates/architectures/hexagonal/typescript-nestjs.md +44 -0
  94. package/templates/architectures/layered/csharp-aspnet.md +45 -0
  95. package/templates/architectures/layered/go-gin.md +41 -0
  96. package/templates/architectures/layered/python-fastapi.md +42 -0
  97. package/templates/architectures/layered/typescript-nestjs.md +48 -0
  98. package/templates/architectures/modular/csharp-aspnet.md +45 -0
  99. package/templates/architectures/modular/dart-flutter.md +64 -0
  100. package/templates/architectures/modular/go-gin.md +47 -0
  101. package/templates/architectures/modular/kotlin-android.md +68 -0
  102. package/templates/architectures/modular/python-fastapi.md +45 -0
  103. package/templates/architectures/modular/swift-ios.md +55 -0
  104. package/templates/architectures/modular/typescript-nestjs.md +48 -0
  105. package/templates/architectures/mvvm/dart-flutter.md +69 -0
  106. package/templates/architectures/mvvm/kotlin-android.md +79 -0
  107. package/templates/architectures/mvvm/swift-ios.md +66 -0
  108. package/templates/claude-commands/sf.clarify.md +18 -0
  109. package/templates/claude-commands/sf.implement.md +80 -0
  110. package/templates/claude-commands/sf.new.md +22 -0
  111. package/templates/claude-commands/sf.refine.md +47 -0
  112. package/templates/claude-commands/sf.review.md +17 -0
  113. package/templates/claude-commands/sf.status.md +12 -0
  114. package/templates/workflow/config.yaml +17 -0
  115. package/templates/workflow/prompts/clarify.md +39 -0
  116. package/templates/workflow/prompts/final-review.md +30 -0
  117. package/templates/workflow/prompts/implement-tdd.md +35 -0
  118. package/templates/workflow/prompts/implement.md +43 -0
  119. package/templates/workflow/prompts/refine.md +52 -0
  120. package/templates/workflow/prompts/review.md +33 -0
  121. package/templates/workflow/prompts/test.md +14 -0
  122. package/templates/workflow/templates/spec-template.md +13 -0
@@ -0,0 +1,81 @@
1
+ import fs from 'node:fs';
2
+ import { StateManager } from '../state/manager.js';
3
+ import { parsePlan } from '../parsers/plan.js';
4
+ import * as display from '../utils/display.js';
5
+ export async function diffCommand(name) {
6
+ const state = new StateManager();
7
+ state.ensureWorkflow();
8
+ const feature = state.getFeature(name);
9
+ if (!feature) {
10
+ display.error(`Feature "${name}" not found.`);
11
+ return;
12
+ }
13
+ state.checkPhaseGuard('diff', name);
14
+ const planPath = state.planPath(name);
15
+ if (!fs.existsSync(planPath)) {
16
+ display.error(`Plan not found for "${name}". Run \`pxs refine ${name}\` first.`);
17
+ return;
18
+ }
19
+ const planContent = fs.readFileSync(planPath, 'utf-8');
20
+ const plan = parsePlan(planContent);
21
+ display.heading(`Spec vs Implementation: ${name}`);
22
+ console.log(` Phase: ${feature.phase}`);
23
+ console.log(` Branch: ${feature.branch || '-'}`);
24
+ console.log();
25
+ const done = [];
26
+ const inProgress = [];
27
+ const remaining = [];
28
+ for (let i = 0; i < feature.tasks.length; i++) {
29
+ const task = feature.tasks[i];
30
+ const planTask = plan.tasks[i];
31
+ const label = `Task ${i + 1}: ${task.name}`;
32
+ switch (task.status) {
33
+ case 'complete':
34
+ done.push(label);
35
+ break;
36
+ case 'skipped':
37
+ done.push(`${label} (skipped)`);
38
+ break;
39
+ case 'in_progress':
40
+ case 'review_pending':
41
+ inProgress.push(label);
42
+ break;
43
+ case 'pending':
44
+ remaining.push(label);
45
+ break;
46
+ }
47
+ // Show files from plan for pending tasks
48
+ if (planTask && task.status === 'pending') {
49
+ const fileLines = planTask.raw.match(/`[^`]+`\s*\((new|modify)\)/g);
50
+ if (fileLines) {
51
+ for (const line of fileLines) {
52
+ remaining.push(` ${line}`);
53
+ }
54
+ }
55
+ }
56
+ }
57
+ if (done.length > 0) {
58
+ console.log(' Done:');
59
+ for (const item of done) {
60
+ console.log(` ${display.taskIcon('complete')} ${item}`);
61
+ }
62
+ }
63
+ if (inProgress.length > 0) {
64
+ console.log(' In Progress:');
65
+ for (const item of inProgress) {
66
+ console.log(` ${display.taskIcon('in_progress')} ${item}`);
67
+ }
68
+ }
69
+ if (remaining.length > 0) {
70
+ console.log(' Remaining:');
71
+ for (const item of remaining) {
72
+ console.log(` ${display.taskIcon('pending')} ${item}`);
73
+ }
74
+ }
75
+ // Summary
76
+ const total = feature.tasks.length;
77
+ const completed = feature.tasks.filter((t) => t.status === 'complete' || t.status === 'skipped').length;
78
+ const pct = total > 0 ? Math.round((completed / total) * 100) : 0;
79
+ console.log(`\n Progress: ${completed}/${total} tasks (${pct}%)`);
80
+ }
81
+ //# sourceMappingURL=diff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.js","sourceRoot":"","sources":["../../../src/commands/diff.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export declare function implementCommand(name: string, args: {
2
+ agents: string[];
3
+ skills: string[];
4
+ text: string;
5
+ }, options: {
6
+ backend?: string;
7
+ test?: string[] | boolean;
8
+ skipReview?: boolean;
9
+ }): Promise<void>;
@@ -0,0 +1,247 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import inquirer from 'inquirer';
4
+ import { StateManager } from '../state/manager.js';
5
+ import { createBackend } from '../backends/factory.js';
6
+ import { parsePlan } from '../parsers/plan.js';
7
+ import { assemblePrompt } from '../utils/prompt.js';
8
+ import { gitBranch, gitCommit, gitDiff, gitDiffBranch, gitCheckout, gitMerge, gitCurrentBranch } from '../git/operations.js';
9
+ import * as display from '../utils/display.js';
10
+ export async function implementCommand(name, args, options) {
11
+ const state = new StateManager();
12
+ state.ensureWorkflow();
13
+ state.checkPhaseGuard('implement', name);
14
+ const feature = state.getFeature(name);
15
+ const config = state.readConfig();
16
+ const backendName = options.backend ?? config.backend.default;
17
+ const backend = createBackend(backendName);
18
+ if (!(await backend.isAvailable())) {
19
+ display.error(`Backend "${backendName}" not available.`);
20
+ return;
21
+ }
22
+ // Read plan
23
+ const planPath = state.planPath(name);
24
+ if (!fs.existsSync(planPath)) {
25
+ display.error(`Plan not found. Run \`pxs refine ${name}\` first.`);
26
+ return;
27
+ }
28
+ const planContent = fs.readFileSync(planPath, 'utf-8');
29
+ const plan = parsePlan(planContent);
30
+ // Pre-flight: create branch if first run
31
+ if (feature.phase === 'ready_to_implement') {
32
+ const baseBranch = gitCurrentBranch();
33
+ const branchName = feature.branch || `${feature.type}/${name}`;
34
+ display.info(`Creating branch: ${branchName} (from ${baseBranch})`);
35
+ try {
36
+ gitBranch(branchName);
37
+ }
38
+ catch {
39
+ display.warn(`Branch ${branchName} may already exist, checking out...`);
40
+ gitCheckout(branchName);
41
+ }
42
+ feature.phase = 'implementing';
43
+ feature.branch = branchName;
44
+ feature.base_branch = baseBranch;
45
+ state.upsertFeature(feature);
46
+ }
47
+ // Determine test strategy
48
+ const testConfig = parseTestOptions(options.test);
49
+ const baseBranch = feature.base_branch || 'main';
50
+ let sessionId = feature.session?.id ?? '';
51
+ // Ensure reviews dir exists once
52
+ fs.mkdirSync(state.reviewsDir(), { recursive: true });
53
+ // Execute tasks
54
+ for (let i = 0; i < feature.tasks.length; i++) {
55
+ const task = feature.tasks[i];
56
+ if (task.status === 'complete' || task.status === 'skipped')
57
+ continue;
58
+ const taskSpec = plan.tasks[i];
59
+ if (!taskSpec)
60
+ continue;
61
+ display.heading(`Task ${i + 1}: ${task.name}`);
62
+ // Update status
63
+ task.status = 'in_progress';
64
+ feature.current_task = i + 1;
65
+ state.upsertFeature(feature);
66
+ // Build prompt
67
+ const templateName = testConfig.tdd ? 'implement-tdd' : 'implement';
68
+ const previousDiff = i > 0 ? getDiffSummary() : '';
69
+ let taskDiff = previousDiff; // reused after commit
70
+ const prompt = assemblePrompt({
71
+ templateName,
72
+ vars: {
73
+ task_content: taskSpec.raw,
74
+ previous_diff: previousDiff,
75
+ },
76
+ agents: args.agents,
77
+ skills: args.skills,
78
+ extraText: args.text,
79
+ });
80
+ // Execute
81
+ const result = sessionId
82
+ ? await backend.resume(sessionId, prompt)
83
+ : await backend.execute(prompt);
84
+ sessionId = result.sessionId;
85
+ feature.session = { backend: backendName, id: sessionId };
86
+ // Commit implementation
87
+ try {
88
+ gitCommit(`${feature.type}(${name}): task-${i + 1} ${task.name}`);
89
+ }
90
+ catch {
91
+ display.warn('Nothing to commit or commit failed.');
92
+ }
93
+ // Get diff once after commit — reused for tests and review
94
+ taskDiff = getDiffSummary();
95
+ // Post-hoc tests (if not TDD)
96
+ if (testConfig.postHoc) {
97
+ display.info('Generating tests...');
98
+ const testType = testConfig.intg ? 'integration' : 'unit';
99
+ const testPrompt = assemblePrompt({
100
+ templateName: 'test',
101
+ vars: {
102
+ test_type: testType,
103
+ git_diff: taskDiff,
104
+ task_content: taskSpec.raw,
105
+ },
106
+ });
107
+ await backend.resume(sessionId, testPrompt);
108
+ try {
109
+ gitCommit(`test(${name}): task-${i + 1} ${task.name}`);
110
+ }
111
+ catch {
112
+ display.warn('No test changes to commit.');
113
+ }
114
+ }
115
+ // AI Review
116
+ display.info('Running AI review...');
117
+ const reviewPrompt = assemblePrompt({
118
+ templateName: 'review',
119
+ vars: {
120
+ git_diff: taskDiff,
121
+ task_content: taskSpec.raw,
122
+ },
123
+ agents: args.agents,
124
+ skills: args.skills,
125
+ });
126
+ const reviewResult = await backend.resume(sessionId, reviewPrompt);
127
+ sessionId = reviewResult.sessionId;
128
+ // Save review
129
+ fs.writeFileSync(state.reviewPath(name, i + 1), reviewResult.output, 'utf-8');
130
+ task.status = 'review_pending';
131
+ state.upsertFeature(feature);
132
+ // Present to user
133
+ console.log('\n' + reviewResult.output + '\n');
134
+ const { choice } = await inquirer.prompt([
135
+ {
136
+ type: 'list',
137
+ name: 'choice',
138
+ message: `Task ${i + 1} review:`,
139
+ choices: ['approve', 'request-change', 'add-test', 'skip'],
140
+ },
141
+ ]);
142
+ switch (choice) {
143
+ case 'approve':
144
+ task.status = 'complete';
145
+ state.upsertFeature(feature);
146
+ display.success(`Task ${i + 1} approved.`);
147
+ break;
148
+ case 'skip':
149
+ task.status = 'skipped';
150
+ state.upsertFeature(feature);
151
+ display.info(`Task ${i + 1} skipped.`);
152
+ break;
153
+ case 'request-change':
154
+ task.status = 'in_progress';
155
+ state.upsertFeature(feature);
156
+ display.info('Re-run `pxs implement` to retry this task.');
157
+ return;
158
+ case 'add-test':
159
+ display.info('Generating additional tests...');
160
+ task.status = 'complete';
161
+ state.upsertFeature(feature);
162
+ break;
163
+ }
164
+ }
165
+ // All tasks complete
166
+ const allDone = feature.tasks.every((t) => t.status === 'complete' || t.status === 'skipped');
167
+ if (allDone) {
168
+ feature.phase = 'completed';
169
+ state.upsertFeature(feature);
170
+ display.heading('All Tasks Complete');
171
+ for (const t of feature.tasks) {
172
+ console.log(` ${display.taskIcon(t.status)} ${t.name}`);
173
+ }
174
+ // Final branch code review
175
+ if (!options.skipReview) {
176
+ display.info('Running final branch code review...');
177
+ try {
178
+ const branchDiff = gitDiffBranch(baseBranch);
179
+ const specContent = fs.existsSync(state.specPath(name))
180
+ ? fs.readFileSync(state.specPath(name), 'utf-8')
181
+ : '(spec not found)';
182
+ const finalReviewPrompt = assemblePrompt({
183
+ templateName: 'final-review',
184
+ vars: {
185
+ branch_diff: branchDiff,
186
+ spec_content: specContent,
187
+ plan_content: planContent,
188
+ },
189
+ agents: args.agents,
190
+ skills: args.skills,
191
+ extraText: args.text,
192
+ });
193
+ const finalReviewResult = await backend.resume(sessionId, finalReviewPrompt);
194
+ sessionId = finalReviewResult.sessionId;
195
+ // Save final review
196
+ const finalReviewPath = path.join(state.reviewsDir(), `${name}-final.md`);
197
+ fs.writeFileSync(finalReviewPath, finalReviewResult.output, 'utf-8');
198
+ display.heading('Final Code Review');
199
+ console.log('\n' + finalReviewResult.output + '\n');
200
+ }
201
+ catch (err) {
202
+ display.warn(`Final review failed: ${err instanceof Error ? err.message : err}`);
203
+ }
204
+ }
205
+ const { merge } = await inquirer.prompt([
206
+ {
207
+ type: 'list',
208
+ name: 'merge',
209
+ message: 'What would you like to do?',
210
+ choices: ['merge', 'squash-merge', 'keep-branch'],
211
+ },
212
+ ]);
213
+ if (merge === 'merge' || merge === 'squash-merge') {
214
+ gitCheckout(baseBranch);
215
+ gitMerge(feature.branch, merge === 'squash-merge');
216
+ feature.phase = 'merged';
217
+ state.upsertFeature(feature);
218
+ display.success(`Merged ${feature.branch} into ${baseBranch}.`);
219
+ }
220
+ else {
221
+ display.info(`Branch ${feature.branch} kept. Merge manually when ready.`);
222
+ }
223
+ }
224
+ }
225
+ function getDiffSummary() {
226
+ try {
227
+ return gitDiff('HEAD~1');
228
+ }
229
+ catch {
230
+ return '(no previous diff available)';
231
+ }
232
+ }
233
+ function parseTestOptions(test) {
234
+ if (test === undefined || test === false) {
235
+ return { tdd: false, intg: false, postHoc: false };
236
+ }
237
+ if (test === true || (Array.isArray(test) && test.length === 0)) {
238
+ return { tdd: false, intg: false, postHoc: true };
239
+ }
240
+ const arr = test;
241
+ return {
242
+ tdd: arr.includes('tdd'),
243
+ intg: arr.includes('intg'),
244
+ postHoc: !arr.includes('tdd'),
245
+ };
246
+ }
247
+ //# sourceMappingURL=implement.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"implement.js","sourceRoot":"","sources":["../../../src/commands/implement.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export declare function resolveLangFramework(lang: string): string;
2
+ export declare function initCommand(options: {
3
+ force?: boolean;
4
+ arch?: string;
5
+ lang?: string;
6
+ }): Promise<void>;
@@ -0,0 +1,183 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import { fileURLToPath } from 'node:url';
4
+ import { detectProject } from '../discovery/project.js';
5
+ import * as display from '../utils/display.js';
6
+ const __dirname = path.dirname(fileURLToPath(import.meta.url));
7
+ // Walk up from __dirname to find the project root containing templates/
8
+ function findTemplatesDir() {
9
+ let dir = __dirname;
10
+ for (let i = 0; i < 5; i++) {
11
+ const candidate = path.join(dir, 'templates');
12
+ if (fs.existsSync(candidate))
13
+ return candidate;
14
+ dir = path.dirname(dir);
15
+ }
16
+ // Fallback: 3 levels up from dist/src/commands/ to package root
17
+ return path.resolve(__dirname, '..', '..', '..', 'templates');
18
+ }
19
+ const TEMPLATES_DIR = findTemplatesDir();
20
+ // Resolve shorthand --lang values to full lang_framework IDs
21
+ const LANG_SHORTHANDS = {
22
+ go: 'go-std',
23
+ typescript: 'typescript-express',
24
+ ts: 'typescript-express',
25
+ nestjs: 'typescript-nestjs',
26
+ express: 'typescript-express',
27
+ csharp: 'csharp-aspnet',
28
+ 'c#': 'csharp-aspnet',
29
+ dotnet: 'csharp-aspnet',
30
+ python: 'python-fastapi',
31
+ fastapi: 'python-fastapi',
32
+ django: 'python-django',
33
+ gin: 'go-gin',
34
+ chi: 'go-chi',
35
+ flutter: 'dart-flutter',
36
+ dart: 'dart-flutter',
37
+ ios: 'swift-ios',
38
+ swift: 'swift-ios',
39
+ android: 'kotlin-android',
40
+ kotlin: 'kotlin-android',
41
+ };
42
+ export function resolveLangFramework(lang) {
43
+ return LANG_SHORTHANDS[lang.toLowerCase()] ?? lang;
44
+ }
45
+ export async function initCommand(options) {
46
+ const cwd = process.cwd();
47
+ const workflowDir = path.join(cwd, '.workflow');
48
+ if (fs.existsSync(workflowDir) && !options.force) {
49
+ display.error('.workflow/ already exists. Use --force to overwrite.');
50
+ return;
51
+ }
52
+ display.heading('Initializing pxs workflow');
53
+ // Detect project
54
+ const project = detectProject(cwd);
55
+ display.info(`Detected: ${project.language || 'unknown'} / ${project.framework || 'unknown'}`);
56
+ // Create .workflow directories
57
+ const dirs = [
58
+ '.workflow/prompts',
59
+ '.workflow/templates',
60
+ '.workflow/specs',
61
+ '.workflow/plans',
62
+ '.workflow/reviews',
63
+ '.claude/commands',
64
+ ];
65
+ for (const dir of dirs) {
66
+ fs.mkdirSync(path.join(cwd, dir), { recursive: true });
67
+ }
68
+ // Copy workflow templates
69
+ copyDir(path.join(TEMPLATES_DIR, 'workflow'), workflowDir);
70
+ // Resolve architecture and lang_framework
71
+ const architecture = options.arch ?? 'none';
72
+ const langFramework = options.lang
73
+ ? resolveLangFramework(options.lang)
74
+ : project.lang_framework;
75
+ // Handle --arch: copy architecture template to .workflow/architecture.md
76
+ if (options.arch) {
77
+ const archMdPath = path.join(workflowDir, 'architecture.md');
78
+ if (options.arch === 'custom') {
79
+ // For custom, the next positional arg would be a path — but Commander captures it as the arch value.
80
+ // Actually, `--arch custom` means the user provides a separate file. We check process.argv for a path after 'custom'.
81
+ const customPath = findCustomArchPath();
82
+ if (customPath && fs.existsSync(customPath)) {
83
+ fs.copyFileSync(customPath, archMdPath);
84
+ display.success(`Copied custom architecture from ${customPath}`);
85
+ }
86
+ else {
87
+ display.error('Custom architecture file not found. Usage: pxs init --arch custom <path>');
88
+ }
89
+ }
90
+ else {
91
+ // Look up template: templates/architectures/<arch>/<lang_framework>.md
92
+ const templatePath = path.join(TEMPLATES_DIR, 'architectures', options.arch, `${langFramework}.md`);
93
+ if (fs.existsSync(templatePath)) {
94
+ fs.copyFileSync(templatePath, archMdPath);
95
+ display.success(`Architecture: ${options.arch} (${langFramework})`);
96
+ }
97
+ else {
98
+ display.error(`Architecture template not found: ${options.arch}/${langFramework}.md — skipping architecture.md`);
99
+ const archDir = path.join(TEMPLATES_DIR, 'architectures', options.arch);
100
+ if (fs.existsSync(archDir)) {
101
+ const available = fs.readdirSync(archDir).filter(f => f.endsWith('.md')).map(f => f.replace('.md', ''));
102
+ if (available.length > 0) {
103
+ display.info(`Available: ${available.join(', ')}`);
104
+ }
105
+ }
106
+ }
107
+ }
108
+ }
109
+ // Substitute project info in config.yaml
110
+ const configPath = path.join(workflowDir, 'config.yaml');
111
+ if (fs.existsSync(configPath)) {
112
+ let config = fs.readFileSync(configPath, 'utf-8');
113
+ config = config.replace(/name: ""/, `name: "${project.name}"`);
114
+ config = config.replace(/language: ""/, `language: "${project.language}"`);
115
+ config = config.replace(/framework: ""/, `framework: "${project.framework}"`);
116
+ config = config.replace(/architecture: none/, `architecture: ${architecture}`);
117
+ config = config.replace(/lang_framework: ""/, `lang_framework: "${langFramework}"`);
118
+ fs.writeFileSync(configPath, config, 'utf-8');
119
+ }
120
+ // Copy claude commands (rename sf.* to pxs.*)
121
+ const claudeCommandsDir = path.join(TEMPLATES_DIR, 'claude-commands');
122
+ const targetCommandsDir = path.join(cwd, '.claude', 'commands');
123
+ if (fs.existsSync(claudeCommandsDir)) {
124
+ const files = fs.readdirSync(claudeCommandsDir);
125
+ for (const file of files) {
126
+ const targetName = file.replace(/^sf\./, 'pxs.');
127
+ fs.copyFileSync(path.join(claudeCommandsDir, file), path.join(targetCommandsDir, targetName));
128
+ }
129
+ }
130
+ // Append to AGENTS.md
131
+ const agentsSnippetPath = path.join(TEMPLATES_DIR, 'agents-md-snippet.md');
132
+ if (fs.existsSync(agentsSnippetPath)) {
133
+ const snippet = fs.readFileSync(agentsSnippetPath, 'utf-8');
134
+ const agentsPath = path.join(cwd, 'AGENTS.md');
135
+ if (fs.existsSync(agentsPath)) {
136
+ const existing = fs.readFileSync(agentsPath, 'utf-8');
137
+ if (!existing.includes('SF Spec-Driven Workflow')) {
138
+ fs.appendFileSync(agentsPath, '\n\n' + snippet, 'utf-8');
139
+ }
140
+ }
141
+ else {
142
+ fs.writeFileSync(agentsPath, snippet, 'utf-8');
143
+ }
144
+ }
145
+ display.success('Created .workflow/ directory structure');
146
+ display.success('Created .claude/commands/pxs.*.md slash commands');
147
+ display.success('Created AGENTS.md');
148
+ display.info('Run `pxs new <name>` to create your first spec.');
149
+ }
150
+ /**
151
+ * Find the custom architecture file path from process.argv.
152
+ * When user runs: pxs init --arch custom ./my-arch.md
153
+ * Commander captures "custom" as --arch value, but the file path remains in argv.
154
+ */
155
+ function findCustomArchPath() {
156
+ const argv = process.argv;
157
+ const archIdx = argv.findIndex((a) => a === '--arch');
158
+ // The path should be 2 positions after --arch (--arch custom <path>)
159
+ if (archIdx >= 0 && archIdx + 2 < argv.length) {
160
+ const candidate = argv[archIdx + 2];
161
+ if (candidate && !candidate.startsWith('-')) {
162
+ return path.resolve(candidate);
163
+ }
164
+ }
165
+ return undefined;
166
+ }
167
+ function copyDir(src, dest) {
168
+ if (!fs.existsSync(src))
169
+ return;
170
+ fs.mkdirSync(dest, { recursive: true });
171
+ const entries = fs.readdirSync(src, { withFileTypes: true });
172
+ for (const entry of entries) {
173
+ const srcPath = path.join(src, entry.name);
174
+ const destPath = path.join(dest, entry.name);
175
+ if (entry.isDirectory()) {
176
+ copyDir(srcPath, destPath);
177
+ }
178
+ else {
179
+ fs.copyFileSync(srcPath, destPath);
180
+ }
181
+ }
182
+ }
183
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/commands/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export declare function newCommand(name: string, options: {
2
+ desc?: string;
3
+ jira?: string[];
4
+ interactive?: boolean;
5
+ }): Promise<void>;