open-multi-agent-kit 0.78.1 → 0.78.2

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 (69) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/MATURITY.md +4 -0
  3. package/README.md +70 -1
  4. package/dist/cli/register-spec-agent-goal-commands.js +45 -0
  5. package/dist/cli/release-promotion-gate.d.ts +14 -0
  6. package/dist/cli/release-promotion-gate.js +71 -0
  7. package/dist/cli/v2/release-commands.d.ts +29 -0
  8. package/dist/cli/v2/release-commands.js +95 -0
  9. package/dist/commands/chat/native-root-loop.js +14 -1
  10. package/dist/commands/chat/slash/commands/session.js +19 -1
  11. package/dist/commands/goal-interview.d.ts +18 -0
  12. package/dist/commands/goal-interview.js +396 -0
  13. package/dist/contracts/interview.d.ts +106 -0
  14. package/dist/contracts/interview.js +9 -0
  15. package/dist/evidence/index.d.ts +4 -0
  16. package/dist/evidence/index.js +2 -0
  17. package/dist/evidence/proof-trust-cli.d.ts +8 -0
  18. package/dist/evidence/proof-trust-cli.js +27 -0
  19. package/dist/evidence/proof-trust.d.ts +14 -0
  20. package/dist/evidence/proof-trust.js +381 -0
  21. package/dist/evidence/regression-proof-matrix.d.ts +42 -0
  22. package/dist/evidence/regression-proof-matrix.js +72 -0
  23. package/dist/goal/intent-frame.d.ts +6 -0
  24. package/dist/goal/intent-frame.js +21 -9
  25. package/dist/goal/interview-assimilation.d.ts +13 -0
  26. package/dist/goal/interview-assimilation.js +383 -0
  27. package/dist/goal/interview-question-bank.d.ts +11 -0
  28. package/dist/goal/interview-question-bank.js +225 -0
  29. package/dist/goal/interview-scoring.d.ts +31 -0
  30. package/dist/goal/interview-scoring.js +187 -0
  31. package/dist/goal/interview-session.d.ts +25 -0
  32. package/dist/goal/interview-session.js +116 -0
  33. package/dist/input/input-envelope.d.ts +22 -0
  34. package/dist/input/input-envelope.js +1 -0
  35. package/dist/runtime/advanced-control-loop.d.ts +60 -0
  36. package/dist/runtime/advanced-control-loop.js +136 -0
  37. package/dist/runtime/agent-runtime.d.ts +10 -0
  38. package/dist/runtime/blast-radius.d.ts +10 -0
  39. package/dist/runtime/blast-radius.js +14 -0
  40. package/dist/runtime/contracts/evidence.d.ts +87 -0
  41. package/dist/runtime/contracts/evidence.js +7 -0
  42. package/dist/runtime/contracts/router-v2.d.ts +44 -0
  43. package/dist/runtime/contracts/router-v2.js +4 -0
  44. package/dist/runtime/contracts/weakness-remediation.d.ts +67 -0
  45. package/dist/runtime/contracts/weakness-remediation.js +36 -0
  46. package/dist/runtime/kimi-api-runtime.js +59 -1
  47. package/dist/runtime/proof-bundle-trust.d.ts +74 -0
  48. package/dist/runtime/proof-bundle-trust.js +100 -0
  49. package/dist/runtime/provider-maturity-gate.d.ts +41 -0
  50. package/dist/runtime/provider-maturity-gate.js +101 -0
  51. package/dist/runtime/public-surface.d.ts +93 -0
  52. package/dist/runtime/public-surface.js +146 -0
  53. package/dist/runtime/router-v2-scoring.d.ts +11 -0
  54. package/dist/runtime/router-v2-scoring.js +151 -0
  55. package/dist/runtime/weakness-remediation-index.d.ts +27 -0
  56. package/dist/runtime/weakness-remediation-index.js +37 -0
  57. package/dist/schema/proof-bundle.schema.d.ts +26 -26
  58. package/dist/util/clipboard-image.d.ts +49 -0
  59. package/dist/util/clipboard-image.js +263 -0
  60. package/docs/2026-06-09/critical-issues.md +20 -0
  61. package/docs/2026-06-09/improvements.md +14 -0
  62. package/docs/2026-06-09/init-checklist.md +25 -0
  63. package/docs/2026-06-09/plan.md +20 -0
  64. package/docs/github-organic-promotion.md +127 -0
  65. package/docs/native-root-runtime-algorithms.md +301 -0
  66. package/package.json +4 -3
  67. package/readmeasset/ASSET_INDEX.md +1 -0
  68. package/templates/skills/agents/omk-agent-reach-websearch/SKILL.md +55 -0
  69. package/templates/skills/kimi/omk-agent-reach-websearch/SKILL.md +55 -0
@@ -0,0 +1,263 @@
1
+ /**
2
+ * Cross-platform clipboard image reader.
3
+ *
4
+ * Wraps the platform-specific clipboard reading from screenshot-store patterns
5
+ * into a reusable utility for the chat REPL, goal commands, and any input
6
+ * surface that needs Ctrl+V / paste image support.
7
+ *
8
+ * Platforms:
9
+ * - macOS: `pngpaste -` (brew) or `osascript` with TIFF→PNG conversion
10
+ * - Linux: `xclip -selection clipboard -target image/png`
11
+ * - Windows: PowerShell System.Windows.Forms.Clipboard
12
+ *
13
+ * Output: PNG Buffer + saved file path under .omk/screenshots/
14
+ */
15
+ import { execFileSync } from "node:child_process";
16
+ import { mkdirSync, writeFileSync, readFileSync, existsSync, unlinkSync } from "node:fs";
17
+ import { createHash } from "node:crypto";
18
+ import { join, relative } from "node:path";
19
+ export const SCREENSHOT_DIR = ".omk/screenshots";
20
+ export const MAX_IMAGE_BYTES = 20 * 1024 * 1024;
21
+ const CLIPBOARD_TIMEOUT_MS = 5000;
22
+ const CLIPBOARD_MAX_BUFFER = MAX_IMAGE_BYTES * 2;
23
+ const IMAGE_MAGIC = [
24
+ ["png", [0x89, 0x50, 0x4e, 0x47]],
25
+ ["jpg", [0xff, 0xd8, 0xff]],
26
+ ["webp", [0x52, 0x49, 0x46, 0x46]],
27
+ ["gif", [0x47, 0x49, 0x46, 0x38]],
28
+ ];
29
+ export function detectImageExt(buf) {
30
+ for (const [ext, magic] of IMAGE_MAGIC) {
31
+ if (buf.length >= magic.length && magic.every((b, i) => buf[i] === b)) {
32
+ return ext;
33
+ }
34
+ }
35
+ return null;
36
+ }
37
+ function mimeTypeForExt(ext) {
38
+ switch (ext) {
39
+ case "png": return "image/png";
40
+ case "jpg": return "image/jpeg";
41
+ case "webp": return "image/webp";
42
+ case "gif": return "image/gif";
43
+ default: return "application/octet-stream";
44
+ }
45
+ }
46
+ export function toDataUri(base64, ext) {
47
+ return `data:${mimeTypeForExt(ext)};base64,${base64}`;
48
+ }
49
+ function generatePath(projectRoot, ext) {
50
+ const dateDir = new Date().toISOString().slice(0, 10);
51
+ const timestamp = new Date().toISOString().replace(/[:.]/g, "").slice(0, 15);
52
+ const hash = createHash("sha256").update(`${Date.now()}-${Math.random()}`).digest("hex").slice(0, 8);
53
+ const fileName = `screenshot-${timestamp}-${hash}.${ext}`;
54
+ const dir = join(projectRoot, SCREENSHOT_DIR, dateDir);
55
+ mkdirSync(dir, { recursive: true });
56
+ const fullPath = join(dir, fileName);
57
+ const relativePath = relative(projectRoot, fullPath).replace(/\\/g, "/");
58
+ return { fullPath, relativePath };
59
+ }
60
+ // ── Platform readers ────────────────────────────────────────────────────────
61
+ function readMacClipboard() {
62
+ // Try pngpaste first (faster, more reliable)
63
+ try {
64
+ const out = execFileSync("pngpaste", ["-"], {
65
+ timeout: CLIPBOARD_TIMEOUT_MS,
66
+ maxBuffer: CLIPBOARD_MAX_BUFFER,
67
+ stdio: ["pipe", "pipe", "pipe"],
68
+ });
69
+ if (out.length > 0)
70
+ return out;
71
+ }
72
+ catch {
73
+ // pngpaste not installed or clipboard empty
74
+ }
75
+ // Fallback: osascript (handles TIFF → PNG conversion)
76
+ try {
77
+ const script = `
78
+ set theFile to (POSIX path of (path to temporary items) & "omk-clip-" & (random number from 100000 to 999999) & ".png")
79
+ set img to the clipboard as «class PNGf»
80
+ set fRef to open for access POSIX file theFile with write permission
81
+ write img to fRef
82
+ close access fRef
83
+ return theFile
84
+ `;
85
+ const filePath = execFileSync("osascript", ["-e", script], {
86
+ timeout: CLIPBOARD_TIMEOUT_MS,
87
+ encoding: "utf-8",
88
+ }).trim();
89
+ if (filePath) {
90
+ const buf = readFileSync(filePath);
91
+ try {
92
+ unlinkSync(filePath);
93
+ }
94
+ catch { /* ignore */ }
95
+ if (buf.length > 0)
96
+ return buf;
97
+ }
98
+ }
99
+ catch {
100
+ // osascript failed
101
+ }
102
+ return null;
103
+ }
104
+ function readLinuxClipboard() {
105
+ try {
106
+ const out = execFileSync("xclip", ["-selection", "clipboard", "-target", "image/png", "-o"], {
107
+ timeout: CLIPBOARD_TIMEOUT_MS,
108
+ maxBuffer: CLIPBOARD_MAX_BUFFER,
109
+ stdio: ["pipe", "pipe", "pipe"],
110
+ });
111
+ if (out.length > 0)
112
+ return out;
113
+ }
114
+ catch {
115
+ // xclip not available
116
+ }
117
+ // Fallback: wl-paste (Wayland)
118
+ try {
119
+ const out = execFileSync("wl-paste", ["--type", "image/png"], {
120
+ timeout: CLIPBOARD_TIMEOUT_MS,
121
+ maxBuffer: CLIPBOARD_MAX_BUFFER,
122
+ stdio: ["pipe", "pipe", "pipe"],
123
+ });
124
+ if (out.length > 0)
125
+ return out;
126
+ }
127
+ catch {
128
+ // wl-paste not available
129
+ }
130
+ return null;
131
+ }
132
+ function readWindowsClipboard() {
133
+ const script = `
134
+ $ErrorActionPreference = 'SilentlyContinue'
135
+ Add-Type -AssemblyName System.Windows.Forms
136
+ Add-Type -AssemblyName System.Drawing
137
+
138
+ function Emit-Bytes([byte[]]$Bytes) {
139
+ if ($null -eq $Bytes -or $Bytes.Length -eq 0) { exit 1 }
140
+ [Console]::OpenStandardOutput().Write($Bytes, 0, $Bytes.Length)
141
+ exit 0
142
+ }
143
+
144
+ # Try PNG format first
145
+ $data = [System.Windows.Forms.Clipboard]::GetDataObject()
146
+ if ($null -ne $data) {
147
+ foreach ($format in @('PNG', 'image/png')) {
148
+ if ($data.GetDataPresent($format)) {
149
+ $raw = $data.GetData($format)
150
+ if ($raw -is [System.IO.MemoryStream]) { Emit-Bytes $raw.ToArray() }
151
+ if ($raw -is [byte[]]) { Emit-Bytes $raw }
152
+ }
153
+ }
154
+ # File drop (screenshot tool saves to file then copies path)
155
+ if ($data.GetDataPresent([System.Windows.Forms.DataFormats]::FileDrop)) {
156
+ $files = [string[]]$data.GetData([System.Windows.Forms.DataFormats]::FileDrop)
157
+ foreach ($file in $files) {
158
+ if ($file -match '[.](png|jpg|jpeg|webp|gif)$' -and [System.IO.File]::Exists($file)) {
159
+ Emit-Bytes ([System.IO.File]::ReadAllBytes($file))
160
+ }
161
+ }
162
+ }
163
+ }
164
+
165
+ # Fallback: GetImage
166
+ if ([System.Windows.Forms.Clipboard]::ContainsImage()) {
167
+ $img = [System.Windows.Forms.Clipboard]::GetImage()
168
+ if ($null -ne $img) {
169
+ $ms = New-Object System.IO.MemoryStream
170
+ try {
171
+ $img.Save($ms, [System.Drawing.Imaging.ImageFormat]::Png)
172
+ Emit-Bytes $ms.ToArray()
173
+ } finally {
174
+ $ms.Dispose()
175
+ $img.Dispose()
176
+ }
177
+ }
178
+ }
179
+ exit 1
180
+ `;
181
+ try {
182
+ const out = execFileSync("powershell.exe", ["-NoProfile", "-Command", "-"], {
183
+ input: script,
184
+ timeout: CLIPBOARD_TIMEOUT_MS,
185
+ maxBuffer: CLIPBOARD_MAX_BUFFER,
186
+ windowsHide: true,
187
+ stdio: ["pipe", "pipe", "pipe"],
188
+ });
189
+ if (out.length > 0)
190
+ return out;
191
+ }
192
+ catch {
193
+ // PowerShell failed
194
+ }
195
+ return null;
196
+ }
197
+ /**
198
+ * Read an image from the system clipboard. Returns null if clipboard is empty
199
+ * or contains no image. Platform-specific: macOS (pngpaste/osascript), Linux
200
+ * (xclip/wl-paste), Windows (PowerShell).
201
+ */
202
+ export function readClipboardImage(platform = process.platform) {
203
+ switch (platform) {
204
+ case "darwin": return readMacClipboard();
205
+ case "linux": return readLinuxClipboard();
206
+ case "win32": return readWindowsClipboard();
207
+ default: return null;
208
+ }
209
+ }
210
+ // ── High-level API ──────────────────────────────────────────────────────────
211
+ /**
212
+ * Read clipboard image, validate, save to .omk/screenshots/, and return
213
+ * both the file path and base64 data URI for wire protocol use.
214
+ */
215
+ export function pasteClipboardImage(projectRoot) {
216
+ const buf = readClipboardImage();
217
+ if (!buf || buf.length === 0) {
218
+ return { ok: false, error: "No image found in clipboard" };
219
+ }
220
+ if (buf.length > MAX_IMAGE_BYTES) {
221
+ return { ok: false, error: `Clipboard image exceeds ${MAX_IMAGE_BYTES / (1024 * 1024)} MB` };
222
+ }
223
+ const ext = detectImageExt(buf);
224
+ if (!ext) {
225
+ return { ok: false, error: "Clipboard content is not a recognized image format (PNG/JPG/WebP/GIF)" };
226
+ }
227
+ const { fullPath, relativePath } = generatePath(projectRoot, ext);
228
+ writeFileSync(fullPath, buf);
229
+ const base64 = buf.toString("base64");
230
+ return {
231
+ ok: true,
232
+ path: fullPath,
233
+ relativePath: `./${relativePath}`,
234
+ dataUri: toDataUri(base64, ext),
235
+ base64,
236
+ ext,
237
+ };
238
+ }
239
+ /**
240
+ * Read an image file from disk, validate, and return base64 data URI.
241
+ * Used for --image <file> flag support.
242
+ */
243
+ export function readImageFile(filePath) {
244
+ if (!existsSync(filePath)) {
245
+ return { ok: false, error: `File not found: ${filePath}` };
246
+ }
247
+ const buf = readFileSync(filePath);
248
+ if (buf.length > MAX_IMAGE_BYTES) {
249
+ return { ok: false, error: `File exceeds ${MAX_IMAGE_BYTES / (1024 * 1024)} MB` };
250
+ }
251
+ const ext = detectImageExt(buf);
252
+ if (!ext) {
253
+ return { ok: false, error: "File is not a recognized image format (PNG/JPG/WebP/GIF)" };
254
+ }
255
+ const base64 = buf.toString("base64");
256
+ return {
257
+ ok: true,
258
+ path: filePath,
259
+ dataUri: toDataUri(base64, ext),
260
+ base64,
261
+ ext,
262
+ };
263
+ }
@@ -0,0 +1,20 @@
1
+ # 2026-06-09 Critical Issues
2
+
3
+ ## Critical Init Status
4
+ - No critical init artifacts were missing when this daily file was generated.
5
+ ### Missing critical artifacts
6
+ - None detected.
7
+
8
+
9
+ ## Critical Artifacts Present
10
+ - ✅ `AGENTS.md` — top-level operating contract
11
+ - ✅ `.kimi/AGENTS.md` — Kimi-specific operating rules
12
+ - ✅ `.omk/config.toml` — OMK project runtime settings
13
+ - ✅ `.omk/agents/root.yaml` — root coordinator agent
14
+ - ✅ `.kimi/mcp.json` — Kimi project MCP registry
15
+ - ✅ `.omk/hooks/pre-shell-guard.sh` — destructive shell guard
16
+ - ✅ `.omk/hooks/protect-secrets.sh` — secret write guard
17
+ - ✅ `.omk/memory/graph-state.json` — local ontology graph database
18
+
19
+ ## Escalation Rule
20
+ - Treat missing shell/secret guards, root agent config, MCP registry, or ontology graph as critical until restored.
@@ -0,0 +1,14 @@
1
+ # 2026-06-09 Improvements
2
+
3
+ ## Current Improvement Backlog
4
+ ### Optional init/support artifacts to add or refresh
5
+ - None detected.
6
+
7
+ ### Critical init artifacts currently blocking reliable chat startup
8
+ - None detected.
9
+
10
+
11
+ ## Suggested Focus
12
+ - Keep `omk chat` startup idempotent and non-destructive.
13
+ - Prefer local graph memory for default ontology state.
14
+ - Keep generated daily docs small, dated, and safe to edit by hand.
@@ -0,0 +1,25 @@
1
+ # 2026-06-09 Required Init Checklist
2
+
3
+ **Run ID:** chat-2026-06-09T00-01-07-440Z-28177
4
+ **Ontology graph:** `.omk/memory/graph-state.json`
5
+
6
+ ## Required Artifacts
7
+ - ✅ `AGENTS.md` — critical; top-level operating contract
8
+ - ✅ `.kimi/AGENTS.md` — critical; Kimi-specific operating rules
9
+ - ✅ `DESIGN.md` — support; design/brand source of truth
10
+ - ✅ `.omk/config.toml` — critical; OMK project runtime settings
11
+ - ✅ `.omk/agents/root.yaml` — critical; root coordinator agent
12
+ - ✅ `.kimi/mcp.json` — critical; Kimi project MCP registry
13
+ - ✅ `.omk/mcp.json` — support; legacy OMK MCP fallback
14
+ - ✅ `.omk/lsp.json` — support; bundled TypeScript/Python LSP config
15
+ - ✅ `.omk/hooks/pre-shell-guard.sh` — critical; destructive shell guard
16
+ - ✅ `.omk/hooks/protect-secrets.sh` — critical; secret write guard
17
+ - ✅ `.omk/memory/graph-state.json` — critical; local ontology graph database
18
+ - ✅ `.kimi/skills` — support; Kimi skill directory
19
+ - ✅ `.agents/skills` — support; portable skill directory
20
+
21
+ ## Recovery Command
22
+ ```bash
23
+ omk init
24
+ omk doctor
25
+ ```
@@ -0,0 +1,20 @@
1
+ # 2026-06-09 OMK Chat Plan
2
+
3
+ **Run ID:** chat-2026-06-09T00-01-07-440Z-28177
4
+ **Generated by:** omk chat bootstrap
5
+
6
+ ## Purpose
7
+ - Start every chat with a dated workspace for planning, issue triage, and verification evidence.
8
+ - Keep ontology-backed memory available before the root coordinator starts.
9
+ - Make required init state visible without overwriting user-authored docs.
10
+
11
+ ## Today Plan
12
+ 1. Review `init-checklist.md` and resolve missing critical init artifacts first.
13
+ 2. Use `improvements.md` as the active improvement backlog.
14
+ 3. Use `critical-issues.md` for blocking defects, safety risks, and verification gaps.
15
+ 4. Record command evidence before claiming work is complete.
16
+
17
+ ## Stop Condition
18
+ - Critical init artifacts are present.
19
+ - Ontology graph exists at `.omk/memory/graph-state.json`.
20
+ - Any new code/docs changes have explicit verification evidence.
@@ -0,0 +1,127 @@
1
+ # GitHub organic promotion checklist
2
+
3
+ OMK's strongest GitHub search position is:
4
+
5
+ > Provider-neutral multi-agent control plane for coding agents: route runtimes, scope MCP tools, run DAG workers, verify evidence, and replay agent runs.
6
+
7
+ ## Repository About
8
+
9
+ Recommended GitHub About description:
10
+
11
+ ```txt
12
+ Provider-neutral multi-agent control plane for coding agents. Route runtimes, scope MCP tools, run DAG workers, verify evidence, and replay agent runs from the omk CLI.
13
+ ```
14
+
15
+ Apply after maintainer confirmation:
16
+
17
+ ```bash
18
+ gh repo edit dmae97/open-multi-agent-kit \
19
+ --description "Provider-neutral multi-agent control plane for coding agents. Route runtimes, scope MCP tools, run DAG workers, verify evidence, and replay agent runs from the omk CLI."
20
+ ```
21
+
22
+ ## GitHub Topics
23
+
24
+ Use all 20 topics:
25
+
26
+ ```txt
27
+ ai-agent
28
+ ai-agents
29
+ llm
30
+ coding-agent
31
+ ai-coding
32
+ agentic-coding
33
+ multi-agent
34
+ multi-agent-orchestration
35
+ agent-orchestration
36
+ agent-runtime
37
+ agent-control-plane
38
+ developer-tools
39
+ ai-devtools
40
+ cli
41
+ typescript
42
+ nodejs
43
+ mcp
44
+ model-context-protocol
45
+ workflow-automation
46
+ provider-neutral
47
+ ```
48
+
49
+ Apply after maintainer confirmation:
50
+
51
+ ```bash
52
+ gh repo edit dmae97/open-multi-agent-kit \
53
+ --add-topic ai-agent \
54
+ --add-topic ai-agents \
55
+ --add-topic llm \
56
+ --add-topic coding-agent \
57
+ --add-topic ai-coding \
58
+ --add-topic agentic-coding \
59
+ --add-topic multi-agent \
60
+ --add-topic multi-agent-orchestration \
61
+ --add-topic agent-orchestration \
62
+ --add-topic agent-runtime \
63
+ --add-topic agent-control-plane \
64
+ --add-topic developer-tools \
65
+ --add-topic ai-devtools \
66
+ --add-topic cli \
67
+ --add-topic typescript \
68
+ --add-topic nodejs \
69
+ --add-topic mcp \
70
+ --add-topic model-context-protocol \
71
+ --add-topic workflow-automation \
72
+ --add-topic provider-neutral
73
+ ```
74
+
75
+ ## Social preview
76
+
77
+ Upload this generated image in GitHub repository settings:
78
+
79
+ ```txt
80
+ readmeasset/social-preview.png
81
+ ```
82
+
83
+ It uses the message:
84
+
85
+ ```txt
86
+ OMK
87
+ Provider-Neutral Multi-Agent Control Plane
88
+ Route. Verify. Replay.
89
+ ```
90
+
91
+ ## Awesome-list PR entries
92
+
93
+ ### bradAGI/awesome-cli-coding-agents
94
+
95
+ Preferred section: `Harnesses & orchestration`.
96
+
97
+ ```md
98
+ - **[OMK](https://github.com/dmae97/open-multi-agent-kit)** `⭐ <current>` — Provider-neutral CLI control plane for coding agents: routes runtimes, scopes MCP, runs DAG workers, and verifies evidence before completion. MIT.
99
+ ```
100
+
101
+ ### e2b-dev/awesome-ai-sdks
102
+
103
+ ```md
104
+ ## [OMK](https://github.com/dmae97/open-multi-agent-kit)
105
+
106
+ OMK is a provider-neutral multi-agent control plane for coding workflows. It routes agent runtimes, scopes MCP tools, runs DAG-based workers, verifies evidence, and preserves replayable run artifacts.
107
+
108
+ ### Links
109
+
110
+ - [GitHub](https://github.com/dmae97/open-multi-agent-kit)
111
+ - [npm](https://www.npmjs.com/package/open-multi-agent-kit)
112
+ ```
113
+
114
+ ### punkpeye/awesome-mcp-devtools
115
+
116
+ Preferred section: `Frameworks` or `Development Tools`.
117
+
118
+ ```md
119
+ - [OMK](https://github.com/dmae97/open-multi-agent-kit) - TypeScript CLI control plane for coding agents with scoped MCP injection, provider routing, evidence gates, and replayable run telemetry.
120
+ ```
121
+
122
+ ## Measurement plan
123
+
124
+ - Topics applied + 7 days: inspect GitHub topic/search traffic.
125
+ - First awesome PR merged + 7 days: check `Referring sites` for that awesome repo.
126
+ - 2 weeks: compare visitors, clones, npm downloads, and popular README content.
127
+ - 4 weeks: review visitor-to-star conversion; 1-3% is acceptable for early OSS.