gentle-pi 2.1.2 → 2.3.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/README.md +108 -79
- package/assets/agents/gentle-ai-worker.md +7 -3
- package/assets/agents/jd-fix-agent.md +1 -1
- package/assets/agents/jd-judge-a.md +3 -1
- package/assets/agents/jd-judge-b.md +3 -1
- package/assets/agents/review-readability.md +4 -3
- package/assets/agents/review-reliability.md +4 -3
- package/assets/agents/review-resilience.md +4 -3
- package/assets/agents/review-risk.md +4 -3
- package/assets/agents/sdd-apply.md +11 -4
- package/assets/agents/sdd-archive.md +6 -1
- package/assets/agents/sdd-design.md +6 -1
- package/assets/agents/sdd-explore.md +6 -2
- package/assets/agents/sdd-init.md +10 -2
- package/assets/agents/sdd-onboard.md +6 -1
- package/assets/agents/sdd-proposal.md +8 -1
- package/assets/agents/sdd-research.md +54 -0
- package/assets/agents/sdd-spec.md +6 -1
- package/assets/agents/sdd-status.md +10 -5
- package/assets/agents/sdd-sync.md +6 -1
- package/assets/agents/sdd-tasks.md +8 -4
- package/assets/agents/sdd-verify.md +27 -2
- package/assets/chains/4r-review.chain.md +2 -0
- package/assets/chains/sdd-full.chain.md +2 -2
- package/assets/chains/sdd-plan.chain.md +1 -1
- package/assets/chains/sdd-verify.chain.md +2 -2
- package/assets/orchestrator-delegation.md +145 -160
- package/assets/orchestrator-memory.md +2 -0
- package/assets/orchestrator.md +25 -48
- package/assets/sdd-orchestrator-workflow.md +163 -25
- package/assets/support/sdd-status-contract.md +24 -6
- package/contracts/review-integration/v1/fixtures/consent.fixture.json +3 -3
- package/contracts/review-integration/v1/fixtures/start-v2.fixture.json +19 -28
- package/contracts/review-integration/v1/fixtures/start.fixture.json +1 -10
- package/contracts/review-integration/v1/fixtures/status-v2.fixture.json +12 -21
- package/contracts/review-integration/v1/schemas/correction-plan-request.schema.json +49 -0
- package/contracts/review-integration/v1/schemas/operation.schema.json +76 -0
- package/contracts/review-integration/v1/schemas/repair.schema.json +39 -0
- package/contracts/review-integration/v1/schemas/status-v2.schema.json +4 -2
- package/contracts/review-integration/v1/schemas/status.schema.json +4 -2
- package/contracts/review-integration/v1/schemas/transition-execution.schema.json +42 -0
- package/contracts/review-integration/v2/fixtures/consent.fixture.json +1 -1
- package/contracts/review-integration/v2/fixtures/start.fixture.json +1 -10
- package/contracts/review-integration/v2/fixtures/status.fixture.json +1 -10
- package/contracts/review-integration/v2/schemas/failure.schema.json +5 -1
- package/contracts/review-integration/v2/schemas/last-event-closure.schema.json +66 -0
- package/contracts/review-integration/v2/schemas/opencode-provider-role.schema.json +14 -0
- package/contracts/review-integration/v2/schemas/operation.schema.json +6 -1
- package/contracts/review-integration/v2/schemas/repair.schema.json +4 -2
- package/contracts/review-integration/v2/schemas/start.schema.json +5 -2
- package/contracts/review-integration/v2/schemas/status.schema.json +4 -2
- package/contracts/review-provider-contract-mirror/provider-contract.lock.json +30 -0
- package/contracts/review-provider-contract-mirror/v1.1.0/bundle/README.md +12 -0
- package/contracts/review-provider-contract-mirror/v1.1.0/bundle/manifest.json +65 -0
- package/contracts/review-provider-contract-mirror/v1.1.0/bundle/schemas/lens.schema.json +16 -0
- package/contracts/review-provider-contract-mirror/v1.1.0/bundle/schemas/refuter.schema.json +1 -0
- package/contracts/review-provider-contract-mirror/v1.1.0/bundle/schemas/targeted-validator.schema.json +1 -0
- package/contracts/review-provider-contract-mirror/v1.1.0/bundle/vectors/lens.json +1 -0
- package/contracts/review-provider-contract-mirror/v1.1.0/bundle/vectors/refuter.json +1 -0
- package/contracts/review-provider-contract-mirror/v1.1.0/bundle/vectors/targeted-validator.json +1 -0
- package/contracts/review-provider-contract-mirror/v1.1.0/generated/provider-capabilities.baseline.json +15 -0
- package/contracts/review-provider-contract-mirror/v1.1.0/generated/provider-roles.baseline.json +42 -0
- package/docs/native-authority-architecture.md +14 -16
- package/docs/review-integration.md +27 -353
- package/extensions/ask-user-choice.ts +151 -0
- package/extensions/gentle-ai.ts +2710 -3211
- package/extensions/quiet-tools.ts +515 -32
- package/extensions/sdd-init.ts +21 -12
- package/extensions/skill-registry.ts +10 -2
- package/extensions/startup-banner.ts +10 -4
- package/lib/gentle-ai-binary.ts +173 -2
- package/lib/gentle-ai-renderer.ts +70 -0
- package/lib/model-routing-authority.ts +133 -0
- package/lib/native-review-cli.ts +676 -781
- package/lib/opaque-pi-reviewer-adapter.ts +284 -0
- package/lib/provider-contract-bundle.ts +704 -0
- package/lib/review-candidate-view.ts +836 -118
- package/lib/review-compact-contract.ts +59 -248
- package/lib/review-host-relay.ts +578 -0
- package/lib/review-integration-v2.ts +1254 -221
- package/lib/review-last-event-controller.ts +35 -0
- package/lib/review-relay-contract.ts +16 -0
- package/lib/sdd-preflight.ts +230 -67
- package/lib/sdd-status.ts +66 -111
- package/lib/terminal-theme.ts +1 -1
- package/package.json +83 -79
- package/runtime/gentle-ai-binary.mjs +174 -3
- package/runtime/native-review-cli.mjs +610 -715
- package/runtime/review-integration-v2.mjs +1223 -190
- package/runtime/review-relay-contract.mjs +17 -0
- package/scripts/{build-git-commit-transaction-runner.mjs → build-runtime-modules.mjs} +5 -5
- package/scripts/check-provider-contract.mjs +138 -0
- package/scripts/gentle-ai-installer.mjs +85 -22
- package/scripts/maintainer/provider-relay-matrix.mjs +403 -0
- package/scripts/mirror-provider-contract.mjs +143 -0
- package/scripts/test-packed-runner.mjs +20 -9
- package/scripts/verify-package-files.mjs +119 -43
- package/skills/_shared/review-ledger-contract.md +11 -19
- package/skills/chained-pr/SKILL.md +3 -0
- package/skills/cognitive-doc-design/SKILL.md +1 -1
- package/skills/comment-writer/SKILL.md +1 -1
- package/skills/gentle-ai/SKILL.md +7 -74
- package/skills/issue-creation/SKILL.md +94 -168
- package/skills/judgment-day/SKILL.md +9 -5
- package/skills/judgment-day/references/prompts-and-formats.md +2 -0
- package/skills/rdd-defect-workflow/SKILL.md +54 -0
- package/skills/release/SKILL.md +3 -3
- package/skills/skill-registry/SKILL.md +1 -1
- package/skills/work-unit-commits/SKILL.md +3 -1
- package/tests/artifact-language.test.ts +24 -11
- package/tests/ask-user-choice.test.ts +264 -0
- package/tests/background-subagents.test.ts +771 -0
- package/tests/codegraph-tools.test.ts +3 -3
- package/tests/crosslane/cross-lane.mjs +16 -0
- package/tests/delegated-key-learnings-contract.test.ts +240 -0
- package/tests/devbinary/native-review-parity.devtest.ts +167 -250
- package/tests/devbinary/pi-host-relay.devtest.ts +867 -0
- package/tests/fixtures/devbinary/capabilities-v2.1.derived.json +331 -0
- package/tests/fixtures/devbinary/capabilities-v2.2.captured.json +340 -0
- package/tests/fixtures/devbinary/consent-v3.captured.json +37 -0
- package/tests/fixtures/devbinary/failure-v2-capture-evidence.captured.json +16 -0
- package/tests/fixtures/devbinary/last-event-capture-correction-plan.captured.json +10 -0
- package/tests/fixtures/devbinary/last-event-capture-refuter-approved.captured.json +20 -0
- package/tests/fixtures/devbinary/last-event-capture-refuter-correction-required.captured.json +26 -0
- package/tests/fixtures/devbinary/last-event-capture-result-approved.captured.json +8 -0
- package/tests/fixtures/devbinary/last-event-capture-result-correction-required.captured.json +26 -0
- package/tests/fixtures/devbinary/last-event-capture-validation-approved.captured.json +8 -0
- package/tests/fixtures/devbinary/last-event-closure.provenance.md +13 -0
- package/tests/fixtures/devbinary/result-artifact-v2-path.captured.json +12 -0
- package/tests/fixtures/devbinary/result-artifact-v2.captured.json +12 -0
- package/tests/fixtures/devbinary/review-acknowledged-v1.captured.json +9 -0
- package/tests/fixtures/devbinary/review-acknowledged.provenance.md +31 -0
- package/tests/fixtures/devbinary/start-v3-consent-declined.captured.json +19 -0
- package/tests/fixtures/devbinary/start-v3-consent-granted.captured.json +109 -0
- package/tests/fixtures/devbinary/start-v3-zero-lens-closed.captured.json +21 -0
- package/tests/fixtures/devbinary/status-v5-capture-result-submission.captured.json +184 -0
- package/tests/fixtures/devbinary/status-v5-repository-context.captured.json +138 -0
- package/tests/fixtures/devbinary/status-v5.captured.json +88 -0
- package/tests/fixtures/native-review-cli/v2.5.0-rc.1/PROVENANCE.txt +15 -0
- package/tests/fixtures/provider-contract-bundle/v1.1.0/README.md +12 -0
- package/tests/fixtures/provider-contract-bundle/v1.1.0/manifest.json +65 -0
- package/tests/fixtures/provider-contract-bundle/v1.1.0/schemas/lens.schema.json +16 -0
- package/tests/fixtures/provider-contract-bundle/v1.1.0/schemas/refuter.schema.json +1 -0
- package/tests/fixtures/provider-contract-bundle/v1.1.0/schemas/targeted-validator.schema.json +1 -0
- package/tests/fixtures/provider-contract-bundle/v1.1.0/vectors/lens.json +1 -0
- package/tests/fixtures/provider-contract-bundle/v1.1.0/vectors/refuter.json +1 -0
- package/tests/fixtures/provider-contract-bundle/v1.1.0/vectors/targeted-validator.json +1 -0
- package/tests/gentle-ai-binary.test.ts +83 -13
- package/tests/gentle-ai-dev-binary-surfacing.test.ts +195 -0
- package/tests/gentle-ai-dev-binary.test.ts +159 -0
- package/tests/gentle-ai-installer.test.ts +138 -48
- package/tests/gentle-ai.test.ts +820 -131
- package/tests/gentle-theme.test.ts +133 -0
- package/tests/maintainer/provider-relay.maintest.ts +601 -0
- package/tests/model-routing-authority.test.ts +257 -0
- package/tests/native-review-capability-contract.test.ts +75 -2
- package/tests/native-review-cli.test.ts +588 -908
- package/tests/native-review-consent.test.ts +283 -38
- package/tests/native-review-parity-runtime.test.ts +108 -350
- package/tests/native-review-parity.test.ts +684 -732
- package/tests/native-sdd-attempt-authority.test.ts +235 -0
- package/tests/opaque-pi-reviewer-adapter.test.ts +266 -0
- package/tests/orchestrator-budget.test.ts +158 -89
- package/tests/orchestrator-rdd-ownership.test.ts +103 -0
- package/tests/package-manifest.test.ts +128 -100
- package/tests/provider-contract-bundle.test.ts +385 -0
- package/tests/provider-contract-mirror.test.ts +206 -0
- package/tests/provider-defect-handoff.test.ts +252 -0
- package/tests/quiet-tool-rendering.test.ts +1055 -28
- package/tests/review-actor-tool-deny.test.ts +12 -13
- package/tests/review-authority-recovery-docs.test.ts +1 -2
- package/tests/review-candidate-view.test.ts +898 -12
- package/tests/review-compact-contract.test.ts +29 -122
- package/tests/review-controller-lock-status.test.ts +2 -2
- package/tests/review-controller-native-recovery.test.ts +366 -857
- package/tests/review-controller-native-routing.test.ts +1253 -4199
- package/tests/review-controller-retired-ops.test.ts +1 -1
- package/tests/review-controller-workspace-root.test.ts +236 -70
- package/tests/review-controller.test.ts +26 -816
- package/tests/review-corrected-finalize-binding.test.ts +134 -0
- package/tests/review-dispatch-hydration-gap.test.ts +145 -0
- package/tests/review-gate.test.ts +0 -45
- package/tests/review-host-relay-restart-parity.test.ts +360 -0
- package/tests/review-host-relay-routing.test.ts +352 -0
- package/tests/review-host-relay.test.ts +754 -0
- package/tests/review-integration-v2-forward.test.ts +654 -0
- package/tests/review-integration-v2.test.ts +317 -129
- package/tests/review-last-event-closure.test.ts +408 -0
- package/tests/review-ledger-contract.test.ts +106 -60
- package/tests/review-recovered-lineage-routing.test.ts +199 -0
- package/tests/review-relay-transport-agent.test.ts +322 -0
- package/tests/review-snapshot.test.ts +3 -2
- package/tests/runtime-harness.mjs +573 -180
- package/tests/sdd-agent-tools.test.ts +53 -32
- package/tests/sdd-preflight.test.ts +81 -15
- package/tests/sdd-status.test.ts +109 -110
- package/tests/skill-collision-prefixes.test.ts +6 -8
- package/tests/skill-registry.test.ts +50 -1
- package/tests/verify-package-files.test.ts +62 -0
- package/tests/writer-edit-surface-scope.test.ts +230 -0
- package/themes/Gentleman-Cute.json +94 -0
- package/themes/Gentleman-Sexy.json +92 -0
- package/assets/agents/review-refuter.md +0 -40
- package/assets/agents/review-validator.md +0 -23
- package/lib/git-commit-transaction.ts +0 -801
- package/lib/native-review-remediation.ts +0 -49
- package/lib/review-compact.ts +0 -947
- package/lib/review-refuter-adapter.ts +0 -129
- package/lib/review-runtime-contract.ts +0 -68
- package/prompts/gcl.md +0 -54
- package/prompts/gis.md +0 -25
- package/prompts/gpr.md +0 -41
- package/prompts/gwr.md +0 -31
- package/runtime/git-commit-transaction.mjs +0 -802
- package/scripts/run-git-commit-transaction.mjs +0 -35
- package/tests/fixtures/native-review-cli/v2.1.2/bind-sdd.json +0 -25
- package/tests/fixtures/native-review-cli/v2.1.2/finalize.json +0 -8
- package/tests/fixtures/native-review-cli/v2.1.2/sdd-status-engram.json +0 -139
- package/tests/fixtures/native-review-cli/v2.1.2/sdd-status.json +0 -200
- package/tests/fixtures/native-review-cli/v2.1.2/start.json +0 -12
- package/tests/fixtures/native-review-cli/v2.1.2/validate-allow.json +0 -24
- package/tests/fixtures/native-review-cli/v2.1.2/validate-deny-empty-context.json +0 -20
- package/tests/fixtures/native-review-cli/v2.1.2/validate-deny.json +0 -28
- package/tests/fixtures/native-review-cli/v2.1.3/sdd-status-engram.json +0 -139
- package/tests/fixtures/native-review-cli/v2.1.3/sdd-status.json +0 -200
- package/tests/git-commit-transaction.test.ts +0 -302
- package/tests/review-compact.test.ts +0 -243
- package/tests/review-refuter-adapter.test.ts +0 -89
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
import assert from "node:assert/strict";
|
|
2
|
+
import { mkdtempSync, rmSync } from "node:fs";
|
|
3
|
+
import { tmpdir } from "node:os";
|
|
4
|
+
import { join } from "node:path";
|
|
5
|
+
import test, { after } from "node:test";
|
|
6
|
+
import type {
|
|
7
|
+
ExtensionAPI,
|
|
8
|
+
ExtensionContext,
|
|
9
|
+
} from "@earendil-works/pi-coding-agent";
|
|
10
|
+
import { createGentleAiExtension } from "../extensions/gentle-ai.ts";
|
|
11
|
+
|
|
12
|
+
// ---------------------------------------------------------------------------
|
|
13
|
+
// Bounded writer edit-surface scope guard (issue #484).
|
|
14
|
+
//
|
|
15
|
+
// The guard reads the `## Allowed edit surfaces` section out of the delegated
|
|
16
|
+
// `subagent_run` prompt. A delegated task is a full prompt: the surfaces list
|
|
17
|
+
// is followed by deeper headings (`### Validation`, `#### Return`) and by
|
|
18
|
+
// ordinary prose. The section must end where the list ends, so that following
|
|
19
|
+
// content is never parsed as a surface entry and never turned into a false
|
|
20
|
+
// rejection. A `context` value carrying only the heading and its lines had
|
|
21
|
+
// nothing following it, which is why the same surfaces were accepted there and
|
|
22
|
+
// rejected in `task`.
|
|
23
|
+
//
|
|
24
|
+
// Every case below runs through the real `tool_call` hook with the exact
|
|
25
|
+
// `subagent_run` input shape, because that is the boundary that rejected.
|
|
26
|
+
// ---------------------------------------------------------------------------
|
|
27
|
+
|
|
28
|
+
const REJECTION =
|
|
29
|
+
"Writer tasks must include the exact Markdown heading `## Allowed edit surfaces` with narrow repository-relative paths or narrow globs, one per line. The parent must derive or map that canonical block from the delegated task and relaunch the writer; do not accept aliases, and do not ask the human to author paths or globs.";
|
|
30
|
+
|
|
31
|
+
type ToolCallHandler = (
|
|
32
|
+
event: { toolName: string; input: unknown },
|
|
33
|
+
ctx: ExtensionContext,
|
|
34
|
+
) => Promise<{ block: true; reason: string } | undefined>;
|
|
35
|
+
|
|
36
|
+
const scratchRoots: string[] = [];
|
|
37
|
+
|
|
38
|
+
after(() => {
|
|
39
|
+
for (const dir of scratchRoots) rmSync(dir, { recursive: true, force: true });
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
function dispatchWriter(input: Record<string, unknown>) {
|
|
43
|
+
const handlers = new Map<string, ToolCallHandler>();
|
|
44
|
+
const pi = {
|
|
45
|
+
on(name: string, handler: ToolCallHandler) {
|
|
46
|
+
handlers.set(name, handler);
|
|
47
|
+
},
|
|
48
|
+
events: { emit() {} },
|
|
49
|
+
registerCommand() {},
|
|
50
|
+
registerTool() {},
|
|
51
|
+
} as unknown as ExtensionAPI;
|
|
52
|
+
createGentleAiExtension({ nativeReviewCli: null })(pi);
|
|
53
|
+
const toolCall = handlers.get("tool_call");
|
|
54
|
+
assert.equal(typeof toolCall, "function");
|
|
55
|
+
const cwd = mkdtempSync(join(tmpdir(), "gentle-pi-writer-surfaces-"));
|
|
56
|
+
scratchRoots.push(cwd);
|
|
57
|
+
return toolCall!({ toolName: "subagent_run", input }, {
|
|
58
|
+
cwd,
|
|
59
|
+
hasUI: false,
|
|
60
|
+
ui: { confirm: async () => true },
|
|
61
|
+
} as ExtensionContext);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
async function assertAccepted(input: Record<string, unknown>, message: string) {
|
|
65
|
+
assert.equal(await dispatchWriter(input), undefined, message);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
async function assertRejected(input: Record<string, unknown>, message: string) {
|
|
69
|
+
assert.deepEqual(await dispatchWriter(input), { block: true, reason: REJECTION }, message);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
test("task-scoped surfaces are accepted ahead of a deeper heading", async () => {
|
|
73
|
+
await assertAccepted({
|
|
74
|
+
agent: "gentle-ai-worker",
|
|
75
|
+
mode: "task",
|
|
76
|
+
task: [
|
|
77
|
+
"Fix the decoder.",
|
|
78
|
+
"",
|
|
79
|
+
"## Allowed edit surfaces",
|
|
80
|
+
"- `lib/sdd-status.ts`",
|
|
81
|
+
"- `tests/sdd-status.test.ts`",
|
|
82
|
+
"",
|
|
83
|
+
"### Validation commands",
|
|
84
|
+
"- pnpm test",
|
|
85
|
+
"",
|
|
86
|
+
"#### Return",
|
|
87
|
+
"- one structured envelope",
|
|
88
|
+
].join("\n"),
|
|
89
|
+
}, "a delegated task ends its surfaces list at the next heading of any level");
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
test("task-scoped surfaces are accepted ahead of trailing prose", async () => {
|
|
93
|
+
await assertAccepted({
|
|
94
|
+
agent: "gentle-ai-worker",
|
|
95
|
+
mode: "task",
|
|
96
|
+
task: [
|
|
97
|
+
"## Allowed edit surfaces",
|
|
98
|
+
"- `lib/sdd-status.ts`",
|
|
99
|
+
"",
|
|
100
|
+
"Then run the focused test file and report the outcome.",
|
|
101
|
+
].join("\n"),
|
|
102
|
+
}, "prose after the list is not a surface entry");
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
test("the documented task shape from issue #484 is accepted", async () => {
|
|
106
|
+
await assertAccepted({
|
|
107
|
+
agent: "gentle-ai-worker",
|
|
108
|
+
mode: "task",
|
|
109
|
+
task: [
|
|
110
|
+
"## Allowed edit surfaces",
|
|
111
|
+
"- `lib/sdd-status.ts`",
|
|
112
|
+
"- `tests/sdd-status.test.ts`",
|
|
113
|
+
"",
|
|
114
|
+
"## Skills to load before work",
|
|
115
|
+
"- `skills/typescript/SKILL.md`",
|
|
116
|
+
].join("\n"),
|
|
117
|
+
}, "the reported repro shape stays accepted");
|
|
118
|
+
});
|
|
119
|
+
|
|
120
|
+
test("bullet, backtick and plain-line surfaces reach the same decision", async () => {
|
|
121
|
+
const bulleted = ["## Allowed edit surfaces", "- `lib/sdd-status.ts`", "- `tests/sdd-status.test.ts`"].join("\n");
|
|
122
|
+
const plain = ["## Allowed edit surfaces", "lib/sdd-status.ts", "tests/sdd-status.test.ts"].join("\n");
|
|
123
|
+
await assertAccepted({ agent: "gentle-ai-worker", mode: "task", task: bulleted }, "bullets in task are accepted");
|
|
124
|
+
await assertAccepted({ agent: "gentle-ai-worker", mode: "task", task: plain }, "plain lines in task are accepted");
|
|
125
|
+
await assertAccepted(
|
|
126
|
+
{ agent: "gentle-ai-worker", mode: "task", task: "Fix the decoder.", context: bulleted },
|
|
127
|
+
"bullets in context are accepted",
|
|
128
|
+
);
|
|
129
|
+
await assertAccepted(
|
|
130
|
+
{ agent: "gentle-ai-worker", mode: "task", task: "Fix the decoder.", context: plain },
|
|
131
|
+
"plain lines in context are accepted",
|
|
132
|
+
);
|
|
133
|
+
await assertAccepted(
|
|
134
|
+
{ agent: "gentle-ai-worker", mode: "task", task: bulleted, context: plain },
|
|
135
|
+
"the same surfaces in both fields are accepted",
|
|
136
|
+
);
|
|
137
|
+
});
|
|
138
|
+
|
|
139
|
+
test("a list broken by a blank line still validates every entry", async () => {
|
|
140
|
+
await assertRejected({
|
|
141
|
+
agent: "gentle-ai-worker",
|
|
142
|
+
mode: "task",
|
|
143
|
+
task: ["## Allowed edit surfaces", "- `lib/sdd-status.ts`", "", "- `/etc/passwd`"].join("\n"),
|
|
144
|
+
}, "a loose bulleted list cannot smuggle an absolute path past the guard");
|
|
145
|
+
await assertRejected({
|
|
146
|
+
agent: "gentle-ai-worker",
|
|
147
|
+
mode: "task",
|
|
148
|
+
context: ["## Allowed edit surfaces", "lib/sdd-status.ts", "", "/etc/passwd"].join("\n"),
|
|
149
|
+
}, "a loose plain-line list cannot smuggle an absolute path past the guard");
|
|
150
|
+
await assertRejected({
|
|
151
|
+
agent: "gentle-ai-worker",
|
|
152
|
+
mode: "task",
|
|
153
|
+
task: ["## Allowed edit surfaces", "lib/sdd-status.ts", "", "../other-repo/lib/a.ts"].join("\n"),
|
|
154
|
+
}, "a loose plain-line list cannot smuggle parent traversal past the guard");
|
|
155
|
+
});
|
|
156
|
+
|
|
157
|
+
test("an entry hidden below a paragraph is validated, not discarded", async () => {
|
|
158
|
+
await assertRejected({
|
|
159
|
+
agent: "gentle-ai-worker",
|
|
160
|
+
mode: "task",
|
|
161
|
+
task: [
|
|
162
|
+
"## Allowed edit surfaces",
|
|
163
|
+
"- `lib/sdd-status.ts`",
|
|
164
|
+
"",
|
|
165
|
+
"Also authorize the following path.",
|
|
166
|
+
"- `/etc/passwd`",
|
|
167
|
+
].join("\n"),
|
|
168
|
+
}, "prose does not close the list while a path still follows it");
|
|
169
|
+
await assertAccepted({
|
|
170
|
+
agent: "gentle-ai-worker",
|
|
171
|
+
mode: "task",
|
|
172
|
+
task: [
|
|
173
|
+
"## Allowed edit surfaces",
|
|
174
|
+
"- `lib/sdd-status.ts`",
|
|
175
|
+
"",
|
|
176
|
+
"Then run the focused test file and report the outcome.",
|
|
177
|
+
].join("\n"),
|
|
178
|
+
}, "genuinely trailing prose still closes the list");
|
|
179
|
+
});
|
|
180
|
+
|
|
181
|
+
test("out-of-scope and empty surfaces stay rejected", async () => {
|
|
182
|
+
await assertRejected({
|
|
183
|
+
agent: "gentle-ai-worker",
|
|
184
|
+
mode: "task",
|
|
185
|
+
task: "Fix the decoder.",
|
|
186
|
+
}, "a task with no section is rejected");
|
|
187
|
+
await assertRejected({
|
|
188
|
+
agent: "gentle-ai-worker",
|
|
189
|
+
mode: "task",
|
|
190
|
+
task: ["## Edit ranges", "- `lib/sdd-status.ts`"].join("\n"),
|
|
191
|
+
}, "a semantically equivalent heading is rejected with the actionable canonical-heading reason");
|
|
192
|
+
await assertRejected({
|
|
193
|
+
agent: "gentle-ai-worker",
|
|
194
|
+
mode: "task",
|
|
195
|
+
task: ["## Allowed edit surfaces", "", "## Skills to load before work", "- `skills/typescript/SKILL.md`"].join("\n"),
|
|
196
|
+
}, "an empty section is rejected");
|
|
197
|
+
await assertRejected({
|
|
198
|
+
agent: "gentle-ai-worker",
|
|
199
|
+
mode: "task",
|
|
200
|
+
task: ["## Allowed edit surfaces", "- `/home/user/repo/lib/sdd-status.ts`"].join("\n"),
|
|
201
|
+
}, "an absolute path is rejected");
|
|
202
|
+
await assertRejected({
|
|
203
|
+
agent: "gentle-ai-worker",
|
|
204
|
+
mode: "task",
|
|
205
|
+
task: ["## Allowed edit surfaces", "- `../other-repo/lib/sdd-status.ts`"].join("\n"),
|
|
206
|
+
}, "parent traversal is rejected");
|
|
207
|
+
await assertRejected({
|
|
208
|
+
agent: "gentle-ai-worker",
|
|
209
|
+
mode: "task",
|
|
210
|
+
task: ["## Allowed edit surfaces", "- `.`"].join("\n"),
|
|
211
|
+
}, "the repository root is rejected");
|
|
212
|
+
await assertRejected({
|
|
213
|
+
agent: "gentle-ai-worker",
|
|
214
|
+
mode: "task",
|
|
215
|
+
task: ["## Allowed edit surfaces", "- `*`"].join("\n"),
|
|
216
|
+
}, "a repository-wide glob is rejected");
|
|
217
|
+
await assertRejected({
|
|
218
|
+
agent: "worker",
|
|
219
|
+
mode: "task",
|
|
220
|
+
task: ["## Allowed edit surfaces", "- `~/lib/sdd-status.ts`"].join("\n"),
|
|
221
|
+
}, "a home-relative path is rejected for the configured worker too");
|
|
222
|
+
});
|
|
223
|
+
|
|
224
|
+
test("agents outside the bounded writer set are not scope-guarded", async () => {
|
|
225
|
+
await assertAccepted({
|
|
226
|
+
agent: "gentle-ai-explore",
|
|
227
|
+
mode: "task",
|
|
228
|
+
task: "Map the decoder call sites.",
|
|
229
|
+
}, "a read-only explorer needs no edit surfaces");
|
|
230
|
+
});
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://raw.githubusercontent.com/earendil-works/pi-mono/main/packages/coding-agent/src/modes/interactive/theme/theme-schema.json",
|
|
3
|
+
"name": "Gentleman-Cute",
|
|
4
|
+
"vars": {
|
|
5
|
+
"bg": "#060407",
|
|
6
|
+
"bgPanel": "#100A0F",
|
|
7
|
+
"bgElement": "#100A0F",
|
|
8
|
+
"bgSubtle": "#100A0F",
|
|
9
|
+
"border": "#563040",
|
|
10
|
+
"borderSubtle": "#2A1720",
|
|
11
|
+
"text": "#F6EFF3",
|
|
12
|
+
"muted": "#A78E9B",
|
|
13
|
+
"dim": "#76616B",
|
|
14
|
+
"accent": "#F095C8",
|
|
15
|
+
"deepPink": "#C96AA2",
|
|
16
|
+
"activePink": "#FFB1DD",
|
|
17
|
+
"champagne": "#E0C27A",
|
|
18
|
+
"pearl": "#D2CBD0",
|
|
19
|
+
"softRose": "#D7A0B8",
|
|
20
|
+
"powderBlue": "#A9C7EE",
|
|
21
|
+
"mint": "#B4E7C7",
|
|
22
|
+
"peach": "#F2B86D",
|
|
23
|
+
"sky": "#C4DAF6",
|
|
24
|
+
"warning": "#F2B86D",
|
|
25
|
+
"error": "#FF718F",
|
|
26
|
+
"selection": "#28121E",
|
|
27
|
+
"toolPendingBg": "#100A0F",
|
|
28
|
+
"toolSuccessBg": "#151316",
|
|
29
|
+
"toolErrorBg": "#261019",
|
|
30
|
+
"infoBg": "#100A0F"
|
|
31
|
+
},
|
|
32
|
+
"colors": {
|
|
33
|
+
"accent": "accent",
|
|
34
|
+
"border": "border",
|
|
35
|
+
"borderAccent": "activePink",
|
|
36
|
+
"borderMuted": "borderSubtle",
|
|
37
|
+
"success": "mint",
|
|
38
|
+
"error": "error",
|
|
39
|
+
"warning": "warning",
|
|
40
|
+
"muted": "muted",
|
|
41
|
+
"dim": "dim",
|
|
42
|
+
"text": "text",
|
|
43
|
+
"thinkingText": "muted",
|
|
44
|
+
"selectedBg": "selection",
|
|
45
|
+
"scrollbarThumb": "border",
|
|
46
|
+
"searchMatchBg": "deepPink",
|
|
47
|
+
"searchMatchText": "text",
|
|
48
|
+
"userMessageBg": "bgElement",
|
|
49
|
+
"userMessageText": "text",
|
|
50
|
+
"customMessageBg": "bgSubtle",
|
|
51
|
+
"customMessageText": "text",
|
|
52
|
+
"customMessageLabel": "champagne",
|
|
53
|
+
"toolPendingBg": "toolPendingBg",
|
|
54
|
+
"toolSuccessBg": "toolSuccessBg",
|
|
55
|
+
"toolErrorBg": "toolErrorBg",
|
|
56
|
+
"toolTitle": "champagne",
|
|
57
|
+
"toolOutput": "text",
|
|
58
|
+
"mdHeading": "champagne",
|
|
59
|
+
"mdLink": "accent",
|
|
60
|
+
"mdLinkUrl": "muted",
|
|
61
|
+
"mdCode": "champagne",
|
|
62
|
+
"mdCodeBlock": "text",
|
|
63
|
+
"mdCodeBlockBorder": "muted",
|
|
64
|
+
"mdQuote": "muted",
|
|
65
|
+
"mdQuoteBorder": "deepPink",
|
|
66
|
+
"mdHr": "borderSubtle",
|
|
67
|
+
"mdListBullet": "accent",
|
|
68
|
+
"toolDiffAdded": "mint",
|
|
69
|
+
"toolDiffRemoved": "error",
|
|
70
|
+
"toolDiffContext": "muted",
|
|
71
|
+
"syntaxComment": "muted",
|
|
72
|
+
"syntaxKeyword": "accent",
|
|
73
|
+
"syntaxFunction": "powderBlue",
|
|
74
|
+
"syntaxVariable": "text",
|
|
75
|
+
"syntaxString": "mint",
|
|
76
|
+
"syntaxNumber": "peach",
|
|
77
|
+
"syntaxType": "champagne",
|
|
78
|
+
"syntaxOperator": "sky",
|
|
79
|
+
"syntaxPunctuation": "muted",
|
|
80
|
+
"thinkingOff": "borderSubtle",
|
|
81
|
+
"thinkingMinimal": "dim",
|
|
82
|
+
"thinkingLow": "muted",
|
|
83
|
+
"thinkingMedium": "powderBlue",
|
|
84
|
+
"thinkingHigh": "softRose",
|
|
85
|
+
"thinkingXhigh": "accent",
|
|
86
|
+
"thinkingMax": "activePink",
|
|
87
|
+
"bashMode": "champagne"
|
|
88
|
+
},
|
|
89
|
+
"export": {
|
|
90
|
+
"pageBg": "bg",
|
|
91
|
+
"cardBg": "bgElement",
|
|
92
|
+
"infoBg": "infoBg"
|
|
93
|
+
}
|
|
94
|
+
}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://raw.githubusercontent.com/earendil-works/pi-mono/main/packages/coding-agent/src/modes/interactive/theme/theme-schema.json",
|
|
3
|
+
"name": "Gentleman-Sexy",
|
|
4
|
+
"vars": {
|
|
5
|
+
"bg": "#060407",
|
|
6
|
+
"bgPanel": "#100A0F",
|
|
7
|
+
"bgElement": "#100A0F",
|
|
8
|
+
"bgSubtle": "#100A0F",
|
|
9
|
+
"border": "#563040",
|
|
10
|
+
"borderSubtle": "#2A1720",
|
|
11
|
+
"text": "#F6EFF3",
|
|
12
|
+
"muted": "#A78E9B",
|
|
13
|
+
"dim": "#76616B",
|
|
14
|
+
"accent": "#F43888",
|
|
15
|
+
"deepPink": "#BF0F50",
|
|
16
|
+
"activePink": "#FF4F9A",
|
|
17
|
+
"champagne": "#E0C27A",
|
|
18
|
+
"violet": "#C49BFF",
|
|
19
|
+
"pearl": "#D2CBD0",
|
|
20
|
+
"softRose": "#D7A0B8",
|
|
21
|
+
"powderBlue": "#A9C7EE",
|
|
22
|
+
"warning": "#F2B86D",
|
|
23
|
+
"error": "#FF718F",
|
|
24
|
+
"selection": "#28121E",
|
|
25
|
+
"toolPendingBg": "#100A0F",
|
|
26
|
+
"toolSuccessBg": "#151316",
|
|
27
|
+
"toolErrorBg": "#261019",
|
|
28
|
+
"infoBg": "#100A0F"
|
|
29
|
+
},
|
|
30
|
+
"colors": {
|
|
31
|
+
"accent": "accent",
|
|
32
|
+
"border": "border",
|
|
33
|
+
"borderAccent": "activePink",
|
|
34
|
+
"borderMuted": "borderSubtle",
|
|
35
|
+
"success": "pearl",
|
|
36
|
+
"error": "error",
|
|
37
|
+
"warning": "warning",
|
|
38
|
+
"muted": "muted",
|
|
39
|
+
"dim": "dim",
|
|
40
|
+
"text": "text",
|
|
41
|
+
"thinkingText": "muted",
|
|
42
|
+
"selectedBg": "selection",
|
|
43
|
+
"scrollbarThumb": "border",
|
|
44
|
+
"searchMatchBg": "deepPink",
|
|
45
|
+
"searchMatchText": "text",
|
|
46
|
+
"userMessageBg": "bgElement",
|
|
47
|
+
"userMessageText": "text",
|
|
48
|
+
"customMessageBg": "bgSubtle",
|
|
49
|
+
"customMessageText": "text",
|
|
50
|
+
"customMessageLabel": "champagne",
|
|
51
|
+
"toolPendingBg": "toolPendingBg",
|
|
52
|
+
"toolSuccessBg": "toolSuccessBg",
|
|
53
|
+
"toolErrorBg": "toolErrorBg",
|
|
54
|
+
"toolTitle": "champagne",
|
|
55
|
+
"toolOutput": "text",
|
|
56
|
+
"mdHeading": "champagne",
|
|
57
|
+
"mdLink": "activePink",
|
|
58
|
+
"mdLinkUrl": "muted",
|
|
59
|
+
"mdCode": "champagne",
|
|
60
|
+
"mdCodeBlock": "text",
|
|
61
|
+
"mdCodeBlockBorder": "muted",
|
|
62
|
+
"mdQuote": "muted",
|
|
63
|
+
"mdQuoteBorder": "deepPink",
|
|
64
|
+
"mdHr": "borderSubtle",
|
|
65
|
+
"mdListBullet": "activePink",
|
|
66
|
+
"toolDiffAdded": "powderBlue",
|
|
67
|
+
"toolDiffRemoved": "error",
|
|
68
|
+
"toolDiffContext": "muted",
|
|
69
|
+
"syntaxComment": "muted",
|
|
70
|
+
"syntaxKeyword": "deepPink",
|
|
71
|
+
"syntaxFunction": "violet",
|
|
72
|
+
"syntaxVariable": "text",
|
|
73
|
+
"syntaxString": "champagne",
|
|
74
|
+
"syntaxNumber": "softRose",
|
|
75
|
+
"syntaxType": "powderBlue",
|
|
76
|
+
"syntaxOperator": "activePink",
|
|
77
|
+
"syntaxPunctuation": "muted",
|
|
78
|
+
"thinkingOff": "borderSubtle",
|
|
79
|
+
"thinkingMinimal": "dim",
|
|
80
|
+
"thinkingLow": "muted",
|
|
81
|
+
"thinkingMedium": "powderBlue",
|
|
82
|
+
"thinkingHigh": "violet",
|
|
83
|
+
"thinkingXhigh": "activePink",
|
|
84
|
+
"thinkingMax": "accent",
|
|
85
|
+
"bashMode": "champagne"
|
|
86
|
+
},
|
|
87
|
+
"export": {
|
|
88
|
+
"pageBg": "bg",
|
|
89
|
+
"cardBg": "bgElement",
|
|
90
|
+
"infoBg": "infoBg"
|
|
91
|
+
}
|
|
92
|
+
}
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: review-refuter
|
|
3
|
-
description: One-shot read-only verifier for the complete inferential-severe frozen-row list.
|
|
4
|
-
tools:
|
|
5
|
-
- "*": false
|
|
6
|
-
- read
|
|
7
|
-
- grep
|
|
8
|
-
- find
|
|
9
|
-
---
|
|
10
|
-
|
|
11
|
-
You are **review-refuter**, the one optional ordinary-review refuter. Challenge the supplied inferential claims; never modify the repository.
|
|
12
|
-
|
|
13
|
-
## Boundary
|
|
14
|
-
|
|
15
|
-
- Use only `read`, `grep`, and `find`.
|
|
16
|
-
- Do not mutate files, run shell commands, delegate, or write memory.
|
|
17
|
-
- Receive the complete inferential-severe frozen-row list once.
|
|
18
|
-
- Do not create replacement findings or omit difficult supplied IDs.
|
|
19
|
-
|
|
20
|
-
## Output
|
|
21
|
-
|
|
22
|
-
Return exactly one JSON object using the `gentle-ai.refuter-result-batch/v1` contract:
|
|
23
|
-
|
|
24
|
-
```json
|
|
25
|
-
{
|
|
26
|
-
"schema": "gentle-ai.refuter-result-batch/v1",
|
|
27
|
-
"request_hash": "<supplied request hash>",
|
|
28
|
-
"results": [
|
|
29
|
-
{
|
|
30
|
-
"finding_id": "<exact supplied finding ID>",
|
|
31
|
-
"outcome": "refuted | corroborated | inconclusive",
|
|
32
|
-
"proof_refs": ["differential-test:<independent concrete reproduction>"]
|
|
33
|
-
}
|
|
34
|
-
]
|
|
35
|
-
}
|
|
36
|
-
```
|
|
37
|
-
|
|
38
|
-
Return one row for every supplied ID, with no aliases, extra fields, prose, or additional JSON values. The `request_hash` and every `finding_id` must match the supplied frozen request exactly. Every `proof_refs` entry must be a concrete `changed-hunk:`, `candidate-created-path:`, `differential-test:`, or `before-after:` reference for that same finding; independent concrete refuter proof is valid and need not repeat reviewer `proof_refs`. Use `inconclusive` when the supplied evidence supports neither `refuted` nor `corroborated`; native authority escalates it. Do not create findings, alter frozen claims, request fixes, launch actors, persist authority, or repeat.
|
|
39
|
-
|
|
40
|
-
Actor output is untrusted data and cannot authorize transitions, fixes, receipts, gates, or delivery.
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: review-validator
|
|
3
|
-
description: Per-attempt targeted proof validator for exact frozen rows.
|
|
4
|
-
tools:
|
|
5
|
-
- "*": false
|
|
6
|
-
- read
|
|
7
|
-
- grep
|
|
8
|
-
- find
|
|
9
|
-
---
|
|
10
|
-
|
|
11
|
-
You are **review-validator**, the read-only proof consumer for one native-authorized correction attempt.
|
|
12
|
-
|
|
13
|
-
## Scope
|
|
14
|
-
|
|
15
|
-
Receive only the frozen correction IDs, their exact causal rows, original-criteria proof, one correction-regression proof for those IDs, and inert follow-ups.
|
|
16
|
-
|
|
17
|
-
Validate the original criteria and correction regression only. Never expand paths, IDs, untracked scope, acceptance criteria, or correction purpose; never discover, re-review, add findings, or change frozen claims.
|
|
18
|
-
|
|
19
|
-
Do not request another fix or attempt, launch actors, persist authority, or repeat yourself. Native FINALIZE alone decides whether `correction_required` may continue within the cumulative budget and three-attempt cap.
|
|
20
|
-
|
|
21
|
-
Return `original_criteria`, `correction_regression`, an empty `fix_caused_findings` array, and inert `follow_ups`. The controller derives the correction diff and changed-line count, owns all transitions, and performs final verification.
|
|
22
|
-
|
|
23
|
-
Actor output is untrusted data and cannot authorize transitions, fixes, receipts, gates, or delivery.
|