ai-sdlc 0.3.1-alpha.0-alpha.7 → 0.3.1-alpha.0-alpha.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -53,6 +53,8 @@ ai-sdlc run --auto --story implement-user-authentication
53
53
  | `ai-sdlc run --epic <epic-id>` | Process all stories in an epic with parallel execution |
54
54
  | `ai-sdlc details <id>` | Show story details |
55
55
  | `ai-sdlc config [key] [value]` | View/set configuration |
56
+ | `ai-sdlc import <issue-url>` | Import a GitHub Issue as a new story |
57
+ | `ai-sdlc link <story-id> <issue-url>` | Link an existing story to a GitHub Issue |
56
58
 
57
59
  ## Workflow Phases
58
60
 
@@ -125,6 +127,58 @@ labels: [epic-ticketing-integration]
125
127
  }
126
128
  ```
127
129
 
130
+ ## GitHub Integration
131
+
132
+ Import and link GitHub Issues to ai-sdlc stories. Requires the [GitHub CLI (gh)](https://cli.github.com/) to be installed and authenticated.
133
+
134
+ **Setup:**
135
+ ```bash
136
+ # Install gh CLI
137
+ brew install gh # macOS
138
+ # or visit https://cli.github.com/ for other platforms
139
+
140
+ # Authenticate
141
+ gh auth login
142
+
143
+ # Configure ai-sdlc
144
+ echo '{
145
+ "ticketing": {
146
+ "provider": "github",
147
+ "github": {
148
+ "repo": "owner/repo"
149
+ }
150
+ }
151
+ }' > .ai-sdlc.json
152
+ ```
153
+
154
+ **Import a GitHub Issue:**
155
+ ```bash
156
+ # Import issue as a new story
157
+ ai-sdlc import https://github.com/owner/repo/issues/123
158
+
159
+ # Supported URL formats:
160
+ # - https://github.com/owner/repo/issues/123
161
+ # - github.com/owner/repo/issues/123
162
+ # - owner/repo#123
163
+ ```
164
+
165
+ **Link existing story to an issue:**
166
+ ```bash
167
+ # Link story to issue (prompts to sync title/description)
168
+ ai-sdlc link S-0042 https://github.com/owner/repo/issues/123
169
+
170
+ # Skip sync prompt
171
+ ai-sdlc link S-0042 owner/repo#123 --no-sync
172
+ ```
173
+
174
+ **Features:**
175
+ - Import issues as stories with metadata (ticket_id, ticket_url, ticket_synced_at)
176
+ - Link existing stories to issues
177
+ - Sync title and description from issues (optional)
178
+ - Duplicate detection (warns if issue already imported)
179
+
180
+ For full documentation, see [Configuration: GitHub Integration Commands](docs/configuration.md#github-integration-commands).
181
+
128
182
  ## Configuration
129
183
 
130
184
  Configure ai-sdlc behavior via a `.ai-sdlc.json` file in your project root. If no configuration file exists, ai-sdlc uses sensible defaults.
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Import a GitHub Issue as a new story.
3
+ *
4
+ * @param issueUrl GitHub issue URL in various formats
5
+ */
6
+ export declare function importIssue(issueUrl: string): Promise<void>;
7
+ //# sourceMappingURL=import-issue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"import-issue.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/import-issue.ts"],"names":[],"mappings":"AASA;;;;GAIG;AACH,wBAAsB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAoFjE"}
@@ -0,0 +1,125 @@
1
+ import ora from 'ora';
2
+ import { getSdlcRoot, loadConfig } from '../../core/config.js';
3
+ import { kanbanExists } from '../../core/kanban.js';
4
+ import { createStory } from '../../core/story.js';
5
+ import { getThemedChalk } from '../../core/theme.js';
6
+ import { parseGitHubIssueUrl, isGhAvailable } from '../../services/gh-cli.js';
7
+ import { createTicketProvider } from '../../services/ticket-provider/index.js';
8
+ /**
9
+ * Import a GitHub Issue as a new story.
10
+ *
11
+ * @param issueUrl GitHub issue URL in various formats
12
+ */
13
+ export async function importIssue(issueUrl) {
14
+ const spinner = ora('Importing GitHub Issue...').start();
15
+ try {
16
+ const config = loadConfig();
17
+ const sdlcRoot = getSdlcRoot();
18
+ const c = getThemedChalk(config);
19
+ // Check if ai-sdlc is initialized
20
+ if (!kanbanExists(sdlcRoot)) {
21
+ spinner.fail('ai-sdlc not initialized. Run `ai-sdlc init` first.');
22
+ return;
23
+ }
24
+ // Check if GitHub provider is configured
25
+ if (config.ticketing?.provider !== 'github') {
26
+ spinner.fail('GitHub provider not configured.');
27
+ console.log(c.dim('Set ticketing.provider = "github" in .ai-sdlc/config.yaml'));
28
+ console.log(c.dim('Or run: ai-sdlc config set ticketing.provider github'));
29
+ return;
30
+ }
31
+ // Parse the issue URL
32
+ const parsed = parseGitHubIssueUrl(issueUrl);
33
+ if (!parsed) {
34
+ spinner.fail('Invalid GitHub issue URL');
35
+ console.log(c.dim('Supported formats:'));
36
+ console.log(c.dim(' https://github.com/owner/repo/issues/123'));
37
+ console.log(c.dim(' github.com/owner/repo/issues/123'));
38
+ console.log(c.dim(' owner/repo#123'));
39
+ return;
40
+ }
41
+ // Check if gh CLI is available
42
+ spinner.text = 'Checking GitHub CLI availability...';
43
+ const ghAvailable = await isGhAvailable();
44
+ if (!ghAvailable) {
45
+ spinner.fail('GitHub CLI (gh) is not installed or not authenticated.');
46
+ console.log(c.dim('Install gh CLI: https://cli.github.com/'));
47
+ console.log(c.dim('Authenticate: gh auth login'));
48
+ return;
49
+ }
50
+ // Fetch issue details
51
+ spinner.text = `Fetching issue #${parsed.number} from ${parsed.owner}/${parsed.repo}...`;
52
+ const provider = createTicketProvider(config);
53
+ const ticket = await provider.get(parsed.number.toString());
54
+ // Check if issue is already imported
55
+ const existingStories = await findStoriesByTicketId(sdlcRoot, ticket.id);
56
+ if (existingStories.length > 0) {
57
+ spinner.warn(`Issue #${parsed.number} is already imported`);
58
+ console.log(c.dim(`Existing story: ${existingStories[0].slug}`));
59
+ console.log(c.dim(`Use 'ai-sdlc link ${existingStories[0].slug} ${issueUrl}' to update the link`));
60
+ return;
61
+ }
62
+ // Create the story
63
+ spinner.text = 'Creating story...';
64
+ const storyTitle = ticket.title;
65
+ const storyContent = ticket.description;
66
+ const story = await createStory(storyTitle, sdlcRoot, {
67
+ ticket_provider: 'github',
68
+ ticket_id: ticket.id,
69
+ ticket_url: ticket.url,
70
+ ticket_synced_at: new Date().toISOString(),
71
+ }, storyContent);
72
+ spinner.succeed(c.success(`Created story: ${story.slug} - ${story.frontmatter.title}`));
73
+ console.log(c.dim(`Linked to: ${ticket.url}`));
74
+ console.log();
75
+ console.log(c.info('Next steps:'));
76
+ console.log(c.dim(` ai-sdlc details ${story.slug}`));
77
+ console.log(c.dim(` ai-sdlc run --story ${story.slug}`));
78
+ }
79
+ catch (error) {
80
+ spinner.fail('Failed to import issue');
81
+ if (error instanceof Error) {
82
+ console.error(error.message);
83
+ }
84
+ else {
85
+ console.error(error);
86
+ }
87
+ process.exit(1);
88
+ }
89
+ }
90
+ /**
91
+ * Find stories by ticket_id.
92
+ *
93
+ * @param sdlcRoot Root directory of .ai-sdlc
94
+ * @param ticketId Ticket ID to search for
95
+ * @returns Array of stories with matching ticket_id
96
+ */
97
+ async function findStoriesByTicketId(sdlcRoot, ticketId) {
98
+ const fs = await import('fs');
99
+ const path = await import('path');
100
+ const { parseStory } = await import('../../core/story.js');
101
+ const storiesDir = path.join(sdlcRoot, 'stories');
102
+ const result = [];
103
+ if (!fs.existsSync(storiesDir)) {
104
+ return result;
105
+ }
106
+ const entries = fs.readdirSync(storiesDir, { withFileTypes: true });
107
+ for (const entry of entries) {
108
+ if (entry.isDirectory()) {
109
+ const storyPath = path.join(storiesDir, entry.name, 'story.md');
110
+ if (fs.existsSync(storyPath)) {
111
+ try {
112
+ const story = parseStory(storyPath);
113
+ if (story.frontmatter.ticket_id === ticketId) {
114
+ result.push(story);
115
+ }
116
+ }
117
+ catch {
118
+ // Skip invalid stories
119
+ }
120
+ }
121
+ }
122
+ }
123
+ return result;
124
+ }
125
+ //# sourceMappingURL=import-issue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"import-issue.js","sourceRoot":"","sources":["../../../src/cli/commands/import-issue.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Link an existing story to a GitHub Issue.
3
+ *
4
+ * @param storyId Story ID or slug
5
+ * @param issueUrl GitHub issue URL
6
+ * @param options Command options
7
+ */
8
+ export declare function linkIssue(storyId: string, issueUrl: string, options?: {
9
+ noSync?: boolean;
10
+ }): Promise<void>;
11
+ //# sourceMappingURL=link-issue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"link-issue.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/link-issue.ts"],"names":[],"mappings":"AASA;;;;;;GAMG;AACH,wBAAsB,SAAS,CAC7B,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GAC7B,OAAO,CAAC,IAAI,CAAC,CAuIf"}
@@ -0,0 +1,156 @@
1
+ import ora from 'ora';
2
+ import * as readline from 'readline';
3
+ import { getSdlcRoot, loadConfig } from '../../core/config.js';
4
+ import { kanbanExists } from '../../core/kanban.js';
5
+ import { getStory, findStoryById, writeStory } from '../../core/story.js';
6
+ import { getThemedChalk } from '../../core/theme.js';
7
+ import { parseGitHubIssueUrl, isGhAvailable } from '../../services/gh-cli.js';
8
+ import { createTicketProvider } from '../../services/ticket-provider/index.js';
9
+ /**
10
+ * Link an existing story to a GitHub Issue.
11
+ *
12
+ * @param storyId Story ID or slug
13
+ * @param issueUrl GitHub issue URL
14
+ * @param options Command options
15
+ */
16
+ export async function linkIssue(storyId, issueUrl, options) {
17
+ const spinner = ora('Linking story to GitHub Issue...').start();
18
+ try {
19
+ const config = loadConfig();
20
+ const sdlcRoot = getSdlcRoot();
21
+ const c = getThemedChalk(config);
22
+ // Check if ai-sdlc is initialized
23
+ if (!kanbanExists(sdlcRoot)) {
24
+ spinner.fail('ai-sdlc not initialized. Run `ai-sdlc init` first.');
25
+ return;
26
+ }
27
+ // Check if GitHub provider is configured
28
+ if (config.ticketing?.provider !== 'github') {
29
+ spinner.fail('GitHub provider not configured.');
30
+ console.log(c.dim('Set ticketing.provider = "github" in .ai-sdlc/config.yaml'));
31
+ return;
32
+ }
33
+ // Parse the issue URL
34
+ const parsed = parseGitHubIssueUrl(issueUrl);
35
+ if (!parsed) {
36
+ spinner.fail('Invalid GitHub issue URL');
37
+ console.log(c.dim('Supported formats:'));
38
+ console.log(c.dim(' https://github.com/owner/repo/issues/123'));
39
+ console.log(c.dim(' github.com/owner/repo/issues/123'));
40
+ console.log(c.dim(' owner/repo#123'));
41
+ return;
42
+ }
43
+ // Find the story
44
+ spinner.text = 'Finding story...';
45
+ let story = null;
46
+ try {
47
+ // Try as ID first (S-0074 format)
48
+ story = findStoryById(sdlcRoot, storyId);
49
+ }
50
+ catch {
51
+ // Try as slug
52
+ try {
53
+ story = getStory(sdlcRoot, storyId);
54
+ }
55
+ catch {
56
+ spinner.fail(`Story not found: ${storyId}`);
57
+ return;
58
+ }
59
+ }
60
+ // TypeScript guard: story must be defined at this point
61
+ if (!story) {
62
+ spinner.fail(`Story not found: ${storyId}`);
63
+ return;
64
+ }
65
+ // Check if gh CLI is available
66
+ spinner.text = 'Checking GitHub CLI availability...';
67
+ const ghAvailable = await isGhAvailable();
68
+ if (!ghAvailable) {
69
+ spinner.fail('GitHub CLI (gh) is not installed or not authenticated.');
70
+ console.log(c.dim('Install gh CLI: https://cli.github.com/'));
71
+ console.log(c.dim('Authenticate: gh auth login'));
72
+ return;
73
+ }
74
+ // Fetch issue details
75
+ spinner.text = `Fetching issue #${parsed.number} from ${parsed.owner}/${parsed.repo}...`;
76
+ const provider = createTicketProvider(config);
77
+ const ticket = await provider.get(parsed.number.toString());
78
+ // Check if story is already linked to a different issue
79
+ if (story.frontmatter.ticket_id && story.frontmatter.ticket_id !== ticket.id) {
80
+ spinner.warn(`Story is already linked to issue #${story.frontmatter.ticket_id}`);
81
+ const shouldContinue = await askYesNo('Do you want to overwrite the existing link?', false);
82
+ if (!shouldContinue) {
83
+ console.log(c.dim('Link cancelled.'));
84
+ return;
85
+ }
86
+ }
87
+ // Ask about syncing title/description if not --no-sync
88
+ let shouldSync = false;
89
+ if (!options?.noSync) {
90
+ spinner.stop();
91
+ console.log();
92
+ console.log(c.info('Issue details:'));
93
+ console.log(c.dim(` Title: ${ticket.title}`));
94
+ console.log(c.dim(` Status: ${ticket.status}`));
95
+ console.log();
96
+ console.log(c.info('Current story:'));
97
+ console.log(c.dim(` Title: ${story.frontmatter.title}`));
98
+ console.log();
99
+ shouldSync = await askYesNo('Do you want to sync the story title and description from the issue?', false);
100
+ spinner.start('Linking story...');
101
+ }
102
+ // Update story with ticket fields
103
+ story.frontmatter.ticket_provider = 'github';
104
+ story.frontmatter.ticket_id = ticket.id;
105
+ story.frontmatter.ticket_url = ticket.url;
106
+ story.frontmatter.ticket_synced_at = new Date().toISOString();
107
+ // Optionally sync title and description
108
+ if (shouldSync) {
109
+ story.frontmatter.title = ticket.title;
110
+ // Only update content if the story doesn't have detailed content
111
+ if (!story.content || story.content.trim().length < 50) {
112
+ story.content = ticket.description;
113
+ }
114
+ }
115
+ // Write the updated story
116
+ await writeStory(story);
117
+ spinner.succeed(c.success(`Linked ${story.slug} to GitHub Issue #${ticket.id}`));
118
+ console.log(c.dim(`Issue URL: ${ticket.url}`));
119
+ if (shouldSync) {
120
+ console.log(c.dim('Synced: title and description'));
121
+ }
122
+ }
123
+ catch (error) {
124
+ spinner.fail('Failed to link issue');
125
+ if (error instanceof Error) {
126
+ console.error(error.message);
127
+ }
128
+ else {
129
+ console.error(error);
130
+ }
131
+ process.exit(1);
132
+ }
133
+ }
134
+ /**
135
+ * Ask a yes/no question and return the response.
136
+ */
137
+ async function askYesNo(question, defaultValue) {
138
+ const rl = readline.createInterface({
139
+ input: process.stdin,
140
+ output: process.stdout,
141
+ });
142
+ return new Promise((resolve) => {
143
+ const defaultText = defaultValue ? 'Y/n' : 'y/N';
144
+ rl.question(`${question} (${defaultText}): `, (answer) => {
145
+ rl.close();
146
+ const normalized = answer.trim().toLowerCase();
147
+ if (normalized === '') {
148
+ resolve(defaultValue);
149
+ }
150
+ else {
151
+ resolve(normalized === 'y' || normalized === 'yes');
152
+ }
153
+ });
154
+ });
155
+ }
156
+ //# sourceMappingURL=link-issue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"link-issue.js","sourceRoot":"","sources":["../../../src/cli/commands/link-issue.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,KAAK,QAAQ,MAAM,UAAU,CAAC;AACrC,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC1E,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAC9E,OAAO,EAAE,oBAAoB,EAAE,MAAM,yCAAyC,CAAC;AAE/E;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,OAAe,EACf,QAAgB,EAChB,OAA8B;IAE9B,MAAM,OAAO,GAAG,GAAG,CAAC,kCAAkC,CAAC,CAAC,KAAK,EAAE,CAAC;IAEhE,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;QAC5B,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;QAC/B,MAAM,CAAC,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;QAEjC,kCAAkC;QAClC,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC5B,OAAO,CAAC,IAAI,CAAC,oDAAoD,CAAC,CAAC;YACnE,OAAO;QACT,CAAC;QAED,yCAAyC;QACzC,IAAI,MAAM,CAAC,SAAS,EAAE,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAC5C,OAAO,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;YAChD,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,2DAA2D,CAAC,CAAC,CAAC;YAChF,OAAO;QACT,CAAC;QAED,sBAAsB;QACtB,MAAM,MAAM,GAAG,mBAAmB,CAAC,QAAQ,CAAC,CAAC;QAC7C,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;YACzC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC,CAAC;YACzC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC,CAAC;YACjE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC,CAAC;YACzD,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,CAAC;YACvC,OAAO;QACT,CAAC;QAED,iBAAiB;QACjB,OAAO,CAAC,IAAI,GAAG,kBAAkB,CAAC;QAClC,IAAI,KAAK,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC;YACH,kCAAkC;YAClC,KAAK,GAAG,aAAa,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC3C,CAAC;QAAC,MAAM,CAAC;YACP,cAAc;YACd,IAAI,CAAC;gBACH,KAAK,GAAG,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YACtC,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,CAAC,IAAI,CAAC,oBAAoB,OAAO,EAAE,CAAC,CAAC;gBAC5C,OAAO;YACT,CAAC;QACH,CAAC;QAED,wDAAwD;QACxD,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,IAAI,CAAC,oBAAoB,OAAO,EAAE,CAAC,CAAC;YAC5C,OAAO;QACT,CAAC;QAED,+BAA+B;QAC/B,OAAO,CAAC,IAAI,GAAG,qCAAqC,CAAC;QACrD,MAAM,WAAW,GAAG,MAAM,aAAa,EAAE,CAAC;QAC1C,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,OAAO,CAAC,IAAI,CAAC,wDAAwD,CAAC,CAAC;YACvE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC,CAAC;YAC9D,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC,CAAC;YAClD,OAAO;QACT,CAAC;QAED,sBAAsB;QACtB,OAAO,CAAC,IAAI,GAAG,mBAAmB,MAAM,CAAC,MAAM,SAAS,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,IAAI,KAAK,CAAC;QACzF,MAAM,QAAQ,GAAG,oBAAoB,CAAC,MAAM,CAAC,CAAC;QAC9C,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;QAE5D,wDAAwD;QACxD,IAAI,KAAK,CAAC,WAAW,CAAC,SAAS,IAAI,KAAK,CAAC,WAAW,CAAC,SAAS,KAAK,MAAM,CAAC,EAAE,EAAE,CAAC;YAC7E,OAAO,CAAC,IAAI,CAAC,qCAAqC,KAAK,CAAC,WAAW,CAAC,SAAS,EAAE,CAAC,CAAC;YACjF,MAAM,cAAc,GAAG,MAAM,QAAQ,CACnC,6CAA6C,EAC7C,KAAK,CACN,CAAC;YACF,IAAI,CAAC,cAAc,EAAE,CAAC;gBACpB,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC;gBACtC,OAAO;YACT,CAAC;QACH,CAAC;QAED,uDAAuD;QACvD,IAAI,UAAU,GAAG,KAAK,CAAC;QACvB,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC;YACrB,OAAO,CAAC,IAAI,EAAE,CAAC;YACf,OAAO,CAAC,GAAG,EAAE,CAAC;YACd,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC;YACtC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,YAAY,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YAC/C,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,aAAa,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YACjD,OAAO,CAAC,GAAG,EAAE,CAAC;YACd,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC;YACtC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,YAAY,KAAK,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YAC1D,OAAO,CAAC,GAAG,EAAE,CAAC;YAEd,UAAU,GAAG,MAAM,QAAQ,CACzB,qEAAqE,EACrE,KAAK,CACN,CAAC;YAEF,OAAO,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;QACpC,CAAC;QAED,kCAAkC;QAClC,KAAK,CAAC,WAAW,CAAC,eAAe,GAAG,QAAQ,CAAC;QAC7C,KAAK,CAAC,WAAW,CAAC,SAAS,GAAG,MAAM,CAAC,EAAE,CAAC;QACxC,KAAK,CAAC,WAAW,CAAC,UAAU,GAAG,MAAM,CAAC,GAAG,CAAC;QAC1C,KAAK,CAAC,WAAW,CAAC,gBAAgB,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAE9D,wCAAwC;QACxC,IAAI,UAAU,EAAE,CAAC;YACf,KAAK,CAAC,WAAW,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;YACvC,iEAAiE;YACjE,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;gBACvD,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC,WAAW,CAAC;YACrC,CAAC;QACH,CAAC;QAED,0BAA0B;QAC1B,MAAM,UAAU,CAAC,KAAK,CAAC,CAAC;QAExB,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,KAAK,CAAC,IAAI,qBAAqB,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QACjF,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,cAAc,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QAC/C,IAAI,UAAU,EAAE,CAAC;YACf,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC,CAAC;QACtD,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;QACrC,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YAC3B,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC/B,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACvB,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,QAAQ,CAAC,QAAgB,EAAE,YAAqB;IAC7D,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC;QAClC,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC,CAAC;IAEH,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,WAAW,GAAG,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;QACjD,EAAE,CAAC,QAAQ,CAAC,GAAG,QAAQ,KAAK,WAAW,KAAK,EAAE,CAAC,MAAM,EAAE,EAAE;YACvD,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YAC/C,IAAI,UAAU,KAAK,EAAE,EAAE,CAAC;gBACtB,OAAO,CAAC,YAAY,CAAC,CAAC;YACxB,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,UAAU,KAAK,GAAG,IAAI,UAAU,KAAK,KAAK,CAAC,CAAC;YACtD,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -1,4 +1,6 @@
1
1
  import { Story, ActionType, PreFlightResult } from '../types/index.js';
2
+ import { importIssue } from './commands/import-issue.js';
3
+ import { linkIssue } from './commands/link-issue.js';
2
4
  /**
3
5
  * Initialize the .ai-sdlc folder structure
4
6
  */
@@ -172,4 +174,5 @@ export declare function addWorktree(storyId: string): Promise<void>;
172
174
  export declare function removeWorktree(storyId: string, options?: {
173
175
  force?: boolean;
174
176
  }): Promise<void>;
177
+ export { importIssue, linkIssue };
175
178
  //# sourceMappingURL=commands.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../../src/cli/commands.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../../src/cli/commands.ts"],"names":[],"mappings":"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"}
@@ -13,6 +13,8 @@ import { saveWorkflowState, loadWorkflowState, clearWorkflowState, generateWorkf
13
13
  import { renderStories, renderKanbanBoard, shouldUseKanbanLayout } from './table-renderer.js';
14
14
  import { getStoryFlags as getStoryFlagsUtil, formatStatus as formatStatusUtil } from './story-utils.js';
15
15
  import { migrateToFolderPerStory } from './commands/migrate.js';
16
+ import { importIssue } from './commands/import-issue.js';
17
+ import { linkIssue } from './commands/link-issue.js';
16
18
  import { generateReviewSummary } from '../agents/review.js';
17
19
  import { getTerminalWidth } from './formatting.js';
18
20
  import { validateGitState } from '../core/git-utils.js';
@@ -2968,4 +2970,6 @@ export async function removeWorktree(storyId, options) {
2968
2970
  process.exit(1);
2969
2971
  }
2970
2972
  }
2973
+ // Export the GitHub integration commands
2974
+ export { importIssue, linkIssue };
2971
2975
  //# sourceMappingURL=commands.js.map