ai-sdlc 0.1.0-alpha.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 (96) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +847 -0
  3. package/dist/agents/implementation.d.ts +11 -0
  4. package/dist/agents/implementation.d.ts.map +1 -0
  5. package/dist/agents/implementation.js +123 -0
  6. package/dist/agents/implementation.js.map +1 -0
  7. package/dist/agents/index.d.ts +7 -0
  8. package/dist/agents/index.d.ts.map +1 -0
  9. package/dist/agents/index.js +8 -0
  10. package/dist/agents/index.js.map +1 -0
  11. package/dist/agents/planning.d.ts +9 -0
  12. package/dist/agents/planning.d.ts.map +1 -0
  13. package/dist/agents/planning.js +84 -0
  14. package/dist/agents/planning.js.map +1 -0
  15. package/dist/agents/refinement.d.ts +10 -0
  16. package/dist/agents/refinement.d.ts.map +1 -0
  17. package/dist/agents/refinement.js +98 -0
  18. package/dist/agents/refinement.js.map +1 -0
  19. package/dist/agents/research.d.ts +16 -0
  20. package/dist/agents/research.d.ts.map +1 -0
  21. package/dist/agents/research.js +141 -0
  22. package/dist/agents/research.js.map +1 -0
  23. package/dist/agents/review.d.ts +24 -0
  24. package/dist/agents/review.d.ts.map +1 -0
  25. package/dist/agents/review.js +740 -0
  26. package/dist/agents/review.js.map +1 -0
  27. package/dist/agents/rework.d.ts +17 -0
  28. package/dist/agents/rework.d.ts.map +1 -0
  29. package/dist/agents/rework.js +139 -0
  30. package/dist/agents/rework.js.map +1 -0
  31. package/dist/agents/state-assessor.d.ts +21 -0
  32. package/dist/agents/state-assessor.d.ts.map +1 -0
  33. package/dist/agents/state-assessor.js +29 -0
  34. package/dist/agents/state-assessor.js.map +1 -0
  35. package/dist/cli/commands.d.ts +87 -0
  36. package/dist/cli/commands.d.ts.map +1 -0
  37. package/dist/cli/commands.js +1183 -0
  38. package/dist/cli/commands.js.map +1 -0
  39. package/dist/cli/formatting.d.ts +68 -0
  40. package/dist/cli/formatting.d.ts.map +1 -0
  41. package/dist/cli/formatting.js +194 -0
  42. package/dist/cli/formatting.js.map +1 -0
  43. package/dist/cli/runner.d.ts +57 -0
  44. package/dist/cli/runner.d.ts.map +1 -0
  45. package/dist/cli/runner.js +272 -0
  46. package/dist/cli/runner.js.map +1 -0
  47. package/dist/cli/story-utils.d.ts +19 -0
  48. package/dist/cli/story-utils.d.ts.map +1 -0
  49. package/dist/cli/story-utils.js +44 -0
  50. package/dist/cli/story-utils.js.map +1 -0
  51. package/dist/cli/table-renderer.d.ts +22 -0
  52. package/dist/cli/table-renderer.d.ts.map +1 -0
  53. package/dist/cli/table-renderer.js +159 -0
  54. package/dist/cli/table-renderer.js.map +1 -0
  55. package/dist/core/auth.d.ts +39 -0
  56. package/dist/core/auth.d.ts.map +1 -0
  57. package/dist/core/auth.js +128 -0
  58. package/dist/core/auth.js.map +1 -0
  59. package/dist/core/client.d.ts +73 -0
  60. package/dist/core/client.d.ts.map +1 -0
  61. package/dist/core/client.js +140 -0
  62. package/dist/core/client.js.map +1 -0
  63. package/dist/core/config.d.ts +48 -0
  64. package/dist/core/config.d.ts.map +1 -0
  65. package/dist/core/config.js +330 -0
  66. package/dist/core/config.js.map +1 -0
  67. package/dist/core/kanban.d.ts +34 -0
  68. package/dist/core/kanban.d.ts.map +1 -0
  69. package/dist/core/kanban.js +253 -0
  70. package/dist/core/kanban.js.map +1 -0
  71. package/dist/core/story.d.ts +91 -0
  72. package/dist/core/story.d.ts.map +1 -0
  73. package/dist/core/story.js +349 -0
  74. package/dist/core/story.js.map +1 -0
  75. package/dist/core/theme.d.ts +17 -0
  76. package/dist/core/theme.d.ts.map +1 -0
  77. package/dist/core/theme.js +136 -0
  78. package/dist/core/theme.js.map +1 -0
  79. package/dist/core/workflow-state.d.ts +56 -0
  80. package/dist/core/workflow-state.d.ts.map +1 -0
  81. package/dist/core/workflow-state.js +162 -0
  82. package/dist/core/workflow-state.js.map +1 -0
  83. package/dist/index.d.ts +3 -0
  84. package/dist/index.d.ts.map +1 -0
  85. package/dist/index.js +103 -0
  86. package/dist/index.js.map +1 -0
  87. package/dist/types/index.d.ts +228 -0
  88. package/dist/types/index.d.ts.map +1 -0
  89. package/dist/types/index.js +38 -0
  90. package/dist/types/index.js.map +1 -0
  91. package/dist/types/workflow-state.d.ts +54 -0
  92. package/dist/types/workflow-state.d.ts.map +1 -0
  93. package/dist/types/workflow-state.js +5 -0
  94. package/dist/types/workflow-state.js.map +1 -0
  95. package/package.json +71 -0
  96. package/templates/story.md +35 -0
@@ -0,0 +1,272 @@
1
+ import ora from 'ora';
2
+ import { getSdlcRoot, loadConfig, isStageGateEnabled } from '../core/config.js';
3
+ import { assessState, kanbanExists } from '../core/kanban.js';
4
+ import { parseStory, resetRPIVCycle, markStoryComplete, moveStory, isAtMaxRetries } from '../core/story.js';
5
+ import { ReviewDecision } from '../types/index.js';
6
+ import { runRefinementAgent } from '../agents/refinement.js';
7
+ import { runResearchAgent } from '../agents/research.js';
8
+ import { runPlanningAgent } from '../agents/planning.js';
9
+ import { runImplementationAgent } from '../agents/implementation.js';
10
+ import { runReviewAgent, createPullRequest } from '../agents/review.js';
11
+ import { runReworkAgent, packageReworkContext } from '../agents/rework.js';
12
+ import { getThemedChalk } from '../core/theme.js';
13
+ /**
14
+ * Workflow Runner
15
+ *
16
+ * Orchestrates the execution of the SDLC workflow, processing actions
17
+ * according to priority and respecting stage gates.
18
+ */
19
+ export class WorkflowRunner {
20
+ sdlcRoot;
21
+ options;
22
+ constructor(options = {}) {
23
+ this.sdlcRoot = getSdlcRoot();
24
+ this.options = options;
25
+ }
26
+ /**
27
+ * Run the workflow
28
+ */
29
+ async run() {
30
+ const config = loadConfig();
31
+ const c = getThemedChalk(config);
32
+ if (!kanbanExists(this.sdlcRoot)) {
33
+ console.log(c.warning('agentic-sdlc not initialized. Run `agentic-sdlc init` first.'));
34
+ return;
35
+ }
36
+ const assessment = assessState(this.sdlcRoot);
37
+ if (assessment.recommendedActions.length === 0) {
38
+ console.log(c.success('No pending actions. Board is up to date!'));
39
+ return;
40
+ }
41
+ if (this.options.dryRun) {
42
+ this.showDryRun(assessment);
43
+ return;
44
+ }
45
+ await this.processActions(assessment);
46
+ }
47
+ /**
48
+ * Show what would be done in dry run mode
49
+ */
50
+ showDryRun(assessment) {
51
+ const config = loadConfig();
52
+ const c = getThemedChalk(config);
53
+ console.log(c.info('Dry run - would execute:'));
54
+ const actionsToShow = this.options.auto
55
+ ? assessment.recommendedActions
56
+ : [assessment.recommendedActions[0]];
57
+ for (const action of actionsToShow) {
58
+ console.log(` ${this.formatAction(action)}`);
59
+ }
60
+ }
61
+ /**
62
+ * Process actions according to mode
63
+ */
64
+ async processActions(assessment) {
65
+ if (this.options.auto) {
66
+ await this.runAutoMode(assessment);
67
+ }
68
+ else {
69
+ await this.runSingleAction(assessment.recommendedActions[0]);
70
+ }
71
+ }
72
+ /**
73
+ * Run all actions until completion
74
+ */
75
+ async runAutoMode(initialAssessment) {
76
+ const config = loadConfig();
77
+ const c = getThemedChalk(config);
78
+ let assessment = initialAssessment;
79
+ let actionsProcessed = 0;
80
+ const maxActions = 100; // Safety limit
81
+ while (assessment.recommendedActions.length > 0 && actionsProcessed < maxActions) {
82
+ const action = assessment.recommendedActions[0];
83
+ // Check stage gates
84
+ if (await this.checkStageGate(action)) {
85
+ console.log(c.warning(`Stage gate requires approval for: ${this.formatAction(action)}`));
86
+ console.log(c.dim('Run without --auto to process with approval prompts.'));
87
+ break;
88
+ }
89
+ await this.runSingleAction(action);
90
+ actionsProcessed++;
91
+ // Re-assess after each action
92
+ assessment = assessState(this.sdlcRoot);
93
+ }
94
+ if (actionsProcessed >= maxActions) {
95
+ console.log(c.warning(`\nReached maximum actions limit (${maxActions}). Stopping.`));
96
+ }
97
+ else if (assessment.recommendedActions.length === 0) {
98
+ console.log(c.success('\nAll actions completed!'));
99
+ }
100
+ console.log(c.dim(`\nProcessed ${actionsProcessed} action(s).`));
101
+ }
102
+ /**
103
+ * Run a single action
104
+ */
105
+ async runSingleAction(action) {
106
+ const config = loadConfig();
107
+ const c = getThemedChalk(config);
108
+ const spinner = ora(this.formatAction(action)).start();
109
+ try {
110
+ const result = await this.executeAction(action);
111
+ if (result.success) {
112
+ spinner.succeed(c.success(this.formatAction(action)));
113
+ if (this.options.verbose && result.changesMade.length > 0) {
114
+ for (const change of result.changesMade) {
115
+ console.log(c.dim(` → ${change}`));
116
+ }
117
+ }
118
+ }
119
+ else {
120
+ spinner.fail(c.error(`Failed: ${this.formatAction(action)}`));
121
+ if (result.error) {
122
+ console.log(c.error(` Error: ${result.error}`));
123
+ }
124
+ }
125
+ }
126
+ catch (error) {
127
+ spinner.fail(c.error(`Failed: ${this.formatAction(action)}`));
128
+ console.error(error);
129
+ }
130
+ }
131
+ /**
132
+ * Execute a specific action
133
+ */
134
+ async executeAction(action) {
135
+ const config = loadConfig();
136
+ switch (action.type) {
137
+ case 'refine':
138
+ return runRefinementAgent(action.storyPath, this.sdlcRoot);
139
+ case 'research':
140
+ return runResearchAgent(action.storyPath, this.sdlcRoot);
141
+ case 'plan':
142
+ return runPlanningAgent(action.storyPath, this.sdlcRoot);
143
+ case 'implement':
144
+ return runImplementationAgent(action.storyPath, this.sdlcRoot);
145
+ case 'review': {
146
+ const reviewResult = await runReviewAgent(action.storyPath, this.sdlcRoot);
147
+ // Handle review decision (auto-complete or restart RPIV)
148
+ if (reviewResult.success) {
149
+ await this.handleReviewDecision(action.storyPath, reviewResult);
150
+ }
151
+ return reviewResult;
152
+ }
153
+ case 'rework': {
154
+ // Get rework context from action
155
+ const reworkContext = action.context;
156
+ if (!reworkContext || !reworkContext.targetPhase) {
157
+ throw new Error('Rework action missing required context (targetPhase)');
158
+ }
159
+ // Run rework agent to prepare the story for refinement
160
+ const reworkResult = await runReworkAgent(action.storyPath, this.sdlcRoot, reworkContext);
161
+ // If rework setup succeeded, automatically trigger the target phase agent
162
+ if (reworkResult.success) {
163
+ const c = getThemedChalk(config);
164
+ console.log(c.info(`\n ↳ Triggering ${reworkContext.targetPhase} agent for refinement...`));
165
+ // Package the review feedback as context for the agent
166
+ const story = parseStory(action.storyPath);
167
+ const agentReworkContext = packageReworkContext(story, reworkContext.reviewFeedback);
168
+ // Execute the appropriate agent based on target phase, passing the rework context
169
+ switch (reworkContext.targetPhase) {
170
+ case 'research':
171
+ return runResearchAgent(action.storyPath, this.sdlcRoot, { reworkContext: agentReworkContext });
172
+ case 'plan':
173
+ return runPlanningAgent(action.storyPath, this.sdlcRoot, { reworkContext: agentReworkContext });
174
+ case 'implement':
175
+ return runImplementationAgent(action.storyPath, this.sdlcRoot, { reworkContext: agentReworkContext });
176
+ default:
177
+ throw new Error(`Unknown target phase: ${reworkContext.targetPhase}`);
178
+ }
179
+ }
180
+ return reworkResult;
181
+ }
182
+ case 'create_pr':
183
+ return createPullRequest(action.storyPath, this.sdlcRoot);
184
+ default:
185
+ throw new Error(`Unknown action type: ${action.type}`);
186
+ }
187
+ }
188
+ /**
189
+ * Handle review decision - auto-complete on approval, restart RPIV on rejection
190
+ */
191
+ async handleReviewDecision(storyPath, reviewResult) {
192
+ const config = loadConfig();
193
+ const c = getThemedChalk(config);
194
+ let story = parseStory(storyPath);
195
+ if (reviewResult.decision === ReviewDecision.APPROVED) {
196
+ // Auto-complete on approval
197
+ if (config.reviewConfig.autoCompleteOnApproval) {
198
+ console.log(c.success(`\n✅ Review approved! Auto-completing story "${story.frontmatter.title}"`));
199
+ markStoryComplete(story);
200
+ // Move to done if in in-progress
201
+ if (story.frontmatter.status === 'in-progress') {
202
+ story = moveStory(story, 'done', this.sdlcRoot);
203
+ console.log(c.success(`Moved story to done/`));
204
+ }
205
+ }
206
+ }
207
+ else if (reviewResult.decision === ReviewDecision.REJECTED) {
208
+ // Auto-restart RPIV cycle on rejection
209
+ if (config.reviewConfig.autoRestartOnRejection) {
210
+ // Reload story to get latest state
211
+ story = parseStory(storyPath);
212
+ // Check if at max retries
213
+ if (isAtMaxRetries(story, config)) {
214
+ const retryCount = story.frontmatter.retry_count || 0;
215
+ console.log(c.error(`\n⚠️ Story "${story.frontmatter.title}" has reached max retries (${retryCount})`));
216
+ console.log(c.warning('Manual intervention required. Use appropriate commands to reset or fix the story.'));
217
+ return;
218
+ }
219
+ // Reset RPIV cycle
220
+ const retryCount = (story.frontmatter.retry_count || 0) + 1;
221
+ const maxRetries = story.frontmatter.max_retries ?? config.reviewConfig.maxRetries;
222
+ const maxRetriesDisplay = Number.isFinite(maxRetries) ? maxRetries : '∞';
223
+ console.log(c.warning(`\n🔄 Review rejected. Restarting RPIV cycle (attempt ${retryCount}/${maxRetriesDisplay})`));
224
+ console.log(c.dim(`Reason: ${reviewResult.feedback.substring(0, 200)}...`));
225
+ resetRPIVCycle(story, reviewResult.feedback);
226
+ console.log(c.info('RPIV cycle reset. Planning phase will restart on next run.'));
227
+ }
228
+ }
229
+ else if (reviewResult.decision === ReviewDecision.FAILED) {
230
+ // Review agent failed - don't increment retry count
231
+ console.log(c.error(`\n❌ Review process failed: ${reviewResult.error}`));
232
+ console.log(c.warning('This does not count as a retry attempt. You can retry manually.'));
233
+ }
234
+ }
235
+ /**
236
+ * Check if a stage gate requires approval
237
+ */
238
+ async checkStageGate(action) {
239
+ if (action.type === 'implement' && isStageGateEnabled('requireApprovalBeforeImplementation')) {
240
+ return true;
241
+ }
242
+ if (action.type === 'create_pr' && isStageGateEnabled('requireApprovalBeforePR')) {
243
+ return true;
244
+ }
245
+ return false;
246
+ }
247
+ /**
248
+ * Format an action for display
249
+ */
250
+ formatAction(action) {
251
+ const actionVerbs = {
252
+ refine: 'Refining',
253
+ research: 'Researching',
254
+ plan: 'Planning',
255
+ implement: 'Implementing',
256
+ review: 'Reviewing',
257
+ rework: 'Reworking',
258
+ create_pr: 'Creating PR for',
259
+ move_to_done: 'Moving to done',
260
+ };
261
+ const storySlug = action.storyPath.split('/').pop()?.replace('.md', '') || action.storyId;
262
+ return `${actionVerbs[action.type]} "${storySlug}"`;
263
+ }
264
+ }
265
+ /**
266
+ * Create and run the workflow
267
+ */
268
+ export async function runWorkflow(options = {}) {
269
+ const runner = new WorkflowRunner(options);
270
+ await runner.run();
271
+ }
272
+ //# sourceMappingURL=runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/cli/runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import { Story, ThemeColors } from '../types/index.js';
2
+ /**
3
+ * Get story flags for display
4
+ * Shows which workflow phases are complete
5
+ *
6
+ * @param story - The story to get flags for
7
+ * @param c - Themed chalk instance
8
+ * @returns Formatted flags string (e.g., "[RPIV!]")
9
+ */
10
+ export declare function getStoryFlags(story: Story, c: ThemeColors): string;
11
+ /**
12
+ * Format status with appropriate color
13
+ *
14
+ * @param status - Status string (backlog, ready, in-progress, done)
15
+ * @param c - Themed chalk instance
16
+ * @returns Colored status string
17
+ */
18
+ export declare function formatStatus(status: string, c: ThemeColors): string;
19
+ //# sourceMappingURL=story-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"story-utils.d.ts","sourceRoot":"","sources":["../../src/cli/story-utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEvD;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,WAAW,GAAG,MAAM,CAUlE;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,WAAW,GAAG,MAAM,CAanE"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Get story flags for display
3
+ * Shows which workflow phases are complete
4
+ *
5
+ * @param story - The story to get flags for
6
+ * @param c - Themed chalk instance
7
+ * @returns Formatted flags string (e.g., "[RPIV!]")
8
+ */
9
+ export function getStoryFlags(story, c) {
10
+ const flags = [];
11
+ if (story.frontmatter.research_complete)
12
+ flags.push('R');
13
+ if (story.frontmatter.plan_complete)
14
+ flags.push('P');
15
+ if (story.frontmatter.implementation_complete)
16
+ flags.push('I');
17
+ if (story.frontmatter.reviews_complete)
18
+ flags.push('V');
19
+ if (story.frontmatter.last_error)
20
+ flags.push('!');
21
+ return flags.length > 0 ? `[${flags.join('')}]` : '';
22
+ }
23
+ /**
24
+ * Format status with appropriate color
25
+ *
26
+ * @param status - Status string (backlog, ready, in-progress, done)
27
+ * @param c - Themed chalk instance
28
+ * @returns Colored status string
29
+ */
30
+ export function formatStatus(status, c) {
31
+ switch (status) {
32
+ case 'backlog':
33
+ return c.backlog(status);
34
+ case 'ready':
35
+ return c.ready(status);
36
+ case 'in-progress':
37
+ return c.inProgress(status);
38
+ case 'done':
39
+ return c.done(status);
40
+ default:
41
+ return status;
42
+ }
43
+ }
44
+ //# sourceMappingURL=story-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"story-utils.js","sourceRoot":"","sources":["../../src/cli/story-utils.ts"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AACH,MAAM,UAAU,aAAa,CAAC,KAAY,EAAE,CAAc;IACxD,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,IAAI,KAAK,CAAC,WAAW,CAAC,iBAAiB;QAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACzD,IAAI,KAAK,CAAC,WAAW,CAAC,aAAa;QAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACrD,IAAI,KAAK,CAAC,WAAW,CAAC,uBAAuB;QAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC/D,IAAI,KAAK,CAAC,WAAW,CAAC,gBAAgB;QAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACxD,IAAI,KAAK,CAAC,WAAW,CAAC,UAAU;QAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAElD,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;AACvD,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,YAAY,CAAC,MAAc,EAAE,CAAc;IACzD,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,SAAS;YACZ,OAAO,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC3B,KAAK,OAAO;YACV,OAAO,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACzB,KAAK,aAAa;YAChB,OAAO,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAC9B,KAAK,MAAM;YACT,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACxB;YACE,OAAO,MAAM,CAAC;IAClB,CAAC;AACH,CAAC"}
@@ -0,0 +1,22 @@
1
+ import { Story } from '../types/index.js';
2
+ import { ThemeColors } from '../types/index.js';
3
+ /**
4
+ * Render stories as a formatted table
5
+ * Includes error handling to prevent crashes from malformed data
6
+ */
7
+ export declare function renderStoryTable(stories: Story[], themedChalk: ThemeColors): string;
8
+ /**
9
+ * Render stories in compact view for narrow terminals
10
+ * Uses responsive separator width and sanitized input
11
+ */
12
+ export declare function renderCompactView(stories: Story[], themedChalk: ThemeColors): string;
13
+ /**
14
+ * Export the shouldUseCompactView function for use in commands
15
+ */
16
+ export declare function shouldUseCompactView(terminalWidth?: number): boolean;
17
+ /**
18
+ * Main render function that chooses between table and compact view
19
+ * Optionally shows a hint when using compact view (can be disabled with env var)
20
+ */
21
+ export declare function renderStories(stories: Story[], themedChalk: ThemeColors): string;
22
+ //# sourceMappingURL=table-renderer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"table-renderer.d.ts","sourceRoot":"","sources":["../../src/cli/table-renderer.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAqEhD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,WAAW,GAAG,MAAM,CA4CnF;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,WAAW,GAAG,MAAM,CAqCpF;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,aAAa,CAAC,EAAE,MAAM,GAAG,OAAO,CAGpE;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,WAAW,GAAG,MAAM,CAahF"}
@@ -0,0 +1,159 @@
1
+ import Table from 'cli-table3';
2
+ import { truncateText, formatLabels, getTerminalWidth, shouldUseCompactView as shouldUseCompact, getColumnWidths, sanitizeInput, } from './formatting.js';
3
+ import { getStoryFlags, formatStatus } from './story-utils.js';
4
+ /**
5
+ * Create table configuration with themed colors
6
+ */
7
+ function createTableConfig(themedChalk) {
8
+ return {
9
+ head: ['Story ID', 'Title', 'Status', 'Labels', 'Flags'],
10
+ style: {
11
+ head: [], // We'll apply colors manually
12
+ border: [], // Use default Unicode borders
13
+ compact: false,
14
+ },
15
+ chars: {
16
+ 'top': '─',
17
+ 'top-mid': '┬',
18
+ 'top-left': '┌',
19
+ 'top-right': '┐',
20
+ 'bottom': '─',
21
+ 'bottom-mid': '┴',
22
+ 'bottom-left': '└',
23
+ 'bottom-right': '┘',
24
+ 'left': '│',
25
+ 'left-mid': '├',
26
+ 'mid': '─',
27
+ 'mid-mid': '┼',
28
+ 'right': '│',
29
+ 'right-mid': '┤',
30
+ 'middle': '│'
31
+ },
32
+ colWidths: [], // Will be set dynamically
33
+ wordWrap: false, // We handle truncation manually
34
+ };
35
+ }
36
+ /**
37
+ * Format a story row for table display
38
+ * Sanitizes all user input to prevent security issues
39
+ */
40
+ function formatStoryRow(story, columnWidths, themedChalk) {
41
+ // Sanitize and handle missing/empty values
42
+ const id = sanitizeInput(story.frontmatter.id || '(no ID)');
43
+ const title = sanitizeInput(story.frontmatter.title || '(No title)');
44
+ const status = formatStatus(story.frontmatter.status, themedChalk);
45
+ const labels = formatLabels(story.frontmatter.labels || [], columnWidths.labels - 2); // -2 for padding
46
+ const flags = getStoryFlags(story, themedChalk);
47
+ // Truncate title based on column width
48
+ const truncatedTitle = truncateText(title, columnWidths.title - 2); // -2 for padding
49
+ return [
50
+ id,
51
+ truncatedTitle,
52
+ status,
53
+ labels,
54
+ flags,
55
+ ];
56
+ }
57
+ /**
58
+ * Render stories as a formatted table
59
+ * Includes error handling to prevent crashes from malformed data
60
+ */
61
+ export function renderStoryTable(stories, themedChalk) {
62
+ if (stories.length === 0) {
63
+ return themedChalk.dim(' (empty)');
64
+ }
65
+ try {
66
+ const termWidth = getTerminalWidth();
67
+ const columnWidths = getColumnWidths(termWidth);
68
+ // Create table with configuration
69
+ const config = createTableConfig(themedChalk);
70
+ // Set column widths
71
+ config.colWidths = [
72
+ columnWidths.id,
73
+ columnWidths.title,
74
+ columnWidths.status,
75
+ columnWidths.labels,
76
+ columnWidths.flags,
77
+ ];
78
+ // Apply theme colors to headers
79
+ if (config.head) {
80
+ config.head = config.head.map((header) => themedChalk.bold(themedChalk.info(header)));
81
+ }
82
+ const table = new Table(config);
83
+ // Add story rows with error handling for each story
84
+ for (const story of stories) {
85
+ try {
86
+ const row = formatStoryRow(story, columnWidths, themedChalk);
87
+ table.push(row);
88
+ }
89
+ catch (error) {
90
+ // Log error but continue rendering other stories
91
+ console.error(themedChalk.error('Error rendering story, skipping...'));
92
+ }
93
+ }
94
+ return table.toString();
95
+ }
96
+ catch (error) {
97
+ // Fallback to error message if table rendering fails completely
98
+ return themedChalk.error('Error rendering stories. Please check story data format.');
99
+ }
100
+ }
101
+ /**
102
+ * Render stories in compact view for narrow terminals
103
+ * Uses responsive separator width and sanitized input
104
+ */
105
+ export function renderCompactView(stories, themedChalk) {
106
+ if (stories.length === 0) {
107
+ return themedChalk.dim(' (empty)');
108
+ }
109
+ const lines = [];
110
+ const termWidth = getTerminalWidth();
111
+ const separatorWidth = Math.min(60, termWidth - 4);
112
+ const separator = themedChalk.dim('─'.repeat(separatorWidth));
113
+ for (const story of stories) {
114
+ // Sanitize all user input (use || to handle empty strings as well)
115
+ const id = sanitizeInput(story.frontmatter.id || '(no ID)');
116
+ const title = sanitizeInput(story.frontmatter.title || '(No title)');
117
+ const status = formatStatus(story.frontmatter.status, themedChalk);
118
+ const labels = formatLabels(story.frontmatter.labels || [], 40);
119
+ const flags = getStoryFlags(story, themedChalk);
120
+ // Truncate title for compact view
121
+ const truncatedTitle = truncateText(title, 60);
122
+ // Format compact display
123
+ lines.push(`${themedChalk.dim('ID:')} ${id} ${themedChalk.dim('|')} ${themedChalk.dim('Status:')} ${status}`);
124
+ lines.push(`${themedChalk.dim('Title:')} ${truncatedTitle}`);
125
+ if (labels || flags) {
126
+ const labelPart = labels ? `${themedChalk.dim('Labels:')} ${labels}` : '';
127
+ const flagPart = flags ? `${themedChalk.dim('Flags:')} ${flags}` : '';
128
+ const divider = labelPart && flagPart ? ` ${themedChalk.dim('|')} ` : '';
129
+ lines.push(labelPart + divider + flagPart);
130
+ }
131
+ lines.push(separator);
132
+ }
133
+ // Indent all lines for consistency with status output
134
+ return lines.map(line => ` ${line}`).join('\n');
135
+ }
136
+ /**
137
+ * Export the shouldUseCompactView function for use in commands
138
+ */
139
+ export function shouldUseCompactView(terminalWidth) {
140
+ const width = terminalWidth ?? getTerminalWidth();
141
+ return shouldUseCompact(width);
142
+ }
143
+ /**
144
+ * Main render function that chooses between table and compact view
145
+ * Optionally shows a hint when using compact view (can be disabled with env var)
146
+ */
147
+ export function renderStories(stories, themedChalk) {
148
+ const termWidth = getTerminalWidth();
149
+ if (shouldUseCompact(termWidth)) {
150
+ // Optional: Add subtle hint about compact view (can be disabled with env var)
151
+ const showHint = process.env.AGENTIC_SDLC_NO_HINTS !== '1';
152
+ const hint = showHint
153
+ ? themedChalk.dim(` (Compact view: terminal width ${termWidth} < 100 cols)\n\n`)
154
+ : '';
155
+ return hint + renderCompactView(stories, themedChalk);
156
+ }
157
+ return renderStoryTable(stories, themedChalk);
158
+ }
159
+ //# sourceMappingURL=table-renderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"table-renderer.js","sourceRoot":"","sources":["../../src/cli/table-renderer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ export type CredentialType = 'api_key' | 'oauth_token' | 'none';
2
+ /**
3
+ * Get API key/token from various sources in order of preference:
4
+ * 1. ANTHROPIC_API_KEY environment variable (direct API key)
5
+ * 2. CLAUDE_CODE_OAUTH_TOKEN environment variable (OAuth token)
6
+ * 3. macOS Keychain (Claude Code credentials)
7
+ */
8
+ export declare function getApiKey(): string | null;
9
+ /**
10
+ * Check if the API key is an OAuth token
11
+ */
12
+ export declare function isOAuthToken(key: string): boolean;
13
+ /**
14
+ * Check if the API key is a direct API key
15
+ */
16
+ export declare function isDirectApiKey(key: string): boolean;
17
+ /**
18
+ * Get the credential type for a given key
19
+ */
20
+ export declare function getCredentialType(key: string | null): CredentialType;
21
+ /**
22
+ * Configure environment variables for the Agent SDK based on credential type.
23
+ * The Agent SDK uses:
24
+ * - ANTHROPIC_API_KEY for direct API keys
25
+ * - CLAUDE_CODE_OAUTH_TOKEN for OAuth tokens
26
+ */
27
+ export declare function configureAgentSdkAuth(): {
28
+ configured: boolean;
29
+ type: CredentialType;
30
+ };
31
+ /**
32
+ * Check if API key is available from any source
33
+ */
34
+ export declare function hasApiKey(): boolean;
35
+ /**
36
+ * Get the source of the API key (for display purposes)
37
+ */
38
+ export declare function getApiKeySource(): 'env' | 'keychain' | 'none';
39
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/core/auth.ts"],"names":[],"mappings":"AAaA,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,aAAa,GAAG,MAAM,CAAC;AAEhE;;;;;GAKG;AACH,wBAAgB,SAAS,IAAI,MAAM,GAAG,IAAI,CAmBzC;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAEjD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAEnD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,cAAc,CAIpE;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,IAAI;IAAE,UAAU,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,cAAc,CAAA;CAAE,CAoBrF;AA0CD;;GAEG;AACH,wBAAgB,SAAS,IAAI,OAAO,CAEnC;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,KAAK,GAAG,UAAU,GAAG,MAAM,CAa7D"}