@idea1/cli 1.8.2 → 1.9.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.
Files changed (147) hide show
  1. package/README.md +205 -69
  2. package/dist/cli/resolver.d.ts +1 -0
  3. package/dist/cli/resolver.d.ts.map +1 -1
  4. package/dist/cli/resolver.js +5 -0
  5. package/dist/cli/resolver.js.map +1 -1
  6. package/dist/cli.d.ts.map +1 -1
  7. package/dist/cli.js +2 -1
  8. package/dist/cli.js.map +1 -1
  9. package/dist/commands/approve-pr.d.ts.map +1 -1
  10. package/dist/commands/approve-pr.js +24 -41
  11. package/dist/commands/approve-pr.js.map +1 -1
  12. package/dist/commands/attach-project-item.d.ts.map +1 -1
  13. package/dist/commands/attach-project-item.js +27 -7
  14. package/dist/commands/attach-project-item.js.map +1 -1
  15. package/dist/commands/close-worktree.d.ts.map +1 -1
  16. package/dist/commands/close-worktree.js +4 -3
  17. package/dist/commands/close-worktree.js.map +1 -1
  18. package/dist/commands/help.d.ts.map +1 -1
  19. package/dist/commands/help.js +17 -11
  20. package/dist/commands/help.js.map +1 -1
  21. package/dist/commands/index.d.ts +2 -1
  22. package/dist/commands/index.d.ts.map +1 -1
  23. package/dist/commands/index.js +3 -1
  24. package/dist/commands/index.js.map +1 -1
  25. package/dist/commands/integrate.d.ts +13 -0
  26. package/dist/commands/integrate.d.ts.map +1 -0
  27. package/dist/commands/integrate.js +128 -0
  28. package/dist/commands/integrate.js.map +1 -0
  29. package/dist/commands/join-project-item.d.ts.map +1 -1
  30. package/dist/commands/join-project-item.js +22 -48
  31. package/dist/commands/join-project-item.js.map +1 -1
  32. package/dist/commands/next-workflow-step.d.ts.map +1 -1
  33. package/dist/commands/next-workflow-step.js +20 -21
  34. package/dist/commands/next-workflow-step.js.map +1 -1
  35. package/dist/commands/ready-for-approval.d.ts.map +1 -1
  36. package/dist/commands/ready-for-approval.js +27 -19
  37. package/dist/commands/ready-for-approval.js.map +1 -1
  38. package/dist/commands/release.d.ts +6 -0
  39. package/dist/commands/release.d.ts.map +1 -1
  40. package/dist/commands/release.js +189 -25
  41. package/dist/commands/release.js.map +1 -1
  42. package/dist/commands/ship-local-changes.d.ts +8 -0
  43. package/dist/commands/ship-local-changes.d.ts.map +1 -0
  44. package/dist/commands/ship-local-changes.js +34 -0
  45. package/dist/commands/ship-local-changes.js.map +1 -0
  46. package/dist/commands/start-agent-implementation.js +2 -2
  47. package/dist/commands/start-agent-implementation.js.map +1 -1
  48. package/dist/commands/start-dev-implementation.d.ts.map +1 -1
  49. package/dist/commands/start-dev-implementation.js +8 -3
  50. package/dist/commands/start-dev-implementation.js.map +1 -1
  51. package/dist/commands/start-project-item.d.ts +27 -0
  52. package/dist/commands/start-project-item.d.ts.map +1 -0
  53. package/dist/commands/start-project-item.js +325 -0
  54. package/dist/commands/start-project-item.js.map +1 -0
  55. package/dist/commands/start.d.ts +8 -2
  56. package/dist/commands/start.d.ts.map +1 -1
  57. package/dist/commands/start.js +76 -35
  58. package/dist/commands/start.js.map +1 -1
  59. package/dist/index.js +0 -0
  60. package/dist/interactive.d.ts.map +1 -1
  61. package/dist/interactive.js +164 -0
  62. package/dist/interactive.js.map +1 -1
  63. package/dist/jobs/job.d.ts +81 -0
  64. package/dist/jobs/job.d.ts.map +1 -0
  65. package/dist/jobs/job.js +258 -0
  66. package/dist/jobs/job.js.map +1 -0
  67. package/dist/jobs/targets.d.ts +58 -0
  68. package/dist/jobs/targets.d.ts.map +1 -0
  69. package/dist/jobs/targets.js +215 -0
  70. package/dist/jobs/targets.js.map +1 -0
  71. package/dist/lib/claude-options.d.ts +3 -2
  72. package/dist/lib/claude-options.d.ts.map +1 -1
  73. package/dist/lib/claude-options.js +15 -4
  74. package/dist/lib/claude-options.js.map +1 -1
  75. package/dist/lib/logger.d.ts +10 -0
  76. package/dist/lib/logger.d.ts.map +1 -1
  77. package/dist/lib/logger.js +16 -0
  78. package/dist/lib/logger.js.map +1 -1
  79. package/dist/lib/prompt.d.ts +7 -0
  80. package/dist/lib/prompt.d.ts.map +1 -1
  81. package/dist/lib/prompt.js +29 -0
  82. package/dist/lib/prompt.js.map +1 -1
  83. package/dist/lib/settings.d.ts +13 -3
  84. package/dist/lib/settings.d.ts.map +1 -1
  85. package/dist/lib/settings.js +12 -3
  86. package/dist/lib/settings.js.map +1 -1
  87. package/dist/lib/shell.d.ts +2 -1
  88. package/dist/lib/shell.d.ts.map +1 -1
  89. package/dist/lib/shell.js +17 -1
  90. package/dist/lib/shell.js.map +1 -1
  91. package/dist/services/git.d.ts +41 -13
  92. package/dist/services/git.d.ts.map +1 -1
  93. package/dist/services/git.js +85 -46
  94. package/dist/services/git.js.map +1 -1
  95. package/dist/services/github.d.ts +28 -0
  96. package/dist/services/github.d.ts.map +1 -1
  97. package/dist/services/github.js +82 -3
  98. package/dist/services/github.js.map +1 -1
  99. package/dist/services/setup.d.ts +4 -2
  100. package/dist/services/setup.d.ts.map +1 -1
  101. package/dist/services/setup.js +61 -37
  102. package/dist/services/setup.js.map +1 -1
  103. package/dist/services/workflow.d.ts +17 -0
  104. package/dist/services/workflow.d.ts.map +1 -0
  105. package/dist/services/workflow.js +39 -0
  106. package/dist/services/workflow.js.map +1 -0
  107. package/dist/services/worktree.js +1 -1
  108. package/dist/services/worktree.js.map +1 -1
  109. package/dist/types/index.d.ts +25 -24
  110. package/dist/types/index.d.ts.map +1 -1
  111. package/dist/version.d.ts +2 -1
  112. package/dist/version.d.ts.map +1 -1
  113. package/dist/version.js +3 -2
  114. package/dist/version.js.map +1 -1
  115. package/dist/workflow/engine/approval-flow.d.ts +10 -2
  116. package/dist/workflow/engine/approval-flow.d.ts.map +1 -1
  117. package/dist/workflow/engine/approval-flow.js +58 -9
  118. package/dist/workflow/engine/approval-flow.js.map +1 -1
  119. package/dist/workflow/engine/handlers/agent-implementation.d.ts.map +1 -1
  120. package/dist/workflow/engine/handlers/agent-implementation.js +4 -11
  121. package/dist/workflow/engine/handlers/agent-implementation.js.map +1 -1
  122. package/dist/workflow/engine/handlers/approve-pr.d.ts.map +1 -1
  123. package/dist/workflow/engine/handlers/approve-pr.js +9 -3
  124. package/dist/workflow/engine/handlers/approve-pr.js.map +1 -1
  125. package/dist/workflow/engine/handlers/dev-implementation.d.ts +2 -2
  126. package/dist/workflow/engine/handlers/dev-implementation.d.ts.map +1 -1
  127. package/dist/workflow/engine/handlers/dev-implementation.js +13 -7
  128. package/dist/workflow/engine/handlers/dev-implementation.js.map +1 -1
  129. package/dist/workflow/engine/handlers/ready-for-approval.d.ts +5 -0
  130. package/dist/workflow/engine/handlers/ready-for-approval.d.ts.map +1 -1
  131. package/dist/workflow/engine/handlers/ready-for-approval.js +11 -7
  132. package/dist/workflow/engine/handlers/ready-for-approval.js.map +1 -1
  133. package/dist/workflow/engine/{release-flow.d.ts → release-engine.d.ts} +83 -6
  134. package/dist/workflow/engine/release-engine.d.ts.map +1 -0
  135. package/dist/workflow/engine/{release-flow.js → release-engine.js} +291 -19
  136. package/dist/workflow/engine/release-engine.js.map +1 -0
  137. package/dist/workflow/engine/ship-flow.d.ts +87 -0
  138. package/dist/workflow/engine/ship-flow.d.ts.map +1 -0
  139. package/dist/workflow/engine/ship-flow.js +221 -0
  140. package/dist/workflow/engine/ship-flow.js.map +1 -0
  141. package/dist/workflow/engine/workflow-engine.d.ts +85 -15
  142. package/dist/workflow/engine/workflow-engine.d.ts.map +1 -1
  143. package/dist/workflow/engine/workflow-engine.js +195 -66
  144. package/dist/workflow/engine/workflow-engine.js.map +1 -1
  145. package/package.json +3 -3
  146. package/dist/workflow/engine/release-flow.d.ts.map +0 -1
  147. package/dist/workflow/engine/release-flow.js.map +0 -1
package/README.md CHANGED
@@ -16,13 +16,16 @@ Run commands directly from the command line:
16
16
 
17
17
  ```bash
18
18
  # Put a project item under workflow management (branch recorded on idea1.ai, no code changes)
19
- idea1 start --url https://app.idea1.ai/project/items/590
19
+ idea1 start --target https://app.idea1.ai/project/items/590
20
+
21
+ # Ship the uncommitted changes of your working/release checkout: new item, its branch, PR, checks, merge
22
+ idea1 ship --title "Release prep" --project "Omega"
20
23
 
21
24
  # Advance the item to its next workflow state (runs that state's automation)
22
- idea1 next --url https://app.idea1.ai/project/items/590 # or just `idea1 next` on the item's branch
25
+ idea1 next --target https://app.idea1.ai/project/items/590 # or just `idea1 next` on the item's branch
23
26
 
24
27
  # Jump straight to Agent Implementation (worktree + Claude) — the "send for implementation" path
25
- idea1 start-agent-implementation --url https://app.idea1.ai/project/items/590 # alias: start-project-item
28
+ idea1 start-agent-implementation --target https://app.idea1.ai/project/items/590 # alias: start-project-item
26
29
 
27
30
  # Dedicated transitions (each is one `next` step)
28
31
  idea1 start-dev-implementation # or: idea1 dev
@@ -32,10 +35,15 @@ idea1 approve-pr # or: idea1 approve
32
35
  # The same two commands on a branch with no project item, e.g. an integration branch:
33
36
  # open its PR into working/release and name the approver, then (as the approver) merge it
34
37
  idea1 ready-for-approval --assignee octocat
35
- idea1 approve-pr --branch working/integration/<name>-main
38
+ idea1 approve-pr --target working/integration/<name>-main
39
+
40
+ # From working/release: approve several items, branches or PRs at once, each in its own unattended run, in parallel
41
+ idea1 approve-pr --target https://app.idea1.ai/project/items/590,working/agent/fix-config,https://github.com/org/repo/pull/912
36
42
 
37
- # Release the release branch to production (opens the release PR into main, assigned to you, and merges it once the checks pass)
43
+ # Release the release branch to production (bumps changed packages' versions, opens the release PR into main assigned to you, and merges it once the checks pass)
38
44
  idea1 release # or: idea1 r
45
+ idea1 release --approve # approve and merge the release PR that is already open
46
+ idea1 release --target <item url>,<branch> # approve these into working/release first, then release once all have merged
39
47
 
40
48
  # Show help
41
49
  idea1 --help
@@ -43,7 +51,40 @@ idea1 --help
43
51
 
44
52
  ### Interactive Mode
45
53
 
46
- Run `idea1` without arguments to enter interactive mode with a searchable command interface.
54
+ Run `idea1` without arguments to enter interactive mode with a searchable command interface. A command run on several targets runs there as a background job: the prompt comes back at once, a notice is printed when the job finishes, and `/jobs` lists the session's jobs and opens a live view of one (Esc returns to the prompt). Leaving with `/exit` while a job runs asks whether to stop it. Whatever a command does, the session stays in the directory it started in.
55
+
56
+ ## Targets and parallel runs
57
+
58
+ Every command that works on a project item or a branch names it with `--target`, which takes any of:
59
+
60
+ - a project item URL (`https://app.idea1.ai/project/items/590`)
61
+ - a branch name (`working/agent/fix-config`)
62
+ - a GitHub PR URL (`https://github.com/org/repo/pull/912`), which stands for its head branch
63
+
64
+ A branch, or a PR's branch, resolves to the project item it implements. A command that needs a project item (`next`, `start-dev-implementation`, `start`, `start-agent-implementation`, `attach-project-item`, `ship-local-changes`, `join-project-item` for an item) refuses a branch that is no item's. `ready-for-approval` and `approve-pr` also operate on a branch with no project item.
65
+
66
+ With no `--target`, a command works on the current branch when it can be the target: an item's branch, or for `ready-for-approval` and `approve-pr` any branch other than the base branch. Otherwise, as on `working/release`, the targets are the first thing it asks for. It shows a picker of the open PRs into the base branch and the branches your clone knows as project items' (worktrees included). Pick any number with space, and pick **Other** to type item URLs, branch names or PR URLs as well. `release` asks the same way; picking nothing releases the branch as it is.
67
+
68
+ **One target** runs exactly as the command always has, in your terminal. Its work happens in the branch's local checkout when it has one. A branch with no checkout is worked on through origin and GitHub, and is checked out only when a step needs its files: entering Agent Implementation creates it, per the isolation mode. Approving or readying an item's PR from `working/release` therefore checks nothing out at all, and the merge brings your `working/release` checkout up to date.
69
+
70
+ **Several targets** (comma-separated) run as a job, one unattended CLI process per target, in parallel:
71
+
72
+ - Before anything starts, every target is resolved. Anything that would stop one (an item with no live branch here, a branch that is no item's for a command that needs one, two targets on one branch) stops the whole command.
73
+ - Everything the runs will need is asked once, up front: the options of every workflow state the items will enter, then one confirmation of the set (`--yes` skips it).
74
+ - Runs work in worktrees, never in your checkout, and launch no Claude session.
75
+ - Each run fails fast on its own: a PR that conflicts with its base fails before its checks are waited for, and a failed check ends the wait. The other runs carry on.
76
+ - Every run's output is logged in your main clone under `.idea1/jobs/`, one folder per job. Git ignores the folder through `.idea1/.gitignore`. On every run, the CLI creates that file if it is missing and adds any entry it lacks; commit the change when it does. Logs older than 14 days, and beyond the 50 most recent jobs, are deleted as new jobs start.
77
+ - Outside interactive mode the job runs in the foreground: each run's steps are reported as they happen, then a summary. The exit code is non-zero when any run failed.
78
+
79
+ ```bash
80
+ idea1 approve-pr --target <item url>,<branch>,<PR url> --yes
81
+ idea1 ready-for-approval --target <item url>,<item url> --assignee octocat
82
+ idea1 next --to "Dev Implementation" --target <item url>,<item url>
83
+ ```
84
+
85
+ An unattended run asks nothing. A text question with a default (a PR title, say) takes the default. Every other question, such as a confirmation or a choice, fails the run at once with the question it needed answered.
86
+
87
+ Several CLIs can also run side by side in one clone, from separate terminals. Their git commands wait for each other's locks rather than failing.
47
88
 
48
89
  ## Commands
49
90
 
@@ -69,13 +110,13 @@ A transition is "enter state X". Entering a state runs that state's automation (
69
110
  | Entering | Automation |
70
111
  |----------|-----------|
71
112
  | Build Spec in Progress … Ready for Agent Implementation | none — status only |
72
- | **Agent Implementation** | ensures the branch is checked out locally (worktree or main repo), then **launches Claude** to implement the item. This is the only transition that starts code-writing automation |
73
- | **Dev Implementation** | commits and pushes the agent's work, creates the PR, removes the worktree if `removeWorktreeAtState` says so |
113
+ | **Agent Implementation** | ensures the branch is checked out locally (worktree or main repo) — the one step that creates a checkout when the branch has none — then **launches Claude** to implement the item. This is the only transition that starts code-writing automation |
114
+ | **Dev Implementation** | commits and pushes the agent's work from the branch's checkout (a branch with no checkout here has its work on origin), creates the PR, removes the worktree if `removeWorktreeAtState` says so |
74
115
  | **Needs Approval for Release** | requires the PR, sets its assignee (required — the approver of record) and any requested reviewers, removes a legacy workflow context file if the branch still carries one (its final commit), and removes the worktree if configured. From here on the branch stays as it is |
75
- | **Approved and Merged** | verifies you are the assignee, waits for the CI/CD suite, merges the PR as it stands — the merge is the approval — then deletes the branch and worktree |
116
+ | **Approved and Merged** | verifies you are the assignee, refuses a PR that conflicts with its base, waits for the CI/CD suite, merges the PR as it stands — the merge is the approval — then deletes the branch and worktree and fast-forwards your base branch checkout |
76
117
  | Released | none — normally set by GitHub automation when the work merges to `main` |
77
118
 
78
- `start` begins state management, `next` advances one state, and `start-agent-implementation` jumps to Agent Implementation — all three reduce to the same engine, so branches and items always end up consistent with the state they are in. The engine and its layers are described in `src/workflow/README.md`.
119
+ `start` begins state management, `next` advances one state, `start-agent-implementation` jumps to Agent Implementation, and `ship-local-changes` takes uncommitted base-branch work all the way to Approved and Merged — all three reduce to the same engine, so branches and items always end up consistent with the state they are in. The engine and its layers are described in `src/workflow/README.md`.
79
120
 
80
121
  ### Who approves what
81
122
 
@@ -85,7 +126,7 @@ A change reaches production through two merges, and **each merge is its approval
85
126
 
86
127
  **Any other branch into `working/release`** — a branch with no project item takes the same gate. `idea1 ready-for-approval` opens its PR (with the approval chain of what the branch carries as the body) and names its assignee; `idea1 approve-pr` merges it once the suite passes, with the same no-override rule, and then deletes the branch. Only the idea1.ai status writes are absent. Integration branches work this way: work items PR into `working/integration/<name>-main` and are approved there exactly as above, then the integration branch itself is carried into `working/release` with these two commands — its PR body lists every work-item PR and who approved it, and `approve-pr` refuses while any PR still targets the integration branch.
87
128
 
88
- **Into `main`** — `idea1 release` opens the release PR **assigned to whoever ran it**: the releaser is the approver, and their merge is the recorded approval. No review is required — every change in the release was already approved above, and the release PR body lists each contained PR with who approved it. What this stage gates is the build: the required CI/CD checks must pass first. In the default `create` mode the releaser merges the PR in GitHub once the checks are green; in `merge` mode the CLI waits for every check with `gh` and merges here. An emergency admin override past a red check needs an explicit confirmation and a stated reason, and is recorded as a comment on the PR before the merge.
129
+ **Into `main`** — `idea1 release` opens the release PR **assigned to whoever ran it**: the releaser is the approver, and their merge is the recorded approval. No review is required — every change in the release was already approved above, and the release PR body lists each contained PR with who approved it. What this stage gates is the build: the required CI/CD checks must pass first. In the default `create` mode the releaser merges the PR in GitHub once the checks are green; in `merge` mode (and with `idea1 release --approve`) the CLI turns on GitHub's auto-merge as the releaser, so GitHub merges once the checks pass and records the releaser as `merged_by`, or waits for the checks with `gh` and merges here where GitHub can't auto-merge. A release approved in the Idea1 web app is merged by the Idea1 GitHub App instead; the app first posts an approval comment naming the releaser, who is the PR's assignee, and that comment is the approval of record. An emergency admin override past a red check needs an explicit confirmation and a stated reason, and is recorded as a comment on the PR before the merge.
89
130
 
90
131
  This is the change-management control DataFabrIQ is audited on; see `infrastructure/soc2/policies/change-management-policy.md` clause 2.
91
132
 
@@ -94,35 +135,71 @@ This is the change-management control DataFabrIQ is audited on; see `infrastruct
94
135
  Put a project item under workflow management. An item yet to be started enters **Build Spec in Progress**; an item that already has a state keeps it. The branch is created on origin at the base branch's tip and recorded in the item's workflow context on idea1.ai; the working tree and the code stay as they are, and Claude stays closed. Idempotent: running it again for a managed item just reports the branch and state.
95
136
 
96
137
  ```bash
97
- idea1 start --url <url> [options]
98
- idea1 start # prompts for the URL (blank to create a new item)
99
- idea1 s --url <url>
138
+ idea1 start --target <url> [options]
139
+ idea1 start # prompts for the target (blank to create a new item)
140
+ idea1 s --target <url>
100
141
  ```
101
142
 
102
143
  **Options:**
103
- - `-u, --url <url>` - The Idea1.ai project item URL. Leave blank to create a new item (you'll be prompted for a `--title` and a `--project`).
104
- - `-t, --title <title>` - Title for the new project item (only when no URL is given).
105
- - `-P, --project <name>` - The Project to create the new item in, chosen from the team's live Projects (only when no URL is given; always asked, never defaulted).
144
+ - `--target <url | branch | PR url>` - The project item, or its branch or that branch's PR. Leave blank to create a new item (you'll be prompted for a `--title` and a `--project`). One target only.
145
+ - `-t, --title <title>` - Title for the new project item (only when no target is given).
146
+ - `-P, --project <name>` - The Project to create the new item in, chosen from the team's live Projects (only when no target is given; always asked, never defaulted).
106
147
  - `-p, --source-path <path>` - Path to source directory.
107
148
  - `-n, --branch-name <name>` - Branch name (auto-generated from the item description if not provided).
108
149
  - `-b, --base-branch <branch>` - Base branch / PR target (default: `working/release`).
109
- - `-w, --workflow-type <type>` - `independent` or `integration`; you also choose any stack branch and (for integration) the integration branch.
150
+ - `-w, --workflow-type <type>` - `independent` or `integration`; you also choose any stack branch and (for integration) the integration branch. Not asked when carrying local changes, which go onto an independent branch.
151
+ - `-c, --carry-local-changes` - Make the uncommitted changes of your base branch checkout the item's work. See [Carrying local changes](#carrying-local-changes).
152
+ - `--approve-and-merge` - Advance the item through every state up to **Approved and Merged** without prompting. See [Carrying local changes](#carrying-local-changes).
153
+ - `-M, --commit-message <message>` - Commit message for carried changes (default: the new item's title).
154
+ - `-iso, --isolation <mode>` - Where to work on the branch, when changes are carried or the item is approved and merged. See [Isolation mode](#isolation-mode).
155
+ - `-r, --reviewers <user1,user2>` - Reviewers to request on the PR with `--approve-and-merge` (never asked; optional).
156
+
157
+ ### Carrying local changes
158
+
159
+ Work sometimes starts before its project item does: you make changes in your `working/release` checkout, then want them to go through the workflow like any other work. `start --carry-local-changes` (or `attach-project-item --carry-local-changes`) makes them the item's work instead of committing them on the base branch:
160
+
161
+ 1. Before anything is created, it checks that the checkout is on the branch the item's branch is cut from (`--base-branch`, else `baseBranch`) and that this branch has no commits origin lacks — only uncommitted changes are carried.
162
+ 2. Every uncommitted change — staged or not, plus untracked files that are not ignored — is committed on top of the checkout's commit without touching the checkout, and that commit becomes the tip of the item's branch on origin. For an item with no branch, the branch is created at that commit and recorded as the item's; an item whose branch exists takes the changes only while that branch has no commits of its own and no local checkout. The base branch itself is never committed to or pushed.
163
+ 3. The branch is checked out per the isolation mode: with `main-repo`, the checkout that held the changes switches to the branch with its working tree untouched (it is the branch's tip, so the checkout is clean); with `worktree`, the branch gets a worktree and the carried changes are removed from the base branch checkout.
164
+
165
+ With `--approve-and-merge`, the item is then advanced through every workflow state up to **Approved and Merged** with nothing asked on the way: no Claude session is launched at Agent Implementation, the PR is created and assigned to **you** (the person who merges is the approver of record), the CLI waits for the required CI/CD checks — the same no-override gate as `approve-pr` — and merges, then brings your local base branch up to date with the merge. On a new item it needs changes to carry. A run that stops (failing checks, say) leaves the item at the last state it reached; fix the branch and run `idea1 approve-pr`, or run the command again with `--target`, to continue.
166
+
167
+ ### ship-local-changes
168
+
169
+ `start --carry-local-changes --approve-and-merge` as one unattended command: create a project item, cut its branch from `working/release`, commit and push your uncommitted changes there, advance it to Needs Approval for Release with a PR assigned to you, wait for the PR's checks and merge it into `working/release`. You end on `working/release`, clean, with your changes merged. The only questions are the ones a new item needs (its title and Project) when they are not supplied.
170
+
171
+ ```bash
172
+ idea1 ship-local-changes --title "Release prep" --project "Omega"
173
+ idea1 ship --title "Release prep" --project "Omega" --branch-name release-prep
174
+ idea1 ship --title "Release prep" --project "Omega" --isolation main-repo
175
+ idea1 ship --target <url> # an existing item whose branch has no commits yet
176
+ ```
177
+
178
+ **Options:**
179
+ - `--target <url | branch | PR url>` - An existing project item (default: create a new one).
180
+ - `-t, --title <title>`, `-P, --project <name>` - The new item's title and Project (asked when missing and no target is given).
181
+ - `-n, --branch-name <name>` - Branch name under the branch prefix (default: derived from the item).
182
+ - `-b, --base-branch <branch>` - The branch your checkout is on, which the item's branch is cut from and merges into (default: `baseBranch`).
183
+ - `-M, --commit-message <message>` - Commit message (default: the item's title).
184
+ - `-iso, --isolation <mode>` - `worktree` (default, never asked) works on the branch in a worktree while it is shipped and leaves your checkout on `working/release`; `main-repo` switches your checkout to the branch until the merge, then back.
185
+ - `-r, --reviewers <user1,user2>` - Reviewers to request on the PR (optional).
110
186
 
111
187
  ### next-workflow-step
112
188
 
113
- Advance a project item to its next workflow state and run that state's automation. On the item's branch no arguments are needed; from anywhere else pass the item URL — the CLI finds the branch on origin (moving into its local checkout when one exists) or, for an item without a branch yet, reads the current state from idea1.ai and creates the branch first.
189
+ Advance a project item to its next workflow state and run that state's automation. On the item's branch no arguments are needed; from anywhere else pass the item (its URL, branch or PR URL) as `--target` — the CLI finds the branch on origin (moving into its local checkout when one exists) or, for an item without a branch yet, reads the current state from idea1.ai and creates the branch first. Several targets advance in parallel (see [Targets and parallel runs](#targets-and-parallel-runs)), each to its own next state or all to `--to`.
114
190
 
115
191
  With `--to <state>` the item advances through every state up to that one in a single run — the same as running `next` once per state: each state's automation runs and the state is recorded on idea1.ai before the next state is entered. A run that stops part way leaves the item at the last state it entered, and running it again continues from there. The CLI only moves forward; an item already at or past the requested state is left as it is.
116
192
 
117
193
  ```bash
118
194
  idea1 next # on the item's branch
119
- idea1 next --url <url> # from anywhere in the repository
195
+ idea1 next --target <url> # from anywhere in the repository
120
196
  idea1 next --to "Dev Implementation" # several states at once
197
+ idea1 next --to "Needs Approval for Release" --target <url>,<url> --assignee octocat # several items in parallel
121
198
  idea1 n
122
199
  ```
123
200
 
124
201
  **Options:**
125
- - `-u, --url <url>` - Project item URL (required when not on the item's branch).
202
+ - `--target <url | branch | PR url>[,...]` - The project item(s) (default: the current branch, when it is an item's).
126
203
  - `--to <state>` - Workflow state to advance to (default: the next state).
127
204
  - `-p, --source-path <path>` - Path to source directory.
128
205
  - Any option of the state being entered (for example `--model`/`--effort` for Agent Implementation, `--assignee`/`--reviewers` for Needs Approval for Release). Options that were not supplied are prompted for when that state is reached.
@@ -140,10 +217,10 @@ The automation is idempotent, so re-running a transition after the item was move
140
217
  Start implementing a project item: put it under workflow management if needed, move it to **Agent Implementation** (through any intermediate states, which have no automation), set up the working environment and launch Claude Code with the implementation prompt — the repository's `prompts.agentImplementation` setting (see [Prompts](#prompts)), the built-in default, or a prompt you supply with `--entry-point-prompt`. This is the command behind "Send for Implementation" in the web client; `start-project-item` remains an alias so existing team command templates keep working.
141
218
 
142
219
  ```bash
143
- idea1 start-agent-implementation --url <url> [options]
144
- idea1 implement --url <url>
145
- idea1 start-project-item --url <url> # alias
146
- idea1 implement --url <url> --entry-point-prompt "Read the spec in docs/spec.md and implement step 3"
220
+ idea1 start-agent-implementation --target <url> [options]
221
+ idea1 implement --target <url>
222
+ idea1 start-project-item --target <url> # alias
223
+ idea1 implement --target <url> --entry-point-prompt "Read the spec in docs/spec.md and implement step 3"
147
224
  ```
148
225
 
149
226
  **Options:** all `start` options, plus the Agent Implementation options:
@@ -155,11 +232,11 @@ idea1 implement --url <url> --entry-point-prompt "Read the spec in docs/spec.md
155
232
  - `-udp, --use-default-prompt <yes|no>` - Whether to launch Claude with the repository's implementation prompt, or the built-in one when the repository sets none (default: `yes`). Answering `no` asks for the prompt to use instead.
156
233
  - `-epp, --entry-point-prompt <prompt>` - The prompt to launch Claude with, replacing the implementation prompt. Supplying it skips the "Use default prompt?" question. It is a Handlebars template like the repository's prompt, so it can use the same [variables](#prompts).
157
234
 
158
- An item already in Agent Implementation is not transitioned again: the working environment is set up (or reused) and Claude is launched.
235
+ An item already in Agent Implementation is not transitioned again: the working environment is set up (or reused) and Claude is launched. With `--claude-entry-point none` the session options (permission mode, model, effort, prompt) are not asked.
159
236
 
160
237
  ### Isolation mode
161
238
 
162
- `start-agent-implementation`, `next` (when entering Agent Implementation) and `join-project-item` all ask where you want to work on the branch. The prompt is always shown, with `worktree` preselected:
239
+ `start-agent-implementation`, `next` (when entering Agent Implementation), `join-project-item`, and `start`/`attach-project-item` when carrying local changes or approving and merging all ask where you want to work on the branch. The prompt is always shown, with `worktree` preselected (`ship-local-changes` uses `worktree` without asking):
163
240
 
164
241
  - `worktree` (default) - creates/uses a git worktree in a sibling directory (`<repo>-<branch>`), leaving the main repository on its own branch. Runs the `setup-worktree` hook.
165
242
  - `main-repo` - checks the branch out in the main repository, in place. Requires a clean working directory and fails if the branch is already checked out in a worktree. The `setup-worktree` hook is skipped, since the main repository is already set up.
@@ -171,16 +248,14 @@ Supply `-iso worktree` or `-iso main-repo` on the command line to skip the promp
171
248
  Join an **in-progress** project item by setting up a working environment on its existing branch — for picking up work started elsewhere (e.g. on another machine, by another developer, or from the web client). It does not change the workflow state and never launches a Claude implementation session.
172
249
 
173
250
  ```bash
174
- idea1 join-project-item --project-item-url <url>
175
- idea1 join-project-item --branch-name <branch>
176
- idea1 join-project-item --pull-request-url <pr url>
177
- idea1 j --branch-name <branch>
251
+ idea1 join-project-item --target <url>
252
+ idea1 join-project-item --target <branch>
253
+ idea1 join-project-item --target <pr url>
254
+ idea1 j --target <branch>
178
255
  ```
179
256
 
180
- **Options (exactly one of the first three must be supplied — they are mutually exclusive):**
181
- - `--project-item-url <url>` - The Idea1.ai project item URL; its branch is discovered automatically.
182
- - `-n, --branch-name <branch>` - The branch to join; its associated project item is discovered automatically.
183
- - `--pull-request-url <url>` - A GitHub PR URL; its head branch is joined.
257
+ **Options:**
258
+ - `--target <url | branch | PR url>` - **Required.** The project item (its branch is discovered automatically), the branch to join (its project item is discovered automatically), or a GitHub PR (its head branch is joined). One target only.
184
259
  - `-p, --source-path <path>` - Path to source directory.
185
260
  - `-iso, --isolation <mode>` - Where to work on the branch (default: `worktree`). See [Isolation mode](#isolation-mode).
186
261
 
@@ -196,62 +271,69 @@ If a project item URL is supplied but no branch exists for it yet, `join-project
196
271
 
197
272
  Attach the **current branch** to a project item, putting it under workflow management at the item's current state (or `Build Spec in Progress` when it has none). Use this when you already have a branch with work on it and want to bring it into the workflow. It does not create a branch or a worktree and never invokes Claude.
198
273
 
274
+ On the base branch, `--carry-local-changes` gives the item a branch of its own instead and carries your uncommitted changes onto it, exactly as `start --carry-local-changes` does (see [Carrying local changes](#carrying-local-changes)); `--branch-name`, `--commit-message` and `--isolation` then apply. With `--approve-and-merge`, the attached (or new) branch is advanced through every state up to Approved and Merged without prompting.
275
+
199
276
  ```bash
200
- idea1 attach-project-item --url <url>
201
- idea1 attach-project-item # prompts for the URL (blank to create a new item)
202
- idea1 a --url <url>
277
+ idea1 attach-project-item --target <url>
278
+ idea1 attach-project-item # prompts for the target (blank to create a new item)
279
+ idea1 a --target <url>
203
280
  ```
204
281
 
205
282
  **Options:**
206
- - `-u, --url <url>` - The Idea1.ai project item URL. Leave blank to create a new item (you'll be prompted for a `--title`).
207
- - `-t, --title <title>` - Title for the new project item (only when no URL is given).
283
+ - `--target <url | branch | PR url>` - The project item, or its branch or that branch's PR. Leave blank to create a new item (you'll be prompted for a `--title`).
284
+ - `-t, --title <title>` - Title for the new project item (only when no target is given).
208
285
  - `-p, --source-path <path>` - Path to source directory.
209
286
  - `-b, --base-branch <branch>` - Base branch / PR target for an independent feature (default: `working/release`).
210
287
  - `-w, --workflow-type <type>` - Development workflow type: `independent` or `integration`. You also choose any stack branch and (for integration) the integration branch.
288
+ - `-c, --carry-local-changes`, `--approve-and-merge`, `-n, --branch-name`, `-M, --commit-message`, `-iso, --isolation`, `-r, --reviewers` - As for `start`.
211
289
 
212
290
  **What it does:**
213
291
  1. Verifies the current branch is free to implement the item (a branch that already implements one is resumed with `join-project-item`).
214
- 2. Creates the project item if no URL was supplied.
292
+ 2. Creates the project item if no target was supplied.
215
293
  3. Records the branch in the item's workflow context on idea1.ai (base branch, dev workflow type, stack/integration branch) in a single call, which puts an item outside workflow management under it at `Build Spec in Progress` and leaves an item that already has a state at that state. The branch is pushed to origin beforehand and stays as it is.
216
294
  4. If the item is already at `Dev Implementation` or later, makes sure a PR into the base branch exists.
217
295
 
218
296
  ### start-dev-implementation
219
297
 
220
- Advance the item to **Dev Implementation** — the same as `next --to "Dev Implementation"`. From Agent Implementation that is one step; from an earlier state every state in between is entered first, each with its own automation. An item already at or past Dev Implementation is left as it is.
298
+ Advance the item to **Dev Implementation** — the same as `next --to "Dev Implementation"`. From Agent Implementation that is one step; from an earlier state every state in between is entered first, each with its own automation. An item already at or past Dev Implementation is left as it is. Several targets advance in parallel.
221
299
 
222
300
  ```bash
223
301
  idea1 start-dev-implementation [options]
224
302
  idea1 dev [options]
303
+ idea1 dev --target <url>,<url>
225
304
  ```
226
305
 
227
306
  **Options:**
307
+ - `--target <url | branch | PR url>[,...]` - The project item(s) (default: the current branch, when it is an item's)
228
308
  - `-p, --source-path <path>` - Path to worktree directory
229
309
 
230
310
  **What it does:**
231
311
  1. Enters every state before Dev Implementation the item has yet to reach (after syncing from origin)
232
- 2. Commits and pushes all changes in the branch
312
+ 2. Commits and pushes all changes in the branch's local checkout; a branch with no checkout here carries its work on origin already
233
313
  3. Creates a PR of the branch into its base branch
234
314
  4. Records "Dev Implementation" on Idea1.ai
235
315
  5. If in a worktree and `removeWorktreeAtState` is `Dev Implementation`, removes the worktree. The main repo stays on its current branch; use `join-project-item` to work on the item in the main repo or a new worktree.
236
316
 
237
317
  ### ready-for-approval
238
318
 
239
- On a project item's branch, advance the item to **Needs Approval for Release** — the same as `next --to "Needs Approval for Release"`: from an earlier state, every state in between is entered first, each with its own automation (PR creation on the way into Dev Implementation, for one), and an item already at or past it is left as it is. On any other branch (an integration branch, a branch with no project item), open the branch's PR into the base branch when it has none. Either way its job is to name the **assignee**, who will approve the change by merging it.
319
+ For a project item, advance the item to **Needs Approval for Release** — the same as `next --to "Needs Approval for Release"`: from an earlier state, every state in between is entered first, each with its own automation (PR creation on the way into Dev Implementation, for one), and an item already at or past it is left as it is. For any other branch (an integration branch, a branch with no project item), open the branch's PR into the base branch when it has none. Either way its job is to name the **assignee**, who will approve the change by merging it. Several targets run in parallel.
240
320
 
241
321
  ```bash
242
322
  idea1 ready-for-approval [options]
243
323
  idea1 rfa --assignee octocat
244
324
  idea1 rfa --assignee octocat # on working/integration/<name>-main: opens the PR into working/release
245
325
  idea1 rfa --assignee octocat -b working/release # a branch with no project item, naming the PR target
326
+ idea1 rfa --assignee octocat --target <url>,<branch> # from working/release, in parallel
246
327
  ```
247
328
 
248
329
  **Options:**
330
+ - `--target <url | branch | PR url>[,...]` - The project item(s) or branch(es) (default: the current branch; asked for on the base branch)
249
331
  - `-a, --assignee <username>` - **Required.** Who approves the PR by merging it (prompted from the repository's assignable users when omitted)
250
332
  - `-r, --reviewers <user1,user2>` - Who to request a review from (multi-select when omitted). Optional, and separate from approval — the assignee is the approver
251
333
  - `-b, --base-branch <branch>` - Branches with no project item only: the branch the PR targets (default: the open PR's base, else `baseBranch`, then `working/release`)
252
334
  - `--title <title>` - Branches with no project item only: PR title when the PR has to be created (default: `Integration <name> <YYYY-MM-DD>` for an integration branch, else the branch name; prompted when omitted)
253
335
 
254
- **What it does on a project item's branch:**
336
+ **What it does for a project item:**
255
337
  1. Enters every state before Needs Approval for Release the item has yet to reach (after syncing from origin)
256
338
  2. Ensures no uncommitted or unpushed changes in the local checkout
257
339
  3. Requires the PR to exist, then sets the assignee (the transition refuses to proceed without one) and requests any reviewers
@@ -259,60 +341,95 @@ idea1 rfa --assignee octocat -b working/release # a branch with no project it
259
341
  5. Records "Needs Approval for Release" on Idea1.ai. From here on the branch stays as it is
260
342
  6. If in a worktree and `removeWorktreeAtState` is `Needs Approval for Release` (the default) or earlier, removes the worktree
261
343
 
262
- **What it does on a branch with no project item:**
263
- 1. Requires you to be on the branch with nothing uncommitted, unpushed or behind origin; refuses on the base branch itself and refuses a PR straight into `main` (that is `idea1 release`)
344
+ **What it does for a branch with no project item:**
345
+ 1. Requires the branch on origin and, when it is checked out here, nothing uncommitted, unpushed or behind origin in that checkout; refuses the base branch itself and refuses a PR straight into `main` (that is `idea1 release`)
264
346
  2. Reuses the branch's open PR (and its base) when one exists; otherwise creates the PR into the base branch with the approval chain of what the branch carries as its body — every PR merged into the branch with its author and approver, and commits pushed straight to the branch listed as the change under review (they are not an exception: this PR is their stage-1 approval)
265
347
  3. Sets the assignee and requests any reviewers
266
348
  4. Records no workflow status — there is no project item
267
349
 
268
350
  ### approve-pr
269
351
 
270
- On a project item's branch, advance the item to **Approved and Merged** — the same as `next --to "Approved and Merged"`: from an earlier state, every state in between is entered first, each with its own automation, and an item already at or past it is left as it is. On any other branch, merge the branch's PR. Run by the PR's **assignee**: it waits for the CI/CD suite and merges the PR, and that merge is the approval of record. There is no admin override at this stage for any branch.
352
+ For a project item, advance the item to **Approved and Merged** — the same as `next --to "Approved and Merged"`: from an earlier state, every state in between is entered first, each with its own automation, and an item already at or past it is left as it is. For any other branch, merge the branch's PR. Run by the PR's **assignee**: it waits for the CI/CD suite and merges the PR, and that merge is the approval of record. There is no admin override at this stage for any branch. Several targets are approved in parallel, from `working/release`: each merges as soon as its PR can, and your checkout ends on `working/release`, up to date with every merge, with no worktree left behind.
271
353
 
272
354
  ```bash
273
355
  idea1 approve-pr
274
356
  idea1 approve
275
- idea1 approve-pr --branch working/integration/<name>-main # from anywhere: the branch need not be checked out
357
+ idea1 approve-pr --target working/integration/<name>-main # from anywhere: the branch need not be checked out
358
+ idea1 approve-pr --target <url>,<branch>,<pr url> --yes # several, in parallel
276
359
  ```
277
360
 
278
361
  **Options:**
279
- - `-b, --branch <branch>` - Branch whose PR to approve (default: the current branch). A project item's branch is approved through the workflow; any other branch through its PR alone
362
+ - `--target <url | branch | PR url>[,...]` - The project item(s) or branch(es) whose PR to approve (default: the current branch; asked for on the base branch). A project item is approved through the workflow; any other branch through its PR alone
363
+ - `-y, --yes` - Merge without asking for confirmation. The approver check and the wait for the required checks still apply
280
364
 
281
- **What it does on a project item's branch:**
365
+ **What it does for a project item:**
282
366
  1. Enters every state before Approved and Merged the item has yet to reach (after syncing from origin)
283
367
  2. Verifies the approver: refuses when the PR has no assignee, and when you are not the assignee warns that the merge record will name you instead and requires an explicit confirmation (the evidence report lists such a merge as an exception)
284
- 3. Waits for the required CI/CD checks on the PR — the checks of the branch's tip on origin, which the PR must have picked up first — then merges the PR. A red or unfinished suite stops the merge — there is no admin override at this stage. The branch is merged as it stands. A legacy branch that still carries its workflow context file has the file removed and pushed instead, and the approval is left for a second run once the re-run suite passes
368
+ 3. Refuses a PR that conflicts with its base straight away, before any wait, and again after the checks (another merge may have made it conflict meanwhile). Waits for the required CI/CD checks on the PR — the checks of the branch's tip on origin, which the PR must have picked up first — then merges the PR. A red or unfinished suite stops the merge — there is no admin override at this stage. The branch is merged as it stands. A legacy branch that still carries its workflow context file has the file removed and pushed instead, and the approval is left for a second run once the re-run suite passes
285
369
  4. Records "Approved and Merged" on Idea1.ai
286
- 5. Switches to the base branch and deletes the feature branch. If still running inside a worktree, removes the worktree instead of switching branches — this always happens, since the base branch can't be checked out in place there
370
+ 5. Deletes the feature branch: when it is checked out in the main repo, switches to the base branch first; inside a worktree, removes the worktree instead — this always happens, since the base branch can't be checked out in place there. Then fast-forwards the base branch's local checkout to the merge
287
371
 
288
- **What it does on a branch with no project item:**
372
+ **What it does for a branch with no project item:**
289
373
  1. Finds the branch's PR (run `ready-for-approval` first if there is none) and takes the target branch from it
290
374
  2. Refuses while any open PR still targets the branch — merging would retire the branch and orphan them
291
- 3. Verifies the approver exactly as above, waits for the required CI/CD checks and merges. A red or unfinished suite stops the merge — no override
292
- 4. Deletes the branch on origin and locally (removing its worktree, or switching to the base branch first when it is checked out in the main repo). Records no workflow status
375
+ 3. Verifies the approver exactly as above, refuses a conflicting PR, waits for the required CI/CD checks and merges. A red or unfinished suite stops the merge — no override
376
+ 4. Deletes the branch on origin and locally (removing its worktree, or switching to the base branch first when it is checked out in the main repo), and fast-forwards the base branch's local checkout. Records no workflow status
293
377
 
294
378
  ### release
295
379
 
296
- Release everything on the release branch to production. Opens the release PR from `working/release` into `main`, **assigned to you**, and merges it — the person who runs the command is the releaser and the approver, and no review is required, because every change in the release was already approved on its own PR.
380
+ Release everything on the release branch to production. Bumps the versions of the packages that changed since the last release (committing the bump to the release branch), opens the release PR from `working/release` into `main`, **assigned to you**, and merges it — the person who runs the command is the releaser and the approver, and no review is required, because every change in the release was already approved on its own PR.
297
381
 
298
382
  ```bash
299
- idea1 release # prompts for the PR mode and title
300
- idea1 release --pr-mode merge # wait for the required checks, then merge here
383
+ idea1 release # prompts for any version bumps, the PR mode and title
384
+ idea1 release --bumps filekit=minor,cli=patch # bump types given up front
385
+ idea1 release --pr-mode merge # enable auto-merge (or wait for the checks and merge here)
386
+ idea1 release --approve # approve and merge the open release PR
387
+ idea1 release --target <url>,<branch> # approve these into the release branch first, then release
301
388
  idea1 r
302
389
  ```
303
390
 
304
391
  **Options:**
305
- - `-b, --branch <branch>` - Source branch to release from (default: `releaseBranch`, then `baseBranch`, then `working/release`)
306
- - `-t, --target <branch>` - Target branch to release into (default: `releaseTargetBranch`, then `main`)
307
- - `-pr, --pr-mode <mode>` - `create` (default) creates the PR and opens it in the browser so you merge it there once the required checks pass; `merge` waits for every check with `gh` and merges here. The merge is the recorded approval in both
392
+ - `-b, --branch <branch>` - Source branch to release from (default: `baseBranch`, then `working/release`)
393
+ - `-t, --target-branch <branch>` - Target branch to release into (default: `releaseTargetBranch`, then `main`)
394
+ - `--approve` - Approve and merge the release PR that is already open, instead of opening one. See [Approving an open release](#approving-an-open-release)
395
+ - `--target <url | branch | PR url>[,...]` - Project items, branches or PRs to approve into the release branch before releasing it. Asked for, blank by default, which releases the branch as it is. See [Releasing with approvals](#releasing-with-approvals)
396
+ - `--bumps <package=type,...>` - Version bump per changed package, as `patch`, `minor` or `major` (e.g. `filekit=minor,cli=patch`). A changed package it doesn't name is prompted for, with `patch` preselected; a package that needs no bump is ignored
397
+ - `-pr, --pr-mode <mode>` - `create` (default) creates the PR and opens it in the browser so you merge it there once the required checks pass; `merge` turns on GitHub's auto-merge, so GitHub merges once the required checks pass, and falls back to waiting for every check with `gh` and merging here when GitHub can't auto-merge (the PR is already mergeable, or the repository doesn't allow auto-merge). You are the recorded merger, and the merge is the recorded approval, in every case
308
398
  - `--title <title>` - PR title (default: `Release <YYYY-MM-DD>`)
399
+ - `-y, --yes` - In `merge` mode, merge without asking for confirmation; with `--target`, also start the approvals without asking. The required checks still gate every merge
309
400
 
310
401
  **What it does:**
311
- 1. Requires you to be on the release branch with nothing uncommitted, unpushed or behind origin, then runs the `pre-release` hook (the version bumps). The hook runs before the PR is opened, so its commit is the PR's head and the suite runs once, on the release as it will merge
312
- 2. Creates the release PR assigned to you, whose body is the release's approval chain: every contained PR — attributed by GitHub's commit association, so squash and rebase merges are covered — with its author and the assignee who approved it by merging. Commits with no PR are listed separately, split in two: the `pre-release` hook's version bumps, which are release automation and not an exception, and genuine direct commits, which are
313
- 3. Refuses the release when nothing in it came through a merged PR. A repository admin can override that — an explicit confirmation and a required reason — and the exception is recorded as a comment on the PR naming the admin, the reason and every commit that had no PR, as well as in the PR body. Anyone who is not a repository admin just gets the refusal
314
- 4. In `merge` mode, waits for the required CI/CD checks and merges normally. Checks that fail, never start or never finish stop the release; an admin override is available but takes an explicit confirmation and a required reason, and the exception is recorded as a comment on the PR before anything is merged
315
- 5. Opens GitHub Actions, where the merge to `main` has triggered the production deploy
402
+ 1. Requires you to be on the release branch with nothing uncommitted, unpushed or behind origin
403
+ 2. Bumps versions, when the repository's `.idea1/settings.json` has a `release` section (see [Release Settings](#release-settings)). A versioned package needs a bump when its folder differs between the release branch and the target and its `package.json` version is still the same on both — so a release re-run after a bump never bumps twice. You pick `patch`, `minor` or `major` for each such package (or give them with `--bumps`), and are asked nothing when no package changed. The CLI makes the bump itself, in your checkout, with no script or workflow: it sets the new version in each package's `package.json` and in the lockfiles at or above the package's folder that record it (the same files `npm version` touches, edited in place so nothing else changes), commits them as one `chore: bump <package> <version>, ...` commit and pushes it to the release branch. Only plain `major.minor.patch` versions are bumped. The bump lands before the PR is opened, so its commit is the PR's head and the suite runs once, on the release as it will merge. A bump is never made onto a release PR that is already open, which may already be approved. The Idea1 web app's release view makes the same bump through the GitHub API
404
+ 3. Creates the release PR assigned to you, whose body is the release's approval chain: every contained PR — attributed by GitHub's commit association, so squash and rebase merges are covered — with its author and the assignee who approved it by merging. Commits with no PR are listed separately, split in two: the version bumps (a commit with no PR that changes only version files, meaning the `package.json` of a declared package and the lockfiles above it, whatever its name or author), which are release automation and not an exception, and genuine direct commits, which are exceptions under change-management-policy.md clause 2, explained at the quarterly review
405
+ 4. Refuses the release when nothing in it came through a merged PR. A repository admin can override that — an explicit confirmation and a required reason — and the exception is recorded as a comment on the PR naming the admin, the reason and every commit that had no PR, as well as in the PR body. Anyone who is not a repository admin just gets the refusal
406
+ 5. In `merge` mode, enables auto-merge, or waits for the required CI/CD checks and merges normally. Checks that fail, never start or never finish stop the release; an admin override is available but takes an explicit confirmation and a required reason, and the exception is recorded as a comment on the PR before anything is merged
407
+ 6. Opens GitHub Actions once it has merged the PR itself, where the merge to `main` has triggered the production deploy
408
+
409
+ #### Releasing with approvals
410
+
411
+ `idea1 release --target <items, branches or PRs>` releases the release branch once the given targets are approved into it, as one unattended sequence:
412
+
413
+ 1. **Checks:** your checkout must be on the release branch, clean and level with origin. Then every target is resolved exactly as `approve-pr` resolves several targets.
414
+ 2. **Questions, all asked up front:**
415
+ - the options the targets' workflow states need, then one confirmation of the approvals;
416
+ - the version bump of every versioned package changed on the release branch or on any target's branch;
417
+ - the title (`--pr-mode` is asked as usual).
418
+ 3. **Approvals:** every target's PR is approved in parallel, each in its own unattended run, exactly as `approve-pr` does.
419
+ 4. **Fast fail:** the first target that fails (a red check, or a PR that cannot merge) stops the others, and nothing is released. Fix it and run the command again: the approvals that merged stay merged.
420
+ 5. **Release:** once every target has merged, the release runs as it does on its own, in your up-to-date checkout:
421
+ - it bumps the versions;
422
+ - it opens the release PR into `main`, assigned to you;
423
+ - it carries on in the chosen PR mode.
424
+
425
+ In interactive mode the whole sequence runs as a background job (see `/jobs`); otherwise it runs in the foreground, reporting each run's steps.
426
+
427
+ #### Approving an open release
428
+
429
+ `idea1 release --approve` finds the open release PR from the release branch into the target and merges it as its approver, after the same assignee check as `approve-pr`:
430
+ - every check passed — merges now
431
+ - checks still running — enables auto-merge, or waits for the checks and merges where GitHub can't auto-merge
432
+ - a check failed — stops, unless a repository admin confirms the admin override, gives a reason, and has it recorded on the PR before the merge
316
433
 
317
434
  ## Configuration
318
435
 
@@ -354,19 +471,38 @@ Create `.idea1/settings.json` in your repository root to configure repo-specific
354
471
  **Prompts:**
355
472
  - `agentImplementation` - The prompt an Agent Implementation session starts with. See [Prompts](#prompts).
356
473
 
474
+ **Release:** see [Release Settings](#release-settings).
475
+
357
476
  **Defaults:**
358
477
  - `branchPrefix` - Prefix for new branches (default: `working/agent`)
359
478
  - `baseBranch` - Default base branch for branching (default: `working/release`)
360
479
  - `testCommand` - Command to run tests before PR creation (e.g., `npm run test`)
361
480
  - `removeWorktreeAtState` - Workflow state whose transition removes the worktree (default: `Needs Approval for Release`). See [Worktree Removal](#worktree-removal).
362
481
 
482
+ ### Release Settings
483
+
484
+ The optional `release` section declares the repository folders `idea1 release` (and the Idea1 web app's release view) can version. A repository without it has no version bump step.
485
+
486
+ ```json
487
+ {
488
+ "release": {
489
+ "versionedPackages": [
490
+ { "name": "filekit", "label": "filekit package", "path": "packages/filekit" },
491
+ { "name": "cli", "label": "idea1 CLI", "path": "omega/idea1-cli" }
492
+ ]
493
+ }
494
+ }
495
+ ```
496
+
497
+ - `versionedPackages` - The packages a release can bump: `name` (used by `--bumps`), `label` (shown in prompts) and `path` (the folder holding the package's `package.json`, relative to the repository root). A package needs a bump when its folder differs between the release branch and the target while its `package.json` version is the same on both
498
+
363
499
  ### Local Settings Overrides
364
500
 
365
501
  `.idea1/settings.local.json` is an optional, git-ignored file with the same shape as
366
502
  `settings.json`. Anything it defines overrides the committed settings for that clone
367
503
  only, which keeps developer-specific preferences out of the shared configuration.
368
- `hooks`, `prompts` and `defaults` are merged section by section, so overriding one value
369
- leaves the rest of the committed settings in place.
504
+ `hooks`, `prompts`, `defaults` and `release` are merged section by section, so overriding one
505
+ value leaves the rest of the committed settings in place.
370
506
 
371
507
  ```json
372
508
  {
@@ -12,6 +12,7 @@ import type { Command } from '../types/index.js';
12
12
  * applicable, so it is neither prompted nor required and left unset.
13
13
  * 1. Skip if isFlag — flags are never prompted
14
14
  * 2. Skip if already in parsed — value was provided on CLI
15
+ * 2a. If resolveValue exists: let it resolve the value (it may ask), and use that
15
16
  * 3. If has default and promptWhenDefaultExists is not true: silently use default
16
17
  * 4. If no default: prompt (required — re-prompt until valid value given)
17
18
  * 5. If has default and promptWhenDefaultExists is true: prompt showing default as hint
@@ -1 +1 @@
1
- {"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../../src/cli/resolver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAiB,MAAM,mBAAmB,CAAC;AAKhE;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC7B,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAwGjC"}
1
+ {"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../../src/cli/resolver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAiB,MAAM,mBAAmB,CAAC;AAKhE;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC7B,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CA6GjC"}
@@ -14,6 +14,7 @@ import { resolveNamedList } from './named-lists.js';
14
14
  * applicable, so it is neither prompted nor required and left unset.
15
15
  * 1. Skip if isFlag — flags are never prompted
16
16
  * 2. Skip if already in parsed — value was provided on CLI
17
+ * 2a. If resolveValue exists: let it resolve the value (it may ask), and use that
17
18
  * 3. If has default and promptWhenDefaultExists is not true: silently use default
18
19
  * 4. If no default: prompt (required — re-prompt until valid value given)
19
20
  * 5. If has default and promptWhenDefaultExists is true: prompt showing default as hint
@@ -56,6 +57,10 @@ export async function resolveOptions(command, parsed) {
56
57
  }
57
58
  continue;
58
59
  }
60
+ if (option.resolveValue) {
61
+ resolved[option.longName] = await option.resolveValue(resolved);
62
+ continue;
63
+ }
59
64
  const defaultVal = resolveDefault(option);
60
65
  const hasDefault = defaultVal !== undefined;
61
66
  const promptWhenDefault = option.promptWhenDefaultExists !== false; // default true
@@ -1 +1 @@
1
- {"version":3,"file":"resolver.js","sourceRoot":"","sources":["../../src/cli/resolver.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"resolver.js","sourceRoot":"","sources":["../../src/cli/resolver.ts"],"names":[],"mappings":"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"}
package/dist/cli.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AASA;;GAEG;AACH,wBAAsB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAyE1D"}
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AASA;;GAEG;AACH,wBAAsB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA0E1D"}
package/dist/cli.js CHANGED
@@ -21,7 +21,8 @@ export async function runCli(argv) {
21
21
  if (!isSimpleFlag) {
22
22
  try {
23
23
  repoRoot = await git.getRepoRoot();
24
- await ensureSetup(repoRoot);
24
+ // The main clone is set up, never a worktree, whose branch a setup change would make dirty.
25
+ await ensureSetup((await git.getMainRepoRoot()).trim());
25
26
  }
26
27
  catch {
27
28
  // Not in a git repository - skip setup
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}