ace-lint 0.27.8 → 0.30.7
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/lint/skills.yml +0 -1
- data/CHANGELOG.md +69 -0
- data/README.md +11 -0
- data/handbook/workflow-instructions/lint/process-report.wf.md +5 -5
- data/lib/ace/lint/atoms/base_runner.rb +40 -3
- data/lib/ace/lint/molecules/skill_validator.rb +11 -2
- data/lib/ace/lint/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: 90f7ec2edad0e340d1431e04e429e47753083495cc1e71864e96c15af5b8d165
|
|
4
|
+
data.tar.gz: 6244b6ccfbc2a3c02a33ffa8b4051114689dc569991fdb05e0e4aff4092d4168
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 8e7d686678e67c90ffc52eeed9db2bfec2b8efb942b20d54e338794aaeb073adc4ed02d2776009bbcdd9f047871d0cc654a2fd1845ba7e24ffb4436562f77a09
|
|
7
|
+
data.tar.gz: 220be5c4c510566f4af4f83571be35236fe0df70bfffd3c9a45c78828d5fe4cf7ffe386025c306cb9205ff049c31e21b13665b2bd3a3ef29d64dd384ab80eff5
|
data/CHANGELOG.md
CHANGED
|
@@ -6,6 +6,75 @@ The format is based on [Keep a Changelog][1], and this project adheres to [Seman
|
|
|
6
6
|
|
|
7
7
|
## [Unreleased]
|
|
8
8
|
|
|
9
|
+
## [0.30.7] - 2026-04-23
|
|
10
|
+
|
|
11
|
+
### Technical
|
|
12
|
+
- Replaced the retained public-surface survey helper manifest with direct `ace-lint --help` evidence so the scenario stays compatible with strict declared-artifact contracts.
|
|
13
|
+
|
|
14
|
+
## [0.30.6] - 2026-04-23
|
|
15
|
+
|
|
16
|
+
### Technical
|
|
17
|
+
- Tightened retained `TS-LINT-001` no-report and doctor diagnostics coverage so `--no-report` assertions come from same-run command evidence and malformed-config checks write the exact `.ace/lint/.rubocop.yml` path inspected by `ace-lint --doctor`.
|
|
18
|
+
|
|
19
|
+
## [0.30.5] - 2026-04-20
|
|
20
|
+
|
|
21
|
+
### Technical
|
|
22
|
+
- Fixed validator chain unit-test mocks so command-path resolution is stubbed alongside validator availability, keeping the fast suite hermetic on machines without local `standardrb` or `rubocop` executables.
|
|
23
|
+
|
|
24
|
+
## [0.30.4] - 2026-04-18
|
|
25
|
+
|
|
26
|
+
### Technical
|
|
27
|
+
- Tightened retained lint E2E contracts to keep report-dir, fixed-count, and `--no-report` assertions anchored to same-run evidence, and added deterministic regression coverage for the public no-report and fixed-summary contracts.
|
|
28
|
+
|
|
29
|
+
## [0.30.3] - 2026-04-16
|
|
30
|
+
|
|
31
|
+
### Fixed
|
|
32
|
+
- Resolved validator executables from sandbox runtime and project-local `bin/` paths so Ruby validator runs work with scenario-local shims instead of ambient `PATH` assumptions.
|
|
33
|
+
|
|
34
|
+
### Technical
|
|
35
|
+
- Aligned `TS-LINT-001` runner prompts and sandbox fixtures with hermetic validator-shim execution inside copied E2E sandboxes.
|
|
36
|
+
|
|
37
|
+
## [0.30.2] - 2026-04-16
|
|
38
|
+
|
|
39
|
+
### Fixed
|
|
40
|
+
- Corrected `TS-LINT-001` doctor diagnostics setup so the malformed configuration case writes the exact `.ace/lint/.rubocop.yml` path inspected by `ace-lint --doctor`, restoring real malformed-config coverage instead of a false healthy duplicate.
|
|
41
|
+
|
|
42
|
+
## [0.30.1] - 2026-04-16
|
|
43
|
+
|
|
44
|
+
### Technical
|
|
45
|
+
- Updated `TS-LINT-001` sandbox setup to source `mise.toml` from `${ACE_E2E_SOURCE_ROOT:-$PROJECT_ROOT_PATH}` so lint-pipeline E2E runs stay compatible with the shared sandbox model.
|
|
46
|
+
|
|
47
|
+
## [0.30.0] - 2026-04-14
|
|
48
|
+
|
|
49
|
+
### Changed
|
|
50
|
+
- Reworked `TS-LINT-001` to a stricter public-surface goal contract by mapping retained flows to docs/help and splitting integrated batch outcomes from the standalone `--no-report` contract.
|
|
51
|
+
- Added `TC-008-no-report-public-contract` coverage and updated runner/verifier bundles to eight goals.
|
|
52
|
+
|
|
53
|
+
### Technical
|
|
54
|
+
- Added explicit grouped-validator config routing and doctor troubleshooting examples to `docs/usage.md` for self-serve scenario guidance.
|
|
55
|
+
|
|
56
|
+
## [0.29.1] - 2026-04-13
|
|
57
|
+
|
|
58
|
+
### Changed
|
|
59
|
+
- Completed the batch i05 migration follow-through for this package and aligned it with the restarted `fast` / `feat` / `e2e` verification model.
|
|
60
|
+
|
|
61
|
+
### Technical
|
|
62
|
+
- Included in the coordinated assignment-driven patch release for batch i05 package updates.
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
### Changed
|
|
66
|
+
- Migrated `ace-lint` package tests to the restarted `fast` / `feat` / `e2e` contract by moving deterministic coverage into `test/fast`, refreshing TS-LINT-001 scenario metadata/setup for sandbox portability, and updating package docs to teach the new test command surface.
|
|
67
|
+
- Allowed canonical `capability` skills without `skill.execution.workflow` while requiring workflow bindings for `workflow` and `orchestration` skills.
|
|
68
|
+
- Updated skill validator/schema coverage to enforce the kind-specific workflow-binding matrix and preserve `assign:` restrictions for capability skills.
|
|
69
|
+
|
|
70
|
+
## [0.28.1] - 2026-04-07
|
|
71
|
+
|
|
72
|
+
### Fixed
|
|
73
|
+
- Allowed canonical `assign.steps` metadata in skill validation for workflow/orchestration skills.
|
|
74
|
+
|
|
75
|
+
### Technical
|
|
76
|
+
- Added regression coverage ensuring skills with `assign.steps` pass lint validation.
|
|
77
|
+
|
|
9
78
|
## [0.27.8] - 2026-03-31
|
|
10
79
|
|
|
11
80
|
### Changed
|
data/README.md
CHANGED
|
@@ -38,5 +38,16 @@
|
|
|
38
38
|
|
|
39
39
|
**Process and act on lint reports** - use `/as-lint-process-report` to analyze lint output and coordinate fixes, pairing with [ace-docs](../ace-docs) for documentation maintenance workflows that complement lint validation.
|
|
40
40
|
|
|
41
|
+
For public verification paths around grouped validator routing, doctor troubleshooting, and retained test commands, see the [Usage Guide](docs/usage.md#grouped-validator-config-routing), [doctor troubleshooting](docs/usage.md#doctor-troubleshooting), and [test commands](docs/usage.md#test-commands).
|
|
42
|
+
|
|
43
|
+
## Testing Model
|
|
44
|
+
|
|
45
|
+
`ace-lint` follows the restarted testing contract:
|
|
46
|
+
|
|
47
|
+
- `ace-test ace-lint` runs deterministic fast tests (`test/fast`).
|
|
48
|
+
- `ace-test ace-lint feat` is reserved for explicit deterministic feature tests (`test/feat`) when present.
|
|
49
|
+
- `ace-test ace-lint all` runs all deterministic package tests.
|
|
50
|
+
- `ace-test-e2e ace-lint` runs retained workflow-value scenarios from `test/e2e`.
|
|
51
|
+
|
|
41
52
|
---
|
|
42
53
|
[Getting Started](docs/getting-started.md) | [Usage Guide](docs/usage.md) | [Handbook - Skills, Agents, Templates](docs/handbook.md) | Part of [ACE](https://github.com/cs3b/ace)
|
|
@@ -11,12 +11,12 @@ ace-docs:
|
|
|
11
11
|
|
|
12
12
|
## Purpose
|
|
13
13
|
|
|
14
|
-
Parse a lint report file and create structured tasks for issues requiring manual intervention. Groups issues by severity and type, generates fix proposals, and drafts tasks via ace-
|
|
14
|
+
Parse a lint report file and create structured tasks for issues requiring manual intervention. Groups issues by severity and type, generates fix proposals, and drafts tasks via ace-task.
|
|
15
15
|
|
|
16
16
|
## Prerequisites
|
|
17
17
|
|
|
18
18
|
- Lint report file exists (from `wfi://lint/run --report`)
|
|
19
|
-
- **ace-
|
|
19
|
+
- **ace-task is installed and available** - required for task creation commands
|
|
20
20
|
- Understanding of project lint rules
|
|
21
21
|
|
|
22
22
|
## Variables
|
|
@@ -57,7 +57,7 @@ Parse a lint report file and create structured tasks for issues requiring manual
|
|
|
57
57
|
- **P2 (medium)**: Style/formatting issues
|
|
58
58
|
- **P3 (low)**: Suggestions and improvements
|
|
59
59
|
|
|
60
|
-
5. **Create tasks via ace-
|
|
60
|
+
5. **Create tasks via ace-task**:
|
|
61
61
|
|
|
62
62
|
**For grouped issues (multiple similar errors):**
|
|
63
63
|
```bash
|
|
@@ -154,7 +154,7 @@ doc-type: [suggested-type]
|
|
|
154
154
|
- Report successfully parsed
|
|
155
155
|
- Issues grouped logically
|
|
156
156
|
- Fix proposals generated for each issue
|
|
157
|
-
- Tasks created in ace-
|
|
157
|
+
- Tasks created in ace-task
|
|
158
158
|
- Summary report generated
|
|
159
159
|
- No issues lost or duplicated
|
|
160
160
|
|
|
@@ -172,4 +172,4 @@ doc-type: [suggested-type]
|
|
|
172
172
|
|
|
173
173
|
- **Empty report**: Report success, no tasks needed
|
|
174
174
|
- **Invalid JSON**: Report parse error, suggest re-running lint
|
|
175
|
-
- **ace-
|
|
175
|
+
- **ace-task unavailable**: Output task drafts as markdown
|
|
@@ -47,9 +47,11 @@ module Ace
|
|
|
47
47
|
# @return [Hash] Result with :success, :errors, :warnings
|
|
48
48
|
def run(file_paths, fix: false, config_path: nil)
|
|
49
49
|
paths = Array(file_paths)
|
|
50
|
-
|
|
50
|
+
executable = resolve_command_path(command_name)
|
|
51
|
+
return unavailable_result unless executable
|
|
51
52
|
|
|
52
53
|
cmd = build_command(paths, fix: fix, config_path: config_path)
|
|
54
|
+
cmd[0] = executable if command_invocation?(cmd[0], command_name)
|
|
53
55
|
stdout, stderr, status = Open3.capture3(*cmd)
|
|
54
56
|
|
|
55
57
|
if status.success?
|
|
@@ -206,8 +208,43 @@ module Ace
|
|
|
206
208
|
# @param cmd [String] Command name
|
|
207
209
|
# @return [Boolean] True if command exists
|
|
208
210
|
def system_has_command?(cmd)
|
|
209
|
-
|
|
210
|
-
|
|
211
|
+
!resolve_command_path(cmd).nil?
|
|
212
|
+
end
|
|
213
|
+
|
|
214
|
+
def resolve_command_path(cmd)
|
|
215
|
+
candidate = cmd.to_s
|
|
216
|
+
return nil if candidate.empty?
|
|
217
|
+
return candidate if command_path_executable?(candidate) && candidate.include?(File::SEPARATOR)
|
|
218
|
+
|
|
219
|
+
candidate_directories.each do |directory|
|
|
220
|
+
next if directory.to_s.empty?
|
|
221
|
+
|
|
222
|
+
path = File.join(directory, candidate)
|
|
223
|
+
return path if command_path_executable?(path)
|
|
224
|
+
end
|
|
225
|
+
|
|
226
|
+
nil
|
|
227
|
+
end
|
|
228
|
+
|
|
229
|
+
def candidate_directories
|
|
230
|
+
directories = []
|
|
231
|
+
runtime_root = ENV["ACE_E2E_SANDBOX_RUNTIME_ROOT"].to_s.strip
|
|
232
|
+
project_root = ENV["PROJECT_ROOT_PATH"].to_s.strip
|
|
233
|
+
|
|
234
|
+
directories << File.join(runtime_root, "bin") unless runtime_root.empty?
|
|
235
|
+
directories << File.join(project_root, "bin") unless project_root.empty?
|
|
236
|
+
directories << File.join(Dir.pwd, "bin")
|
|
237
|
+
directories.concat(ENV.fetch("PATH", "").split(File::PATH_SEPARATOR))
|
|
238
|
+
directories.map { |entry| File.expand_path(entry) }.uniq
|
|
239
|
+
end
|
|
240
|
+
|
|
241
|
+
def command_path_executable?(path)
|
|
242
|
+
File.file?(path) && File.executable?(path)
|
|
243
|
+
end
|
|
244
|
+
|
|
245
|
+
def command_invocation?(value, command)
|
|
246
|
+
invocation = value.to_s
|
|
247
|
+
invocation == command.to_s || File.basename(invocation) == command.to_s
|
|
211
248
|
end
|
|
212
249
|
|
|
213
250
|
# Check if severity indicates an error
|
|
@@ -305,6 +305,7 @@ module Ace
|
|
|
305
305
|
return errors
|
|
306
306
|
end
|
|
307
307
|
|
|
308
|
+
kind = skill_data["kind"]
|
|
308
309
|
unknown_skill_keys = skill_data.keys - %w[kind execution]
|
|
309
310
|
unknown_skill_keys.each do |key|
|
|
310
311
|
errors << Models::ValidationError.new(
|
|
@@ -329,10 +330,18 @@ module Ace
|
|
|
329
330
|
end
|
|
330
331
|
end
|
|
331
332
|
|
|
333
|
+
workflow_line = field_lines["skill"] || 2
|
|
334
|
+
workflow = execution_data.is_a?(Hash) ? execution_data["workflow"] : nil
|
|
335
|
+
if %w[workflow orchestration].include?(kind) && !present_value?(workflow)
|
|
336
|
+
errors << Models::ValidationError.new(
|
|
337
|
+
line: workflow_line,
|
|
338
|
+
message: "Missing required field: 'skill.execution.workflow'"
|
|
339
|
+
)
|
|
340
|
+
end
|
|
341
|
+
|
|
332
342
|
assign_data = frontmatter["assign"]
|
|
333
343
|
if assign_data
|
|
334
344
|
assign_line = field_lines["assign"] || 2
|
|
335
|
-
kind = skill_data["kind"]
|
|
336
345
|
if kind == "capability"
|
|
337
346
|
errors << Models::ValidationError.new(
|
|
338
347
|
line: assign_line,
|
|
@@ -348,7 +357,7 @@ module Ace
|
|
|
348
357
|
return errors
|
|
349
358
|
end
|
|
350
359
|
|
|
351
|
-
unknown_assign_keys = assign_data.keys - %w[source phases]
|
|
360
|
+
unknown_assign_keys = assign_data.keys - %w[source phases steps]
|
|
352
361
|
unknown_assign_keys.each do |key|
|
|
353
362
|
errors << Models::ValidationError.new(
|
|
354
363
|
line: assign_line,
|
data/lib/ace/lint/version.rb
CHANGED
metadata
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: ace-lint
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.30.7
|
|
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-config
|