@idea1/cli 1.5.1 → 1.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (108) hide show
  1. package/README.md +124 -93
  2. package/dist/commands/approve-pr.d.ts.map +1 -1
  3. package/dist/commands/approve-pr.js +7 -163
  4. package/dist/commands/approve-pr.js.map +1 -1
  5. package/dist/commands/attach-project-item.d.ts.map +1 -1
  6. package/dist/commands/attach-project-item.js +38 -89
  7. package/dist/commands/attach-project-item.js.map +1 -1
  8. package/dist/commands/close-worktree.d.ts.map +1 -1
  9. package/dist/commands/close-worktree.js +3 -2
  10. package/dist/commands/close-worktree.js.map +1 -1
  11. package/dist/commands/help.d.ts.map +1 -1
  12. package/dist/commands/help.js +17 -14
  13. package/dist/commands/help.js.map +1 -1
  14. package/dist/commands/index.d.ts +3 -2
  15. package/dist/commands/index.d.ts.map +1 -1
  16. package/dist/commands/index.js +5 -3
  17. package/dist/commands/index.js.map +1 -1
  18. package/dist/commands/join-project-item.d.ts.map +1 -1
  19. package/dist/commands/join-project-item.js +38 -77
  20. package/dist/commands/join-project-item.js.map +1 -1
  21. package/dist/commands/next-workflow-step.d.ts.map +1 -1
  22. package/dist/commands/next-workflow-step.js +66 -51
  23. package/dist/commands/next-workflow-step.js.map +1 -1
  24. package/dist/commands/ready-for-approval.d.ts.map +1 -1
  25. package/dist/commands/ready-for-approval.js +7 -66
  26. package/dist/commands/ready-for-approval.js.map +1 -1
  27. package/dist/commands/start-agent-implementation.d.ts +3 -0
  28. package/dist/commands/start-agent-implementation.d.ts.map +1 -0
  29. package/dist/commands/start-agent-implementation.js +41 -0
  30. package/dist/commands/start-agent-implementation.js.map +1 -0
  31. package/dist/commands/start-dev-implementation.d.ts.map +1 -1
  32. package/dist/commands/start-dev-implementation.js +8 -54
  33. package/dist/commands/start-dev-implementation.js.map +1 -1
  34. package/dist/commands/start.d.ts +13 -0
  35. package/dist/commands/start.d.ts.map +1 -0
  36. package/dist/commands/start.js +81 -0
  37. package/dist/commands/start.js.map +1 -0
  38. package/dist/interactive.d.ts.map +1 -1
  39. package/dist/interactive.js +29 -9
  40. package/dist/interactive.js.map +1 -1
  41. package/dist/lib/claude-options.d.ts +33 -0
  42. package/dist/lib/claude-options.d.ts.map +1 -0
  43. package/dist/lib/claude-options.js +83 -0
  44. package/dist/lib/claude-options.js.map +1 -0
  45. package/dist/lib/settings.d.ts.map +1 -1
  46. package/dist/lib/settings.js +5 -5
  47. package/dist/lib/settings.js.map +1 -1
  48. package/dist/lib/workflow-states.d.ts +21 -3
  49. package/dist/lib/workflow-states.d.ts.map +1 -1
  50. package/dist/lib/workflow-states.generated.d.ts +21 -0
  51. package/dist/lib/workflow-states.generated.d.ts.map +1 -0
  52. package/dist/lib/workflow-states.generated.js +34 -0
  53. package/dist/lib/workflow-states.generated.js.map +1 -0
  54. package/dist/lib/workflow-states.js +47 -26
  55. package/dist/lib/workflow-states.js.map +1 -1
  56. package/dist/services/branch-setup.d.ts +42 -0
  57. package/dist/services/branch-setup.d.ts.map +1 -0
  58. package/dist/services/branch-setup.js +116 -0
  59. package/dist/services/branch-setup.js.map +1 -0
  60. package/dist/services/claude.d.ts +14 -4
  61. package/dist/services/claude.d.ts.map +1 -1
  62. package/dist/services/claude.js +39 -4
  63. package/dist/services/claude.js.map +1 -1
  64. package/dist/services/git.d.ts +66 -0
  65. package/dist/services/git.d.ts.map +1 -1
  66. package/dist/services/git.js +161 -6
  67. package/dist/services/git.js.map +1 -1
  68. package/dist/services/workflow-engine.d.ts +67 -0
  69. package/dist/services/workflow-engine.d.ts.map +1 -0
  70. package/dist/services/workflow-engine.js +371 -0
  71. package/dist/services/workflow-engine.js.map +1 -0
  72. package/dist/services/workflow-handlers/agent-implementation.d.ts +9 -0
  73. package/dist/services/workflow-handlers/agent-implementation.d.ts.map +1 -0
  74. package/dist/services/workflow-handlers/agent-implementation.js +37 -0
  75. package/dist/services/workflow-handlers/agent-implementation.js.map +1 -0
  76. package/dist/services/workflow-handlers/approve-pr.d.ts +8 -0
  77. package/dist/services/workflow-handlers/approve-pr.d.ts.map +1 -0
  78. package/dist/services/workflow-handlers/approve-pr.js +161 -0
  79. package/dist/services/workflow-handlers/approve-pr.js.map +1 -0
  80. package/dist/services/workflow-handlers/dev-implementation.d.ts +8 -0
  81. package/dist/services/workflow-handlers/dev-implementation.d.ts.map +1 -0
  82. package/dist/services/workflow-handlers/dev-implementation.js +34 -0
  83. package/dist/services/workflow-handlers/dev-implementation.js.map +1 -0
  84. package/dist/services/workflow-handlers/index.d.ts +18 -0
  85. package/dist/services/workflow-handlers/index.d.ts.map +1 -0
  86. package/dist/services/workflow-handlers/index.js +36 -0
  87. package/dist/services/workflow-handlers/index.js.map +1 -0
  88. package/dist/services/workflow-handlers/ready-for-approval.d.ts +8 -0
  89. package/dist/services/workflow-handlers/ready-for-approval.d.ts.map +1 -0
  90. package/dist/services/workflow-handlers/ready-for-approval.js +60 -0
  91. package/dist/services/workflow-handlers/ready-for-approval.js.map +1 -0
  92. package/dist/services/workflow.d.ts +1 -21
  93. package/dist/services/workflow.d.ts.map +1 -1
  94. package/dist/services/workflow.js +1 -67
  95. package/dist/services/workflow.js.map +1 -1
  96. package/dist/services/worktree.d.ts +29 -27
  97. package/dist/services/worktree.d.ts.map +1 -1
  98. package/dist/services/worktree.js +51 -77
  99. package/dist/services/worktree.js.map +1 -1
  100. package/dist/types/index.d.ts +41 -4
  101. package/dist/types/index.d.ts.map +1 -1
  102. package/dist/version.d.ts +1 -1
  103. package/dist/version.js +1 -1
  104. package/package.json +2 -2
  105. package/dist/commands/start-project-item.d.ts +0 -27
  106. package/dist/commands/start-project-item.d.ts.map +0 -1
  107. package/dist/commands/start-project-item.js +0 -325
  108. package/dist/commands/start-project-item.js.map +0 -1
@@ -0,0 +1,37 @@
1
+ import { WorkflowStates } from '../../lib/workflow-states.js';
2
+ import { isolationModeOption, resolveIsolationMode } from '../../lib/isolation.js';
3
+ import { claudeEntryPointOption, 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],
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 } = resolveClaudeSessionOptions(context.options);
28
+ await worktree.launchClaudeForBranch(workingPath, {
29
+ projectItemUrl: context.projectItemUrl,
30
+ permissionMode,
31
+ model,
32
+ effort,
33
+ claudeEntryPointMode
34
+ });
35
+ }
36
+ };
37
+ //# sourceMappingURL=agent-implementation.js.map
@@ -0,0 +1 @@
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,oBAAoB,EAAE,2BAA2B,EAAE,MAAM,6BAA6B,CAAC;AACxH,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,CAAC;IAErF,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,GAAG,2BAA2B,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAE7G,MAAM,QAAQ,CAAC,qBAAqB,CAAC,WAAW,EAAE;YAChD,cAAc,EAAE,OAAO,CAAC,cAAc;YACtC,cAAc;YACd,KAAK;YACL,MAAM;YACN,oBAAoB;SACrB,CAAC,CAAC;IACL,CAAC;CACF,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { WorkflowStateHandler } from '../../types/index.js';
2
+ /**
3
+ * Entering "Approved and Merged": approve the PR when the user is a requested
4
+ * reviewer, drop the branch's metadata file so it does not leak into the target
5
+ * branch, and merge. Afterwards the branch and any worktree are cleaned up.
6
+ */
7
+ export declare const approvePrHandler: WorkflowStateHandler;
8
+ //# sourceMappingURL=approve-pr.d.ts.map
@@ -0,0 +1 @@
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;AASjE;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,EAAE,oBA+F9B,CAAC"}
@@ -0,0 +1,161 @@
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 { removeCurrentWorktree, resolveBaseBranch } from '../worktree.js';
7
+ import { requireBranch } from '../workflow-engine.js';
8
+ /**
9
+ * Entering "Approved and Merged": approve the PR when the user is a requested
10
+ * reviewer, drop the branch's metadata file so it does not leak into the target
11
+ * branch, and merge. Afterwards the branch and any worktree are cleaned up.
12
+ */
13
+ export const approvePrHandler = {
14
+ state: WorkflowStates.ApprovedAndMerged,
15
+ options: [
16
+ {
17
+ longName: 'comment',
18
+ shortName: 'c',
19
+ description: 'Custom approval comment',
20
+ defaultValue: '',
21
+ promptWhenDefaultExists: false
22
+ }
23
+ ],
24
+ async prepare(context) {
25
+ const branchName = requireBranch(context);
26
+ const comment = context.options['comment'] || 'Approved via idea1 CLI workflow';
27
+ if (context.workingPath) {
28
+ await git.ensureBranchUpToDate();
29
+ }
30
+ const prInfo = await github.getPrInfo(branchName);
31
+ if (!prInfo) {
32
+ throw new Error('No PR found for this branch. Nothing to approve.');
33
+ }
34
+ logger.info(`PR #${prInfo.number} found`);
35
+ // Re-entering this state after the item was moved back: the merge already happened.
36
+ if (prInfo.state.toUpperCase() === 'MERGED') {
37
+ logger.dim(`PR #${prInfo.number} is already merged; skipping approval and merge.`);
38
+ context.branchRetired = true;
39
+ return;
40
+ }
41
+ await approveIfRequestedReviewer(branchName, comment);
42
+ // Remove the branch metadata file before merging so it does not leak into the target branch
43
+ if (context.workingPath) {
44
+ await git.removeBranchMetadataAndPush(branchName);
45
+ }
46
+ else {
47
+ await git.removeBranchMetadataDetached(branchName);
48
+ }
49
+ const confirmMerge = await promptConfirm(`Merge PR #${prInfo.number} (${branchName} -> ${context.baseBranch})?`, { default: true });
50
+ if (!confirmMerge) {
51
+ throw new Error('Merge cancelled by user');
52
+ }
53
+ await mergeWithProtectionFallback(branchName);
54
+ context.branchRetired = true;
55
+ },
56
+ async complete(context) {
57
+ const branchName = requireBranch(context);
58
+ await git.fetchLatest();
59
+ if (!context.workingPath) {
60
+ await github.deleteRemoteBranch(branchName);
61
+ printCompletion(context.baseBranch, context.projectItemUrl);
62
+ return;
63
+ }
64
+ const isWorktree = await git.isInsideWorktree();
65
+ const mainRepoRoot = await git.getMainRepoRoot();
66
+ // Inside a worktree the base branch cannot be checked out in place, so the
67
+ // worktree is removed regardless of removeWorktreeAtState.
68
+ if (isWorktree) {
69
+ const worktreePath = await removeCurrentWorktree(mainRepoRoot);
70
+ await deleteBranchQuietly(branchName);
71
+ printCompletion(context.baseBranch, context.projectItemUrl);
72
+ logger.hint(`Worktree removed: ${worktreePath}`);
73
+ logger.hint(`Change to a different folder (e.g. ${mainRepoRoot}) to continue.`);
74
+ return;
75
+ }
76
+ // Switch to the base branch (it may be checked out in another worktree)
77
+ const baseWorktreePath = await git.getWorktreePathForBranch(context.baseBranch);
78
+ if (baseWorktreePath) {
79
+ logger.step(`Base branch ${context.baseBranch} is in a worktree at ${baseWorktreePath}, pulling there...`);
80
+ await git.updateBranchToLatest(context.baseBranch);
81
+ const settingsBaseBranch = await resolveBaseBranch();
82
+ await git.checkoutAndPullBranch(settingsBaseBranch);
83
+ }
84
+ else {
85
+ await git.checkoutAndPullBranch(context.baseBranch);
86
+ }
87
+ await deleteBranchQuietly(branchName);
88
+ printCompletion(context.baseBranch, context.projectItemUrl);
89
+ if (baseWorktreePath) {
90
+ logger.hint(`Base branch is in worktree at: ${baseWorktreePath}`);
91
+ }
92
+ }
93
+ };
94
+ async function approveIfRequestedReviewer(branchName, comment) {
95
+ const approvalStatus = await github.getUserApprovalStatus(branchName);
96
+ if (!approvalStatus) {
97
+ logger.dim('Could not determine approval status, skipping approval');
98
+ return;
99
+ }
100
+ if (approvalStatus.hasAlreadyApproved) {
101
+ logger.dim('You have already approved this PR');
102
+ return;
103
+ }
104
+ if (!approvalStatus.isRequestedReviewer) {
105
+ logger.dim('You are not a requested reviewer on this PR');
106
+ return;
107
+ }
108
+ const approved = await github.approvePr(branchName, comment);
109
+ if (!approved) {
110
+ logger.warning('Failed to approve PR, continuing with merge...');
111
+ }
112
+ }
113
+ /**
114
+ * Merge the PR; when branch protections block it, offer an admin override.
115
+ * `gh pr merge` emits a variety of messages depending on the rule that blocked
116
+ * the merge, and suggests `--admin` when admin privileges can resolve it.
117
+ */
118
+ async function mergeWithProtectionFallback(branchName) {
119
+ const mergeResult = await github.mergePr(branchName);
120
+ if (mergeResult.success) {
121
+ return;
122
+ }
123
+ const errorText = mergeResult.error?.toLowerCase() ?? '';
124
+ const isBranchProtectionError = errorText.includes('branch protection') ||
125
+ errorText.includes('required status check') ||
126
+ errorText.includes('required review') ||
127
+ errorText.includes('pull request review is required') ||
128
+ errorText.includes('base branch policy') ||
129
+ errorText.includes('policy prohibits the merge') ||
130
+ errorText.includes('--admin');
131
+ if (!isBranchProtectionError) {
132
+ throw new Error(`Failed to merge PR: ${mergeResult.error}`);
133
+ }
134
+ logger.warning('Merge failed due to branch protections');
135
+ logger.dim(mergeResult.error ?? '');
136
+ const override = await promptConfirm('Would you like to override branch protections with admin privileges?', { default: false });
137
+ if (!override) {
138
+ throw new Error('Merge cancelled by user');
139
+ }
140
+ const adminMergeResult = await github.mergePrWithAdminOverride(branchName);
141
+ if (!adminMergeResult.success) {
142
+ throw new Error(`Failed to merge PR with admin override: ${adminMergeResult.error}`);
143
+ }
144
+ }
145
+ async function deleteBranchQuietly(branchName) {
146
+ try {
147
+ await git.deleteBranch(branchName, true);
148
+ }
149
+ catch {
150
+ // The remote branch may already have been deleted automatically after the merge
151
+ logger.dim(`Note: Branch ${branchName} may have been automatically deleted after merge`);
152
+ }
153
+ }
154
+ function printCompletion(baseBranch, projectItemUrl) {
155
+ logger.newline();
156
+ logger.success('Workflow complete!');
157
+ logger.newline();
158
+ logger.hint(`PR merged into ${baseBranch}`);
159
+ logger.hint(`Project item: ${projectItemUrl}`);
160
+ }
161
+ //# sourceMappingURL=approve-pr.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"approve-pr.js","sourceRoot":"","sources":["../../../src/services/workflow-handlers/approve-pr.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { WorkflowStateHandler } from '../../types/index.js';
2
+ /**
3
+ * Entering "Dev Implementation": the agent's work is committed and pushed and a
4
+ * PR exists, so a developer can test, clean up and finish the work. Afterwards
5
+ * the worktree is removed when `removeWorktreeAtState` says so.
6
+ */
7
+ export declare const devImplementationHandler: WorkflowStateHandler;
8
+ //# sourceMappingURL=dev-implementation.d.ts.map
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,34 @@
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
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,18 @@
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/services/workflow-handlers/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAM/F;;;GAGG;AACH,eAAO,MAAM,iBAAiB,EAAE,WAAW,CAAC,aAAa,EAAE,oBAAoB,CAG9E,CAAC;AAEF;;GAEG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,aAAa,GAAG,oBAAoB,CAMrE;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,IAAI,aAAa,EAAE,CAQxD"}
@@ -0,0 +1,36 @@
1
+ import { agentImplementationHandler } from './agent-implementation.js';
2
+ import { devImplementationHandler } from './dev-implementation.js';
3
+ import { readyForApprovalHandler } from './ready-for-approval.js';
4
+ import { approvePrHandler } from './approve-pr.js';
5
+ /**
6
+ * Side effects attached to entering a workflow state. States without an entry
7
+ * are status-only: entering them records the state and nothing else.
8
+ */
9
+ export const HANDLERS_BY_STATE = new Map([agentImplementationHandler, devImplementationHandler, readyForApprovalHandler, approvePrHandler]
10
+ .map(handler => [handler.state, handler]));
11
+ /**
12
+ * The handler for a state, for commands dedicated to one transition.
13
+ */
14
+ export function getHandler(state) {
15
+ const handler = HANDLERS_BY_STATE.get(state);
16
+ if (!handler) {
17
+ throw new Error(`No workflow handler is registered for "${state}"`);
18
+ }
19
+ return handler;
20
+ }
21
+ /**
22
+ * Every handler option, for commands that can reach any state (e.g. `next`).
23
+ * The options are declared so they parse on the command line, but marked
24
+ * inapplicable so the resolver never prompts for them up front — the engine
25
+ * prompts for the ones the actual transition needs.
26
+ */
27
+ export function deferredHandlerOptions() {
28
+ const options = [];
29
+ for (const handler of HANDLERS_BY_STATE.values()) {
30
+ for (const option of handler.options ?? []) {
31
+ options.push({ ...option, dependsOn: () => false });
32
+ }
33
+ }
34
+ return options;
35
+ }
36
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/services/workflow-handlers/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,0BAA0B,EAAE,MAAM,2BAA2B,CAAC;AACvE,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAEnD;;;GAGG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAqD,IAAI,GAAG,CACxF,CAAC,0BAA0B,EAAE,wBAAwB,EAAE,uBAAuB,EAAE,gBAAgB,CAAC;KAC9F,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAC5C,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,KAAoB;IAC7C,MAAM,OAAO,GAAG,iBAAiB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAC7C,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,0CAA0C,KAAK,GAAG,CAAC,CAAC;IACtE,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,sBAAsB;IACpC,MAAM,OAAO,GAAoB,EAAE,CAAC;IACpC,KAAK,MAAM,OAAO,IAAI,iBAAiB,CAAC,MAAM,EAAE,EAAE,CAAC;QACjD,KAAK,MAAM,MAAM,IAAI,OAAO,CAAC,OAAO,IAAI,EAAE,EAAE,CAAC;YAC3C,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC;QACtD,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { WorkflowStateHandler } from '../../types/index.js';
2
+ /**
3
+ * Entering "Needs Approval for Release": the PR is complete and gets its
4
+ * reviewers and assignee. Afterwards the worktree is removed when
5
+ * `removeWorktreeAtState` says so (this state is the default).
6
+ */
7
+ export declare const readyForApprovalHandler: WorkflowStateHandler;
8
+ //# sourceMappingURL=ready-for-approval.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ready-for-approval.d.ts","sourceRoot":"","sources":["../../../src/services/workflow-handlers/ready-for-approval.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAQjE;;;;GAIG;AACH,eAAO,MAAM,uBAAuB,EAAE,oBAsDrC,CAAC"}
@@ -0,0 +1,60 @@
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 } from '../workflow-engine.js';
7
+ /**
8
+ * Entering "Needs Approval for Release": the PR is complete and gets its
9
+ * reviewers and assignee. Afterwards the worktree is removed when
10
+ * `removeWorktreeAtState` says so (this state is the default).
11
+ */
12
+ export const readyForApprovalHandler = {
13
+ state: WorkflowStates.NeedsApprovalForRelease,
14
+ options: [
15
+ {
16
+ longName: 'assignee',
17
+ shortName: 'a',
18
+ description: 'Who to assign the PR to',
19
+ choices: 'github-members',
20
+ allowNone: true
21
+ },
22
+ {
23
+ longName: 'reviewers',
24
+ shortName: 'r',
25
+ description: 'Who to request a review from (select any number)',
26
+ choices: 'github-members',
27
+ multiSelect: true
28
+ }
29
+ ],
30
+ async prepare(context) {
31
+ const branchName = requireBranch(context);
32
+ const assignee = context.options['assignee'] ?? '';
33
+ const reviewers = (context.options['reviewers'] ?? '')
34
+ .split(',')
35
+ .map(name => name.trim())
36
+ .filter(name => name.length > 0);
37
+ if (context.workingPath) {
38
+ await git.ensureBranchUpToDate();
39
+ }
40
+ const prInfo = await github.checkPrExists(branchName, context.baseBranch);
41
+ if (!prInfo) {
42
+ throw new Error('No PR exists for this branch. Move the item to Dev Implementation first (idea1 next), which creates the PR.');
43
+ }
44
+ logger.info(`PR #${prInfo.number} found`);
45
+ await github.assignReviewers(branchName, reviewers);
46
+ await github.assignAssignee(branchName, assignee);
47
+ if (reviewers.length === 0 && !assignee) {
48
+ logger.dim('No reviewers requested and no assignee set.');
49
+ }
50
+ logger.hint(`PR: ${prInfo.url}`);
51
+ },
52
+ async complete(context) {
53
+ const branchName = requireBranch(context);
54
+ await removeWorktreeForWorkflowState(WorkflowStates.NeedsApprovalForRelease, branchName, context.projectItemUrl, { checkoutBranchInMainRepo: false });
55
+ logger.newline();
56
+ logger.success('PR is ready for approval');
57
+ logger.hint('When approved, run: idea1 approve-pr');
58
+ }
59
+ };
60
+ //# sourceMappingURL=ready-for-approval.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ready-for-approval.js","sourceRoot":"","sources":["../../../src/services/workflow-handlers/ready-for-approval.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,MAAM,uBAAuB,CAAC;AAEtD;;;;GAIG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAyB;IAC3D,KAAK,EAAE,cAAc,CAAC,uBAAuB;IAC7C,OAAO,EAAE;QACP;YACE,QAAQ,EAAE,UAAU;YACpB,SAAS,EAAE,GAAG;YACd,WAAW,EAAE,yBAAyB;YACtC,OAAO,EAAE,gBAAgB;YACzB,SAAS,EAAE,IAAI;SAChB;QACD;YACE,QAAQ,EAAE,WAAW;YACrB,SAAS,EAAE,GAAG;YACd,WAAW,EAAE,kDAAkD;YAC/D,OAAO,EAAE,gBAAgB;YACzB,WAAW,EAAE,IAAI;SAClB;KACF;IAED,KAAK,CAAC,OAAO,CAAC,OAAO;QACnB,MAAM,UAAU,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;QAC1C,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;QACnD,MAAM,SAAS,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;aACnD,KAAK,CAAC,GAAG,CAAC;aACV,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;aACxB,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAEnC,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;YACxB,MAAM,GAAG,CAAC,oBAAoB,EAAE,CAAC;QACnC,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,UAAU,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;QAC1E,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,6GAA6G,CAAC,CAAC;QACjI,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,OAAO,MAAM,CAAC,MAAM,QAAQ,CAAC,CAAC;QAE1C,MAAM,MAAM,CAAC,eAAe,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;QACpD,MAAM,MAAM,CAAC,cAAc,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;QAElD,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACxC,MAAM,CAAC,GAAG,CAAC,6CAA6C,CAAC,CAAC;QAC5D,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,OAAO,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC;IACnC,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,OAAO;QACpB,MAAM,UAAU,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;QAC1C,MAAM,8BAA8B,CAAC,cAAc,CAAC,uBAAuB,EAAE,UAAU,EAAE,OAAO,CAAC,cAAc,EAAE,EAAE,wBAAwB,EAAE,KAAK,EAAE,CAAC,CAAC;QAEtJ,MAAM,CAAC,OAAO,EAAE,CAAC;QACjB,MAAM,CAAC,OAAO,CAAC,0BAA0B,CAAC,CAAC;QAC3C,MAAM,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC;IACtD,CAAC;CACF,CAAC"}
@@ -1,24 +1,4 @@
1
- import type { WorkflowState, WorkflowTransition, PrInfo } from '../types/index.js';
2
- /**
3
- * Whether a workflow state is the target state or a later one in the sequence
4
- */
5
- export declare function isStateAtOrAfter(state: WorkflowState, targetState: WorkflowState): boolean;
6
- /**
7
- * Validate if a transition is valid from the current workflow state
8
- */
9
- export declare function validateTransition(transition: WorkflowTransition): Promise<{
10
- valid: boolean;
11
- currentState: WorkflowState | null;
12
- error?: string;
13
- }>;
14
- /**
15
- * Get the next available transition from the current workflow state
16
- */
17
- export declare function getNextTransition(): Promise<WorkflowTransition | null>;
18
- /**
19
- * Ensure all workflow preconditions are met before proceeding
20
- */
21
- export declare function ensureWorkflowPreconditions(): Promise<void>;
1
+ import type { WorkflowState, PrInfo } from '../types/index.js';
22
2
  /**
23
3
  * Get comprehensive workflow status for the current branch
24
4
  */
@@ -1 +1 @@
1
- {"version":3,"file":"workflow.d.ts","sourceRoot":"","sources":["../../src/services/workflow.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAqBnF;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,aAAa,GAAG,OAAO,CAE1F;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,UAAU,EAAE,kBAAkB,GAC7B,OAAO,CAAC;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,YAAY,EAAE,aAAa,GAAG,IAAI,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CA0BjF;AAED;;GAEG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAU5E;AAED;;GAEG;AACH,wBAAsB,2BAA2B,IAAI,OAAO,CAAC,IAAI,CAAC,CAUjE;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,OAAO,CAAC,EAAE;IAAE,aAAa,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC;IACtF,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,aAAa,EAAE,aAAa,GAAG,IAAI,CAAC;IACpC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB,CAAC,CAgCD"}
1
+ {"version":3,"file":"workflow.d.ts","sourceRoot":"","sources":["../../src/services/workflow.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAK/D;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,OAAO,CAAC,EAAE;IAAE,aAAa,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC;IACtF,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,aAAa,EAAE,aAAa,GAAG,IAAI,CAAC;IACpC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB,CAAC,CAgCD"}
@@ -1,72 +1,6 @@
1
1
  import * as git from './git.js';
2
2
  import * as github from './github.js';
3
- import { WORKFLOW_STATE_ORDER, normalizeWorkflowState } from '../lib/workflow-states.js';
4
- /**
5
- * Valid workflow state transitions
6
- */
7
- const VALID_TRANSITIONS = {
8
- 'Build Spec in Progress': [],
9
- 'Refinement - Build Spec': [],
10
- 'Refinement - Implementation': [],
11
- 'Ready for Agent Implementation': [],
12
- 'Agent Implementation': ['start-dev-implementation'],
13
- 'Dev Implementation': ['ready-for-approval'],
14
- 'Needs Approval for Release': ['approve-pr'],
15
- 'Approved and Merged': [],
16
- 'Released': []
17
- };
18
- /**
19
- * Whether a workflow state is the target state or a later one in the sequence
20
- */
21
- export function isStateAtOrAfter(state, targetState) {
22
- return WORKFLOW_STATE_ORDER.indexOf(state) >= WORKFLOW_STATE_ORDER.indexOf(targetState);
23
- }
24
- /**
25
- * Validate if a transition is valid from the current workflow state
26
- */
27
- export async function validateTransition(transition) {
28
- const currentState = normalizeWorkflowState(await git.getWorkflowState());
29
- if (!currentState) {
30
- return {
31
- valid: false,
32
- currentState: null,
33
- error: 'No workflow state found. This branch may not be under workflow management.'
34
- };
35
- }
36
- const validTransitions = VALID_TRANSITIONS[currentState];
37
- if (!validTransitions || !validTransitions.includes(transition)) {
38
- const availableTransitions = validTransitions && validTransitions.length > 0
39
- ? `Available transitions: ${validTransitions.join(', ')}`
40
- : 'No transitions available from this state.';
41
- return {
42
- valid: false,
43
- currentState,
44
- error: `Cannot perform '${transition}' from state '${currentState}'. ${availableTransitions}`
45
- };
46
- }
47
- return { valid: true, currentState };
48
- }
49
- /**
50
- * Get the next available transition from the current workflow state
51
- */
52
- export async function getNextTransition() {
53
- const currentState = normalizeWorkflowState(await git.getWorkflowState());
54
- if (!currentState) {
55
- return null;
56
- }
57
- const validTransitions = VALID_TRANSITIONS[currentState];
58
- return validTransitions && validTransitions.length > 0 ? validTransitions[0] : null;
59
- }
60
- /**
61
- * Ensure all workflow preconditions are met before proceeding
62
- */
63
- export async function ensureWorkflowPreconditions() {
64
- const projectItemUrl = await git.getProjectItemUrl();
65
- if (!projectItemUrl) {
66
- throw new Error('This branch is not under workflow management. Start with: idea1 start-project-item <url>');
67
- }
68
- await git.ensureBranchUpToDate();
69
- }
3
+ import { normalizeWorkflowState } from '../lib/workflow-states.js';
70
4
  /**
71
5
  * Get comprehensive workflow status for the current branch
72
6
  */
@@ -1 +1 @@
1
- {"version":3,"file":"workflow.js","sourceRoot":"","sources":["../../src/services/workflow.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"workflow.js","sourceRoot":"","sources":["../../src/services/workflow.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,GAAG,MAAM,UAAU,CAAC;AAChC,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AACtC,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AAEnE;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,OAAqC;IAO3E,MAAM,CAAC,YAAY,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,mBAAmB,CAAC,GAC/E,MAAM,OAAO,CAAC,UAAU,CAAC;QACvB,GAAG,CAAC,gBAAgB,EAAE;QACtB,GAAG,CAAC,aAAa,EAAE;QACnB,GAAG,CAAC,iBAAiB,EAAE;QACvB,GAAG,CAAC,gBAAgB,EAAE;KACvB,CAAC,CAAC;IAEL,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;IAC7E,MAAM,UAAU,GAAG,gBAAgB,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;IAC3F,MAAM,cAAc,GAAG,oBAAoB,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;IACvG,MAAM,aAAa,GAAG,mBAAmB,CAAC,MAAM,KAAK,WAAW;QAC9D,CAAC,CAAC,sBAAsB,CAAC,mBAAmB,CAAC,KAAK,CAAC;QACnD,CAAC,CAAC,IAAI,CAAC;IAET,IAAI,MAAM,GAAkB,IAAI,CAAC;IACjC,IAAI,OAAO,EAAE,aAAa,KAAK,KAAK,IAAI,MAAM,EAAE,CAAC;QAC/C,IAAI,CAAC;YACH,MAAM,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAC1C,CAAC;QAAC,MAAM,CAAC;YACP,oCAAoC;QACtC,CAAC;IACH,CAAC;IAED,OAAO;QACL,MAAM;QACN,UAAU;QACV,cAAc;QACd,aAAa;QACb,MAAM;KACP,CAAC;AACJ,CAAC"}