@intentic/sandbox-contract 1.224.0 → 1.226.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 +14 -14
- package/dist/agent-catalog.d.ts +2 -0
- package/dist/agent-catalog.d.ts.map +1 -1
- package/dist/agent-catalog.js +19 -3
- package/dist/agent-catalog.js.map +1 -1
- package/dist/chores/chores.js +42 -42
- package/dist/chores/chores.js.map +1 -1
- package/dist/chores/extension-update.js +2 -2
- package/dist/chores/extension-update.js.map +1 -1
- package/dist/chores/fix-deps.js +1 -1
- package/dist/chores/fix-deps.js.map +1 -1
- package/dist/chores/probes.js +1 -1
- package/dist/chores/probes.js.map +1 -1
- package/dist/chores/verdict.js +2 -2
- package/dist/chores/verdict.js.map +1 -1
- package/dist/contracts/capabilities.contract.d.ts +41 -0
- package/dist/contracts/capabilities.contract.d.ts.map +1 -1
- package/dist/contracts/exit.contract.d.ts +80 -0
- package/dist/contracts/exit.contract.d.ts.map +1 -0
- package/dist/contracts/exit.contract.js +13 -0
- package/dist/contracts/exit.contract.js.map +1 -0
- package/dist/contracts/settings.contract.d.ts +12 -0
- package/dist/contracts/settings.contract.d.ts.map +1 -1
- package/dist/events.d.ts +4 -4
- package/dist/events.d.ts.map +1 -1
- package/dist/events.js +5 -5
- package/dist/events.js.map +1 -1
- package/dist/fast-tier.d.ts +9 -0
- package/dist/fast-tier.d.ts.map +1 -0
- package/dist/fast-tier.js +19 -0
- package/dist/fast-tier.js.map +1 -0
- package/dist/history-state.js +3 -3
- package/dist/history-state.js.map +1 -1
- package/dist/index.d.ts +203 -68
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -1
- package/dist/model-order.d.ts +1 -0
- package/dist/model-order.d.ts.map +1 -1
- package/dist/model-order.js +5 -0
- package/dist/model-order.js.map +1 -1
- package/dist/output-fields.d.ts.map +1 -1
- package/dist/output-fields.js +2 -2
- package/dist/output-fields.js.map +1 -1
- package/dist/prompt-complexity.d.ts +19 -0
- package/dist/prompt-complexity.d.ts.map +1 -0
- package/dist/prompt-complexity.js +83 -0
- package/dist/prompt-complexity.js.map +1 -0
- package/dist/publish-drafts.js +2 -2
- package/dist/publish-drafts.js.map +1 -1
- package/dist/schemas.d.ts +214 -0
- package/dist/schemas.d.ts.map +1 -1
- package/dist/schemas.js +113 -2
- package/dist/schemas.js.map +1 -1
- package/dist/workflow-faults.js +3 -3
- package/dist/workflow-faults.js.map +1 -1
- package/dist/workspace-state.d.ts +20 -20
- package/dist/workspace-state.d.ts.map +1 -1
- package/dist/workspace-state.js +20 -20
- package/dist/workspace-state.js.map +1 -1
- package/package.json +5 -5
- package/src/agent-catalog.test.ts +72 -27
- package/src/agent-catalog.ts +91 -3
- package/src/agent-run-model.test.ts +3 -3
- package/src/capability-ledger.test.ts +34 -15
- package/src/chores/chores.test.ts +1 -1
- package/src/chores/chores.ts +42 -42
- package/src/chores/digest.test.ts +1 -1
- package/src/chores/extension-update.ts +2 -2
- package/src/chores/fix-deps.ts +1 -1
- package/src/chores/probes.test.ts +6 -6
- package/src/chores/probes.ts +1 -1
- package/src/chores/stack.test.ts +3 -3
- package/src/chores/verdict.test.ts +20 -20
- package/src/chores/verdict.ts +2 -2
- package/src/contract-lock.test.ts +1 -1
- package/src/contracts/exit.contract.ts +42 -0
- package/src/contracts/providers.contract.ts +1 -1
- package/src/conversation-ids.ts +1 -1
- package/src/events.test.ts +3 -3
- package/src/events.ts +6 -6
- package/src/fast-tier.test.ts +88 -0
- package/src/fast-tier.ts +72 -0
- package/src/history-state.ts +3 -3
- package/src/hostnames.test.ts +1 -1
- package/src/index.ts +5 -0
- package/src/model-order.test.ts +11 -11
- package/src/model-order.ts +22 -0
- package/src/output-fields.ts +2 -2
- package/src/path-refs.test.ts +4 -4
- package/src/prompt-complexity.test.ts +160 -0
- package/src/prompt-complexity.ts +271 -0
- package/src/publish-drafts.ts +2 -2
- package/src/quick-model.test.ts +11 -11
- package/src/routes.test.ts +11 -5
- package/src/runtime-state.test.ts +1 -1
- package/src/schemas.test.ts +8 -8
- package/src/schemas.ts +311 -6
- package/src/search-globs.test.ts +2 -2
- package/src/share-paths.test.ts +1 -1
- package/src/title.test.ts +9 -9
- package/src/title.ts +1 -1
- package/src/tunnel-ids.test.ts +3 -3
- package/src/versions.test.ts +3 -3
- package/src/versions.ts +1 -1
- package/src/workflow-faults.test.ts +6 -6
- package/src/workflow-faults.ts +3 -3
- package/src/workspace-state.test.ts +32 -32
- package/src/workspace-state.ts +20 -20
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# @intentic/sandbox-contract
|
|
2
2
|
|
|
3
|
-
The wire between the sandbox daemon and its browser client
|
|
3
|
+
The wire between the sandbox daemon and its browser client: change it here, and both sides follow.
|
|
4
4
|
|
|
5
5
|
Every route the daemon serves, every event it pushes, and every shape either side sends is declared once in this
|
|
6
6
|
package as an oRPC contract plus Zod schemas. The daemon implements the contract; the web app consumes it; a
|
|
@@ -18,32 +18,32 @@ mismatch is a type error rather than a runtime surprise.
|
|
|
18
18
|
|
|
19
19
|
## Key files
|
|
20
20
|
|
|
21
|
-
- [src/contracts](src/contracts)
|
|
22
|
-
- [src/schemas.ts](src/schemas.ts)
|
|
23
|
-
- [src/events.ts](src/events.ts)
|
|
24
|
-
- [src/workspace-state.ts](src/workspace-state.ts) and [src/runtime-state.ts](src/runtime-state.ts)
|
|
21
|
+
- [src/contracts](src/contracts): one contract per area. Start with `agent.contract.ts` and `git.contract.ts`.
|
|
22
|
+
- [src/schemas.ts](src/schemas.ts): the shared shapes; the biggest file here, and the one most changes touch.
|
|
23
|
+
- [src/events.ts](src/events.ts): what the daemon pushes, and when.
|
|
24
|
+
- [src/workspace-state.ts](src/workspace-state.ts) and [src/runtime-state.ts](src/runtime-state.ts): which
|
|
25
25
|
changed file, and which moved runtime thing, makes which browser view stale. The workspace table also assigns
|
|
26
26
|
each daemon-owned path its export lifecycle (`carry`, `secret`, `identity`, or `derived`), including the
|
|
27
|
-
auth/session/cache/artifact roots, and marks the configuration slice the root repo TRACKS (`versioned
|
|
27
|
+
auth/session/cache/artifact roots, and marks the configuration slice the root repo TRACKS (`versioned`: the
|
|
28
28
|
allowlist the git exclude rules are derived from, so a store added later is untracked until someone says
|
|
29
29
|
otherwise) and the authored-content slice a workspace SEARCH may surface (`versioned` + `authored` →
|
|
30
30
|
`SEARCHABLE_STATE_PATHS`, which iq's floor denies the rest of `.intentic` against by default). Extensions name
|
|
31
31
|
their scratch home through `extensionRuntimeDir` rather than spelling the layout themselves. The daemon
|
|
32
32
|
publishes the cause and the browser derives the consequence, so neither side keeps its own copy of the
|
|
33
33
|
other's list.
|
|
34
|
-
- [src/agent-catalog.ts](src/agent-catalog.ts)
|
|
34
|
+
- [src/agent-catalog.ts](src/agent-catalog.ts): what each (provider, harness) pair can actually DO, as one
|
|
35
35
|
record per runtime: its permission axis, its MCP reach, whether it steers, and how much of the owner's system
|
|
36
|
-
prompt it will take (`instructions
|
|
36
|
+
prompt it will take (`instructions`: replace, add, or nothing at all). Shared because both sides act on it:
|
|
37
37
|
the daemon composes a turn's instructions against it and the browser both discloses what a pair cannot do
|
|
38
38
|
(`limitationsOf`) and names which models the system-prompt setting reaches.
|
|
39
|
-
- [src/chores](src/chores)
|
|
39
|
+
- [src/chores](src/chores), the chore book: definitions, applicability gates and verdicts, shared because the
|
|
40
40
|
daemon computes the signals and the browser renders the judgement.
|
|
41
|
-
- [src/publish-drafts.ts](src/publish-drafts.ts)
|
|
41
|
+
- [src/publish-drafts.ts](src/publish-drafts.ts): the drafts publisher automation, shared for the chore book's
|
|
42
42
|
reason by its three consumers: the daemon's seeder, the recipe gallery, and the drafts routes' instant fire.
|
|
43
|
-
- [src/workflow-faults.ts](src/workflow-faults.ts) and [src/output-fields.ts](src/output-fields.ts)
|
|
43
|
+
- [src/workflow-faults.ts](src/workflow-faults.ts) and [src/output-fields.ts](src/output-fields.ts): graph and
|
|
44
44
|
structured-output invariants shared by the designer and daemon, including duplicate field-name rejection.
|
|
45
|
-
- [src/index.ts](src/index.ts)
|
|
46
|
-
- [src/contract-lock.ts](src/contract-lock.ts) and [contract.lock.json](contract.lock.json)
|
|
45
|
+
- [src/index.ts](src/index.ts): the public surface.
|
|
46
|
+
- [src/contract-lock.ts](src/contract-lock.ts) and [contract.lock.json](contract.lock.json): every exported
|
|
47
47
|
schema serialized to one committed, comparable document. Regenerate with `pnpm --filter
|
|
48
48
|
@intentic/sandbox-contract lock` whenever a schema changes; the test beside it fails until you do, and the
|
|
49
49
|
repo-level prepass refuses a push whose lock *lost or changed* an existing surface without a declared
|
|
@@ -61,5 +61,5 @@ the wire without a cycle.
|
|
|
61
61
|
|
|
62
62
|
- **Logic lives here only when both sides must agree on it.** A chore's verdict qualifies; a view's layout does
|
|
63
63
|
not. When in doubt, the test is whether disagreement between daemon and browser would be a bug.
|
|
64
|
-
- A cross-package type change may not resolve until the workspace settles
|
|
64
|
+
- A cross-package type change may not resolve until the workspace settles: `@intentic/*` imports go through
|
|
65
65
|
`node_modules` to the main checkout's source. See the workspace README before concluding an export is missing.
|
package/dist/agent-catalog.d.ts
CHANGED
|
@@ -51,6 +51,8 @@ export interface AgentCapabilities {
|
|
|
51
51
|
readonly terminals: boolean;
|
|
52
52
|
readonly recovery: boolean;
|
|
53
53
|
readonly instructions: "replace" | "append" | "none";
|
|
54
|
+
readonly rulebook: "hooks" | "approval" | "refuse-only" | "none";
|
|
55
|
+
readonly secrets: "masked" | "none";
|
|
54
56
|
}
|
|
55
57
|
export declare const PI_PROVIDER = "pi";
|
|
56
58
|
export declare const capabilitiesOf: (provider: AgentProvider, harness: AgentHarness) => AgentCapabilities;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-catalog.d.ts","sourceRoot":"","sources":["../src/agent-catalog.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"agent-catalog.d.ts","sourceRoot":"","sources":["../src/agent-catalog.ts"],"names":[],"mappings":"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"}
|
package/dist/agent-catalog.js
CHANGED
|
@@ -55,6 +55,8 @@ const CLAUDE_CODE = {
|
|
|
55
55
|
terminals: true,
|
|
56
56
|
recovery: true,
|
|
57
57
|
instructions: "replace",
|
|
58
|
+
rulebook: "hooks",
|
|
59
|
+
secrets: "masked",
|
|
58
60
|
};
|
|
59
61
|
const CODEX = {
|
|
60
62
|
runtime: "codex",
|
|
@@ -70,6 +72,8 @@ const CODEX = {
|
|
|
70
72
|
terminals: false,
|
|
71
73
|
recovery: false,
|
|
72
74
|
instructions: "replace",
|
|
75
|
+
rulebook: "approval",
|
|
76
|
+
secrets: "none",
|
|
73
77
|
};
|
|
74
78
|
const OPENCODE = {
|
|
75
79
|
runtime: "opencode",
|
|
@@ -85,6 +89,8 @@ const OPENCODE = {
|
|
|
85
89
|
terminals: false,
|
|
86
90
|
recovery: false,
|
|
87
91
|
instructions: "append",
|
|
92
|
+
rulebook: "refuse-only",
|
|
93
|
+
secrets: "none",
|
|
88
94
|
};
|
|
89
95
|
const OPENCODE_GEMINI = {
|
|
90
96
|
...OPENCODE,
|
|
@@ -104,6 +110,8 @@ const ACP = {
|
|
|
104
110
|
terminals: true,
|
|
105
111
|
recovery: false,
|
|
106
112
|
instructions: "none",
|
|
113
|
+
rulebook: "approval",
|
|
114
|
+
secrets: "none",
|
|
107
115
|
};
|
|
108
116
|
export const PI_PROVIDER = "pi";
|
|
109
117
|
const PI = {
|
|
@@ -120,6 +128,8 @@ const PI = {
|
|
|
120
128
|
terminals: false,
|
|
121
129
|
recovery: false,
|
|
122
130
|
instructions: "none",
|
|
131
|
+
rulebook: "none",
|
|
132
|
+
secrets: "none",
|
|
123
133
|
};
|
|
124
134
|
export const capabilitiesOf = (provider, harness) => {
|
|
125
135
|
if (provider === "codex") {
|
|
@@ -148,11 +158,11 @@ export const limitationsOf = (capabilities) => [
|
|
|
148
158
|
...(capabilities.mcp === "none"
|
|
149
159
|
? ["no MCP tools or plugins"]
|
|
150
160
|
: capabilities.mcp === "http"
|
|
151
|
-
? ["MCP tools only
|
|
161
|
+
? ["MCP tools only: no plugins or browser"]
|
|
152
162
|
: capabilities.mcp === "browser"
|
|
153
|
-
? ["browser tools only
|
|
163
|
+
? ["browser tools only: no plugins or other MCP tools"]
|
|
154
164
|
: []),
|
|
155
|
-
...(capabilities.execution.includes("js") ? [] : ["no code runs
|
|
165
|
+
...(capabilities.execution.includes("js") ? [] : ["no code runs, its shell is the one way to execute"]),
|
|
156
166
|
...(capabilities.effort ? [] : ["no effort control"]),
|
|
157
167
|
...(capabilities.commands ? [] : ["no slash commands"]),
|
|
158
168
|
...(capabilities.terminals ? [] : ["no terminal panel"]),
|
|
@@ -160,6 +170,12 @@ export const limitationsOf = (capabilities) => [
|
|
|
160
170
|
...(capabilities.recovery ? [] : ["no auto-resume after an outage"]),
|
|
161
171
|
...(capabilities.instructions === "append" ? ["your system prompt is added to theirs, not replacing it"] : []),
|
|
162
172
|
...(capabilities.instructions === "none" ? ["your system prompt isn't applied"] : []),
|
|
173
|
+
...(capabilities.rulebook === "approval" ? ["your command rules apply only to calls this agent asks about"] : []),
|
|
174
|
+
...(capabilities.rulebook === "refuse-only"
|
|
175
|
+
? ["your command rules can stop a command here but not pause to ask: a rule set to hold refuses instead"]
|
|
176
|
+
: []),
|
|
177
|
+
...(capabilities.rulebook === "none" ? ["your command rules aren't applied"] : []),
|
|
178
|
+
...(capabilities.secrets === "none" ? ["stored secrets reach the model unmasked, and `{{secret:name}}` isn't substituted"] : []),
|
|
163
179
|
];
|
|
164
180
|
export const CLAUDE_SEED_MODELS = [
|
|
165
181
|
{ id: "claude-opus-5", label: "Claude Opus 5" },
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-catalog.js","sourceRoot":"","sources":["../src/agent-catalog.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"agent-catalog.js","sourceRoot":"","sources":["../src/agent-catalog.ts"],"names":[],"mappings":"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"}
|
package/dist/chores/chores.js
CHANGED
|
@@ -52,16 +52,16 @@ const security = {
|
|
|
52
52
|
headline: `${plural(blocking.length, `advisory`, `advisories`)}, ${patchable.length} with a published fix`,
|
|
53
53
|
detail: blocking
|
|
54
54
|
.toSorted((left, right) => left.name.localeCompare(right.name))
|
|
55
|
-
.map((advisory) => `${advisory.severity} · ${advisory.name}
|
|
55
|
+
.map((advisory) => `${advisory.severity} · ${advisory.name}, ${advisory.title}${advisory.patched === undefined ? ` (no patch yet)` : ``}`),
|
|
56
56
|
digest: digestOf(...blocking.map((advisory) => `${advisory.name}@${advisory.severity}`).toSorted()),
|
|
57
57
|
severity: production.length > 0 ? `warning` : `info`,
|
|
58
58
|
why: `pnpm audit reports ${plural(blocking.length, `high or critical advisory`, `high or critical advisories`)} against ` +
|
|
59
|
-
`${repoLabel(context.repo)}
|
|
59
|
+
`${repoLabel(context.repo)}, ${production.length} reaching a production dependency path, ${patchable.length} with a published patched range: ` +
|
|
60
60
|
`${blocking.map((advisory) => `${advisory.name} (${advisory.severity}${advisory.dev ? `, dev-only` : ``}${advisory.patched === undefined ? `, no patch` : `, fixed in ${advisory.patched}`})`).join(`; `)}.`,
|
|
61
61
|
};
|
|
62
62
|
},
|
|
63
63
|
diagnosis: `An advisory with a published fix is a version bump someone has to actually make; one without is a risk to decide about.`,
|
|
64
|
-
goal: `For each advisory, establish whether this workspace reaches the vulnerable code path at all
|
|
64
|
+
goal: `For each advisory, establish whether this workspace reaches the vulnerable code path at all: a transitive dependency of a ` +
|
|
65
65
|
`build-time tool is a different problem from one in a running service. Where the fix is a version bump the lockfile can absorb, ` +
|
|
66
66
|
`make it. Where it needs a real upgrade or has no patch published, leave it and say what it would take. Never rewrite ` +
|
|
67
67
|
`application code to route around a CVE.`,
|
|
@@ -101,7 +101,7 @@ const dependencies = {
|
|
|
101
101
|
};
|
|
102
102
|
},
|
|
103
103
|
diagnosis: `Version drift is cheap to fix continuously and expensive to fix in one go, because the majors start depending on each other.`,
|
|
104
|
-
goal: `Take the patch and minor upgrades in one pass
|
|
104
|
+
goal: `Take the patch and minor upgrades in one pass: those are what the lockfile can absorb without argument. Then take the majors ` +
|
|
105
105
|
`ONE AT A TIME, reading each one's changelog for breaking changes before you touch anything, and stop at the first one that ` +
|
|
106
106
|
`needs more than a mechanical fix: leave it, and say what it would take. Do not batch majors; a failing test after eight of them ` +
|
|
107
107
|
`is a bisect nobody wanted.`,
|
|
@@ -147,7 +147,7 @@ const deadCode = {
|
|
|
147
147
|
};
|
|
148
148
|
},
|
|
149
149
|
diagnosis: `Code nothing reaches still has to be read, type-checked and kept compiling by everyone who works nearby.`,
|
|
150
|
-
goal: `Re-run knip yourself first
|
|
150
|
+
goal: `Re-run knip yourself first: this measurement is hours old and the tree has moved. Then check each finding against how the ` +
|
|
151
151
|
`file is actually used: knip is confidently wrong about anything reachable from OUTSIDE the repository, which means a package's ` +
|
|
152
152
|
`public entry points, files a bundler or framework loads by convention, and types consumed only by a downstream package. Delete ` +
|
|
153
153
|
`what is genuinely unreachable. Leave the false positives and list them in one line each, so the next run's reader knows they ` +
|
|
@@ -159,7 +159,7 @@ const duplication = {
|
|
|
159
159
|
id: `duplication`,
|
|
160
160
|
title: `Find duplication worth collapsing`,
|
|
161
161
|
icon: `clone`,
|
|
162
|
-
description: `Copy-paste that has grown past a fifth of a percent of the tree. Reports only
|
|
162
|
+
description: `Copy-paste that has grown past a fifth of a percent of the tree. Reports only, extracting is a design call.`,
|
|
163
163
|
kind: `drifting`,
|
|
164
164
|
criterion: `jscpd reports more than 5% of the scanned tree duplicated.`,
|
|
165
165
|
stance: `report`,
|
|
@@ -188,10 +188,10 @@ const duplication = {
|
|
|
188
188
|
`the largest are ${top.map((clone) => `${clone.first} ↔ ${clone.second} (${clone.lines} lines)`).join(`; `)}.`,
|
|
189
189
|
};
|
|
190
190
|
},
|
|
191
|
-
diagnosis: `Duplication only costs anything when the copies have to change together
|
|
191
|
+
diagnosis: `Duplication only costs anything when the copies have to change together, and only some of it does.`,
|
|
192
192
|
goal: `Report the clones where the copies genuinely have to change together. For each: cite both file:line ranges, say what the shared ` +
|
|
193
193
|
`concept actually is, and name where the extraction would live. Then say explicitly which of the reported clones you are NOT ` +
|
|
194
|
-
`recommending against
|
|
194
|
+
`recommending against: generated files, deliberately repetitive tests, and lookalikes owned by different subsystems, so the ` +
|
|
195
195
|
`next reader knows the list was triaged rather than truncated.`,
|
|
196
196
|
done: `Done when every clone in the report has either a named extraction or a one-line reason it should stay.`,
|
|
197
197
|
};
|
|
@@ -199,7 +199,7 @@ const documentation = {
|
|
|
199
199
|
id: `documentation-refresh`,
|
|
200
200
|
title: `Document what nothing explains`,
|
|
201
201
|
icon: `file-edit`,
|
|
202
|
-
description: `Packages in this repository with no README
|
|
202
|
+
description: `Packages in this repository with no README, new ones first.`,
|
|
203
203
|
kind: `drifting`,
|
|
204
204
|
criterion: `A workspace package has no README.`,
|
|
205
205
|
applies: (signals) => (signals.packages.length > 0 ? undefined : `not a workspace`),
|
|
@@ -221,7 +221,7 @@ const documentation = {
|
|
|
221
221
|
};
|
|
222
222
|
},
|
|
223
223
|
diagnosis: `A package nobody can read the shape of gets worked in by guesswork, and the guesses accumulate.`,
|
|
224
|
-
goal: `Follow this workspace's own documentation conventions
|
|
224
|
+
goal: `Follow this workspace's own documentation conventions: read them first, they are not optional and they are not generic. For ` +
|
|
225
225
|
`each undocumented package, read the package before you write a word about it, and produce the document its conventions call ` +
|
|
226
226
|
`for: what the package is FOR, how it fits the system, and which files matter. Explain at the module level. Never describe code ` +
|
|
227
227
|
`line by line, and never document a package you did not read.`,
|
|
@@ -240,7 +240,7 @@ const complexity = {
|
|
|
240
240
|
id: `complexity`,
|
|
241
241
|
title: `Simplify what everything waits on`,
|
|
242
242
|
icon: `wave-pulse`,
|
|
243
|
-
description: `Files that both churn and carry the repository
|
|
243
|
+
description: `Files that both churn and carry the repository, where edits are slow and ripple outward.`,
|
|
244
244
|
kind: `accruing`,
|
|
245
245
|
criterion: `A file in the hotspot ranking is also a key module, or its branching is three times the median of that ranking.`,
|
|
246
246
|
stance: `act`,
|
|
@@ -259,7 +259,7 @@ const complexity = {
|
|
|
259
259
|
const reason = (path, branches) => keyModules.has(path) ? `churns and the rest of the repository imports it` : `${branches} branch points against a median of ${middle}`;
|
|
260
260
|
return {
|
|
261
261
|
headline: `${plural(found.length, `file`)} where every edit is slow and ripples outward`,
|
|
262
|
-
detail: found.map((hotspot) => `${hotspot.path}
|
|
262
|
+
detail: found.map((hotspot) => `${hotspot.path}, ${hotspot.commits} commits, ${reason(hotspot.path, hotspot.complexity)}`),
|
|
263
263
|
digest: digestOf(...found.map((hotspot) => hotspot.path).toSorted()),
|
|
264
264
|
severity: `info`,
|
|
265
265
|
why: `${plural(found.length, `file`)} in ${repoLabel(context.repo)} are both change magnets and structurally tangled: ` +
|
|
@@ -267,10 +267,10 @@ const complexity = {
|
|
|
267
267
|
};
|
|
268
268
|
},
|
|
269
269
|
diagnosis: `A file that changes constantly and branches heavily makes every edit near it slow and easy to get wrong.`,
|
|
270
|
-
goal: `Take ONE file
|
|
270
|
+
goal: `Take ONE file: the worst of them, and no more. Read it first. If the rest of the repository imports it, separate the stable ` +
|
|
271
271
|
`contract from the churn: a narrow surface for importers, the volatile implementation private behind it. If it is simply ` +
|
|
272
|
-
`tangled, flatten it where it stands
|
|
273
|
-
`lookups
|
|
272
|
+
`tangled, flatten it where it stands: edge cases as early returns, compound conditions behind named predicates, long chains as ` +
|
|
273
|
+
`lookups, and extract a unit only if a cohesive one falls out. Behaviour stays identical, and no re-export shims are left behind.`,
|
|
274
274
|
done: `Done when \`iq hotspots\` reports materially fewer branch points for that file, the repository's checks pass, and no importer changed meaning.`,
|
|
275
275
|
};
|
|
276
276
|
const NODE_EOL = {
|
|
@@ -316,13 +316,13 @@ const runtime = {
|
|
|
316
316
|
],
|
|
317
317
|
digest: digestOf(`node:${major}`, past ? `eol` : `approaching`),
|
|
318
318
|
severity: past ? `warning` : `info`,
|
|
319
|
-
why: `This sandbox runs ${context.node}, and Node ${major} ${past ? `reached end of life on ${eol}` : `reaches end of life on ${eol}`}
|
|
319
|
+
why: `This sandbox runs ${context.node}, and Node ${major} ${past ? `reached end of life on ${eol}` : `reaches end of life on ${eol}`}, ` +
|
|
320
320
|
`${plural(pinned.length, `package`)} in ${repoLabel(context.repo)} pin a node engine range.`,
|
|
321
321
|
};
|
|
322
322
|
},
|
|
323
323
|
diagnosis: `An unsupported runtime stops receiving security patches, so every advisory against it stays open permanently.`,
|
|
324
324
|
goal: `Establish what actually pins this runtime: the image's own base, the workspace's useNodeVersion, and each package's engines ` +
|
|
325
|
-
`range. Propose the smallest move to a supported LTS
|
|
325
|
+
`range. Propose the smallest move to a supported LTS, which of those pins have to change, in what order, and what is likely to ` +
|
|
326
326
|
`break at that boundary. Make the pin changes that are mechanical; do NOT attempt the image rebuild itself.`,
|
|
327
327
|
done: `Done when the pins name a supported release, the repository's type-check and tests pass on it, and anything needing a rebuild is named as such.`,
|
|
328
328
|
};
|
|
@@ -339,7 +339,7 @@ const libraries = {
|
|
|
339
339
|
id: `library-overlap`,
|
|
340
340
|
title: `Settle on one library per job`,
|
|
341
341
|
icon: `box`,
|
|
342
|
-
description: `Two dependencies solving the same problem
|
|
342
|
+
description: `Two dependencies solving the same problem, both shipped, both maintained, one picked at random.`,
|
|
343
343
|
kind: `drifting`,
|
|
344
344
|
criterion: `Two or more installed dependencies do the same job.`,
|
|
345
345
|
applies: (signals) => (signals.packages.length > 0 ? undefined : `not a workspace`),
|
|
@@ -415,7 +415,7 @@ const bundleWeight = {
|
|
|
415
415
|
.toSorted()),
|
|
416
416
|
severity: `info`,
|
|
417
417
|
why: `The build output in ${dir}/ of ${repoLabel(context.repo)} is ${bytesLabel(totalGzip)} gzipped across ` +
|
|
418
|
-
`${plural(assets.length, `asset`)}, and ${largest.path} alone is ${bytesLabel(largest.gzip)} of it
|
|
418
|
+
`${plural(assets.length, `asset`)}, and ${largest.path} alone is ${bytesLabel(largest.gzip)} of it: ${Math.round(share)}%. ` +
|
|
419
419
|
`The next largest are ${ranked
|
|
420
420
|
.slice(1, 4)
|
|
421
421
|
.map((asset) => `${asset.path} (${bytesLabel(asset.gzip)})`)
|
|
@@ -424,7 +424,7 @@ const bundleWeight = {
|
|
|
424
424
|
};
|
|
425
425
|
},
|
|
426
426
|
diagnosis: `Everything in the first chunk is downloaded and parsed before anything renders, whether or not the visitor needed it.`,
|
|
427
|
-
goal: `Find out what is actually IN the dominant chunk before proposing anything
|
|
427
|
+
goal: `Find out what is actually IN the dominant chunk before proposing anything: the repository's own bundler can report this, and a ` +
|
|
428
428
|
`recommendation made without it is guesswork. Then report the split worth making: which routes or features could load on demand, ` +
|
|
429
429
|
`which dependencies are pulled in wholesale for one function, and which are only used behind an interaction nobody has yet had. ` +
|
|
430
430
|
`Name the boundary for each and estimate what it saves. Where the chunk is genuinely all first-paint code, say so and close it.`,
|
|
@@ -471,8 +471,8 @@ const frameworkIdiom = {
|
|
|
471
471
|
},
|
|
472
472
|
diagnosis: `A retired idiom keeps working until the major release that drops it, and then it is an emergency inside somebody else's upgrade.`,
|
|
473
473
|
goal: `Take ONE idiom, the one with the most files, and no more. Convert the files where the conversion is mechanical and the behaviour ` +
|
|
474
|
-
`is provably identical. Stop at the first file that needs a design decision
|
|
475
|
-
`semantics, an NgModule that something outside the repository imports
|
|
474
|
+
`is provably identical. Stop at the first file that needs a design decision: a class component with genuine error-boundary ` +
|
|
475
|
+
`semantics, an NgModule that something outside the repository imports: leave it, and say what it would take. Do not convert an ` +
|
|
476
476
|
`idiom the repository has deliberately kept: if the newest code uses it too, that is a choice, and reporting it as one is the ` +
|
|
477
477
|
`useful answer.`,
|
|
478
478
|
done: `Done when a re-scan reports fewer files on that idiom, the repository's type-check and tests pass, and every file you skipped has a one-line reason.`,
|
|
@@ -481,7 +481,7 @@ const componentOverlap = {
|
|
|
481
481
|
id: `component-overlap`,
|
|
482
482
|
title: `Settle on one component per job`,
|
|
483
483
|
icon: `copy`,
|
|
484
|
-
description: `Components built twice
|
|
484
|
+
description: `Components built twice, the same name in two places, or the same logic under two names.`,
|
|
485
485
|
kind: `drifting`,
|
|
486
486
|
criterion: `Two component files reduce to the same name, or a duplicated block spans two components.`,
|
|
487
487
|
applies: needsFramework,
|
|
@@ -532,11 +532,11 @@ const componentOverlap = {
|
|
|
532
532
|
`${pairs.length === 0 ? `` : `The clones: ${pairs.map((clone) => `${normalizePath(clone.first)} ↔ ${normalizePath(clone.second)}, ${clone.lines} lines`).join(`; `)}.`}`,
|
|
533
533
|
};
|
|
534
534
|
},
|
|
535
|
-
diagnosis: `A component built twice is maintained once
|
|
535
|
+
diagnosis: `A component built twice is maintained once, whichever copy the next person happens to open is the one that gets the fix.`,
|
|
536
536
|
goal: `Read every file in each group before saying anything about it; a shared name is a reason to look, not a finding on its own. For ` +
|
|
537
537
|
`each group, say whether these genuinely do the same job, and if they do, name the one to keep and count the call sites that would ` +
|
|
538
|
-
`have to move. Where the answer is that the same LOGIC is duplicated rather than the whole component
|
|
539
|
-
`state, the same form validation, the same list virtualization written twice
|
|
538
|
+
`have to move. Where the answer is that the same LOGIC is duplicated rather than the whole component: the same fetch and loading ` +
|
|
539
|
+
`state, the same form validation, the same list virtualization written twice: say so, and name the hook or composable it should ` +
|
|
540
540
|
`become and where it would live. Where two components share a name and nothing else, say that too and close it: a false family is ` +
|
|
541
541
|
`worth one line, and the next reader needs to know it was considered.`,
|
|
542
542
|
done: `Done when every group has either a component to keep with a call-site count, a shared unit to extract with a home, or a reason it is fine.`,
|
|
@@ -576,11 +576,11 @@ const tailwindBypass = {
|
|
|
576
576
|
.join(`, `)}.`,
|
|
577
577
|
};
|
|
578
578
|
},
|
|
579
|
-
diagnosis: `Every inline colour is a place the theme cannot reach
|
|
580
|
-
goal: `Read the theme first
|
|
579
|
+
diagnosis: `Every inline colour is a place the theme cannot reach, a palette change lands everywhere except the files that opted out of it.`,
|
|
580
|
+
goal: `Read the theme first: the Tailwind config, or the CSS that defines the tokens, so you know what the scale actually offers. Then ` +
|
|
581
581
|
`replace the values that have a token: an exact palette match, a spacing step, a type size. Where a value is CLOSE to a token but ` +
|
|
582
582
|
`not equal, do not round it silently; that is a visual change wearing a refactor's clothes. List those separately with both values ` +
|
|
583
|
-
`and let the owner decide. Where a value has no token and should
|
|
583
|
+
`and let the owner decide. Where a value has no token and should: a brand colour used in nine places, say that the theme is ` +
|
|
584
584
|
`missing an entry rather than editing nine files.`,
|
|
585
585
|
done: `Done when a re-scan reports fewer hard-coded values, nothing renders differently, and every value you left has a one-line reason.`,
|
|
586
586
|
};
|
|
@@ -601,7 +601,7 @@ const survey = ({ id, title, icon, description, diagnosis, goal, done, cadenceDa
|
|
|
601
601
|
detail: [`Cadence · every ${cadenceDays} days`],
|
|
602
602
|
digest: digestOf(id, `period:${Math.floor(context.nowMs / (cadenceDays * DAY_MS))}`),
|
|
603
603
|
severity: `info`,
|
|
604
|
-
why: `This is a periodic review of ${repoLabel(context.repo)}, run every ${cadenceDays} days; nothing measured it
|
|
604
|
+
why: `This is a periodic review of ${repoLabel(context.repo)}, run every ${cadenceDays} days; nothing measured it, it is due because it has been that long.`,
|
|
605
605
|
}),
|
|
606
606
|
diagnosis,
|
|
607
607
|
goal,
|
|
@@ -612,10 +612,10 @@ const patterns = survey({
|
|
|
612
612
|
id: `standardize-patterns`,
|
|
613
613
|
title: `Standardize the cross-cutting patterns`,
|
|
614
614
|
icon: `sitemap`,
|
|
615
|
-
description: `Error handling, validation, logging, configuration, retries, pagination
|
|
615
|
+
description: `Error handling, validation, logging, configuration, retries, pagination, the things every file does slightly differently.`,
|
|
616
616
|
diagnosis: `Cross-cutting concerns drift one file at a time, and the cost only shows up when someone has to work across several of them.`,
|
|
617
|
-
goal: `Pick the cross-cutting concerns this repository actually has
|
|
618
|
-
`pagination, serialization
|
|
617
|
+
goal: `Pick the cross-cutting concerns this repository actually has: error handling, input validation, logging, configuration, retries, ` +
|
|
618
|
+
`pagination, serialization, and for each, survey how it is done. Name the dominant pattern, the outliers, and which of the ` +
|
|
619
619
|
`outliers are deliberate. Recommend ONE convention per concern with a file to point at as the reference implementation, and ` +
|
|
620
620
|
`estimate the size of the conversion. Do not convert anything.`,
|
|
621
621
|
done: `Done when each concern has a named convention, a reference file, and a count of the sites that diverge from it.`,
|
|
@@ -629,7 +629,7 @@ const deprecated = survey({
|
|
|
629
629
|
description: `Language, runtime and framework APIs this code still uses that their own maintainers have moved on from.`,
|
|
630
630
|
diagnosis: `A deprecated API works right up until the upgrade that removes it, and then it is an emergency during someone else's migration.`,
|
|
631
631
|
goal: `Survey what this repository uses that its own dependencies have deprecated: read the framework and runtime versions in use, check ` +
|
|
632
|
-
`their deprecation notices, and search for the call sites. Include the repository's OWN deprecations
|
|
632
|
+
`their deprecation notices, and search for the call sites. Include the repository's OWN deprecations: anything its code marks ` +
|
|
633
633
|
`as deprecated and still calls. Rank by when each one actually breaks, not by how many call sites it has, and name the ` +
|
|
634
634
|
`replacement for each. Change nothing.`,
|
|
635
635
|
done: `Done when every deprecation has call sites cited, a replacement named, and the release it is expected to break in.`,
|
|
@@ -640,11 +640,11 @@ const documentationDrift = survey({
|
|
|
640
640
|
id: `documentation-drift`,
|
|
641
641
|
title: `Re-read the documentation against the code`,
|
|
642
642
|
icon: `file`,
|
|
643
|
-
description: `Whether what the documents claim is still what the code does
|
|
643
|
+
description: `Whether what the documents claim is still what the code does, the drift no tool can measure.`,
|
|
644
644
|
diagnosis: `Documentation is trusted in proportion to how recently it was true, and a document that is quietly wrong is worse than a missing one.`,
|
|
645
645
|
goal: `Read this repository's architecture documents against the code they describe. Report every claim that is no longer true, citing the ` +
|
|
646
|
-
`document line and the file that contradicts it. Prioritise the claims someone would ACT on
|
|
647
|
-
`what, which file to change
|
|
646
|
+
`document line and the file that contradicts it. Prioritise the claims someone would ACT on, where a subsystem lives, what owns ` +
|
|
647
|
+
`what, which file to change: over prose that has merely aged. Do not rewrite the documents; produce the list of what is wrong.`,
|
|
648
648
|
done: `Done when every architecture document has been read and every false claim is listed with both sides cited.`,
|
|
649
649
|
cadenceDays: 90,
|
|
650
650
|
applies: (signals) => (signals.shape.docs.length > 0 ? undefined : `no architecture documents`),
|
|
@@ -658,7 +658,7 @@ const pipelines = survey({
|
|
|
658
658
|
goal: `Read this repository's pipeline definitions and report what it pays for repeatedly: dependency installs with no cache key, ` +
|
|
659
659
|
`build outputs recomputed between jobs, steps that are serial for no reason, and matrix legs that duplicate each other's work. ` +
|
|
660
660
|
`For each, name the file and step, say roughly what it costs per run, and give the change that would fix it. Where a step is slow ` +
|
|
661
|
-
`because it genuinely has to be, say so
|
|
661
|
+
`because it genuinely has to be, say so: a pipeline that is honestly expensive is not a finding.`,
|
|
662
662
|
done: `Done when every finding names a file, a step, and a concrete change, and anything deliberately slow is called out as such.`,
|
|
663
663
|
cadenceDays: 90,
|
|
664
664
|
applies: (signals) => (signals.shape.ci.length > 0 ? undefined : `no CI pipeline`),
|
|
@@ -667,21 +667,21 @@ const images = survey({
|
|
|
667
667
|
id: `docker-image`,
|
|
668
668
|
title: `Slim the container image`,
|
|
669
669
|
icon: `box`,
|
|
670
|
-
description: `Layer order, build context and final size
|
|
670
|
+
description: `Layer order, build context and final size, what ships in the image that did not need to.`,
|
|
671
671
|
diagnosis: `Image size is paid on every pull and every cold start, and layer order decides how much of a build is cache hits.`,
|
|
672
672
|
goal: `Read this repository's Dockerfiles and report what makes the image larger or the build slower than it needs to be: layers ordered ` +
|
|
673
673
|
`so that a source edit invalidates the dependency install, build-time toolchains left in the final stage, a build context that ships ` +
|
|
674
674
|
`the whole repository, and package caches never cleaned. For each, cite the file and line, and name the change. Do not rewrite the ` +
|
|
675
|
-
`Dockerfiles
|
|
675
|
+
`Dockerfiles: an image that fails to build is a much worse problem than one that is larger than ideal.`,
|
|
676
676
|
done: `Done when every finding cites a Dockerfile line and names the change, with the ones that would need a base-image swap called out separately.`,
|
|
677
677
|
cadenceDays: 90,
|
|
678
678
|
applies: (signals) => (signals.shape.dockerfiles.length > 0 ? undefined : `no Dockerfile`),
|
|
679
679
|
});
|
|
680
680
|
export const CHORE_KINDS = [
|
|
681
|
-
{ kind: `carrying`, label: `Carrying`, caption: `a risk this repository is running today
|
|
681
|
+
{ kind: `carrying`, label: `Carrying`, caption: `a risk this repository is running today, someone else decides when it becomes urgent` },
|
|
682
682
|
{ kind: `accruing`, label: `Accruing`, caption: `cheap now, expensive later, and always getting later` },
|
|
683
683
|
{ kind: `drifting`, label: `Drifting`, caption: `the shape of the thing is diverging from the idea of it` },
|
|
684
|
-
{ kind: `surveying`, label: `Surveying`, caption: `periodic reads with nothing measuring them
|
|
684
|
+
{ kind: `surveying`, label: `Surveying`, caption: `periodic reads with nothing measuring them, due because it has been that long` },
|
|
685
685
|
];
|
|
686
686
|
const BOOK = [
|
|
687
687
|
security,
|