@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,371 +0,0 @@
|
|
|
1
|
-
import { logger } from '../lib/logger.js';
|
|
2
|
-
import { WorkflowStates, getWorkflowStatesBetween, isStateAtOrAfter, normalizeWorkflowState } from '../lib/workflow-states.js';
|
|
3
|
-
import { resolveOptions } from '../cli/resolver.js';
|
|
4
|
-
import * as git from './git.js';
|
|
5
|
-
import * as claude from './claude.js';
|
|
6
|
-
import * as worktree from './worktree.js';
|
|
7
|
-
import { collectBranchCreationChoices } from './branch-setup.js';
|
|
8
|
-
import { HANDLERS_BY_STATE } from './workflow-handlers/index.js';
|
|
9
|
-
/**
|
|
10
|
-
* Work out which project item and branch a command operates on.
|
|
11
|
-
*
|
|
12
|
-
* On a managed branch (the current branch carries workflow metadata locally or
|
|
13
|
-
* on origin) the branch is the target — its state is first synced from origin.
|
|
14
|
-
* Otherwise the item URL is required: its branch is located on origin (and, if
|
|
15
|
-
* checked out somewhere locally, that checkout becomes the working directory),
|
|
16
|
-
* or, for an item without a branch, the current state is read from idea1.ai.
|
|
17
|
-
*/
|
|
18
|
-
export async function resolveContext(input) {
|
|
19
|
-
const requestedUrl = input.projectItemUrl || null;
|
|
20
|
-
const currentBranch = await git.getCurrentBranch();
|
|
21
|
-
const managedUrl = currentBranch !== 'HEAD' ? await getManagedProjectItemUrl(currentBranch) : null;
|
|
22
|
-
if (managedUrl && (!requestedUrl || requestedUrl === managedUrl)) {
|
|
23
|
-
return contextForManagedBranch(currentBranch, managedUrl, input.options);
|
|
24
|
-
}
|
|
25
|
-
if (!requestedUrl) {
|
|
26
|
-
throw new Error('This branch is not under workflow management. Pass --url <project item url>, or run this from the item\'s branch.');
|
|
27
|
-
}
|
|
28
|
-
if (managedUrl) {
|
|
29
|
-
logger.dim(`Current branch belongs to ${managedUrl}; operating on ${requestedUrl} instead.`);
|
|
30
|
-
}
|
|
31
|
-
const branch = await git.resolveBranchFromProjectItemUrl(requestedUrl);
|
|
32
|
-
if (branch) {
|
|
33
|
-
logger.info(`Resolved branch for ${requestedUrl}: ${branch}`);
|
|
34
|
-
return contextForManagedBranch(branch, requestedUrl, input.options);
|
|
35
|
-
}
|
|
36
|
-
const currentState = normalizeWorkflowState(await claude.getWorkflowStatus(requestedUrl));
|
|
37
|
-
return {
|
|
38
|
-
projectItemUrl: requestedUrl,
|
|
39
|
-
branchName: null,
|
|
40
|
-
baseBranch: input.options['base-branch'] || await worktree.resolveBaseBranch(),
|
|
41
|
-
devWorkflowType: (input.options['workflow-type'] || 'independent'),
|
|
42
|
-
stackBranch: null,
|
|
43
|
-
integrationBranch: null,
|
|
44
|
-
currentState,
|
|
45
|
-
workingPath: null,
|
|
46
|
-
branchRetired: false,
|
|
47
|
-
options: input.options
|
|
48
|
-
};
|
|
49
|
-
}
|
|
50
|
-
/**
|
|
51
|
-
* The project item a branch is attached to, from local git config, the local
|
|
52
|
-
* metadata file, or the metadata committed on origin. Null when unmanaged.
|
|
53
|
-
*/
|
|
54
|
-
async function getManagedProjectItemUrl(branchName) {
|
|
55
|
-
const localUrl = await git.getProjectItemUrl(branchName);
|
|
56
|
-
if (localUrl) {
|
|
57
|
-
return localUrl;
|
|
58
|
-
}
|
|
59
|
-
const remote = await git.readBranchMetadataFromRef(branchName);
|
|
60
|
-
return remote?.projectItemUrl ?? null;
|
|
61
|
-
}
|
|
62
|
-
/**
|
|
63
|
-
* Build the context for a branch that is already under workflow management,
|
|
64
|
-
* syncing its state from origin first and moving into its local checkout when
|
|
65
|
-
* that is somewhere other than the current directory.
|
|
66
|
-
*/
|
|
67
|
-
async function contextForManagedBranch(branchName, projectItemUrl, options) {
|
|
68
|
-
await syncBranchStateFromRemote(branchName);
|
|
69
|
-
const workingPath = await git.getCheckoutPathForBranch(branchName);
|
|
70
|
-
if (workingPath && workingPath !== (await git.getRepoRoot()).trim()) {
|
|
71
|
-
logger.dim(`Working in ${workingPath}`);
|
|
72
|
-
process.chdir(workingPath);
|
|
73
|
-
}
|
|
74
|
-
const [baseBranch, devWorkflowType, stackBranch, integrationBranch, rawState] = await Promise.all([
|
|
75
|
-
git.getBaseBranch(branchName),
|
|
76
|
-
git.getDevWorkflowType(branchName),
|
|
77
|
-
git.getStackBranch(branchName),
|
|
78
|
-
git.getIntegrationBranch(branchName),
|
|
79
|
-
git.getWorkflowState(branchName)
|
|
80
|
-
]);
|
|
81
|
-
return {
|
|
82
|
-
projectItemUrl,
|
|
83
|
-
branchName,
|
|
84
|
-
baseBranch: baseBranch ?? await worktree.resolveBaseBranch(),
|
|
85
|
-
devWorkflowType: (devWorkflowType ?? 'independent'),
|
|
86
|
-
stackBranch,
|
|
87
|
-
integrationBranch,
|
|
88
|
-
currentState: normalizeWorkflowState(rawState),
|
|
89
|
-
workingPath,
|
|
90
|
-
branchRetired: false,
|
|
91
|
-
options
|
|
92
|
-
};
|
|
93
|
-
}
|
|
94
|
-
/**
|
|
95
|
-
* Adopt the workflow metadata committed on `origin/<branch>` — the durable copy,
|
|
96
|
-
* which the web client also writes — into local git config, and fast-forward a
|
|
97
|
-
* local checkout when it is strictly behind origin so its committed file matches.
|
|
98
|
-
* Local commits are never rewritten: a diverged checkout only gets a warning.
|
|
99
|
-
* Returns the metadata found on origin, or null when the branch has none.
|
|
100
|
-
*/
|
|
101
|
-
export async function syncBranchStateFromRemote(branchName) {
|
|
102
|
-
const remoteExists = await git.fetchRemoteBranch(branchName);
|
|
103
|
-
if (!remoteExists) {
|
|
104
|
-
logger.dim(`Branch ${branchName} is not on origin; using local workflow state`);
|
|
105
|
-
return null;
|
|
106
|
-
}
|
|
107
|
-
const remote = await git.readBranchMetadataFromRef(branchName);
|
|
108
|
-
if (!remote) {
|
|
109
|
-
return null;
|
|
110
|
-
}
|
|
111
|
-
await adoptRemoteValue(remote.projectItemUrl, () => git.getProjectItemUrl(branchName), value => git.storeProjectItemUrl(value, branchName));
|
|
112
|
-
await adoptRemoteValue(remote.baseBranch, () => git.getBaseBranch(branchName), value => git.storeBaseBranch(value, branchName));
|
|
113
|
-
await adoptRemoteValue(remote.workflowState, () => git.getWorkflowState(branchName), value => git.storeWorkflowState(value, branchName));
|
|
114
|
-
await adoptRemoteValue(remote.devWorkflowType, () => git.getDevWorkflowType(branchName), value => git.storeDevWorkflowType(value, branchName));
|
|
115
|
-
await adoptRemoteValue(remote.stackBranch, () => git.getStackBranch(branchName), value => git.storeStackBranch(value, branchName));
|
|
116
|
-
await adoptRemoteValue(remote.integrationBranch, () => git.getIntegrationBranch(branchName), value => git.storeIntegrationBranch(value, branchName));
|
|
117
|
-
const checkoutPath = await git.getCheckoutPathForBranch(branchName);
|
|
118
|
-
if (checkoutPath) {
|
|
119
|
-
const result = await git.fastForwardCheckoutToOrigin(branchName, checkoutPath);
|
|
120
|
-
if (result === 'fast-forwarded') {
|
|
121
|
-
logger.dim(`Fast-forwarded ${branchName} to origin`);
|
|
122
|
-
}
|
|
123
|
-
else if (result === 'diverged') {
|
|
124
|
-
logger.warning(`Local branch ${branchName} has diverged from origin. Run 'idea1 update-branch' to merge before continuing.`);
|
|
125
|
-
}
|
|
126
|
-
else if (result === 'blocked') {
|
|
127
|
-
logger.warning(`Could not fast-forward ${branchName} to origin because of local changes. Commit or stash them, then pull.`);
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
return remote;
|
|
131
|
-
}
|
|
132
|
-
async function adoptRemoteValue(remoteValue, readLocal, store) {
|
|
133
|
-
if (!remoteValue) {
|
|
134
|
-
return;
|
|
135
|
-
}
|
|
136
|
-
const localValue = await readLocal();
|
|
137
|
-
if (localValue !== remoteValue) {
|
|
138
|
-
await store(remoteValue);
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
/**
|
|
142
|
-
* Put the project item under workflow management: make sure it has exactly one
|
|
143
|
-
* branch on origin carrying `.idea1/<branch>.json` with its current state. An
|
|
144
|
-
* item that has never been started enters "Build Spec in Progress". Creating
|
|
145
|
-
* the branch needs no checkout, so nothing is written to the working tree and
|
|
146
|
-
* no code changes are made. Idempotent for an already-managed item.
|
|
147
|
-
*/
|
|
148
|
-
export async function ensureManaged(context, options) {
|
|
149
|
-
if (context.branchName) {
|
|
150
|
-
await ensureMetadataOnBranch(context);
|
|
151
|
-
return;
|
|
152
|
-
}
|
|
153
|
-
const hadState = context.currentState !== null;
|
|
154
|
-
const state = context.currentState ?? WorkflowStates.BuildSpecInProgress;
|
|
155
|
-
const choices = await collectBranchCreationChoices(context.options);
|
|
156
|
-
const shortBranchName = choices.shortBranchName ?? await claude.generateBranchName(context.projectItemUrl);
|
|
157
|
-
if (!shortBranchName) {
|
|
158
|
-
throw new Error('Failed to generate a branch name');
|
|
159
|
-
}
|
|
160
|
-
await git.fetchLatest();
|
|
161
|
-
let prTargetBranch = choices.baseBranch;
|
|
162
|
-
let fullBranchName = `${await worktree.resolveBranchPrefix()}/${shortBranchName}`;
|
|
163
|
-
if (choices.integrationSelection) {
|
|
164
|
-
const { integrationName, integrationBranchName, isNew } = choices.integrationSelection;
|
|
165
|
-
if (isNew && !await git.branchExists(integrationBranchName)) {
|
|
166
|
-
await git.createRemoteBranchFrom(integrationBranchName, `origin/${choices.baseBranch}`);
|
|
167
|
-
}
|
|
168
|
-
prTargetBranch = integrationBranchName;
|
|
169
|
-
fullBranchName = await worktree.buildIntegrationWorkBranchName(integrationName, shortBranchName);
|
|
170
|
-
logger.info(`Integration branch: ${integrationBranchName}`);
|
|
171
|
-
}
|
|
172
|
-
const sourceBranch = choices.stackBranch ?? prTargetBranch;
|
|
173
|
-
if (choices.stackBranch) {
|
|
174
|
-
await git.ensureStackBranchReady(choices.stackBranch);
|
|
175
|
-
logger.info(`Stacked workflow: branching from ${choices.stackBranch}, PR will target ${prTargetBranch}`);
|
|
176
|
-
}
|
|
177
|
-
if (!await git.branchExists(sourceBranch)) {
|
|
178
|
-
throw new Error(`Source branch '${sourceBranch}' does not exist locally or on origin`);
|
|
179
|
-
}
|
|
180
|
-
if (await git.branchExists(fullBranchName)) {
|
|
181
|
-
throw new Error(`Branch '${fullBranchName}' already exists. Pass --branch-name to choose a different name.`);
|
|
182
|
-
}
|
|
183
|
-
const metadata = {
|
|
184
|
-
branchName: fullBranchName,
|
|
185
|
-
projectItemUrl: context.projectItemUrl,
|
|
186
|
-
baseBranch: prTargetBranch,
|
|
187
|
-
workflowState: state,
|
|
188
|
-
devWorkflowType: choices.workflowType
|
|
189
|
-
};
|
|
190
|
-
if (choices.stackBranch) {
|
|
191
|
-
metadata.stackBranch = choices.stackBranch;
|
|
192
|
-
}
|
|
193
|
-
if (choices.integrationSelection) {
|
|
194
|
-
metadata.integrationBranch = choices.integrationSelection.integrationBranchName;
|
|
195
|
-
}
|
|
196
|
-
await git.createBranchWithMetadataDetached(fullBranchName, `origin/${sourceBranch}`, metadata);
|
|
197
|
-
await seedLocalConfig(metadata);
|
|
198
|
-
context.branchName = fullBranchName;
|
|
199
|
-
context.baseBranch = prTargetBranch;
|
|
200
|
-
context.devWorkflowType = choices.workflowType;
|
|
201
|
-
context.stackBranch = choices.stackBranch;
|
|
202
|
-
context.integrationBranch = choices.integrationSelection?.integrationBranchName ?? null;
|
|
203
|
-
context.currentState = state;
|
|
204
|
-
context.workingPath = null;
|
|
205
|
-
if (!hadState) {
|
|
206
|
-
logger.info(`${context.projectItemUrl} enters "${state}"`);
|
|
207
|
-
}
|
|
208
|
-
if (!options.deferItemStatusWrite) {
|
|
209
|
-
await claude.setWorkflowStatus(context.projectItemUrl, state, fullBranchName);
|
|
210
|
-
}
|
|
211
|
-
}
|
|
212
|
-
/**
|
|
213
|
-
* A branch attached to an item before metadata files existed (git config only)
|
|
214
|
-
* gets its `.idea1/<branch>.json` written at the current state.
|
|
215
|
-
*/
|
|
216
|
-
async function ensureMetadataOnBranch(context) {
|
|
217
|
-
const branchName = context.branchName;
|
|
218
|
-
const remote = await git.readBranchMetadataFromRef(branchName);
|
|
219
|
-
if (remote) {
|
|
220
|
-
return;
|
|
221
|
-
}
|
|
222
|
-
const state = context.currentState ?? WorkflowStates.BuildSpecInProgress;
|
|
223
|
-
await git.storeWorkflowState(state, branchName);
|
|
224
|
-
context.currentState = state;
|
|
225
|
-
if (context.workingPath) {
|
|
226
|
-
await git.commitBranchMetadata(context.workingPath, branchName, context.projectItemUrl);
|
|
227
|
-
await git.pushToRemote(branchName);
|
|
228
|
-
return;
|
|
229
|
-
}
|
|
230
|
-
const metadata = {
|
|
231
|
-
branchName,
|
|
232
|
-
projectItemUrl: context.projectItemUrl,
|
|
233
|
-
baseBranch: context.baseBranch,
|
|
234
|
-
workflowState: state,
|
|
235
|
-
devWorkflowType: context.devWorkflowType
|
|
236
|
-
};
|
|
237
|
-
if (context.stackBranch) {
|
|
238
|
-
metadata.stackBranch = context.stackBranch;
|
|
239
|
-
}
|
|
240
|
-
if (context.integrationBranch) {
|
|
241
|
-
metadata.integrationBranch = context.integrationBranch;
|
|
242
|
-
}
|
|
243
|
-
await git.updateBranchMetadataDetached(branchName, metadata);
|
|
244
|
-
}
|
|
245
|
-
/**
|
|
246
|
-
* Seed the local git config fast path from freshly created branch metadata.
|
|
247
|
-
*/
|
|
248
|
-
async function seedLocalConfig(metadata) {
|
|
249
|
-
const branch = metadata.branchName;
|
|
250
|
-
if (metadata.projectItemUrl)
|
|
251
|
-
await git.storeProjectItemUrl(metadata.projectItemUrl, branch);
|
|
252
|
-
if (metadata.baseBranch)
|
|
253
|
-
await git.storeBaseBranch(metadata.baseBranch, branch);
|
|
254
|
-
if (metadata.workflowState)
|
|
255
|
-
await git.storeWorkflowState(metadata.workflowState, branch);
|
|
256
|
-
if (metadata.devWorkflowType)
|
|
257
|
-
await git.storeDevWorkflowType(metadata.devWorkflowType, branch);
|
|
258
|
-
if (metadata.stackBranch)
|
|
259
|
-
await git.storeStackBranch(metadata.stackBranch, branch);
|
|
260
|
-
if (metadata.integrationBranch)
|
|
261
|
-
await git.storeIntegrationBranch(metadata.integrationBranch, branch);
|
|
262
|
-
}
|
|
263
|
-
/**
|
|
264
|
-
* Move the item to `targetState`, running the handlers of every state passed
|
|
265
|
-
* through on the way: all `prepare` steps, then a single persist of the target
|
|
266
|
-
* state, then all `complete` steps. Requires a managed item (see ensureManaged).
|
|
267
|
-
*/
|
|
268
|
-
export async function advanceTo(context, targetState) {
|
|
269
|
-
if (!context.branchName) {
|
|
270
|
-
throw new Error('The project item has no branch yet; call ensureManaged before advancing the workflow.');
|
|
271
|
-
}
|
|
272
|
-
if (context.currentState !== null && isStateAtOrAfter(context.currentState, targetState)) {
|
|
273
|
-
logger.info(`Already at "${context.currentState}"; nothing to advance to reach "${targetState}".`);
|
|
274
|
-
return;
|
|
275
|
-
}
|
|
276
|
-
const steps = getWorkflowStatesBetween(context.currentState, targetState);
|
|
277
|
-
const handlers = steps
|
|
278
|
-
.map(state => HANDLERS_BY_STATE.get(state))
|
|
279
|
-
.filter((handler) => handler !== undefined);
|
|
280
|
-
await resolveHandlerOptions(context, handlers);
|
|
281
|
-
logger.info(`Workflow: ${context.currentState ?? '(not started)'} → ${targetState}`);
|
|
282
|
-
for (const handler of handlers) {
|
|
283
|
-
if (handler.prepare) {
|
|
284
|
-
await handler.prepare(context);
|
|
285
|
-
}
|
|
286
|
-
}
|
|
287
|
-
await persistState(context, targetState);
|
|
288
|
-
for (const handler of handlers) {
|
|
289
|
-
if (handler.complete) {
|
|
290
|
-
await handler.complete(context);
|
|
291
|
-
}
|
|
292
|
-
}
|
|
293
|
-
}
|
|
294
|
-
/**
|
|
295
|
-
* Prompt for any handler option that was not supplied on the command line, so
|
|
296
|
-
* a handler reached through `next` asks the same questions as its dedicated
|
|
297
|
-
* command would.
|
|
298
|
-
*/
|
|
299
|
-
async function resolveHandlerOptions(context, handlers) {
|
|
300
|
-
for (const handler of handlers) {
|
|
301
|
-
if (!handler.options || handler.options.length === 0) {
|
|
302
|
-
continue;
|
|
303
|
-
}
|
|
304
|
-
const pseudoCommand = {
|
|
305
|
-
name: handler.state,
|
|
306
|
-
aliases: [],
|
|
307
|
-
description: `Options for entering ${handler.state}`,
|
|
308
|
-
options: handler.options,
|
|
309
|
-
execute: async () => undefined
|
|
310
|
-
};
|
|
311
|
-
const supplied = {};
|
|
312
|
-
for (const option of handler.options) {
|
|
313
|
-
if (option.longName in context.options) {
|
|
314
|
-
supplied[option.longName] = context.options[option.longName];
|
|
315
|
-
}
|
|
316
|
-
}
|
|
317
|
-
Object.assign(context.options, await resolveOptions(pseudoCommand, supplied));
|
|
318
|
-
}
|
|
319
|
-
}
|
|
320
|
-
/**
|
|
321
|
-
* Record the new state everywhere it lives: the branch's committed metadata
|
|
322
|
-
* (unless a handler retired the branch), local git config, and the item on
|
|
323
|
-
* idea1.ai (with the branch name, so the web client can find the branch).
|
|
324
|
-
*/
|
|
325
|
-
async function persistState(context, targetState) {
|
|
326
|
-
const branchName = context.branchName;
|
|
327
|
-
if (context.branchRetired) {
|
|
328
|
-
await git.storeWorkflowState(targetState, branchName);
|
|
329
|
-
}
|
|
330
|
-
else if (context.workingPath) {
|
|
331
|
-
await git.storeWorkflowState(targetState, branchName);
|
|
332
|
-
const committed = await git.commitBranchMetadataIfChanged(branchName);
|
|
333
|
-
if (committed) {
|
|
334
|
-
await git.pushToRemote(branchName);
|
|
335
|
-
}
|
|
336
|
-
}
|
|
337
|
-
else {
|
|
338
|
-
await git.updateBranchMetadataDetached(branchName, { workflowState: targetState });
|
|
339
|
-
await git.storeWorkflowState(targetState, branchName);
|
|
340
|
-
}
|
|
341
|
-
await claude.setWorkflowStatus(context.projectItemUrl, targetState, context.branchRetired ? undefined : branchName);
|
|
342
|
-
context.currentState = targetState;
|
|
343
|
-
}
|
|
344
|
-
/**
|
|
345
|
-
* Guard for the dedicated transition commands: they only run from the state
|
|
346
|
-
* immediately before their target.
|
|
347
|
-
*/
|
|
348
|
-
export function requireCurrentState(context, expectedState, commandName) {
|
|
349
|
-
if (context.currentState !== expectedState) {
|
|
350
|
-
throw new Error(`Cannot perform '${commandName}' from state '${context.currentState ?? '(not started)'}'. It requires state '${expectedState}'. Use 'idea1 next' to advance one step at a time.`);
|
|
351
|
-
}
|
|
352
|
-
}
|
|
353
|
-
/**
|
|
354
|
-
* The branch a handler works on; every handler runs after ensureManaged.
|
|
355
|
-
*/
|
|
356
|
-
export function requireBranch(context) {
|
|
357
|
-
if (!context.branchName) {
|
|
358
|
-
throw new Error('The project item has no branch yet.');
|
|
359
|
-
}
|
|
360
|
-
return context.branchName;
|
|
361
|
-
}
|
|
362
|
-
/**
|
|
363
|
-
* The local checkout a handler needs, with guidance when there is none.
|
|
364
|
-
*/
|
|
365
|
-
export function requireWorkingPath(context, purpose) {
|
|
366
|
-
if (!context.workingPath) {
|
|
367
|
-
throw new Error(`Branch ${context.branchName ?? ''} has no local checkout, which is needed to ${purpose}. Run: idea1 join-project-item --project-item-url ${context.projectItemUrl}`);
|
|
368
|
-
}
|
|
369
|
-
return context.workingPath;
|
|
370
|
-
}
|
|
371
|
-
//# sourceMappingURL=workflow-engine.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"workflow-engine.js","sourceRoot":"","sources":["../../src/services/workflow-engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import type { WorkflowStateHandler } from '../../types/index.js';
|
|
2
|
-
/**
|
|
3
|
-
* Entering "Agent Implementation": make sure the branch is checked out locally
|
|
4
|
-
* (worktree or main repo, per the isolation mode), then — once the state is
|
|
5
|
-
* recorded — launch Claude to implement the item. This is the only transition
|
|
6
|
-
* that starts code-writing automation.
|
|
7
|
-
*/
|
|
8
|
-
export declare const agentImplementationHandler: WorkflowStateHandler;
|
|
9
|
-
//# sourceMappingURL=agent-implementation.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"agent-implementation.d.ts","sourceRoot":"","sources":["../../../src/services/workflow-handlers/agent-implementation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAQjE;;;;;GAKG;AACH,eAAO,MAAM,0BAA0B,EAAE,oBA6BxC,CAAC"}
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
import { WorkflowStates } from '../../lib/workflow-states.js';
|
|
2
|
-
import { isolationModeOption, resolveIsolationMode } from '../../lib/isolation.js';
|
|
3
|
-
import { claudeEntryPointOption, claudeEntryPointPromptOptions, claudeSessionOptions, resolveClaudeSessionOptions } from '../../lib/claude-options.js';
|
|
4
|
-
import * as git from '../git.js';
|
|
5
|
-
import * as worktree from '../worktree.js';
|
|
6
|
-
import { requireBranch, requireWorkingPath } from '../workflow-engine.js';
|
|
7
|
-
/**
|
|
8
|
-
* Entering "Agent Implementation": make sure the branch is checked out locally
|
|
9
|
-
* (worktree or main repo, per the isolation mode), then — once the state is
|
|
10
|
-
* recorded — launch Claude to implement the item. This is the only transition
|
|
11
|
-
* that starts code-writing automation.
|
|
12
|
-
*/
|
|
13
|
-
export const agentImplementationHandler = {
|
|
14
|
-
state: WorkflowStates.AgentImplementation,
|
|
15
|
-
options: [isolationModeOption, ...claudeSessionOptions(true), claudeEntryPointOption, ...claudeEntryPointPromptOptions],
|
|
16
|
-
async prepare(context) {
|
|
17
|
-
const branchName = requireBranch(context);
|
|
18
|
-
const isolationMode = resolveIsolationMode(context.options);
|
|
19
|
-
const { workingPath } = await worktree.ensureBranchEnvironment(isolationMode, branchName);
|
|
20
|
-
context.workingPath = workingPath;
|
|
21
|
-
if ((await git.getRepoRoot()).trim() !== workingPath) {
|
|
22
|
-
process.chdir(workingPath);
|
|
23
|
-
}
|
|
24
|
-
},
|
|
25
|
-
async complete(context) {
|
|
26
|
-
const workingPath = requireWorkingPath(context, 'run the implementation session');
|
|
27
|
-
const { permissionMode, model, effort, claudeEntryPointMode, entryPointPrompt } = resolveClaudeSessionOptions(context.options);
|
|
28
|
-
await worktree.launchClaudeForBranch(workingPath, {
|
|
29
|
-
projectItemUrl: context.projectItemUrl,
|
|
30
|
-
permissionMode,
|
|
31
|
-
model,
|
|
32
|
-
effort,
|
|
33
|
-
claudeEntryPointMode,
|
|
34
|
-
entryPointPrompt
|
|
35
|
-
});
|
|
36
|
-
}
|
|
37
|
-
};
|
|
38
|
-
//# sourceMappingURL=agent-implementation.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"agent-implementation.js","sourceRoot":"","sources":["../../../src/services/workflow-handlers/agent-implementation.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AACnF,OAAO,EAAE,sBAAsB,EAAE,6BAA6B,EAAE,oBAAoB,EAAE,2BAA2B,EAAE,MAAM,6BAA6B,CAAC;AACvJ,OAAO,KAAK,GAAG,MAAM,WAAW,CAAC;AACjC,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAE1E;;;;;GAKG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAyB;IAC9D,KAAK,EAAE,cAAc,CAAC,mBAAmB;IACzC,OAAO,EAAE,CAAC,mBAAmB,EAAE,GAAG,oBAAoB,CAAC,IAAI,CAAC,EAAE,sBAAsB,EAAE,GAAG,6BAA6B,CAAC;IAEvH,KAAK,CAAC,OAAO,CAAC,OAAO;QACnB,MAAM,UAAU,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;QAC1C,MAAM,aAAa,GAAG,oBAAoB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAE5D,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,QAAQ,CAAC,uBAAuB,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC;QAC1F,OAAO,CAAC,WAAW,GAAG,WAAW,CAAC;QAElC,IAAI,CAAC,MAAM,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,WAAW,EAAE,CAAC;YACrD,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,OAAO;QACpB,MAAM,WAAW,GAAG,kBAAkB,CAAC,OAAO,EAAE,gCAAgC,CAAC,CAAC;QAClF,MAAM,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,GAAG,2BAA2B,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAE/H,MAAM,QAAQ,CAAC,qBAAqB,CAAC,WAAW,EAAE;YAChD,cAAc,EAAE,OAAO,CAAC,cAAc;YACtC,cAAc;YACd,KAAK;YACL,MAAM;YACN,oBAAoB;YACpB,gBAAgB;SACjB,CAAC,CAAC;IACL,CAAC;CACF,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"approve-pr.d.ts","sourceRoot":"","sources":["../../../src/services/workflow-handlers/approve-pr.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAUjE;;;;;;;;GAQG;AACH,eAAO,MAAM,gBAAgB,EAAE,oBAsF9B,CAAC"}
|
|
@@ -1,122 +0,0 @@
|
|
|
1
|
-
import { logger } from '../../lib/logger.js';
|
|
2
|
-
import { promptConfirm } from '../../lib/prompt.js';
|
|
3
|
-
import { WorkflowStates } from '../../lib/workflow-states.js';
|
|
4
|
-
import * as git from '../git.js';
|
|
5
|
-
import * as github from '../github.js';
|
|
6
|
-
import { confirmApproverIdentity } from '../release-flow.js';
|
|
7
|
-
import { removeCurrentWorktree, resolveBaseBranch } from '../worktree.js';
|
|
8
|
-
import { requireBranch } from '../workflow-engine.js';
|
|
9
|
-
/**
|
|
10
|
-
* Entering "Approved and Merged": merge the PR. The merge IS the approval - it is performed by
|
|
11
|
-
* the PR's assignee, and GitHub records it as `merged_by` with a timestamp and merge commit
|
|
12
|
-
* (change-management-policy.md clause 2, stage 1). The merge waits for the required CI/CD checks
|
|
13
|
-
* and there is no override at this stage: a red or unfinished suite stops it. A repository with no
|
|
14
|
-
* CI/CD configured has no suite to wait for, so its PR merges straight away. Before merging, the
|
|
15
|
-
* branch's metadata file is dropped so it does not leak into the target branch; afterwards the
|
|
16
|
-
* branch and any worktree are cleaned up.
|
|
17
|
-
*/
|
|
18
|
-
export const approvePrHandler = {
|
|
19
|
-
state: WorkflowStates.ApprovedAndMerged,
|
|
20
|
-
async prepare(context) {
|
|
21
|
-
const branchName = requireBranch(context);
|
|
22
|
-
if (context.workingPath) {
|
|
23
|
-
await git.ensureBranchUpToDate();
|
|
24
|
-
}
|
|
25
|
-
const prInfo = await github.getPrInfo(branchName);
|
|
26
|
-
if (!prInfo) {
|
|
27
|
-
throw new Error('No PR found for this branch. Nothing to approve.');
|
|
28
|
-
}
|
|
29
|
-
logger.info(`PR #${prInfo.number} found`);
|
|
30
|
-
// Re-entering this state after the item was moved back: the merge already happened.
|
|
31
|
-
if (prInfo.state.toUpperCase() === 'MERGED') {
|
|
32
|
-
logger.dim(`PR #${prInfo.number} is already merged; nothing to approve.`);
|
|
33
|
-
context.branchRetired = true;
|
|
34
|
-
return;
|
|
35
|
-
}
|
|
36
|
-
await confirmApproverIdentity(branchName);
|
|
37
|
-
// Remove the branch metadata file before merging so it does not leak into the target branch.
|
|
38
|
-
// This push re-runs the CI/CD suite on the PR, and the merge below waits for that run.
|
|
39
|
-
if (context.workingPath) {
|
|
40
|
-
await git.removeBranchMetadataAndPush(branchName);
|
|
41
|
-
}
|
|
42
|
-
else {
|
|
43
|
-
await git.removeBranchMetadataDetached(branchName);
|
|
44
|
-
}
|
|
45
|
-
const confirmMerge = await promptConfirm(`Approve PR #${prInfo.number} by merging it (${branchName} -> ${context.baseBranch})?`, { default: true });
|
|
46
|
-
if (!confirmMerge) {
|
|
47
|
-
throw new Error('Merge cancelled by user');
|
|
48
|
-
}
|
|
49
|
-
await mergeAfterChecksPass(branchName);
|
|
50
|
-
context.branchRetired = true;
|
|
51
|
-
},
|
|
52
|
-
async complete(context) {
|
|
53
|
-
const branchName = requireBranch(context);
|
|
54
|
-
await git.fetchLatest();
|
|
55
|
-
if (!context.workingPath) {
|
|
56
|
-
await github.deleteRemoteBranch(branchName);
|
|
57
|
-
printCompletion(context.baseBranch, context.projectItemUrl);
|
|
58
|
-
return;
|
|
59
|
-
}
|
|
60
|
-
const isWorktree = await git.isInsideWorktree();
|
|
61
|
-
const mainRepoRoot = await git.getMainRepoRoot();
|
|
62
|
-
// Inside a worktree the base branch cannot be checked out in place, so the
|
|
63
|
-
// worktree is removed regardless of removeWorktreeAtState.
|
|
64
|
-
if (isWorktree) {
|
|
65
|
-
const worktreePath = await removeCurrentWorktree(mainRepoRoot);
|
|
66
|
-
await deleteBranchQuietly(branchName);
|
|
67
|
-
printCompletion(context.baseBranch, context.projectItemUrl);
|
|
68
|
-
logger.hint(`Worktree removed: ${worktreePath}`);
|
|
69
|
-
logger.hint(`Change to a different folder (e.g. ${mainRepoRoot}) to continue.`);
|
|
70
|
-
return;
|
|
71
|
-
}
|
|
72
|
-
// Switch to the base branch (it may be checked out in another worktree)
|
|
73
|
-
const baseWorktreePath = await git.getWorktreePathForBranch(context.baseBranch);
|
|
74
|
-
if (baseWorktreePath) {
|
|
75
|
-
logger.step(`Base branch ${context.baseBranch} is in a worktree at ${baseWorktreePath}, pulling there...`);
|
|
76
|
-
await git.updateBranchToLatest(context.baseBranch);
|
|
77
|
-
const settingsBaseBranch = await resolveBaseBranch();
|
|
78
|
-
await git.checkoutAndPullBranch(settingsBaseBranch);
|
|
79
|
-
}
|
|
80
|
-
else {
|
|
81
|
-
await git.checkoutAndPullBranch(context.baseBranch);
|
|
82
|
-
}
|
|
83
|
-
await deleteBranchQuietly(branchName);
|
|
84
|
-
printCompletion(context.baseBranch, context.projectItemUrl);
|
|
85
|
-
if (baseWorktreePath) {
|
|
86
|
-
logger.hint(`Base branch is in worktree at: ${baseWorktreePath}`);
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
};
|
|
90
|
-
/**
|
|
91
|
-
* Merge only once the required checks pass. Stage 1 has no admin override
|
|
92
|
-
* (change-management-policy.md clause 3): the only way past a failing suite is to fix it.
|
|
93
|
-
*/
|
|
94
|
-
async function mergeAfterChecksPass(branchName) {
|
|
95
|
-
const checks = await github.waitForPrChecks(branchName);
|
|
96
|
-
if (!checks.passed) {
|
|
97
|
-
throw new Error('Required checks did not pass, so the PR was not merged. There is no override at this stage ' +
|
|
98
|
-
'(change-management-policy.md clause 3) - fix the build and run idea1 approve-pr again.\n\n' +
|
|
99
|
-
checks.summary);
|
|
100
|
-
}
|
|
101
|
-
const mergeResult = await github.mergePr(branchName);
|
|
102
|
-
if (!mergeResult.success) {
|
|
103
|
-
throw new Error(`Failed to merge PR: ${mergeResult.error}`);
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
async function deleteBranchQuietly(branchName) {
|
|
107
|
-
try {
|
|
108
|
-
await git.deleteBranch(branchName, true);
|
|
109
|
-
}
|
|
110
|
-
catch {
|
|
111
|
-
// The remote branch may already have been deleted automatically after the merge
|
|
112
|
-
logger.dim(`Note: Branch ${branchName} may have been automatically deleted after merge`);
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
function printCompletion(baseBranch, projectItemUrl) {
|
|
116
|
-
logger.newline();
|
|
117
|
-
logger.success('Workflow complete!');
|
|
118
|
-
logger.newline();
|
|
119
|
-
logger.hint(`PR merged into ${baseBranch} - the merge is the recorded approval`);
|
|
120
|
-
logger.hint(`Project item: ${projectItemUrl}`);
|
|
121
|
-
}
|
|
122
|
-
//# sourceMappingURL=approve-pr.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"approve-pr.js","sourceRoot":"","sources":["../../../src/services/workflow-handlers/approve-pr.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"dev-implementation.d.ts","sourceRoot":"","sources":["../../../src/services/workflow-handlers/dev-implementation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAQjE;;;;GAIG;AACH,eAAO,MAAM,wBAAwB,EAAE,oBA0BtC,CAAC"}
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
import { logger } from '../../lib/logger.js';
|
|
2
|
-
import { WorkflowStates } from '../../lib/workflow-states.js';
|
|
3
|
-
import * as git from '../git.js';
|
|
4
|
-
import * as github from '../github.js';
|
|
5
|
-
import { removeWorktreeForWorkflowState } from '../worktree.js';
|
|
6
|
-
import { requireBranch, requireWorkingPath } from '../workflow-engine.js';
|
|
7
|
-
/**
|
|
8
|
-
* Entering "Dev Implementation": the agent's work is committed and pushed and a
|
|
9
|
-
* PR exists, so a developer can test, clean up and finish the work. Afterwards
|
|
10
|
-
* the worktree is removed when `removeWorktreeAtState` says so.
|
|
11
|
-
*/
|
|
12
|
-
export const devImplementationHandler = {
|
|
13
|
-
state: WorkflowStates.DevImplementation,
|
|
14
|
-
async prepare(context) {
|
|
15
|
-
const branchName = requireBranch(context);
|
|
16
|
-
requireWorkingPath(context, 'commit and push the implementation');
|
|
17
|
-
if (await git.hasUncommittedChanges()) {
|
|
18
|
-
await git.commitAllChanges(`Agent Implementation of ${context.projectItemUrl} on ${branchName}`);
|
|
19
|
-
}
|
|
20
|
-
await git.pushToRemote(branchName);
|
|
21
|
-
const prInfo = await github.createPrIfNeeded(branchName, context.baseBranch, context.projectItemUrl);
|
|
22
|
-
if (prInfo) {
|
|
23
|
-
logger.hint(`PR: ${prInfo.url}`);
|
|
24
|
-
}
|
|
25
|
-
},
|
|
26
|
-
async complete(context) {
|
|
27
|
-
const branchName = requireBranch(context);
|
|
28
|
-
await removeWorktreeForWorkflowState(WorkflowStates.DevImplementation, branchName, context.projectItemUrl, { checkoutBranchInMainRepo: false });
|
|
29
|
-
logger.newline();
|
|
30
|
-
logger.success('Transitioned to Dev Implementation');
|
|
31
|
-
logger.hint('When ready for review, run: idea1 ready-for-approval [--assignee <username>] [--reviewers <user1,user2>]');
|
|
32
|
-
}
|
|
33
|
-
};
|
|
34
|
-
//# sourceMappingURL=dev-implementation.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"dev-implementation.js","sourceRoot":"","sources":["../../../src/services/workflow-handlers/dev-implementation.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,KAAK,GAAG,MAAM,WAAW,CAAC;AACjC,OAAO,KAAK,MAAM,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,8BAA8B,EAAE,MAAM,gBAAgB,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAE1E;;;;GAIG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAyB;IAC5D,KAAK,EAAE,cAAc,CAAC,iBAAiB;IAEvC,KAAK,CAAC,OAAO,CAAC,OAAO;QACnB,MAAM,UAAU,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;QAC1C,kBAAkB,CAAC,OAAO,EAAE,oCAAoC,CAAC,CAAC;QAElE,IAAI,MAAM,GAAG,CAAC,qBAAqB,EAAE,EAAE,CAAC;YACtC,MAAM,GAAG,CAAC,gBAAgB,CAAC,2BAA2B,OAAO,CAAC,cAAc,OAAO,UAAU,EAAE,CAAC,CAAC;QACnG,CAAC;QACD,MAAM,GAAG,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;QAEnC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC;QACrG,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,CAAC,IAAI,CAAC,OAAO,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC;QACnC,CAAC;IACH,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,OAAO;QACpB,MAAM,UAAU,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;QAC1C,MAAM,8BAA8B,CAAC,cAAc,CAAC,iBAAiB,EAAE,UAAU,EAAE,OAAO,CAAC,cAAc,EAAE,EAAE,wBAAwB,EAAE,KAAK,EAAE,CAAC,CAAC;QAEhJ,MAAM,CAAC,OAAO,EAAE,CAAC;QACjB,MAAM,CAAC,OAAO,CAAC,oCAAoC,CAAC,CAAC;QACrD,MAAM,CAAC,IAAI,CAAC,0GAA0G,CAAC,CAAC;IAC1H,CAAC;CACF,CAAC"}
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import type { CommandOption, WorkflowState, WorkflowStateHandler } from '../../types/index.js';
|
|
2
|
-
/**
|
|
3
|
-
* Side effects attached to entering a workflow state. States without an entry
|
|
4
|
-
* are status-only: entering them records the state and nothing else.
|
|
5
|
-
*/
|
|
6
|
-
export declare const HANDLERS_BY_STATE: ReadonlyMap<WorkflowState, WorkflowStateHandler>;
|
|
7
|
-
/**
|
|
8
|
-
* The handler for a state, for commands dedicated to one transition.
|
|
9
|
-
*/
|
|
10
|
-
export declare function getHandler(state: WorkflowState): WorkflowStateHandler;
|
|
11
|
-
/**
|
|
12
|
-
* Every handler option, for commands that can reach any state (e.g. `next`).
|
|
13
|
-
* The options are declared so they parse on the command line, but marked
|
|
14
|
-
* inapplicable so the resolver never prompts for them up front — the engine
|
|
15
|
-
* prompts for the ones the actual transition needs.
|
|
16
|
-
*/
|
|
17
|
-
export declare function deferredHandlerOptions(): CommandOption[];
|
|
18
|
-
//# sourceMappingURL=index.d.ts.map
|