knitbrain 0.1.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 (108) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +142 -0
  3. package/dist/ccr/store.d.ts +57 -0
  4. package/dist/ccr/store.js +195 -0
  5. package/dist/ccr/store.js.map +1 -0
  6. package/dist/dashboard.d.ts +23 -0
  7. package/dist/dashboard.js +125 -0
  8. package/dist/dashboard.js.map +1 -0
  9. package/dist/engine/agents.d.ts +36 -0
  10. package/dist/engine/agents.js +88 -0
  11. package/dist/engine/agents.js.map +1 -0
  12. package/dist/engine/calibration.d.ts +29 -0
  13. package/dist/engine/calibration.js +72 -0
  14. package/dist/engine/calibration.js.map +1 -0
  15. package/dist/engine/feedback.d.ts +30 -0
  16. package/dist/engine/feedback.js +82 -0
  17. package/dist/engine/feedback.js.map +1 -0
  18. package/dist/engine/knowledge.d.ts +22 -0
  19. package/dist/engine/knowledge.js +154 -0
  20. package/dist/engine/knowledge.js.map +1 -0
  21. package/dist/engine/memory.d.ts +35 -0
  22. package/dist/engine/memory.js +93 -0
  23. package/dist/engine/memory.js.map +1 -0
  24. package/dist/engine/meter.d.ts +40 -0
  25. package/dist/engine/meter.js +61 -0
  26. package/dist/engine/meter.js.map +1 -0
  27. package/dist/engine/skills.d.ts +33 -0
  28. package/dist/engine/skills.js +97 -0
  29. package/dist/engine/skills.js.map +1 -0
  30. package/dist/engine/teams.d.ts +28 -0
  31. package/dist/engine/teams.js +58 -0
  32. package/dist/engine/teams.js.map +1 -0
  33. package/dist/engine/workflow.d.ts +18 -0
  34. package/dist/engine/workflow.js +40 -0
  35. package/dist/engine/workflow.js.map +1 -0
  36. package/dist/hooks/index.d.ts +2 -0
  37. package/dist/hooks/index.js +47 -0
  38. package/dist/hooks/index.js.map +1 -0
  39. package/dist/hooks/pretooluse.d.ts +23 -0
  40. package/dist/hooks/pretooluse.js +38 -0
  41. package/dist/hooks/pretooluse.js.map +1 -0
  42. package/dist/hub/client.d.ts +26 -0
  43. package/dist/hub/client.js +64 -0
  44. package/dist/hub/client.js.map +1 -0
  45. package/dist/hub/server.d.ts +23 -0
  46. package/dist/hub/server.js +85 -0
  47. package/dist/hub/server.js.map +1 -0
  48. package/dist/index.d.ts +2 -0
  49. package/dist/index.js +82 -0
  50. package/dist/index.js.map +1 -0
  51. package/dist/mcp/tools.d.ts +40 -0
  52. package/dist/mcp/tools.js +461 -0
  53. package/dist/mcp/tools.js.map +1 -0
  54. package/dist/measure.d.ts +27 -0
  55. package/dist/measure.js +25 -0
  56. package/dist/measure.js.map +1 -0
  57. package/dist/optimizer/ast.d.ts +19 -0
  58. package/dist/optimizer/ast.js +189 -0
  59. package/dist/optimizer/ast.js.map +1 -0
  60. package/dist/optimizer/code.d.ts +10 -0
  61. package/dist/optimizer/code.js +231 -0
  62. package/dist/optimizer/code.js.map +1 -0
  63. package/dist/optimizer/json.d.ts +9 -0
  64. package/dist/optimizer/json.js +68 -0
  65. package/dist/optimizer/json.js.map +1 -0
  66. package/dist/optimizer/router.d.ts +39 -0
  67. package/dist/optimizer/router.js +137 -0
  68. package/dist/optimizer/router.js.map +1 -0
  69. package/dist/optimizer/text.d.ts +21 -0
  70. package/dist/optimizer/text.js +88 -0
  71. package/dist/optimizer/text.js.map +1 -0
  72. package/dist/optimizer/types.d.ts +13 -0
  73. package/dist/optimizer/types.js +2 -0
  74. package/dist/optimizer/types.js.map +1 -0
  75. package/dist/paths.d.ts +20 -0
  76. package/dist/paths.js +44 -0
  77. package/dist/paths.js.map +1 -0
  78. package/dist/platforms.d.ts +51 -0
  79. package/dist/platforms.js +157 -0
  80. package/dist/platforms.js.map +1 -0
  81. package/dist/profile.d.ts +3 -0
  82. package/dist/profile.js +169 -0
  83. package/dist/profile.js.map +1 -0
  84. package/dist/proxy/cache-aligner.d.ts +9 -0
  85. package/dist/proxy/cache-aligner.js +15 -0
  86. package/dist/proxy/cache-aligner.js.map +1 -0
  87. package/dist/proxy/index.d.ts +2 -0
  88. package/dist/proxy/index.js +37 -0
  89. package/dist/proxy/index.js.map +1 -0
  90. package/dist/proxy/optimize-request.d.ts +51 -0
  91. package/dist/proxy/optimize-request.js +111 -0
  92. package/dist/proxy/optimize-request.js.map +1 -0
  93. package/dist/proxy/server.d.ts +31 -0
  94. package/dist/proxy/server.js +104 -0
  95. package/dist/proxy/server.js.map +1 -0
  96. package/dist/server.d.ts +19 -0
  97. package/dist/server.js +54 -0
  98. package/dist/server.js.map +1 -0
  99. package/dist/setup.d.ts +28 -0
  100. package/dist/setup.js +96 -0
  101. package/dist/setup.js.map +1 -0
  102. package/dist/tokenizer.d.ts +23 -0
  103. package/dist/tokenizer.js +25 -0
  104. package/dist/tokenizer.js.map +1 -0
  105. package/dist/version.d.ts +3 -0
  106. package/dist/version.js +4 -0
  107. package/dist/version.js.map +1 -0
  108. package/package.json +66 -0
package/dist/server.js ADDED
@@ -0,0 +1,54 @@
1
+ import { Server } from "@modelcontextprotocol/sdk/server/index.js";
2
+ import { CallToolRequestSchema, ListToolsRequestSchema, } from "@modelcontextprotocol/sdk/types.js";
3
+ import { createFileCCRStore } from "./ccr/store.js";
4
+ import { createMemory } from "./engine/memory.js";
5
+ import { createKnowledge } from "./engine/knowledge.js";
6
+ import { createFeedback } from "./engine/feedback.js";
7
+ import { createTeamBoard } from "./engine/teams.js";
8
+ import { createMeter } from "./engine/meter.js";
9
+ import { createSkillsStore } from "./engine/skills.js";
10
+ import { createCalibration } from "./engine/calibration.js";
11
+ import { calibrationRoot, ccrRoot, feedbackRoot, knowledgeRoot, memoryRoot, meterRoot, skillsRoot, teamRoot } from "./paths.js";
12
+ import { TOOLS, dispatch } from "./mcp/tools.js";
13
+ import { SERVER_NAME, VERSION } from "./version.js";
14
+ export { VERSION, SERVER_NAME } from "./version.js";
15
+ /**
16
+ * Build the Knit Brain MCP server. Every tool result flows through the ONE
17
+ * dispatch chokepoint, where data outputs are compressed (original preserved
18
+ * in CCR) and governance/verbatim outputs pass through untouched.
19
+ *
20
+ * @param ccr injectable store (tests pass a temp store; default is the
21
+ * local-first store under ~/.knitbrain/ccr).
22
+ */
23
+ export function buildServer(ccr = createFileCCRStore(ccrRoot()), memory = createMemory(memoryRoot()), knowledge = createKnowledge(process.cwd(), knowledgeRoot()), feedback = createFeedback(feedbackRoot()), team = createTeamBoard(teamRoot(), ccr), meter = createMeter(meterRoot()), skills = createSkillsStore(skillsRoot()), calibration = createCalibration(calibrationRoot())) {
24
+ const server = new Server({ name: SERVER_NAME, version: VERSION }, { capabilities: { tools: {} } });
25
+ const ctx = { ccr, memory, knowledge, feedback, team, meter, skills, calibration };
26
+ server.setRequestHandler(ListToolsRequestSchema, () => ({
27
+ tools: TOOLS.map((t) => ({
28
+ name: t.name,
29
+ description: t.description,
30
+ inputSchema: t.inputSchema,
31
+ })),
32
+ }));
33
+ server.setRequestHandler(CallToolRequestSchema, (req) => {
34
+ const tool = TOOLS.find((t) => t.name === req.params.name);
35
+ if (!tool) {
36
+ return {
37
+ content: [{ type: "text", text: `Unknown tool: ${req.params.name}` }],
38
+ isError: true,
39
+ };
40
+ }
41
+ try {
42
+ const text = dispatch(tool, req.params.arguments ?? {}, ctx);
43
+ return { content: [{ type: "text", text }] };
44
+ }
45
+ catch (err) {
46
+ return {
47
+ content: [{ type: "text", text: `Error: ${err.message}` }],
48
+ isError: true,
49
+ };
50
+ }
51
+ });
52
+ return server;
53
+ }
54
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ export type Platform = "claude-code" | "cursor" | "codex" | "vscode" | "unknown";
2
+ export interface DetectInputs {
3
+ env: NodeJS.ProcessEnv;
4
+ exists: (path: string) => boolean;
5
+ home: string;
6
+ }
7
+ /** Detect which coding platform(s) are present (pure — inputs injected). */
8
+ export declare function detectPlatforms(inp: DetectInputs): Platform[];
9
+ export interface SetupConfig {
10
+ mcpServers: Record<string, {
11
+ command: string;
12
+ }>;
13
+ proxyEnv: Record<string, string>;
14
+ proxyPort: number;
15
+ }
16
+ /** The config knitbrain wires up: an MCP server entry + the proxy base URLs. */
17
+ export declare function generateConfig(opts?: {
18
+ proxyPort?: number;
19
+ }): SetupConfig;
20
+ /** Merge knitbrain's MCP server into a project-local .mcp.json (safe, non-clobbering). */
21
+ export declare function mergeMcpJson(existing: string | null, cfg: SetupConfig): string;
22
+ /**
23
+ * CLI: detect platforms and emit each one's NATIVE artifacts (adapter matrix):
24
+ * Claude Code → .mcp.json + slash commands + rules; Cursor → .cursor/mcp.json
25
+ * + rules; VS Code/Copilot → .vscode/mcp.json + instructions; Codex → config
26
+ * snippet (its config is global — we never clobber it). Unknown → .mcp.json.
27
+ */
28
+ export declare function runSetup(cwd?: string): number;
package/dist/setup.js ADDED
@@ -0,0 +1,96 @@
1
+ import { existsSync } from "node:fs";
2
+ import { homedir } from "node:os";
3
+ import { join } from "node:path";
4
+ import { applyArtifacts, claudeArtifacts, codexSnippet, cursorArtifacts, vscodeArtifacts } from "./platforms.js";
5
+ /** Detect which coding platform(s) are present (pure — inputs injected). */
6
+ export function detectPlatforms(inp) {
7
+ const found = [];
8
+ if (inp.env["CLAUDECODE"] ||
9
+ inp.env["CLAUDE_CODE"] ||
10
+ inp.exists(join(inp.home, ".claude.json")) ||
11
+ inp.exists(join(inp.home, ".claude"))) {
12
+ found.push("claude-code");
13
+ }
14
+ if (inp.exists(join(inp.home, ".cursor")))
15
+ found.push("cursor");
16
+ if (inp.exists(join(inp.home, ".codex")))
17
+ found.push("codex");
18
+ if (inp.exists(join(inp.home, ".vscode")) || inp.env["TERM_PROGRAM"] === "vscode") {
19
+ found.push("vscode");
20
+ }
21
+ return found.length > 0 ? found : ["unknown"];
22
+ }
23
+ /** The config knitbrain wires up: an MCP server entry + the proxy base URLs. */
24
+ export function generateConfig(opts = {}) {
25
+ const port = opts.proxyPort ?? 8788;
26
+ return {
27
+ mcpServers: { knitbrain: { command: "knitbrain" } },
28
+ proxyEnv: {
29
+ ANTHROPIC_BASE_URL: `http://127.0.0.1:${port}`,
30
+ OPENAI_BASE_URL: `http://127.0.0.1:${port}/v1`,
31
+ },
32
+ proxyPort: port,
33
+ };
34
+ }
35
+ /** Merge knitbrain's MCP server into a project-local .mcp.json (safe, non-clobbering). */
36
+ export function mergeMcpJson(existing, cfg) {
37
+ let parsed = {};
38
+ if (existing) {
39
+ try {
40
+ parsed = JSON.parse(existing);
41
+ }
42
+ catch {
43
+ parsed = {};
44
+ }
45
+ }
46
+ const mcpServers = { ...(parsed.mcpServers ?? {}), ...cfg.mcpServers };
47
+ return JSON.stringify({ ...parsed, mcpServers }, null, 2) + "\n";
48
+ }
49
+ /**
50
+ * CLI: detect platforms and emit each one's NATIVE artifacts (adapter matrix):
51
+ * Claude Code → .mcp.json + slash commands + rules; Cursor → .cursor/mcp.json
52
+ * + rules; VS Code/Copilot → .vscode/mcp.json + instructions; Codex → config
53
+ * snippet (its config is global — we never clobber it). Unknown → .mcp.json.
54
+ */
55
+ export function runSetup(cwd = process.cwd()) {
56
+ const platforms = detectPlatforms({ env: process.env, exists: existsSync, home: homedir() });
57
+ const cfg = generateConfig();
58
+ console.log("knitbrain setup");
59
+ console.log(` detected platform(s): ${platforms.join(", ")}`);
60
+ const artifacts = [];
61
+ if (platforms.includes("claude-code") || platforms.includes("unknown")) {
62
+ artifacts.push(...claudeArtifacts(cfg));
63
+ }
64
+ if (platforms.includes("cursor"))
65
+ artifacts.push(...cursorArtifacts());
66
+ if (platforms.includes("vscode"))
67
+ artifacts.push(...vscodeArtifacts());
68
+ for (const path of applyArtifacts(cwd, artifacts, cfg))
69
+ console.log(` ✓ wrote ${path}`);
70
+ if (platforms.includes("codex")) {
71
+ console.log(" Codex CLI detected — its MCP config is global; add this yourself:");
72
+ for (const line of codexSnippet(cfg).split("\n"))
73
+ console.log(` ${line}`);
74
+ }
75
+ // Billing-mode detection: an API key in the environment means API /
76
+ // pay-as-you-go traffic that CAN be proxied; no key usually means a
77
+ // subscription (Pro/Max) OAuth session that cannot — MCP-side optimization
78
+ // carries those users (tool outputs are the bulk of context burn).
79
+ const hasKey = Boolean(process.env["ANTHROPIC_API_KEY"] || process.env["OPENAI_API_KEY"]);
80
+ console.log("");
81
+ if (hasKey) {
82
+ console.log(" API key detected (API / pay-as-you-go) — BOTH optimization doors apply.");
83
+ console.log(" Route LLM requests through the optimizer proxy:");
84
+ console.log(" knitbrain-proxy");
85
+ for (const [k, v] of Object.entries(cfg.proxyEnv))
86
+ console.log(` export ${k}=${v}`);
87
+ }
88
+ else {
89
+ console.log(" No API key in env — likely a subscription plan (Pro/Max/OAuth).");
90
+ console.log(" The proxy doesn't apply to OAuth traffic; MCP-side optimization is active");
91
+ console.log(" (tool outputs, memory, meter, skills — the bulk of context burn).");
92
+ console.log(" If you DO use an API key, export it and re-run setup for proxy wiring.");
93
+ }
94
+ return 0;
95
+ }
96
+ //# sourceMappingURL=setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.js","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Token counting interface — deliberately tiny and swappable.
3
+ *
4
+ * The active implementation uses `gpt-tokenizer` with the `o200k_base`
5
+ * encoding (modern GPT-4o family): pure-JS, zero native deps, fast. Since
6
+ * Knit Brain's headline metric is the compression *ratio* (before ÷ after),
7
+ * the absolute count being an approximation of any one provider's tokenizer
8
+ * does not distort results — as long as one consistent tokenizer is used.
9
+ */
10
+ export interface Tokenizer {
11
+ /** Encoding identifier, surfaced in metrics for reproducibility. */
12
+ readonly name: string;
13
+ /** Count tokens in a string. Empty string is 0 tokens. */
14
+ count(text: string): number;
15
+ }
16
+ /** Default tokenizer: gpt-tokenizer, o200k_base encoding. */
17
+ export declare const o200kTokenizer: Tokenizer;
18
+ /** Override the active tokenizer (e.g. in tests or for a different encoding). */
19
+ export declare function setTokenizer(tokenizer: Tokenizer): void;
20
+ /** Token count using the active tokenizer. */
21
+ export declare function countTokens(text: string): number;
22
+ /** Name of the active tokenizer's encoding. */
23
+ export declare function activeTokenizerName(): string;
@@ -0,0 +1,25 @@
1
+ import { encode } from "gpt-tokenizer/encoding/o200k_base";
2
+ /** Default tokenizer: gpt-tokenizer, o200k_base encoding. */
3
+ export const o200kTokenizer = {
4
+ name: "o200k_base",
5
+ count(text) {
6
+ if (text.length === 0)
7
+ return 0;
8
+ return encode(text).length;
9
+ },
10
+ };
11
+ /** The active tokenizer. Swap here (or via setTokenizer) to change encodings. */
12
+ let active = o200kTokenizer;
13
+ /** Override the active tokenizer (e.g. in tests or for a different encoding). */
14
+ export function setTokenizer(tokenizer) {
15
+ active = tokenizer;
16
+ }
17
+ /** Token count using the active tokenizer. */
18
+ export function countTokens(text) {
19
+ return active.count(text);
20
+ }
21
+ /** Name of the active tokenizer's encoding. */
22
+ export function activeTokenizerName() {
23
+ return active.name;
24
+ }
25
+ //# sourceMappingURL=tokenizer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokenizer.js","sourceRoot":"","sources":["../src/tokenizer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,mCAAmC,CAAC;AAkB3D,6DAA6D;AAC7D,MAAM,CAAC,MAAM,cAAc,GAAc;IACvC,IAAI,EAAE,YAAY;IAClB,KAAK,CAAC,IAAY;QAChB,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,CAAC,CAAC;QAChC,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;IAC7B,CAAC;CACF,CAAC;AAEF,iFAAiF;AACjF,IAAI,MAAM,GAAc,cAAc,CAAC;AAEvC,iFAAiF;AACjF,MAAM,UAAU,YAAY,CAAC,SAAoB;IAC/C,MAAM,GAAG,SAAS,CAAC;AACrB,CAAC;AAED,8CAA8C;AAC9C,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,OAAO,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AAC5B,CAAC;AAED,+CAA+C;AAC/C,MAAM,UAAU,mBAAmB;IACjC,OAAO,MAAM,CAAC,IAAI,CAAC;AACrB,CAAC"}
@@ -0,0 +1,3 @@
1
+ /** Single source of truth for server identity. */
2
+ export declare const VERSION = "0.1.0";
3
+ export declare const SERVER_NAME = "knitbrain";
@@ -0,0 +1,4 @@
1
+ /** Single source of truth for server identity. */
2
+ export const VERSION = "0.1.0";
3
+ export const SERVER_NAME = "knitbrain";
4
+ //# sourceMappingURL=version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,kDAAkD;AAClD,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,CAAC;AAC/B,MAAM,CAAC,MAAM,WAAW,GAAG,WAAW,CAAC"}
package/package.json ADDED
@@ -0,0 +1,66 @@
1
+ {
2
+ "name": "knitbrain",
3
+ "version": "0.1.0",
4
+ "description": "The local-first brain for coding agents: per-project memory, task-tier workflow routing, and lossless context compression \u2014 measured ~56% on real sessions, reproducible with one command.",
5
+ "type": "module",
6
+ "bin": {
7
+ "knitbrain": "dist/index.js",
8
+ "knitbrain-proxy": "dist/proxy/index.js",
9
+ "knitbrain-hook": "dist/hooks/index.js"
10
+ },
11
+ "keywords": [
12
+ "mcp",
13
+ "model-context-protocol",
14
+ "token-optimization",
15
+ "context-compression",
16
+ "llm",
17
+ "ai-agents",
18
+ "claude",
19
+ "memory",
20
+ "local-first"
21
+ ],
22
+ "author": "Piyush Dua",
23
+ "repository": {
24
+ "type": "git",
25
+ "url": "git+https://github.com/PDgit12/knitbrain.git"
26
+ },
27
+ "homepage": "https://github.com/PDgit12/knitbrain#readme",
28
+ "files": [
29
+ "dist",
30
+ "README.md",
31
+ "LICENSE"
32
+ ],
33
+ "engines": {
34
+ "node": ">=18.0.0"
35
+ },
36
+ "scripts": {
37
+ "typecheck": "tsc --noEmit",
38
+ "build": "tsc -p tsconfig.build.json",
39
+ "lint": "eslint .",
40
+ "test": "vitest run",
41
+ "bench": "tsx scripts/bench.ts",
42
+ "e2e": "npm run build && node scripts/e2e.mjs",
43
+ "audit:prod": "node scripts/production-audit.mjs",
44
+ "prepack": "npm run build",
45
+ "prepublishOnly": "npm run verify",
46
+ "dev": "tsx src/index.ts",
47
+ "proxy": "tsx src/proxy/index.ts",
48
+ "consistency": "node scripts/consistency.mjs",
49
+ "verify": "npm run typecheck && npm run lint && npm run test && npm run build && npm run consistency && npm run bench"
50
+ },
51
+ "license": "MIT",
52
+ "dependencies": {
53
+ "@modelcontextprotocol/sdk": "^1.29.0",
54
+ "@vscode/tree-sitter-wasm": "^0.3.1",
55
+ "gpt-tokenizer": "^3.4.0"
56
+ },
57
+ "devDependencies": {
58
+ "@eslint/js": "^10.0.1",
59
+ "@types/node": "^25.9.2",
60
+ "eslint": "^10.4.1",
61
+ "tsx": "^4.22.4",
62
+ "typescript": "^6.0.3",
63
+ "typescript-eslint": "^8.61.0",
64
+ "vitest": "^4.1.8"
65
+ }
66
+ }