planr 1.4.0 → 1.5.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.
Files changed (54) hide show
  1. package/README.md +9 -56
  2. package/docs/ARCHITECTURE.md +4 -4
  3. package/docs/CLI_REFERENCE.md +6 -14
  4. package/docs/CODEX.md +6 -6
  5. package/docs/EXAMPLE_WEBAPP.md +63 -97
  6. package/docs/GOALS.md +8 -25
  7. package/docs/INSTALL.md +2 -2
  8. package/docs/MCP_CONTRACT.md +2 -5
  9. package/docs/MODEL_ROUTING.md +20 -177
  10. package/docs/ROUTING_BUNDLES.md +32 -0
  11. package/docs/SKILLS.md +5 -3
  12. package/docs/fixtures/mcp-contract.json +3 -11
  13. package/npm/native/darwin-arm64/planr +0 -0
  14. package/npm/native/darwin-x86_64/planr +0 -0
  15. package/npm/native/linux-arm64/planr +0 -0
  16. package/npm/native/linux-x86_64/planr +0 -0
  17. package/package.json +2 -14
  18. package/plugins/planr/.claude-plugin/plugin.json +1 -1
  19. package/plugins/planr/.codex-plugin/plugin.json +1 -1
  20. package/plugins/planr/skills/planr-loop/SKILL.md +1 -1
  21. package/docs/PRESET_COMPOSITION.md +0 -109
  22. package/docs/PRESET_EVALUATION.md +0 -118
  23. package/docs/PRESET_REGISTRY.md +0 -61
  24. package/evaluations/preset-suite-v1.toml +0 -127
  25. package/evaluations/sol-luna-codex-v1.toml +0 -42
  26. package/plugins/planr/skills/planr-loop/agents/planr-reviewer.toml +0 -23
  27. package/plugins/planr/skills/planr-loop/agents/planr-worker.toml +0 -21
  28. package/presets/bindings/claude-native.toml +0 -52
  29. package/presets/bindings/codex-openai.toml +0 -56
  30. package/presets/bindings/cursor-fable-grok.toml +0 -49
  31. package/presets/bindings/cursor-openai.toml +0 -49
  32. package/presets/bindings/mixed-host.toml +0 -64
  33. package/presets/policies/balanced.toml +0 -50
  34. package/presets/policies/low-usage.toml +0 -50
  35. package/presets/policies/max-quality.toml +0 -50
  36. package/presets/policies/read-only-audit.toml +0 -50
  37. package/website/README.md +0 -79
  38. package/website/_headers +0 -7
  39. package/website/alchemy-runtime.test.mjs +0 -21
  40. package/website/app.mjs +0 -216
  41. package/website/build-catalog.mjs +0 -135
  42. package/website/build-site.test.mjs +0 -69
  43. package/website/catalog-model.mjs +0 -185
  44. package/website/catalog-model.test.mjs +0 -124
  45. package/website/cloudflare-launcher.test.mjs +0 -38
  46. package/website/data/catalog.json +0 -307
  47. package/website/index.html +0 -122
  48. package/website/registry/manifest.toml +0 -48
  49. package/website/registry/report.md +0 -33
  50. package/website/registry/trusted-maintainers.toml +0 -6
  51. package/website/registry/verification.json +0 -7258
  52. package/website/serve.mjs +0 -41
  53. package/website/styles.css +0 -201
  54. package/website/test-fixtures/recommended.json +0 -72
package/website/serve.mjs DELETED
@@ -1,41 +0,0 @@
1
- #!/usr/bin/env node
2
- import { createReadStream, statSync } from "node:fs";
3
- import { createServer } from "node:http";
4
- import { extname, join, normalize, resolve } from "node:path";
5
- import { fileURLToPath } from "node:url";
6
-
7
- const root = resolve(fileURLToPath(new URL(".", import.meta.url)));
8
- const port = Number(process.env.PORT ?? 4173);
9
- const types = {
10
- ".css": "text/css; charset=utf-8",
11
- ".html": "text/html; charset=utf-8",
12
- ".json": "application/json; charset=utf-8",
13
- ".mjs": "text/javascript; charset=utf-8",
14
- ".svg": "image/svg+xml",
15
- };
16
-
17
- const server = createServer((request, response) => {
18
- const pathname = decodeURIComponent(new URL(request.url, "http://localhost").pathname);
19
- const relative = normalize(pathname === "/" ? "index.html" : pathname.replace(/^\/+/, ""));
20
- const path = resolve(join(root, relative));
21
- if (!path.startsWith(`${root}/`)) {
22
- response.writeHead(403).end("Forbidden");
23
- return;
24
- }
25
- try {
26
- if (!statSync(path).isFile()) throw new Error("not a file");
27
- response.writeHead(200, {
28
- "Content-Type": types[extname(path)] ?? "application/octet-stream",
29
- "Cache-Control": "no-store",
30
- "X-Content-Type-Options": "nosniff",
31
- });
32
- createReadStream(path).pipe(response);
33
- } catch {
34
- response.writeHead(404, { "Content-Type": "text/plain; charset=utf-8" }).end("Not found");
35
- }
36
- });
37
-
38
- server.listen(port, "127.0.0.1", () => {
39
- console.log(`Planr preset catalog listening on http://127.0.0.1:${port}`);
40
- });
41
-
@@ -1,201 +0,0 @@
1
- :root {
2
- color-scheme: dark;
3
- --ink: #f4f0e7;
4
- --muted: #a9a49a;
5
- --quiet: #77736c;
6
- --paper: #11110f;
7
- --panel: #181815;
8
- --panel-2: #20201c;
9
- --line: #35342e;
10
- --acid: #d9ff57;
11
- --blue: #7bd9ff;
12
- --amber: #ffc76a;
13
- --red: #ff8e7d;
14
- --green: #8fe3a8;
15
- --radius: 18px;
16
- font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
17
- font-synthesis: none;
18
- }
19
-
20
- * { box-sizing: border-box; }
21
- html { scroll-behavior: smooth; }
22
- body {
23
- margin: 0;
24
- background:
25
- radial-gradient(circle at 85% 5%, rgb(217 255 87 / 8%), transparent 30rem),
26
- linear-gradient(180deg, #151511 0, var(--paper) 36rem);
27
- color: var(--ink);
28
- min-width: 300px;
29
- }
30
-
31
- button, select, input { font: inherit; }
32
- button, select { color: inherit; }
33
- a { color: inherit; }
34
-
35
- .skip-link {
36
- position: fixed;
37
- left: 1rem;
38
- top: 1rem;
39
- z-index: 10;
40
- padding: .75rem 1rem;
41
- background: var(--acid);
42
- color: #111;
43
- clip-path: inset(50%);
44
- height: 1px;
45
- width: 1px;
46
- overflow: hidden;
47
- white-space: nowrap;
48
- transform: translateY(-200%);
49
- }
50
- .skip-link:focus {
51
- clip-path: none;
52
- height: auto;
53
- width: auto;
54
- overflow: visible;
55
- transform: translateY(0);
56
- }
57
-
58
- .site-header, main, footer { width: min(1180px, calc(100% - 2.5rem)); margin-inline: auto; }
59
- .site-header {
60
- min-height: 78px;
61
- display: flex;
62
- align-items: center;
63
- justify-content: space-between;
64
- border-bottom: 1px solid var(--line);
65
- }
66
- .brand { display: inline-flex; gap: .7rem; align-items: center; text-decoration: none; letter-spacing: -.02em; }
67
- .brand-mark {
68
- display: grid;
69
- place-items: center;
70
- width: 2rem;
71
- height: 2rem;
72
- border: 1px solid var(--acid);
73
- border-radius: 50%;
74
- color: var(--acid);
75
- font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
76
- }
77
- .brand strong { color: var(--acid); font-weight: 650; }
78
- .header-note { color: var(--quiet); font-size: .85rem; }
79
-
80
- .hero {
81
- min-height: 440px;
82
- display: grid;
83
- grid-template-columns: minmax(0, 1.5fr) minmax(290px, .7fr);
84
- gap: 5rem;
85
- align-items: center;
86
- padding-block: 6rem 4.5rem;
87
- }
88
- .eyebrow {
89
- margin: 0 0 .75rem;
90
- color: var(--acid);
91
- font: 600 .72rem/1.2 ui-monospace, SFMono-Regular, Menlo, monospace;
92
- letter-spacing: .13em;
93
- text-transform: uppercase;
94
- }
95
- h1, h2, h3, p { text-wrap: pretty; }
96
- h1 { margin: 0; font-size: clamp(3rem, 7vw, 6.5rem); line-height: .91; letter-spacing: -.07em; font-weight: 600; }
97
- h2 { margin: 0; font-size: clamp(1.6rem, 3vw, 2.65rem); line-height: 1; letter-spacing: -.045em; }
98
- h3 { letter-spacing: -.025em; }
99
- .lede { max-width: 720px; margin: 2rem 0 0; color: var(--muted); font-size: clamp(1rem, 1.8vw, 1.25rem); line-height: 1.6; }
100
- .catalog-stats { margin: 0; border-top: 1px solid var(--line); }
101
- .catalog-stats div { display: grid; grid-template-columns: 1fr auto; gap: 1rem; padding: 1.15rem 0; border-bottom: 1px solid var(--line); }
102
- .catalog-stats dt { color: var(--muted); }
103
- .catalog-stats dd { margin: 0; font-family: ui-monospace, SFMono-Regular, Menlo, monospace; }
104
-
105
- .fixture-banner { margin-bottom: 1rem; padding: .9rem 1.1rem; border: 1px solid var(--amber); background: rgb(255 199 106 / 8%); color: var(--amber); border-radius: 12px; }
106
- .authority-note {
107
- display: grid;
108
- grid-template-columns: auto 1fr;
109
- gap: 1.25rem;
110
- margin-bottom: 5rem;
111
- padding: 1.4rem;
112
- border: 1px solid var(--blue);
113
- border-radius: var(--radius);
114
- background: rgb(123 217 255 / 5%);
115
- }
116
- .authority-icon { color: var(--blue); font-size: 2rem; line-height: 1; }
117
- .authority-note h2 { font-size: 1.1rem; letter-spacing: -.015em; }
118
- .authority-note p { margin: .5rem 0 0; color: var(--muted); line-height: 1.55; max-width: 920px; }
119
-
120
- .compare-shell { padding-block: 2rem 6rem; }
121
- .section-heading { display: flex; justify-content: space-between; align-items: end; gap: 2rem; }
122
- .toggle { display: flex; align-items: center; gap: .65rem; color: var(--muted); cursor: pointer; }
123
- .toggle input { width: 1.15rem; height: 1.15rem; accent-color: var(--acid); }
124
- .selectors { display: grid; grid-template-columns: 1fr auto 1fr; gap: 1rem; align-items: end; margin: 2.2rem 0 1.2rem; }
125
- .selectors label { display: grid; gap: .55rem; color: var(--muted); font-size: .8rem; }
126
- select {
127
- width: 100%;
128
- padding: .95rem 2.5rem .95rem 1rem;
129
- border: 1px solid var(--line);
130
- border-radius: 12px;
131
- background: var(--panel);
132
- }
133
- select:focus-visible, button:focus-visible, input:focus-visible, a:focus-visible { outline: 3px solid var(--blue); outline-offset: 3px; }
134
- .versus { padding-bottom: 1rem; color: var(--quiet); font: .75rem ui-monospace, monospace; text-transform: uppercase; }
135
-
136
- .comparison-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 1.2rem; }
137
- .preset-card { min-width: 0; padding: clamp(1.2rem, 3vw, 2rem); border: 1px solid var(--line); border-radius: var(--radius); background: var(--panel); }
138
- .card-top { display: flex; align-items: start; justify-content: space-between; gap: 1rem; }
139
- .card-top h3 { margin: .2rem 0 0; font-size: clamp(1.45rem, 3vw, 2.1rem); }
140
- .binding-name { color: var(--muted); font-family: ui-monospace, monospace; font-size: .82rem; }
141
- .badge { display: inline-flex; align-items: center; gap: .4rem; padding: .35rem .55rem; border: 1px solid currentColor; border-radius: 999px; font: 600 .68rem ui-monospace, monospace; text-transform: uppercase; letter-spacing: .06em; }
142
- .badge::before { content: "●"; font-size: .55rem; }
143
- .status-recommended { color: var(--acid); }
144
- .status-verified { color: var(--blue); }
145
- .status-stale, .status-deprecated { color: var(--amber); }
146
- .status-experimental, .status-unverified { color: var(--muted); }
147
- .meta-line { color: var(--quiet); font: .75rem/1.5 ui-monospace, monospace; }
148
-
149
- .metric-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: 1px; margin: 1.5rem 0; overflow: hidden; border: 1px solid var(--line); border-radius: 12px; background: var(--line); }
150
- .metric { padding: 1rem; background: var(--panel-2); }
151
- .metric span { display: block; color: var(--quiet); font-size: .72rem; margin-bottom: .4rem; }
152
- .metric strong { font: 500 1.15rem ui-monospace, monospace; }
153
- .card-section { padding: 1.25rem 0; border-top: 1px solid var(--line); }
154
- .card-section h4 { margin: 0 0 .9rem; font-size: .78rem; color: var(--muted); text-transform: uppercase; letter-spacing: .08em; }
155
- .enforcement-list { display: grid; gap: .7rem; margin: 0; }
156
- .enforcement-list div { display: grid; grid-template-columns: minmax(120px, .45fr) 1fr; gap: 1rem; }
157
- .enforcement-list dt { font-size: .82rem; }
158
- .enforcement-list dd { margin: 0; color: var(--muted); font-size: .82rem; line-height: 1.45; }
159
- .compatibility-list { display: grid; gap: .7rem; margin: 0; }
160
- .compatibility-list div { display: grid; grid-template-columns: minmax(120px, .45fr) 1fr; gap: 1rem; }
161
- .compatibility-list dt { font-size: .82rem; }
162
- .compatibility-list dd { margin: 0; color: var(--muted); font-size: .82rem; line-height: 1.45; }
163
- .state { display: inline-block; margin-left: .35rem; color: var(--blue); font: .65rem ui-monospace, monospace; text-transform: uppercase; }
164
- .hash { overflow-wrap: anywhere; color: var(--quiet); font: .7rem/1.5 ui-monospace, monospace; }
165
- .command-block { display: grid; gap: .75rem; }
166
- .command-block code { display: block; overflow-x: auto; padding: 1rem; border-radius: 10px; background: #0b0b09; color: var(--acid); font: .75rem/1.5 ui-monospace, monospace; }
167
- .copy-button { justify-self: start; padding: .7rem .95rem; border: 1px solid var(--acid); border-radius: 9px; background: transparent; color: var(--acid); cursor: pointer; }
168
- .copy-button:hover { background: var(--acid); color: #111; }
169
-
170
- .empty-state { padding: 3rem; border: 1px dashed var(--line); border-radius: var(--radius); background: var(--panel); }
171
- .empty-state h3 { margin: .25rem 0 .75rem; font-size: 1.6rem; }
172
- .empty-state p:not(.eyebrow) { color: var(--muted); }
173
- .empty-state code { color: var(--acid); overflow-wrap: anywhere; }
174
-
175
- .legend { display: grid; grid-template-columns: .65fr 1.35fr; gap: 5rem; padding: 5rem 0; border-top: 1px solid var(--line); }
176
- .legend dl { margin: 0; }
177
- .legend dl div { display: grid; grid-template-columns: 140px 1fr; gap: 1rem; padding: .8rem 0; border-bottom: 1px solid var(--line); }
178
- .legend dt { font-weight: 650; }
179
- .legend dd { margin: 0; color: var(--muted); line-height: 1.5; }
180
- footer { display: flex; justify-content: space-between; gap: 2rem; padding: 2.5rem 0 4rem; border-top: 1px solid var(--line); color: var(--quiet); font-size: .78rem; }
181
- .sr-only { position: absolute !important; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap; border: 0; }
182
-
183
- @media (max-width: 760px) {
184
- .site-header, main, footer { width: min(100% - 1.4rem, 1180px); }
185
- .header-note { display: none; }
186
- .hero { min-height: auto; grid-template-columns: 1fr; gap: 3rem; padding-block: 4rem 3rem; }
187
- h1 { font-size: clamp(3rem, 16vw, 5.5rem); }
188
- .authority-note { margin-bottom: 3rem; }
189
- .section-heading { align-items: start; flex-direction: column; }
190
- .selectors { grid-template-columns: 1fr; }
191
- .versus { display: none; }
192
- .comparison-grid { grid-template-columns: 1fr; }
193
- .legend { grid-template-columns: 1fr; gap: 2rem; }
194
- .legend dl div { grid-template-columns: 110px 1fr; }
195
- footer { flex-direction: column; }
196
- }
197
-
198
- @media (prefers-reduced-motion: reduce) {
199
- html { scroll-behavior: auto; }
200
- *, *::before, *::after { animation-duration: .01ms !important; transition-duration: .01ms !important; }
201
- }
@@ -1,72 +0,0 @@
1
- {
2
- "schemaVersion": 1,
3
- "generatedAtUnix": 1783987200,
4
- "source": {
5
- "state": "verified_registry_projection",
6
- "entryCount": 2,
7
- "trust": "localhost_test_fixture",
8
- "message": "Synthetic browser fixture; never used by the production catalog."
9
- },
10
- "compositions": [
11
- {
12
- "id": "balanced-codex@1.0.0",
13
- "entryId": "balanced-codex",
14
- "entryVersion": "1.0.0",
15
- "status": "recommended",
16
- "recommended": true,
17
- "freshness": "current",
18
- "lifecycle": "published",
19
- "policy": {
20
- "id": "balanced",
21
- "version": "1.0.0",
22
- "usage": { "max_active_agents": 3, "max_parallel_writers": 1, "max_depth": 1, "metering": "trusted" }
23
- },
24
- "binding": { "id": "codex-openai", "version": "1.0.0", "host": "codex" },
25
- "compatibility": { "hosts": ["codex"], "minPlanrVersion": "1.3.0", "maxPlanrVersion": "1.9.0" },
26
- "enforcement": [
27
- { "dimension": "Policy limits", "state": "verified", "detail": "Planr validates count, time, concurrency, transition, and safety-stop limits before dispatch." },
28
- { "dimension": "Execution permissions", "state": "verified", "detail": "No commands, hooks, network/MCP grants, secret references, or overwrite permission." },
29
- { "dimension": "Model and effort", "state": "host_enforced", "detail": "Codex retains final concrete execution authority." },
30
- { "dimension": "Effective route evidence", "state": "verified", "detail": "7 of 7 evaluation runs carried verified effective-route evidence." }
31
- ],
32
- "evaluation": {
33
- "suiteId": "planr-preset-suite",
34
- "suiteVersion": "1.8.0",
35
- "evaluatedAtUnix": 1783987200,
36
- "reviewAtUnix": 1815523200,
37
- "metrics": { "average_quality_score_bps": 9600, "runs": 7, "oracle_passes": 7 }
38
- },
39
- "registry": { "manifestSha256": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "signer": "localhost-fixture" }
40
- },
41
- {
42
- "id": "low-usage-claude@1.0.0",
43
- "entryId": "low-usage-claude",
44
- "entryVersion": "1.0.0",
45
- "status": "recommended",
46
- "recommended": true,
47
- "freshness": "current",
48
- "lifecycle": "published",
49
- "policy": {
50
- "id": "low-usage",
51
- "version": "1.0.0",
52
- "usage": { "max_active_agents": 2, "max_parallel_writers": 1, "max_depth": 1, "metering": "trusted" }
53
- },
54
- "binding": { "id": "claude-native", "version": "1.0.0", "host": "claude-code" },
55
- "compatibility": { "hosts": ["claude-code"], "minPlanrVersion": "1.3.0", "maxPlanrVersion": "1.9.0" },
56
- "enforcement": [
57
- { "dimension": "Policy limits", "state": "verified", "detail": "Planr validates count, time, concurrency, transition, and safety-stop limits before dispatch." },
58
- { "dimension": "Execution permissions", "state": "verified", "detail": "No commands, hooks, network/MCP grants, secret references, or overwrite permission." },
59
- { "dimension": "Model and effort", "state": "host_enforced", "detail": "Claude Code retains final concrete execution authority." },
60
- { "dimension": "Effective route evidence", "state": "verified", "detail": "7 of 7 evaluation runs carried verified effective-route evidence." }
61
- ],
62
- "evaluation": {
63
- "suiteId": "planr-preset-suite",
64
- "suiteVersion": "1.8.0",
65
- "evaluatedAtUnix": 1783987200,
66
- "reviewAtUnix": 1815523200,
67
- "metrics": { "average_quality_score_bps": 9100, "runs": 7, "oracle_passes": 7 }
68
- },
69
- "registry": { "manifestSha256": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", "signer": "localhost-fixture" }
70
- }
71
- ]
72
- }