@essentialai/cogent-bridge 1.0.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/LICENSE +15 -0
- package/README.md +311 -0
- package/dist/backend/backend-provider.d.ts +28 -0
- package/dist/backend/backend-provider.d.ts.map +1 -0
- package/dist/backend/backend-provider.js +60 -0
- package/dist/backend/backend-provider.js.map +1 -0
- package/dist/backend/file-backend.d.ts +22 -0
- package/dist/backend/file-backend.d.ts.map +1 -0
- package/dist/backend/file-backend.js +46 -0
- package/dist/backend/file-backend.js.map +1 -0
- package/dist/backend/http-backend.d.ts +94 -0
- package/dist/backend/http-backend.d.ts.map +1 -0
- package/dist/backend/http-backend.js +185 -0
- package/dist/backend/http-backend.js.map +1 -0
- package/dist/backend/index.d.ts +5 -0
- package/dist/backend/index.d.ts.map +1 -0
- package/dist/backend/index.js +4 -0
- package/dist/backend/index.js.map +1 -0
- package/dist/backend/storage-backend.d.ts +22 -0
- package/dist/backend/storage-backend.d.ts.map +1 -0
- package/dist/backend/storage-backend.js +2 -0
- package/dist/backend/storage-backend.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +18 -0
- package/dist/cli.js.map +1 -0
- package/dist/cloud/backoff.d.ts +19 -0
- package/dist/cloud/backoff.d.ts.map +1 -0
- package/dist/cloud/backoff.js +32 -0
- package/dist/cloud/backoff.js.map +1 -0
- package/dist/cloud/credential-store.d.ts +29 -0
- package/dist/cloud/credential-store.d.ts.map +1 -0
- package/dist/cloud/credential-store.js +38 -0
- package/dist/cloud/credential-store.js.map +1 -0
- package/dist/cloud/http-client.d.ts +36 -0
- package/dist/cloud/http-client.d.ts.map +1 -0
- package/dist/cloud/http-client.js +94 -0
- package/dist/cloud/http-client.js.map +1 -0
- package/dist/cloud/index.d.ts +10 -0
- package/dist/cloud/index.d.ts.map +1 -0
- package/dist/cloud/index.js +7 -0
- package/dist/cloud/index.js.map +1 -0
- package/dist/cloud/message-inbox.d.ts +49 -0
- package/dist/cloud/message-inbox.d.ts.map +1 -0
- package/dist/cloud/message-inbox.js +109 -0
- package/dist/cloud/message-inbox.js.map +1 -0
- package/dist/cloud/ws-client.d.ts +112 -0
- package/dist/cloud/ws-client.d.ts.map +1 -0
- package/dist/cloud/ws-client.js +241 -0
- package/dist/cloud/ws-client.js.map +1 -0
- package/dist/cloud/ws-frames.d.ts +66 -0
- package/dist/cloud/ws-frames.d.ts.map +1 -0
- package/dist/cloud/ws-frames.js +19 -0
- package/dist/cloud/ws-frames.js.map +1 -0
- package/dist/config.d.ts +40 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +39 -0
- package/dist/config.js.map +1 -0
- package/dist/constants.d.ts +3 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +6 -0
- package/dist/constants.js.map +1 -0
- package/dist/e2e/helpers.d.ts +101 -0
- package/dist/e2e/helpers.d.ts.map +1 -0
- package/dist/e2e/helpers.js +228 -0
- package/dist/e2e/helpers.js.map +1 -0
- package/dist/errors.d.ts +40 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +53 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +108 -0
- package/dist/index.js.map +1 -0
- package/dist/logger.d.ts +22 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +79 -0
- package/dist/logger.js.map +1 -0
- package/dist/services/cc-cli.d.ts +8 -0
- package/dist/services/cc-cli.d.ts.map +1 -0
- package/dist/services/cc-cli.js +104 -0
- package/dist/services/cc-cli.js.map +1 -0
- package/dist/services/health-check.d.ts +33 -0
- package/dist/services/health-check.d.ts.map +1 -0
- package/dist/services/health-check.js +96 -0
- package/dist/services/health-check.js.map +1 -0
- package/dist/services/peer-registry.d.ts +9 -0
- package/dist/services/peer-registry.d.ts.map +1 -0
- package/dist/services/peer-registry.js +207 -0
- package/dist/services/peer-registry.js.map +1 -0
- package/dist/startup.d.ts +18 -0
- package/dist/startup.d.ts.map +1 -0
- package/dist/startup.js +270 -0
- package/dist/startup.js.map +1 -0
- package/dist/tools/create-session.d.ts +12 -0
- package/dist/tools/create-session.d.ts.map +1 -0
- package/dist/tools/create-session.js +113 -0
- package/dist/tools/create-session.js.map +1 -0
- package/dist/tools/deregister-peer.d.ts +3 -0
- package/dist/tools/deregister-peer.d.ts.map +1 -0
- package/dist/tools/deregister-peer.js +38 -0
- package/dist/tools/deregister-peer.js.map +1 -0
- package/dist/tools/get-history.d.ts +3 -0
- package/dist/tools/get-history.d.ts.map +1 -0
- package/dist/tools/get-history.js +40 -0
- package/dist/tools/get-history.js.map +1 -0
- package/dist/tools/health-check.d.ts +3 -0
- package/dist/tools/health-check.d.ts.map +1 -0
- package/dist/tools/health-check.js +28 -0
- package/dist/tools/health-check.js.map +1 -0
- package/dist/tools/join-session.d.ts +12 -0
- package/dist/tools/join-session.d.ts.map +1 -0
- package/dist/tools/join-session.js +90 -0
- package/dist/tools/join-session.js.map +1 -0
- package/dist/tools/list-peers.d.ts +3 -0
- package/dist/tools/list-peers.d.ts.map +1 -0
- package/dist/tools/list-peers.js +36 -0
- package/dist/tools/list-peers.js.map +1 -0
- package/dist/tools/register-peer.d.ts +3 -0
- package/dist/tools/register-peer.d.ts.map +1 -0
- package/dist/tools/register-peer.js +155 -0
- package/dist/tools/register-peer.js.map +1 -0
- package/dist/tools/send-message.d.ts +3 -0
- package/dist/tools/send-message.d.ts.map +1 -0
- package/dist/tools/send-message.js +121 -0
- package/dist/tools/send-message.js.map +1 -0
- package/dist/types.d.ts +31 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/wizard/detect.d.ts +4 -0
- package/dist/wizard/detect.d.ts.map +1 -0
- package/dist/wizard/detect.js +21 -0
- package/dist/wizard/detect.js.map +1 -0
- package/dist/wizard/index.d.ts +5 -0
- package/dist/wizard/index.d.ts.map +1 -0
- package/dist/wizard/index.js +140 -0
- package/dist/wizard/index.js.map +1 -0
- package/dist/wizard/prompts.d.ts +18 -0
- package/dist/wizard/prompts.d.ts.map +1 -0
- package/dist/wizard/prompts.js +66 -0
- package/dist/wizard/prompts.js.map +1 -0
- package/dist/wizard/scaffold-demo.d.ts +6 -0
- package/dist/wizard/scaffold-demo.d.ts.map +1 -0
- package/dist/wizard/scaffold-demo.js +37 -0
- package/dist/wizard/scaffold-demo.js.map +1 -0
- package/dist/wizard/scaffold-real.d.ts +16 -0
- package/dist/wizard/scaffold-real.d.ts.map +1 -0
- package/dist/wizard/scaffold-real.js +64 -0
- package/dist/wizard/scaffold-real.js.map +1 -0
- package/dist/wizard/templates.d.ts +9 -0
- package/dist/wizard/templates.d.ts.map +1 -0
- package/dist/wizard/templates.js +182 -0
- package/dist/wizard/templates.js.map +1 -0
- package/package.json +71 -0
- package/server.json +60 -0
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import * as readline from "node:readline";
|
|
2
|
+
import os from "node:os";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import fs from "node:fs";
|
|
5
|
+
import { banner, ask, choose, confirm, heading, success, warn, c } from "./prompts.js";
|
|
6
|
+
import { detectNpxPath, detectClaudePath, isNvmPath } from "./detect.js";
|
|
7
|
+
import { scaffoldDemo } from "./scaffold-demo.js";
|
|
8
|
+
import { scaffoldReal } from "./scaffold-real.js";
|
|
9
|
+
export function printDemoNextSteps(baseDir) {
|
|
10
|
+
const apiDir = path.join(baseDir, "api-server");
|
|
11
|
+
const webDir = path.join(baseDir, "web-client");
|
|
12
|
+
heading("Next Steps");
|
|
13
|
+
console.log(` ${c.bold}1.${c.reset} Install dependencies:`);
|
|
14
|
+
console.log(` ${c.dim}cd ${apiDir} && npm install${c.reset}`);
|
|
15
|
+
console.log(` ${c.dim}cd ${webDir} && npm install${c.reset}`);
|
|
16
|
+
console.log();
|
|
17
|
+
console.log(` ${c.bold}2.${c.reset} Start the API server:`);
|
|
18
|
+
console.log(` ${c.dim}cd ${apiDir} && node server.js${c.reset}`);
|
|
19
|
+
console.log();
|
|
20
|
+
console.log(` ${c.bold}3.${c.reset} Open Terminal 1 — Backend team:`);
|
|
21
|
+
console.log(` ${c.dim}cd ${apiDir}${c.reset}`);
|
|
22
|
+
console.log(` ${c.dim}claude${c.reset}`);
|
|
23
|
+
console.log(` Then tell Claude: "Register on the bridge and wait for a bug report"`);
|
|
24
|
+
console.log();
|
|
25
|
+
console.log(` ${c.bold}4.${c.reset} Open Terminal 2 — Frontend team:`);
|
|
26
|
+
console.log(` ${c.dim}cd ${webDir}${c.reset}`);
|
|
27
|
+
console.log(` ${c.dim}claude${c.reset}`);
|
|
28
|
+
console.log(` Then tell Claude: "Register on the bridge, run node app.js, and report bugs to backend"`);
|
|
29
|
+
printAddMorePeers();
|
|
30
|
+
}
|
|
31
|
+
export function printRealNextSteps(pathA, idA, labelA, pathB, idB, labelB, result) {
|
|
32
|
+
heading("Files");
|
|
33
|
+
for (const f of result.created)
|
|
34
|
+
success(`Created ${f}`);
|
|
35
|
+
for (const f of result.modified)
|
|
36
|
+
success(`Modified ${f}`);
|
|
37
|
+
for (const f of result.skipped)
|
|
38
|
+
warn(`Skipped ${f} (bridge section already exists)`);
|
|
39
|
+
heading("Next Steps");
|
|
40
|
+
console.log(` ${c.bold}1.${c.reset} Open Terminal 1 — ${labelA}:`);
|
|
41
|
+
console.log(` ${c.dim}cd ${pathA}${c.reset}`);
|
|
42
|
+
console.log(` ${c.dim}claude${c.reset}`);
|
|
43
|
+
console.log(` Then tell Claude: "Register on the bridge as ${idA}"`);
|
|
44
|
+
console.log();
|
|
45
|
+
console.log(` ${c.bold}2.${c.reset} Open Terminal 2 — ${labelB}:`);
|
|
46
|
+
console.log(` ${c.dim}cd ${pathB}${c.reset}`);
|
|
47
|
+
console.log(` ${c.dim}claude${c.reset}`);
|
|
48
|
+
console.log(` Then tell Claude: "Register on the bridge as ${idB}"`);
|
|
49
|
+
console.log();
|
|
50
|
+
console.log(` ${c.bold}3.${c.reset} Send a message from either session:`);
|
|
51
|
+
console.log(` "Use cogent_send_message to tell ${idA} about [your topic]"`);
|
|
52
|
+
printAddMorePeers();
|
|
53
|
+
}
|
|
54
|
+
function printAddMorePeers() {
|
|
55
|
+
heading("Adding More Peers");
|
|
56
|
+
console.log(` To add a 3rd (or more) peer to the conversation:`);
|
|
57
|
+
console.log(` 1. Copy the ${c.bold}.mcp.json${c.reset} to the new project (or run this wizard again)`);
|
|
58
|
+
console.log(` 2. Add the Cogent Bridge section to its CLAUDE.md`);
|
|
59
|
+
console.log(` 3. Launch ${c.bold}claude${c.reset} in that directory and register with a unique peerId`);
|
|
60
|
+
console.log(` 4. Any registered peer can message any other peer`);
|
|
61
|
+
console.log();
|
|
62
|
+
}
|
|
63
|
+
export async function runWizard() {
|
|
64
|
+
const rl = readline.createInterface({
|
|
65
|
+
input: process.stdin,
|
|
66
|
+
output: process.stdout,
|
|
67
|
+
});
|
|
68
|
+
try {
|
|
69
|
+
banner();
|
|
70
|
+
// Detect tools
|
|
71
|
+
const npxPath = detectNpxPath();
|
|
72
|
+
const claudePath = detectClaudePath();
|
|
73
|
+
if (isNvmPath(npxPath)) {
|
|
74
|
+
console.log(` ${c.dim}Detected nvm — using absolute path: ${npxPath}${c.reset}`);
|
|
75
|
+
}
|
|
76
|
+
if (!claudePath) {
|
|
77
|
+
warn("Claude CLI not found in PATH. Install it before using Cogent Bridge.");
|
|
78
|
+
console.log();
|
|
79
|
+
}
|
|
80
|
+
const mode = await choose(rl, "What would you like to set up?", [
|
|
81
|
+
"Demo — Two sample projects with a planted bug (great for trying Cogent Bridge)",
|
|
82
|
+
"Real — Add Cogent Bridge to two existing projects",
|
|
83
|
+
]);
|
|
84
|
+
if (mode === 0) {
|
|
85
|
+
// Demo mode
|
|
86
|
+
const defaultBase = path.join(os.homedir(), "cogent-bridge-demo");
|
|
87
|
+
const baseDir = await ask(rl, "Base directory for demo projects:", defaultBase);
|
|
88
|
+
const resolved = path.resolve(baseDir);
|
|
89
|
+
if (fs.existsSync(resolved)) {
|
|
90
|
+
const overwrite = await confirm(rl, `${resolved} already exists. Overwrite?`, false);
|
|
91
|
+
if (!overwrite) {
|
|
92
|
+
console.log("\nAborted.");
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
heading("Creating demo projects");
|
|
97
|
+
const result = scaffoldDemo(resolved, npxPath);
|
|
98
|
+
for (const f of result.files) {
|
|
99
|
+
success(`Created ${path.join(resolved, f)}`);
|
|
100
|
+
}
|
|
101
|
+
printDemoNextSteps(resolved);
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
// Real mode
|
|
105
|
+
const pathA = await ask(rl, "Absolute path to Project A:");
|
|
106
|
+
if (!fs.existsSync(pathA) || !fs.statSync(pathA).isDirectory()) {
|
|
107
|
+
console.log(`\n ${c.red}Error:${c.reset} ${pathA} is not a valid directory.`);
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
const defaultIdA = path.basename(pathA).toLowerCase().replace(/[^a-z0-9-]/g, "-");
|
|
111
|
+
const idA = await ask(rl, "Peer ID for Project A:", defaultIdA);
|
|
112
|
+
const defaultLabelA = "CC_" + path.basename(pathA).replace(/[^a-zA-Z0-9]/g, "_");
|
|
113
|
+
const labelA = await ask(rl, "Label for Project A:", defaultLabelA);
|
|
114
|
+
const pathB = await ask(rl, "Absolute path to Project B:");
|
|
115
|
+
if (!fs.existsSync(pathB) || !fs.statSync(pathB).isDirectory()) {
|
|
116
|
+
console.log(`\n ${c.red}Error:${c.reset} ${pathB} is not a valid directory.`);
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
const defaultIdB = path.basename(pathB).toLowerCase().replace(/[^a-z0-9-]/g, "-");
|
|
120
|
+
const idB = await ask(rl, "Peer ID for Project B:", defaultIdB);
|
|
121
|
+
const defaultLabelB = "CC_" + path.basename(pathB).replace(/[^a-zA-Z0-9]/g, "_");
|
|
122
|
+
const labelB = await ask(rl, "Label for Project B:", defaultLabelB);
|
|
123
|
+
heading("Configuring projects");
|
|
124
|
+
const result = scaffoldReal({
|
|
125
|
+
projectAPath: path.resolve(pathA),
|
|
126
|
+
projectAId: idA,
|
|
127
|
+
projectALabel: labelA,
|
|
128
|
+
projectBPath: path.resolve(pathB),
|
|
129
|
+
projectBId: idB,
|
|
130
|
+
projectBLabel: labelB,
|
|
131
|
+
npxPath,
|
|
132
|
+
});
|
|
133
|
+
printRealNextSteps(path.resolve(pathA), idA, labelA, path.resolve(pathB), idB, labelB, result);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
finally {
|
|
137
|
+
rl.close();
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/wizard/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,eAAe,CAAC;AAC1C,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,cAAc,CAAC;AACvF,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACzE,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,YAAY,EAA2B,MAAM,oBAAoB,CAAC;AAE3E,MAAM,UAAU,kBAAkB,CAAC,OAAe;IAChD,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;IAChD,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;IAEhD,OAAO,CAAC,YAAY,CAAC,CAAC;IAEtB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,KAAK,wBAAwB,CAAC,CAAC;IAC7D,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,GAAG,MAAM,MAAM,kBAAkB,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;IAClE,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,GAAG,MAAM,MAAM,kBAAkB,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;IAClE,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,KAAK,wBAAwB,CAAC,CAAC;IAC7D,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,GAAG,MAAM,MAAM,qBAAqB,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;IACrE,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,KAAK,kCAAkC,CAAC,CAAC;IACvE,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,GAAG,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;IACnD,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;IAC7C,OAAO,CAAC,GAAG,CAAC,2EAA2E,CAAC,CAAC;IACzF,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,KAAK,mCAAmC,CAAC,CAAC;IACxE,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,GAAG,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;IACnD,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;IAC7C,OAAO,CAAC,GAAG,CAAC,8FAA8F,CAAC,CAAC;IAE5G,iBAAiB,EAAE,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,KAAa,EACb,GAAW,EACX,MAAc,EACd,KAAa,EACb,GAAW,EACX,MAAc,EACd,MAA0B;IAE1B,OAAO,CAAC,OAAO,CAAC,CAAC;IAEjB,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO;QAAE,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;IACxD,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,QAAQ;QAAE,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;IAC1D,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO;QAAE,IAAI,CAAC,WAAW,CAAC,kCAAkC,CAAC,CAAC;IAErF,OAAO,CAAC,YAAY,CAAC,CAAC;IAEtB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,KAAK,sBAAsB,MAAM,GAAG,CAAC,CAAC;IACpE,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,GAAG,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;IAClD,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;IAC7C,OAAO,CAAC,GAAG,CAAC,qDAAqD,GAAG,GAAG,CAAC,CAAC;IACzE,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,KAAK,sBAAsB,MAAM,GAAG,CAAC,CAAC;IACpE,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,GAAG,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;IAClD,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;IAC7C,OAAO,CAAC,GAAG,CAAC,qDAAqD,GAAG,GAAG,CAAC,CAAC;IACzE,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,KAAK,sCAAsC,CAAC,CAAC;IAC3E,OAAO,CAAC,GAAG,CAAC,yCAAyC,GAAG,sBAAsB,CAAC,CAAC;IAEhF,iBAAiB,EAAE,CAAC;AACtB,CAAC;AAED,SAAS,iBAAiB;IACxB,OAAO,CAAC,mBAAmB,CAAC,CAAC;IAC7B,OAAO,CAAC,GAAG,CAAC,oDAAoD,CAAC,CAAC;IAClE,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC,IAAI,YAAY,CAAC,CAAC,KAAK,gDAAgD,CAAC,CAAC;IACxG,OAAO,CAAC,GAAG,CAAC,qDAAqD,CAAC,CAAC;IACnE,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC,KAAK,sDAAsD,CAAC,CAAC;IACzG,OAAO,CAAC,GAAG,CAAC,qDAAqD,CAAC,CAAC;IACnE,OAAO,CAAC,GAAG,EAAE,CAAC;AAChB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS;IAC7B,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC;QAClC,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC,CAAC;IAEH,IAAI,CAAC;QACH,MAAM,EAAE,CAAC;QAET,eAAe;QACf,MAAM,OAAO,GAAG,aAAa,EAAE,CAAC;QAChC,MAAM,UAAU,GAAG,gBAAgB,EAAE,CAAC;QAEtC,IAAI,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;YACvB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,uCAAuC,OAAO,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;QACpF,CAAC;QACD,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,IAAI,CAAC,sEAAsE,CAAC,CAAC;YAC7E,OAAO,CAAC,GAAG,EAAE,CAAC;QAChB,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,EAAE,EAAE,gCAAgC,EAAE;YAC9D,gFAAgF;YAChF,mDAAmD;SACpD,CAAC,CAAC;QAEH,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;YACf,YAAY;YACZ,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,oBAAoB,CAAC,CAAC;YAClE,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,EAAE,EAAE,mCAAmC,EAAE,WAAW,CAAC,CAAC;YAChF,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YAEvC,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC5B,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,EAAE,EAAE,GAAG,QAAQ,6BAA6B,EAAE,KAAK,CAAC,CAAC;gBACrF,IAAI,CAAC,SAAS,EAAE,CAAC;oBACf,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;oBAC1B,OAAO;gBACT,CAAC;YACH,CAAC;YAED,OAAO,CAAC,wBAAwB,CAAC,CAAC;YAClC,MAAM,MAAM,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YAC/C,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;gBAC7B,OAAO,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;YAC/C,CAAC;YAED,kBAAkB,CAAC,QAAQ,CAAC,CAAC;QAC/B,CAAC;aAAM,CAAC;YACN,YAAY;YACZ,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,EAAE,EAAE,6BAA6B,CAAC,CAAC;YAC3D,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;gBAC/D,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,KAAK,IAAI,KAAK,4BAA4B,CAAC,CAAC;gBAC/E,OAAO;YACT,CAAC;YAED,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC;YAClF,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,EAAE,EAAE,wBAAwB,EAAE,UAAU,CAAC,CAAC;YAChE,MAAM,aAAa,GAAG,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,eAAe,EAAE,GAAG,CAAC,CAAC;YACjF,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,EAAE,EAAE,sBAAsB,EAAE,aAAa,CAAC,CAAC;YAEpE,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,EAAE,EAAE,6BAA6B,CAAC,CAAC;YAC3D,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;gBAC/D,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,KAAK,IAAI,KAAK,4BAA4B,CAAC,CAAC;gBAC/E,OAAO;YACT,CAAC;YAED,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC;YAClF,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,EAAE,EAAE,wBAAwB,EAAE,UAAU,CAAC,CAAC;YAChE,MAAM,aAAa,GAAG,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,eAAe,EAAE,GAAG,CAAC,CAAC;YACjF,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,EAAE,EAAE,sBAAsB,EAAE,aAAa,CAAC,CAAC;YAEpE,OAAO,CAAC,sBAAsB,CAAC,CAAC;YAChC,MAAM,MAAM,GAAG,YAAY,CAAC;gBAC1B,YAAY,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;gBACjC,UAAU,EAAE,GAAG;gBACf,aAAa,EAAE,MAAM;gBACrB,YAAY,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;gBACjC,UAAU,EAAE,GAAG;gBACf,aAAa,EAAE,MAAM;gBACrB,OAAO;aACR,CAAC,CAAC;YAEH,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QACjG,CAAC;IACH,CAAC;YAAS,CAAC;QACT,EAAE,CAAC,KAAK,EAAE,CAAC;IACb,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { Interface as RLInterface } from "node:readline";
|
|
2
|
+
export declare const c: {
|
|
3
|
+
reset: string;
|
|
4
|
+
bold: string;
|
|
5
|
+
dim: string;
|
|
6
|
+
green: string;
|
|
7
|
+
cyan: string;
|
|
8
|
+
yellow: string;
|
|
9
|
+
red: string;
|
|
10
|
+
};
|
|
11
|
+
export declare function ask(rl: RLInterface, question: string, defaultVal?: string): Promise<string>;
|
|
12
|
+
export declare function choose(rl: RLInterface, question: string, options: string[]): Promise<number>;
|
|
13
|
+
export declare function confirm(rl: RLInterface, question: string, defaultVal?: boolean): Promise<boolean>;
|
|
14
|
+
export declare function banner(): void;
|
|
15
|
+
export declare function success(msg: string): void;
|
|
16
|
+
export declare function warn(msg: string): void;
|
|
17
|
+
export declare function heading(msg: string): void;
|
|
18
|
+
//# sourceMappingURL=prompts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../../src/wizard/prompts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,IAAI,WAAW,EAAE,MAAM,eAAe,CAAC;AAG9D,eAAO,MAAM,CAAC;;;;;;;;CAQb,CAAC;AAEF,wBAAgB,GAAG,CACjB,EAAE,EAAE,WAAW,EACf,QAAQ,EAAE,MAAM,EAChB,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,MAAM,CAAC,CAQjB;AAED,wBAAgB,MAAM,CACpB,EAAE,EAAE,WAAW,EACf,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EAAE,GAChB,OAAO,CAAC,MAAM,CAAC,CAkBjB;AAED,wBAAgB,OAAO,CACrB,EAAE,EAAE,WAAW,EACf,QAAQ,EAAE,MAAM,EAChB,UAAU,UAAQ,GACjB,OAAO,CAAC,OAAO,CAAC,CAYlB;AAED,wBAAgB,MAAM,IAAI,IAAI,CAO7B;AAED,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAEzC;AAED,wBAAgB,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAEtC;AAED,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAEzC"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
// ANSI helpers
|
|
2
|
+
export const c = {
|
|
3
|
+
reset: "\x1b[0m",
|
|
4
|
+
bold: "\x1b[1m",
|
|
5
|
+
dim: "\x1b[2m",
|
|
6
|
+
green: "\x1b[32m",
|
|
7
|
+
cyan: "\x1b[36m",
|
|
8
|
+
yellow: "\x1b[33m",
|
|
9
|
+
red: "\x1b[31m",
|
|
10
|
+
};
|
|
11
|
+
export function ask(rl, question, defaultVal) {
|
|
12
|
+
const suffix = defaultVal ? ` ${c.dim}(${defaultVal})${c.reset} ` : " ";
|
|
13
|
+
return new Promise((resolve) => {
|
|
14
|
+
rl.question(`${c.cyan}?${c.reset} ${question}${suffix}`, (answer) => {
|
|
15
|
+
const trimmed = answer.trim();
|
|
16
|
+
resolve(trimmed || defaultVal || "");
|
|
17
|
+
});
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
export function choose(rl, question, options) {
|
|
21
|
+
return new Promise((resolve) => {
|
|
22
|
+
const lines = options
|
|
23
|
+
.map((opt, i) => ` ${c.bold}[${i + 1}]${c.reset} ${opt}`)
|
|
24
|
+
.join("\n");
|
|
25
|
+
rl.question(`${c.cyan}?${c.reset} ${question}\n${lines}\n${c.cyan}>${c.reset} `, (answer) => {
|
|
26
|
+
const num = parseInt(answer.trim(), 10);
|
|
27
|
+
if (num >= 1 && num <= options.length) {
|
|
28
|
+
resolve(num - 1);
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
// Default to first option on invalid input
|
|
32
|
+
resolve(0);
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
export function confirm(rl, question, defaultVal = false) {
|
|
38
|
+
const hint = defaultVal ? "Y/n" : "y/N";
|
|
39
|
+
return new Promise((resolve) => {
|
|
40
|
+
rl.question(`${c.cyan}?${c.reset} ${question} ${c.dim}(${hint})${c.reset} `, (answer) => {
|
|
41
|
+
const val = answer.trim().toLowerCase();
|
|
42
|
+
if (val === "")
|
|
43
|
+
resolve(defaultVal);
|
|
44
|
+
else
|
|
45
|
+
resolve(val === "y" || val === "yes");
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
export function banner() {
|
|
50
|
+
console.log(`
|
|
51
|
+
${c.cyan}╔══════════════════════════════════════╗
|
|
52
|
+
║ Cogent Bridge — Setup Wizard ║
|
|
53
|
+
║ Inter-session communication ║
|
|
54
|
+
╚══════════════════════════════════════╝${c.reset}
|
|
55
|
+
`);
|
|
56
|
+
}
|
|
57
|
+
export function success(msg) {
|
|
58
|
+
console.log(` ${c.green}✓${c.reset} ${msg}`);
|
|
59
|
+
}
|
|
60
|
+
export function warn(msg) {
|
|
61
|
+
console.log(` ${c.yellow}!${c.reset} ${msg}`);
|
|
62
|
+
}
|
|
63
|
+
export function heading(msg) {
|
|
64
|
+
console.log(`\n${c.bold}━━━ ${msg} ━━━${c.reset}\n`);
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=prompts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../src/wizard/prompts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scaffold-demo.d.ts","sourceRoot":"","sources":["../../src/wizard/scaffold-demo.ts"],"names":[],"mappings":"AAWA,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,cAAc,CAuC7E"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { mcpJsonContent, demoServerJs, demoAppJs, demoPackageJson, demoBackendClaudeMd, demoFrontendClaudeMd, } from "./templates.js";
|
|
4
|
+
export function scaffoldDemo(baseDir, npxPath) {
|
|
5
|
+
const files = [];
|
|
6
|
+
const apiDir = path.join(baseDir, "api-server");
|
|
7
|
+
const webDir = path.join(baseDir, "web-client");
|
|
8
|
+
fs.mkdirSync(apiDir, { recursive: true });
|
|
9
|
+
fs.mkdirSync(webDir, { recursive: true });
|
|
10
|
+
const mcpJson = mcpJsonContent(npxPath);
|
|
11
|
+
// Backend files
|
|
12
|
+
const backendFiles = [
|
|
13
|
+
["package.json", demoPackageJson("api-server", { express: "^4.21.0", cors: "^2.8.5" })],
|
|
14
|
+
["server.js", demoServerJs()],
|
|
15
|
+
[".mcp.json", mcpJson],
|
|
16
|
+
["CLAUDE.md", demoBackendClaudeMd()],
|
|
17
|
+
];
|
|
18
|
+
for (const [name, content] of backendFiles) {
|
|
19
|
+
const filePath = path.join(apiDir, name);
|
|
20
|
+
fs.writeFileSync(filePath, content, "utf-8");
|
|
21
|
+
files.push(path.join("api-server", name));
|
|
22
|
+
}
|
|
23
|
+
// Frontend files
|
|
24
|
+
const frontendFiles = [
|
|
25
|
+
["package.json", demoPackageJson("web-client", { axios: "^1.7.0" })],
|
|
26
|
+
["app.js", demoAppJs()],
|
|
27
|
+
[".mcp.json", mcpJson],
|
|
28
|
+
["CLAUDE.md", demoFrontendClaudeMd()],
|
|
29
|
+
];
|
|
30
|
+
for (const [name, content] of frontendFiles) {
|
|
31
|
+
const filePath = path.join(webDir, name);
|
|
32
|
+
fs.writeFileSync(filePath, content, "utf-8");
|
|
33
|
+
files.push(path.join("web-client", name));
|
|
34
|
+
}
|
|
35
|
+
return { files, baseDir };
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=scaffold-demo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scaffold-demo.js","sourceRoot":"","sources":["../../src/wizard/scaffold-demo.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EACL,cAAc,EACd,YAAY,EACZ,SAAS,EACT,eAAe,EACf,mBAAmB,EACnB,oBAAoB,GACrB,MAAM,gBAAgB,CAAC;AAOxB,MAAM,UAAU,YAAY,CAAC,OAAe,EAAE,OAAe;IAC3D,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;IAChD,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;IAEhD,EAAE,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1C,EAAE,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE1C,MAAM,OAAO,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;IAExC,gBAAgB;IAChB,MAAM,YAAY,GAAuB;QACvC,CAAC,cAAc,EAAE,eAAe,CAAC,YAAY,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;QACvF,CAAC,WAAW,EAAE,YAAY,EAAE,CAAC;QAC7B,CAAC,WAAW,EAAE,OAAO,CAAC;QACtB,CAAC,WAAW,EAAE,mBAAmB,EAAE,CAAC;KACrC,CAAC;IAEF,KAAK,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,YAAY,EAAE,CAAC;QAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QACzC,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QAC7C,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC,CAAC;IAC5C,CAAC;IAED,iBAAiB;IACjB,MAAM,aAAa,GAAuB;QACxC,CAAC,cAAc,EAAE,eAAe,CAAC,YAAY,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;QACpE,CAAC,QAAQ,EAAE,SAAS,EAAE,CAAC;QACvB,CAAC,WAAW,EAAE,OAAO,CAAC;QACtB,CAAC,WAAW,EAAE,oBAAoB,EAAE,CAAC;KACtC,CAAC;IAEF,KAAK,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,aAAa,EAAE,CAAC;QAC5C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QACzC,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QAC7C,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC,CAAC;IAC5C,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;AAC5B,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export interface RealConfig {
|
|
2
|
+
projectAPath: string;
|
|
3
|
+
projectAId: string;
|
|
4
|
+
projectALabel: string;
|
|
5
|
+
projectBPath: string;
|
|
6
|
+
projectBId: string;
|
|
7
|
+
projectBLabel: string;
|
|
8
|
+
npxPath: string;
|
|
9
|
+
}
|
|
10
|
+
export interface RealScaffoldResult {
|
|
11
|
+
created: string[];
|
|
12
|
+
modified: string[];
|
|
13
|
+
skipped: string[];
|
|
14
|
+
}
|
|
15
|
+
export declare function scaffoldReal(config: RealConfig): RealScaffoldResult;
|
|
16
|
+
//# sourceMappingURL=scaffold-real.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scaffold-real.d.ts","sourceRoot":"","sources":["../../src/wizard/scaffold-real.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,UAAU;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAkCD,wBAAgB,YAAY,CAAC,MAAM,EAAE,UAAU,GAAG,kBAAkB,CAwCnE"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { mcpJsonContent, mcpJsonMerge, claudeMdBridgeSection } from "./templates.js";
|
|
4
|
+
function writeMcpJson(projectPath, npxPath) {
|
|
5
|
+
const filePath = path.join(projectPath, ".mcp.json");
|
|
6
|
+
if (fs.existsSync(filePath)) {
|
|
7
|
+
const existing = fs.readFileSync(filePath, "utf-8");
|
|
8
|
+
fs.writeFileSync(filePath, mcpJsonMerge(existing, npxPath), "utf-8");
|
|
9
|
+
return "modified";
|
|
10
|
+
}
|
|
11
|
+
fs.writeFileSync(filePath, mcpJsonContent(npxPath), "utf-8");
|
|
12
|
+
return "created";
|
|
13
|
+
}
|
|
14
|
+
function writeClaudeMd(projectPath, peerId, label, otherPeerId) {
|
|
15
|
+
const filePath = path.join(projectPath, "CLAUDE.md");
|
|
16
|
+
const section = claudeMdBridgeSection(peerId, label, otherPeerId);
|
|
17
|
+
if (fs.existsSync(filePath)) {
|
|
18
|
+
const existing = fs.readFileSync(filePath, "utf-8");
|
|
19
|
+
if (existing.includes("## Cogent Bridge Protocol")) {
|
|
20
|
+
return "skipped";
|
|
21
|
+
}
|
|
22
|
+
fs.writeFileSync(filePath, existing.trimEnd() + "\n\n" + section, "utf-8");
|
|
23
|
+
return "modified";
|
|
24
|
+
}
|
|
25
|
+
fs.writeFileSync(filePath, section, "utf-8");
|
|
26
|
+
return "created";
|
|
27
|
+
}
|
|
28
|
+
export function scaffoldReal(config) {
|
|
29
|
+
const created = [];
|
|
30
|
+
const modified = [];
|
|
31
|
+
const skipped = [];
|
|
32
|
+
// Project A
|
|
33
|
+
const mcpA = writeMcpJson(config.projectAPath, config.npxPath);
|
|
34
|
+
const mcpAPath = path.join(config.projectAPath, ".mcp.json");
|
|
35
|
+
if (mcpA === "created")
|
|
36
|
+
created.push(mcpAPath);
|
|
37
|
+
else
|
|
38
|
+
modified.push(mcpAPath);
|
|
39
|
+
const claudeA = writeClaudeMd(config.projectAPath, config.projectAId, config.projectALabel, config.projectBId);
|
|
40
|
+
const claudeAPath = path.join(config.projectAPath, "CLAUDE.md");
|
|
41
|
+
if (claudeA === "created")
|
|
42
|
+
created.push(claudeAPath);
|
|
43
|
+
else if (claudeA === "modified")
|
|
44
|
+
modified.push(claudeAPath);
|
|
45
|
+
else
|
|
46
|
+
skipped.push(claudeAPath);
|
|
47
|
+
// Project B
|
|
48
|
+
const mcpB = writeMcpJson(config.projectBPath, config.npxPath);
|
|
49
|
+
const mcpBPath = path.join(config.projectBPath, ".mcp.json");
|
|
50
|
+
if (mcpB === "created")
|
|
51
|
+
created.push(mcpBPath);
|
|
52
|
+
else
|
|
53
|
+
modified.push(mcpBPath);
|
|
54
|
+
const claudeB = writeClaudeMd(config.projectBPath, config.projectBId, config.projectBLabel, config.projectAId);
|
|
55
|
+
const claudeBPath = path.join(config.projectBPath, "CLAUDE.md");
|
|
56
|
+
if (claudeB === "created")
|
|
57
|
+
created.push(claudeBPath);
|
|
58
|
+
else if (claudeB === "modified")
|
|
59
|
+
modified.push(claudeBPath);
|
|
60
|
+
else
|
|
61
|
+
skipped.push(claudeBPath);
|
|
62
|
+
return { created, modified, skipped };
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=scaffold-real.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scaffold-real.js","sourceRoot":"","sources":["../../src/wizard/scaffold-real.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export declare function mcpJsonContent(npxPath: string): string;
|
|
2
|
+
export declare function mcpJsonMerge(existing: string, npxPath: string): string;
|
|
3
|
+
export declare function claudeMdBridgeSection(peerId: string, label: string, otherPeerId: string): string;
|
|
4
|
+
export declare function demoServerJs(): string;
|
|
5
|
+
export declare function demoAppJs(): string;
|
|
6
|
+
export declare function demoPackageJson(name: string, deps: Record<string, string>): string;
|
|
7
|
+
export declare function demoBackendClaudeMd(): string;
|
|
8
|
+
export declare function demoFrontendClaudeMd(): string;
|
|
9
|
+
//# sourceMappingURL=templates.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../src/wizard/templates.ts"],"names":[],"mappings":"AAAA,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CActD;AAED,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,GACd,MAAM,CAYR;AAED,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,MAAM,GAClB,MAAM,CA4BR;AAED,wBAAgB,YAAY,IAAI,MAAM,CAuCrC;AAED,wBAAgB,SAAS,IAAI,MAAM,CAwClC;AAED,wBAAgB,eAAe,CAC7B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC3B,MAAM,CAQR;AAED,wBAAgB,mBAAmB,IAAI,MAAM,CAgB5C;AAED,wBAAgB,oBAAoB,IAAI,MAAM,CAe7C"}
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
export function mcpJsonContent(npxPath) {
|
|
2
|
+
const config = {
|
|
3
|
+
mcpServers: {
|
|
4
|
+
"cogent-bridge": {
|
|
5
|
+
command: npxPath,
|
|
6
|
+
args: ["-y", "@essentialai/cogent-bridge"],
|
|
7
|
+
env: {
|
|
8
|
+
COGENT_LOG_LEVEL: "info",
|
|
9
|
+
COGENT_TIMEOUT_MS: "180000",
|
|
10
|
+
},
|
|
11
|
+
},
|
|
12
|
+
},
|
|
13
|
+
};
|
|
14
|
+
return JSON.stringify(config, null, 2) + "\n";
|
|
15
|
+
}
|
|
16
|
+
export function mcpJsonMerge(existing, npxPath) {
|
|
17
|
+
const parsed = JSON.parse(existing);
|
|
18
|
+
if (!parsed.mcpServers)
|
|
19
|
+
parsed.mcpServers = {};
|
|
20
|
+
parsed.mcpServers["cogent-bridge"] = {
|
|
21
|
+
command: npxPath,
|
|
22
|
+
args: ["-y", "@essentialai/cogent-bridge"],
|
|
23
|
+
env: {
|
|
24
|
+
COGENT_LOG_LEVEL: "info",
|
|
25
|
+
COGENT_TIMEOUT_MS: "180000",
|
|
26
|
+
},
|
|
27
|
+
};
|
|
28
|
+
return JSON.stringify(parsed, null, 2) + "\n";
|
|
29
|
+
}
|
|
30
|
+
export function claudeMdBridgeSection(peerId, label, otherPeerId) {
|
|
31
|
+
return `
|
|
32
|
+
## Cogent Bridge Protocol
|
|
33
|
+
|
|
34
|
+
You are participating in a cross-team collaboration via Cogent Bridge.
|
|
35
|
+
Your peer identity: **peerId=\`${peerId}\`**, **label=\`${label}\`**
|
|
36
|
+
|
|
37
|
+
### On Session Start
|
|
38
|
+
1. Find your Claude Code session ID:
|
|
39
|
+
\`\`\`bash
|
|
40
|
+
ls -t ~/.claude/projects/$(pwd | sed 's/[^a-zA-Z0-9-]/-/g')/*.jsonl 2>/dev/null | head -1 | xargs -I{} basename {} .jsonl
|
|
41
|
+
\`\`\`
|
|
42
|
+
2. Register yourself on the bridge:
|
|
43
|
+
- Use \`cogent_register_peer\` with peerId="${peerId}", label="${label}"
|
|
44
|
+
- Set sessionId to the UUID from step 1
|
|
45
|
+
- Set cwd to your project working directory (\`pwd\`)
|
|
46
|
+
|
|
47
|
+
### When You Receive Messages
|
|
48
|
+
- Messages from other peers arrive with a \`[Cogent Bridge message from ...]\` header
|
|
49
|
+
- Your entire response is automatically relayed back to the sender
|
|
50
|
+
- Do NOT use \`cogent_send_message\` to reply — just answer directly and normally
|
|
51
|
+
- Read carefully, investigate the issue, and respond with specifics
|
|
52
|
+
|
|
53
|
+
### Sending Messages
|
|
54
|
+
- Use \`cogent_send_message\` to initiate conversations with other peers (e.g. toPeerId="${otherPeerId}")
|
|
55
|
+
- Be specific about what you changed when reporting fixes
|
|
56
|
+
- Include file names and line numbers in your responses
|
|
57
|
+
`;
|
|
58
|
+
}
|
|
59
|
+
export function demoServerJs() {
|
|
60
|
+
return `// server.js
|
|
61
|
+
const express = require('express');
|
|
62
|
+
const cors = require('cors');
|
|
63
|
+
const app = express();
|
|
64
|
+
app.use(cors());
|
|
65
|
+
app.use(express.json());
|
|
66
|
+
|
|
67
|
+
const users = [
|
|
68
|
+
{ id: 1, name: 'Alice', email: 'alice@example.com', role: 'admin' },
|
|
69
|
+
{ id: 2, name: 'Bob', email: 'bob@example.com', role: 'user' },
|
|
70
|
+
{ id: 3, name: 'Charlie', email: 'charlie@example.com', role: 'user' },
|
|
71
|
+
];
|
|
72
|
+
|
|
73
|
+
// GET /api/users - works fine
|
|
74
|
+
app.get('/api/users', (req, res) => {
|
|
75
|
+
res.json({ success: true, data: users });
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
// GET /api/users/:id - BUG: returns 200 with wrong shape when user not found
|
|
79
|
+
app.get('/api/users/:id', (req, res) => {
|
|
80
|
+
const id = parseInt(req.params.id);
|
|
81
|
+
const user = users.find(u => u.id === id);
|
|
82
|
+
|
|
83
|
+
// BUG 1: No 404 handling - returns 200 with { success: true, data: undefined }
|
|
84
|
+
// BUG 2: When user IS found, wraps in extra nested object
|
|
85
|
+
res.json({ success: true, data: { user: { record: user } } });
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
// POST /api/users - works fine
|
|
89
|
+
app.post('/api/users', (req, res) => {
|
|
90
|
+
const { name, email, role } = req.body;
|
|
91
|
+
const newUser = { id: users.length + 1, name, email, role: role || 'user' };
|
|
92
|
+
users.push(newUser);
|
|
93
|
+
res.status(201).json({ success: true, data: newUser });
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
app.listen(3001, () => console.log('API running on http://localhost:3001'));
|
|
97
|
+
`;
|
|
98
|
+
}
|
|
99
|
+
export function demoAppJs() {
|
|
100
|
+
// Using regular string concatenation to avoid template literal escaping issues.
|
|
101
|
+
// The output JavaScript uses backtick template literals with ${} interpolation.
|
|
102
|
+
const lines = [
|
|
103
|
+
"// app.js",
|
|
104
|
+
"const axios = require('axios');",
|
|
105
|
+
"const API_BASE = 'http://localhost:3001';",
|
|
106
|
+
"",
|
|
107
|
+
"async function listUsers() {",
|
|
108
|
+
" const res = await axios.get(`${API_BASE}/api/users`);",
|
|
109
|
+
" return res.data.data;",
|
|
110
|
+
"}",
|
|
111
|
+
"",
|
|
112
|
+
"async function getUser(id) {",
|
|
113
|
+
" const res = await axios.get(`${API_BASE}/api/users/${id}`);",
|
|
114
|
+
" // Frontend expects: { success: true, data: { id, name, email, role } }",
|
|
115
|
+
" // But gets: { success: true, data: { user: { record: {...} } } }",
|
|
116
|
+
" return res.data.data;",
|
|
117
|
+
"}",
|
|
118
|
+
"",
|
|
119
|
+
"async function main() {",
|
|
120
|
+
" console.log('--- List Users ---');",
|
|
121
|
+
" const users = await listUsers();",
|
|
122
|
+
" console.log(users);",
|
|
123
|
+
"",
|
|
124
|
+
" console.log('\\n--- Get User 1 ---');",
|
|
125
|
+
" const user = await getUser(1);",
|
|
126
|
+
" console.log('User name:', user.name); // undefined! Bug: extra nesting",
|
|
127
|
+
" console.log('User email:', user.email); // undefined!",
|
|
128
|
+
" console.log('Raw response:', JSON.stringify(user));",
|
|
129
|
+
"",
|
|
130
|
+
" console.log('\\n--- Get User 999 (not found) ---');",
|
|
131
|
+
" const missing = await getUser(999);",
|
|
132
|
+
" console.log('Missing user:', JSON.stringify(missing)); // No 404, gets 200 with undefined",
|
|
133
|
+
"}",
|
|
134
|
+
"",
|
|
135
|
+
"main().catch(console.error);",
|
|
136
|
+
"",
|
|
137
|
+
];
|
|
138
|
+
return lines.join("\n");
|
|
139
|
+
}
|
|
140
|
+
export function demoPackageJson(name, deps) {
|
|
141
|
+
const pkg = {
|
|
142
|
+
name,
|
|
143
|
+
version: "1.0.0",
|
|
144
|
+
private: true,
|
|
145
|
+
dependencies: deps,
|
|
146
|
+
};
|
|
147
|
+
return JSON.stringify(pkg, null, 2) + "\n";
|
|
148
|
+
}
|
|
149
|
+
export function demoBackendClaudeMd() {
|
|
150
|
+
return `# Cogent Backend - API Server
|
|
151
|
+
|
|
152
|
+
You are the Backend development team working on an Express.js API server.
|
|
153
|
+
|
|
154
|
+
## Project
|
|
155
|
+
- Express.js REST API running on port 3001
|
|
156
|
+
- Entry point: server.js
|
|
157
|
+
|
|
158
|
+
${claudeMdBridgeSection("backend", "Cogent_Backend", "frontend")}
|
|
159
|
+
### Bug Fix Protocol
|
|
160
|
+
- When you receive a bug report, read server.js and investigate
|
|
161
|
+
- Fix the issue, then notify the reporter with details of what changed
|
|
162
|
+
- Include file names and line numbers in your response
|
|
163
|
+
- After fixing, tell the other peer exactly how to test the fix
|
|
164
|
+
`;
|
|
165
|
+
}
|
|
166
|
+
export function demoFrontendClaudeMd() {
|
|
167
|
+
return `# Cogent Frontend - Web Client
|
|
168
|
+
|
|
169
|
+
You are the Frontend development team consuming the Backend API.
|
|
170
|
+
|
|
171
|
+
## Project
|
|
172
|
+
- Node.js client consuming REST API at http://localhost:3001
|
|
173
|
+
- Entry point: app.js
|
|
174
|
+
|
|
175
|
+
${claudeMdBridgeSection("frontend", "Cogent_Frontend", "backend")}
|
|
176
|
+
### Bug Reporting Protocol
|
|
177
|
+
- When reporting bugs, include: endpoint, expected behavior, actual behavior, and reproduction steps
|
|
178
|
+
- When confirming fixes, actually run \`node app.js\` and report results
|
|
179
|
+
- If the fix works, confirm success. If not, describe what's still broken.
|
|
180
|
+
`;
|
|
181
|
+
}
|
|
182
|
+
//# sourceMappingURL=templates.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/wizard/templates.ts"],"names":[],"mappings":"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"}
|