@cassiomc1/forgeloop 1.10.2 → 1.11.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.
- package/.cursor/rules/project-loop.mdc +2 -2
- package/.forgeloop/forgeloop.gitignore +1 -0
- package/.github/copilot-instructions.md +2 -2
- package/AGENTS.md +1 -0
- package/AGENT_COMPATIBILITY.md +7 -0
- package/CLAUDE.md +1 -0
- package/DOCS_INDEX.md +10 -0
- package/LOOP_SYSTEM_DESIGN.md +12 -0
- package/ORCHESTRATOR_INTEGRATION.md +9 -0
- package/PROTOCOL_INTEGRATION.md +17 -0
- package/README.md +12 -10
- package/THIRD_PARTY_NOTICES.md +11 -0
- package/THREAT_MODEL.md +21 -0
- package/benchmarks/repository-index/README.md +73 -0
- package/benchmarks/repository-index/queries.json +12 -0
- package/benchmarks/repository-index/run-hot-path.mjs +142 -0
- package/benchmarks/repository-index/run-persistent-transport.mjs +169 -0
- package/completions/_forgeloop +7 -1
- package/completions/forgeloop.bash +13 -1
- package/completions/forgeloop.fish +40 -1
- package/docs/AGENT_PROTOCOL_SUMMARY.md +8 -1
- package/docs/CLI_REFERENCE.md +114 -2
- package/docs/DOCUMENTATION_GUIDE.md +10 -5
- package/docs/GETTING_STARTED.md +17 -0
- package/docs/MCP.md +16 -1
- package/docs/PACKAGE_CONTENTS.md +7 -1
- package/docs/PERSISTENT_SEARCH_TRANSPORT.md +289 -0
- package/docs/RECIPES.md +30 -0
- package/docs/RELEASE_CHECKLIST.md +34 -0
- package/docs/REPOSITORY_INDEX.md +553 -0
- package/docs/TROUBLESHOOTING.md +147 -0
- package/docs/UNIVERSAL_INTEGRATION.md +30 -0
- package/docs/diagrams/README.md +10 -0
- package/package.json +11 -2
- package/scripts/update-tgrep-manifest.mjs +86 -0
- package/scripts/verify-tgrep-manifest.mjs +17 -0
- package/src/cli.js +35 -0
- package/src/commands/doctor.js +76 -1
- package/src/commands/index-rebuild.js +1 -0
- package/src/commands/index-setup.js +1 -0
- package/src/commands/index-start.js +1 -0
- package/src/commands/index-status.js +1 -0
- package/src/commands/index-stop.js +1 -0
- package/src/commands/init.js +39 -1
- package/src/commands/repository-index.js +111 -0
- package/src/commands/search.js +1 -0
- package/src/commands/update.js +32 -4
- package/src/core/cli-command-definitions.js +97 -3
- package/src/core/command-executors.js +35 -2
- package/src/core/command-input.js +23 -0
- package/src/core/error-codes.js +195 -0
- package/src/core/filesystem.js +10 -1
- package/src/core/integration-invocation-policy.js +27 -0
- package/src/core/integration-resources.js +16 -1
- package/src/core/protocol-info.js +23 -0
- package/src/integration.d.ts +90 -0
- package/src/integration.js +21 -0
- package/src/persistent-transport/client.js +293 -0
- package/src/persistent-transport/constants.js +24 -0
- package/src/persistent-transport/errors.js +38 -0
- package/src/persistent-transport/framing.js +61 -0
- package/src/persistent-transport/lifecycle.js +116 -0
- package/src/persistent-transport/ownership.js +184 -0
- package/src/persistent-transport/paths.js +31 -0
- package/src/persistent-transport/protocol.js +95 -0
- package/src/persistent-transport/server.js +256 -0
- package/src/persistent-transport/state.js +49 -0
- package/src/repository-index/args.js +59 -0
- package/src/repository-index/binary-manager.js +413 -0
- package/src/repository-index/constants.js +45 -0
- package/src/repository-index/errors.js +38 -0
- package/src/repository-index/lifecycle.js +17 -0
- package/src/repository-index/lock.js +113 -0
- package/src/repository-index/manifest.js +132 -0
- package/src/repository-index/metrics.js +30 -0
- package/src/repository-index/normalize-json.js +187 -0
- package/src/repository-index/paths.js +39 -0
- package/src/repository-index/platform.js +20 -0
- package/src/repository-index/process.js +140 -0
- package/src/repository-index/readiness.js +62 -0
- package/src/repository-index/search.js +262 -0
- package/src/repository-index/server.js +432 -0
- package/src/repository-index/status.js +397 -0
- package/src/repository-index/tgrep-manifest.json +38 -0
package/docs/PACKAGE_CONTENTS.md
CHANGED
|
@@ -24,6 +24,9 @@ The published tarball includes the following consumer-facing groups:
|
|
|
24
24
|
repository for historical context and are explicitly excluded:
|
|
25
25
|
`src/core/cli-metadata.js`, `src/core/decision-classification.js`,
|
|
26
26
|
`src/core/gates.js`, and `src/core/workflow-compatibility.js`.
|
|
27
|
+
This includes the provider-neutral Repository Index runtime and its pinned
|
|
28
|
+
`src/repository-index/tgrep-manifest.json`; native engine binaries are
|
|
29
|
+
provisioned outside the npm tarball.
|
|
27
30
|
- **Initialization material:** the root protocol and integration documents,
|
|
28
31
|
legal notices, the target profile template, and every path listed by
|
|
29
32
|
`src/core/templates.js`. These files are read by `init` and `update`, so
|
|
@@ -32,8 +35,11 @@ The published tarball includes the following consumer-facing groups:
|
|
|
32
35
|
- **Benchmark inputs:** execution-profile scenario definitions and their
|
|
33
36
|
README. They make new measurements reproducible; historical measurements
|
|
34
37
|
and generated results are repository evidence and are excluded.
|
|
38
|
+
Repository Index query inputs and benchmark instructions are also shipped;
|
|
39
|
+
generated local repositories and measurements are not.
|
|
35
40
|
- **User documentation:** the getting-started, integration, CLI, artifact,
|
|
36
|
-
|
|
41
|
+
Repository Index, Persistent Search Transport, troubleshooting, release,
|
|
42
|
+
package-boundary, and related reference pages.
|
|
37
43
|
The advisory-context and Ripwire adapter guides ship with the corresponding
|
|
38
44
|
public integration surface.
|
|
39
45
|
The typed diagram sources, generated HTML/SVG/receipt artifacts, and
|
|
@@ -0,0 +1,289 @@
|
|
|
1
|
+
# Persistent Search Transport
|
|
2
|
+
|
|
3
|
+
ForgeLoop's persistent search transport is a local optimization for the CLI
|
|
4
|
+
`search` command. It keeps one ForgeLoop-owned search host available between
|
|
5
|
+
CLI invocations and sends bounded requests over local IPC. It does not create a
|
|
6
|
+
second search implementation, replace the Repository Index, or change the
|
|
7
|
+
protocol lifecycle and evidence authority.
|
|
8
|
+
|
|
9
|
+
The public Repository Index contract, managed tgrep policy, search result
|
|
10
|
+
shape, and index maintenance commands are documented in
|
|
11
|
+
[`REPOSITORY_INDEX.md`](./REPOSITORY_INDEX.md). This document explains the
|
|
12
|
+
transport boundary and its operational behavior.
|
|
13
|
+
|
|
14
|
+
## Architecture and boundaries
|
|
15
|
+
|
|
16
|
+
The runtime has one canonical search service and two access paths:
|
|
17
|
+
|
|
18
|
+
```text
|
|
19
|
+
CLI `search` only
|
|
20
|
+
-> Persistent Search Client
|
|
21
|
+
-> local IPC
|
|
22
|
+
-> Persistent ForgeLoop Host
|
|
23
|
+
-> canonical `searchRepository()` service
|
|
24
|
+
-> Repository Index
|
|
25
|
+
-> ForgeLoop-managed tgrep 1.0.3
|
|
26
|
+
|
|
27
|
+
Integration API `repositorySearch()` --------------------┐
|
|
28
|
+
MCP `forgeloop_search` -----------------------------------┘
|
|
29
|
+
-> canonical `searchRepository()` service
|
|
30
|
+
-> Repository Index
|
|
31
|
+
-> ForgeLoop-managed tgrep 1.0.3
|
|
32
|
+
|
|
33
|
+
Lifecycle, claims, verification, receipts, evidence, and completion
|
|
34
|
+
-> remain separate ForgeLoop protocol state and authority
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
Only the shell-facing CLI search path uses the persistent host. The
|
|
38
|
+
Integration API and MCP adapter call the canonical search service directly;
|
|
39
|
+
they do not route through the persistent host. The host also does not read or
|
|
40
|
+
write task claims, receipts, ledgers, or completion state.
|
|
41
|
+
|
|
42
|
+
The persistent host is an optimization layer, not a public protocol authority:
|
|
43
|
+
|
|
44
|
+
- Repository Index readiness remains mandatory for supported Git repositories.
|
|
45
|
+
- The managed tgrep engine remains the only runtime search backend; there is no
|
|
46
|
+
silent `rg`, `grep`, or arbitrary-`PATH` fallback.
|
|
47
|
+
- Search output remains normalized by the canonical service and uses project-
|
|
48
|
+
relative paths.
|
|
49
|
+
- Derived index files and host state are cache/coordination data, not evidence.
|
|
50
|
+
- A fresh CLI invocation still pays Node.js and module startup cost. The
|
|
51
|
+
persistent path removes repeated host startup and keeps subsequent requests
|
|
52
|
+
local; it does not promise a universal latency improvement.
|
|
53
|
+
|
|
54
|
+
Implementation sources are [`client.js`](../src/persistent-transport/client.js),
|
|
55
|
+
[`server.js`](../src/persistent-transport/server.js),
|
|
56
|
+
[`lifecycle.js`](../src/persistent-transport/lifecycle.js), and the canonical
|
|
57
|
+
[`search.js`](../src/repository-index/search.js).
|
|
58
|
+
|
|
59
|
+
## Transport protocol
|
|
60
|
+
|
|
61
|
+
The transport currently uses protocol version `1` and state schema version `1`.
|
|
62
|
+
Its supported methods are deliberately small:
|
|
63
|
+
|
|
64
|
+
| Method | Purpose | Access rule |
|
|
65
|
+
| --- | --- | --- |
|
|
66
|
+
| `handshake` | Prove protocol, package, scope, and host ownership identity | First request on every connection |
|
|
67
|
+
| `repository.search` | Dispatch one bounded normalized Repository Search request | Requires a successful handshake |
|
|
68
|
+
| `transport.status` | Return the host's ready/version projection | Requires a successful handshake |
|
|
69
|
+
| `transport.shutdown` | Ask the verified host to shut down | Requires a successful handshake and matching nonce |
|
|
70
|
+
|
|
71
|
+
Requests and responses are JSON encoded in UTF-8 and carried in a
|
|
72
|
+
length-prefixed frame. The length is a four-byte unsigned big-endian value;
|
|
73
|
+
the JSON payload is bounded before it is parsed or written.
|
|
74
|
+
|
|
75
|
+
The defaults are defined in
|
|
76
|
+
[`constants.js`](../src/persistent-transport/constants.js):
|
|
77
|
+
|
|
78
|
+
| Limit | Default |
|
|
79
|
+
| --- | ---: |
|
|
80
|
+
| Host startup timeout | 15 seconds |
|
|
81
|
+
| Search request timeout | 120 seconds |
|
|
82
|
+
| Idle shutdown | 10 minutes |
|
|
83
|
+
| Maximum request frame | 1 MiB |
|
|
84
|
+
| Maximum response frame | 16 MiB |
|
|
85
|
+
| Maximum search pattern | 4,096 characters |
|
|
86
|
+
|
|
87
|
+
The request projection accepts only the canonical search fields: pattern,
|
|
88
|
+
globs, types, context, before/after context, max count, files-with-matches,
|
|
89
|
+
stats, fixed strings, ignore case, smart case, and word regexp. Internal
|
|
90
|
+
transport fields, executable arguments, arbitrary binaries, and machine-local
|
|
91
|
+
path options are not forwarded as public query fields. See
|
|
92
|
+
[`protocol.js`](../src/persistent-transport/protocol.js) for the allowlist and
|
|
93
|
+
validation rules.
|
|
94
|
+
|
|
95
|
+
## Host lifecycle
|
|
96
|
+
|
|
97
|
+
### Startup and reuse
|
|
98
|
+
|
|
99
|
+
When the CLI search path needs a host, the client:
|
|
100
|
+
|
|
101
|
+
1. acquires a user-scoped startup coordination lock;
|
|
102
|
+
2. reads and validates the existing host state, if present;
|
|
103
|
+
3. reuses the host only after ownership, endpoint, protocol, package version,
|
|
104
|
+
and handshake checks succeed;
|
|
105
|
+
4. otherwise removes only verified stale or incompatible transport state;
|
|
106
|
+
5. starts the packaged ForgeLoop host with a shell-free Node.js child process;
|
|
107
|
+
6. waits for a bounded successful handshake before dispatching the search.
|
|
108
|
+
|
|
109
|
+
Concurrent callers coordinate startup and requests for the same repository are
|
|
110
|
+
serialized by the host. Requests for different repositories may be served by
|
|
111
|
+
the same user-scoped host without sharing repository result data.
|
|
112
|
+
|
|
113
|
+
There is no separate public `persistent-host-start` command. The host starts
|
|
114
|
+
on demand for CLI `search`, and it can be observed through the sanitized
|
|
115
|
+
`persistentTransport` projection returned by `forgeloop doctor --json`.
|
|
116
|
+
|
|
117
|
+
### Recovery
|
|
118
|
+
|
|
119
|
+
The client permits at most one bounded connection/startup recovery attempt for
|
|
120
|
+
a search request. Recoverable transport failures include an unavailable host,
|
|
121
|
+
timeout, protocol mismatch, or invalid response when the failure is at the
|
|
122
|
+
transport boundary. A remote Repository Index or query error is returned to the
|
|
123
|
+
caller and is not hidden by transport recovery.
|
|
124
|
+
|
|
125
|
+
If state is stale, the verified host has exited, or the endpoint cannot prove
|
|
126
|
+
the expected identity, the client repairs transport coordination state only
|
|
127
|
+
within its user-scoped transport boundary. It does not delete project
|
|
128
|
+
`.forgeloop` state, rebuild an index implicitly beyond the canonical search
|
|
129
|
+
service's existing readiness behavior, or alter lifecycle artifacts.
|
|
130
|
+
|
|
131
|
+
### Idle shutdown
|
|
132
|
+
|
|
133
|
+
After ten minutes without active connections or in-flight requests, the host
|
|
134
|
+
shuts down. Idle shutdown removes the host's coordination state and POSIX
|
|
135
|
+
endpoint; it does not stop the Repository Index watcher or delete the derived
|
|
136
|
+
repository index. A later CLI search starts or reuses the host again.
|
|
137
|
+
|
|
138
|
+
Explicit shutdown is sent through the verified endpoint. If ownership cannot be
|
|
139
|
+
proved, ForgeLoop fails closed rather than killing a process by PID or name.
|
|
140
|
+
|
|
141
|
+
## Platform transport
|
|
142
|
+
|
|
143
|
+
On POSIX systems the host listens on a user-scoped Unix-domain socket in the
|
|
144
|
+
local temporary namespace. On Windows it listens on a user-scoped named pipe.
|
|
145
|
+
The authoritative state and startup lock are kept in the user's ForgeLoop
|
|
146
|
+
persistent-search directory. The exact endpoint, home directory, process
|
|
147
|
+
entrypoint, and lock paths are internal machine-local details; normal status,
|
|
148
|
+
doctor, search results, and MCP projections do not expose them.
|
|
149
|
+
|
|
150
|
+
The host is launched with:
|
|
151
|
+
|
|
152
|
+
- the current ForgeLoop package entrypoint and package version;
|
|
153
|
+
- a user-scoped home/environment binding;
|
|
154
|
+
- detached, ignored stdio;
|
|
155
|
+
- `shell: false` and direct argument arrays;
|
|
156
|
+
- a generated nonce and scope identity recorded in host state.
|
|
157
|
+
|
|
158
|
+
The Windows implementation uses the same protocol, bounds, handshake, nonce,
|
|
159
|
+
and ownership model as POSIX. Native transport coverage is exercised by the
|
|
160
|
+
platform-specific test suite and the Windows CI matrix; local non-Windows
|
|
161
|
+
validation cannot substitute for a Windows run.
|
|
162
|
+
|
|
163
|
+
## Ownership and safety
|
|
164
|
+
|
|
165
|
+
The state file is only a coordination hint. Before reuse, shutdown, or stale
|
|
166
|
+
cleanup, ForgeLoop validates the state schema and checks the endpoint and live
|
|
167
|
+
process identity. Depending on platform and available process inspection, the
|
|
168
|
+
ownership proof uses an endpoint handshake or a process command-line identity
|
|
169
|
+
that includes the expected host entrypoint, persistent-server marker, and
|
|
170
|
+
scope.
|
|
171
|
+
|
|
172
|
+
The handshake binds these values:
|
|
173
|
+
|
|
174
|
+
- transport protocol version;
|
|
175
|
+
- ForgeLoop package version;
|
|
176
|
+
- user scope identity;
|
|
177
|
+
- host process ID;
|
|
178
|
+
- generated host nonce.
|
|
179
|
+
|
|
180
|
+
Shutdown requires the same nonce. A PID by itself is never enough. Invalid
|
|
181
|
+
state, endpoint substitution, a mismatched version, an unverified process, or
|
|
182
|
+
an unexpected endpoint produces a stable transport error and fails closed.
|
|
183
|
+
|
|
184
|
+
Relevant error codes are exported by
|
|
185
|
+
[`errors.js`](../src/persistent-transport/errors.js) and include:
|
|
186
|
+
|
|
187
|
+
| Code | Meaning |
|
|
188
|
+
| --- | --- |
|
|
189
|
+
| `E_PERSISTENT_TRANSPORT_UNAVAILABLE` | The expected local host or connection is unavailable |
|
|
190
|
+
| `E_PERSISTENT_TRANSPORT_TIMEOUT` | A bounded connect, handshake, or request wait expired |
|
|
191
|
+
| `E_PERSISTENT_TRANSPORT_START_FAILED` | Startup coordination or host readiness exceeded its bound |
|
|
192
|
+
| `E_PERSISTENT_TRANSPORT_PROTOCOL_MISMATCH` | Client and host protocol/package identity is incompatible |
|
|
193
|
+
| `E_PERSISTENT_TRANSPORT_OWNERSHIP_UNVERIFIED` | State or endpoint identity cannot be proven |
|
|
194
|
+
| `E_PERSISTENT_TRANSPORT_FRAME_INVALID` | A frame is truncated or not valid JSON |
|
|
195
|
+
| `E_PERSISTENT_TRANSPORT_FRAME_TOO_LARGE` | A request or response exceeds its frame bound |
|
|
196
|
+
| `E_PERSISTENT_TRANSPORT_INVALID_REQUEST` | Method, request ID, parameters, or handshake order is invalid |
|
|
197
|
+
| `E_PERSISTENT_TRANSPORT_INVALID_RESPONSE` | The response shape or response ID is invalid |
|
|
198
|
+
| `E_PERSISTENT_TRANSPORT_HOST_STALE` | A stale host condition is detected at the transport boundary |
|
|
199
|
+
|
|
200
|
+
The full public error inventory remains generated in
|
|
201
|
+
[`TROUBLESHOOTING.md`](./TROUBLESHOOTING.md).
|
|
202
|
+
|
|
203
|
+
## Privacy and public projections
|
|
204
|
+
|
|
205
|
+
Repository content is searched locally. The persistent host does not persist
|
|
206
|
+
query history, matches, repository content, task evidence, or lifecycle
|
|
207
|
+
receipts. Search results are returned to the requesting local caller and are
|
|
208
|
+
normalized by the Repository Index service.
|
|
209
|
+
|
|
210
|
+
Public status projections are intentionally smaller than internal state. A
|
|
211
|
+
normal `forgeloop doctor --json` or integration status result may report the
|
|
212
|
+
transport schema, status, running/owned booleans, protocol version, and
|
|
213
|
+
ForgeLoop version, but not endpoint, state, lock, repository-root, index, or
|
|
214
|
+
binary paths. The same rule applies to the MCP resource
|
|
215
|
+
`forgeloop://repository/index-status` and `forgeloop_search` results.
|
|
216
|
+
|
|
217
|
+
This is local process isolation and path minimization, not cryptographic
|
|
218
|
+
authentication against a privileged process running as the same user. A
|
|
219
|
+
privileged same-user process can still observe or deny local IPC. The ownership
|
|
220
|
+
checks are designed to prevent accidental PID reuse, stale-state cleanup, and
|
|
221
|
+
endpoint substitution from being treated as trusted ForgeLoop host activity.
|
|
222
|
+
See [`THREAT_MODEL.md`](../THREAT_MODEL.md) and
|
|
223
|
+
[`SECURITY.md`](../SECURITY.md) for the broader security boundary.
|
|
224
|
+
|
|
225
|
+
## Integration API and MCP
|
|
226
|
+
|
|
227
|
+
The public Integration API remains direct and transport-neutral:
|
|
228
|
+
|
|
229
|
+
```js
|
|
230
|
+
import {
|
|
231
|
+
repositorySearch,
|
|
232
|
+
repositoryIndexStatus,
|
|
233
|
+
} from "@cassiomc1/forgeloop/integration";
|
|
234
|
+
|
|
235
|
+
const result = await repositorySearch({
|
|
236
|
+
projectPath: ".",
|
|
237
|
+
pattern: "needle",
|
|
238
|
+
fixedStrings: true,
|
|
239
|
+
});
|
|
240
|
+
|
|
241
|
+
const status = await repositoryIndexStatus({ projectPath: "." });
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
The MCP adapter maps `forgeloop_search` and
|
|
245
|
+
`forgeloop://repository/index-status` to those canonical services. MCP does
|
|
246
|
+
not connect to, start, stop, or inspect the persistent CLI host. This keeps
|
|
247
|
+
MCP session metadata, transport choice, and host presentation separate from
|
|
248
|
+
Repository Index and lifecycle authority. See
|
|
249
|
+
[`UNIVERSAL_INTEGRATION.md`](./UNIVERSAL_INTEGRATION.md) and
|
|
250
|
+
[`MCP.md`](./MCP.md).
|
|
251
|
+
|
|
252
|
+
## Operational diagnosis
|
|
253
|
+
|
|
254
|
+
Use the public Repository Index commands when search is unhealthy:
|
|
255
|
+
|
|
256
|
+
```bash
|
|
257
|
+
forgeloop index-status --json
|
|
258
|
+
forgeloop doctor --json
|
|
259
|
+
forgeloop search "pattern" --json
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
For an absent or incomplete managed engine, use the explicitly authorized
|
|
263
|
+
maintenance flow described in [`REPOSITORY_INDEX.md`](./REPOSITORY_INDEX.md):
|
|
264
|
+
|
|
265
|
+
```bash
|
|
266
|
+
forgeloop index-setup --asset <pinned-asset-archive>
|
|
267
|
+
forgeloop index-start --json
|
|
268
|
+
forgeloop index-rebuild --json
|
|
269
|
+
```
|
|
270
|
+
|
|
271
|
+
Do not delete the whole `.forgeloop` directory, manually edit host state, or
|
|
272
|
+
stop a process by executable name. If the persistent host is unavailable, a
|
|
273
|
+
subsequent CLI search will perform its bounded on-demand recovery. If the
|
|
274
|
+
canonical search service reports an index, engine, request, or native-output
|
|
275
|
+
error, follow the Repository Index troubleshooting procedure; transport
|
|
276
|
+
recovery does not authorize an alternate backend.
|
|
277
|
+
|
|
278
|
+
## Release and compatibility
|
|
279
|
+
|
|
280
|
+
The 1.11.0 release candidate documents this transport while preserving
|
|
281
|
+
protocol v1, schema v1, and Integration API v1. The package version, registry
|
|
282
|
+
publication, Git tag, GitHub Release, deployment, and merge are separate
|
|
283
|
+
external lifecycle events. Local tests or a successful PR do not prove that
|
|
284
|
+
the package has been published.
|
|
285
|
+
|
|
286
|
+
The package release boundary ships the transport runtime and this reference,
|
|
287
|
+
but not user-specific state, sockets, named pipes, native release binaries, or
|
|
288
|
+
derived repository indexes. The release checklist is
|
|
289
|
+
[`RELEASE_CHECKLIST.md`](./RELEASE_CHECKLIST.md).
|
package/docs/RECIPES.md
CHANGED
|
@@ -29,6 +29,7 @@ Concise, copy-paste friendly recipes for common ForgeLoop tasks.
|
|
|
29
29
|
21. [Generate and Verify Code Attestation](#recipe-21--generate-and-verify-code-attestation)
|
|
30
30
|
22. [Verify a Revision Range](#recipe-22--verify-a-revision-range)
|
|
31
31
|
23. [Run Structural Quality Feedback](#recipe-23--run-structural-quality-feedback)
|
|
32
|
+
24. [Use ForgeLoop Repository Search](#recipe-24--use-forgeloop-repository-search)
|
|
32
33
|
|
|
33
34
|
---
|
|
34
35
|
|
|
@@ -662,6 +663,35 @@ does not block completion by itself. See
|
|
|
662
663
|
[`STRUCTURAL_QUALITY.md`](./STRUCTURAL_QUALITY.md) for policy, provider,
|
|
663
664
|
Sentrux, bundle, and error-code details.
|
|
664
665
|
|
|
666
|
+
---
|
|
667
|
+
|
|
668
|
+
### Recipe 24 — Use ForgeLoop Repository Search
|
|
669
|
+
|
|
670
|
+
Repository-wide search uses the mandatory managed Repository Index. The
|
|
671
|
+
service is shared by the CLI, Integration API, and MCP adapter; it never
|
|
672
|
+
silently falls back to an unpinned executable or another search tool.
|
|
673
|
+
|
|
674
|
+
```bash
|
|
675
|
+
forgeloop init
|
|
676
|
+
forgeloop index-status --json
|
|
677
|
+
forgeloop search "ExecutionReceipt" --glob "*.js" --context 2 --json
|
|
678
|
+
```
|
|
679
|
+
|
|
680
|
+
Use the explicit `FORGELOOP_TGREP_BINARY=/absolute/path/to/tgrep` override
|
|
681
|
+
only for development or tests. For an air-gapped setup, preload the exact
|
|
682
|
+
release archive:
|
|
683
|
+
|
|
684
|
+
```bash
|
|
685
|
+
forgeloop index-setup --asset /absolute/path/tgrep-v1.0.3-asset.tar.gz --json
|
|
686
|
+
```
|
|
687
|
+
|
|
688
|
+
If status is not `READY`, inspect its structured diagnostic and use the
|
|
689
|
+
narrowest repair (`index-start`, `index-setup`, or `index-rebuild`). Search
|
|
690
|
+
output is discovery data, never verification evidence, task state, or a
|
|
691
|
+
reason to narrow a verification scope. See
|
|
692
|
+
[`REPOSITORY_INDEX.md`](./REPOSITORY_INDEX.md) for the provider-neutral result
|
|
693
|
+
contract, resource policy, offline behavior, and security boundary.
|
|
694
|
+
|
|
665
695
|
## Run ForgeLoop through MCP (safe mode)
|
|
666
696
|
|
|
667
697
|
Start the local MCP adapter and inspect what it exposes:
|
|
@@ -3,6 +3,27 @@
|
|
|
3
3
|
This is the current release checklist for `@cassiomc1/forgeloop`. It is a
|
|
4
4
|
preparation and verification checklist; it does not authorize publication.
|
|
5
5
|
|
|
6
|
+
## ForgeLoop 1.11.0 candidate scope
|
|
7
|
+
|
|
8
|
+
The 1.11.0 candidate refreshes the public documentation architecture around
|
|
9
|
+
the managed Repository Index and CLI-only persistent search transport. The
|
|
10
|
+
candidate must keep these boundaries explicit:
|
|
11
|
+
|
|
12
|
+
- [ ] README architecture visual and text fallback describe CLI persistent
|
|
13
|
+
search separately from direct Integration API/MCP access.
|
|
14
|
+
- [ ] [`docs/REPOSITORY_INDEX.md`](./REPOSITORY_INDEX.md) and
|
|
15
|
+
[`docs/PERSISTENT_SEARCH_TRANSPORT.md`](./PERSISTENT_SEARCH_TRANSPORT.md)
|
|
16
|
+
agree on tgrep management, no-fallback behavior, local IPC, ownership,
|
|
17
|
+
bounded recovery, privacy, and derived-state semantics.
|
|
18
|
+
- [ ] All package-shipped documentation indexes and the package file list
|
|
19
|
+
include the persistent transport reference.
|
|
20
|
+
- [ ] Lifecycle, evidence, completion, and publication remain independent of
|
|
21
|
+
Repository Index and persistent-host health.
|
|
22
|
+
|
|
23
|
+
This branch prepares the candidate and its pull request. npm publication,
|
|
24
|
+
tagging, GitHub Release, deployment, and merge remain separately authorized
|
|
25
|
+
actions.
|
|
26
|
+
|
|
6
27
|
## Contract and package identity
|
|
7
28
|
|
|
8
29
|
- [ ] `package.json` and `package-lock.json` contain the same package version.
|
|
@@ -68,11 +89,24 @@ preparation and verification checklist; it does not authorize publication.
|
|
|
68
89
|
## Integration and cross-platform evidence
|
|
69
90
|
|
|
70
91
|
- [ ] `npm run pack:check` and `npm run pack:smoke` pass.
|
|
92
|
+
- [ ] `npm pack --dry-run` includes Repository Index runtime/manifest/docs and
|
|
93
|
+
excludes native release binaries and derived `.forgeloop` index data.
|
|
71
94
|
- [ ] The npm publication workflow runs `npm run pack:smoke` before its
|
|
72
95
|
provenance-backed publish step.
|
|
73
96
|
- [ ] `npm run mcp:test` either runs the configured MCP tests or reports the
|
|
74
97
|
single actionable setup prerequisite.
|
|
75
98
|
- [ ] `npm run mcp:pack:check` passes when MCP dependencies are available.
|
|
99
|
+
- [ ] Repository Index provider-neutral CLI, Integration API, and MCP
|
|
100
|
+
surfaces expose the same normalized result and status contracts.
|
|
101
|
+
- [ ] The checked-in tgrep manifest passes archive and executable checksum/
|
|
102
|
+
version validation for every supported platform, with no placeholder
|
|
103
|
+
hashes or `latest` URL.
|
|
104
|
+
- [ ] Matrix CI runs the real pinned tgrep artifact on Linux, macOS, and
|
|
105
|
+
Windows; native setup/start/status/search/live-watcher, crash-recovery,
|
|
106
|
+
migration, differential, and stop tests are green with no continue-on-
|
|
107
|
+
error path.
|
|
108
|
+
- [ ] `doctor` reports an unhealthy mandatory Repository Index instead of
|
|
109
|
+
silently falling back to `rg`, `grep`, or `PATH` discovery.
|
|
76
110
|
- [ ] Generic CI verification uses explicit provider, base, and head revisions.
|
|
77
111
|
- [ ] Windows full-suite evidence is green on the main branch when scheduled.
|
|
78
112
|
- [ ] Frozen Python 3.9+ validators pass with `python3 -m unittest discover -s tests`.
|