ace-git-commit 0.23.6 → 0.26.3
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/.ace-defaults/git/commit.yml +6 -1
- data/CHANGELOG.md +85 -0
- data/README.md +11 -0
- data/handbook/prompts/git-commit.system.md +1 -1
- data/handbook/workflow-instructions/git/commit.wf.md +16 -1
- data/lib/ace/git_commit/atoms/gitignore_checker.rb +1 -1
- data/lib/ace/git_commit/cli/commands/commit.rb +7 -2
- data/lib/ace/git_commit/molecules/message_generator.rb +29 -5
- data/lib/ace/git_commit/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 2599fd8c9470d524bf85ca5eb8b50e612a62936dbda4a5d75b0b2576361d8c2f
|
|
4
|
+
data.tar.gz: b1b83adf72a08ff94c13fdeecb70be43574431255fab3a144d01fb3c92afd1cd
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 61cf4c04784c908d0f5257db3021fe1f3aa34b24212b6b7af8c950190fd23aa5c6f64b841ce8aa300dc00d416821f0b4863cc21c9956c813cd94fa4a067ae4a8
|
|
7
|
+
data.tar.gz: 5853eef8a0bd648f524254e3081f997f4d54ecfd9270150e090476601c5c5a460c7eec520462becd0fec3dcd518121480d27545ec10de05f1384500a9eae9bc2
|
data/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,91 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.26.3] - 2026-04-24
|
|
11
|
+
|
|
12
|
+
### Changed
|
|
13
|
+
- Clarified first-setup commit recovery across quick-start, package docs, and workflow guidance so users can inspect staged setup files, use the deterministic `--only-staged --no-split -m` path, and treat LLM-backed generation as optional after readiness checks.
|
|
14
|
+
|
|
15
|
+
## [0.26.2] - 2026-04-23
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
### Changed
|
|
19
|
+
- Clarified staged-only and setup-failure commit workflows, including explicit path-scoped command contracts for single-package commits and recovery guidance.
|
|
20
|
+
- Added commit contract coverage for staged-first and fallback paths so split/no-split behavior is deterministic before automatic path-scoped commit flow.
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
## [0.26.1] - 2026-04-22
|
|
24
|
+
|
|
25
|
+
### Technical
|
|
26
|
+
- Tightened `TS-COMMIT-001` Goal 7/8 staging contracts to require explicit-path staging and prove `results/` artifacts are excluded from the cached staged set before `--only-staged` execution.
|
|
27
|
+
|
|
28
|
+
## [0.26.0] - 2026-04-22
|
|
29
|
+
|
|
30
|
+
### Changed
|
|
31
|
+
- Improved setup-time LLM failure diagnostics to include failed role/model context, provider/setup remediation commands, and a deterministic `--only-staged --no-split -m` fallback commit path.
|
|
32
|
+
|
|
33
|
+
### Technical
|
|
34
|
+
- Extended `TS-COMMIT-001` with goal 8 setup-failure guidance coverage and added fast tests for role/model failure guidance and explicit CLI error routing.
|
|
35
|
+
|
|
36
|
+
## [0.25.4] - 2026-04-16
|
|
37
|
+
|
|
38
|
+
### Technical
|
|
39
|
+
- Split the retained dry-run and path-scoped commit E2E capture into explicit `dry-run/` and `path-only/` artifact sets so verification requires both halves of the public workflow.
|
|
40
|
+
|
|
41
|
+
## [0.25.3] - 2026-04-16
|
|
42
|
+
|
|
43
|
+
### Technical
|
|
44
|
+
- Relaxed `TS-COMMIT-001` auto-split verification to prove split behavior and path scoping without depending on an exact commit-count shape from the coordinated commit set.
|
|
45
|
+
|
|
46
|
+
## [0.25.2] - 2026-04-16
|
|
47
|
+
|
|
48
|
+
### Fixed
|
|
49
|
+
- Strengthened `TS-COMMIT-001` delete/rename verification around explicit final-state artifacts so the retained E2E flow no longer depends on Git rename heuristics from `git show --stat`.
|
|
50
|
+
|
|
51
|
+
## [0.25.1] - 2026-04-16
|
|
52
|
+
|
|
53
|
+
### Fixed
|
|
54
|
+
- Relaxed dry-run E2E verification to accept equivalent proof that dry-run preserved HEAD and did not silently commit staged changes before the subsequent path-scoped commit.
|
|
55
|
+
|
|
56
|
+
## [0.25.0] - 2026-04-15
|
|
57
|
+
|
|
58
|
+
### Changed
|
|
59
|
+
- Rewrote `TS-COMMIT-001` split/no-split E2E goals around explicit public
|
|
60
|
+
setup and impact-first verification, and added `TC-007-only-staged-contract`
|
|
61
|
+
coverage for the staged-only user journey.
|
|
62
|
+
- Expanded `docs/usage.md` and CLI help text with reproducible split/no-split
|
|
63
|
+
setup guidance and explicit `--only-staged` git-state expectations.
|
|
64
|
+
|
|
65
|
+
## [0.24.2] - 2026-04-13
|
|
66
|
+
|
|
67
|
+
### Technical
|
|
68
|
+
- Tightened the package version contract test to require a full semantic-version match instead of accepting partial matches.
|
|
69
|
+
## [0.24.1] - 2026-04-13
|
|
70
|
+
|
|
71
|
+
### Changed
|
|
72
|
+
- Completed the batch i05 migration follow-through for this package and aligned it with the restarted `fast` / `feat` / `e2e` verification model.
|
|
73
|
+
|
|
74
|
+
### Technical
|
|
75
|
+
- Included in the coordinated assignment-driven patch release for batch i05 package updates.
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
## [0.24.0] - 2026-04-12
|
|
79
|
+
|
|
80
|
+
### Changed
|
|
81
|
+
- Migrated package tests to the restarted `fast` / `feat` / `e2e` model by moving deterministic suite files into `test/fast/` and keeping scenario workflows in `test/e2e/`.
|
|
82
|
+
- Added `unit-coverage-reviewed` metadata for `TS-COMMIT-001` and aligned scenario sandbox setup to support `${ACE_E2E_SOURCE_ROOT:-$PROJECT_ROOT_PATH}`.
|
|
83
|
+
- Updated package docs (`README`, `docs/usage.md`, `docs/getting-started.md`) to teach the restarted testing contract (`ace-test`, `ace-test ... feat`, `ace-test-e2e`, `ace-test ... all`).
|
|
84
|
+
|
|
85
|
+
### Changed
|
|
86
|
+
- **ace-git-commit v0.23.8**: Release workflow now loads git context for commit guidance and JSON status data from bundled workflow sections.
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
## [0.23.7] - 2026-04-10
|
|
90
|
+
|
|
91
|
+
### Fixed
|
|
92
|
+
- Restored packaged default split configuration (`git.split.enabled: true`, `git.split.strategy: config-scope`) and documented `--no-split` as the explicit single-commit override.
|
|
93
|
+
- Added packaged-default regression coverage in `test/default_config_test.rb` to enforce the split-default contract.
|
|
94
|
+
|
|
10
95
|
## [0.23.6] - 2026-03-31
|
|
11
96
|
|
|
12
97
|
### Changed
|
data/README.md
CHANGED
|
@@ -36,6 +36,17 @@
|
|
|
36
36
|
|
|
37
37
|
**Preview and control commit behavior safely** - use `--dry-run` to preview, `--only-staged` for strict staging, or `-m` for explicit messages, with configuration cascade from [ace-support-config](../ace-support-config) for project and user overrides.
|
|
38
38
|
|
|
39
|
+
For the retained public verification flows, see the reproducible examples in the [Usage Guide](docs/usage.md#reproducible-split-and-no-split-setup) and [`--only-staged` expected git state](docs/usage.md#--only-staged-expected-git-state).
|
|
40
|
+
|
|
41
|
+
## Testing Contract
|
|
42
|
+
|
|
43
|
+
`ace-git-commit` follows the restarted package test model:
|
|
44
|
+
|
|
45
|
+
- `ace-test ace-git-commit` for deterministic fast-loop coverage (`test/fast/`)
|
|
46
|
+
- `ace-test ace-git-commit feat` when deterministic feature/contract coverage is present (`test/feat/`)
|
|
47
|
+
- `ace-test-e2e ace-git-commit` for retained workflow scenarios (`test/e2e/`)
|
|
48
|
+
- `ace-test ace-git-commit all` for full package verification
|
|
49
|
+
|
|
39
50
|
## Configuration
|
|
40
51
|
|
|
41
52
|
Override the default LLM model in `.ace/git/commit.yml` (see [defaults](.ace-defaults/git/commit.yml) for all options), or replace any prompt template in `.ace-handbook/prompts/` to match your commit style.
|
|
@@ -140,7 +140,7 @@ When multiple files are changed:
|
|
|
140
140
|
Describe the action, not the content:
|
|
141
141
|
- The subject must describe what this commit DOES to the codebase
|
|
142
142
|
- Do NOT summarize the content of changed files as if that content is the change itself
|
|
143
|
-
- Example: deleting a task spec about "rename X to Y" → `spec(task-272): remove specflow-rename task` NOT `spec(taskflow-rename): rename ace-
|
|
143
|
+
- Example: deleting a task spec about "rename X to Y" → `spec(task-272): remove specflow-rename task` NOT `spec(taskflow-rename): rename ace-task to ace-specflow`
|
|
144
144
|
- Example: deleting a deprecated module → `refactor(auth): remove legacy OAuth handler` NOT `refactor(auth): OAuth 1.0 authentication flow`
|
|
145
145
|
|
|
146
146
|
When all changes are deletions:
|
|
@@ -5,6 +5,19 @@ purpose: commit workflow instruction
|
|
|
5
5
|
ace-docs:
|
|
6
6
|
last-updated: 2026-03-15
|
|
7
7
|
last-checked: 2026-03-21
|
|
8
|
+
bundle:
|
|
9
|
+
embed_document_source: true
|
|
10
|
+
params:
|
|
11
|
+
output: cache
|
|
12
|
+
max_size: 81920
|
|
13
|
+
timeout: 30
|
|
14
|
+
sections:
|
|
15
|
+
current_repository_status:
|
|
16
|
+
title: Current Repository Status
|
|
17
|
+
commands:
|
|
18
|
+
- git status -sb
|
|
19
|
+
- git diff --stat
|
|
20
|
+
- ace-git status --format json
|
|
8
21
|
---
|
|
9
22
|
|
|
10
23
|
# Commit Workflow
|
|
@@ -46,6 +59,7 @@ ace-git-commit automatically:
|
|
|
46
59
|
- Specific files: `ace-git-commit file1 file2`
|
|
47
60
|
- Only staged: `ace-git-commit --only-staged`
|
|
48
61
|
- Dry run first: `ace-git-commit --dry-run -i "$intention"`
|
|
62
|
+
- First setup snapshot after provider-readiness issues: `ace-git-commit --only-staged --no-split -m "chore: set up ace tooling"`
|
|
49
63
|
|
|
50
64
|
3. **Verify result**:
|
|
51
65
|
```bash
|
|
@@ -58,6 +72,7 @@ ace-git-commit automatically:
|
|
|
58
72
|
- `-m, --message`: Use direct message (bypass LLM)
|
|
59
73
|
- `--model MODEL`: Override LLM model (e.g., gflash)
|
|
60
74
|
- `-s, --only-staged`: Commit only staged changes
|
|
75
|
+
- `--no-split`: Force one commit across detected scopes
|
|
61
76
|
- `-n, --dry-run`: Preview without committing
|
|
62
77
|
- `-d, --debug`: Enable debug output
|
|
63
78
|
|
|
@@ -72,4 +87,4 @@ ace-git-commit automatically:
|
|
|
72
87
|
**Changes Committed:** [Brief summary of what was committed]
|
|
73
88
|
**Commit Message:** [The generated/used message]
|
|
74
89
|
**Files Modified:** [Number of files and brief description]
|
|
75
|
-
**Status:** ✓ Complete | ✗ Failed with [reason]
|
|
90
|
+
**Status:** ✓ Complete | ✗ Failed with [reason]
|
|
@@ -103,7 +103,7 @@ module Ace
|
|
|
103
103
|
def extract_pattern(output)
|
|
104
104
|
return nil if output.nil? || output.strip.empty?
|
|
105
105
|
|
|
106
|
-
# Format: ".gitignore:3:.ace-
|
|
106
|
+
# Format: ".gitignore:3:.ace-task/**/reviews/ .ace-task/v.0.9.0/reviews/review-report-gpro.md"
|
|
107
107
|
# We want the third field (the pattern)
|
|
108
108
|
parts = output.strip.split("\t")
|
|
109
109
|
if parts.length >= 2
|
|
@@ -20,6 +20,9 @@ module Ace
|
|
|
20
20
|
|
|
21
21
|
When no files are specified, all changes are staged.
|
|
22
22
|
When files are provided, only those files are staged and committed.
|
|
23
|
+
When changes span configured scopes, commits may auto-split by scope.
|
|
24
|
+
Use --no-split to force one commit, or --only-staged to commit only
|
|
25
|
+
files already in the index.
|
|
23
26
|
|
|
24
27
|
Configuration:
|
|
25
28
|
Global config: ~/.ace/git/commit.yml
|
|
@@ -33,7 +36,7 @@ module Ace
|
|
|
33
36
|
"-i 'fix bug' # With intention",
|
|
34
37
|
"-m 'feat: add' # With explicit message",
|
|
35
38
|
"--only-staged # Only staged changes",
|
|
36
|
-
"--no-split
|
|
39
|
+
"--no-split pkg-a pkg-b # Force a single commit across scopes"
|
|
37
40
|
]
|
|
38
41
|
|
|
39
42
|
# Define files as variadic argument (can be 0 or more)
|
|
@@ -43,7 +46,7 @@ module Ace
|
|
|
43
46
|
option :intention, type: :string, aliases: %w[-i], desc: "Provide context for LLM message generation"
|
|
44
47
|
option :message, type: :string, aliases: %w[-m], desc: "Use provided message directly (no LLM)"
|
|
45
48
|
option :model, type: :string, desc: "Override default LLM model (e.g., glite, gflash)"
|
|
46
|
-
option :only_staged, type: :boolean, aliases: %w[-s], desc: "Commit only currently staged changes"
|
|
49
|
+
option :only_staged, type: :boolean, aliases: %w[-s], desc: "Commit only currently staged changes and preserve unstaged edits"
|
|
47
50
|
option :staged, type: :boolean, desc: "Alias for --only-staged"
|
|
48
51
|
option :dry_run, type: :boolean, aliases: %w[-n], desc: "Show what would be committed without doing it"
|
|
49
52
|
option :force, type: :boolean, aliases: %w[-f], desc: "Force operation (for future use)"
|
|
@@ -80,6 +83,8 @@ module Ace
|
|
|
80
83
|
raise Ace::Support::Cli::Error.new("Commit failed") unless success
|
|
81
84
|
rescue GitError => e
|
|
82
85
|
raise Ace::Support::Cli::Error.new(e.message)
|
|
86
|
+
rescue Ace::GitCommit::Error => e
|
|
87
|
+
raise Ace::Support::Cli::Error.new(e.message)
|
|
83
88
|
rescue Interrupt
|
|
84
89
|
raise Ace::Support::Cli::Error.new("Commit cancelled", exit_code: 130)
|
|
85
90
|
end
|
|
@@ -29,10 +29,11 @@ module Ace
|
|
|
29
29
|
def generate(diff, intention: nil, files: [], config: nil)
|
|
30
30
|
system_prompt = load_system_prompt
|
|
31
31
|
user_prompt = build_user_prompt(diff, intention, files)
|
|
32
|
+
model = resolve_model(config)
|
|
32
33
|
|
|
33
34
|
# Use QueryInterface with named parameters matching CLI
|
|
34
35
|
response = Ace::LLM::QueryInterface.query(
|
|
35
|
-
|
|
36
|
+
model,
|
|
36
37
|
user_prompt,
|
|
37
38
|
system: system_prompt,
|
|
38
39
|
temperature: 0.7,
|
|
@@ -42,7 +43,7 @@ module Ace
|
|
|
42
43
|
|
|
43
44
|
clean_commit_message(response[:text])
|
|
44
45
|
rescue Ace::LLM::Error => e
|
|
45
|
-
raise Error, "Failed to generate commit message
|
|
46
|
+
raise Error, llm_failure_message("Failed to generate commit message", model, e)
|
|
46
47
|
end
|
|
47
48
|
|
|
48
49
|
# Generate commit messages for multiple groups in one LLM call
|
|
@@ -60,9 +61,10 @@ module Ace
|
|
|
60
61
|
|
|
61
62
|
system_prompt = load_batch_system_prompt
|
|
62
63
|
user_prompt = build_batch_user_prompt(groups_context, intention)
|
|
64
|
+
model = resolve_model(config)
|
|
63
65
|
|
|
64
66
|
response = Ace::LLM::QueryInterface.query(
|
|
65
|
-
|
|
67
|
+
model,
|
|
66
68
|
user_prompt,
|
|
67
69
|
system: system_prompt,
|
|
68
70
|
temperature: 0.7,
|
|
@@ -77,7 +79,7 @@ module Ace
|
|
|
77
79
|
|
|
78
80
|
raise Error, "Failed to generate batch commit messages: #{e.message}"
|
|
79
81
|
rescue Ace::LLM::Error => e
|
|
80
|
-
raise Error, "Failed to generate batch commit messages
|
|
82
|
+
raise Error, llm_failure_message("Failed to generate batch commit messages", model, e)
|
|
81
83
|
end
|
|
82
84
|
|
|
83
85
|
private
|
|
@@ -260,10 +262,11 @@ module Ace
|
|
|
260
262
|
|
|
261
263
|
def retry_batch_parse(groups_context, intention, previous_response, reason, config)
|
|
262
264
|
warn "[ace-git-commit] Batch parse failed, retrying with strict JSON repair: #{reason}"
|
|
265
|
+
model = resolve_model(config)
|
|
263
266
|
|
|
264
267
|
repair_prompt = build_batch_repair_user_prompt(groups_context, intention, previous_response, reason)
|
|
265
268
|
repair_response = Ace::LLM::QueryInterface.query(
|
|
266
|
-
|
|
269
|
+
model,
|
|
267
270
|
repair_prompt,
|
|
268
271
|
system: load_batch_system_prompt,
|
|
269
272
|
temperature: 0.2,
|
|
@@ -275,6 +278,8 @@ module Ace
|
|
|
275
278
|
rescue BatchParseError => e
|
|
276
279
|
warn "[ace-git-commit] Batch parse retry failed: #{e.message}"
|
|
277
280
|
nil
|
|
281
|
+
rescue Ace::LLM::Error => e
|
|
282
|
+
raise Error, llm_failure_message("Failed to generate batch commit messages", model, e)
|
|
278
283
|
end
|
|
279
284
|
|
|
280
285
|
def build_batch_repair_user_prompt(groups_context, intention, bad_response, reason)
|
|
@@ -299,6 +304,25 @@ module Ace
|
|
|
299
304
|
config_override.fetch("model", @model)
|
|
300
305
|
end
|
|
301
306
|
|
|
307
|
+
def llm_failure_message(prefix, model, error)
|
|
308
|
+
effective_model = model.to_s.empty? ? DEFAULT_MODEL : model
|
|
309
|
+
surface = setup_surface_label(effective_model)
|
|
310
|
+
lines = []
|
|
311
|
+
lines << "#{prefix} with #{surface} '#{effective_model}': #{error.message}"
|
|
312
|
+
lines << ""
|
|
313
|
+
lines << "LLM setup checks:"
|
|
314
|
+
lines << " ace-llm --list-providers"
|
|
315
|
+
lines << " ace-config doctor"
|
|
316
|
+
lines << ""
|
|
317
|
+
lines << "Fallback commit command:"
|
|
318
|
+
lines << ' ace-git-commit --only-staged --no-split -m "chore: set up ace tooling"'
|
|
319
|
+
lines.join("\n")
|
|
320
|
+
end
|
|
321
|
+
|
|
322
|
+
def setup_surface_label(model)
|
|
323
|
+
model.start_with?("role:") ? "ACE role" : "LLM model"
|
|
324
|
+
end
|
|
325
|
+
|
|
302
326
|
# Load system prompt from template
|
|
303
327
|
# @return [String] System prompt content
|
|
304
328
|
def load_system_prompt
|
metadata
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: ace-git-commit
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.26.3
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Michal Czyz
|
|
8
8
|
bindir: exe
|
|
9
9
|
cert_chain: []
|
|
10
|
-
date: 2026-04-
|
|
10
|
+
date: 2026-04-26 00:00:00.000000000 Z
|
|
11
11
|
dependencies:
|
|
12
12
|
- !ruby/object:Gem::Dependency
|
|
13
13
|
name: ace-support-cli
|