ai-sdlc 0.3.1-alpha.0-alpha.6 → 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 +54 -0
- package/dist/cli/commands/import-issue.d.ts +7 -0
- package/dist/cli/commands/import-issue.d.ts.map +1 -0
- package/dist/cli/commands/import-issue.js +125 -0
- package/dist/cli/commands/import-issue.js.map +1 -0
- package/dist/cli/commands/link-issue.d.ts +11 -0
- package/dist/cli/commands/link-issue.d.ts.map +1 -0
- package/dist/cli/commands/link-issue.js +156 -0
- package/dist/cli/commands/link-issue.js.map +1 -0
- package/dist/cli/commands.d.ts +3 -0
- package/dist/cli/commands.d.ts.map +1 -1
- package/dist/cli/commands.js +4 -0
- package/dist/cli/commands.js.map +1 -1
- package/dist/core/config.d.ts +5 -1
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js +73 -0
- package/dist/core/config.js.map +1 -1
- package/dist/index.js +11 -1
- package/dist/index.js.map +1 -1
- package/dist/services/gh-cli.d.ts +122 -0
- package/dist/services/gh-cli.d.ts.map +1 -0
- package/dist/services/gh-cli.js +249 -0
- package/dist/services/gh-cli.js.map +1 -0
- package/dist/services/ticket-provider/github-provider.d.ts +84 -0
- package/dist/services/ticket-provider/github-provider.d.ts.map +1 -0
- package/dist/services/ticket-provider/github-provider.js +194 -0
- package/dist/services/ticket-provider/github-provider.js.map +1 -0
- package/dist/services/ticket-provider/index.d.ts +22 -0
- package/dist/services/ticket-provider/index.d.ts.map +1 -0
- package/dist/services/ticket-provider/index.js +38 -0
- package/dist/services/ticket-provider/index.js.map +1 -0
- package/dist/services/ticket-provider/null-provider.d.ts +59 -0
- package/dist/services/ticket-provider/null-provider.d.ts.map +1 -0
- package/dist/services/ticket-provider/null-provider.js +73 -0
- package/dist/services/ticket-provider/null-provider.js.map +1 -0
- package/dist/services/ticket-provider/types.d.ts +115 -0
- package/dist/services/ticket-provider/types.d.ts.map +1 -0
- package/dist/services/ticket-provider/types.js +2 -0
- package/dist/services/ticket-provider/types.js.map +1 -0
- package/dist/types/index.d.ts +27 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js.map +1 -1
- package/package.json +1 -1
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 @@
|
|
|
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":"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"}
|
package/dist/cli/commands.d.ts
CHANGED
|
@@ -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":"AAUA,OAAO,EAAE,KAAK,EAAU,UAAU,EAA0H,eAAe,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../../src/cli/commands.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/commands.js
CHANGED
|
@@ -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
|