ace-git 0.28.0 โ 0.29.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +16 -0
- data/README.md +1 -1
- data/docs/handbook.md +4 -4
- data/handbook/guides/version-control-system-git.g.md +11 -4
- data/handbook/skills/as-git-pr-create/SKILL.md +23 -0
- data/handbook/skills/as-git-pr-update/SKILL.md +23 -0
- data/handbook/workflow-instructions/git/pr/create.wf.md +36 -0
- data/handbook/workflow-instructions/git/pr/update.wf.md +28 -0
- data/lib/ace/git/organisms/pull_request_lifecycle.rb +25 -3
- data/lib/ace/git/server_registry.rb +8 -6
- data/lib/ace/git/version.rb +1 -1
- metadata +6 -6
- data/handbook/skills/as-github-pr-create/SKILL.md +0 -72
- data/handbook/skills/as-github-pr-update/SKILL.md +0 -41
- data/handbook/workflow-instructions/github/pr/create.wf.md +0 -282
- data/handbook/workflow-instructions/github/pr/update.wf.md +0 -203
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: ecb7e3224f26cacff289f62d5199d90740ee07a4fbaa378649fc948133e6d05c
|
|
4
|
+
data.tar.gz: 13ac60da2a81dda68242bc0c9f5f21f5e44f764562f24877426e873b59137bbf
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 19e1dfe5f0315b38572c0c8464852bfb7f2c25477f92f646c73df44d4b0c0f06d72c32cd6e961ef8185ed1ced37c57cd111a4980dec8f698d1eba3ad7596e8c7
|
|
7
|
+
data.tar.gz: 16ff4c84f2f86b690116792e97cfcbe323c5dd2209d63e5148f6d4aa35fc3725a99dc84b87695cb4d00b9187816ab6652f1194ba7940caf11f6d96dd065b4fdf
|
data/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,22 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.29.0] - 2026-10-05
|
|
11
|
+
|
|
12
|
+
### Removed
|
|
13
|
+
|
|
14
|
+
- Remove the obsolete GitHub PR workflow and skill sources; canonical PR creation/update use only `git/pr` and `as-git-pr-*`, with no forwarding aliases.
|
|
15
|
+
|
|
16
|
+
### Added
|
|
17
|
+
|
|
18
|
+
- PR lifecycle selection can use an explicit repository and pinned forge identity; exact create reconciliation is read-only. Neutral PR workflow and skill sources are prepared for coordinated canonical adoption.
|
|
19
|
+
|
|
20
|
+
## [0.28.1] - 2026-10-04
|
|
21
|
+
|
|
22
|
+
### Technical
|
|
23
|
+
|
|
24
|
+
- Verify the public PR lifecycle preserves provider uncertainty after accepted mutations.
|
|
25
|
+
|
|
10
26
|
## [0.28.0] - 2026-10-04
|
|
11
27
|
|
|
12
28
|
### Added
|
data/README.md
CHANGED
|
@@ -32,7 +32,7 @@
|
|
|
32
32
|
|
|
33
33
|
**Rebase with changelog-safe workflow guardrails** - use the `as-git-rebase` agent workflow to run structured rebase flows that preserve package release metadata and reduce manual conflict-prone steps.
|
|
34
34
|
|
|
35
|
-
**Prepare clean review history before publishing** - run the `as-git-reorganize-commits` workflow to reorganize commit stacks, then use `as-
|
|
35
|
+
**Prepare clean review history before publishing** - run the `as-git-reorganize-commits` workflow to reorganize commit stacks, then use `as-git-pr-create` or `as-git-pr-update` to manage PR metadata in a predictable workflow sequence. See [Handbook](docs/handbook.md) for the full skill and workflow catalog.
|
|
36
36
|
|
|
37
37
|
**Coordinate with commit and worktree tools** - pair with [ace-git-commit](../ace-git-commit) for scoped commit authoring, [ace-git-worktree](../ace-git-worktree) for task-oriented worktree management, and [ace-bundle](../ace-bundle) for loading workflow instructions.
|
|
38
38
|
|
data/docs/handbook.md
CHANGED
|
@@ -17,8 +17,8 @@ Reference for package-owned handbook resources in `ace-git/handbook/`.
|
|
|
17
17
|
|-------|--------------|
|
|
18
18
|
| `as-git-rebase` | Guide changelog-preserving rebases |
|
|
19
19
|
| `as-git-reorganize-commits` | Rework commit history into reviewable logical groups |
|
|
20
|
-
| `as-
|
|
21
|
-
| `as-
|
|
20
|
+
| `as-git-pr-create` | Create an attempt-bound draft on the selected forge |
|
|
21
|
+
| `as-git-pr-update` | Update the exact attempt-bound PR and consume current evidence |
|
|
22
22
|
| `as-github-release-publish` | Publish a GitHub release from the ACE workflow |
|
|
23
23
|
|
|
24
24
|
## Workflow Instructions
|
|
@@ -27,8 +27,8 @@ Reference for package-owned handbook resources in `ace-git/handbook/`.
|
|
|
27
27
|
|--------------|---------|------------|
|
|
28
28
|
| `wfi://git/rebase` | Rebase a branch while preserving changelog/version files | `as-git-rebase` |
|
|
29
29
|
| `wfi://git/reorganize-commits` | Consolidate or regroup commit history before review | `as-git-reorganize-commits` |
|
|
30
|
-
| `wfi://
|
|
31
|
-
| `wfi://
|
|
30
|
+
| `wfi://git/pr/create` | Create or reconcile the exact attempt-bound draft | `as-git-pr-create` |
|
|
31
|
+
| `wfi://git/pr/update` | Update the recorded PR and retain delivery identity | `as-git-pr-update` |
|
|
32
32
|
| `wfi://github/release-publish` | Publish a GitHub release | `as-github-release-publish` |
|
|
33
33
|
|
|
34
34
|
## Guides
|
|
@@ -183,13 +183,19 @@ git remote prune origin
|
|
|
183
183
|
git push -u origin feature/your-feature
|
|
184
184
|
```
|
|
185
185
|
|
|
186
|
-
2. **Create
|
|
186
|
+
2. **Create an attempt-bound draft on the selected forge**:
|
|
187
187
|
|
|
188
188
|
```bash
|
|
189
|
-
|
|
190
|
-
--body "Description of changes..."
|
|
189
|
+
ace-bundle wfi://git/pr/create
|
|
191
190
|
```
|
|
192
191
|
|
|
192
|
+
Use the managed assignment and active delivery attempt with explicit
|
|
193
|
+
fork/canonical repository and ref provenance. The canonical operation is
|
|
194
|
+
`ace-assign delivery --assignment ID --attempt ATTEMPT --operation create --title TITLE --body-file DESCRIPTION`.
|
|
195
|
+
Preserve the resolved forge and exact candidate SHA. Continue through
|
|
196
|
+
`wfi://git/pr/update` only with accepted current test and independent review
|
|
197
|
+
receipts; CI status remains advisory. Inside ACE use source `bin/ace-*`.
|
|
198
|
+
|
|
193
199
|
3. **Link to relevant issues/tasks**:
|
|
194
200
|
|
|
195
201
|
```markdown
|
|
@@ -219,7 +225,8 @@ git push --force-with-lease origin feature/your-feature
|
|
|
219
225
|
|
|
220
226
|
#### Fork-Based Workflow
|
|
221
227
|
|
|
222
|
-
|
|
228
|
+
Provider-specific GitHub clone example for external contributors; canonical
|
|
229
|
+
assignment delivery above uses the explicitly selected forge and provenance:
|
|
223
230
|
|
|
224
231
|
```bash
|
|
225
232
|
# Fork repository on GitHub, then:
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: as-git-pr-create
|
|
3
|
+
description: Create an attempt-bound forge-neutral pull request
|
|
4
|
+
user-invocable: true
|
|
5
|
+
source: ace-git
|
|
6
|
+
allowed-tools:
|
|
7
|
+
- Bash(ace-assign:*)
|
|
8
|
+
- Bash(ace-git:*)
|
|
9
|
+
- Bash(ace-bundle:*)
|
|
10
|
+
- Read
|
|
11
|
+
assign:
|
|
12
|
+
steps:
|
|
13
|
+
- name: create-pr
|
|
14
|
+
description: Create the exact assignment pull request
|
|
15
|
+
produces: [pull-request]
|
|
16
|
+
consumes: [code-changes, execution-attempt]
|
|
17
|
+
skill:
|
|
18
|
+
kind: workflow
|
|
19
|
+
execution:
|
|
20
|
+
workflow: wfi://git/pr/create
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
Load and run `ace-bundle wfi://git/pr/create` in the current project, then execute its complete workflow. Use source `bin/ace-*` entrypoints inside the ACE repository.
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: as-git-pr-update
|
|
3
|
+
description: Update an attempt-bound forge-neutral pull request
|
|
4
|
+
user-invocable: true
|
|
5
|
+
source: ace-git
|
|
6
|
+
allowed-tools:
|
|
7
|
+
- Bash(ace-assign:*)
|
|
8
|
+
- Bash(ace-git:*)
|
|
9
|
+
- Bash(ace-bundle:*)
|
|
10
|
+
- Read
|
|
11
|
+
assign:
|
|
12
|
+
steps:
|
|
13
|
+
- name: update-pr-desc
|
|
14
|
+
description: Update the exact assignment pull request
|
|
15
|
+
produces: [pull-request]
|
|
16
|
+
consumes: [code-changes, execution-attempt]
|
|
17
|
+
skill:
|
|
18
|
+
kind: workflow
|
|
19
|
+
execution:
|
|
20
|
+
workflow: wfi://git/pr/update
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
Load and run `ace-bundle wfi://git/pr/update` in the current project, then execute its complete workflow. Use source `bin/ace-*` entrypoints inside the ACE repository.
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
---
|
|
2
|
+
doc-type: workflow
|
|
3
|
+
title: Create an attempt-bound draft pull request
|
|
4
|
+
purpose: Create or reconcile a forge-neutral draft for the exact candidate
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Create an attempt-bound draft pull request
|
|
8
|
+
|
|
9
|
+
## Goal
|
|
10
|
+
|
|
11
|
+
Create one draft PR on the selected forge and retain its exact source/base identity in the assignment attempt journal.
|
|
12
|
+
|
|
13
|
+
## Prerequisites
|
|
14
|
+
|
|
15
|
+
A reviewed task, managed assignment, active delivery attempt, committed candidate, and pushed source ref. Credentials permit transport only; they grant no integration authority.
|
|
16
|
+
|
|
17
|
+
## Inputs
|
|
18
|
+
|
|
19
|
+
Use `forge_server` or `forge_default: true`, mutually exclusive. Neither means resolve this repository's configured remote. Provide `pr_provenance` containing `mode` (`fork` or `canonical`), `head_repository_url`, `head_ref`, `base_repository_url`, and `base_ref`. Canonical repositories must match; fork mode explicitly names its source even when owners coincide. Inputs contain no credentials.
|
|
20
|
+
|
|
21
|
+
```json
|
|
22
|
+
{"forge_server":"forge-lab","pr_provenance":{"mode":"canonical","head_repository_url":"https://forge.example/team/repo","head_ref":"feature","base_repository_url":"https://forge.example/team/repo","base_ref":"main"}}
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## Steps
|
|
26
|
+
|
|
27
|
+
1. Read the task and actual committed diff; prepare a concrete title and description explaining behavior and executed validation. Save the description as a local file.
|
|
28
|
+
2. Use the existing managed assignment and active delivery attempt IDs. If needed, start the delivery step with `ace-assign attempt start --assignment ID --step STEP --project PROJECT` (numeric step scope). The execution boundary supplies actor identity; do not impersonate a reviewer or integrator.
|
|
29
|
+
3. Supply the assignment source's `delivery` mapping, or save the explicit input JSON and pass `--parameters FILE`. For task-mode creation, `ace-assign create --task TASK --delivery-parameters FILE` retains these inputs in the generated job.
|
|
30
|
+
4. Execute `ace-assign delivery --assignment ID --attempt ATTEMPT --operation create --title TITLE --body-file DESCRIPTION`. Add `--parameters FILE` only when supplying an explicit file. In this repository invoke the source `bin/ace-assign` entrypoint.
|
|
31
|
+
5. Read the structured result. Verify the retained server/provider/base and head repository/ref, draft PR number/URL, candidate SHA, base_head, evidence_git_ref, and separate journal_commit. The pushed ref must equal the candidate; journal commits never advance it.
|
|
32
|
+
6. On interruption or unknown create outcome, repeat the delivery command to perform exact-selector reconciliation reads. One matching draft at the exact head is adopted without a second create. Zero remains unresolved; multiple matches conflict. Never bypass uncertainty with a direct provider command.
|
|
33
|
+
|
|
34
|
+
## Success criteria
|
|
35
|
+
|
|
36
|
+
The journal records exact identity, intent before the write, and proven draft outcome afterward. A report or shell exit alone proves nothing. Continue with actual tests and independent current-head review; keep the PR draft until those receipts are accepted. CI is visible and advisory. Publication is a separate authorized operation and is not required for delivery.
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
---
|
|
2
|
+
doc-type: workflow
|
|
3
|
+
title: Update an attempt-bound pull request
|
|
4
|
+
purpose: Update the exact forge-neutral PR and consume current delivery evidence
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Update an attempt-bound pull request
|
|
8
|
+
|
|
9
|
+
## Goal
|
|
10
|
+
|
|
11
|
+
Update the recorded PR description for the current candidate and preserve provider identity through readiness and integration handoff.
|
|
12
|
+
|
|
13
|
+
## Prerequisites
|
|
14
|
+
|
|
15
|
+
A managed assignment with a recorded PR and active delivery attempt. Reuse the original forge selection and complete fork/canonical provenance; changed configuration or identity is a conflict. A new committed candidate, including task-only changes, requires renewed tests and independent review.
|
|
16
|
+
|
|
17
|
+
## Steps
|
|
18
|
+
|
|
19
|
+
1. Inspect the committed changes and accepted test/review evidence. Prepare the final description with the concrete behavior, executed test results, independent verdict, and actual limitations. Save it as a local file; do not put credentials or terminal dumps in the attempt journal.
|
|
20
|
+
2. Execute `ace-assign delivery --assignment ID --attempt ATTEMPT --operation update --body-file DESCRIPTION`. Supply `--parameters FILE` only if the assignment source lacks the original `delivery` mapping. In this repository use `bin/ace-assign`.
|
|
21
|
+
3. On interrupted update, repeat the delivery command. It reads the exact remote title/body and compares the requested field digest before accepting; an unmatched or unreadable outcome remains unresolved. Never blindly resend a mutation.
|
|
22
|
+
4. To mark ready, supply two JSON reference files, each containing only `attempt_id` and `receipt_digest`, from coordinator-accepted current-head test and independent review attempts in this assignment/project. Execute `ace-assign delivery --assignment ID --attempt ATTEMPT --operation ready --tests TEST-REF --review REVIEW-REF`. Missing, fabricated, stale, or self-approved evidence cannot authorize readiness. Red CI alone does not veto valid executed tests and review.
|
|
23
|
+
5. Merge is an integrator/service operation under the existing exact qjx authorization policy. The authorized executor calls `ace-git pr merge IDENTIFIER --server NAME --expected-head CANDIDATE-SHA --method METHOD --format json` with the retained selection (or `--default-server`, otherwise remote resolution). Both expected SHA and the authorized squash/merge/rebase method are required; there is no default method. It does not recursively request its own future receipt. The worker consumes the completed, verified service receipt using `ace-assign delivery --assignment ID --attempt ATTEMPT --operation merge --tests TEST-REF --review REVIEW-REF --service-request REQUEST`. The request must bind this assignment, attempt, project, candidate and PR URL. No completed receipt means a routed blocker; credentials or caller assertions grant no authority.
|
|
24
|
+
6. Unknown merge remains pending service reconciliation and is never automatically retried. Inspect the authoritative selected remote and verified executor evidence. Changed head or scope blocks acceptance. Merge does not authorize publication, deployment or synchronization.
|
|
25
|
+
|
|
26
|
+
## Success criteria
|
|
27
|
+
|
|
28
|
+
The exact remote outcome and existing qjl evidence agree. Real artifacts, current executed tests, independent verdict and required authorization gate completion. Preserve unresolved history and distinct candidate_head/journal_commit. qkb.1 supplies installed charter/proposal/service adoption; this workflow does not fabricate that acceptance.
|
|
@@ -29,8 +29,10 @@ module Ace
|
|
|
29
29
|
# @param remote_name [String, nil] git remote used when nothing selected
|
|
30
30
|
# @param timeout [Integer, nil] provider operation timeout
|
|
31
31
|
# @param runner [Proc, nil] injectable provider command runner (tests)
|
|
32
|
-
def initialize(server_name: nil, use_default: false, remote_name: nil, timeout: nil, runner: nil)
|
|
32
|
+
def initialize(server_name: nil, use_default: false, remote_name: nil, timeout: nil, runner: nil, repo_root: nil, resolved_server: nil)
|
|
33
|
+
@pinned_server = resolved_server
|
|
33
34
|
@selection = {server_name: server_name, use_default: use_default, remote_name: remote_name}
|
|
35
|
+
@selection[:repo_root] = repo_root if repo_root
|
|
34
36
|
@timeout = timeout
|
|
35
37
|
@runner = runner
|
|
36
38
|
end
|
|
@@ -234,6 +236,22 @@ module Ace
|
|
|
234
236
|
)
|
|
235
237
|
end
|
|
236
238
|
|
|
239
|
+
# Freeze the selected provider identity for an assignment attempt.
|
|
240
|
+
def resolved_identity
|
|
241
|
+
resolve_selected_server.to_h.transform_keys(&:to_s).transform_values(&:to_s)
|
|
242
|
+
end
|
|
243
|
+
|
|
244
|
+
# Read-only reconciliation of a possibly completed create. Absence
|
|
245
|
+
# does not authorize another write; the assignment owns that policy.
|
|
246
|
+
def reconcile_create(head_repository_url:, head_ref:, base_repository_url:, base_ref:)
|
|
247
|
+
server = resolve_selected_server
|
|
248
|
+
unless Atoms::ServerUrl.match?(server.url, base_repository_url)
|
|
249
|
+
raise ProviderIdentityMismatchError, "Create reconciliation base does not match selected server"
|
|
250
|
+
end
|
|
251
|
+
provider_for(server).find_open_pull_requests(head_repository_url: head_repository_url,
|
|
252
|
+
head_ref: head_ref, base_repository_url: base_repository_url, base_ref: base_ref)
|
|
253
|
+
end
|
|
254
|
+
|
|
237
255
|
def resolved_server_url(identifier)
|
|
238
256
|
reference = parse_identifier(identifier)
|
|
239
257
|
resolve_server_for(reference).url
|
|
@@ -255,7 +273,11 @@ module Ace
|
|
|
255
273
|
end
|
|
256
274
|
|
|
257
275
|
def resolve_selected_server
|
|
258
|
-
ServerRegistry.resolve_for(**@selection)
|
|
276
|
+
selected = ServerRegistry.resolve_for(**@selection)
|
|
277
|
+
if @pinned_server && selected != @pinned_server
|
|
278
|
+
raise ProviderIdentityMismatchError, "Configured server identity changed from the pinned delivery identity"
|
|
279
|
+
end
|
|
280
|
+
@pinned_server || selected
|
|
259
281
|
end
|
|
260
282
|
|
|
261
283
|
# Resolve exactly one server for a parsed reference, validating any
|
|
@@ -270,7 +292,7 @@ module Ace
|
|
|
270
292
|
end
|
|
271
293
|
|
|
272
294
|
if @selection[:server_name] || @selection[:use_default]
|
|
273
|
-
selected =
|
|
295
|
+
selected = resolve_selected_server
|
|
274
296
|
unless candidates.any? { |candidate| candidate.name == selected.name }
|
|
275
297
|
identity = reference.repository_url || reference.owner_repo
|
|
276
298
|
raise ProviderIdentityMismatchError,
|
|
@@ -80,9 +80,9 @@ module Ace
|
|
|
80
80
|
# @return [ResolvedServer] the single matching configured server
|
|
81
81
|
# @raise [AmbiguousRemoteError] when the remote matches no configured
|
|
82
82
|
# server, or more than one
|
|
83
|
-
def resolve_remote(remote_name = nil)
|
|
83
|
+
def resolve_remote(remote_name = nil, repo_root: nil)
|
|
84
84
|
remote_name ||= Ace::Git.config["remote"] || "origin"
|
|
85
|
-
remote_url = read_remote_url(remote_name)
|
|
85
|
+
remote_url = read_remote_url(remote_name, repo_root: repo_root)
|
|
86
86
|
matches = entries.map(&:server).select { |server| Atoms::ServerUrl.match?(server.url, remote_url) }
|
|
87
87
|
|
|
88
88
|
if matches.empty?
|
|
@@ -108,7 +108,7 @@ module Ace
|
|
|
108
108
|
# @raise [ConfigError] when explicit selection and default conflict
|
|
109
109
|
# @raise [UnknownServerNameError, NoDefaultServerConfiguredError,
|
|
110
110
|
# MultipleDefaultServersError, AmbiguousRemoteError] per resolution
|
|
111
|
-
def resolve_for(server_name: nil, use_default: false, remote_name: nil)
|
|
111
|
+
def resolve_for(server_name: nil, use_default: false, remote_name: nil, repo_root: nil)
|
|
112
112
|
if server_name && use_default
|
|
113
113
|
raise ConfigError,
|
|
114
114
|
"Server selection is ambiguous: an explicit server ('#{server_name}') and " \
|
|
@@ -120,7 +120,7 @@ module Ace
|
|
|
120
120
|
elsif use_default
|
|
121
121
|
resolve_default
|
|
122
122
|
else
|
|
123
|
-
resolve_remote(remote_name)
|
|
123
|
+
resolve_remote(remote_name, repo_root: repo_root)
|
|
124
124
|
end
|
|
125
125
|
end
|
|
126
126
|
|
|
@@ -173,8 +173,10 @@ module Ace
|
|
|
173
173
|
end
|
|
174
174
|
|
|
175
175
|
# Read a remote URL with local git only (no network, no forge CLI).
|
|
176
|
-
def read_remote_url(remote_name)
|
|
177
|
-
|
|
176
|
+
def read_remote_url(remote_name, repo_root: nil)
|
|
177
|
+
argv = ["git"]
|
|
178
|
+
argv += ["-C", repo_root] if repo_root
|
|
179
|
+
result = Atoms::CommandExecutor.execute(*argv, "remote", "get-url", remote_name.to_s)
|
|
178
180
|
result[:success] ? result[:output].to_s.strip : nil
|
|
179
181
|
end
|
|
180
182
|
|
data/lib/ace/git/version.rb
CHANGED
metadata
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: ace-git
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.29.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Michal Czyz
|
|
8
8
|
bindir: exe
|
|
9
9
|
cert_chain: []
|
|
10
|
-
date: 2026-10-
|
|
10
|
+
date: 2026-10-05 00:00:00.000000000 Z
|
|
11
11
|
dependencies:
|
|
12
12
|
- !ruby/object:Gem::Dependency
|
|
13
13
|
name: ace-support-config
|
|
@@ -124,19 +124,19 @@ files:
|
|
|
124
124
|
- handbook/guides/version-control/ruby.md
|
|
125
125
|
- handbook/guides/version-control/rust.md
|
|
126
126
|
- handbook/guides/version-control/typescript.md
|
|
127
|
+
- handbook/skills/as-git-pr-create/SKILL.md
|
|
128
|
+
- handbook/skills/as-git-pr-update/SKILL.md
|
|
127
129
|
- handbook/skills/as-git-rebase/SKILL.md
|
|
128
130
|
- handbook/skills/as-git-reorganize-commits/SKILL.md
|
|
129
|
-
- handbook/skills/as-github-pr-create/SKILL.md
|
|
130
|
-
- handbook/skills/as-github-pr-update/SKILL.md
|
|
131
131
|
- handbook/skills/as-github-release-publish/SKILL.md
|
|
132
132
|
- handbook/templates/commit/squash.template.md
|
|
133
133
|
- handbook/templates/pr/bugfix.template.md
|
|
134
134
|
- handbook/templates/pr/default.template.md
|
|
135
135
|
- handbook/templates/pr/feature.template.md
|
|
136
|
+
- handbook/workflow-instructions/git/pr/create.wf.md
|
|
137
|
+
- handbook/workflow-instructions/git/pr/update.wf.md
|
|
136
138
|
- handbook/workflow-instructions/git/rebase.wf.md
|
|
137
139
|
- handbook/workflow-instructions/git/reorganize-commits.wf.md
|
|
138
|
-
- handbook/workflow-instructions/github/pr/create.wf.md
|
|
139
|
-
- handbook/workflow-instructions/github/pr/update.wf.md
|
|
140
140
|
- handbook/workflow-instructions/github/release-publish.wf.md
|
|
141
141
|
- lib/ace/git.rb
|
|
142
142
|
- lib/ace/git/atoms/command_executor.rb
|
|
@@ -1,72 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: as-github-pr-create
|
|
3
|
-
description: Create GitHub pull request with generated description and summary
|
|
4
|
-
# bundle: wfi://github/pr/create
|
|
5
|
-
# agent: general-purpose
|
|
6
|
-
user-invocable: true
|
|
7
|
-
allowed-tools:
|
|
8
|
-
- Bash(ace-git:*)
|
|
9
|
-
- Bash(ace-bundle:*)
|
|
10
|
-
- Bash(gh:*)
|
|
11
|
-
- Read
|
|
12
|
-
argument-hint: pr-type
|
|
13
|
-
last_modified: 2026-01-10
|
|
14
|
-
source: ace-git
|
|
15
|
-
integration:
|
|
16
|
-
targets:
|
|
17
|
-
- claude
|
|
18
|
-
- codex
|
|
19
|
-
- gemini
|
|
20
|
-
- opencode
|
|
21
|
-
- pi
|
|
22
|
-
providers:
|
|
23
|
-
claude:
|
|
24
|
-
frontmatter:
|
|
25
|
-
context: fork
|
|
26
|
-
model: haiku
|
|
27
|
-
assign:
|
|
28
|
-
steps:
|
|
29
|
-
- name: create-pr
|
|
30
|
-
description: Create a pull request for the implemented changes
|
|
31
|
-
intent:
|
|
32
|
-
phrases:
|
|
33
|
-
- "create pr"
|
|
34
|
-
- "create a pr"
|
|
35
|
-
- "open pr"
|
|
36
|
-
- "open pull request"
|
|
37
|
-
prerequisites:
|
|
38
|
-
- name: work-on-task
|
|
39
|
-
strength: required
|
|
40
|
-
reason: "Must have code changes to create a PR"
|
|
41
|
-
produces: [pull-request]
|
|
42
|
-
consumes: [code-changes, commits]
|
|
43
|
-
context:
|
|
44
|
-
default: null
|
|
45
|
-
reason: "PR creation needs access to git state in main context"
|
|
46
|
-
when_to_skip:
|
|
47
|
-
- "PR already exists for this branch"
|
|
48
|
-
- "Changes don't warrant a PR (e.g., direct push allowed)"
|
|
49
|
-
effort: light
|
|
50
|
-
tags: [git, pr, publishing]
|
|
51
|
-
skill:
|
|
52
|
-
kind: workflow
|
|
53
|
-
execution:
|
|
54
|
-
workflow: wfi://github/pr/create
|
|
55
|
-
---
|
|
56
|
-
|
|
57
|
-
## Arguments
|
|
58
|
-
|
|
59
|
-
Use the skill `argument-hint` values as the explicit inputs for this skill.
|
|
60
|
-
|
|
61
|
-
## Variables
|
|
62
|
-
|
|
63
|
-
None
|
|
64
|
-
|
|
65
|
-
## Execution
|
|
66
|
-
|
|
67
|
-
- You are working in the current project.
|
|
68
|
-
- Run `ace-bundle wfi://github/pr/create` in the current project to load the workflow instructions.
|
|
69
|
-
- Read the loaded workflow and execute it end-to-end in this project.
|
|
70
|
-
- Follow the workflow as the source of truth.
|
|
71
|
-
- Do the work described by the workflow instead of only summarizing it.
|
|
72
|
-
- When the workflow requires edits, tests, or commits, perform them in this project.
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: as-github-pr-update
|
|
3
|
-
description: Update PR description based on current work
|
|
4
|
-
# bundle: wfi://github/pr/update
|
|
5
|
-
# agent: general-purpose
|
|
6
|
-
user-invocable: true
|
|
7
|
-
allowed-tools:
|
|
8
|
-
- Bash(ace-git:*)
|
|
9
|
-
- Bash(ace-bundle:*)
|
|
10
|
-
- Bash(gh:*)
|
|
11
|
-
- Read
|
|
12
|
-
- Grep
|
|
13
|
-
argument-hint: pr-number
|
|
14
|
-
last_modified: 2026-01-10
|
|
15
|
-
source: ace-git
|
|
16
|
-
integration:
|
|
17
|
-
targets:
|
|
18
|
-
- claude
|
|
19
|
-
- codex
|
|
20
|
-
- gemini
|
|
21
|
-
- opencode
|
|
22
|
-
- pi
|
|
23
|
-
assign:
|
|
24
|
-
source: wfi://github/pr/update
|
|
25
|
-
steps:
|
|
26
|
-
- name: update-pr-desc
|
|
27
|
-
description: Update PR description with implementation summary and final state
|
|
28
|
-
intent:
|
|
29
|
-
phrases:
|
|
30
|
-
- "update pr description"
|
|
31
|
-
- "update pull request description"
|
|
32
|
-
- "refresh pr description"
|
|
33
|
-
- "sync pr description"
|
|
34
|
-
tags: [git, pr, documentation]
|
|
35
|
-
skill:
|
|
36
|
-
kind: workflow
|
|
37
|
-
execution:
|
|
38
|
-
workflow: wfi://github/pr/update
|
|
39
|
-
---
|
|
40
|
-
|
|
41
|
-
Load and run `ace-bundle wfi://github/pr/update` in the current project, then follow the loaded workflow as the source of truth and execute it end-to-end instead of only summarizing it.
|
|
@@ -1,282 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
doc-type: workflow
|
|
3
|
-
title: Pull Request Creation Workflow
|
|
4
|
-
purpose: pull request creation workflow
|
|
5
|
-
ace-docs:
|
|
6
|
-
last-updated: 2026-03-04
|
|
7
|
-
last-checked: 2026-03-21
|
|
8
|
-
---
|
|
9
|
-
|
|
10
|
-
# Pull Request Creation Workflow
|
|
11
|
-
|
|
12
|
-
## Purpose
|
|
13
|
-
|
|
14
|
-
Create pull requests with descriptions sourced from code evidence (diff, commits, tests, changelogs), using consistent section structure.
|
|
15
|
-
|
|
16
|
-
## Variables
|
|
17
|
-
|
|
18
|
-
- `$pr_type`: `feature`, `bugfix`, or `default`
|
|
19
|
-
- `$target_branch`: target branch (default resolved from task/worktree context)
|
|
20
|
-
- `$draft`: create as draft (`false` by default)
|
|
21
|
-
|
|
22
|
-
## Instructions
|
|
23
|
-
|
|
24
|
-
### 1. Pre-PR Verification
|
|
25
|
-
|
|
26
|
-
```bash
|
|
27
|
-
git branch --show-current
|
|
28
|
-
git status
|
|
29
|
-
git log origin/${target_branch:-main}..HEAD --oneline
|
|
30
|
-
ace-test
|
|
31
|
-
```
|
|
32
|
-
|
|
33
|
-
Checklist:
|
|
34
|
-
- [ ] All changes committed
|
|
35
|
-
- [ ] Relevant tests pass
|
|
36
|
-
- [ ] CHANGELOG updated if release notes changed
|
|
37
|
-
- [ ] No sensitive data in diff
|
|
38
|
-
|
|
39
|
-
### 2. Resolve Target Branch
|
|
40
|
-
|
|
41
|
-
Prefer task/worktree metadata from `_current/*.s.md` (`worktree.target_branch`), fallback to `main`.
|
|
42
|
-
|
|
43
|
-
```bash
|
|
44
|
-
task_file=$(ls _current/*.s.md 2>/dev/null | head -1)
|
|
45
|
-
```
|
|
46
|
-
|
|
47
|
-
If subtask context exists and current target is `main`, switch target to parent task branch.
|
|
48
|
-
|
|
49
|
-
### 3. Push Branch
|
|
50
|
-
|
|
51
|
-
```bash
|
|
52
|
-
git push -u origin "$(git branch --show-current)"
|
|
53
|
-
```
|
|
54
|
-
|
|
55
|
-
**If push is rejected (non-fast-forward)**:
|
|
56
|
-
- For feature branches with worktree-based divergence, prefer `git push --force-with-lease`
|
|
57
|
-
- For shared branches or uncertain divergence, ask the user before force-pushing or rebasing
|
|
58
|
-
- Do NOT silently rebase โ this is a potentially destructive operation requiring user consent
|
|
59
|
-
|
|
60
|
-
### 4. Build Evidence Inputs
|
|
61
|
-
|
|
62
|
-
Before writing the body, collect evidence:
|
|
63
|
-
|
|
64
|
-
```bash
|
|
65
|
-
git log origin/${target_branch:-main}..HEAD --oneline
|
|
66
|
-
ace-git diff --format grouped-stats
|
|
67
|
-
```
|
|
68
|
-
|
|
69
|
-
And collect:
|
|
70
|
-
- Behavioral evidence from diff (old behavior vs new behavior)
|
|
71
|
-
- Test evidence (test names -> behavior proved, suite totals)
|
|
72
|
-
- Release evidence (CHANGELOG additions)
|
|
73
|
-
|
|
74
|
-
### 5. Draft PR Body with Required Sections
|
|
75
|
-
|
|
76
|
-
Use this order:
|
|
77
|
-
|
|
78
|
-
```markdown
|
|
79
|
-
## ๐ Summary
|
|
80
|
-
## โ๏ธ Changes
|
|
81
|
-
## ๐ File Changes
|
|
82
|
-
## ๐งช Test Evidence
|
|
83
|
-
## ๐ฆ Releases
|
|
84
|
-
## ๐ฎ Demo
|
|
85
|
-
```
|
|
86
|
-
|
|
87
|
-
Section sourcing rules:
|
|
88
|
-
|
|
89
|
-
| Section | Data Source | Avoid |
|
|
90
|
-
|---|---|---|
|
|
91
|
-
| Summary | Diff behavior and user pain removed | Restating task objective text |
|
|
92
|
-
| Changes | Concern-grouped code changes linked to commits | Raw commit dump |
|
|
93
|
-
| File Changes | `ace-git diff --format grouped-stats` | Manual unstructured file list |
|
|
94
|
-
| Test Evidence | Test names mapped to behaviors + totals | Raw command output paste |
|
|
95
|
-
| Releases | CHANGELOG diff entries | Duplicating Changes section |
|
|
96
|
-
| Demo | Runnable commands from README/usage.md + observed output | Screenshots, prose-only descriptions without commands |
|
|
97
|
-
|
|
98
|
-
**Grouped-stats formatting rule:**
|
|
99
|
-
- The `## ๐ File Changes` section must wrap grouped-stats output inside a fenced code block (```)
|
|
100
|
-
- Paste the output exactly as produced โ preserve all column alignment, tree indentation, and emoji markers
|
|
101
|
-
- Never convert grouped-stats output into bullet lists, tables, or prose
|
|
102
|
-
|
|
103
|
-
Summary writing rules:
|
|
104
|
-
- Start with what is easier now
|
|
105
|
-
- Mention what users/reviewers had to do before
|
|
106
|
-
- Do not lead with method/class names
|
|
107
|
-
- Do not use task-spec text as prose source
|
|
108
|
-
|
|
109
|
-
Bullet formatting rules:
|
|
110
|
-
- **Bold the first key term** in each bullet (feature name, class name, CLI flag, or config key) so it serves as a visual anchor before the explanation. Example: `- Add **\`GroupedStatsFormatter\`**: formats numstat output into...`
|
|
111
|
-
- In Test Evidence, bold the test class name: `- **GroupedStatsFormatterTest** (6 tests) โ validates...`
|
|
112
|
-
- In Releases, bold the package+version: `- **ace-git v0.11.0โv0.11.6** โ Add grouped-stats format...`
|
|
113
|
-
|
|
114
|
-
Demo section rules:
|
|
115
|
-
- Include `## ๐ฎ Demo` when the PR introduces a user-facing CLI or runnable entry point
|
|
116
|
-
- Structure: `### Run` (exact command), `### Expected Output`, `### Artifacts` (where to find results)
|
|
117
|
-
- Omit when: no user-facing CLI, no runnable entry point, or purely internal refactoring
|
|
118
|
-
|
|
119
|
-
Omission/fallback rules:
|
|
120
|
-
- No changelog evidence -> omit `## ๐ฆ Releases`
|
|
121
|
-
- No test-file evidence -> `## ๐งช Test Evidence` may include totals-only validation
|
|
122
|
-
- grouped-stats unavailable -> fallback to flat file list in `## ๐ File Changes`
|
|
123
|
-
- No user-facing CLI or runnable entry point -> omit `## ๐ฎ Demo`
|
|
124
|
-
- Omit any section lacking evidence; never leave empty placeholders
|
|
125
|
-
|
|
126
|
-
#### Grouped-stats example
|
|
127
|
-
|
|
128
|
-
Correct โ output wrapped in a fenced code block preserving all formatting:
|
|
129
|
-
|
|
130
|
-
````
|
|
131
|
-
## ๐ File Changes
|
|
132
|
-
|
|
133
|
-
```
|
|
134
|
-
+762, -54 34 files total
|
|
135
|
-
|
|
136
|
-
+358, -35 10 files ace-overseer/
|
|
137
|
-
+117, -18 4 files ๐งฑ lib/
|
|
138
|
-
+19, -3 ace/overseer/cli/commands/work_on.rb
|
|
139
|
-
```
|
|
140
|
-
````
|
|
141
|
-
|
|
142
|
-
Incorrect โ reformatted into bullet list (loses tree structure and alignment):
|
|
143
|
-
|
|
144
|
-
```
|
|
145
|
-
## ๐ File Changes
|
|
146
|
-
|
|
147
|
-
- ace-overseer/lib/ace/overseer/cli/commands/work_on.rb (+19, -3)
|
|
148
|
-
- ace-overseer/lib/ace/overseer/molecules/assignment_launcher.rb (+42, -8)
|
|
149
|
-
```
|
|
150
|
-
|
|
151
|
-
### 6. Create PR
|
|
152
|
-
|
|
153
|
-
```bash
|
|
154
|
-
gh pr create \
|
|
155
|
-
--title "<task-id-or-type>: <user-impact-description>" \
|
|
156
|
-
--body-file pr-description.md \
|
|
157
|
-
--base "${target_branch:-main}"
|
|
158
|
-
```
|
|
159
|
-
|
|
160
|
-
Optional draft mode:
|
|
161
|
-
|
|
162
|
-
```bash
|
|
163
|
-
gh pr create --draft --title "..." --body-file pr-description.md --base "${target_branch:-main}"
|
|
164
|
-
```
|
|
165
|
-
|
|
166
|
-
### 7. Add Metadata (Optional)
|
|
167
|
-
|
|
168
|
-
```bash
|
|
169
|
-
gh pr edit --add-reviewer @reviewer1,@reviewer2
|
|
170
|
-
gh pr edit --add-label "enhancement,needs-review"
|
|
171
|
-
```
|
|
172
|
-
|
|
173
|
-
### 8. Verify PR
|
|
174
|
-
|
|
175
|
-
```bash
|
|
176
|
-
gh pr view
|
|
177
|
-
gh pr checks
|
|
178
|
-
```
|
|
179
|
-
|
|
180
|
-
## Success Criteria
|
|
181
|
-
|
|
182
|
-
- PR created with evidence-based body
|
|
183
|
-
- Section order matches required structure
|
|
184
|
-
- Summary is user-impact-first and task-spec-independent
|
|
185
|
-
- File changes sourced from grouped-stats (or fallback)
|
|
186
|
-
- Test evidence maps tests to behavior
|
|
187
|
-
- Releases only included when changelog evidence exists
|
|
188
|
-
|
|
189
|
-
## Response Template
|
|
190
|
-
|
|
191
|
-
**PR Created:** [URL]
|
|
192
|
-
**PR Number:** #[number]
|
|
193
|
-
**Title:** [PR title]
|
|
194
|
-
**Type:** [feature/bugfix/default]
|
|
195
|
-
**Status:** [created|draft|failed]
|
|
196
|
-
|
|
197
|
-
<documents>
|
|
198
|
-
<template path="ace-git/handbook/templates/pr/feature.template.md">
|
|
199
|
-
## ๐ Summary
|
|
200
|
-
|
|
201
|
-
[What is easier now for users/reviewers]
|
|
202
|
-
[What pain/manual step/error existed before]
|
|
203
|
-
|
|
204
|
-
## โ๏ธ Changes
|
|
205
|
-
|
|
206
|
-
- Add **`[FeatureName]`**: [what it does]
|
|
207
|
-
- Add **`[ClassName]`** to [what it enables]
|
|
208
|
-
|
|
209
|
-
## ๐ File Changes
|
|
210
|
-
|
|
211
|
-
[Paste `ace-git diff --format grouped-stats` output verbatim inside a fenced code block โ preserve all spacing and tree structure]
|
|
212
|
-
[Fallback: flat file list if grouped-stats unavailable]
|
|
213
|
-
|
|
214
|
-
## ๐งช Test Evidence
|
|
215
|
-
|
|
216
|
-
- **[TestClassName]** ([N] tests) โ [behavior validated]
|
|
217
|
-
- Suite totals: [passed]/[total]
|
|
218
|
-
|
|
219
|
-
## ๐ฆ Releases
|
|
220
|
-
|
|
221
|
-
- **[package vX.Y.Z]** โ [CHANGELOG entry from diff]
|
|
222
|
-
|
|
223
|
-
## ๐ฎ Demo
|
|
224
|
-
|
|
225
|
-
[Runnable command(s) demonstrating the feature โ omit section if no user-facing CLI]
|
|
226
|
-
[Expected output and artifact locations]
|
|
227
|
-
</template>
|
|
228
|
-
|
|
229
|
-
<template path="ace-git/handbook/templates/pr/bugfix.template.md">
|
|
230
|
-
## ๐ Summary
|
|
231
|
-
|
|
232
|
-
[What broke and what is now fixed]
|
|
233
|
-
|
|
234
|
-
## โ๏ธ Changes
|
|
235
|
-
|
|
236
|
-
- Fix **`[ErrorType]`** when [condition] ([commit-sha])
|
|
237
|
-
- Add **`[TestName]`** to guard against regression ([commit-sha])
|
|
238
|
-
|
|
239
|
-
## ๐ File Changes
|
|
240
|
-
|
|
241
|
-
[Paste `ace-git diff --format grouped-stats` output verbatim inside a fenced code block โ preserve all spacing and tree structure]
|
|
242
|
-
|
|
243
|
-
## ๐งช Test Evidence
|
|
244
|
-
|
|
245
|
-
- **[TestClassName]** ([N] tests) โ [regression behavior covered]
|
|
246
|
-
- Suite totals: [passed]/[total]
|
|
247
|
-
|
|
248
|
-
## ๐ฆ Releases
|
|
249
|
-
|
|
250
|
-
- **[package vX.Y.Z]** โ [CHANGELOG fix entry from diff]
|
|
251
|
-
</template>
|
|
252
|
-
|
|
253
|
-
<template path="ace-git/handbook/templates/pr/default.template.md">
|
|
254
|
-
## ๐ Summary
|
|
255
|
-
|
|
256
|
-
[What is easier now]
|
|
257
|
-
[What changed from user/reviewer perspective]
|
|
258
|
-
|
|
259
|
-
## โ๏ธ Changes
|
|
260
|
-
|
|
261
|
-
- Add **`[PrimaryChange]`**: [description] ([commit-sha])
|
|
262
|
-
- Update **`[SecondaryChange]`**: [description] ([commit-sha])
|
|
263
|
-
|
|
264
|
-
## ๐ File Changes
|
|
265
|
-
|
|
266
|
-
[Paste `ace-git diff --format grouped-stats` output verbatim inside a fenced code block โ preserve all spacing and tree structure]
|
|
267
|
-
|
|
268
|
-
## ๐งช Test Evidence
|
|
269
|
-
|
|
270
|
-
- **[TestClassName]** ([N] tests) โ [behavior validated]
|
|
271
|
-
- Suite totals: [passed]/[total]
|
|
272
|
-
|
|
273
|
-
## ๐ฆ Releases
|
|
274
|
-
|
|
275
|
-
- **[package vX.Y.Z]** โ [CHANGELOG entry from diff, if any]
|
|
276
|
-
|
|
277
|
-
## ๐ฎ Demo
|
|
278
|
-
|
|
279
|
-
[Runnable command(s) demonstrating the change โ omit section if no user-facing CLI]
|
|
280
|
-
[Expected output and artifact locations]
|
|
281
|
-
</template>
|
|
282
|
-
</documents>
|
|
@@ -1,203 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
doc-type: workflow
|
|
3
|
-
title: Update PR Description Workflow
|
|
4
|
-
purpose: evidence-based PR documentation
|
|
5
|
-
ace-docs:
|
|
6
|
-
last-updated: 2026-03-04
|
|
7
|
-
last-checked: 2026-03-21
|
|
8
|
-
---
|
|
9
|
-
|
|
10
|
-
# Update PR Description Workflow
|
|
11
|
-
|
|
12
|
-
## Purpose
|
|
13
|
-
|
|
14
|
-
Generate PR titles and descriptions from code evidence in the PR (diff, commits, tests, and changelog entries), not from task specification text.
|
|
15
|
-
|
|
16
|
-
## Variables
|
|
17
|
-
|
|
18
|
-
- `$pr_number`: PR number to update (optional - auto-detect from current branch)
|
|
19
|
-
|
|
20
|
-
## Instructions
|
|
21
|
-
|
|
22
|
-
### 1. Resolve PR Number
|
|
23
|
-
|
|
24
|
-
```bash
|
|
25
|
-
gh pr view --json number -q .number
|
|
26
|
-
```
|
|
27
|
-
|
|
28
|
-
If no PR exists for current branch, ask the user for the target PR number.
|
|
29
|
-
|
|
30
|
-
### 2. Verify Target Branch
|
|
31
|
-
|
|
32
|
-
```bash
|
|
33
|
-
gh pr view $pr_number --json baseRefName,headRefName,title
|
|
34
|
-
ace-task status
|
|
35
|
-
```
|
|
36
|
-
|
|
37
|
-
If taskflow context indicates a subtask and the PR targets `main`, retarget to the parent task branch before continuing.
|
|
38
|
-
|
|
39
|
-
### 3. Collect Evidence Inputs
|
|
40
|
-
|
|
41
|
-
Collect the evidence used to write the PR:
|
|
42
|
-
|
|
43
|
-
```bash
|
|
44
|
-
# Changed files
|
|
45
|
-
gh pr diff $pr_number --name-only
|
|
46
|
-
|
|
47
|
-
# Full diff for behavior and error-message changes
|
|
48
|
-
gh pr diff $pr_number
|
|
49
|
-
|
|
50
|
-
# Commit headlines
|
|
51
|
-
gh pr view $pr_number --json commits -q '.commits[].messageHeadline'
|
|
52
|
-
|
|
53
|
-
# File-change grouping (preferred)
|
|
54
|
-
ace-git diff $(git merge-base HEAD origin/main)..HEAD --format grouped-stats
|
|
55
|
-
```
|
|
56
|
-
|
|
57
|
-
Also gather test evidence and release evidence:
|
|
58
|
-
- Test evidence: test files changed in diff + relevant test outputs/suite totals
|
|
59
|
-
- Release evidence: CHANGELOG entries present in diff
|
|
60
|
-
|
|
61
|
-
### 4. Generate Evidence-Based Title
|
|
62
|
-
|
|
63
|
-
Title format:
|
|
64
|
-
- If task ID available from `ace-git status --no-pr`: `<task-id>: <description>`
|
|
65
|
-
- Otherwise: `<type>(<scope>): <description>`
|
|
66
|
-
|
|
67
|
-
Title guidance:
|
|
68
|
-
- Focus on user-facing impact
|
|
69
|
-
- Keep concise (target < 60 chars after task-id)
|
|
70
|
-
- Do not lead with class/method names unless unavoidable
|
|
71
|
-
|
|
72
|
-
### 5. Generate PR Description
|
|
73
|
-
|
|
74
|
-
Use this section order exactly:
|
|
75
|
-
|
|
76
|
-
```markdown
|
|
77
|
-
## ๐ Summary
|
|
78
|
-
## โ๏ธ Changes
|
|
79
|
-
## ๐ File Changes
|
|
80
|
-
## ๐งช Test Evidence
|
|
81
|
-
## ๐ฆ Releases
|
|
82
|
-
## ๐ฎ Demo
|
|
83
|
-
```
|
|
84
|
-
|
|
85
|
-
Section sourcing rules:
|
|
86
|
-
|
|
87
|
-
| Section | Required Source | Avoid |
|
|
88
|
-
|---|---|---|
|
|
89
|
-
| Summary | Behavioral change in diff + commit intent | Task spec objective text |
|
|
90
|
-
| Changes | Concern-grouped diff changes, traced to commits | Raw commit list dump |
|
|
91
|
-
| File Changes | `ace-git diff $(git merge-base HEAD origin/main)..HEAD --format grouped-stats` output, pasted verbatim and in full | Manual hand-written file listing, trimming or abbreviating the grouped-stats output |
|
|
92
|
-
| Test Evidence | Test names mapped to behaviors + suite totals | Raw unstructured test output paste |
|
|
93
|
-
| Releases | CHANGELOG entries from diff | Repeating content already in Changes |
|
|
94
|
-
| Demo | Runnable commands from README/usage.md + observed output | Screenshots, prose-only descriptions without commands |
|
|
95
|
-
|
|
96
|
-
**Grouped-stats formatting rule:**
|
|
97
|
-
- The `## ๐ File Changes` section must wrap grouped-stats output inside a fenced code block (```)
|
|
98
|
-
- Paste the output exactly as produced โ preserve all column alignment, tree indentation, and emoji markers
|
|
99
|
-
- Never convert grouped-stats output into bullet lists, tables, or prose
|
|
100
|
-
|
|
101
|
-
Bullet formatting rules:
|
|
102
|
-
- **Bold the first key term** in each bullet (feature name, class name, CLI flag, or config key) so it serves as a visual anchor before the explanation. Example: `- Add **\`GroupedStatsFormatter\`**: formats numstat output into...`
|
|
103
|
-
- In Test Evidence, bold the test class name: `- **GroupedStatsFormatterTest** (6 tests) โ validates...`
|
|
104
|
-
- In Releases, bold the package+version: `- **ace-git v0.11.0โv0.11.6** โ Add grouped-stats format...`
|
|
105
|
-
|
|
106
|
-
### 6. Summary Writing Rules
|
|
107
|
-
|
|
108
|
-
Write Summary in this sequence:
|
|
109
|
-
1. What is easier now for users/reviewers
|
|
110
|
-
2. What pain/manual step/error state existed before
|
|
111
|
-
3. What changed to remove that pain
|
|
112
|
-
|
|
113
|
-
Constraints:
|
|
114
|
-
- Do not copy wording from task specs
|
|
115
|
-
- Do not start with method/class names
|
|
116
|
-
- Prefer behavior language over implementation language
|
|
117
|
-
|
|
118
|
-
### 7. Demo Section Rules
|
|
119
|
-
|
|
120
|
-
Include `## ๐ฎ Demo` when the PR introduces a user-facing CLI command or runnable entry point that a reviewer can try.
|
|
121
|
-
|
|
122
|
-
When a PR adds or changes multiple distinct user-facing modes, list each mode explicitly in `## ๐ฎ Demo` instead of showing only one representative command. Examples: mutually exclusive flags (`--yaml` vs `--task`) or sibling commands like `add --step`, `add --yaml`, and `add --task`.
|
|
123
|
-
|
|
124
|
-
Structure:
|
|
125
|
-
|
|
126
|
-
```markdown
|
|
127
|
-
## ๐ฎ Demo
|
|
128
|
-
|
|
129
|
-
### Run
|
|
130
|
-
\`\`\`bash
|
|
131
|
-
[exact commands to copy-paste]
|
|
132
|
-
\`\`\`
|
|
133
|
-
|
|
134
|
-
### Expected Output
|
|
135
|
-
[what the reviewer should see]
|
|
136
|
-
|
|
137
|
-
### Artifacts
|
|
138
|
-
[where to find generated files]
|
|
139
|
-
```
|
|
140
|
-
|
|
141
|
-
Omit when: the PR has no user-facing CLI, no runnable entry point, or is purely internal refactoring.
|
|
142
|
-
|
|
143
|
-
**Recorded demo integration**: If a recorded demo GIF has been attached as a PR comment (via `ace-demo record --pr`), reference it in the Demo section: "See attached demo recording in PR comments below" alongside the runnable commands. The recorded demo supplements but does not replace the runnable commands.
|
|
144
|
-
|
|
145
|
-
### 8. Omission and Fallback Rules
|
|
146
|
-
|
|
147
|
-
- If no changelog evidence: omit `## ๐ฆ Releases`
|
|
148
|
-
- If no test-file evidence: keep `## ๐งช Test Evidence` with suite totals only
|
|
149
|
-
- If `ace-git diff $(git merge-base HEAD origin/main)..HEAD --format grouped-stats` is unavailable: use flat file list fallback under `## ๐ File Changes`
|
|
150
|
-
- If no user-facing CLI or runnable entry point: omit `## ๐ฎ Demo`
|
|
151
|
-
- Omit sections with no supporting evidence instead of leaving placeholders
|
|
152
|
-
|
|
153
|
-
#### Grouped-stats example
|
|
154
|
-
|
|
155
|
-
Correct โ output wrapped in a fenced code block preserving all formatting:
|
|
156
|
-
|
|
157
|
-
````
|
|
158
|
-
## ๐ File Changes
|
|
159
|
-
|
|
160
|
-
```
|
|
161
|
-
+762, -54 34 files total
|
|
162
|
-
|
|
163
|
-
+358, -35 10 files ace-overseer/
|
|
164
|
-
+117, -18 4 files ๐งฑ lib/
|
|
165
|
-
+19, -3 ace/overseer/cli/commands/work_on.rb
|
|
166
|
-
```
|
|
167
|
-
````
|
|
168
|
-
|
|
169
|
-
Incorrect โ reformatted into bullet list (loses tree structure and alignment):
|
|
170
|
-
|
|
171
|
-
```
|
|
172
|
-
## ๐ File Changes
|
|
173
|
-
|
|
174
|
-
- ace-overseer/lib/ace/overseer/cli/commands/work_on.rb (+19, -3)
|
|
175
|
-
- ace-overseer/lib/ace/overseer/molecules/assignment_launcher.rb (+42, -8)
|
|
176
|
-
```
|
|
177
|
-
|
|
178
|
-
### 9. Update PR
|
|
179
|
-
|
|
180
|
-
```bash
|
|
181
|
-
gh pr edit $pr_number \
|
|
182
|
-
--title "Generated title" \
|
|
183
|
-
--body "$(cat <<'BODY'
|
|
184
|
-
## ๐ Summary
|
|
185
|
-
...
|
|
186
|
-
BODY
|
|
187
|
-
)"
|
|
188
|
-
```
|
|
189
|
-
|
|
190
|
-
### 10. Confirm Update
|
|
191
|
-
|
|
192
|
-
```bash
|
|
193
|
-
gh pr view $pr_number --json url,title -q '.url + "\n" + .title'
|
|
194
|
-
```
|
|
195
|
-
|
|
196
|
-
## Success Criteria
|
|
197
|
-
|
|
198
|
-
- Description uses: `๐ Summary -> โ๏ธ Changes -> ๐ File Changes -> ๐งช Test Evidence -> ๐ฆ Releases -> ๐ฎ Demo`
|
|
199
|
-
- Summary leads with user impact and does not restate task specs
|
|
200
|
-
- File Changes contains the complete, untruncated grouped-stats output (never trimmed, summarised, or selectively omitted)
|
|
201
|
-
- Test Evidence maps tests to behavior and includes totals
|
|
202
|
-
- Releases derived from changelog evidence only
|
|
203
|
-
- Empty/no-evidence sections are omitted
|