ace-search 0.24.3 → 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/CHANGELOG.md +45 -0
- data/README.md +10 -1
- data/handbook/agents/search.ag.md +2 -2
- data/handbook/workflow-instructions/search/run.wf.md +2 -2
- data/lib/ace/search/atoms/result_parser.rb +16 -0
- data/lib/ace/search/cli/commands/search.rb +6 -2
- data/lib/ace/search/organisms/result_formatter.rb +8 -0
- data/lib/ace/search/organisms/unified_searcher.rb +8 -1
- data/lib/ace/search/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: 9604b659c48d2843a1b964336ee20456476877da0230ccd507ce6cd5b29f3e73
|
|
4
|
+
data.tar.gz: 1e7680024a92a6a1c618431d51b70a686f62f204d7b5fab5f4d83953bb939d8f
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 4e7ffb8152f6837f0d21e69a93dedc837821cae5993b82bb6ffab709ce9410dd7e886d7a5b42af3099362faff565a3069aafe47d5015b9ee4772412fe318b519
|
|
7
|
+
data.tar.gz: 06f0e2f7d3cfda0623b15646e4b25bac68ac3678f8ebd347c571f429849ec621a88681b818eb43609a346e81df58327fccc9bdacdd5279ec9d380348782a3a57
|
data/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,51 @@ 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-16
|
|
11
|
+
|
|
12
|
+
### Fixed
|
|
13
|
+
- Made `--count` use true count-mode parsing and formatting so count searches emit counts only instead of full match listings.
|
|
14
|
+
|
|
15
|
+
## [0.26.2] - 2026-04-16
|
|
16
|
+
|
|
17
|
+
### Technical
|
|
18
|
+
- Updated `TS-SEARCH-001` sandbox setup to source `mise.toml` from `${ACE_E2E_SOURCE_ROOT:-$PROJECT_ROOT_PATH}` so search workflow E2E runs stay compatible with the shared sandbox contract.
|
|
19
|
+
|
|
20
|
+
## [0.26.1] - 2026-04-16
|
|
21
|
+
|
|
22
|
+
### Fixed
|
|
23
|
+
- Added explicit `Using preset:` output for preset-driven searches and updated E2E verification to accept mirrored package-suite artifacts when runner captures are routed under the package root.
|
|
24
|
+
|
|
25
|
+
## [0.26.0] - 2026-04-15
|
|
26
|
+
|
|
27
|
+
### Changed
|
|
28
|
+
- Rewrote `TS-SEARCH-001` E2E journeys to public-surface goal style by reframing file/count/JSON paths around user-visible outcomes and removing implementation-coupled probes.
|
|
29
|
+
- Added `TC-005` preset-driven and `TC-006` git-scoped workflow coverage, and expanded runner/verifier contracts to six retained goals.
|
|
30
|
+
|
|
31
|
+
### Technical
|
|
32
|
+
- Hardened scenario setup with a guarded `mise.toml` trust step and updated verifier markdown contracts for lint-clean execution.
|
|
33
|
+
|
|
34
|
+
## [0.25.2] - 2026-04-13
|
|
35
|
+
|
|
36
|
+
### Technical
|
|
37
|
+
- Replaced the package version assertion with a semantic-version schema check so the fast test validates version shape instead of a loose substring match.
|
|
38
|
+
## [0.25.1] - 2026-04-13
|
|
39
|
+
|
|
40
|
+
### Changed
|
|
41
|
+
- Completed the batch i05 migration follow-through for this package and aligned it with the restarted `fast` / `feat` / `e2e` verification model.
|
|
42
|
+
|
|
43
|
+
### Technical
|
|
44
|
+
- Included in the coordinated assignment-driven patch release for batch i05 package updates.
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
### Changed
|
|
48
|
+
- Migrated package tests to the restarted `fast` / `feat` / `e2e` model by moving deterministic suites into `test/fast` and `test/feat`, retaining `TS-SEARCH-001` as workflow-value E2E coverage, and updating package docs to teach the new test contract.
|
|
49
|
+
|
|
50
|
+
## [0.24.4] - 2026-03-29
|
|
51
|
+
|
|
52
|
+
### Technical
|
|
53
|
+
- Normalized published gem metadata so RubyGems and Ruby Toolbox use current release information instead of the 1980 fallback date.
|
|
54
|
+
|
|
10
55
|
## [0.24.3] - 2026-03-29
|
|
11
56
|
|
|
12
57
|
### Fixed
|
data/README.md
CHANGED
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
|
|
19
19
|

|
|
20
20
|
|
|
21
|
-
`ace-search` gives developers and coding agents a single search entry point that chooses file or content mode automatically (DWIM
|
|
21
|
+
`ace-search` gives developers and coding agents a single search entry point that chooses file or content mode automatically (DWIM -- Do What I Mean), keeps search scope predictable from any directory, and exposes fast output modes for workflow automation. Use `/as-search-run` for quick searches, `/as-search-research` for multi-search analysis, or `/as-search-feature-research` for implementation gap analysis.
|
|
22
22
|
|
|
23
23
|
## How It Works
|
|
24
24
|
|
|
@@ -38,5 +38,14 @@
|
|
|
38
38
|
|
|
39
39
|
**Run multi-search research from an agent** - use `/as-search-research` to execute multiple related searches and synthesize findings, or `/as-search-feature-research` to analyze implementation gaps.
|
|
40
40
|
|
|
41
|
+
## Testing Model
|
|
42
|
+
|
|
43
|
+
`ace-search` uses the restarted testing contract:
|
|
44
|
+
|
|
45
|
+
- `ace-test ace-search` for default deterministic fast tests
|
|
46
|
+
- `ace-test ace-search feat` for deterministic feature contracts
|
|
47
|
+
- `ace-test ace-search all` for combined deterministic lanes
|
|
48
|
+
- `ace-test-e2e ace-search` for retained workflow-value scenarios only
|
|
49
|
+
|
|
41
50
|
---
|
|
42
51
|
[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)
|
|
@@ -75,11 +75,11 @@ Limit search to specific paths:
|
|
|
75
75
|
```bash
|
|
76
76
|
# Search specific directory (change directory first)
|
|
77
77
|
cd lib/ && ace-search "pattern"
|
|
78
|
-
cd ace-
|
|
78
|
+
cd ace-task/ && ace-search "TODO"
|
|
79
79
|
|
|
80
80
|
# Or use --include to filter paths
|
|
81
81
|
ace-search "pattern" --include "lib/**/*"
|
|
82
|
-
ace-search "TODO" --include "ace-
|
|
82
|
+
ace-search "TODO" --include "ace-task/**/*"
|
|
83
83
|
```
|
|
84
84
|
|
|
85
85
|
### File Pattern Filtering (Glob)
|
|
@@ -64,11 +64,11 @@ Limit search to specific paths:
|
|
|
64
64
|
```bash
|
|
65
65
|
# Search specific directory (change directory first)
|
|
66
66
|
cd lib/ && ace-search "pattern"
|
|
67
|
-
cd ace-
|
|
67
|
+
cd ace-task/ && ace-search "TODO"
|
|
68
68
|
|
|
69
69
|
# Or use --include to filter paths
|
|
70
70
|
ace-search "pattern" --include "lib/**/*"
|
|
71
|
-
ace-search "TODO" --include "ace-
|
|
71
|
+
ace-search "TODO" --include "ace-task/**/*"
|
|
72
72
|
```
|
|
73
73
|
|
|
74
74
|
### File Pattern Filtering (Glob)
|
|
@@ -19,6 +19,8 @@ module Ace
|
|
|
19
19
|
parse_ripgrep_json(output)
|
|
20
20
|
when :files_only
|
|
21
21
|
parse_ripgrep_files_only(output)
|
|
22
|
+
when :counts
|
|
23
|
+
parse_ripgrep_counts(output)
|
|
22
24
|
else
|
|
23
25
|
parse_ripgrep_text(output)
|
|
24
26
|
end
|
|
@@ -105,6 +107,20 @@ module Ace
|
|
|
105
107
|
}
|
|
106
108
|
end
|
|
107
109
|
end
|
|
110
|
+
|
|
111
|
+
# Parse ripgrep --count output (file:count)
|
|
112
|
+
def parse_ripgrep_counts(output)
|
|
113
|
+
output.lines.map(&:strip).reject(&:empty?).filter_map do |line|
|
|
114
|
+
match = line.match(/\A(.+?):(\d+)\z/)
|
|
115
|
+
next unless match
|
|
116
|
+
|
|
117
|
+
{
|
|
118
|
+
type: :count,
|
|
119
|
+
path: match[1],
|
|
120
|
+
count: match[2].to_i
|
|
121
|
+
}
|
|
122
|
+
end
|
|
123
|
+
end
|
|
108
124
|
end
|
|
109
125
|
end
|
|
110
126
|
end
|
|
@@ -183,6 +183,7 @@ module Ace
|
|
|
183
183
|
end
|
|
184
184
|
|
|
185
185
|
def apply_preset
|
|
186
|
+
puts "Using preset: #{@options[:preset]}" if @options[:format] == :text
|
|
186
187
|
preset_manager = Ace::Search::Molecules::PresetManager.new
|
|
187
188
|
@options = preset_manager.merge_with_options(@options[:preset], @options)
|
|
188
189
|
end
|
|
@@ -201,7 +202,7 @@ module Ace
|
|
|
201
202
|
def output_results(result)
|
|
202
203
|
# Print summary for text format
|
|
203
204
|
if @options[:format] == :text
|
|
204
|
-
|
|
205
|
+
summary = Ace::Search::Organisms::ResultFormatter.format_summary(
|
|
205
206
|
result[:results],
|
|
206
207
|
mode: result[:mode],
|
|
207
208
|
pattern: @pattern,
|
|
@@ -209,7 +210,10 @@ module Ace
|
|
|
209
210
|
scope: @options[:scope],
|
|
210
211
|
search_path: @options[:search_path]
|
|
211
212
|
)
|
|
212
|
-
|
|
213
|
+
unless summary.empty?
|
|
214
|
+
puts summary
|
|
215
|
+
puts ""
|
|
216
|
+
end
|
|
213
217
|
end
|
|
214
218
|
|
|
215
219
|
# Print results
|
|
@@ -35,6 +35,8 @@ module Ace
|
|
|
35
35
|
case result[:type]
|
|
36
36
|
when :file
|
|
37
37
|
lines << format_file_result(result)
|
|
38
|
+
when :count
|
|
39
|
+
lines << format_count_result(result)
|
|
38
40
|
when :match
|
|
39
41
|
lines << format_match_result(result, options)
|
|
40
42
|
end
|
|
@@ -59,6 +61,10 @@ module Ace
|
|
|
59
61
|
" #{path}:#{line}:#{column}: #{text}"
|
|
60
62
|
end
|
|
61
63
|
|
|
64
|
+
def self.format_count_result(result)
|
|
65
|
+
" #{result[:path]}: #{result[:count]}"
|
|
66
|
+
end
|
|
67
|
+
|
|
62
68
|
# Format results as JSON
|
|
63
69
|
def self.format_json(results)
|
|
64
70
|
JSON.pretty_generate({
|
|
@@ -77,6 +83,8 @@ module Ace
|
|
|
77
83
|
|
|
78
84
|
# Format summary header
|
|
79
85
|
def self.format_summary(results, options = {})
|
|
86
|
+
return "" if options[:count]
|
|
87
|
+
|
|
80
88
|
count = results.size
|
|
81
89
|
mode = options[:mode] || "search"
|
|
82
90
|
pattern = options[:pattern] || ""
|
|
@@ -76,7 +76,13 @@ module Ace
|
|
|
76
76
|
|
|
77
77
|
return {success: false, error: result[:error]} unless result[:success]
|
|
78
78
|
|
|
79
|
-
parse_mode = options[:files_with_matches]
|
|
79
|
+
parse_mode = if options[:files_with_matches]
|
|
80
|
+
:files_only
|
|
81
|
+
elsif options[:count]
|
|
82
|
+
:counts
|
|
83
|
+
else
|
|
84
|
+
:text
|
|
85
|
+
end
|
|
80
86
|
matches = @result_parser.parse_ripgrep_output(result[:stdout], parse_mode)
|
|
81
87
|
|
|
82
88
|
# Limit results
|
|
@@ -118,6 +124,7 @@ module Ace
|
|
|
118
124
|
rg_opts[:after_context] = options[:after_context] if options[:after_context]
|
|
119
125
|
rg_opts[:glob] = options[:glob] if options[:glob]
|
|
120
126
|
rg_opts[:hidden] = options[:hidden] if options[:hidden]
|
|
127
|
+
rg_opts[:count] = options[:count] if options[:count]
|
|
121
128
|
rg_opts[:files_with_matches] = options[:files_with_matches] if options[:files_with_matches]
|
|
122
129
|
rg_opts[:max_count] = options[:max_results] if options[:max_results]
|
|
123
130
|
rg_opts[:search_path] = options[:search_path] if options[:search_path]
|
data/lib/ace/search/version.rb
CHANGED
metadata
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: ace-search
|
|
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:
|
|
10
|
+
date: 2026-04-20 00:00:00.000000000 Z
|
|
11
11
|
dependencies:
|
|
12
12
|
- !ruby/object:Gem::Dependency
|
|
13
13
|
name: ace-support-cli
|