@idea1/cli 1.7.6 → 1.8.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/README.md +126 -60
- package/dist/cli/named-lists.d.ts.map +1 -1
- package/dist/cli/named-lists.js +5 -0
- package/dist/cli/named-lists.js.map +1 -1
- package/dist/commands/approve-pr.d.ts.map +1 -1
- package/dist/commands/approve-pr.js +94 -8
- 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 +28 -41
- 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 +50 -84
- package/dist/commands/close-worktree.js.map +1 -1
- package/dist/commands/create-worktree.d.ts.map +1 -1
- package/dist/commands/create-worktree.js +1 -4
- package/dist/commands/create-worktree.js.map +1 -1
- package/dist/commands/get-project-item-url.d.ts.map +1 -1
- package/dist/commands/get-project-item-url.js +3 -1
- package/dist/commands/get-project-item-url.js.map +1 -1
- package/dist/commands/help.js +13 -13
- package/dist/commands/help.js.map +1 -1
- package/dist/commands/index.d.ts +1 -2
- package/dist/commands/index.d.ts.map +1 -1
- package/dist/commands/index.js +1 -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 +18 -60
- 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 +16 -22
- package/dist/commands/next-workflow-step.js.map +1 -1
- package/dist/commands/push.d.ts.map +1 -1
- package/dist/commands/push.js +4 -3
- package/dist/commands/push.js.map +1 -1
- package/dist/commands/ready-for-approval.d.ts.map +1 -1
- package/dist/commands/ready-for-approval.js +94 -8
- package/dist/commands/ready-for-approval.js.map +1 -1
- package/dist/commands/release.d.ts.map +1 -1
- package/dist/commands/release.js +4 -15
- package/dist/commands/release.js.map +1 -1
- package/dist/commands/start-agent-implementation.d.ts.map +1 -1
- package/dist/commands/start-agent-implementation.js +10 -13
- package/dist/commands/start-agent-implementation.js.map +1 -1
- package/dist/commands/start-dev-implementation.d.ts.map +1 -1
- package/dist/commands/start-dev-implementation.js +7 -8
- package/dist/commands/start-dev-implementation.js.map +1 -1
- package/dist/commands/start.d.ts.map +1 -1
- package/dist/commands/start.js +21 -15
- package/dist/commands/start.js.map +1 -1
- package/dist/commands/update-branch.d.ts.map +1 -1
- package/dist/commands/update-branch.js +28 -75
- package/dist/commands/update-branch.js.map +1 -1
- package/dist/index.js +0 -0
- package/dist/interactive.d.ts.map +1 -1
- package/dist/interactive.js +11 -23
- package/dist/interactive.js.map +1 -1
- package/dist/lib/claude-options.d.ts +11 -10
- package/dist/lib/claude-options.d.ts.map +1 -1
- package/dist/lib/claude-options.js +38 -39
- package/dist/lib/claude-options.js.map +1 -1
- package/dist/lib/settings.d.ts +23 -27
- package/dist/lib/settings.d.ts.map +1 -1
- package/dist/lib/settings.js +35 -50
- package/dist/lib/settings.js.map +1 -1
- package/dist/prompts/platform-prompts.d.ts +30 -0
- package/dist/prompts/platform-prompts.d.ts.map +1 -0
- package/dist/prompts/platform-prompts.js +38 -0
- package/dist/prompts/platform-prompts.js.map +1 -0
- package/dist/prompts/project-item-prompts.d.ts +44 -0
- package/dist/prompts/project-item-prompts.d.ts.map +1 -0
- package/dist/prompts/project-item-prompts.js +41 -0
- package/dist/prompts/project-item-prompts.js.map +1 -0
- package/dist/services/claude.d.ts +27 -33
- package/dist/services/claude.d.ts.map +1 -1
- package/dist/services/claude.js +40 -140
- package/dist/services/claude.js.map +1 -1
- package/dist/services/git.d.ts +24 -121
- package/dist/services/git.d.ts.map +1 -1
- package/dist/services/git.js +73 -470
- package/dist/services/git.js.map +1 -1
- package/dist/services/github.d.ts +20 -4
- package/dist/services/github.d.ts.map +1 -1
- package/dist/services/github.js +77 -6
- package/dist/services/github.js.map +1 -1
- package/dist/services/platform.d.ts +75 -0
- package/dist/services/platform.d.ts.map +1 -0
- package/dist/services/platform.js +237 -0
- package/dist/services/platform.js.map +1 -0
- package/dist/services/setup.d.ts +1 -1
- package/dist/services/setup.js +1 -1
- package/dist/services/template-renderer.d.ts +10 -0
- package/dist/services/template-renderer.d.ts.map +1 -0
- package/dist/services/template-renderer.js +20 -0
- package/dist/services/template-renderer.js.map +1 -0
- package/dist/services/worktree.d.ts +17 -16
- package/dist/services/worktree.d.ts.map +1 -1
- package/dist/services/worktree.js +41 -65
- package/dist/services/worktree.js.map +1 -1
- package/dist/types/index.d.ts +14 -58
- package/dist/types/index.d.ts.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/workflow/data/project-item.d.ts +21 -0
- package/dist/workflow/data/project-item.d.ts.map +1 -0
- package/dist/workflow/data/project-item.js +2 -0
- package/dist/workflow/data/project-item.js.map +1 -0
- package/dist/workflow/data/workflow-context.d.ts +46 -0
- package/dist/workflow/data/workflow-context.d.ts.map +1 -0
- package/dist/workflow/data/workflow-context.js +14 -0
- package/dist/workflow/data/workflow-context.js.map +1 -0
- package/dist/{lib → workflow/data}/workflow-states.d.ts +1 -1
- package/dist/workflow/data/workflow-states.d.ts.map +1 -0
- package/dist/{lib → workflow/data}/workflow-states.generated.d.ts +1 -1
- package/dist/workflow/data/workflow-states.generated.d.ts.map +1 -0
- package/dist/{lib → workflow/data}/workflow-states.generated.js +1 -1
- package/dist/workflow/data/workflow-states.generated.js.map +1 -0
- package/dist/{lib → workflow/data}/workflow-states.js +1 -1
- package/dist/workflow/data/workflow-states.js.map +1 -0
- package/dist/workflow/engine/approval-flow.d.ts +53 -0
- package/dist/workflow/engine/approval-flow.d.ts.map +1 -0
- package/dist/workflow/engine/approval-flow.js +111 -0
- package/dist/workflow/engine/approval-flow.js.map +1 -0
- package/dist/{services → workflow/engine}/branch-setup.d.ts +2 -1
- package/dist/workflow/engine/branch-setup.d.ts.map +1 -0
- package/dist/{services → workflow/engine}/branch-setup.js +6 -5
- package/dist/workflow/engine/branch-setup.js.map +1 -0
- package/dist/workflow/engine/handlers/agent-implementation.d.ts +10 -0
- package/dist/workflow/engine/handlers/agent-implementation.d.ts.map +1 -0
- package/dist/workflow/engine/handlers/agent-implementation.js +42 -0
- package/dist/workflow/engine/handlers/agent-implementation.js.map +1 -0
- package/dist/{services/workflow-handlers → workflow/engine/handlers}/approve-pr.d.ts +7 -4
- package/dist/workflow/engine/handlers/approve-pr.d.ts.map +1 -0
- package/dist/workflow/engine/handlers/approve-pr.js +63 -0
- package/dist/workflow/engine/handlers/approve-pr.js.map +1 -0
- package/dist/{services/workflow-handlers → workflow/engine/handlers}/dev-implementation.d.ts +3 -2
- package/dist/workflow/engine/handlers/dev-implementation.d.ts.map +1 -0
- package/dist/workflow/engine/handlers/dev-implementation.js +36 -0
- package/dist/workflow/engine/handlers/dev-implementation.js.map +1 -0
- package/dist/workflow/engine/handlers/index.d.ts +21 -0
- package/dist/workflow/engine/handlers/index.d.ts.map +1 -0
- package/dist/{services/workflow-handlers → workflow/engine/handlers}/index.js +10 -6
- package/dist/workflow/engine/handlers/index.js.map +1 -0
- package/dist/workflow/engine/handlers/ready-for-approval.d.ts +11 -0
- package/dist/workflow/engine/handlers/ready-for-approval.d.ts.map +1 -0
- package/dist/workflow/engine/handlers/ready-for-approval.js +56 -0
- package/dist/workflow/engine/handlers/ready-for-approval.js.map +1 -0
- package/dist/{services → workflow/engine}/release-flow.d.ts +19 -10
- package/dist/workflow/engine/release-flow.d.ts.map +1 -0
- package/dist/{services → workflow/engine}/release-flow.js +33 -16
- package/dist/workflow/engine/release-flow.js.map +1 -0
- package/dist/workflow/engine/workflow-engine.d.ts +162 -0
- package/dist/workflow/engine/workflow-engine.d.ts.map +1 -0
- package/dist/workflow/engine/workflow-engine.js +405 -0
- package/dist/workflow/engine/workflow-engine.js.map +1 -0
- package/package.json +2 -1
- package/dist/commands/integrate.d.ts +0 -13
- package/dist/commands/integrate.d.ts.map +0 -1
- package/dist/commands/integrate.js +0 -128
- package/dist/commands/integrate.js.map +0 -1
- 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
- package/dist/lib/workflow-states.d.ts.map +0 -1
- package/dist/lib/workflow-states.generated.d.ts.map +0 -1
- package/dist/lib/workflow-states.generated.js.map +0 -1
- package/dist/lib/workflow-states.js.map +0 -1
- package/dist/services/branch-setup.d.ts.map +0 -1
- package/dist/services/branch-setup.js.map +0 -1
- package/dist/services/context.d.ts +0 -26
- package/dist/services/context.d.ts.map +0 -1
- package/dist/services/context.js +0 -304
- package/dist/services/context.js.map +0 -1
- package/dist/services/release-flow.d.ts.map +0 -1
- package/dist/services/release-flow.js.map +0 -1
- package/dist/services/workflow-engine.d.ts +0 -67
- package/dist/services/workflow-engine.d.ts.map +0 -1
- package/dist/services/workflow-engine.js +0 -371
- package/dist/services/workflow-engine.js.map +0 -1
- package/dist/services/workflow-handlers/agent-implementation.d.ts +0 -9
- package/dist/services/workflow-handlers/agent-implementation.d.ts.map +0 -1
- package/dist/services/workflow-handlers/agent-implementation.js +0 -38
- package/dist/services/workflow-handlers/agent-implementation.js.map +0 -1
- package/dist/services/workflow-handlers/approve-pr.d.ts.map +0 -1
- package/dist/services/workflow-handlers/approve-pr.js +0 -122
- package/dist/services/workflow-handlers/approve-pr.js.map +0 -1
- package/dist/services/workflow-handlers/dev-implementation.d.ts.map +0 -1
- package/dist/services/workflow-handlers/dev-implementation.js +0 -34
- package/dist/services/workflow-handlers/dev-implementation.js.map +0 -1
- package/dist/services/workflow-handlers/index.d.ts +0 -18
- package/dist/services/workflow-handlers/index.d.ts.map +0 -1
- package/dist/services/workflow-handlers/index.js.map +0 -1
- package/dist/services/workflow-handlers/ready-for-approval.d.ts +0 -10
- package/dist/services/workflow-handlers/ready-for-approval.d.ts.map +0 -1
- package/dist/services/workflow-handlers/ready-for-approval.js +0 -59
- package/dist/services/workflow-handlers/ready-for-approval.js.map +0 -1
- package/dist/services/workflow.d.ts +0 -14
- package/dist/services/workflow.d.ts.map +0 -1
- package/dist/services/workflow.js +0 -37
- package/dist/services/workflow.js.map +0 -1
|
@@ -1,13 +1,11 @@
|
|
|
1
1
|
import { logger } from '../lib/logger.js';
|
|
2
2
|
import { isolationModeOption, resolveIsolationMode } from '../lib/isolation.js';
|
|
3
|
-
import { claudeSessionOptions, resolveClaudeSessionOptions } from '../lib/claude-options.js';
|
|
4
|
-
import { WorkflowStates, normalizeWorkflowState } from '../lib/workflow-states.js';
|
|
5
3
|
import { validateProjectItemUrl } from '../lib/project-item-url.js';
|
|
6
4
|
import * as git from '../services/git.js';
|
|
7
5
|
import * as worktree from '../services/worktree.js';
|
|
8
|
-
import * as claude from '../services/claude.js';
|
|
9
6
|
import * as github from '../services/github.js';
|
|
10
|
-
import {
|
|
7
|
+
import { WorkflowStates, normalizeWorkflowState } from '../workflow/data/workflow-states.js';
|
|
8
|
+
import { advanceAsNeededTo, getProjectItemSummaryForBranch, requireLiveContext, resolveBranchForItem, resolveTransition } from '../workflow/engine/workflow-engine.js';
|
|
11
9
|
export const joinProjectItemCommand = {
|
|
12
10
|
name: 'join-project-item',
|
|
13
11
|
aliases: ['j', 'join'],
|
|
@@ -46,8 +44,7 @@ export const joinProjectItemCommand = {
|
|
|
46
44
|
defaultValue: '',
|
|
47
45
|
promptWhenDefaultExists: false
|
|
48
46
|
},
|
|
49
|
-
isolationModeOption
|
|
50
|
-
...claudeSessionOptions(false)
|
|
47
|
+
isolationModeOption
|
|
51
48
|
],
|
|
52
49
|
async execute(resolved) {
|
|
53
50
|
const sourcePath = resolved['source-path'];
|
|
@@ -55,25 +52,24 @@ export const joinProjectItemCommand = {
|
|
|
55
52
|
const branchArg = resolved['branch-name'] || undefined;
|
|
56
53
|
const prUrl = resolved['pull-request-url'] || undefined;
|
|
57
54
|
const isolationMode = resolveIsolationMode(resolved);
|
|
58
|
-
const { permissionMode, model, effort } = resolveClaudeSessionOptions(resolved);
|
|
59
55
|
if (sourcePath) {
|
|
60
56
|
process.chdir(sourcePath);
|
|
61
57
|
}
|
|
62
58
|
await git.fetchLatest();
|
|
63
59
|
// Resolve the target branch (and, in URL mode, put the item under workflow
|
|
64
|
-
// management when no branch
|
|
60
|
+
// management when it has no live branch yet).
|
|
65
61
|
let branch;
|
|
66
62
|
if (url) {
|
|
67
|
-
const resolvedBranch = await
|
|
63
|
+
const resolvedBranch = await resolveBranchForItem(url);
|
|
68
64
|
if (resolvedBranch) {
|
|
69
65
|
branch = resolvedBranch;
|
|
70
66
|
logger.info(`Resolved branch for ${url}: ${branch}`);
|
|
71
67
|
}
|
|
72
68
|
else {
|
|
73
69
|
logger.info(`No branch found for ${url} — putting it under workflow management first.`);
|
|
74
|
-
const
|
|
75
|
-
await
|
|
76
|
-
branch =
|
|
70
|
+
const transition = await resolveTransition({ projectItemUrl: url, options: resolved });
|
|
71
|
+
await advanceAsNeededTo(transition, WorkflowStates.BuildSpecInProgress);
|
|
72
|
+
branch = requireLiveContext(transition).branchName;
|
|
77
73
|
}
|
|
78
74
|
}
|
|
79
75
|
else if (prUrl) {
|
|
@@ -99,61 +95,23 @@ export const joinProjectItemCommand = {
|
|
|
99
95
|
// worktree, or the branch checked out in the main repository.
|
|
100
96
|
const { workingPath } = await worktree.ensureBranchEnvironment(isolationMode, branch);
|
|
101
97
|
process.chdir(workingPath);
|
|
102
|
-
|
|
103
|
-
// local git config and fill any missing state with sensible defaults.
|
|
104
|
-
await reestablishBranchState(workingPath, branch, url);
|
|
98
|
+
await reportBranchState(branch);
|
|
105
99
|
logger.success(`Joined ${branch}`);
|
|
106
100
|
// Join attaches to in-progress work, so it never launches an implementation session.
|
|
107
|
-
|
|
108
|
-
projectItemUrl: url,
|
|
109
|
-
permissionMode,
|
|
110
|
-
model,
|
|
111
|
-
effort,
|
|
112
|
-
claudeEntryPointMode: 'none'
|
|
113
|
-
});
|
|
101
|
+
worktree.printWorkingDirectoryHints(workingPath);
|
|
114
102
|
}
|
|
115
103
|
};
|
|
116
104
|
/**
|
|
117
|
-
*
|
|
118
|
-
*
|
|
119
|
-
*
|
|
120
|
-
* Implementation, where work happens — and persist newly-seeded state back to
|
|
121
|
-
* origin so future joins see it.
|
|
105
|
+
* Say what the joined branch is: the item it implements and the item's state, from the summary of
|
|
106
|
+
* the item whose workflow context holds the branch. A branch outside workflow management is joined as plain git work, and
|
|
107
|
+
* `attach-project-item` puts it under workflow when wanted.
|
|
122
108
|
*/
|
|
123
|
-
async function
|
|
124
|
-
const
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
const workflowState = normalizeWorkflowState(remote?.workflowState) ?? WorkflowStates.AgentImplementation;
|
|
128
|
-
const devWorkflowType = remote?.devWorkflowType ?? 'independent';
|
|
129
|
-
if (projectItemUrl)
|
|
130
|
-
await git.storeProjectItemUrl(projectItemUrl, branch);
|
|
131
|
-
await git.storeBaseBranch(baseBranch, branch);
|
|
132
|
-
await git.storeWorkflowState(workflowState, branch);
|
|
133
|
-
await git.storeDevWorkflowType(devWorkflowType, branch);
|
|
134
|
-
// If the item had no workflow state recorded, it was never properly started —
|
|
135
|
-
// record the defaulted state on idea1.ai too.
|
|
136
|
-
if (!remote?.workflowState && projectItemUrl) {
|
|
137
|
-
await claude.setWorkflowStatus(projectItemUrl, workflowState, branch);
|
|
138
|
-
}
|
|
139
|
-
const needsPersist = !remote ||
|
|
140
|
-
remote.workflowState !== workflowState ||
|
|
141
|
-
remote.devWorkflowType !== devWorkflowType ||
|
|
142
|
-
remote.baseBranch !== baseBranch ||
|
|
143
|
-
(!!projectItemUrl && remote.projectItemUrl !== projectItemUrl);
|
|
144
|
-
if (!needsPersist)
|
|
109
|
+
async function reportBranchState(branch) {
|
|
110
|
+
const item = await getProjectItemSummaryForBranch(branch);
|
|
111
|
+
if (!item?.workflowContext) {
|
|
112
|
+
logger.info(`${branch} is outside workflow management. Run 'idea1 attach-project-item' to record it as a project item's branch.`);
|
|
145
113
|
return;
|
|
146
|
-
const metadata = { branchName: branch, baseBranch, workflowState, devWorkflowType };
|
|
147
|
-
if (projectItemUrl)
|
|
148
|
-
metadata.projectItemUrl = projectItemUrl;
|
|
149
|
-
if (remote?.stackBranch)
|
|
150
|
-
metadata.stackBranch = remote.stackBranch;
|
|
151
|
-
if (remote?.integrationBranch)
|
|
152
|
-
metadata.integrationBranch = remote.integrationBranch;
|
|
153
|
-
await git.writeBranchMetadata(metadata, workingPath);
|
|
154
|
-
const committed = await git.commitBranchMetadataIfChanged(branch);
|
|
155
|
-
if (committed) {
|
|
156
|
-
await git.pushToRemote(branch);
|
|
157
114
|
}
|
|
115
|
+
logger.info(`${branch} implements ${item.url} (state: ${normalizeWorkflowState(item.workflowContext.workflowStatus)})`);
|
|
158
116
|
}
|
|
159
117
|
//# sourceMappingURL=join-project-item.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"join-project-item.js","sourceRoot":"","sources":["../../src/commands/join-project-item.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAChF,OAAO,EAAE,
|
|
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;AAQjD,eAAO,MAAM,uBAAuB,EAAE,
|
|
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,OAwDrC,CAAC"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { logger } from '../lib/logger.js';
|
|
2
2
|
import { validateProjectItemUrl } from '../lib/project-item-url.js';
|
|
3
|
-
import { WORKFLOW_STATES, getNextWorkflowState,
|
|
4
|
-
import { branchCreationOptions } from '../
|
|
5
|
-
import {
|
|
6
|
-
import { deferredHandlerOptions } from '../
|
|
3
|
+
import { WORKFLOW_STATES, getNextWorkflowState, normalizeWorkflowState } from '../workflow/data/workflow-states.js';
|
|
4
|
+
import { branchCreationOptions } from '../workflow/engine/branch-setup.js';
|
|
5
|
+
import { advanceAsNeededTo, resolveTransition } from '../workflow/engine/workflow-engine.js';
|
|
6
|
+
import { deferredHandlerOptions } from '../workflow/engine/handlers/index.js';
|
|
7
7
|
export const nextWorkflowStepCommand = {
|
|
8
8
|
name: 'next-workflow-step',
|
|
9
9
|
aliases: ['next', 'n'],
|
|
@@ -19,7 +19,7 @@ export const nextWorkflowStepCommand = {
|
|
|
19
19
|
},
|
|
20
20
|
{
|
|
21
21
|
longName: 'to',
|
|
22
|
-
description: 'Workflow state to advance to; every state between the current one and it is entered in order',
|
|
22
|
+
description: 'Workflow state to advance to; every state between the current one and it is entered in order (nothing happens when the item is already there)',
|
|
23
23
|
defaultValue: '',
|
|
24
24
|
promptWhenDefaultExists: false,
|
|
25
25
|
validate: (value) => (value === '' || normalizeWorkflowState(value) !== null
|
|
@@ -36,41 +36,35 @@ export const nextWorkflowStepCommand = {
|
|
|
36
36
|
// Branch creation choices apply when the item has no branch yet; the engine
|
|
37
37
|
// prompts for what it needs, so none of these are asked up front.
|
|
38
38
|
...branchCreationOptions.map(option => ({ ...option, dependsOn: () => false })),
|
|
39
|
-
...deferredHandlerOptions()
|
|
39
|
+
...deferredHandlerOptions([])
|
|
40
40
|
],
|
|
41
41
|
async execute(resolved) {
|
|
42
42
|
const sourcePath = resolved['source-path'];
|
|
43
43
|
if (sourcePath) {
|
|
44
44
|
process.chdir(sourcePath);
|
|
45
45
|
}
|
|
46
|
-
const
|
|
47
|
-
const targetState = resolveTargetState(
|
|
46
|
+
const transition = await resolveTransition({ projectItemUrl: resolved['url'] || undefined, options: resolved });
|
|
47
|
+
const targetState = resolveTargetState(transition.currentState, resolved['to']);
|
|
48
48
|
if (!targetState) {
|
|
49
49
|
logger.success('Workflow is complete! No more steps to perform.');
|
|
50
|
-
logger.hint(`Project item: ${
|
|
50
|
+
logger.hint(`Project item: ${transition.projectItemUrl}`);
|
|
51
51
|
return;
|
|
52
52
|
}
|
|
53
|
-
logger.info(`Current workflow state: ${
|
|
54
|
-
// An item that was never started
|
|
55
|
-
//
|
|
56
|
-
|
|
57
|
-
await ensureManaged(context, { deferItemStatusWrite: context.currentState !== null });
|
|
58
|
-
await advanceTo(context, targetState);
|
|
53
|
+
logger.info(`Current workflow state: ${transition.currentState ?? '(not started)'}`);
|
|
54
|
+
// An item that was never started is put under workflow management by entering
|
|
55
|
+
// the first state, which is the whole transition.
|
|
56
|
+
await advanceAsNeededTo(transition, targetState);
|
|
59
57
|
}
|
|
60
58
|
};
|
|
61
59
|
/**
|
|
62
60
|
* The state to move to: the requested one, or the next state when none was
|
|
63
|
-
* requested. Null when there is nothing ahead.
|
|
64
|
-
* already at or past
|
|
61
|
+
* requested. Null when there is nothing ahead. A requested state the item is
|
|
62
|
+
* already at or past leaves it as it is — the CLI never moves an item backwards.
|
|
65
63
|
*/
|
|
66
64
|
function resolveTargetState(currentState, requested) {
|
|
67
65
|
if (!requested) {
|
|
68
66
|
return getNextWorkflowState(currentState);
|
|
69
67
|
}
|
|
70
|
-
|
|
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;
|
|
68
|
+
return normalizeWorkflowState(requested);
|
|
75
69
|
}
|
|
76
70
|
//# 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,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AACpE,OAAO,EAAE,eAAe,EAAE,oBAAoB,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":"push.d.ts","sourceRoot":"","sources":["../../src/commands/push.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAU,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"push.d.ts","sourceRoot":"","sources":["../../src/commands/push.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAU,MAAM,mBAAmB,CAAC;AASzD,eAAO,MAAM,WAAW,EAAE,OAwHzB,CAAC"}
|
package/dist/commands/push.js
CHANGED
|
@@ -4,6 +4,7 @@ import * as github from '../services/github.js';
|
|
|
4
4
|
import * as test from '../services/test.js';
|
|
5
5
|
import * as worktree from '../services/worktree.js';
|
|
6
6
|
import { promptProjectItemUrl } from '../lib/prompt.js';
|
|
7
|
+
import { getProjectItemUrlForBranch } from '../workflow/engine/workflow-engine.js';
|
|
7
8
|
export const pushCommand = {
|
|
8
9
|
name: 'push',
|
|
9
10
|
aliases: ['p', 'push-changes'],
|
|
@@ -52,11 +53,11 @@ export const pushCommand = {
|
|
|
52
53
|
logger.info(`Current branch: ${branchName}`);
|
|
53
54
|
// Resolve project item URL
|
|
54
55
|
let projectItemUrl = resolved['project-item-url'] || undefined;
|
|
55
|
-
//
|
|
56
|
+
// The branch's workflow context, if not provided
|
|
56
57
|
if (!projectItemUrl && !noProjectItem) {
|
|
57
|
-
projectItemUrl = await
|
|
58
|
+
projectItemUrl = await getProjectItemUrlForBranch(branchName) ?? undefined;
|
|
58
59
|
if (projectItemUrl) {
|
|
59
|
-
logger.dim(`Found
|
|
60
|
+
logger.dim(`Found project item URL: ${projectItemUrl}`);
|
|
60
61
|
}
|
|
61
62
|
}
|
|
62
63
|
// If still no URL and not explicitly skipped, prompt
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"push.js","sourceRoot":"","sources":["../../src/commands/push.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,KAAK,GAAG,MAAM,oBAAoB,CAAC;AAC1C,OAAO,KAAK,MAAM,MAAM,uBAAuB,CAAC;AAChD,OAAO,KAAK,IAAI,MAAM,qBAAqB,CAAC;AAC5C,OAAO,KAAK,QAAQ,MAAM,yBAAyB,CAAC;AACpD,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"push.js","sourceRoot":"","sources":["../../src/commands/push.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;AAmFjD,eAAO,MAAM,uBAAuB,EAAE,OAiCrC,CAAC"}
|
|
@@ -1,15 +1,101 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
1
|
+
import { logger } from '../lib/logger.js';
|
|
2
|
+
import { promptInput } from '../lib/prompt.js';
|
|
3
|
+
import { readBranchSettings } from '../lib/settings.js';
|
|
4
|
+
import { WorkflowStates } from '../workflow/data/workflow-states.js';
|
|
5
|
+
import * as git from '../services/git.js';
|
|
6
|
+
import * as github from '../services/github.js';
|
|
7
|
+
import * as worktree from '../services/worktree.js';
|
|
8
|
+
import { ensurePrReadyForApproval } from '../workflow/engine/approval-flow.js';
|
|
9
|
+
import { validateSourceBranch } from '../workflow/engine/release-flow.js';
|
|
10
|
+
import { advanceAsNeededTo, resolveTransitionIfManaged } from '../workflow/engine/workflow-engine.js';
|
|
11
|
+
import { deferredHandlerOptions } from '../workflow/engine/handlers/index.js';
|
|
12
|
+
import { readyForApprovalHandler } from '../workflow/engine/handlers/ready-for-approval.js';
|
|
13
|
+
/**
|
|
14
|
+
* Stage 1 for a branch with no project item - an integration branch carrying approved work items,
|
|
15
|
+
* for instance: the PR into the base branch is opened when the branch has none, with the approval
|
|
16
|
+
* chain of what it carries as its body, and gets its assignee. No workflow status is recorded.
|
|
17
|
+
*/
|
|
18
|
+
async function readyForApprovalOnBranchWithNoItem(resolved) {
|
|
19
|
+
await github.ensureGitHubCli();
|
|
20
|
+
const branchName = await git.getCurrentBranch();
|
|
21
|
+
if (branchName === 'HEAD') {
|
|
22
|
+
throw new Error('You are not on a branch (detached HEAD), so there is nothing to approve. Check out the branch you want approved.');
|
|
23
|
+
}
|
|
24
|
+
const existingPr = await github.getPrInfo(branchName);
|
|
25
|
+
const openPr = existingPr && existingPr.state.toUpperCase() === 'OPEN' ? existingPr : null;
|
|
26
|
+
const requestedBase = resolved['base-branch'] || null;
|
|
27
|
+
const targetBranch = openPr?.baseRefName ?? requestedBase ?? await worktree.resolveBaseBranch();
|
|
28
|
+
if (openPr?.baseRefName && requestedBase && openPr.baseRefName !== requestedBase) {
|
|
29
|
+
logger.warning(`PR #${openPr.number} targets ${openPr.baseRefName}; --base-branch ${requestedBase} is ignored. Retarget the PR in GitHub if that is wrong.`);
|
|
30
|
+
}
|
|
31
|
+
if (branchName === targetBranch) {
|
|
32
|
+
throw new Error(`${targetBranch} is the branch changes are approved into, not a change to approve. Check out the branch you want approved.`);
|
|
33
|
+
}
|
|
34
|
+
const releaseTargetBranch = (await readBranchSettings(await git.getRepoRoot())).releaseTargetBranch;
|
|
35
|
+
if (targetBranch === releaseTargetBranch) {
|
|
36
|
+
throw new Error(`A change is approved into ${await worktree.resolveBaseBranch()}, never straight into ${releaseTargetBranch}; ` +
|
|
37
|
+
'use idea1 release for that (change-management-policy.md clause 2).');
|
|
38
|
+
}
|
|
39
|
+
logger.header(`Ready for approval: ${branchName} -> ${targetBranch}`);
|
|
40
|
+
logger.info('This branch has no project item, so no workflow status is recorded.');
|
|
41
|
+
logger.newline();
|
|
42
|
+
if (!await git.fetchRemoteBranch(branchName)) {
|
|
43
|
+
throw new Error(`Branch ${branchName} is not on origin. Push it first: git push -u origin ${branchName}`);
|
|
44
|
+
}
|
|
45
|
+
await validateSourceBranch(branchName);
|
|
46
|
+
const title = openPr ? '' : (resolved['title'] || await promptPrTitle(branchName));
|
|
47
|
+
await ensurePrReadyForApproval({
|
|
48
|
+
branchName,
|
|
49
|
+
baseBranch: targetBranch,
|
|
50
|
+
assignee: resolved['assignee'],
|
|
51
|
+
reviewers: resolved['reviewers'] ?? '',
|
|
52
|
+
createWhenMissing: openPr ? null : { title }
|
|
53
|
+
});
|
|
54
|
+
logger.newline();
|
|
55
|
+
logger.success('PR is ready for approval');
|
|
56
|
+
logger.hint('The assignee approves it by running: idea1 approve-pr (which merges it)');
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* The PR title, defaulting to `Integration <name> <date>` for an integration branch and to the
|
|
60
|
+
* branch name otherwise.
|
|
61
|
+
*/
|
|
62
|
+
async function promptPrTitle(branchName) {
|
|
63
|
+
const integrationBranches = await worktree.listExistingIntegrationBranches();
|
|
64
|
+
const defaultTitle = integrationBranches.includes(branchName)
|
|
65
|
+
? `Integration ${await worktree.extractIntegrationName(branchName)} ${new Date().toISOString().split('T')[0]}`
|
|
66
|
+
: branchName;
|
|
67
|
+
return promptInput('Enter PR title:', { default: defaultTitle });
|
|
68
|
+
}
|
|
4
69
|
export const readyForApprovalCommand = {
|
|
5
70
|
name: 'ready-for-approval',
|
|
6
71
|
aliases: ['rfa'],
|
|
7
|
-
description: 'Mark PR ready for approval and set its assignee (the approver)',
|
|
8
|
-
options:
|
|
72
|
+
description: 'Mark the PR ready for approval and set its assignee (the approver) - on a project item\'s branch (advancing the item through every state before it) or any other branch',
|
|
73
|
+
options: [
|
|
74
|
+
...(readyForApprovalHandler.options ?? []),
|
|
75
|
+
{
|
|
76
|
+
longName: 'base-branch',
|
|
77
|
+
shortName: 'b',
|
|
78
|
+
description: 'Branch the PR targets (branches with no project item only; default: the open PR\'s base, else the configured base branch)',
|
|
79
|
+
defaultValue: '',
|
|
80
|
+
promptWhenDefaultExists: false
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
longName: 'title',
|
|
84
|
+
description: 'PR title (branches with no project item only; used when the PR has to be created)',
|
|
85
|
+
defaultValue: '',
|
|
86
|
+
promptWhenDefaultExists: false
|
|
87
|
+
},
|
|
88
|
+
// On a project item's branch the item may be further back; the states it passes through on the
|
|
89
|
+
// way ask for their own options.
|
|
90
|
+
...deferredHandlerOptions(readyForApprovalHandler.options ?? [])
|
|
91
|
+
],
|
|
9
92
|
async execute(resolved) {
|
|
10
|
-
const
|
|
11
|
-
|
|
12
|
-
|
|
93
|
+
const transition = await resolveTransitionIfManaged({ options: resolved });
|
|
94
|
+
if (transition) {
|
|
95
|
+
await advanceAsNeededTo(transition, WorkflowStates.NeedsApprovalForRelease);
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
await readyForApprovalOnBranchWithNoItem(resolved);
|
|
13
99
|
}
|
|
14
100
|
};
|
|
15
101
|
//# 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":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"release.d.ts","sourceRoot":"","sources":["../../src/commands/release.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"release.d.ts","sourceRoot":"","sources":["../../src/commands/release.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AA4DjD;;;;;;GAMG;AACH,eAAO,MAAM,cAAc,EAAE,OAuE5B,CAAC"}
|
package/dist/commands/release.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { logger } from '../lib/logger.js';
|
|
2
|
-
import {
|
|
2
|
+
import { readBranchSettings } from '../lib/settings.js';
|
|
3
3
|
import { promptInput } from '../lib/prompt.js';
|
|
4
4
|
import { runHook } from '../services/hooks.js';
|
|
5
5
|
import * as git from '../services/git.js';
|
|
6
6
|
import * as github from '../services/github.js';
|
|
7
|
-
import { PR_MODE_OPTION, RELEASE_KIND, createGatedPr, runPrMode, validateSourceBranch } from '../
|
|
7
|
+
import { PR_MODE_OPTION, RELEASE_KIND, createGatedPr, runPrMode, validateSourceBranch } from '../workflow/engine/release-flow.js';
|
|
8
8
|
/**
|
|
9
9
|
* Resolve the release branch (source branch)
|
|
10
10
|
*/
|
|
@@ -12,13 +12,7 @@ async function resolveReleaseBranch(cliBranch) {
|
|
|
12
12
|
if (cliBranch) {
|
|
13
13
|
return cliBranch;
|
|
14
14
|
}
|
|
15
|
-
|
|
16
|
-
const settingsBranch = await getReleaseBranch(repoRoot);
|
|
17
|
-
if (settingsBranch) {
|
|
18
|
-
return settingsBranch;
|
|
19
|
-
}
|
|
20
|
-
// A repo that names only a base branch releases from it.
|
|
21
|
-
return await getBaseBranch(repoRoot) ?? DEFAULT_BRANCH_SETTINGS.releaseBranch;
|
|
15
|
+
return (await readBranchSettings(await git.getRepoRoot())).releaseBranch;
|
|
22
16
|
}
|
|
23
17
|
/**
|
|
24
18
|
* Resolve the target branch
|
|
@@ -27,12 +21,7 @@ async function resolveTargetBranch(cliTarget) {
|
|
|
27
21
|
if (cliTarget) {
|
|
28
22
|
return cliTarget;
|
|
29
23
|
}
|
|
30
|
-
|
|
31
|
-
const settingsTarget = await getReleaseTargetBranch(repoRoot);
|
|
32
|
-
if (settingsTarget) {
|
|
33
|
-
return settingsTarget;
|
|
34
|
-
}
|
|
35
|
-
return DEFAULT_BRANCH_SETTINGS.releaseTargetBranch;
|
|
24
|
+
return (await readBranchSettings(await git.getRepoRoot())).releaseTargetBranch;
|
|
36
25
|
}
|
|
37
26
|
/**
|
|
38
27
|
* Prompt for PR title (only when not provided via CLI)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"release.js","sourceRoot":"","sources":["../../src/commands/release.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"release.js","sourceRoot":"","sources":["../../src/commands/release.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +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,
|
|
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,OAsC7C,CAAC"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { logger } from '../lib/logger.js';
|
|
2
|
-
import { WorkflowStates, isStateAtOrAfter } from '../
|
|
3
|
-
import { branchCreationOptions } from '../
|
|
4
|
-
import {
|
|
5
|
-
import { agentImplementationHandler } from '../
|
|
2
|
+
import { WorkflowStates, isStateAtOrAfter } from '../workflow/data/workflow-states.js';
|
|
3
|
+
import { branchCreationOptions } from '../workflow/engine/branch-setup.js';
|
|
4
|
+
import { advanceAsNeededTo, reenterState, resolveTransition } from '../workflow/engine/workflow-engine.js';
|
|
5
|
+
import { agentImplementationHandler } from '../workflow/engine/handlers/agent-implementation.js';
|
|
6
6
|
import { projectItemTargetOptions, resolveOrCreateProjectItem } from './start.js';
|
|
7
7
|
export const startAgentImplementationCommand = {
|
|
8
8
|
name: 'start-agent-implementation',
|
|
@@ -20,22 +20,19 @@ export const startAgentImplementationCommand = {
|
|
|
20
20
|
process.chdir(sourcePath);
|
|
21
21
|
}
|
|
22
22
|
const projectItemUrl = await resolveOrCreateProjectItem(resolved);
|
|
23
|
-
const
|
|
24
|
-
if (
|
|
25
|
-
throw new Error(`${projectItemUrl} is already past Agent Implementation (state: ${
|
|
23
|
+
const transition = await resolveTransition({ projectItemUrl, options: resolved });
|
|
24
|
+
if (transition.currentState && isStateAtOrAfter(transition.currentState, WorkflowStates.DevImplementation)) {
|
|
25
|
+
throw new Error(`${projectItemUrl} is already past Agent Implementation (state: ${transition.currentState}). ` +
|
|
26
26
|
`Use 'idea1 join-project-item --project-item-url ${projectItemUrl}' to set up a working environment.`);
|
|
27
27
|
}
|
|
28
28
|
logger.section('Agent Implementation');
|
|
29
|
-
|
|
30
|
-
await ensureManaged(context, { deferItemStatusWrite: !alreadyImplementing });
|
|
31
|
-
if (alreadyImplementing) {
|
|
29
|
+
if (transition.currentState === WorkflowStates.AgentImplementation) {
|
|
32
30
|
// Nothing to transition: set up the working environment and launch Claude.
|
|
33
31
|
logger.info('The item is already in Agent Implementation — setting up the working environment.');
|
|
34
|
-
await
|
|
35
|
-
await agentImplementationHandler.complete?.(context);
|
|
32
|
+
await reenterState(transition, WorkflowStates.AgentImplementation);
|
|
36
33
|
return;
|
|
37
34
|
}
|
|
38
|
-
await
|
|
35
|
+
await advanceAsNeededTo(transition, WorkflowStates.AgentImplementation);
|
|
39
36
|
}
|
|
40
37
|
};
|
|
41
38
|
//# sourceMappingURL=start-agent-implementation.js.map
|
|
@@ -1 +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,
|
|
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,qCAAqC,CAAC;AACvF,OAAO,EAAE,qBAAqB,EAAE,MAAM,oCAAoC,CAAC;AAC3E,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,uCAAuC,CAAC;AAC3G,OAAO,EAAE,0BAA0B,EAAE,MAAM,qDAAqD,CAAC;AACjG,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,UAAU,GAAG,MAAM,iBAAiB,CAAC,EAAE,cAAc,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC;QAElF,IAAI,UAAU,CAAC,YAAY,IAAI,gBAAgB,CAAC,UAAU,CAAC,YAAY,EAAE,cAAc,CAAC,iBAAiB,CAAC,EAAE,CAAC;YAC3G,MAAM,IAAI,KAAK,CACb,GAAG,cAAc,iDAAiD,UAAU,CAAC,YAAY,KAAK;gBAC9F,mDAAmD,cAAc,oCAAoC,CACtG,CAAC;QACJ,CAAC;QAED,MAAM,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC;QAEvC,IAAI,UAAU,CAAC,YAAY,KAAK,cAAc,CAAC,mBAAmB,EAAE,CAAC;YACnE,2EAA2E;YAC3E,MAAM,CAAC,IAAI,CAAC,mFAAmF,CAAC,CAAC;YACjG,MAAM,YAAY,CAAC,UAAU,EAAE,cAAc,CAAC,mBAAmB,CAAC,CAAC;YACnE,OAAO;QACT,CAAC;QAED,MAAM,iBAAiB,CAAC,UAAU,EAAE,cAAc,CAAC,mBAAmB,CAAC,CAAC;IAC1E,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;AAKjD,eAAO,MAAM,6BAA6B,EAAE,
|
|
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,OAwB3C,CAAC"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { WorkflowStates } from '../
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
1
|
+
import { WorkflowStates } from '../workflow/data/workflow-states.js';
|
|
2
|
+
import { advanceAsNeededTo, resolveTransition } from '../workflow/engine/workflow-engine.js';
|
|
3
|
+
import { deferredHandlerOptions } from '../workflow/engine/handlers/index.js';
|
|
4
4
|
export const startDevImplementationCommand = {
|
|
5
5
|
name: 'start-dev-implementation',
|
|
6
6
|
aliases: ['dev'],
|
|
7
|
-
description: '
|
|
7
|
+
description: 'Advance the item to Dev Implementation (through every state before it) - commits and pushes the work, creates the PR and optionally closes the worktree',
|
|
8
8
|
options: [
|
|
9
9
|
{
|
|
10
10
|
longName: 'source-path',
|
|
@@ -13,16 +13,15 @@ export const startDevImplementationCommand = {
|
|
|
13
13
|
defaultValue: '',
|
|
14
14
|
promptWhenDefaultExists: false
|
|
15
15
|
},
|
|
16
|
-
...(
|
|
16
|
+
...deferredHandlerOptions([])
|
|
17
17
|
],
|
|
18
18
|
async execute(resolved) {
|
|
19
19
|
const sourcePath = resolved['source-path'];
|
|
20
20
|
if (sourcePath) {
|
|
21
21
|
process.chdir(sourcePath);
|
|
22
22
|
}
|
|
23
|
-
const
|
|
24
|
-
|
|
25
|
-
await advanceTo(context, WorkflowStates.DevImplementation);
|
|
23
|
+
const transition = await resolveTransition({ options: resolved });
|
|
24
|
+
await advanceAsNeededTo(transition, WorkflowStates.DevImplementation);
|
|
26
25
|
}
|
|
27
26
|
};
|
|
28
27
|
//# 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,cAAc,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"start-dev-implementation.js","sourceRoot":"","sources":["../../src/commands/start-dev-implementation.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAC;AACrE,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,uCAAuC,CAAC;AAC7F,OAAO,EAAE,sBAAsB,EAAE,MAAM,sCAAsC,CAAC;AAE9E,MAAM,CAAC,MAAM,6BAA6B,GAAY;IACpD,IAAI,EAAE,0BAA0B;IAChC,OAAO,EAAE,CAAC,KAAK,CAAC;IAChB,WAAW,EAAE,yJAAyJ;IACtK,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,sBAAsB,CAAC,EAAE,CAAC;KAC9B;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,UAAU,GAAG,MAAM,iBAAiB,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC;QAClE,MAAM,iBAAiB,CAAC,UAAU,EAAE,cAAc,CAAC,iBAAiB,CAAC,CAAC;IACxE,CAAC;CACF,CAAC"}
|