@planu/cli 5.3.63 → 5.3.64

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 (50) hide show
  1. package/CHANGELOG.md +29 -0
  2. package/dist/.planu-build.json +1 -1
  3. package/dist/cli/commands/create.js +3 -16
  4. package/dist/cli/commands/dashboard.js +2 -16
  5. package/dist/cli/commands/init.js +2 -16
  6. package/dist/cli/commands/spec.js +5 -36
  7. package/dist/cli/commands/status.js +5 -28
  8. package/dist/cli/formatter.d.ts +7 -1
  9. package/dist/cli/formatter.js +49 -6
  10. package/dist/engine/cascade-hooks/hooks/implementing-kickoff.hook.js +38 -6
  11. package/dist/engine/dor-dod/index.d.ts +1 -1
  12. package/dist/engine/dor-dod/index.js +1 -1
  13. package/dist/engine/dor-dod/plan.d.ts +1 -0
  14. package/dist/engine/dor-dod/plan.js +2 -0
  15. package/dist/engine/evidence-gates/artifact-reader.js +1 -0
  16. package/dist/engine/evidence-gates/evidence-skeletons.js +1 -0
  17. package/dist/engine/execution-plan/plan-utils.d.ts +2 -6
  18. package/dist/engine/execution-plan/plan-utils.js +71 -37
  19. package/dist/engine/handoff-artifacts/implementation-review-reader.d.ts +4 -0
  20. package/dist/engine/handoff-artifacts/implementation-review-reader.js +72 -0
  21. package/dist/engine/validator/dor-dod.d.ts +2 -2
  22. package/dist/engine/validator/dor-dod.js +5 -4
  23. package/dist/tools/challenge-spec/resilience-challenge-scenarios-a.d.ts +2 -4
  24. package/dist/tools/challenge-spec/resilience-challenge-scenarios-a.js +24 -24
  25. package/dist/tools/challenge-spec/resilience-challenge-scenarios.js +1 -1
  26. package/dist/tools/challenge-spec/scenarios-failure.js +1 -2
  27. package/dist/tools/challenge-spec/scenarios-utils.d.ts +3 -0
  28. package/dist/tools/challenge-spec/scenarios-utils.js +16 -0
  29. package/dist/tools/challenge-spec-helpers.d.ts +1 -1
  30. package/dist/tools/challenge-spec-helpers.js +5 -2
  31. package/dist/tools/challenge-spec.js +5 -2
  32. package/dist/tools/create-spec.js +18 -0
  33. package/dist/tools/generate-execution-plan.js +160 -54
  34. package/dist/tools/update-status/dod-gates.js +46 -64
  35. package/dist/tools/update-status/side-effects.d.ts +4 -0
  36. package/dist/tools/update-status/side-effects.js +45 -4
  37. package/dist/tools/validate.js +8 -4
  38. package/dist/transports/transport-factory.js +13 -0
  39. package/dist/types/cli.d.ts +3 -0
  40. package/dist/types/evidence-gates.d.ts +2 -0
  41. package/dist/types/execution.d.ts +5 -0
  42. package/dist/types/handoff-artifacts.d.ts +19 -0
  43. package/dist/types/index.d.ts +1 -0
  44. package/package.json +1 -1
  45. package/planu-plugin.json +1 -1
  46. package/scripts/lib/portable-paths.mjs +1 -0
  47. package/dist/engine/execution-plan/phases-b.d.ts +0 -4
  48. package/dist/engine/execution-plan/phases-b.js +0 -88
  49. package/dist/engine/execution-plan/phases.d.ts +0 -7
  50. package/dist/engine/execution-plan/phases.js +0 -216
@@ -1,216 +0,0 @@
1
- import { technologyValue } from '../technology-registry.js';
2
- import { inferDataLayerFiles, inferServiceFiles, inferApiFiles, inferPageFiles, inferComponentFiles, } from './plan-utils.js';
3
- export { generateTestingPhase, generateIntegrationPhase } from './phases-b.js';
4
- export function generateSetupPhase(spec, knowledge, startOrder) {
5
- const steps = [];
6
- let order = startOrder;
7
- steps.push({
8
- order: order++,
9
- title: 'Create feature branch',
10
- description: `Create branch from main: ${spec.gitBranch || `feature/${spec.slug}`}`,
11
- files: [],
12
- dependsOn: [],
13
- verification: `Branch exists and is checked out: git branch --show-current`,
14
- estimatedMinutes: 2,
15
- canRollback: true,
16
- });
17
- if (knowledge.language === technologyValue('technology-typescript-969545') ||
18
- knowledge.language === 'javascript') {
19
- steps.push({
20
- order: order++,
21
- title: 'Define types and interfaces',
22
- description: 'Create TypeScript interfaces for the new entities and API contracts',
23
- files: [`src/types/${spec.slug}.ts`],
24
- dependsOn: [startOrder],
25
- verification: 'TypeScript compiles without errors: npm run build',
26
- estimatedMinutes: 15,
27
- canRollback: true,
28
- });
29
- }
30
- if (spec.scope === 'cross-module' || spec.scope === 'architectural') {
31
- steps.push({
32
- order: order,
33
- title: 'Update project configuration',
34
- description: 'Add new configuration entries, feature flags, or environment variables',
35
- files: ['.env.example'],
36
- dependsOn: [startOrder],
37
- verification: 'Configuration values are documented and have defaults',
38
- estimatedMinutes: 10,
39
- canRollback: true,
40
- });
41
- }
42
- return steps;
43
- }
44
- export function generateDataLayerPhase(spec, knowledge, content, startOrder) {
45
- const steps = [];
46
- let order = startOrder;
47
- const lower = content.toLowerCase();
48
- if (lower.includes('table') ||
49
- lower.includes('schema') ||
50
- lower.includes('model') ||
51
- lower.includes('entity') ||
52
- lower.includes('migration') ||
53
- knowledge.database !== 'unknown') {
54
- steps.push({
55
- order: order++,
56
- title: 'Create database migration',
57
- description: `Create migration for new tables/columns in ${knowledge.database}`,
58
- files: [`migrations/${spec.slug}.sql`],
59
- dependsOn: [startOrder - 1],
60
- verification: 'Migration runs successfully: apply and rollback both work',
61
- estimatedMinutes: 20,
62
- canRollback: true,
63
- });
64
- steps.push({
65
- order: order++,
66
- title: 'Run migration on development database',
67
- description: 'Apply migration and verify schema changes',
68
- files: [],
69
- dependsOn: [order - 2],
70
- verification: 'Database schema matches expected state',
71
- estimatedMinutes: 5,
72
- canRollback: true,
73
- });
74
- }
75
- const lastStep = steps[steps.length - 1];
76
- steps.push({
77
- order: order++,
78
- title: 'Implement data access layer',
79
- description: 'Create repository/model functions for CRUD operations',
80
- files: inferDataLayerFiles(spec, knowledge),
81
- dependsOn: lastStep ? [lastStep.order] : [startOrder - 1],
82
- verification: 'Data access functions compile. Write unit tests for basic CRUD.',
83
- estimatedMinutes: 30,
84
- canRollback: true,
85
- });
86
- if (lower.includes('seed') || lower.includes('fixture') || lower.includes('sample data')) {
87
- steps.push({
88
- order: order++,
89
- title: 'Create seed data',
90
- description: 'Add seed/fixture data for development and testing',
91
- files: [`seeds/${spec.slug}.ts`],
92
- dependsOn: [order - 2],
93
- verification: 'Seed command runs without errors',
94
- estimatedMinutes: 15,
95
- canRollback: true,
96
- });
97
- }
98
- return steps;
99
- }
100
- export function generateBusinessLogicPhase(spec, knowledge, content, startOrder) {
101
- const steps = [];
102
- let order = startOrder;
103
- const lower = content.toLowerCase();
104
- steps.push({
105
- order: order++,
106
- title: 'Implement business logic',
107
- description: 'Create service/use-case functions with core domain logic',
108
- files: inferServiceFiles(spec, knowledge),
109
- dependsOn: [startOrder - 1],
110
- verification: 'Business logic functions pass unit tests with valid and invalid inputs',
111
- estimatedMinutes: 45,
112
- canRollback: true,
113
- });
114
- if (lower.includes('validat') || lower.includes('input') || lower.includes('form')) {
115
- steps.push({
116
- order: order++,
117
- title: 'Implement input validation',
118
- description: 'Add validation schemas for all inputs (Zod/Joi/class-validator)',
119
- files: [`src/validators/${spec.slug}.ts`],
120
- dependsOn: [startOrder],
121
- verification: 'Validation rejects invalid inputs with clear error messages',
122
- estimatedMinutes: 20,
123
- canRollback: true,
124
- });
125
- }
126
- if (lower.includes('api') ||
127
- lower.includes('endpoint') ||
128
- lower.includes('route') ||
129
- spec.target === 'backend' ||
130
- spec.target === 'fullstack') {
131
- steps.push({
132
- order: order++,
133
- title: 'Create API endpoints',
134
- description: 'Implement REST/GraphQL/tRPC endpoints with request handling',
135
- files: inferApiFiles(spec, knowledge),
136
- dependsOn: [startOrder],
137
- verification: 'Endpoints respond correctly: test with curl or HTTP client',
138
- estimatedMinutes: 30,
139
- canRollback: true,
140
- });
141
- }
142
- steps.push({
143
- order: order++,
144
- title: 'Add error handling',
145
- description: 'Implement structured error handling, logging, and error responses',
146
- files: [],
147
- dependsOn: [order - 2],
148
- verification: 'Error cases return proper status codes and error messages',
149
- estimatedMinutes: 15,
150
- canRollback: true,
151
- });
152
- return steps;
153
- }
154
- export function generateUIPhase(spec, knowledge, content, startOrder) {
155
- const steps = [];
156
- let order = startOrder;
157
- const lower = content.toLowerCase();
158
- const framework = knowledge.framework ?? technologyValue('technology-react-275976');
159
- steps.push({
160
- order: order++,
161
- title: 'Create page layout and routing',
162
- description: `Set up page structure and routes in ${framework}`,
163
- files: inferPageFiles(spec, knowledge),
164
- dependsOn: [startOrder - 1],
165
- verification: 'Page renders without errors. Route is accessible.',
166
- estimatedMinutes: 20,
167
- canRollback: true,
168
- });
169
- steps.push({
170
- order: order++,
171
- title: 'Build UI components',
172
- description: 'Implement reusable components (forms, lists, cards, etc.)',
173
- files: inferComponentFiles(spec, knowledge),
174
- dependsOn: [startOrder],
175
- verification: 'Components render correctly with mock data',
176
- estimatedMinutes: 45,
177
- canRollback: true,
178
- });
179
- steps.push({
180
- order: order++,
181
- title: 'Connect data fetching',
182
- description: 'Wire components to API, add loading and error states',
183
- files: [],
184
- dependsOn: [order - 2, order - 1],
185
- verification: 'Data loads from API. Loading spinners show. Errors display correctly.',
186
- estimatedMinutes: 30,
187
- canRollback: true,
188
- });
189
- if (lower.includes('form') ||
190
- lower.includes('create') ||
191
- lower.includes('edit') ||
192
- lower.includes('input')) {
193
- steps.push({
194
- order: order++,
195
- title: 'Implement form handling and validation',
196
- description: 'Add form state management, client-side validation, and submission',
197
- files: [],
198
- dependsOn: [order - 2],
199
- verification: 'Form submits successfully. Validation errors show inline. Submit button disables during submission.',
200
- estimatedMinutes: 25,
201
- canRollback: true,
202
- });
203
- }
204
- steps.push({
205
- order: order++,
206
- title: 'Add responsive design and accessibility',
207
- description: 'Ensure UI works on mobile, tablet, and desktop. Add ARIA labels.',
208
- files: [],
209
- dependsOn: [order - 2],
210
- verification: 'UI passes basic responsive checks. No accessibility violations on axe/Lighthouse.',
211
- estimatedMinutes: 20,
212
- canRollback: true,
213
- });
214
- return steps;
215
- }
216
- //# sourceMappingURL=phases.js.map