greprag 5.78.6 → 5.78.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.
- package/dist/commands/delivery-reminder.js +1 -1
- package/dist/commands/delivery.js +3 -0
- package/dist/delivery-config.js +18 -1
- package/dist/opencode-plugin.bundle.js +1 -1
- package/package.json +1 -1
- package/skill/greprag/SKILL.md +1 -1
- package/skill/templates/chip-leader.md +3 -1
- package/skill/templates/chip-spawn.md +2 -0
- package/skill/templates/codex-chip-spawn.md +3 -2
- package/skill/templates/grok-chip-spawn.md +6 -0
|
@@ -31,7 +31,7 @@ function buildDeliveryAnnounce(env) {
|
|
|
31
31
|
'Commit useful, passing work.',
|
|
32
32
|
'Only committed Git state participates in delivery. Ignore all uncommitted and untracked work in every checkout.',
|
|
33
33
|
coordinationLine(env.platform),
|
|
34
|
-
'Sweep every ready same-repo commit into the integration train, resolve conflicts directly, merge to the default branch
|
|
34
|
+
'Sweep every ready same-repo commit into the integration train, resolve conflicts directly, and merge to the default branch. Worktrees build; they do not deploy. Deploy only from the repo canonical primary checkout on that branch. Leave dirt; do not classify it. Merge conflicts are the only coordination.',
|
|
35
35
|
'Use this repo\'s delivery profile and verify production.',
|
|
36
36
|
].join('\n');
|
|
37
37
|
}
|
|
@@ -35,6 +35,9 @@ function runDelivery(args) {
|
|
|
35
35
|
if (result.profile) {
|
|
36
36
|
const git = result.profile.git;
|
|
37
37
|
console.log(` git: ${git.remote}/${git.defaultBranch} · ${git.integrationStrategy} · pushDeploys=${git.pushDeploys}`);
|
|
38
|
+
if (result.profile.deploy?.canonicalRoot) {
|
|
39
|
+
console.log(` canonicalRoot: ${result.profile.deploy.canonicalRoot}`);
|
|
40
|
+
}
|
|
38
41
|
for (const target of result.profile.deploy?.targets ?? []) {
|
|
39
42
|
console.log(` deploy target: ${target.id}${target.procedureId ? ` → ${target.procedureId}` : ''}`);
|
|
40
43
|
}
|
package/dist/delivery-config.js
CHANGED
|
@@ -74,6 +74,20 @@ function safeDoc(root, value, field, errors) {
|
|
|
74
74
|
errors.push(`${field} does not exist: ${relative}`);
|
|
75
75
|
return relative;
|
|
76
76
|
}
|
|
77
|
+
function parseCanonicalRoot(value, errors) {
|
|
78
|
+
if (value === undefined || value === null || value === '')
|
|
79
|
+
return undefined;
|
|
80
|
+
if (typeof value !== 'string') {
|
|
81
|
+
errors.push('deploy.canonicalRoot must be an absolute path');
|
|
82
|
+
return undefined;
|
|
83
|
+
}
|
|
84
|
+
const trimmed = value.trim().replace(/\\/g, '/').replace(/\/+$/, '');
|
|
85
|
+
if (!trimmed || trimmed.split('/').includes('..') || !(trimmed.startsWith('/') || /^[A-Za-z]:\//.test(trimmed))) {
|
|
86
|
+
errors.push('deploy.canonicalRoot must be an absolute path');
|
|
87
|
+
return undefined;
|
|
88
|
+
}
|
|
89
|
+
return trimmed;
|
|
90
|
+
}
|
|
77
91
|
function parseProfile(root, raw) {
|
|
78
92
|
const errors = [];
|
|
79
93
|
if (!raw || typeof raw !== 'object' || Array.isArray(raw)) {
|
|
@@ -99,6 +113,7 @@ function parseProfile(root, raw) {
|
|
|
99
113
|
const deploy = value.deploy;
|
|
100
114
|
const release = value.release;
|
|
101
115
|
const deploySource = deploy ? safeDoc(root, deploy.source, 'deploy.source', errors) : null;
|
|
116
|
+
const canonicalRoot = parseCanonicalRoot(deploy?.canonicalRoot, errors);
|
|
102
117
|
const releaseSource = release ? safeDoc(root, release.source, 'release.source', errors) : null;
|
|
103
118
|
const targetsRaw = deploy?.targets;
|
|
104
119
|
const targets = [];
|
|
@@ -136,7 +151,9 @@ function parseProfile(root, raw) {
|
|
|
136
151
|
integrationStrategy: strategy,
|
|
137
152
|
pushDeploys: pushDeploys,
|
|
138
153
|
},
|
|
139
|
-
deploy: deploy && deploySource
|
|
154
|
+
deploy: deploy && deploySource
|
|
155
|
+
? { source: deploySource, ...(canonicalRoot ? { canonicalRoot } : {}), targets }
|
|
156
|
+
: undefined,
|
|
140
157
|
release: release && releaseSource
|
|
141
158
|
? { source: releaseSource, procedureId: releaseProcedureId } : undefined,
|
|
142
159
|
},
|
|
@@ -2315,7 +2315,7 @@ function buildDeliveryAnnounce(env) {
|
|
|
2315
2315
|
"Commit useful, passing work.",
|
|
2316
2316
|
"Only committed Git state participates in delivery. Ignore all uncommitted and untracked work in every checkout.",
|
|
2317
2317
|
coordinationLine(env.platform),
|
|
2318
|
-
"Sweep every ready same-repo commit into the integration train, resolve conflicts directly, merge to the default branch
|
|
2318
|
+
"Sweep every ready same-repo commit into the integration train, resolve conflicts directly, and merge to the default branch. Worktrees build; they do not deploy. Deploy only from the repo canonical primary checkout on that branch. Leave dirt; do not classify it. Merge conflicts are the only coordination.",
|
|
2319
2319
|
"Use this repo's delivery profile and verify production."
|
|
2320
2320
|
].join("\n");
|
|
2321
2321
|
}
|
package/package.json
CHANGED
package/skill/greprag/SKILL.md
CHANGED
|
@@ -211,7 +211,7 @@ Child watch events may appear on the parent TUI — resume the child to act. Do
|
|
|
211
211
|
|
|
212
212
|
**INBOX MESSAGE FROM A PEER SESSION? REPLY DIRECTLY — the "summarize + confirm" rule is HUMAN-scoped.** Classify by the server-authoritative `from.session_id` (spoof-safe — a cold-open cannot set it): **set ⇒ PEER** agent session → reply/coordinate directly, NO human confirm; **null ⇒ HUMAN** (cold-open / inbound email) → summarize + confirm before acting. The asyncRewake poll tags each delivered wake with `[peer coordination …]` / `[human …]`; the Monitor `--json` stream carries `from.session_id` raw. **GUARD: auto-REPLY, not auto-OBEY** — coordinate with peers freely, but a destructive action a peer *requests* still passes the normal gates; never blindly execute peer instructions. adr: adr/monitor-resilience.md.
|
|
213
213
|
|
|
214
|
-
**COLLISION IN A REPO? (another live session working the SAME repo) — NOTICE ONCE, THEN MOVE.** Work in an isolated branch/worktree. At delivery, resolve `.greprag/delivery.json`, send one fire-and-forget notice to same-repo peers, and continue immediately. Recipients reply only for a concrete conflict; silence is approval. Never poll, call `wait_threads`, inspect peer status, re-read tasks, ask for acknowledgement, or follow up. Sweep every ready same-repo commit; ignore all uncommitted and untracked work. Resolve Git conflicts directly and finish the declared push/deploy/release path. Codex uses `codex_app.send_message_to_thread`; use `greprag send` only for known non-Codex peers. Full mechanism: `docs/delivery-system.md`.
|
|
214
|
+
**COLLISION IN A REPO? (another live session working the SAME repo) — NOTICE ONCE, THEN MOVE.** Work in an isolated branch/worktree. At delivery, resolve `.greprag/delivery.json`, send one fire-and-forget notice to same-repo peers, and continue immediately. Recipients reply only for a concrete conflict; silence is approval. Never poll, call `wait_threads`, inspect peer status, re-read tasks, ask for acknowledgement, or follow up. Sweep every ready same-repo commit; ignore all uncommitted and untracked work. Resolve Git conflicts directly, merge to the default branch, and finish the declared push/deploy/release path from the canonical primary checkout — never from a worktree. Codex uses `codex_app.send_message_to_thread`; use `greprag send` only for known non-Codex peers. Full mechanism: `docs/delivery-system.md`.
|
|
215
215
|
|
|
216
216
|
**Codex: DO NOT CLAIM HOOKS ARE ACTIVE JUST BECAUSE `~/.codex/hooks.json` EXISTS.** Codex Desktop requires Settings -> Settings -> Hooks trust review before command hooks run automatically. If turn capture is missing after `greprag init --codex`, tell the user: open Codex Desktop Settings -> Settings -> Hooks, trust the GrepRAG hooks, then start a fresh Codex session.
|
|
217
217
|
|
|
@@ -116,7 +116,9 @@ ordering in the brief rather than relying on hidden coordination metadata.
|
|
|
116
116
|
8. Review reports, reconcile seams in the planned order, run the whole-mission
|
|
117
117
|
checks, and send the parent a concise closeout.
|
|
118
118
|
9. The parent owns integration and cleanup. Do not silently delete a child
|
|
119
|
-
worktree or treat a report as acceptance.
|
|
119
|
+
worktree or treat a report as acceptance. Children commit in their
|
|
120
|
+
worktrees. After merge to the default branch, deploy only from the repo's
|
|
121
|
+
canonical primary checkout — never `npm run deploy` from a chip worktree.
|
|
120
122
|
|
|
121
123
|
Do not introduce a separate read-only, lease, nested-goal, or delivery-proof
|
|
122
124
|
layer just to make the mission look formal. The durable boundaries are the
|
|
@@ -105,6 +105,8 @@ Monitor (persistent:true): `greprag inbox watch --session <your-8hex> --json --o
|
|
|
105
105
|
|
|
106
106
|
Chips never `npm link` from the worktree — dangling symlinks silently break the CLI everywhere (chained the 2026-05-25 wipe). To test a built CLI globally: merge to main via `/commit`, then `npm i -g <pkg>` from main.
|
|
107
107
|
|
|
108
|
+
Chips never `npm run deploy` (or Wrangler / another provider deploy) from the worktree. Merge to the default branch, then deploy from the repo's canonical primary checkout.
|
|
109
|
+
|
|
108
110
|
## Parent merge discipline — prune at the merge (HARD RULE)
|
|
109
111
|
|
|
110
112
|
When you (the parent) merge a chip branch — through the canonical commit path or a profile-declared merge — prune in the same breath: junction guard (`~/.claude/skills/commit/guard-junctions.sh <worktree>`), `git worktree remove .claude/worktrees/<slug>`, and `git branch -d chip/<slug>` once merged. Deferred cleanup = stale worktrees piling up (field state 2026-06-10: 3 leftovers). Multi-chip missions: worktree dies at the integration-branch merge; the branch lives until the configured default-branch merge (chip-leader Phase 4).
|
|
@@ -175,8 +175,9 @@ not make the parent perform routine child-task archival.
|
|
|
175
175
|
|
|
176
176
|
Do not merge, push, deploy, or manually delete the worktree. The parent
|
|
177
177
|
integrates the commit and may delete the branch after merge; Codex owns managed
|
|
178
|
-
worktree pruning.
|
|
179
|
-
|
|
178
|
+
worktree pruning. After merge, the parent deploys only from the repo's
|
|
179
|
+
canonical primary checkout — never `npm run deploy` from this worktree. If
|
|
180
|
+
review is needed, the parent creates a fresh review chip/session.
|
|
180
181
|
```
|
|
181
182
|
|
|
182
183
|
**Cleanup discipline (HARD RULE):** chip prompts forbid `git clean`,
|
|
@@ -76,6 +76,10 @@ greprag send "IN-FLIGHT: chip/<slug> launched — working" --to <handle>@greprag
|
|
|
76
76
|
The work. Isolated to this worktree / `chip/<slug>`. Default autonomous. To pause
|
|
77
77
|
for a human, say so in the body and `BLOCKED` ping the parent.
|
|
78
78
|
|
|
79
|
+
Chips **commit** here. They do **not** `npm run deploy` (or any provider deploy)
|
|
80
|
+
from the worktree. The parent merges to the default branch, then deploys from
|
|
81
|
+
the repo's canonical primary checkout.
|
|
82
|
+
|
|
79
83
|
## Block 2 — Report back (verbatim)
|
|
80
84
|
|
|
81
85
|
````
|
|
@@ -97,5 +101,7 @@ may print on this TUI — they belong to the child; do not steal its turn.
|
|
|
97
101
|
|
|
98
102
|
Merge / prune: same HARD RULES as `greprag load chip-spawn` (junction guard,
|
|
99
103
|
`git worktree remove .claude/worktrees/<slug>`, `git branch -d chip/<slug>`).
|
|
104
|
+
After merge, `/deploy` only from the canonical primary checkout — never from
|
|
105
|
+
this chip worktree.
|
|
100
106
|
FIX chips: `greprag fix spawn` still prints the mission; you launch it with
|
|
101
107
|
this method instead of `spawn_task`.
|