opencode-gbuild 0.7.0 → 0.7.1
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/README.md +4 -4
- package/cypher/attention.cypher +1 -1
- package/cypher/dispatch.cypher +1 -1
- package/cypher/feature.cypher +1 -1
- package/cypher/node.cypher +1 -1
- package/cypher/progress.cypher +1 -1
- package/cypher/record.cypher +1 -1
- package/cypher/schema.cypher +1 -1
- package/cypher/set-status.cypher +1 -1
- package/cypher/status.cypher +1 -1
- package/cypher/validate.cypher +1 -1
- package/package.json +1 -1
- package/reference/cypher.md +26 -12
- package/reference/queries.md +1 -1
- package/skills/plan/SKILL.md +4 -4
- package/skills/pr/SKILL.md +2 -2
- package/skills/review/SKILL.md +2 -2
- package/skills/run/SKILL.md +7 -7
- package/skills/status/SKILL.md +3 -3
- package/templates/example.cypher +1 -1
package/README.md
CHANGED
|
@@ -185,7 +185,7 @@ decision is wanted; neither guesses.
|
|
|
185
185
|
|
|
186
186
|
## Runtime
|
|
187
187
|
|
|
188
|
-
gbuild **requires the [CypherLite](https://github.com/neo4j-labs/cypherlite) CLI**, 0.
|
|
188
|
+
gbuild **requires the [CypherLite](https://github.com/neo4j-labs/cypherlite) CLI**, 0.12.0 or newer:
|
|
189
189
|
|
|
190
190
|
```bash
|
|
191
191
|
curl -sSfL https://neo4j-labs.github.io/cypherlite/install.sh | bash
|
|
@@ -196,9 +196,9 @@ direct JSON editing. The plugin ships the queries as `.cypher` files; skills pip
|
|
|
196
196
|
(`.gbuild/<feature>/db` inside the feature's worktree — examples below run from there):
|
|
197
197
|
|
|
198
198
|
```bash
|
|
199
|
-
cypherlite .gbuild/<feature>/db --mode jsonl < plugins/gbuild/cypher/validate.cypher # format gate: no output = valid
|
|
200
|
-
cypherlite .gbuild/<feature>/db --mode jsonl < plugins/gbuild/cypher/progress.cypher # one row per wave: counts + open nodes
|
|
201
|
-
cypherlite
|
|
199
|
+
cypherlite query --database .gbuild/<feature>/db --mode jsonl < plugins/gbuild/cypher/validate.cypher # format gate: no output = valid
|
|
200
|
+
cypherlite query --database .gbuild/<feature>/db --mode jsonl < plugins/gbuild/cypher/progress.cypher # one row per wave: counts + open nodes
|
|
201
|
+
cypherlite query "MATCH (n:GbuildNode {status: 'failed'}) RETURN n.slug" --database .gbuild/<feature>/db --mode jsonl # anything else
|
|
202
202
|
```
|
|
203
203
|
|
|
204
204
|
Reads are deliberately narrow so a run doesn't pay for the whole graph on every step: `run` claims a
|
package/cypher/attention.cypher
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
// in_progress claimed but not recorded; if no run is active, an interrupted wave left it
|
|
4
4
|
// blocked-by-failed pending behind a failed node, so it can never unblock on its own;
|
|
5
5
|
// `detail` = the failed nodes it waits on
|
|
6
|
-
// cypherlite .gbuild/<slug>/db --mode jsonl < cypher/attention.cypher
|
|
6
|
+
// cypherlite query --database .gbuild/<slug>/db --mode jsonl < cypher/attention.cypher
|
|
7
7
|
CALL {
|
|
8
8
|
MATCH (n:GbuildNode {status: 'failed'})
|
|
9
9
|
RETURN n.slug AS slug, 'failed' AS reason,
|
package/cypher/dispatch.cypher
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
// external, and its `shape` says where to find it. No rows = nothing is
|
|
6
6
|
// ready (the graph is done or stuck — ask progress.cypher / attention.cypher).
|
|
7
7
|
// For a router, cancel the unselected branches with set-status.cypher first.
|
|
8
|
-
// cypherlite .gbuild/<slug>/db --mode jsonl < cypher/dispatch.cypher
|
|
8
|
+
// cypherlite query --database .gbuild/<slug>/db --mode jsonl < cypher/dispatch.cypher
|
|
9
9
|
MATCH (n:GbuildNode {status: 'pending'})
|
|
10
10
|
WHERE NOT EXISTS { MATCH (n)-[:DEPENDS_ON]->(d:GbuildNode) WHERE NOT d.status IN ['completed', 'cancelled'] }
|
|
11
11
|
SET n.status = 'in_progress'
|
package/cypher/feature.cypher
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
// nodes that cover each criterion. What review hands the auditor and what pr
|
|
3
3
|
// builds the description from. Per-node output values are not included — get
|
|
4
4
|
// one node's with node.cypher if you actually need it.
|
|
5
|
-
// cypherlite .gbuild/<slug>/db --mode jsonl < cypher/feature.cypher
|
|
5
|
+
// cypherlite query --database .gbuild/<slug>/db --mode jsonl < cypher/feature.cypher
|
|
6
6
|
MATCH (f:Feature)
|
|
7
7
|
RETURN f.feature AS feature,
|
|
8
8
|
f.destination AS destination,
|
package/cypher/node.cypher
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
// external (from the codebase / environment): its `from` and `value` are null.
|
|
4
4
|
// Used for reopen and ad-hoc inspection; run gets its definitions from
|
|
5
5
|
// dispatch.cypher instead.
|
|
6
|
-
// cypherlite .gbuild/<slug>/db --mode jsonl --param 'slug="<node-slug>"' < cypher/node.cypher
|
|
6
|
+
// cypherlite query --database .gbuild/<slug>/db --mode jsonl --param 'slug="<node-slug>"' < cypher/node.cypher
|
|
7
7
|
MATCH (n:GbuildNode {slug: $slug})
|
|
8
8
|
RETURN n.slug AS slug,
|
|
9
9
|
n.title AS title,
|
package/cypher/progress.cypher
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
// that wave not yet completed or cancelled. A wave with `open: []` is done;
|
|
3
3
|
// the graph is done when every row's `open` is empty. `wave` is the longest
|
|
4
4
|
// DEPENDS_ON chain below a node (0 = no dependencies).
|
|
5
|
-
// cypherlite .gbuild/<slug>/db --mode jsonl < cypher/progress.cypher
|
|
5
|
+
// cypherlite query --database .gbuild/<slug>/db --mode jsonl < cypher/progress.cypher
|
|
6
6
|
MATCH (n:GbuildNode)
|
|
7
7
|
OPTIONAL MATCH p = (n)-[:DEPENDS_ON*]->()
|
|
8
8
|
WITH n, coalesce(max(length(p)), 0) AS wave
|
package/cypher/record.cypher
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
// you sent. Output values must be scalars or lists of scalars — one nested
|
|
8
8
|
// value rejects the whole batch (InvalidPropertyType); JSON-encode it and
|
|
9
9
|
// resend.
|
|
10
|
-
// cypherlite .gbuild/<slug>/db --mode jsonl --param 'results=[
|
|
10
|
+
// cypherlite query --database .gbuild/<slug>/db --mode jsonl --param 'results=[
|
|
11
11
|
// {"slug": "a", "verdict": "pass", "failed_criteria": [], "outputs": {"value": 7},
|
|
12
12
|
// "started_at": "<iso>", "completed_at": "<iso>"},
|
|
13
13
|
// {"slug": "b", "verdict": "fail", "failed_criteria": ["<criterion>"]}
|
package/cypher/schema.cypher
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// gbuild store schema. Run once, when plan creates the store:
|
|
2
|
-
// cypherlite .gbuild/<slug>/db --snapshot-format json < cypher/schema.cypher
|
|
2
|
+
// cypherlite query --database .gbuild/<slug>/db --snapshot-format json < cypher/schema.cypher
|
|
3
3
|
// Everything the engine can enforce at write time lives here; the rest of the
|
|
4
4
|
// contract is checked by validate.cypher.
|
|
5
5
|
CREATE CONSTRAINT feature_name FOR (n:Feature) REQUIRE n.feature IS :: STRING;
|
package/cypher/set-status.cypher
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
// retry/repair, stop), or `pending` (reset nodes an interrupted run left
|
|
4
4
|
// in_progress). `completed` is rejected — only record.cypher may set it, so it
|
|
5
5
|
// can require a passing review and every output value.
|
|
6
|
-
// cypherlite .gbuild/<slug>/db --mode jsonl --param 'slugs=["a","b"]' --param 'status="cancelled"' \
|
|
6
|
+
// cypherlite query --database .gbuild/<slug>/db --mode jsonl --param 'slugs=["a","b"]' --param 'status="cancelled"' \
|
|
7
7
|
// < cypher/set-status.cypher
|
|
8
8
|
UNWIND $slugs AS s
|
|
9
9
|
MATCH (n:GbuildNode {slug: s})
|
package/cypher/status.cypher
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
// otherwise = the stored status (in_progress, completed, failed, cancelled)
|
|
5
5
|
// `wave` is the longest DEPENDS_ON chain below the node (0 = no dependencies),
|
|
6
6
|
// so nodes sharing a wave are safe to run concurrently.
|
|
7
|
-
// cypherlite .gbuild/<slug>/db --mode jsonl < cypher/status.cypher
|
|
7
|
+
// cypherlite query --database .gbuild/<slug>/db --mode jsonl < cypher/status.cypher
|
|
8
8
|
MATCH (n:GbuildNode)
|
|
9
9
|
OPTIONAL MATCH p = (n)-[:DEPENDS_ON*]->()
|
|
10
10
|
WITH n, coalesce(max(length(p)), 0) AS wave
|
package/cypher/validate.cypher
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// gbuild format gate. Zero rows = valid; every row is one violation.
|
|
2
|
-
// cypherlite .gbuild/<slug>/db --mode jsonl < cypher/validate.cypher
|
|
2
|
+
// cypherlite query --database .gbuild/<slug>/db --mode jsonl < cypher/validate.cypher
|
|
3
3
|
// Required properties, their types and slug/acceptance-id uniqueness are
|
|
4
4
|
// engine constraints (schema.cypher) — a write that breaks them never lands.
|
|
5
5
|
// This query checks everything the engine can't: enums, label/type agreement,
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://json.schemastore.org/package.json",
|
|
3
3
|
"name": "opencode-gbuild",
|
|
4
|
-
"version": "0.7.
|
|
4
|
+
"version": "0.7.1",
|
|
5
5
|
"description": "OpenCode plugin for gbuild — graph-native task planning and execution with concurrent fan-out, per-node review, and durable checkpoints.",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"license": "MIT",
|
package/reference/cypher.md
CHANGED
|
@@ -7,7 +7,7 @@ manual; the skills that only run plugin scripts carry the short version of these
|
|
|
7
7
|
|
|
8
8
|
## Requirement
|
|
9
9
|
|
|
10
|
-
`cypherlite` 0.
|
|
10
|
+
`cypherlite` 0.12.0 or newer must be on PATH. Check first, in every skill:
|
|
11
11
|
|
|
12
12
|
```
|
|
13
13
|
cypherlite --version
|
|
@@ -17,38 +17,44 @@ If the command is missing, stop and tell the user gbuild needs it:
|
|
|
17
17
|
`curl -sSfL https://neo4j-labs.github.io/cypherlite/install.sh | bash`. Never fall back to reading or
|
|
18
18
|
editing `graph.json` by hand.
|
|
19
19
|
|
|
20
|
+
The floor is the ADR-0200 CLI cutover: the store path is a flag (`-d` / `--database PATH`), the first
|
|
21
|
+
positional is the Cypher statement (never the database), and piped scripts and the interactive shell
|
|
22
|
+
require the explicit `query` verb. The old path-first form — database as the first argument — hard-fails.
|
|
23
|
+
|
|
20
24
|
## One writer, one command at a time
|
|
21
25
|
|
|
22
26
|
CypherLite takes an exclusive lock on the store while a process has it open. A second process — reader
|
|
23
|
-
or writer — fails with `storage locked` (exit
|
|
27
|
+
or writer — fails with `storage locked` (exit 5). So:
|
|
24
28
|
|
|
25
29
|
- **Only the skill running in the main context runs `cypherlite` against the store.** Subagents never
|
|
26
30
|
do: give them what they need in their prompt, have them report results in their final message, and
|
|
27
31
|
record those results yourself.
|
|
28
32
|
- **Never run two `cypherlite` commands against the same store at once** — no parallel tool calls on it.
|
|
29
33
|
Fan-out is for agents, not for store access.
|
|
30
|
-
- On `storage locked
|
|
31
|
-
few seconds and retry, up to 3 times; then stop and report. Never delete
|
|
34
|
+
- On `storage locked` (exit 5), another process holds the store (another gbuild command, a REPL left
|
|
35
|
+
open). Wait a few seconds and retry, up to 3 times; then stop and report. Never delete
|
|
36
|
+
`.cypherlite.lock`.
|
|
32
37
|
|
|
33
38
|
## Invocation
|
|
34
39
|
|
|
35
40
|
Always pass `--mode jsonl`: one compact JSON object per row, one row per line, and no output at all when
|
|
36
41
|
there are no rows. `DB` below is the feature store: `.gbuild/<feature>/db` inside the feature worktree
|
|
37
42
|
(`<git-common-dir>/gbuild/<feature>/tree/`), or in the main tree for a feature charted before the
|
|
38
|
-
worktree layout.
|
|
43
|
+
worktree layout. Every call is `cypherlite query [STATEMENT] --database DB …`; with no STATEMENT the
|
|
44
|
+
piped stdin is the script list.
|
|
39
45
|
|
|
40
46
|
```
|
|
41
47
|
# a plugin script
|
|
42
|
-
cypherlite DB --mode jsonl < ${CLAUDE_PLUGIN_ROOT}/cypher/progress.cypher
|
|
48
|
+
cypherlite query --database DB --mode jsonl < ${CLAUDE_PLUGIN_ROOT}/cypher/progress.cypher
|
|
43
49
|
|
|
44
50
|
# a plugin script with parameters
|
|
45
|
-
cypherlite DB --mode jsonl --param 'slug="b-consume-doubled"' < ${CLAUDE_PLUGIN_ROOT}/cypher/node.cypher
|
|
51
|
+
cypherlite query --database DB --mode jsonl --param 'slug="b-consume-doubled"' < ${CLAUDE_PLUGIN_ROOT}/cypher/node.cypher
|
|
46
52
|
|
|
47
53
|
# an ad-hoc read — return only the columns you need, and keep a LIMIT on anything that can grow
|
|
48
|
-
cypherlite
|
|
54
|
+
cypherlite query "MATCH (n:GbuildNode {status: 'failed'}) RETURN n.slug LIMIT 20" --database DB --mode jsonl
|
|
49
55
|
|
|
50
56
|
# a write you author (plan, reopen, fixes) — quoted heredoc delimiter, so the shell expands nothing
|
|
51
|
-
cypherlite DB <<'CYPHER'
|
|
57
|
+
cypherlite query --database DB <<'CYPHER'
|
|
52
58
|
.begin
|
|
53
59
|
MATCH (n:GbuildNode {slug: 'b-consume-doubled'}) SET n.title = 'Consume the value, double it';
|
|
54
60
|
.commit
|
|
@@ -73,8 +79,16 @@ CYPHER
|
|
|
73
79
|
JSON-encode anything nested into a string.
|
|
74
80
|
- **Read the result.** The plugin write scripts are guarded and return what they actually changed.
|
|
75
81
|
Compare it with what you asked for; never assume a write landed.
|
|
76
|
-
- **
|
|
77
|
-
|
|
82
|
+
- **Check the exit code.** `0` is success (an empty result included). `5` is `storage locked` or a
|
|
83
|
+
write conflict — wait and retry as above. `6` is a rejected statement — syntax, semantic, or type
|
|
84
|
+
error, including `ConstraintValidationFailed` and writes on a `--read-only` store — read stderr, fix,
|
|
85
|
+
retry the whole transaction. `2` is a usage error — fix the invocation, not the data. `1` is any other
|
|
86
|
+
runtime failure. With `--mode jsonl` a failure also prints one JSON error envelope on stdout, after
|
|
87
|
+
any rows already written: `{"error":{"code","exit_code","kind","message","retryable"}}`.
|
|
88
|
+
- **Agent output is capped at 100 rows.** Under a detected agent harness with non-terminal stdout —
|
|
89
|
+
gbuild skills always are — a statement prints at most 100 rows, warns on stderr, and still exits `0`.
|
|
90
|
+
Keep a `LIMIT` on anything that can grow; when you genuinely need every row, pass `--max-rows 0` (or
|
|
91
|
+
set `CYPHERLITE_MAX_ROWS=0`).
|
|
78
92
|
|
|
79
93
|
## Creating a store
|
|
80
94
|
|
|
@@ -83,7 +97,7 @@ it just created:
|
|
|
83
97
|
|
|
84
98
|
```
|
|
85
99
|
mkdir -p DB
|
|
86
|
-
cypherlite DB --snapshot-format json < ${CLAUDE_PLUGIN_ROOT}/cypher/schema.cypher
|
|
100
|
+
cypherlite query --database DB --snapshot-format json < ${CLAUDE_PLUGIN_ROOT}/cypher/schema.cypher
|
|
87
101
|
printf '*\n!.gitignore\n!graph.json\n' > DB/.gitignore
|
|
88
102
|
```
|
|
89
103
|
|
package/reference/queries.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# Ad-hoc queries
|
|
2
2
|
|
|
3
3
|
The plugin scripts (`reference/cypher.md` § Script catalog) cover everything the skills do. These are for
|
|
4
|
-
the questions in between. Run them with `cypherlite DB --mode jsonl
|
|
4
|
+
the questions in between. Run them with `cypherlite query "<query>" --database DB --mode jsonl`, one at a
|
|
5
5
|
time — `DB` is the feature store (`.gbuild/<feature>/db` inside the feature worktree);
|
|
6
6
|
return only the columns you need and keep a `LIMIT` on anything that can grow.
|
|
7
7
|
|
package/skills/plan/SKILL.md
CHANGED
|
@@ -155,7 +155,7 @@ Then write the whole graph as **one** Cypher script, piped through a quoted here
|
|
|
155
155
|
the edges), `.commit`, `.checkpoint`.
|
|
156
156
|
|
|
157
157
|
```
|
|
158
|
-
cypherlite DB <<'CYPHER'
|
|
158
|
+
cypherlite query --database DB <<'CYPHER'
|
|
159
159
|
.begin
|
|
160
160
|
CREATE (f:Feature {feature: '<slug>', destination: '...', context: '...', out_of_scope: ['...']})
|
|
161
161
|
CREATE (a1:Acceptance {id: 'a-1', text: '...'})
|
|
@@ -178,7 +178,7 @@ slug) fails the transaction and writes nothing — fix the script and run it aga
|
|
|
178
178
|
### 9. Validate
|
|
179
179
|
|
|
180
180
|
```
|
|
181
|
-
cypherlite DB --mode jsonl < ${CLAUDE_PLUGIN_ROOT}/cypher/validate.cypher
|
|
181
|
+
cypherlite query --database DB --mode jsonl < ${CLAUDE_PLUGIN_ROOT}/cypher/validate.cypher
|
|
182
182
|
```
|
|
183
183
|
|
|
184
184
|
No output means valid. Every row is a violation (`check`, `detail`): fix it with Cypher — a `.begin` …
|
|
@@ -188,7 +188,7 @@ hand off or commit a graph that fails validation, and never edit `graph.json` di
|
|
|
188
188
|
Then confirm run-readiness:
|
|
189
189
|
|
|
190
190
|
```
|
|
191
|
-
cypherlite DB --mode jsonl < ${CLAUDE_PLUGIN_ROOT}/cypher/progress.cypher
|
|
191
|
+
cypherlite query --database DB --mode jsonl < ${CLAUDE_PLUGIN_ROOT}/cypher/progress.cypher
|
|
192
192
|
```
|
|
193
193
|
|
|
194
194
|
One row per wave: each row's `open` slugs are the decomposition, and the `frontier` counts are what
|
|
@@ -220,7 +220,7 @@ Report the branch, `FT`, the waves, and the frontier. Close with `next: /gbuild:
|
|
|
220
220
|
3. Write it as one script that `MATCH`es what it connects to and `CREATE`s the rest:
|
|
221
221
|
|
|
222
222
|
```
|
|
223
|
-
cypherlite DB <<'CYPHER'
|
|
223
|
+
cypherlite query --database DB <<'CYPHER'
|
|
224
224
|
.begin
|
|
225
225
|
MATCH (f:Feature), (up:GbuildNode {slug: '<existing-slug>'})-[:OUTPUT]->(up_out:Field {name: '<field>'})
|
|
226
226
|
CREATE (f)-[:HAS_ACCEPTANCE]->(a:Acceptance {id: 'a-3', text: '...'})
|
package/skills/pr/SKILL.md
CHANGED
|
@@ -27,7 +27,7 @@ Verify the environment before touching the remote. Stop with a clear, actionable
|
|
|
27
27
|
4. **Feature worktree and branch.** Resolve `FT` (the feature worktree) and `<branch>` (the feature branch checked out there) exactly as `/gbuild:run`'s step 0 describes — the registered worktree at `<git-common-dir>/gbuild/<slug>/tree`, a legacy feature whose branch is in the main tree, or attach a branch that is checked out nowhere. When `<slug>` is unresolved, use the main tree's current branch as `<branch>` and its root as `FT`. If `<branch>` equals `<base>`, stop — there is nothing to open a PR for.
|
|
28
28
|
5. **Clean tree.** Check for uncommitted changes in the feature worktree (`git -C FT status --porcelain`). `/gbuild:run` commits each node's work as it goes, so it should be clean. If there are uncommitted changes, warn the user and ask whether to proceed (they may want to commit first).
|
|
29
29
|
6. **Commits ahead of base.** Confirm the branch has commits the base lacks (`git log <base>..<branch> --oneline`). If empty, stop — nothing to push.
|
|
30
|
-
7. **Graph finished.** When `<slug>` resolved, run `cypherlite DB --mode jsonl < ${CLAUDE_PLUGIN_ROOT}/cypher/progress.cypher`. If any row's `open` is non-empty, warn that the graph isn't finished (name the open nodes) and ask whether to open the PR anyway. If any row has `failed` > 0, get their names from `attention.cypher` and name them — a PR built on an escalated node is usually premature.
|
|
30
|
+
7. **Graph finished.** When `<slug>` resolved, run `cypherlite query --database DB --mode jsonl < ${CLAUDE_PLUGIN_ROOT}/cypher/progress.cypher`. If any row's `open` is non-empty, warn that the graph isn't finished (name the open nodes) and ask whether to open the PR anyway. If any row has `failed` > 0, get their names from `attention.cypher` and name them — a PR built on an escalated node is usually premature.
|
|
31
31
|
|
|
32
32
|
## Step 2: Determine the remote & push
|
|
33
33
|
|
|
@@ -48,7 +48,7 @@ Gather context from:
|
|
|
48
48
|
|
|
49
49
|
- Commit subjects: `git log <base>..<branch> --oneline`.
|
|
50
50
|
- File overview: `git diff <base>...<branch> --stat`.
|
|
51
|
-
- When `<slug>` resolved: `cypherlite DB --mode jsonl < ${CLAUDE_PLUGIN_ROOT}/cypher/feature.cypher` — the `destination` and the acceptance bar (with the nodes covering each criterion).
|
|
51
|
+
- When `<slug>` resolved: `cypherlite query --database DB --mode jsonl < ${CLAUDE_PLUGIN_ROOT}/cypher/feature.cypher` — the `destination` and the acceptance bar (with the nodes covering each criterion).
|
|
52
52
|
|
|
53
53
|
Derive a concise, conventional-commit-style title from the feature/branch and the changes (e.g. `feat(auth): add OAuth login`).
|
|
54
54
|
|
package/skills/review/SKILL.md
CHANGED
|
@@ -26,7 +26,7 @@ command at a time, always `--mode jsonl` (no output = no rows); on `storage lock
|
|
|
26
26
|
Check the graph is finished — one row per wave, cheap:
|
|
27
27
|
|
|
28
28
|
```
|
|
29
|
-
cypherlite DB --mode jsonl < ${CLAUDE_PLUGIN_ROOT}/cypher/progress.cypher
|
|
29
|
+
cypherlite query --database DB --mode jsonl < ${CLAUDE_PLUGIN_ROOT}/cypher/progress.cypher
|
|
30
30
|
```
|
|
31
31
|
|
|
32
32
|
If any row's `open` is non-empty, say the graph isn't finished (name the open nodes) and ask whether to
|
|
@@ -38,7 +38,7 @@ address.
|
|
|
38
38
|
Fetch the feature context:
|
|
39
39
|
|
|
40
40
|
```
|
|
41
|
-
cypherlite DB --mode jsonl < ${CLAUDE_PLUGIN_ROOT}/cypher/feature.cypher
|
|
41
|
+
cypherlite query --database DB --mode jsonl < ${CLAUDE_PLUGIN_ROOT}/cypher/feature.cypher
|
|
42
42
|
```
|
|
43
43
|
|
|
44
44
|
Launch the `gbuild-auditor` subagent (agents/gbuild-auditor.md — this plugin's own copy, gbuild does not
|
package/skills/run/SKILL.md
CHANGED
|
@@ -42,8 +42,8 @@ Default to `git`. Resolve these facts first, absolute paths, and reuse them thro
|
|
|
42
42
|
Then check and recover:
|
|
43
43
|
|
|
44
44
|
```
|
|
45
|
-
cypherlite DB --mode jsonl < ${CLAUDE_PLUGIN_ROOT}/cypher/validate.cypher
|
|
46
|
-
cypherlite DB --mode jsonl < ${CLAUDE_PLUGIN_ROOT}/cypher/attention.cypher
|
|
45
|
+
cypherlite query --database DB --mode jsonl < ${CLAUDE_PLUGIN_ROOT}/cypher/validate.cypher
|
|
46
|
+
cypherlite query --database DB --mode jsonl < ${CLAUDE_PLUGIN_ROOT}/cypher/attention.cypher
|
|
47
47
|
```
|
|
48
48
|
|
|
49
49
|
- `validate` printing anything → stop and report the rows; do not run a graph `plan` didn't finish
|
|
@@ -55,7 +55,7 @@ cypherlite DB --mode jsonl < ${CLAUDE_PLUGIN_ROOT}/cypher/attention.cypher
|
|
|
55
55
|
them all in one call so they re-dispatch, and mention it in the report:
|
|
56
56
|
|
|
57
57
|
```
|
|
58
|
-
cypherlite DB --mode jsonl --param 'slugs=["<slug>", ...]' --param 'status="pending"' \
|
|
58
|
+
cypherlite query --database DB --mode jsonl --param 'slugs=["<slug>", ...]' --param 'status="pending"' \
|
|
59
59
|
< ${CLAUDE_PLUGIN_ROOT}/cypher/set-status.cypher
|
|
60
60
|
```
|
|
61
61
|
|
|
@@ -87,7 +87,7 @@ behavior this plugin replaces.
|
|
|
87
87
|
1. **CLAIM.**
|
|
88
88
|
|
|
89
89
|
```
|
|
90
|
-
cypherlite DB --mode jsonl < ${CLAUDE_PLUGIN_ROOT}/cypher/dispatch.cypher
|
|
90
|
+
cypherlite query --database DB --mode jsonl < ${CLAUDE_PLUGIN_ROOT}/cypher/dispatch.cypher
|
|
91
91
|
```
|
|
92
92
|
|
|
93
93
|
It moves the whole frontier to `in_progress` and prints one row per claimed node with everything its
|
|
@@ -151,7 +151,7 @@ behavior this plugin replaces.
|
|
|
151
151
|
`VERDICT:` line, `failed_criteria` from its `[fail]` lines:
|
|
152
152
|
|
|
153
153
|
```
|
|
154
|
-
cypherlite DB --mode jsonl --param 'results=[
|
|
154
|
+
cypherlite query --database DB --mode jsonl --param 'results=[
|
|
155
155
|
{"slug": "<slug>", "verdict": "pass", "failed_criteria": [], "outputs": {...},
|
|
156
156
|
"started_at": "<iso>", "completed_at": "<iso>"},
|
|
157
157
|
{"slug": "<slug>", "verdict": "fail", "failed_criteria": ["<criterion>"]}
|
|
@@ -193,8 +193,8 @@ Keep going until a claim returns no rows.
|
|
|
193
193
|
## Step 4: Report and stop
|
|
194
194
|
|
|
195
195
|
```
|
|
196
|
-
cypherlite DB --mode jsonl < ${CLAUDE_PLUGIN_ROOT}/cypher/progress.cypher
|
|
197
|
-
cypherlite DB --mode jsonl < ${CLAUDE_PLUGIN_ROOT}/cypher/attention.cypher
|
|
196
|
+
cypherlite query --database DB --mode jsonl < ${CLAUDE_PLUGIN_ROOT}/cypher/progress.cypher
|
|
197
|
+
cypherlite query --database DB --mode jsonl < ${CLAUDE_PLUGIN_ROOT}/cypher/attention.cypher
|
|
198
198
|
```
|
|
199
199
|
|
|
200
200
|
Every `progress` row with `open: []` → the graph is done. Otherwise `attention` names what's stuck
|
package/skills/status/SKILL.md
CHANGED
|
@@ -31,8 +31,8 @@ This is the human-facing report, so it's the one place that reads every node.
|
|
|
31
31
|
### 1. Load
|
|
32
32
|
|
|
33
33
|
```
|
|
34
|
-
cypherlite DB --mode jsonl < ${CLAUDE_PLUGIN_ROOT}/cypher/status.cypher
|
|
35
|
-
cypherlite DB --mode jsonl < ${CLAUDE_PLUGIN_ROOT}/cypher/validate.cypher
|
|
34
|
+
cypherlite query --database DB --mode jsonl < ${CLAUDE_PLUGIN_ROOT}/cypher/status.cypher
|
|
35
|
+
cypherlite query --database DB --mode jsonl < ${CLAUDE_PLUGIN_ROOT}/cypher/validate.cypher
|
|
36
36
|
```
|
|
37
37
|
|
|
38
38
|
One call after the other. `status.cypher` gives one row per node with its derived `state`
|
|
@@ -84,7 +84,7 @@ Don't read every node of every feature. For each store found — `<git-common-di
|
|
|
84
84
|
plus any legacy `.gbuild/*/db` in the main tree — one store at a time:
|
|
85
85
|
|
|
86
86
|
```
|
|
87
|
-
cypherlite DB --mode jsonl < ${CLAUDE_PLUGIN_ROOT}/cypher/progress.cypher
|
|
87
|
+
cypherlite query --database DB --mode jsonl < ${CLAUDE_PLUGIN_ROOT}/cypher/progress.cypher
|
|
88
88
|
```
|
|
89
89
|
|
|
90
90
|
Print one line per feature: slug, node counts by state summed over its waves, and whether it's done
|
package/templates/example.cypher
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// A worked 4-node diamond: A produces a value, B and C each consume it
|
|
2
2
|
// independently, D joins both. This is exactly the script plan writes for a
|
|
3
3
|
// new feature — one atomic statement, piped into the store:
|
|
4
|
-
// cypherlite .gbuild/<slug>/db < plan.cypher
|
|
4
|
+
// cypherlite query --database .gbuild/<slug>/db < plan.cypher
|
|
5
5
|
// Variables (f, a1, a, a_value, ...) are only scoped to this one statement, so
|
|
6
6
|
// the whole graph is created in a single CREATE chain.
|
|
7
7
|
.begin
|