claude-cli-advanced-starter-pack 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.
- package/LICENSE +21 -0
- package/OVERVIEW.md +597 -0
- package/README.md +439 -0
- package/bin/gtask.js +282 -0
- package/bin/postinstall.js +53 -0
- package/package.json +69 -0
- package/src/agents/phase-dev-templates.js +1011 -0
- package/src/agents/templates.js +668 -0
- package/src/analysis/checklist-parser.js +414 -0
- package/src/analysis/codebase.js +481 -0
- package/src/cli/menu.js +958 -0
- package/src/commands/claude-audit.js +1482 -0
- package/src/commands/claude-settings.js +2243 -0
- package/src/commands/create-agent.js +681 -0
- package/src/commands/create-command.js +337 -0
- package/src/commands/create-hook.js +262 -0
- package/src/commands/create-phase-dev/codebase-analyzer.js +813 -0
- package/src/commands/create-phase-dev/documentation-generator.js +352 -0
- package/src/commands/create-phase-dev/post-completion.js +404 -0
- package/src/commands/create-phase-dev/scale-calculator.js +344 -0
- package/src/commands/create-phase-dev/wizard.js +492 -0
- package/src/commands/create-phase-dev.js +481 -0
- package/src/commands/create-skill.js +313 -0
- package/src/commands/create.js +446 -0
- package/src/commands/decompose.js +392 -0
- package/src/commands/detect-tech-stack.js +768 -0
- package/src/commands/explore-mcp/claude-md-updater.js +252 -0
- package/src/commands/explore-mcp/mcp-installer.js +346 -0
- package/src/commands/explore-mcp/mcp-registry.js +438 -0
- package/src/commands/explore-mcp.js +638 -0
- package/src/commands/gtask-init.js +641 -0
- package/src/commands/help.js +128 -0
- package/src/commands/init.js +1890 -0
- package/src/commands/install.js +250 -0
- package/src/commands/list.js +116 -0
- package/src/commands/roadmap.js +750 -0
- package/src/commands/setup-wizard.js +482 -0
- package/src/commands/setup.js +351 -0
- package/src/commands/sync.js +534 -0
- package/src/commands/test-run.js +456 -0
- package/src/commands/test-setup.js +456 -0
- package/src/commands/validate.js +67 -0
- package/src/config/tech-stack.defaults.json +182 -0
- package/src/config/tech-stack.schema.json +502 -0
- package/src/github/client.js +359 -0
- package/src/index.js +84 -0
- package/src/templates/claude-command.js +244 -0
- package/src/templates/issue-body.js +284 -0
- package/src/testing/config.js +411 -0
- package/src/utils/template-engine.js +398 -0
- package/src/utils/validate-templates.js +223 -0
- package/src/utils.js +396 -0
- package/templates/commands/ccasp-setup.template.md +113 -0
- package/templates/commands/context-audit.template.md +97 -0
- package/templates/commands/create-task-list.template.md +382 -0
- package/templates/commands/deploy-full.template.md +261 -0
- package/templates/commands/github-task-start.template.md +99 -0
- package/templates/commands/github-update.template.md +69 -0
- package/templates/commands/happy-start.template.md +117 -0
- package/templates/commands/phase-track.template.md +142 -0
- package/templates/commands/tunnel-start.template.md +127 -0
- package/templates/commands/tunnel-stop.template.md +106 -0
- package/templates/hooks/context-guardian.template.js +173 -0
- package/templates/hooks/deployment-orchestrator.template.js +219 -0
- package/templates/hooks/github-progress-hook.template.js +197 -0
- package/templates/hooks/happy-checkpoint-manager.template.js +222 -0
- package/templates/hooks/phase-dev-enforcer.template.js +183 -0
|
@@ -0,0 +1,359 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GitHub CLI Wrapper
|
|
3
|
+
*
|
|
4
|
+
* Provides clean interface for gh CLI operations
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import { execCommand, execAsync } from '../utils.js';
|
|
8
|
+
import chalk from 'chalk';
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Check if gh CLI is authenticated
|
|
12
|
+
*/
|
|
13
|
+
export function isAuthenticated() {
|
|
14
|
+
const result = execCommand('gh auth status');
|
|
15
|
+
return result.success;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Get current authenticated user
|
|
20
|
+
*/
|
|
21
|
+
export function getCurrentUser() {
|
|
22
|
+
const result = execCommand('gh api user --jq ".login"');
|
|
23
|
+
if (result.success) {
|
|
24
|
+
return result.output;
|
|
25
|
+
}
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* List repositories for a user/org
|
|
31
|
+
*/
|
|
32
|
+
export function listRepos(owner, options = {}) {
|
|
33
|
+
const { limit = 30, type = 'all' } = options;
|
|
34
|
+
const cmd = owner
|
|
35
|
+
? `gh repo list ${owner} --limit ${limit} --json name,description,isPrivate`
|
|
36
|
+
: `gh repo list --limit ${limit} --json name,description,isPrivate`;
|
|
37
|
+
|
|
38
|
+
const result = execCommand(cmd);
|
|
39
|
+
if (result.success) {
|
|
40
|
+
try {
|
|
41
|
+
return JSON.parse(result.output);
|
|
42
|
+
} catch {
|
|
43
|
+
return [];
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return [];
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Check if repo exists and is accessible
|
|
51
|
+
*/
|
|
52
|
+
export function repoExists(owner, repo) {
|
|
53
|
+
const result = execCommand(`gh repo view ${owner}/${repo} --json name`);
|
|
54
|
+
return result.success;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Get repository info
|
|
59
|
+
*/
|
|
60
|
+
export function getRepoInfo(owner, repo) {
|
|
61
|
+
const result = execCommand(
|
|
62
|
+
`gh repo view ${owner}/${repo} --json name,description,isPrivate,defaultBranchRef`
|
|
63
|
+
);
|
|
64
|
+
if (result.success) {
|
|
65
|
+
try {
|
|
66
|
+
return JSON.parse(result.output);
|
|
67
|
+
} catch {
|
|
68
|
+
return null;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return null;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* List GitHub Projects for a user/org
|
|
76
|
+
*/
|
|
77
|
+
export function listProjects(owner) {
|
|
78
|
+
const result = execCommand(
|
|
79
|
+
`gh project list --owner ${owner} --format json`
|
|
80
|
+
);
|
|
81
|
+
if (result.success) {
|
|
82
|
+
try {
|
|
83
|
+
const data = JSON.parse(result.output);
|
|
84
|
+
return data.projects || [];
|
|
85
|
+
} catch {
|
|
86
|
+
return [];
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
return [];
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Get project details
|
|
94
|
+
*/
|
|
95
|
+
export function getProject(owner, projectNumber) {
|
|
96
|
+
const result = execCommand(
|
|
97
|
+
`gh project view ${projectNumber} --owner ${owner} --format json`
|
|
98
|
+
);
|
|
99
|
+
if (result.success) {
|
|
100
|
+
try {
|
|
101
|
+
return JSON.parse(result.output);
|
|
102
|
+
} catch {
|
|
103
|
+
return null;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
return null;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* List project fields
|
|
111
|
+
*/
|
|
112
|
+
export function listProjectFields(owner, projectNumber) {
|
|
113
|
+
const result = execCommand(
|
|
114
|
+
`gh project field-list ${projectNumber} --owner ${owner} --format json`
|
|
115
|
+
);
|
|
116
|
+
if (result.success) {
|
|
117
|
+
try {
|
|
118
|
+
const data = JSON.parse(result.output);
|
|
119
|
+
return data.fields || [];
|
|
120
|
+
} catch {
|
|
121
|
+
return [];
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
return [];
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* Get field options for single-select fields via GraphQL
|
|
129
|
+
*/
|
|
130
|
+
export function getFieldOptions(projectId, fieldId) {
|
|
131
|
+
const query = `
|
|
132
|
+
query($projectId: ID!) {
|
|
133
|
+
node(id: $projectId) {
|
|
134
|
+
... on ProjectV2 {
|
|
135
|
+
field(name: "${fieldId}") {
|
|
136
|
+
... on ProjectV2SingleSelectField {
|
|
137
|
+
name
|
|
138
|
+
options {
|
|
139
|
+
id
|
|
140
|
+
name
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
`;
|
|
148
|
+
|
|
149
|
+
const result = execCommand(
|
|
150
|
+
`gh api graphql -f query='${query.replace(/\n/g, ' ')}' -F projectId="${projectId}"`
|
|
151
|
+
);
|
|
152
|
+
|
|
153
|
+
if (result.success) {
|
|
154
|
+
try {
|
|
155
|
+
const data = JSON.parse(result.output);
|
|
156
|
+
return data?.data?.node?.field?.options || [];
|
|
157
|
+
} catch {
|
|
158
|
+
return [];
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
return [];
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
/**
|
|
165
|
+
* Get all single-select field options for a project
|
|
166
|
+
*/
|
|
167
|
+
export function getAllFieldOptions(projectId) {
|
|
168
|
+
const query = `
|
|
169
|
+
query($projectId: ID!) {
|
|
170
|
+
node(id: $projectId) {
|
|
171
|
+
... on ProjectV2 {
|
|
172
|
+
fields(first: 50) {
|
|
173
|
+
nodes {
|
|
174
|
+
... on ProjectV2SingleSelectField {
|
|
175
|
+
id
|
|
176
|
+
name
|
|
177
|
+
options {
|
|
178
|
+
id
|
|
179
|
+
name
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
... on ProjectV2Field {
|
|
183
|
+
id
|
|
184
|
+
name
|
|
185
|
+
}
|
|
186
|
+
... on ProjectV2IterationField {
|
|
187
|
+
id
|
|
188
|
+
name
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
`;
|
|
196
|
+
|
|
197
|
+
const escapedQuery = query.replace(/\n/g, ' ').replace(/"/g, '\\"');
|
|
198
|
+
const result = execCommand(
|
|
199
|
+
`gh api graphql -f query="${escapedQuery}" -F projectId="${projectId}"`
|
|
200
|
+
);
|
|
201
|
+
|
|
202
|
+
if (result.success) {
|
|
203
|
+
try {
|
|
204
|
+
const data = JSON.parse(result.output);
|
|
205
|
+
return data?.data?.node?.fields?.nodes || [];
|
|
206
|
+
} catch {
|
|
207
|
+
return [];
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
return [];
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
/**
|
|
214
|
+
* Create a GitHub issue
|
|
215
|
+
*/
|
|
216
|
+
export async function createIssue(owner, repo, options) {
|
|
217
|
+
const { title, body, labels = [], assignees = [] } = options;
|
|
218
|
+
|
|
219
|
+
let cmd = `gh issue create --repo ${owner}/${repo}`;
|
|
220
|
+
cmd += ` --title "${title.replace(/"/g, '\\"')}"`;
|
|
221
|
+
cmd += ` --body "${body.replace(/"/g, '\\"').replace(/\n/g, '\\n')}"`;
|
|
222
|
+
|
|
223
|
+
if (labels.length > 0) {
|
|
224
|
+
cmd += ` --label "${labels.join(',')}"`;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
if (assignees.length > 0) {
|
|
228
|
+
cmd += ` --assignee "${assignees.join(',')}"`;
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
const result = execCommand(cmd);
|
|
232
|
+
if (result.success) {
|
|
233
|
+
// Extract issue URL from output
|
|
234
|
+
const urlMatch = result.output.match(
|
|
235
|
+
/https:\/\/github\.com\/[^/]+\/[^/]+\/issues\/\d+/
|
|
236
|
+
);
|
|
237
|
+
if (urlMatch) {
|
|
238
|
+
const issueNumber = urlMatch[0].split('/').pop();
|
|
239
|
+
return {
|
|
240
|
+
success: true,
|
|
241
|
+
url: urlMatch[0],
|
|
242
|
+
number: parseInt(issueNumber, 10),
|
|
243
|
+
};
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
return {
|
|
248
|
+
success: false,
|
|
249
|
+
error: result.error || result.stderr || 'Failed to create issue',
|
|
250
|
+
};
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
/**
|
|
254
|
+
* Add issue to project board
|
|
255
|
+
*/
|
|
256
|
+
export function addIssueToProject(owner, projectNumber, issueUrl) {
|
|
257
|
+
const result = execCommand(
|
|
258
|
+
`gh project item-add ${projectNumber} --owner ${owner} --url "${issueUrl}"`
|
|
259
|
+
);
|
|
260
|
+
return result.success;
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
/**
|
|
264
|
+
* Get project item ID for an issue
|
|
265
|
+
*/
|
|
266
|
+
export function getProjectItemId(owner, projectNumber, issueNumber) {
|
|
267
|
+
const result = execCommand(
|
|
268
|
+
`gh project item-list ${projectNumber} --owner ${owner} --format json`
|
|
269
|
+
);
|
|
270
|
+
|
|
271
|
+
if (result.success) {
|
|
272
|
+
try {
|
|
273
|
+
const data = JSON.parse(result.output);
|
|
274
|
+
const item = data.items?.find(
|
|
275
|
+
(i) => i.content?.number === issueNumber
|
|
276
|
+
);
|
|
277
|
+
return item?.id || null;
|
|
278
|
+
} catch {
|
|
279
|
+
return null;
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
return null;
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
/**
|
|
286
|
+
* Update project item field
|
|
287
|
+
*/
|
|
288
|
+
export function updateProjectItemField(
|
|
289
|
+
projectId,
|
|
290
|
+
itemId,
|
|
291
|
+
fieldId,
|
|
292
|
+
value,
|
|
293
|
+
fieldType = 'text'
|
|
294
|
+
) {
|
|
295
|
+
let cmd = `gh project item-edit --id "${itemId}" --project-id "${projectId}" --field-id "${fieldId}"`;
|
|
296
|
+
|
|
297
|
+
if (fieldType === 'single-select') {
|
|
298
|
+
cmd += ` --single-select-option-id "${value}"`;
|
|
299
|
+
} else if (fieldType === 'number') {
|
|
300
|
+
cmd += ` --number ${value}`;
|
|
301
|
+
} else {
|
|
302
|
+
cmd += ` --text "${value.replace(/"/g, '\\"')}"`;
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
const result = execCommand(cmd);
|
|
306
|
+
return result.success;
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
/**
|
|
310
|
+
* List issues for a repo
|
|
311
|
+
*/
|
|
312
|
+
export function listIssues(owner, repo, options = {}) {
|
|
313
|
+
const { limit = 10, state = 'open', assignee } = options;
|
|
314
|
+
|
|
315
|
+
let cmd = `gh issue list --repo ${owner}/${repo} --limit ${limit} --state ${state} --json number,title,state,labels,createdAt,author`;
|
|
316
|
+
|
|
317
|
+
if (assignee) {
|
|
318
|
+
cmd += ` --assignee ${assignee}`;
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
const result = execCommand(cmd);
|
|
322
|
+
if (result.success) {
|
|
323
|
+
try {
|
|
324
|
+
return JSON.parse(result.output);
|
|
325
|
+
} catch {
|
|
326
|
+
return [];
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
return [];
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
/**
|
|
333
|
+
* Get issue details
|
|
334
|
+
*/
|
|
335
|
+
export function getIssue(owner, repo, issueNumber) {
|
|
336
|
+
const result = execCommand(
|
|
337
|
+
`gh issue view ${issueNumber} --repo ${owner}/${repo} --json number,title,body,state,labels,assignees,createdAt,author`
|
|
338
|
+
);
|
|
339
|
+
|
|
340
|
+
if (result.success) {
|
|
341
|
+
try {
|
|
342
|
+
return JSON.parse(result.output);
|
|
343
|
+
} catch {
|
|
344
|
+
return null;
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
return null;
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
/**
|
|
351
|
+
* Add comment to issue
|
|
352
|
+
*/
|
|
353
|
+
export function addIssueComment(owner, repo, issueNumber, body) {
|
|
354
|
+
const escapedBody = body.replace(/"/g, '\\"').replace(/\n/g, '\\n');
|
|
355
|
+
const result = execCommand(
|
|
356
|
+
`gh issue comment ${issueNumber} --repo ${owner}/${repo} --body "${escapedBody}"`
|
|
357
|
+
);
|
|
358
|
+
return result.success;
|
|
359
|
+
}
|
package/src/index.js
ADDED
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Claude CLI Advanced Starter Pack - Main Export
|
|
3
|
+
*
|
|
4
|
+
* Platform-agnostic Claude Code enhancement toolkit with:
|
|
5
|
+
* - Tech stack auto-detection
|
|
6
|
+
* - Templated .claude file generation
|
|
7
|
+
* - GitHub Project Board integration
|
|
8
|
+
* - Advanced testing configuration
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
// CLI
|
|
12
|
+
export { showMainMenu, showHeader, showSuccess, showError } from './cli/menu.js';
|
|
13
|
+
|
|
14
|
+
// Commands
|
|
15
|
+
export { runSetup } from './commands/setup.js';
|
|
16
|
+
export { runCreate } from './commands/create.js';
|
|
17
|
+
export { runList } from './commands/list.js';
|
|
18
|
+
export { runInstall } from './commands/install.js';
|
|
19
|
+
export { showHelp } from './commands/help.js';
|
|
20
|
+
export { runClaudeSettings } from './commands/claude-settings.js';
|
|
21
|
+
export { runGtaskInit } from './commands/gtask-init.js';
|
|
22
|
+
export { detectTechStack, runDetection } from './commands/detect-tech-stack.js';
|
|
23
|
+
export {
|
|
24
|
+
runClaudeAudit,
|
|
25
|
+
showClaudeAuditMenu,
|
|
26
|
+
ENHANCEMENT_TEMPLATES,
|
|
27
|
+
runEnhancement,
|
|
28
|
+
} from './commands/claude-audit.js';
|
|
29
|
+
export { runSetupWizard, generateSlashCommand } from './commands/setup-wizard.js';
|
|
30
|
+
|
|
31
|
+
// Template Engine
|
|
32
|
+
export {
|
|
33
|
+
replacePlaceholders,
|
|
34
|
+
processFile,
|
|
35
|
+
processDirectory,
|
|
36
|
+
generateTechStack,
|
|
37
|
+
flattenObject,
|
|
38
|
+
extractPlaceholders,
|
|
39
|
+
validateTechStack,
|
|
40
|
+
} from './utils/template-engine.js';
|
|
41
|
+
|
|
42
|
+
// GitHub client
|
|
43
|
+
export {
|
|
44
|
+
isAuthenticated,
|
|
45
|
+
getCurrentUser,
|
|
46
|
+
listRepos,
|
|
47
|
+
repoExists,
|
|
48
|
+
listProjects,
|
|
49
|
+
getProject,
|
|
50
|
+
listProjectFields,
|
|
51
|
+
createIssue,
|
|
52
|
+
addIssueToProject,
|
|
53
|
+
listIssues,
|
|
54
|
+
} from './github/client.js';
|
|
55
|
+
|
|
56
|
+
// Codebase analysis
|
|
57
|
+
export {
|
|
58
|
+
searchFiles,
|
|
59
|
+
searchContent,
|
|
60
|
+
findDefinitions,
|
|
61
|
+
extractSnippet,
|
|
62
|
+
analyzeForIssue,
|
|
63
|
+
detectProjectType,
|
|
64
|
+
} from './analysis/codebase.js';
|
|
65
|
+
|
|
66
|
+
// Templates
|
|
67
|
+
export {
|
|
68
|
+
generateIssueBody,
|
|
69
|
+
generateSimpleIssueBody,
|
|
70
|
+
suggestAcceptanceCriteria,
|
|
71
|
+
} from './templates/issue-body.js';
|
|
72
|
+
|
|
73
|
+
export {
|
|
74
|
+
generateClaudeCommand,
|
|
75
|
+
generateMinimalClaudeCommand,
|
|
76
|
+
} from './templates/claude-command.js';
|
|
77
|
+
|
|
78
|
+
// Utils
|
|
79
|
+
export {
|
|
80
|
+
getVersion,
|
|
81
|
+
checkPrerequisites,
|
|
82
|
+
loadConfigSync,
|
|
83
|
+
execCommand,
|
|
84
|
+
} from './utils.js';
|
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Claude Code Command Template Generator
|
|
3
|
+
*
|
|
4
|
+
* Generates a .claude/commands/ file that integrates with GitHub Task Kit
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Generate Claude Code command file content
|
|
9
|
+
*/
|
|
10
|
+
export function generateClaudeCommand(config) {
|
|
11
|
+
const { owner, repo, projectNumber, projectId, fieldIds, statusOptions } = config;
|
|
12
|
+
|
|
13
|
+
return `---
|
|
14
|
+
description: Create tracked GitHub issue with comprehensive metadata and codebase analysis
|
|
15
|
+
type: project
|
|
16
|
+
complexity: medium
|
|
17
|
+
model: claude-sonnet-4-5-20250929
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
# GitHub Create Task
|
|
21
|
+
# QUICK: Create comprehensive GitHub issue with rich documentation
|
|
22
|
+
|
|
23
|
+
Create a fully documented GitHub issue with codebase analysis, references, and testing workflow.
|
|
24
|
+
|
|
25
|
+
## Overview
|
|
26
|
+
|
|
27
|
+
This command creates a comprehensive, well-documented GitHub issue with:
|
|
28
|
+
- Detailed problem statement and acceptance criteria
|
|
29
|
+
- Automatic codebase analysis with file/line references
|
|
30
|
+
- Reference documentation links
|
|
31
|
+
- Recommended approach with todo checklist
|
|
32
|
+
|
|
33
|
+
**Project**: ${owner}/${repo} (Project #${projectNumber})
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
## Configuration
|
|
38
|
+
|
|
39
|
+
\`\`\`yaml
|
|
40
|
+
# Auto-generated by GitHub Task Kit
|
|
41
|
+
project_board:
|
|
42
|
+
owner: "${owner}"
|
|
43
|
+
repo: "${repo}"
|
|
44
|
+
project_number: ${projectNumber}
|
|
45
|
+
project_id: "${projectId}"
|
|
46
|
+
|
|
47
|
+
field_ids:
|
|
48
|
+
status: "${fieldIds?.status || 'CONFIGURE_ME'}"
|
|
49
|
+
priority: "${fieldIds?.priority || 'CONFIGURE_ME'}"
|
|
50
|
+
qa: "${fieldIds?.qa || ''}"
|
|
51
|
+
|
|
52
|
+
status_options:
|
|
53
|
+
todo: "${statusOptions?.todo || 'CONFIGURE_ME'}"
|
|
54
|
+
in_progress: "${statusOptions?.in_progress || 'CONFIGURE_ME'}"
|
|
55
|
+
done: "${statusOptions?.done || 'CONFIGURE_ME'}"
|
|
56
|
+
\`\`\`
|
|
57
|
+
|
|
58
|
+
---
|
|
59
|
+
|
|
60
|
+
## Workflow
|
|
61
|
+
|
|
62
|
+
### PHASE 1: Gather Information
|
|
63
|
+
|
|
64
|
+
Use AskUserQuestion to collect:
|
|
65
|
+
|
|
66
|
+
1. **Issue Title** - Clear, concise description
|
|
67
|
+
2. **Issue Description** - Problem statement, expected vs actual behavior
|
|
68
|
+
3. **Labels** - Type (bug, feature, refactor), Stack (frontend, backend)
|
|
69
|
+
4. **Priority** - P0-Critical, P1-High, P2-Medium, P3-Low
|
|
70
|
+
|
|
71
|
+
### PHASE 2: Codebase Analysis
|
|
72
|
+
|
|
73
|
+
**Deploy Explore Agent** to gather:
|
|
74
|
+
|
|
75
|
+
1. Find relevant files matching the issue domain
|
|
76
|
+
2. Locate key functions with line numbers
|
|
77
|
+
3. Identify patterns to follow
|
|
78
|
+
4. Gather code snippets
|
|
79
|
+
|
|
80
|
+
### PHASE 3: Create Issue
|
|
81
|
+
|
|
82
|
+
\`\`\`bash
|
|
83
|
+
# Create the issue
|
|
84
|
+
ISSUE_URL=$(gh issue create --repo ${owner}/${repo} \\
|
|
85
|
+
--title "[TITLE]" \\
|
|
86
|
+
--body "[GENERATED_BODY]" \\
|
|
87
|
+
--label "[LABELS]" \\
|
|
88
|
+
--assignee "${owner}")
|
|
89
|
+
|
|
90
|
+
# Extract issue number
|
|
91
|
+
ISSUE_NUM=$(echo "$ISSUE_URL" | grep -oP '\\d+$')
|
|
92
|
+
|
|
93
|
+
# Add to project board
|
|
94
|
+
gh project item-add ${projectNumber} --owner ${owner} --url "$ISSUE_URL"
|
|
95
|
+
|
|
96
|
+
echo "Created: Issue #$ISSUE_NUM"
|
|
97
|
+
echo "URL: $ISSUE_URL"
|
|
98
|
+
\`\`\`
|
|
99
|
+
|
|
100
|
+
### PHASE 4: Update Project Board Fields
|
|
101
|
+
|
|
102
|
+
\`\`\`bash
|
|
103
|
+
# Get item ID
|
|
104
|
+
ITEM_ID=$(gh project item-list ${projectNumber} --owner ${owner} --format json | jq -r ".items[] | select(.content.number == $ISSUE_NUM) | .id")
|
|
105
|
+
|
|
106
|
+
# Set Status to Todo
|
|
107
|
+
gh project item-edit --id "$ITEM_ID" \\
|
|
108
|
+
--field-id ${fieldIds?.status || 'STATUS_FIELD_ID'} \\
|
|
109
|
+
--project-id ${projectId} \\
|
|
110
|
+
--single-select-option-id "${statusOptions?.todo || 'TODO_OPTION_ID'}"
|
|
111
|
+
|
|
112
|
+
# Set Priority (if field exists)
|
|
113
|
+
# gh project item-edit --id "$ITEM_ID" \\
|
|
114
|
+
# --field-id ${fieldIds?.priority || 'PRIORITY_FIELD_ID'} \\
|
|
115
|
+
# --project-id ${projectId} \\
|
|
116
|
+
# --single-select-option-id "[PRIORITY_OPTION_ID]"
|
|
117
|
+
\`\`\`
|
|
118
|
+
|
|
119
|
+
---
|
|
120
|
+
|
|
121
|
+
## Issue Body Template
|
|
122
|
+
|
|
123
|
+
The generated issue body includes:
|
|
124
|
+
|
|
125
|
+
\`\`\`markdown
|
|
126
|
+
## Problem Statement
|
|
127
|
+
|
|
128
|
+
[Clear description of the issue]
|
|
129
|
+
|
|
130
|
+
## Expected vs Actual Behavior
|
|
131
|
+
|
|
132
|
+
**Expected**: [What should happen]
|
|
133
|
+
**Actual**: [What currently happens]
|
|
134
|
+
|
|
135
|
+
## Acceptance Criteria
|
|
136
|
+
|
|
137
|
+
- [ ] Criterion 1
|
|
138
|
+
- [ ] Criterion 2
|
|
139
|
+
|
|
140
|
+
---
|
|
141
|
+
|
|
142
|
+
## Code Analysis
|
|
143
|
+
|
|
144
|
+
### Relevant Files & Functions
|
|
145
|
+
|
|
146
|
+
| File | Line | Function/Component | Purpose |
|
|
147
|
+
|------|------|-------------------|---------|
|
|
148
|
+
| [file] | [line] | [function] | [purpose] |
|
|
149
|
+
|
|
150
|
+
### Patterns to Follow
|
|
151
|
+
|
|
152
|
+
- [Pattern from codebase analysis]
|
|
153
|
+
|
|
154
|
+
---
|
|
155
|
+
|
|
156
|
+
## Recommended Approach
|
|
157
|
+
|
|
158
|
+
### Todo List
|
|
159
|
+
|
|
160
|
+
- [ ] **Step 1**: [Task]
|
|
161
|
+
- [ ] **Step 2**: [Task]
|
|
162
|
+
|
|
163
|
+
---
|
|
164
|
+
|
|
165
|
+
*Created by GitHub Task Kit*
|
|
166
|
+
\`\`\`
|
|
167
|
+
|
|
168
|
+
---
|
|
169
|
+
|
|
170
|
+
## Labels Reference
|
|
171
|
+
|
|
172
|
+
**Type**:
|
|
173
|
+
- \`bug\` - Something isn't working
|
|
174
|
+
- \`feature\` - New functionality
|
|
175
|
+
- \`feature-update\` - Enhancement to existing feature
|
|
176
|
+
- \`refactor\` - Code improvement without behavior change
|
|
177
|
+
- \`documentation\` - Documentation only
|
|
178
|
+
|
|
179
|
+
**Stack**:
|
|
180
|
+
- \`frontend\` - UI/client changes
|
|
181
|
+
- \`backend\` - API/server changes
|
|
182
|
+
|
|
183
|
+
**Priority**:
|
|
184
|
+
- \`P0-Critical\` - Production broken
|
|
185
|
+
- \`P1-High\` - Major feature affected
|
|
186
|
+
- \`P2-Medium\` - Minor bug or new feature
|
|
187
|
+
- \`P3-Low\` - Nice to have
|
|
188
|
+
|
|
189
|
+
---
|
|
190
|
+
|
|
191
|
+
## Quick Commands
|
|
192
|
+
|
|
193
|
+
\`\`\`bash
|
|
194
|
+
# After creating issue, start working
|
|
195
|
+
git pull origin main
|
|
196
|
+
|
|
197
|
+
# When done
|
|
198
|
+
git add -A
|
|
199
|
+
git commit -m "feat: [description] (#[NUM])"
|
|
200
|
+
git push origin main
|
|
201
|
+
\`\`\`
|
|
202
|
+
|
|
203
|
+
---
|
|
204
|
+
|
|
205
|
+
## See Also
|
|
206
|
+
|
|
207
|
+
- \`gh issue list --repo ${owner}/${repo}\` - List issues
|
|
208
|
+
- \`gh project view ${projectNumber} --owner ${owner}\` - View project board
|
|
209
|
+
|
|
210
|
+
---
|
|
211
|
+
|
|
212
|
+
*Generated by GitHub Task Kit - https://github.com/yourname/github-task-kit*
|
|
213
|
+
`;
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
/**
|
|
217
|
+
* Generate minimal Claude command (just the essentials)
|
|
218
|
+
*/
|
|
219
|
+
export function generateMinimalClaudeCommand(config) {
|
|
220
|
+
const { owner, repo, projectNumber } = config;
|
|
221
|
+
|
|
222
|
+
return `---
|
|
223
|
+
description: Create GitHub issue for ${repo}
|
|
224
|
+
type: project
|
|
225
|
+
---
|
|
226
|
+
|
|
227
|
+
# Create Task
|
|
228
|
+
|
|
229
|
+
Quick issue creation for ${owner}/${repo}.
|
|
230
|
+
|
|
231
|
+
## Usage
|
|
232
|
+
|
|
233
|
+
1. Provide title and description
|
|
234
|
+
2. Select labels and priority
|
|
235
|
+
3. Issue created and added to project #${projectNumber}
|
|
236
|
+
|
|
237
|
+
## Command
|
|
238
|
+
|
|
239
|
+
\`\`\`bash
|
|
240
|
+
gh issue create --repo ${owner}/${repo} --title "[TITLE]" --body "[BODY]"
|
|
241
|
+
gh project item-add ${projectNumber} --owner ${owner} --url "[ISSUE_URL]"
|
|
242
|
+
\`\`\`
|
|
243
|
+
`;
|
|
244
|
+
}
|