@idea1/cli 1.7.7 → 1.8.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 +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/interactive.d.ts.map +1 -1
- package/dist/interactive.js +47 -34
- 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/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
|
@@ -0,0 +1,405 @@
|
|
|
1
|
+
import { logger } from '../../lib/logger.js';
|
|
2
|
+
import { resolveOptions } from '../../cli/resolver.js';
|
|
3
|
+
import * as git from '../../services/git.js';
|
|
4
|
+
import * as github from '../../services/github.js';
|
|
5
|
+
import * as platform from '../../services/platform.js';
|
|
6
|
+
import * as worktree from '../../services/worktree.js';
|
|
7
|
+
import { WorkflowBranchState } from '../data/workflow-context.js';
|
|
8
|
+
import { WorkflowStates, getWorkflowStatesBetween, isStateAtOrAfter, normalizeWorkflowState } from '../data/workflow-states.js';
|
|
9
|
+
import { collectBranchCreationChoices } from './branch-setup.js';
|
|
10
|
+
import { HANDLERS_BY_STATE, getHandler } from './handlers/index.js';
|
|
11
|
+
/**
|
|
12
|
+
* Work out which project item and branch a command operates on. Reading only: an item outside
|
|
13
|
+
* workflow management resolves to a transition with no context, and the transition the command
|
|
14
|
+
* goes on to make is what gives it one.
|
|
15
|
+
*
|
|
16
|
+
* On a managed branch (the platform records the current branch as an item's) the branch is the
|
|
17
|
+
* target. Otherwise the item URL is required: its summary is read from the platform and, when its
|
|
18
|
+
* branch is live and checked out somewhere locally, that checkout becomes the working directory.
|
|
19
|
+
*/
|
|
20
|
+
export async function resolveTransition(input) {
|
|
21
|
+
const transition = await resolveTransitionIfManaged(input);
|
|
22
|
+
if (!transition) {
|
|
23
|
+
throw new Error('This branch is not under workflow management. Pass --url <project item url>, or run this from the item\'s branch.');
|
|
24
|
+
}
|
|
25
|
+
return transition;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Like `resolveTransition`, returning null for a current branch outside workflow management when
|
|
29
|
+
* no item URL was given. For commands that also operate on a branch with no project item
|
|
30
|
+
* (`ready-for-approval`, `approve-pr`).
|
|
31
|
+
*/
|
|
32
|
+
export async function resolveTransitionIfManaged(input) {
|
|
33
|
+
const requestedUrl = input.projectItemUrl || null;
|
|
34
|
+
const currentBranch = await git.getCurrentBranch();
|
|
35
|
+
const currentBranchItem = currentBranch !== 'HEAD' ? await getProjectItemSummaryForBranch(currentBranch) : null;
|
|
36
|
+
if (currentBranchItem && (!requestedUrl || requestedUrl === currentBranchItem.url)) {
|
|
37
|
+
return transitionForManagedBranch(currentBranchItem, input.options);
|
|
38
|
+
}
|
|
39
|
+
if (!requestedUrl) {
|
|
40
|
+
return null;
|
|
41
|
+
}
|
|
42
|
+
if (currentBranchItem) {
|
|
43
|
+
logger.dim(`Current branch belongs to ${currentBranchItem.url}; operating on ${requestedUrl} instead.`);
|
|
44
|
+
}
|
|
45
|
+
const item = await getProjectItemSummary(requestedUrl);
|
|
46
|
+
const context = item.workflowContext;
|
|
47
|
+
if (context?.branchState === WorkflowBranchState.Live) {
|
|
48
|
+
logger.info(`Resolved branch for ${requestedUrl}: ${context.branchName}`);
|
|
49
|
+
return transitionForManagedBranch(item, input.options);
|
|
50
|
+
}
|
|
51
|
+
return {
|
|
52
|
+
projectItemUrl: item.url,
|
|
53
|
+
context,
|
|
54
|
+
currentState: context ? normalizeWorkflowState(context.workflowStatus) : null,
|
|
55
|
+
workingPath: null,
|
|
56
|
+
options: input.options
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Build the transition for an item whose live branch is in this repository: the branch's local
|
|
61
|
+
* checkout (when it has one) is brought up to date with origin and becomes the working directory.
|
|
62
|
+
*/
|
|
63
|
+
async function transitionForManagedBranch(item, options) {
|
|
64
|
+
const context = item.workflowContext;
|
|
65
|
+
if (context?.branchState !== WorkflowBranchState.Live) {
|
|
66
|
+
throw new Error(`${item.url} has no live branch.`);
|
|
67
|
+
}
|
|
68
|
+
if (!await liveBranchHere(context)) {
|
|
69
|
+
throw new Error(`${item.url} is implemented on ${context.branchName} in ${context.repositoryFullName}, not in this repository (${await currentRepositoryFullName()}).`);
|
|
70
|
+
}
|
|
71
|
+
await syncCheckoutWithOrigin(context.branchName);
|
|
72
|
+
const workingPath = await git.getCheckoutPathForBranch(context.branchName);
|
|
73
|
+
if (workingPath && workingPath !== (await git.getRepoRoot()).trim()) {
|
|
74
|
+
logger.dim(`Working in ${workingPath}`);
|
|
75
|
+
process.chdir(workingPath);
|
|
76
|
+
}
|
|
77
|
+
return {
|
|
78
|
+
projectItemUrl: item.url,
|
|
79
|
+
context,
|
|
80
|
+
currentState: normalizeWorkflowState(context.workflowStatus),
|
|
81
|
+
workingPath,
|
|
82
|
+
options
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* GitHub repository names compare case-insensitively.
|
|
87
|
+
*/
|
|
88
|
+
function sameRepository(a, b) {
|
|
89
|
+
return a.toLowerCase() === b.toLowerCase();
|
|
90
|
+
}
|
|
91
|
+
const repositoryFullNameByCwd = new Map();
|
|
92
|
+
/**
|
|
93
|
+
* The current repository's `owner/name`, resolved once per working directory the process visits
|
|
94
|
+
* (a transition can `process.chdir` into a branch's worktree partway through).
|
|
95
|
+
*/
|
|
96
|
+
function currentRepositoryFullName() {
|
|
97
|
+
const cwd = process.cwd();
|
|
98
|
+
let result = repositoryFullNameByCwd.get(cwd);
|
|
99
|
+
if (!result) {
|
|
100
|
+
result = git.getRepositoryFullName();
|
|
101
|
+
repositoryFullNameByCwd.set(cwd, result);
|
|
102
|
+
}
|
|
103
|
+
return result;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Whether a context's branch is live and lives in this repository.
|
|
107
|
+
*/
|
|
108
|
+
async function liveBranchHere(context) {
|
|
109
|
+
return context?.branchState === WorkflowBranchState.Live && sameRepository(context.repositoryFullName, await currentRepositoryFullName());
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Fast-forward a local checkout of the branch to origin when it is strictly behind, so work
|
|
113
|
+
* continues on what the other clones pushed. Local commits are kept as they are: a diverged
|
|
114
|
+
* checkout gets a warning.
|
|
115
|
+
*/
|
|
116
|
+
async function syncCheckoutWithOrigin(branchName) {
|
|
117
|
+
const remoteExists = await git.fetchRemoteBranch(branchName);
|
|
118
|
+
if (!remoteExists) {
|
|
119
|
+
logger.dim(`Branch ${branchName} exists locally only`);
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
const checkoutPath = await git.getCheckoutPathForBranch(branchName);
|
|
123
|
+
if (!checkoutPath) {
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
const result = await git.fastForwardCheckoutToOrigin(branchName, checkoutPath);
|
|
127
|
+
if (result === 'fast-forwarded') {
|
|
128
|
+
logger.dim(`Fast-forwarded ${branchName} to origin`);
|
|
129
|
+
}
|
|
130
|
+
else if (result === 'diverged') {
|
|
131
|
+
logger.warning(`Local branch ${branchName} has diverged from origin. Run 'idea1 update-branch' to merge before continuing.`);
|
|
132
|
+
}
|
|
133
|
+
else if (result === 'blocked') {
|
|
134
|
+
logger.warning(`Could not fast-forward ${branchName} to origin because of local changes. Commit or stash them, then pull.`);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Make sure the item is under workflow management with a branch fit for entering `targetState`.
|
|
139
|
+
*
|
|
140
|
+
* An item with no context, or one whose branch is gone while its work is still to merge, gets a
|
|
141
|
+
* new branch on origin at its source branch's tip, recorded on the platform at once so the branch
|
|
142
|
+
* and the context never disagree even when a handler fails afterwards. A new context enters the
|
|
143
|
+
* first workflow state; an existing one keeps its status. Work that was merged stays merged: its
|
|
144
|
+
* context keeps the retired branch, and the states it re-enters find their pull request work done.
|
|
145
|
+
* The working tree and the code stay as they are.
|
|
146
|
+
*/
|
|
147
|
+
async function startWorkflowManagement(transition, targetState) {
|
|
148
|
+
const context = transition.context;
|
|
149
|
+
if (context?.branchState === WorkflowBranchState.Live || context?.branchState === WorkflowBranchState.Merged) {
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
if (context && isStateAtOrAfter(targetState, WorkflowStates.ApprovedAndMerged)) {
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
const choices = await collectBranchCreationChoices(transition.options);
|
|
156
|
+
const shortBranchName = choices.shortBranchName ?? await platform.generateBranchName(transition.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
|
+
await git.createRemoteBranchFrom(fullBranchName, `origin/${sourceBranch}`);
|
|
184
|
+
let item;
|
|
185
|
+
try {
|
|
186
|
+
item = await upsertProjectItemWorkflowContext({
|
|
187
|
+
projectItemUrl: transition.projectItemUrl,
|
|
188
|
+
branchName: fullBranchName,
|
|
189
|
+
baseBranch: prTargetBranch,
|
|
190
|
+
devWorkflowType: choices.workflowType,
|
|
191
|
+
stackBranch: choices.stackBranch,
|
|
192
|
+
integrationBranch: choices.integrationSelection?.integrationBranchName ?? null
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
catch (error) {
|
|
196
|
+
// A branch is under workflow exactly when the platform records it, so a refused branch goes too.
|
|
197
|
+
await github.deleteRemoteBranch(fullBranchName);
|
|
198
|
+
throw error;
|
|
199
|
+
}
|
|
200
|
+
transition.context = item.workflowContext;
|
|
201
|
+
transition.currentState = item.workflowContext ? normalizeWorkflowState(item.workflowContext.workflowStatus) : null;
|
|
202
|
+
transition.workingPath = null;
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Move the item to `targetState` one state at a time: each state on the way is entered in order -
|
|
206
|
+
* its handler prepares, the state is recorded on the item, its handler completes - exactly as
|
|
207
|
+
* advancing to each state with its own command would. The options of every handler on the way are
|
|
208
|
+
* asked for before the first state is entered. An item that is not under workflow management yet
|
|
209
|
+
* is put under it first, so advancing an item that has never been started to the first state is
|
|
210
|
+
* what starts it; an item already at or past `targetState` keeps its state and only gains its
|
|
211
|
+
* branch, so advancing again is a no-op and a run that stopped part way continues where it stopped.
|
|
212
|
+
*/
|
|
213
|
+
export async function advanceAsNeededTo(transition, targetState) {
|
|
214
|
+
await startWorkflowManagement(transition, targetState);
|
|
215
|
+
if (transition.currentState !== null && isStateAtOrAfter(transition.currentState, targetState)) {
|
|
216
|
+
logger.info(`Already at "${transition.currentState}"; nothing to advance to reach "${targetState}".`);
|
|
217
|
+
return;
|
|
218
|
+
}
|
|
219
|
+
const steps = getWorkflowStatesBetween(transition.currentState, targetState);
|
|
220
|
+
await resolveHandlerOptions(transition, steps
|
|
221
|
+
.map(state => HANDLERS_BY_STATE.get(state))
|
|
222
|
+
.filter((handler) => handler !== undefined));
|
|
223
|
+
for (const state of steps) {
|
|
224
|
+
logger.info(`Workflow: ${transition.currentState ?? '(not started)'} → ${state}`);
|
|
225
|
+
const handler = HANDLERS_BY_STATE.get(state);
|
|
226
|
+
await handler?.prepare?.(transition);
|
|
227
|
+
await persistState(transition, state);
|
|
228
|
+
await handler?.complete?.(transition);
|
|
229
|
+
await refreshWorkingPath(transition);
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Find the branch's local checkout again after a state is entered, as the next command would on
|
|
234
|
+
* resolving the transition: entering a state can remove the worktree the branch was checked out in
|
|
235
|
+
* (per `removeWorktreeAtState`), or retire the branch altogether.
|
|
236
|
+
*/
|
|
237
|
+
async function refreshWorkingPath(transition) {
|
|
238
|
+
const context = transition.context;
|
|
239
|
+
transition.workingPath = context?.branchState === WorkflowBranchState.Live
|
|
240
|
+
? await git.getCheckoutPathForBranch(context.branchName)
|
|
241
|
+
: null;
|
|
242
|
+
if (transition.workingPath && transition.workingPath !== (await git.getRepoRoot()).trim()) {
|
|
243
|
+
process.chdir(transition.workingPath);
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Run the automation of the state the item is already in, without a transition: the state's
|
|
248
|
+
* handler prepares and completes again, so its working environment is set up and its session
|
|
249
|
+
* starts afresh. The item's status already is this state and stays as it is.
|
|
250
|
+
*/
|
|
251
|
+
export async function reenterState(transition, state) {
|
|
252
|
+
await startWorkflowManagement(transition, state);
|
|
253
|
+
const handler = getHandler(state);
|
|
254
|
+
await resolveHandlerOptions(transition, [handler]);
|
|
255
|
+
await handler.prepare?.(transition);
|
|
256
|
+
await handler.complete?.(transition);
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* Prompt for any handler option that was not supplied on the command line, so a handler reached
|
|
260
|
+
* through `next` asks the same questions as its dedicated command would.
|
|
261
|
+
*/
|
|
262
|
+
async function resolveHandlerOptions(transition, handlers) {
|
|
263
|
+
for (const handler of handlers) {
|
|
264
|
+
if (!handler.options || handler.options.length === 0) {
|
|
265
|
+
continue;
|
|
266
|
+
}
|
|
267
|
+
const pseudoCommand = {
|
|
268
|
+
name: handler.state,
|
|
269
|
+
aliases: [],
|
|
270
|
+
description: `Options for entering ${handler.state}`,
|
|
271
|
+
options: handler.options,
|
|
272
|
+
execute: async () => undefined
|
|
273
|
+
};
|
|
274
|
+
const supplied = {};
|
|
275
|
+
for (const option of handler.options) {
|
|
276
|
+
if (option.longName in transition.options) {
|
|
277
|
+
supplied[option.longName] = transition.options[option.longName];
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
Object.assign(transition.options, await resolveOptions(pseudoCommand, supplied));
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
/**
|
|
284
|
+
* Record the new state where it lives: the item's workflow context on idea1.ai. The item's status
|
|
285
|
+
* is the state of the work for every clone and for the web app alike.
|
|
286
|
+
*/
|
|
287
|
+
async function persistState(transition, targetState) {
|
|
288
|
+
const context = requireContext(transition);
|
|
289
|
+
await platform.setWorkflowStatus(transition.projectItemUrl, targetState);
|
|
290
|
+
context.workflowStatus = targetState;
|
|
291
|
+
transition.currentState = targetState;
|
|
292
|
+
}
|
|
293
|
+
/**
|
|
294
|
+
* The summary of the project item a branch in this repository implements, with the item's workflow
|
|
295
|
+
* context. Null for a branch outside workflow management. The item URL is remembered locally for
|
|
296
|
+
* the branch.
|
|
297
|
+
*/
|
|
298
|
+
export async function getProjectItemSummaryForBranch(branchName) {
|
|
299
|
+
const repositoryFullName = await currentRepositoryFullName();
|
|
300
|
+
const item = await platform.getProjectItemSummaryForBranch({ repositoryFullName, branchName });
|
|
301
|
+
if (item) {
|
|
302
|
+
await git.storeProjectItemUrl(item.url, branchName);
|
|
303
|
+
}
|
|
304
|
+
return item;
|
|
305
|
+
}
|
|
306
|
+
/**
|
|
307
|
+
* The summary of a project item, with its workflow context: `workflowContext` is null for an item
|
|
308
|
+
* outside workflow management. When the item's live branch is in this repository, the item URL is
|
|
309
|
+
* remembered locally for it.
|
|
310
|
+
*/
|
|
311
|
+
export async function getProjectItemSummary(projectItemUrl) {
|
|
312
|
+
const item = await platform.getProjectItemSummary(projectItemUrl);
|
|
313
|
+
const context = item.workflowContext;
|
|
314
|
+
if (await liveBranchHere(context)) {
|
|
315
|
+
await git.storeProjectItemUrl(item.url, context.branchName);
|
|
316
|
+
}
|
|
317
|
+
return item;
|
|
318
|
+
}
|
|
319
|
+
/**
|
|
320
|
+
* Record a branch of this repository in an item's workflow context as the one implementing the
|
|
321
|
+
* item, putting the item under workflow management when it is not yet. The status is left alone: a
|
|
322
|
+
* new context starts at the first state, an existing one keeps its state. Idempotent for the same
|
|
323
|
+
* branch and item. Returns the item's summary.
|
|
324
|
+
*/
|
|
325
|
+
export async function upsertProjectItemWorkflowContext(input) {
|
|
326
|
+
const item = await platform.upsertProjectItemWorkflowContext({ ...input, repositoryFullName: await currentRepositoryFullName() });
|
|
327
|
+
await git.storeProjectItemUrl(input.projectItemUrl, input.branchName);
|
|
328
|
+
return item;
|
|
329
|
+
}
|
|
330
|
+
/**
|
|
331
|
+
* The item URL of a branch as this clone last saw it - instant, and null for a branch this clone
|
|
332
|
+
* has yet to resolve. For display and for deciding whether a platform read is worth making; the
|
|
333
|
+
* platform is the truth (`getProjectItemSummaryForBranch`).
|
|
334
|
+
*/
|
|
335
|
+
export async function getRememberedProjectItemUrl(branchName) {
|
|
336
|
+
return git.getProjectItemUrl(branchName);
|
|
337
|
+
}
|
|
338
|
+
/**
|
|
339
|
+
* The item URL of a branch: remembered locally, else read from the platform. Null for a branch
|
|
340
|
+
* outside workflow management.
|
|
341
|
+
*/
|
|
342
|
+
export async function getProjectItemUrlForBranch(branchName) {
|
|
343
|
+
return await getRememberedProjectItemUrl(branchName) ?? (await getProjectItemSummaryForBranch(branchName))?.url ?? null;
|
|
344
|
+
}
|
|
345
|
+
/**
|
|
346
|
+
* The live branch of an item in this repository, as this clone remembers it when that branch
|
|
347
|
+
* still exists, else the platform's answer. Null for an item with no live branch here.
|
|
348
|
+
*/
|
|
349
|
+
export async function resolveBranchForItem(projectItemUrl) {
|
|
350
|
+
const remembered = await git.findBranchWithProjectItemUrl(projectItemUrl);
|
|
351
|
+
if (remembered && await git.branchExists(remembered)) {
|
|
352
|
+
return remembered;
|
|
353
|
+
}
|
|
354
|
+
const context = (await getProjectItemSummary(projectItemUrl)).workflowContext;
|
|
355
|
+
return await liveBranchHere(context) ? context.branchName : null;
|
|
356
|
+
}
|
|
357
|
+
/**
|
|
358
|
+
* The current branch and the summary of the project item it implements, for display. A branch this
|
|
359
|
+
* clone has yet to resolve as an item's is reported with a null item straight from the remembered
|
|
360
|
+
* URLs, so the interactive header is instant on ordinary branches; the platform is read for a
|
|
361
|
+
* branch this clone knows as an item's.
|
|
362
|
+
*/
|
|
363
|
+
export async function getProjectItemSummaryForCurrentBranch() {
|
|
364
|
+
let branch = '';
|
|
365
|
+
try {
|
|
366
|
+
branch = await git.getCurrentBranch();
|
|
367
|
+
}
|
|
368
|
+
catch {
|
|
369
|
+
// Outside a repository the header shows the directory alone.
|
|
370
|
+
}
|
|
371
|
+
const item = branch && branch !== 'HEAD' && await getRememberedProjectItemUrl(branch)
|
|
372
|
+
? await getProjectItemSummaryForBranch(branch).catch(() => null)
|
|
373
|
+
: null;
|
|
374
|
+
return { branch, item };
|
|
375
|
+
}
|
|
376
|
+
/**
|
|
377
|
+
* The item's context, for handlers that record what they did on it; the item is put under
|
|
378
|
+
* workflow management before any handler runs.
|
|
379
|
+
*/
|
|
380
|
+
export function requireContext(transition) {
|
|
381
|
+
if (!transition.context) {
|
|
382
|
+
throw new Error(`${transition.projectItemUrl} is not under workflow management.`);
|
|
383
|
+
}
|
|
384
|
+
return transition.context;
|
|
385
|
+
}
|
|
386
|
+
/**
|
|
387
|
+
* The item's context with its live branch, for handlers that do branch work.
|
|
388
|
+
*/
|
|
389
|
+
export function requireLiveContext(transition) {
|
|
390
|
+
const context = requireContext(transition);
|
|
391
|
+
if (context.branchState !== WorkflowBranchState.Live) {
|
|
392
|
+
throw new Error(`${transition.projectItemUrl} has no live branch (its branch ${context.branchName || '(unrecorded)'} is ${WorkflowBranchState[context.branchState].toLowerCase()}).`);
|
|
393
|
+
}
|
|
394
|
+
return context;
|
|
395
|
+
}
|
|
396
|
+
/**
|
|
397
|
+
* The local checkout a handler needs, with guidance when there is none.
|
|
398
|
+
*/
|
|
399
|
+
export function requireWorkingPath(transition, purpose) {
|
|
400
|
+
if (!transition.workingPath) {
|
|
401
|
+
throw new Error(`Branch ${transition.context?.branchName ?? ''} has no local checkout, which is needed to ${purpose}. Run: idea1 join-project-item --project-item-url ${transition.projectItemUrl}`);
|
|
402
|
+
}
|
|
403
|
+
return transition.workingPath;
|
|
404
|
+
}
|
|
405
|
+
//# sourceMappingURL=workflow-engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow-engine.js","sourceRoot":"","sources":["../../../src/workflow/engine/workflow-engine.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@idea1/cli",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.8.1",
|
|
4
4
|
"description": "CLI tool for Idea1.ai workflow automation - AI-assisted development workflows",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -40,6 +40,7 @@
|
|
|
40
40
|
"chalk": "^5.3.0",
|
|
41
41
|
"conf": "^13.0.1",
|
|
42
42
|
"execa": "^9.5.1",
|
|
43
|
+
"handlebars": "^4.7.9",
|
|
43
44
|
"inquirer": "^12.1.0",
|
|
44
45
|
"ora": "^8.1.1"
|
|
45
46
|
},
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import type { Command } from '../types/index.js';
|
|
2
|
-
/**
|
|
3
|
-
* Stage 1 of change management for an integration branch (change-management-policy.md clause 2):
|
|
4
|
-
* the work items merged into `working/integration/<name>-main` were each approved there by their
|
|
5
|
-
* assignee; this command carries the integration branch into the release branch through its own
|
|
6
|
-
* PR, assigned to its approver. The assignee approves by merging it - after the required CI/CD
|
|
7
|
-
* checks pass - with the same sequence and the same recorded admin override as `idea1 release`.
|
|
8
|
-
*
|
|
9
|
-
* Creating the PR and merging it are usually done by different people at different times, so
|
|
10
|
-
* the command reuses an open PR when one exists and the assignee runs it in `merge` mode.
|
|
11
|
-
*/
|
|
12
|
-
export declare const integrateCommand: Command;
|
|
13
|
-
//# sourceMappingURL=integrate.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"integrate.d.ts","sourceRoot":"","sources":["../../src/commands/integrate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AA6DjD;;;;;;;;;GASG;AACH,eAAO,MAAM,gBAAgB,EAAE,OAuF9B,CAAC"}
|
|
@@ -1,128 +0,0 @@
|
|
|
1
|
-
import { logger } from '../lib/logger.js';
|
|
2
|
-
import { promptInput, promptSelect } from '../lib/prompt.js';
|
|
3
|
-
import { resolveNamedList } from '../cli/named-lists.js';
|
|
4
|
-
import * as git from '../services/git.js';
|
|
5
|
-
import * as github from '../services/github.js';
|
|
6
|
-
import * as worktree from '../services/worktree.js';
|
|
7
|
-
import { INTEGRATION_KIND, PR_MODE_OPTION, createGatedPr, runPrMode, validateSourceBranch } from '../services/release-flow.js';
|
|
8
|
-
/**
|
|
9
|
-
* The integration branch to integrate: the one given, else the current branch when it is one,
|
|
10
|
-
* else a pick from the integration branches on origin.
|
|
11
|
-
*/
|
|
12
|
-
async function resolveIntegrationBranch(cliBranch) {
|
|
13
|
-
const integrationBranches = await worktree.listExistingIntegrationBranches();
|
|
14
|
-
if (cliBranch) {
|
|
15
|
-
if (!integrationBranches.includes(cliBranch)) {
|
|
16
|
-
throw new Error(`'${cliBranch}' is not an integration branch on origin.` +
|
|
17
|
-
(integrationBranches.length > 0 ? `\nIntegration branches: ${integrationBranches.join(', ')}` : ''));
|
|
18
|
-
}
|
|
19
|
-
return cliBranch;
|
|
20
|
-
}
|
|
21
|
-
const currentBranch = await git.getCurrentBranch();
|
|
22
|
-
if (integrationBranches.includes(currentBranch)) {
|
|
23
|
-
return currentBranch;
|
|
24
|
-
}
|
|
25
|
-
if (integrationBranches.length === 0) {
|
|
26
|
-
throw new Error('No integration branches exist on origin.');
|
|
27
|
-
}
|
|
28
|
-
return promptSelect('Which integration branch?', integrationBranches.map(branch => ({ label: branch, value: branch })));
|
|
29
|
-
}
|
|
30
|
-
async function promptAssignee() {
|
|
31
|
-
return promptSelect('Who approves this integration by merging its PR? (the approver of record)', await resolveNamedList('github-members'));
|
|
32
|
-
}
|
|
33
|
-
async function promptPrTitle(integrationBranch) {
|
|
34
|
-
const integrationName = await worktree.extractIntegrationName(integrationBranch);
|
|
35
|
-
const defaultTitle = `Integration ${integrationName} ${new Date().toISOString().split('T')[0]}`;
|
|
36
|
-
return promptInput('Enter PR title:', { default: defaultTitle });
|
|
37
|
-
}
|
|
38
|
-
/**
|
|
39
|
-
* Stage 1 of change management for an integration branch (change-management-policy.md clause 2):
|
|
40
|
-
* the work items merged into `working/integration/<name>-main` were each approved there by their
|
|
41
|
-
* assignee; this command carries the integration branch into the release branch through its own
|
|
42
|
-
* PR, assigned to its approver. The assignee approves by merging it - after the required CI/CD
|
|
43
|
-
* checks pass - with the same sequence and the same recorded admin override as `idea1 release`.
|
|
44
|
-
*
|
|
45
|
-
* Creating the PR and merging it are usually done by different people at different times, so
|
|
46
|
-
* the command reuses an open PR when one exists and the assignee runs it in `merge` mode.
|
|
47
|
-
*/
|
|
48
|
-
export const integrateCommand = {
|
|
49
|
-
name: 'integrate',
|
|
50
|
-
aliases: ['int'],
|
|
51
|
-
description: 'Open the PR from an integration branch into the release branch, assigned to its approver, and (as the assignee) merge it once the checks pass',
|
|
52
|
-
options: [
|
|
53
|
-
{
|
|
54
|
-
longName: 'branch',
|
|
55
|
-
shortName: 'b',
|
|
56
|
-
description: 'Integration branch to integrate (default: the current branch, or a pick from origin)',
|
|
57
|
-
defaultValue: '',
|
|
58
|
-
promptWhenDefaultExists: false
|
|
59
|
-
},
|
|
60
|
-
{
|
|
61
|
-
longName: 'target',
|
|
62
|
-
shortName: 't',
|
|
63
|
-
description: 'Branch to integrate into (default: baseBranch)',
|
|
64
|
-
defaultValue: '',
|
|
65
|
-
promptWhenDefaultExists: false
|
|
66
|
-
},
|
|
67
|
-
{
|
|
68
|
-
longName: 'assignee',
|
|
69
|
-
shortName: 'a',
|
|
70
|
-
description: 'Who approves the integration by merging its PR - the approver of record (prompted when the PR is created)',
|
|
71
|
-
defaultValue: '',
|
|
72
|
-
promptWhenDefaultExists: false
|
|
73
|
-
},
|
|
74
|
-
PR_MODE_OPTION,
|
|
75
|
-
{
|
|
76
|
-
longName: 'title',
|
|
77
|
-
description: 'PR title',
|
|
78
|
-
defaultValue: '',
|
|
79
|
-
promptWhenDefaultExists: false
|
|
80
|
-
}
|
|
81
|
-
],
|
|
82
|
-
async execute(resolved) {
|
|
83
|
-
const branchArg = resolved['branch'] || undefined;
|
|
84
|
-
const targetArg = resolved['target'] || undefined;
|
|
85
|
-
const assigneeArg = resolved['assignee'] || undefined;
|
|
86
|
-
const prMode = resolved['pr-mode'];
|
|
87
|
-
const titleArg = resolved['title'] || undefined;
|
|
88
|
-
await github.ensureGitHubCli();
|
|
89
|
-
const integrationBranch = await resolveIntegrationBranch(branchArg);
|
|
90
|
-
const targetBranch = targetArg ?? await worktree.resolveBaseBranch();
|
|
91
|
-
logger.header(`Integration: ${integrationBranch} -> ${targetBranch}`);
|
|
92
|
-
logger.newline();
|
|
93
|
-
logger.info(`PR mode: ${prMode}`);
|
|
94
|
-
logger.newline();
|
|
95
|
-
const existingPr = await github.checkPrExists(integrationBranch, targetBranch);
|
|
96
|
-
let prUrl;
|
|
97
|
-
if (existingPr) {
|
|
98
|
-
logger.info(`Using the open PR #${existingPr.number}`);
|
|
99
|
-
prUrl = existingPr.url;
|
|
100
|
-
}
|
|
101
|
-
else {
|
|
102
|
-
await validateSourceBranch(integrationBranch);
|
|
103
|
-
const assignee = assigneeArg ?? await promptAssignee();
|
|
104
|
-
const prTitle = titleArg ?? await promptPrTitle(integrationBranch);
|
|
105
|
-
logger.info(`Using title: ${prTitle}`);
|
|
106
|
-
logger.newline();
|
|
107
|
-
prUrl = await createGatedPr({
|
|
108
|
-
sourceBranch: integrationBranch,
|
|
109
|
-
targetBranch,
|
|
110
|
-
title: prTitle,
|
|
111
|
-
assignee,
|
|
112
|
-
kind: INTEGRATION_KIND
|
|
113
|
-
});
|
|
114
|
-
}
|
|
115
|
-
logger.newline();
|
|
116
|
-
await runPrMode({
|
|
117
|
-
mode: prMode,
|
|
118
|
-
sourceBranch: integrationBranch,
|
|
119
|
-
targetBranch,
|
|
120
|
-
prUrl,
|
|
121
|
-
kind: INTEGRATION_KIND,
|
|
122
|
-
openActionsAfterMerge: false
|
|
123
|
-
});
|
|
124
|
-
logger.newline();
|
|
125
|
-
logger.hint(`PR: ${prUrl}`);
|
|
126
|
-
}
|
|
127
|
-
};
|
|
128
|
-
//# sourceMappingURL=integrate.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"integrate.js","sourceRoot":"","sources":["../../src/commands/integrate.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"workflow-states.d.ts","sourceRoot":"","sources":["../../src/lib/workflow-states.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,aAAa,EACnB,MAAM,gCAAgC,CAAC;AAExC,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,6BAA6B,EAAE,MAAM,gCAAgC,CAAC;AAChH,YAAY,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAEpE;;GAEG;AACH,eAAO,MAAM,oBAAoB,EAAE,SAAS,aAAa,EAAoB,CAAC;AAE9E;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,aAAa,GAAG,IAAI,CAiB3F;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI,GAAG,aAAa,GAAG,IAAI,CAStF;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI,EAAE,EAAE,EAAE,aAAa,GAAG,aAAa,EAAE,CASvG;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,aAAa,GAAG,OAAO,CAE1F"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"workflow-states.generated.d.ts","sourceRoot":"","sources":["../../src/lib/workflow-states.generated.ts"],"names":[],"mappings":"AAEA,+CAA+C;AAC/C,eAAO,MAAM,eAAe,gPAUlB,CAAC;AAEX,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,eAAe,CAAC,CAAC,MAAM,CAAC,CAAC;AAE7D,8CAA8C;AAC9C,eAAO,MAAM,cAAc;;;;;;;;;;CAUjB,CAAC;AAEX;;;GAGG;AACH,eAAO,MAAM,6BAA6B,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAGjF,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"workflow-states.generated.js","sourceRoot":"","sources":["../../src/lib/workflow-states.generated.ts"],"names":[],"mappings":"AAAA,mFAAmF;AAEnF,+CAA+C;AAC/C,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,wBAAwB;IACxB,yBAAyB;IACzB,6BAA6B;IAC7B,gCAAgC;IAChC,sBAAsB;IACtB,oBAAoB;IACpB,4BAA4B;IAC5B,qBAAqB;IACrB,UAAU;CACF,CAAC;AAIX,8CAA8C;AAC9C,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,mBAAmB,EAAE,wBAAwB;IAC7C,mBAAmB,EAAE,yBAAyB;IAC9C,wBAAwB,EAAE,6BAA6B;IACvD,2BAA2B,EAAE,gCAAgC;IAC7D,mBAAmB,EAAE,sBAAsB;IAC3C,iBAAiB,EAAE,oBAAoB;IACvC,uBAAuB,EAAE,4BAA4B;IACrD,iBAAiB,EAAE,qBAAqB;IACxC,QAAQ,EAAE,UAAU;CACZ,CAAC;AAEX;;;GAGG;AACH,MAAM,CAAC,MAAM,6BAA6B,GAA4C;IACpF,mBAAmB,EAAE,4BAA4B;IACjD,UAAU,EAAE,qBAAqB;CAClC,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"workflow-states.js","sourceRoot":"","sources":["../../src/lib/workflow-states.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,6BAA6B,EAE9B,MAAM,gCAAgC,CAAC;AAExC,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,6BAA6B,EAAE,MAAM,gCAAgC,CAAC;AAGhH;;GAEG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAA6B,eAAe,CAAC;AAE9E;;;;;GAKG;AACH,MAAM,UAAU,sBAAsB,CAAC,GAA8B;IACnE,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IAC3B,IAAI,oBAAoB,CAAC,QAAQ,CAAC,OAAwB,CAAC,EAAE,CAAC;QAC5D,OAAO,OAAwB,CAAC;IAClC,CAAC;IAED,MAAM,KAAK,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IACpC,MAAM,oBAAoB,GAAG,oBAAoB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,KAAK,CAAC,CAAC;IAC/F,IAAI,oBAAoB,EAAE,CAAC;QACzB,OAAO,oBAAoB,CAAC;IAC9B,CAAC;IAED,OAAO,6BAA6B,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC;AACtD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAAC,KAA2B;IAC9D,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACnB,OAAO,oBAAoB,CAAC,CAAC,CAAC,CAAC;IACjC,CAAC;IAED,MAAM,KAAK,GAAG,oBAAoB,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAClD,OAAO,KAAK,IAAI,CAAC,IAAI,KAAK,GAAG,oBAAoB,CAAC,MAAM,GAAG,CAAC;QAC1D,CAAC,CAAC,oBAAoB,CAAC,KAAK,GAAG,CAAC,CAAC;QACjC,CAAC,CAAC,IAAI,CAAC;AACX,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,wBAAwB,CAAC,IAA0B,EAAE,EAAiB;IACpF,MAAM,SAAS,GAAG,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,oBAAoB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1E,MAAM,OAAO,GAAG,oBAAoB,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAEjD,IAAI,OAAO,IAAI,SAAS,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,kCAAkC,IAAI,IAAI,QAAQ,SAAS,EAAE,6BAA6B,CAAC,CAAC;IAC9G,CAAC;IAED,OAAO,oBAAoB,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,EAAE,OAAO,GAAG,CAAC,CAAC,CAAC;AAChE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAAoB,EAAE,WAA0B;IAC/E,OAAO,oBAAoB,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,oBAAoB,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;AAC1F,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"branch-setup.d.ts","sourceRoot":"","sources":["../../src/services/branch-setup.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAMxE,eAAO,MAAM,gBAAgB;;;GAG5B,CAAC;AAaF,MAAM,WAAW,0BAA0B;IACzC,eAAe,EAAE,MAAM,CAAC;IACxB,qBAAqB,EAAE,MAAM,CAAC;IAC9B,KAAK,EAAE,OAAO,CAAC;CAChB;AAED;;;GAGG;AACH,eAAO,MAAM,qBAAqB,EAAE,aAAa,EAyBhD,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,eAAe,CAAC;IAC9B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,oBAAoB,EAAE,0BAA0B,GAAG,IAAI,CAAC;CACzD;AAED;;;GAGG;AACH,wBAAsB,4BAA4B,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAYnH;AAED;;;;GAIG;AACH,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA6BnE;AAED;;;GAGG;AACH,wBAAsB,0BAA0B,IAAI,OAAO,CAAC,0BAA0B,CAAC,CAoBtF"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"branch-setup.js","sourceRoot":"","sources":["../../src/services/branch-setup.ts"],"names":[],"mappings":"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"}
|