@idea1/cli 1.5.1 → 1.6.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.
- package/README.md +124 -93
- package/dist/commands/approve-pr.d.ts.map +1 -1
- package/dist/commands/approve-pr.js +7 -163
- package/dist/commands/approve-pr.js.map +1 -1
- package/dist/commands/attach-project-item.d.ts.map +1 -1
- package/dist/commands/attach-project-item.js +38 -89
- package/dist/commands/attach-project-item.js.map +1 -1
- package/dist/commands/close-worktree.d.ts.map +1 -1
- package/dist/commands/close-worktree.js +3 -2
- package/dist/commands/close-worktree.js.map +1 -1
- package/dist/commands/help.d.ts.map +1 -1
- package/dist/commands/help.js +17 -14
- package/dist/commands/help.js.map +1 -1
- package/dist/commands/index.d.ts +3 -2
- package/dist/commands/index.d.ts.map +1 -1
- package/dist/commands/index.js +5 -3
- package/dist/commands/index.js.map +1 -1
- package/dist/commands/join-project-item.d.ts.map +1 -1
- package/dist/commands/join-project-item.js +38 -77
- package/dist/commands/join-project-item.js.map +1 -1
- package/dist/commands/next-workflow-step.d.ts.map +1 -1
- package/dist/commands/next-workflow-step.js +66 -51
- package/dist/commands/next-workflow-step.js.map +1 -1
- package/dist/commands/ready-for-approval.d.ts.map +1 -1
- package/dist/commands/ready-for-approval.js +7 -66
- package/dist/commands/ready-for-approval.js.map +1 -1
- package/dist/commands/start-agent-implementation.d.ts +3 -0
- package/dist/commands/start-agent-implementation.d.ts.map +1 -0
- package/dist/commands/start-agent-implementation.js +41 -0
- package/dist/commands/start-agent-implementation.js.map +1 -0
- package/dist/commands/start-dev-implementation.d.ts.map +1 -1
- package/dist/commands/start-dev-implementation.js +8 -54
- package/dist/commands/start-dev-implementation.js.map +1 -1
- package/dist/commands/start.d.ts +13 -0
- package/dist/commands/start.d.ts.map +1 -0
- package/dist/commands/start.js +81 -0
- package/dist/commands/start.js.map +1 -0
- package/dist/interactive.d.ts.map +1 -1
- package/dist/interactive.js +29 -9
- package/dist/interactive.js.map +1 -1
- package/dist/lib/claude-options.d.ts +33 -0
- package/dist/lib/claude-options.d.ts.map +1 -0
- package/dist/lib/claude-options.js +83 -0
- package/dist/lib/claude-options.js.map +1 -0
- package/dist/lib/settings.d.ts.map +1 -1
- package/dist/lib/settings.js +5 -5
- package/dist/lib/settings.js.map +1 -1
- package/dist/lib/workflow-states.d.ts +21 -3
- package/dist/lib/workflow-states.d.ts.map +1 -1
- package/dist/lib/workflow-states.generated.d.ts +21 -0
- package/dist/lib/workflow-states.generated.d.ts.map +1 -0
- package/dist/lib/workflow-states.generated.js +34 -0
- package/dist/lib/workflow-states.generated.js.map +1 -0
- package/dist/lib/workflow-states.js +47 -26
- package/dist/lib/workflow-states.js.map +1 -1
- package/dist/services/branch-setup.d.ts +42 -0
- package/dist/services/branch-setup.d.ts.map +1 -0
- package/dist/services/branch-setup.js +116 -0
- package/dist/services/branch-setup.js.map +1 -0
- package/dist/services/claude.d.ts +14 -4
- package/dist/services/claude.d.ts.map +1 -1
- package/dist/services/claude.js +39 -4
- package/dist/services/claude.js.map +1 -1
- package/dist/services/git.d.ts +66 -0
- package/dist/services/git.d.ts.map +1 -1
- package/dist/services/git.js +161 -6
- package/dist/services/git.js.map +1 -1
- package/dist/services/workflow-engine.d.ts +67 -0
- package/dist/services/workflow-engine.d.ts.map +1 -0
- package/dist/services/workflow-engine.js +371 -0
- package/dist/services/workflow-engine.js.map +1 -0
- package/dist/services/workflow-handlers/agent-implementation.d.ts +9 -0
- package/dist/services/workflow-handlers/agent-implementation.d.ts.map +1 -0
- package/dist/services/workflow-handlers/agent-implementation.js +37 -0
- package/dist/services/workflow-handlers/agent-implementation.js.map +1 -0
- package/dist/services/workflow-handlers/approve-pr.d.ts +8 -0
- package/dist/services/workflow-handlers/approve-pr.d.ts.map +1 -0
- package/dist/services/workflow-handlers/approve-pr.js +161 -0
- package/dist/services/workflow-handlers/approve-pr.js.map +1 -0
- package/dist/services/workflow-handlers/dev-implementation.d.ts +8 -0
- package/dist/services/workflow-handlers/dev-implementation.d.ts.map +1 -0
- package/dist/services/workflow-handlers/dev-implementation.js +34 -0
- package/dist/services/workflow-handlers/dev-implementation.js.map +1 -0
- package/dist/services/workflow-handlers/index.d.ts +18 -0
- package/dist/services/workflow-handlers/index.d.ts.map +1 -0
- package/dist/services/workflow-handlers/index.js +36 -0
- package/dist/services/workflow-handlers/index.js.map +1 -0
- package/dist/services/workflow-handlers/ready-for-approval.d.ts +8 -0
- package/dist/services/workflow-handlers/ready-for-approval.d.ts.map +1 -0
- package/dist/services/workflow-handlers/ready-for-approval.js +60 -0
- package/dist/services/workflow-handlers/ready-for-approval.js.map +1 -0
- package/dist/services/workflow.d.ts +1 -21
- package/dist/services/workflow.d.ts.map +1 -1
- package/dist/services/workflow.js +1 -67
- package/dist/services/workflow.js.map +1 -1
- package/dist/services/worktree.d.ts +29 -27
- package/dist/services/worktree.d.ts.map +1 -1
- package/dist/services/worktree.js +51 -77
- package/dist/services/worktree.js.map +1 -1
- package/dist/types/index.d.ts +41 -4
- package/dist/types/index.d.ts.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +2 -2
- package/dist/commands/start-project-item.d.ts +0 -27
- package/dist/commands/start-project-item.d.ts.map +0 -1
- package/dist/commands/start-project-item.js +0 -325
- package/dist/commands/start-project-item.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"join-project-item.js","sourceRoot":"","sources":["../../src/commands/join-project-item.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"join-project-item.js","sourceRoot":"","sources":["../../src/commands/join-project-item.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"next-workflow-step.d.ts","sourceRoot":"","sources":["../../src/commands/next-workflow-step.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"next-workflow-step.d.ts","sourceRoot":"","sources":["../../src/commands/next-workflow-step.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAQjD,eAAO,MAAM,uBAAuB,EAAE,OA0DrC,CAAC"}
|
|
@@ -1,61 +1,76 @@
|
|
|
1
1
|
import { logger } from '../lib/logger.js';
|
|
2
|
-
import {
|
|
3
|
-
import
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
/**
|
|
8
|
-
* Resolve a transition command's options (prompting for any that weren't
|
|
9
|
-
* supplied) before executing it. Running the transition directly with an empty
|
|
10
|
-
* object would skip resolution entirely, leaving options like the PR assignee
|
|
11
|
-
* undefined.
|
|
12
|
-
*/
|
|
13
|
-
async function runTransition(command) {
|
|
14
|
-
const resolved = await resolveOptions(command, {});
|
|
15
|
-
await command.execute(resolved);
|
|
16
|
-
}
|
|
2
|
+
import { validateProjectItemUrl } from '../lib/project-item-url.js';
|
|
3
|
+
import { WORKFLOW_STATES, getNextWorkflowState, isStateAtOrAfter, normalizeWorkflowState } from '../lib/workflow-states.js';
|
|
4
|
+
import { branchCreationOptions } from '../services/branch-setup.js';
|
|
5
|
+
import { advanceTo, ensureManaged, resolveContext } from '../services/workflow-engine.js';
|
|
6
|
+
import { deferredHandlerOptions } from '../services/workflow-handlers/index.js';
|
|
17
7
|
export const nextWorkflowStepCommand = {
|
|
18
8
|
name: 'next-workflow-step',
|
|
19
9
|
aliases: ['next', 'n'],
|
|
20
|
-
description: '
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
10
|
+
description: 'Advance the project item to the next workflow state (or through several, with --to), running the automation of every state entered',
|
|
11
|
+
options: [
|
|
12
|
+
{
|
|
13
|
+
longName: 'url',
|
|
14
|
+
shortName: 'u',
|
|
15
|
+
description: 'Project item URL (required when not on the item\'s branch)',
|
|
16
|
+
defaultValue: '',
|
|
17
|
+
promptWhenDefaultExists: false,
|
|
18
|
+
validate: (value) => (value ? validateProjectItemUrl(value) : undefined)
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
longName: 'to',
|
|
22
|
+
description: 'Workflow state to advance to; every state between the current one and it is entered in order',
|
|
23
|
+
defaultValue: '',
|
|
24
|
+
promptWhenDefaultExists: false,
|
|
25
|
+
validate: (value) => (value === '' || normalizeWorkflowState(value) !== null
|
|
26
|
+
? undefined
|
|
27
|
+
: `Unknown workflow state '${value}'. One of: ${WORKFLOW_STATES.join(', ')}`)
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
longName: 'source-path',
|
|
31
|
+
shortName: 'p',
|
|
32
|
+
description: 'Path to source directory',
|
|
33
|
+
defaultValue: '',
|
|
34
|
+
promptWhenDefaultExists: false
|
|
35
|
+
},
|
|
36
|
+
// Branch creation choices apply when the item has no branch yet; the engine
|
|
37
|
+
// prompts for what it needs, so none of these are asked up front.
|
|
38
|
+
...branchCreationOptions.map(option => ({ ...option, dependsOn: () => false })),
|
|
39
|
+
...deferredHandlerOptions()
|
|
40
|
+
],
|
|
41
|
+
async execute(resolved) {
|
|
42
|
+
const sourcePath = resolved['source-path'];
|
|
43
|
+
if (sourcePath) {
|
|
44
|
+
process.chdir(sourcePath);
|
|
26
45
|
}
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
const nextTransition = await workflow.getNextTransition();
|
|
33
|
-
if (!nextTransition) {
|
|
34
|
-
if (status.workflowState === 'Approved and Merged' || status.workflowState === 'Released') {
|
|
35
|
-
logger.success('Workflow is complete! No more steps to perform.');
|
|
36
|
-
logger.hint(`Project item: ${status.projectItemUrl}`);
|
|
37
|
-
}
|
|
38
|
-
else {
|
|
39
|
-
logger.warning('No valid transitions available from the current state.');
|
|
40
|
-
}
|
|
46
|
+
const context = await resolveContext({ projectItemUrl: resolved['url'] || undefined, options: resolved });
|
|
47
|
+
const targetState = resolveTargetState(context.currentState, resolved['to']);
|
|
48
|
+
if (!targetState) {
|
|
49
|
+
logger.success('Workflow is complete! No more steps to perform.');
|
|
50
|
+
logger.hint(`Project item: ${context.projectItemUrl}`);
|
|
41
51
|
return;
|
|
42
52
|
}
|
|
43
|
-
logger.info(`
|
|
44
|
-
|
|
45
|
-
//
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
break;
|
|
50
|
-
case 'ready-for-approval':
|
|
51
|
-
await runTransition(readyForApprovalCommand);
|
|
52
|
-
break;
|
|
53
|
-
case 'approve-pr':
|
|
54
|
-
await runTransition(approvePrCommand);
|
|
55
|
-
break;
|
|
56
|
-
default:
|
|
57
|
-
throw new Error(`Unknown transition: ${nextTransition}`);
|
|
58
|
-
}
|
|
53
|
+
logger.info(`Current workflow state: ${context.currentState ?? '(not started)'}`);
|
|
54
|
+
// An item that was never started enters the first state here, which is the
|
|
55
|
+
// whole transition; otherwise the branch is only made consistent and the
|
|
56
|
+
// transition below records the new state.
|
|
57
|
+
await ensureManaged(context, { deferItemStatusWrite: context.currentState !== null });
|
|
58
|
+
await advanceTo(context, targetState);
|
|
59
59
|
}
|
|
60
60
|
};
|
|
61
|
+
/**
|
|
62
|
+
* The state to move to: the requested one, or the next state when none was
|
|
63
|
+
* requested. Null when there is nothing ahead. Requesting a state the item is
|
|
64
|
+
* already at or past is an error — the CLI never moves an item backwards.
|
|
65
|
+
*/
|
|
66
|
+
function resolveTargetState(currentState, requested) {
|
|
67
|
+
if (!requested) {
|
|
68
|
+
return getNextWorkflowState(currentState);
|
|
69
|
+
}
|
|
70
|
+
const targetState = normalizeWorkflowState(requested);
|
|
71
|
+
if (currentState !== null && isStateAtOrAfter(currentState, targetState)) {
|
|
72
|
+
throw new Error(`The item is already at '${currentState}', which is not before '${targetState}'. Move it back in the web client if that is intended; the CLI only advances.`);
|
|
73
|
+
}
|
|
74
|
+
return targetState;
|
|
75
|
+
}
|
|
61
76
|
//# sourceMappingURL=next-workflow-step.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"next-workflow-step.js","sourceRoot":"","sources":["../../src/commands/next-workflow-step.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"next-workflow-step.js","sourceRoot":"","sources":["../../src/commands/next-workflow-step.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ready-for-approval.d.ts","sourceRoot":"","sources":["../../src/commands/ready-for-approval.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"ready-for-approval.d.ts","sourceRoot":"","sources":["../../src/commands/ready-for-approval.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAKjD,eAAO,MAAM,uBAAuB,EAAE,OAWrC,CAAC"}
|
|
@@ -1,74 +1,15 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import
|
|
3
|
-
import
|
|
4
|
-
import * as claude from '../services/claude.js';
|
|
5
|
-
import * as workflow from '../services/workflow.js';
|
|
6
|
-
import { removeWorktreeForWorkflowState } from '../services/worktree.js';
|
|
1
|
+
import { WorkflowStates } from '../lib/workflow-states.js';
|
|
2
|
+
import { advanceTo, requireCurrentState, resolveContext } from '../services/workflow-engine.js';
|
|
3
|
+
import { readyForApprovalHandler } from '../services/workflow-handlers/ready-for-approval.js';
|
|
7
4
|
export const readyForApprovalCommand = {
|
|
8
5
|
name: 'ready-for-approval',
|
|
9
6
|
aliases: ['rfa'],
|
|
10
7
|
description: 'Mark PR as ready for approval and assign reviewers/assignee',
|
|
11
|
-
options:
|
|
12
|
-
{
|
|
13
|
-
longName: 'assignee',
|
|
14
|
-
shortName: 'a',
|
|
15
|
-
description: 'Who to assign the PR to',
|
|
16
|
-
choices: 'github-members',
|
|
17
|
-
allowNone: true
|
|
18
|
-
},
|
|
19
|
-
{
|
|
20
|
-
longName: 'reviewers',
|
|
21
|
-
shortName: 'r',
|
|
22
|
-
description: 'Who to request a review from (select any number)',
|
|
23
|
-
choices: 'github-members',
|
|
24
|
-
multiSelect: true
|
|
25
|
-
}
|
|
26
|
-
],
|
|
8
|
+
options: readyForApprovalHandler.options,
|
|
27
9
|
async execute(resolved) {
|
|
28
|
-
const
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
.map(name => name.trim())
|
|
32
|
-
.filter(name => name.length > 0);
|
|
33
|
-
// Validate transition
|
|
34
|
-
const validation = await workflow.validateTransition('ready-for-approval');
|
|
35
|
-
if (!validation.valid) {
|
|
36
|
-
throw new Error(validation.error ?? 'Invalid transition');
|
|
37
|
-
}
|
|
38
|
-
// Ensure workflow preconditions
|
|
39
|
-
await workflow.ensureWorkflowPreconditions();
|
|
40
|
-
// Get branch info
|
|
41
|
-
const branchName = await git.getCurrentBranch();
|
|
42
|
-
const projectItemUrl = await git.getProjectItemUrl();
|
|
43
|
-
const baseBranch = await git.getBaseBranch() ?? 'working/release';
|
|
44
|
-
if (!projectItemUrl) {
|
|
45
|
-
throw new Error('No project item URL found for this branch.');
|
|
46
|
-
}
|
|
47
|
-
logger.info(`Current branch: ${branchName}`);
|
|
48
|
-
// Check PR exists
|
|
49
|
-
const prInfo = await github.checkPrExists(branchName, baseBranch);
|
|
50
|
-
if (!prInfo) {
|
|
51
|
-
throw new Error('No PR exists for this branch. Create a PR first with: idea1 push');
|
|
52
|
-
}
|
|
53
|
-
logger.info(`PR #${prInfo.number} found`);
|
|
54
|
-
// Request reviews and set the assignee (each no-ops when nothing was chosen)
|
|
55
|
-
await github.assignReviewers(branchName, reviewers);
|
|
56
|
-
await github.assignAssignee(branchName, assignee);
|
|
57
|
-
if (reviewers.length === 0 && !assignee) {
|
|
58
|
-
logger.dim('No reviewers requested and no assignee set.');
|
|
59
|
-
}
|
|
60
|
-
// Update workflow state, commit metadata, and push before worktree removal
|
|
61
|
-
await git.storeWorkflowState('Needs Approval for Release');
|
|
62
|
-
await git.commitBranchMetadataIfChanged(branchName);
|
|
63
|
-
await git.pushToRemote(branchName);
|
|
64
|
-
await claude.setWorkflowStatus(projectItemUrl, 'Needs Approval for Release');
|
|
65
|
-
// If in a worktree, remove it when settings say the worktree goes at this state
|
|
66
|
-
await removeWorktreeForWorkflowState('Needs Approval for Release', branchName);
|
|
67
|
-
logger.newline();
|
|
68
|
-
logger.success('PR is ready for approval');
|
|
69
|
-
logger.newline();
|
|
70
|
-
logger.hint(`PR: ${prInfo.url}`);
|
|
71
|
-
logger.hint('When approved, run: idea1 approve-pr');
|
|
10
|
+
const context = await resolveContext({ options: resolved });
|
|
11
|
+
requireCurrentState(context, WorkflowStates.DevImplementation, 'ready-for-approval');
|
|
12
|
+
await advanceTo(context, WorkflowStates.NeedsApprovalForRelease);
|
|
72
13
|
}
|
|
73
14
|
};
|
|
74
15
|
//# sourceMappingURL=ready-for-approval.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ready-for-approval.js","sourceRoot":"","sources":["../../src/commands/ready-for-approval.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"ready-for-approval.js","sourceRoot":"","sources":["../../src/commands/ready-for-approval.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAChG,OAAO,EAAE,uBAAuB,EAAE,MAAM,qDAAqD,CAAC;AAE9F,MAAM,CAAC,MAAM,uBAAuB,GAAY;IAC9C,IAAI,EAAE,oBAAoB;IAC1B,OAAO,EAAE,CAAC,KAAK,CAAC;IAChB,WAAW,EAAE,6DAA6D;IAC1E,OAAO,EAAE,uBAAuB,CAAC,OAAO;IAExC,KAAK,CAAC,OAAO,CAAC,QAAgC;QAC5C,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC5D,mBAAmB,CAAC,OAAO,EAAE,cAAc,CAAC,iBAAiB,EAAE,oBAAoB,CAAC,CAAC;QACrF,MAAM,SAAS,CAAC,OAAO,EAAE,cAAc,CAAC,uBAAuB,CAAC,CAAC;IACnE,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"start-agent-implementation.d.ts","sourceRoot":"","sources":["../../src/commands/start-agent-implementation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAQjD,eAAO,MAAM,+BAA+B,EAAE,OA0C7C,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { logger } from '../lib/logger.js';
|
|
2
|
+
import { WorkflowStates, isStateAtOrAfter } from '../lib/workflow-states.js';
|
|
3
|
+
import { branchCreationOptions } from '../services/branch-setup.js';
|
|
4
|
+
import { advanceTo, ensureManaged, resolveContext } from '../services/workflow-engine.js';
|
|
5
|
+
import { agentImplementationHandler } from '../services/workflow-handlers/agent-implementation.js';
|
|
6
|
+
import { projectItemTargetOptions, resolveOrCreateProjectItem } from './start.js';
|
|
7
|
+
export const startAgentImplementationCommand = {
|
|
8
|
+
name: 'start-agent-implementation',
|
|
9
|
+
// 'start-project-item' is kept so existing team command templates keep working.
|
|
10
|
+
aliases: ['implement', 'sai', 'start-project-item'],
|
|
11
|
+
description: 'Start implementing a project item: put it under workflow management, move it to Agent Implementation and launch Claude',
|
|
12
|
+
options: [
|
|
13
|
+
...projectItemTargetOptions,
|
|
14
|
+
...branchCreationOptions,
|
|
15
|
+
...(agentImplementationHandler.options ?? [])
|
|
16
|
+
],
|
|
17
|
+
async execute(resolved) {
|
|
18
|
+
const sourcePath = resolved['source-path'];
|
|
19
|
+
if (sourcePath) {
|
|
20
|
+
process.chdir(sourcePath);
|
|
21
|
+
}
|
|
22
|
+
const projectItemUrl = await resolveOrCreateProjectItem(resolved);
|
|
23
|
+
const context = await resolveContext({ projectItemUrl, options: resolved });
|
|
24
|
+
if (context.currentState && isStateAtOrAfter(context.currentState, WorkflowStates.DevImplementation)) {
|
|
25
|
+
throw new Error(`${projectItemUrl} is already past Agent Implementation (state: ${context.currentState}). ` +
|
|
26
|
+
`Use 'idea1 join-project-item --project-item-url ${projectItemUrl}' to set up a working environment.`);
|
|
27
|
+
}
|
|
28
|
+
logger.section('Agent Implementation');
|
|
29
|
+
const alreadyImplementing = context.currentState === WorkflowStates.AgentImplementation;
|
|
30
|
+
await ensureManaged(context, { deferItemStatusWrite: !alreadyImplementing });
|
|
31
|
+
if (alreadyImplementing) {
|
|
32
|
+
// Nothing to transition: set up the working environment and launch Claude.
|
|
33
|
+
logger.info('The item is already in Agent Implementation — setting up the working environment.');
|
|
34
|
+
await agentImplementationHandler.prepare?.(context);
|
|
35
|
+
await agentImplementationHandler.complete?.(context);
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
await advanceTo(context, WorkflowStates.AgentImplementation);
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
//# sourceMappingURL=start-agent-implementation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"start-agent-implementation.js","sourceRoot":"","sources":["../../src/commands/start-agent-implementation.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC7E,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AACpE,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAC1F,OAAO,EAAE,0BAA0B,EAAE,MAAM,uDAAuD,CAAC;AACnG,OAAO,EAAE,wBAAwB,EAAE,0BAA0B,EAAE,MAAM,YAAY,CAAC;AAElF,MAAM,CAAC,MAAM,+BAA+B,GAAY;IACtD,IAAI,EAAE,4BAA4B;IAClC,gFAAgF;IAChF,OAAO,EAAE,CAAC,WAAW,EAAE,KAAK,EAAE,oBAAoB,CAAC;IACnD,WAAW,EAAE,wHAAwH;IACrI,OAAO,EAAE;QACP,GAAG,wBAAwB;QAC3B,GAAG,qBAAqB;QACxB,GAAG,CAAC,0BAA0B,CAAC,OAAO,IAAI,EAAE,CAAC;KAC9C;IAED,KAAK,CAAC,OAAO,CAAC,QAAgC;QAC5C,MAAM,UAAU,GAAG,QAAQ,CAAC,aAAa,CAAC,CAAC;QAC3C,IAAI,UAAU,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAC5B,CAAC;QAED,MAAM,cAAc,GAAG,MAAM,0BAA0B,CAAC,QAAQ,CAAC,CAAC;QAClE,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,EAAE,cAAc,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC;QAE5E,IAAI,OAAO,CAAC,YAAY,IAAI,gBAAgB,CAAC,OAAO,CAAC,YAAY,EAAE,cAAc,CAAC,iBAAiB,CAAC,EAAE,CAAC;YACrG,MAAM,IAAI,KAAK,CACb,GAAG,cAAc,iDAAiD,OAAO,CAAC,YAAY,KAAK;gBAC3F,mDAAmD,cAAc,oCAAoC,CACtG,CAAC;QACJ,CAAC;QAED,MAAM,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC;QAEvC,MAAM,mBAAmB,GAAG,OAAO,CAAC,YAAY,KAAK,cAAc,CAAC,mBAAmB,CAAC;QACxF,MAAM,aAAa,CAAC,OAAO,EAAE,EAAE,oBAAoB,EAAE,CAAC,mBAAmB,EAAE,CAAC,CAAC;QAE7E,IAAI,mBAAmB,EAAE,CAAC;YACxB,2EAA2E;YAC3E,MAAM,CAAC,IAAI,CAAC,mFAAmF,CAAC,CAAC;YACjG,MAAM,0BAA0B,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,CAAC;YACpD,MAAM,0BAA0B,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,CAAC;YACrD,OAAO;QACT,CAAC;QAED,MAAM,SAAS,CAAC,OAAO,EAAE,cAAc,CAAC,mBAAmB,CAAC,CAAC;IAC/D,CAAC;CACF,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"start-dev-implementation.d.ts","sourceRoot":"","sources":["../../src/commands/start-dev-implementation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"start-dev-implementation.d.ts","sourceRoot":"","sources":["../../src/commands/start-dev-implementation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAKjD,eAAO,MAAM,6BAA6B,EAAE,OAyB3C,CAAC"}
|
|
@@ -1,9 +1,6 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import
|
|
3
|
-
import
|
|
4
|
-
import * as claude from '../services/claude.js';
|
|
5
|
-
import * as workflow from '../services/workflow.js';
|
|
6
|
-
import { removeWorktreeForWorkflowState } from '../services/worktree.js';
|
|
1
|
+
import { WorkflowStates } from '../lib/workflow-states.js';
|
|
2
|
+
import { advanceTo, requireCurrentState, resolveContext } from '../services/workflow-engine.js';
|
|
3
|
+
import { devImplementationHandler } from '../services/workflow-handlers/dev-implementation.js';
|
|
7
4
|
export const startDevImplementationCommand = {
|
|
8
5
|
name: 'start-dev-implementation',
|
|
9
6
|
aliases: ['dev'],
|
|
@@ -15,60 +12,17 @@ export const startDevImplementationCommand = {
|
|
|
15
12
|
description: 'Path to worktree directory',
|
|
16
13
|
defaultValue: '',
|
|
17
14
|
promptWhenDefaultExists: false
|
|
18
|
-
}
|
|
15
|
+
},
|
|
16
|
+
...(devImplementationHandler.options ?? [])
|
|
19
17
|
],
|
|
20
18
|
async execute(resolved) {
|
|
21
19
|
const sourcePath = resolved['source-path'];
|
|
22
|
-
// Navigate to source path if provided
|
|
23
20
|
if (sourcePath) {
|
|
24
21
|
process.chdir(sourcePath);
|
|
25
22
|
}
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
throw new Error(validation.error ?? 'Invalid transition');
|
|
30
|
-
}
|
|
31
|
-
// Ensure workflow preconditions (has project item URL, no uncommitted changes)
|
|
32
|
-
// Note: For this transition, we allow uncommitted changes since we'll commit them
|
|
33
|
-
const projectItemUrl = await git.getProjectItemUrl();
|
|
34
|
-
if (!projectItemUrl) {
|
|
35
|
-
throw new Error('This branch is not under workflow management. Start with: idea1 start-project-item <url>');
|
|
36
|
-
}
|
|
37
|
-
// Get branch info
|
|
38
|
-
const branchName = await git.getCurrentBranch();
|
|
39
|
-
const baseBranch = await git.getBaseBranch() ?? 'working/release';
|
|
40
|
-
logger.info(`Current branch: ${branchName}`);
|
|
41
|
-
logger.info(`Base branch: ${baseBranch}`);
|
|
42
|
-
// Check for uncommitted changes and commit them
|
|
43
|
-
const hasChanges = await git.hasUncommittedChanges();
|
|
44
|
-
if (hasChanges) {
|
|
45
|
-
const commitMessage = `Agent Implementation of ${projectItemUrl} on ${branchName}`;
|
|
46
|
-
await git.commitAllChanges(commitMessage);
|
|
47
|
-
}
|
|
48
|
-
// Update workflow state and commit metadata before push
|
|
49
|
-
await git.storeWorkflowState('Dev Implementation');
|
|
50
|
-
await git.commitBranchMetadataIfChanged(branchName);
|
|
51
|
-
// Push changes to remote
|
|
52
|
-
await git.pushToRemote(branchName);
|
|
53
|
-
// Create PR if it doesn't exist
|
|
54
|
-
let prInfo = await github.checkPrExists(branchName, baseBranch);
|
|
55
|
-
if (!prInfo) {
|
|
56
|
-
prInfo = await github.createPrIfNeeded(branchName, baseBranch, projectItemUrl);
|
|
57
|
-
}
|
|
58
|
-
else {
|
|
59
|
-
logger.info(`PR #${prInfo.number} already exists for this branch.`);
|
|
60
|
-
}
|
|
61
|
-
// Update workflow status on idea1.ai
|
|
62
|
-
await claude.setWorkflowStatus(projectItemUrl, 'Dev Implementation');
|
|
63
|
-
// If in a worktree, close it when settings say the worktree goes at this state
|
|
64
|
-
await removeWorktreeForWorkflowState('Dev Implementation', branchName);
|
|
65
|
-
logger.newline();
|
|
66
|
-
logger.success('Transitioned to Dev Implementation');
|
|
67
|
-
logger.newline();
|
|
68
|
-
if (prInfo) {
|
|
69
|
-
logger.hint(`PR: ${prInfo.url}`);
|
|
70
|
-
}
|
|
71
|
-
logger.hint('When ready for review, run: idea1 ready-for-approval [--assignee <username>] [--reviewers <user1,user2>]');
|
|
23
|
+
const context = await resolveContext({ options: resolved });
|
|
24
|
+
requireCurrentState(context, WorkflowStates.AgentImplementation, 'start-dev-implementation');
|
|
25
|
+
await advanceTo(context, WorkflowStates.DevImplementation);
|
|
72
26
|
}
|
|
73
27
|
};
|
|
74
28
|
//# sourceMappingURL=start-dev-implementation.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"start-dev-implementation.js","sourceRoot":"","sources":["../../src/commands/start-dev-implementation.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"start-dev-implementation.js","sourceRoot":"","sources":["../../src/commands/start-dev-implementation.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAChG,OAAO,EAAE,wBAAwB,EAAE,MAAM,qDAAqD,CAAC;AAE/F,MAAM,CAAC,MAAM,6BAA6B,GAAY;IACpD,IAAI,EAAE,0BAA0B;IAChC,OAAO,EAAE,CAAC,KAAK,CAAC;IAChB,WAAW,EAAE,yFAAyF;IACtG,OAAO,EAAE;QACP;YACE,QAAQ,EAAE,aAAa;YACvB,SAAS,EAAE,GAAG;YACd,WAAW,EAAE,4BAA4B;YACzC,YAAY,EAAE,EAAE;YAChB,uBAAuB,EAAE,KAAK;SAC/B;QACD,GAAG,CAAC,wBAAwB,CAAC,OAAO,IAAI,EAAE,CAAC;KAC5C;IAED,KAAK,CAAC,OAAO,CAAC,QAAgC;QAC5C,MAAM,UAAU,GAAG,QAAQ,CAAC,aAAa,CAAC,CAAC;QAC3C,IAAI,UAAU,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAC5B,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC5D,mBAAmB,CAAC,OAAO,EAAE,cAAc,CAAC,mBAAmB,EAAE,0BAA0B,CAAC,CAAC;QAC7F,MAAM,SAAS,CAAC,OAAO,EAAE,cAAc,CAAC,iBAAiB,CAAC,CAAC;IAC7D,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { Command, CommandOption } from '../types/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* Options every command that can put an item under workflow management shares:
|
|
4
|
+
* which item (or a new one to create) and where the repository is.
|
|
5
|
+
*/
|
|
6
|
+
export declare const projectItemTargetOptions: CommandOption[];
|
|
7
|
+
/**
|
|
8
|
+
* Resolve the item a command targets: the given URL, or a brand new item
|
|
9
|
+
* created from the title.
|
|
10
|
+
*/
|
|
11
|
+
export declare function resolveOrCreateProjectItem(resolved: Record<string, string>): Promise<string>;
|
|
12
|
+
export declare const startCommand: Command;
|
|
13
|
+
//# sourceMappingURL=start.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../../src/commands/start.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAOhE;;;GAGG;AACH,eAAO,MAAM,wBAAwB,EAAE,aAAa,EA6BnD,CAAC;AAEF;;;GAGG;AACH,wBAAsB,0BAA0B,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAQlG;AAED,eAAO,MAAM,YAAY,EAAE,OAmC1B,CAAC"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { logger } from '../lib/logger.js';
|
|
2
|
+
import { isProjectItemUrl, validateProjectItemUrl } from '../lib/project-item-url.js';
|
|
3
|
+
import * as claude from '../services/claude.js';
|
|
4
|
+
import { branchCreationOptions } from '../services/branch-setup.js';
|
|
5
|
+
import { ensureManaged, resolveContext } from '../services/workflow-engine.js';
|
|
6
|
+
/**
|
|
7
|
+
* Options every command that can put an item under workflow management shares:
|
|
8
|
+
* which item (or a new one to create) and where the repository is.
|
|
9
|
+
*/
|
|
10
|
+
export const projectItemTargetOptions = [
|
|
11
|
+
{
|
|
12
|
+
// Declared first so it's the very first thing prompted — later choices
|
|
13
|
+
// depend on whether it was provided.
|
|
14
|
+
longName: 'url',
|
|
15
|
+
shortName: 'u',
|
|
16
|
+
description: 'Project item URL (leave blank to create a new item)',
|
|
17
|
+
defaultValue: '',
|
|
18
|
+
promptWhenDefaultExists: true,
|
|
19
|
+
// Allow blank (signals "create a new item"); validate format otherwise.
|
|
20
|
+
validate: (value) => (value ? validateProjectItemUrl(value) : undefined)
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
// Only prompted (and required) when no URL was given, i.e. the user is
|
|
24
|
+
// creating a new item. Declared after 'url' so it can read its value.
|
|
25
|
+
longName: 'title',
|
|
26
|
+
shortName: 't',
|
|
27
|
+
description: 'Title for the new project item',
|
|
28
|
+
dependsOn: (resolved) => !resolved['url'],
|
|
29
|
+
validate: (value) => value.trim() ? undefined : 'A title is required to create a project item'
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
longName: 'source-path',
|
|
33
|
+
shortName: 'p',
|
|
34
|
+
description: 'Path to source directory',
|
|
35
|
+
defaultValue: '',
|
|
36
|
+
promptWhenDefaultExists: false
|
|
37
|
+
}
|
|
38
|
+
];
|
|
39
|
+
/**
|
|
40
|
+
* Resolve the item a command targets: the given URL, or a brand new item
|
|
41
|
+
* created from the title.
|
|
42
|
+
*/
|
|
43
|
+
export async function resolveOrCreateProjectItem(resolved) {
|
|
44
|
+
const projectItemUrl = resolved['url'] || await claude.createProjectItem(resolved['title'].trim());
|
|
45
|
+
if (!isProjectItemUrl(projectItemUrl)) {
|
|
46
|
+
logger.warning('URL does not appear to be an idea1.ai project item URL');
|
|
47
|
+
}
|
|
48
|
+
return projectItemUrl;
|
|
49
|
+
}
|
|
50
|
+
export const startCommand = {
|
|
51
|
+
name: 'start',
|
|
52
|
+
aliases: ['s'],
|
|
53
|
+
description: 'Put a project item under workflow management: create its branch and metadata (no code changes, no Claude)',
|
|
54
|
+
options: [
|
|
55
|
+
...projectItemTargetOptions,
|
|
56
|
+
...branchCreationOptions
|
|
57
|
+
],
|
|
58
|
+
async execute(resolved) {
|
|
59
|
+
const sourcePath = resolved['source-path'];
|
|
60
|
+
if (sourcePath) {
|
|
61
|
+
process.chdir(sourcePath);
|
|
62
|
+
}
|
|
63
|
+
const projectItemUrl = await resolveOrCreateProjectItem(resolved);
|
|
64
|
+
const context = await resolveContext({ projectItemUrl, options: resolved });
|
|
65
|
+
if (context.branchName) {
|
|
66
|
+
// Already managed: make sure the branch carries its metadata file, and report.
|
|
67
|
+
await ensureManaged(context, { deferItemStatusWrite: true });
|
|
68
|
+
logger.info(`${projectItemUrl} is already under workflow management on ${context.branchName} (state: ${context.currentState ?? 'unknown'})`);
|
|
69
|
+
logger.hint('Use `idea1 next --url <url>` to advance to the next workflow step.');
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
logger.section('Start Workflow');
|
|
73
|
+
await ensureManaged(context, { deferItemStatusWrite: false });
|
|
74
|
+
logger.newline();
|
|
75
|
+
logger.success(`${projectItemUrl} is under workflow management on ${context.branchName} (state: ${context.currentState})`);
|
|
76
|
+
logger.newline();
|
|
77
|
+
logger.hint(`Advance one step: idea1 next --url ${projectItemUrl}`);
|
|
78
|
+
logger.hint(`Jump to agent implementation: idea1 start-agent-implementation --url ${projectItemUrl}`);
|
|
79
|
+
}
|
|
80
|
+
};
|
|
81
|
+
//# sourceMappingURL=start.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"start.js","sourceRoot":"","sources":["../../src/commands/start.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interactive.d.ts","sourceRoot":"","sources":["../src/interactive.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"interactive.d.ts","sourceRoot":"","sources":["../src/interactive.ts"],"names":[],"mappings":"AAonBA;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAuEzE"}
|