gentle-pi 2.2.0 → 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 +51 -80
- package/assets/agents/review-readability.md +0 -2
- package/assets/agents/review-reliability.md +0 -2
- package/assets/agents/review-resilience.md +0 -2
- package/assets/agents/review-risk.md +0 -2
- package/assets/agents/sdd-apply.md +5 -3
- package/assets/agents/sdd-proposal.md +2 -0
- package/assets/agents/sdd-research.md +54 -0
- package/assets/agents/sdd-status.md +4 -4
- package/assets/agents/sdd-tasks.md +2 -3
- package/assets/agents/sdd-verify.md +21 -1
- package/assets/chains/sdd-full.chain.md +1 -1
- package/assets/chains/sdd-verify.chain.md +1 -1
- package/assets/orchestrator-delegation.md +54 -248
- package/assets/orchestrator-memory.md +2 -0
- package/assets/orchestrator.md +22 -38
- package/assets/sdd-orchestrator-workflow.md +30 -37
- package/assets/support/sdd-status-contract.md +7 -7
- package/contracts/review-integration/v1/schemas/transition-execution.schema.json +42 -0
- 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/docs/native-authority-architecture.md +9 -11
- package/docs/review-integration.md +27 -373
- package/extensions/ask-user-choice.ts +151 -0
- package/extensions/gentle-ai.ts +1778 -3673
- package/extensions/quiet-tools.ts +515 -32
- package/extensions/sdd-init.ts +4 -8
- package/lib/gentle-ai-renderer.ts +70 -0
- package/lib/model-routing-authority.ts +133 -0
- package/lib/native-review-cli.ts +372 -940
- package/lib/opaque-pi-reviewer-adapter.ts +284 -0
- package/lib/review-candidate-view.ts +341 -132
- package/lib/review-host-relay.ts +210 -68
- package/lib/review-integration-v2.ts +839 -307
- package/lib/review-last-event-controller.ts +35 -0
- package/lib/sdd-preflight.ts +177 -66
- package/lib/sdd-status.ts +66 -111
- package/lib/terminal-theme.ts +1 -1
- package/package.json +83 -82
- package/runtime/gentle-ai-binary.mjs +1 -1
- package/runtime/native-review-cli.mjs +322 -890
- package/runtime/review-integration-v2.mjs +789 -257
- package/runtime/review-relay-contract.mjs +1 -1
- package/scripts/{build-git-commit-transaction-runner.mjs → build-runtime-modules.mjs} +4 -5
- package/scripts/gentle-ai-installer.mjs +75 -22
- package/scripts/maintainer/provider-relay-matrix.mjs +195 -11
- package/scripts/test-packed-runner.mjs +4 -7
- package/scripts/verify-package-files.mjs +12 -13
- package/skills/_shared/review-ledger-contract.md +8 -14
- 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/judgment-day/SKILL.md +5 -7
- package/skills/rdd-defect-workflow/SKILL.md +3 -3
- 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/codegraph-tools.test.ts +3 -3
- package/tests/crosslane/cross-lane.mjs +15 -1168
- package/tests/delegated-key-learnings-contract.test.ts +8 -6
- package/tests/devbinary/native-review-parity.devtest.ts +167 -250
- package/tests/devbinary/pi-host-relay.devtest.ts +867 -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/review-acknowledged-v1.captured.json +9 -0
- package/tests/fixtures/devbinary/review-acknowledged.provenance.md +31 -0
- package/tests/fixtures/devbinary/start-v3-zero-lens-closed.captured.json +21 -0
- package/tests/fixtures/native-review-cli/v2.5.0-rc.1/PROVENANCE.txt +15 -0
- package/tests/gentle-ai-binary.test.ts +83 -13
- package/tests/gentle-ai-dev-binary.test.ts +51 -228
- package/tests/gentle-ai-installer.test.ts +137 -47
- package/tests/gentle-ai.test.ts +820 -131
- package/tests/gentle-theme.test.ts +133 -0
- package/tests/maintainer/provider-relay.maintest.ts +340 -4
- package/tests/model-routing-authority.test.ts +257 -0
- package/tests/native-review-capability-contract.test.ts +28 -1
- package/tests/native-review-cli.test.ts +586 -962
- package/tests/native-review-consent.test.ts +150 -66
- package/tests/native-review-parity-runtime.test.ts +80 -359
- package/tests/native-review-parity.test.ts +674 -925
- package/tests/opaque-pi-reviewer-adapter.test.ts +266 -0
- package/tests/orchestrator-budget.test.ts +132 -88
- package/tests/orchestrator-rdd-ownership.test.ts +103 -0
- package/tests/package-manifest.test.ts +37 -35
- package/tests/provider-defect-handoff.test.ts +15 -118
- package/tests/quiet-tool-rendering.test.ts +1055 -28
- package/tests/review-authority-recovery-docs.test.ts +1 -2
- package/tests/review-candidate-view.test.ts +409 -3
- package/tests/review-compact-contract.test.ts +4 -30
- package/tests/review-controller-lock-status.test.ts +2 -2
- package/tests/review-controller-native-recovery.test.ts +363 -1450
- package/tests/review-controller-native-routing.test.ts +1251 -5642
- package/tests/review-controller-retired-ops.test.ts +1 -1
- package/tests/review-controller-workspace-root.test.ts +222 -71
- package/tests/review-controller.test.ts +26 -816
- package/tests/review-corrected-finalize-binding.test.ts +112 -153
- package/tests/review-dispatch-hydration-gap.test.ts +1 -53
- 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 +117 -82
- package/tests/review-host-relay.test.ts +242 -8
- package/tests/review-integration-v2-forward.test.ts +576 -553
- package/tests/review-integration-v2.test.ts +239 -165
- package/tests/review-last-event-closure.test.ts +408 -0
- package/tests/review-ledger-contract.test.ts +97 -35
- package/tests/review-recovered-lineage-routing.test.ts +0 -47
- package/tests/review-relay-transport-agent.test.ts +119 -46
- package/tests/review-snapshot.test.ts +3 -2
- package/tests/runtime-harness.mjs +361 -196
- package/tests/sdd-agent-tools.test.ts +36 -0
- package/tests/sdd-preflight.test.ts +81 -15
- package/tests/sdd-status.test.ts +109 -110
- package/tests/skill-collision-prefixes.test.ts +5 -8
- 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/lib/git-commit-transaction.ts +0 -861
- package/runtime/git-commit-transaction.mjs +0 -862
- package/scripts/run-git-commit-transaction.mjs +0 -35
- 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 -530
|
@@ -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
|
+
}
|