@bbyqtbean/taco-helper 0.1.2 → 0.2.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/dist/auto-inject.d.ts +17 -0
- package/dist/auto-inject.d.ts.map +1 -0
- package/dist/auto-inject.js +88 -0
- package/dist/auto-inject.js.map +1 -0
- package/dist/cli.d.ts +3 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +45 -2
- package/dist/cli.js.map +1 -1
- package/dist/daemon.d.ts +14 -0
- package/dist/daemon.d.ts.map +1 -0
- package/dist/daemon.js +211 -0
- package/dist/daemon.js.map +1 -0
- package/dist/index.d.ts +15 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +27 -16
- package/dist/index.js.map +1 -1
- package/dist/ipc-server.d.ts +31 -0
- package/dist/ipc-server.d.ts.map +1 -0
- package/dist/ipc-server.js +208 -0
- package/dist/ipc-server.js.map +1 -0
- package/dist/ipc.d.ts +55 -0
- package/dist/ipc.d.ts.map +1 -0
- package/dist/ipc.js +43 -0
- package/dist/ipc.js.map +1 -0
- package/dist/launchd.d.ts +23 -0
- package/dist/launchd.d.ts.map +1 -0
- package/dist/launchd.js +102 -0
- package/dist/launchd.js.map +1 -0
- package/dist/mcp-server.js +1 -1
- package/dist/mcp-shim.d.ts +15 -0
- package/dist/mcp-shim.d.ts.map +1 -0
- package/dist/mcp-shim.js +477 -0
- package/dist/mcp-shim.js.map +1 -0
- package/dist/project-registry.d.ts +43 -0
- package/dist/project-registry.d.ts.map +1 -0
- package/dist/project-registry.js +87 -0
- package/dist/project-registry.js.map +1 -0
- package/dist/sqlite-store.d.ts +77 -0
- package/dist/sqlite-store.d.ts.map +1 -0
- package/dist/sqlite-store.js +139 -0
- package/dist/sqlite-store.js.map +1 -0
- package/package.json +4 -2
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auto-Injection — automatic MCP config + rules file injection.
|
|
3
|
+
*
|
|
4
|
+
* After the first project is set up, the daemon watches for new workspaces
|
|
5
|
+
* and silently injects taco MCP config + rules files into each one.
|
|
6
|
+
*
|
|
7
|
+
* Reads agent choice from ~/.taco/config.json.
|
|
8
|
+
*
|
|
9
|
+
* See: daemon-mcp-strategy.md §Auto-Injection
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* Start watching for new workspaces.
|
|
13
|
+
* Currently scans common project directories on startup.
|
|
14
|
+
* Future: watch agent workspace history files for new entries.
|
|
15
|
+
*/
|
|
16
|
+
export declare function startAutoInjection(): void;
|
|
17
|
+
//# sourceMappingURL=auto-inject.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auto-inject.d.ts","sourceRoot":"","sources":["../src/auto-inject.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAgDH;;;;GAIG;AACH,wBAAgB,kBAAkB,IAAI,IAAI,CA4BzC"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auto-Injection — automatic MCP config + rules file injection.
|
|
3
|
+
*
|
|
4
|
+
* After the first project is set up, the daemon watches for new workspaces
|
|
5
|
+
* and silently injects taco MCP config + rules files into each one.
|
|
6
|
+
*
|
|
7
|
+
* Reads agent choice from ~/.taco/config.json.
|
|
8
|
+
*
|
|
9
|
+
* See: daemon-mcp-strategy.md §Auto-Injection
|
|
10
|
+
*/
|
|
11
|
+
import { existsSync, readFileSync, watch } from 'fs';
|
|
12
|
+
import { join } from 'path';
|
|
13
|
+
import { TACO_DIR } from './sqlite-store.js';
|
|
14
|
+
import { getAgent } from './agents/index.js';
|
|
15
|
+
import { writeConfig, checkConfig } from './agents/config-writer.js';
|
|
16
|
+
/** Read the agent choice from ~/.taco/config.json */
|
|
17
|
+
function getConfiguredAgent() {
|
|
18
|
+
try {
|
|
19
|
+
const configPath = join(TACO_DIR, 'config.json');
|
|
20
|
+
if (!existsSync(configPath))
|
|
21
|
+
return null;
|
|
22
|
+
const config = JSON.parse(readFileSync(configPath, 'utf-8'));
|
|
23
|
+
return config.agent ?? null;
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Try to inject MCP config + rules into a workspace directory.
|
|
31
|
+
* Returns true if config was written, false if already configured or failed.
|
|
32
|
+
*/
|
|
33
|
+
async function injectIntoWorkspace(workspacePath, agentId) {
|
|
34
|
+
const agent = getAgent(agentId);
|
|
35
|
+
if (!agent)
|
|
36
|
+
return false;
|
|
37
|
+
// Check if already configured for this workspace
|
|
38
|
+
const alreadyConfigured = await checkConfig(agent);
|
|
39
|
+
if (alreadyConfigured)
|
|
40
|
+
return false;
|
|
41
|
+
try {
|
|
42
|
+
// writeConfig writes to the project-level MCP config relative to CWD
|
|
43
|
+
// We need to be in the workspace dir for this to work
|
|
44
|
+
const origCwd = process.cwd();
|
|
45
|
+
process.chdir(workspacePath);
|
|
46
|
+
await writeConfig(agent);
|
|
47
|
+
process.chdir(origCwd);
|
|
48
|
+
console.error(`🌮 [Auto-Inject] Injected config into ${workspacePath}`);
|
|
49
|
+
return true;
|
|
50
|
+
}
|
|
51
|
+
catch (err) {
|
|
52
|
+
console.error(`🌮 [Auto-Inject] Failed to inject into ${workspacePath}: ${err.message}`);
|
|
53
|
+
return false;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Start watching for new workspaces.
|
|
58
|
+
* Currently scans common project directories on startup.
|
|
59
|
+
* Future: watch agent workspace history files for new entries.
|
|
60
|
+
*/
|
|
61
|
+
export function startAutoInjection() {
|
|
62
|
+
const agentId = getConfiguredAgent();
|
|
63
|
+
if (!agentId) {
|
|
64
|
+
console.error('🌮 [Auto-Inject] No agent configured in ~/.taco/config.json — skipping');
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
console.error(`🌮 [Auto-Inject] Active for agent: ${agentId}`);
|
|
68
|
+
// Watch the config file for agent changes
|
|
69
|
+
const configPath = join(TACO_DIR, 'config.json');
|
|
70
|
+
if (existsSync(configPath)) {
|
|
71
|
+
try {
|
|
72
|
+
watch(configPath, () => {
|
|
73
|
+
const newAgent = getConfiguredAgent();
|
|
74
|
+
if (newAgent && newAgent !== agentId) {
|
|
75
|
+
console.error(`🌮 [Auto-Inject] Agent changed to: ${newAgent}`);
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
// watch not supported on some systems — non-critical
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
// Note: full workspace discovery (scanning agent workspace history files)
|
|
84
|
+
// is planned but not yet implemented. For now, auto-injection is triggered
|
|
85
|
+
// by the daemon when a shim connects from an unregistered workspace.
|
|
86
|
+
console.error('🌮 [Auto-Inject] Listening for new workspace connections');
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=auto-inject.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auto-inject.js","sourceRoot":"","sources":["../src/auto-inject.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,KAAK,EAAyB,MAAM,IAAI,CAAC;AAC5E,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAErE,qDAAqD;AACrD,SAAS,kBAAkB;IACvB,IAAI,CAAC;QACD,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;QACjD,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;YAAE,OAAO,IAAI,CAAC;QACzC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;QAC7D,OAAO,MAAM,CAAC,KAAK,IAAI,IAAI,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,IAAI,CAAC;IAChB,CAAC;AACL,CAAC;AAED;;;GAGG;AACH,KAAK,UAAU,mBAAmB,CAAC,aAAqB,EAAE,OAAe;IACrE,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;IAChC,IAAI,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC;IAEzB,iDAAiD;IACjD,MAAM,iBAAiB,GAAG,MAAM,WAAW,CAAC,KAAK,CAAC,CAAC;IACnD,IAAI,iBAAiB;QAAE,OAAO,KAAK,CAAC;IAEpC,IAAI,CAAC;QACD,qEAAqE;QACrE,sDAAsD;QACtD,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;QAC9B,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QAC7B,MAAM,WAAW,CAAC,KAAK,CAAC,CAAC;QACzB,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAEvB,OAAO,CAAC,KAAK,CAAC,yCAAyC,aAAa,EAAE,CAAC,CAAC;QACxE,OAAO,IAAI,CAAC;IAChB,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAChB,OAAO,CAAC,KAAK,CAAC,0CAA0C,aAAa,KAAK,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QACzF,OAAO,KAAK,CAAC;IACjB,CAAC;AACL,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,kBAAkB;IAC9B,MAAM,OAAO,GAAG,kBAAkB,EAAE,CAAC;IACrC,IAAI,CAAC,OAAO,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,wEAAwE,CAAC,CAAC;QACxF,OAAO;IACX,CAAC;IAED,OAAO,CAAC,KAAK,CAAC,sCAAsC,OAAO,EAAE,CAAC,CAAC;IAE/D,0CAA0C;IAC1C,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;IACjD,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QACzB,IAAI,CAAC;YACD,KAAK,CAAC,UAAU,EAAE,GAAG,EAAE;gBACnB,MAAM,QAAQ,GAAG,kBAAkB,EAAE,CAAC;gBACtC,IAAI,QAAQ,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;oBACnC,OAAO,CAAC,KAAK,CAAC,sCAAsC,QAAQ,EAAE,CAAC,CAAC;gBACpE,CAAC;YACL,CAAC,CAAC,CAAC;QACP,CAAC;QAAC,MAAM,CAAC;YACL,qDAAqD;QACzD,CAAC;IACL,CAAC;IAED,0EAA0E;IAC1E,2EAA2E;IAC3E,qEAAqE;IACrE,OAAO,CAAC,KAAK,CAAC,0DAA0D,CAAC,CAAC;AAC9E,CAAC"}
|
package/dist/cli.d.ts
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* CLI commands — setup and
|
|
2
|
+
* CLI commands — setup, uninstall, and status.
|
|
3
3
|
* These are run by the user directly via npx.
|
|
4
|
+
*
|
|
5
|
+
* See: taco-helper-package-spec.md §CLI, daemon-mcp-strategy.md §First Boot
|
|
4
6
|
*/
|
|
5
7
|
export declare function runSetup(args: string[]): Promise<void>;
|
|
6
8
|
export declare function runUninstall(args: string[]): Promise<void>;
|
package/dist/cli.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAUH,wBAAsB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAgE5D;AAED,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAsChE;AAED,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA8B7D"}
|
package/dist/cli.js
CHANGED
|
@@ -1,9 +1,16 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* CLI commands — setup and
|
|
2
|
+
* CLI commands — setup, uninstall, and status.
|
|
3
3
|
* These are run by the user directly via npx.
|
|
4
|
+
*
|
|
5
|
+
* See: taco-helper-package-spec.md §CLI, daemon-mcp-strategy.md §First Boot
|
|
4
6
|
*/
|
|
5
7
|
import { getAgent, listAgentIds } from './agents/index.js';
|
|
6
8
|
import { writeConfig, removeConfig, cleanRulesFile, checkConfig } from './agents/config-writer.js';
|
|
9
|
+
import { registerLaunchd } from './launchd.js';
|
|
10
|
+
import { TACO_DIR } from './sqlite-store.js';
|
|
11
|
+
import { spawn } from 'child_process';
|
|
12
|
+
import { writeFileSync, mkdirSync, existsSync } from 'fs';
|
|
13
|
+
import { join } from 'path';
|
|
7
14
|
export async function runSetup(args) {
|
|
8
15
|
const agentId = getArgValue(args, '--agent');
|
|
9
16
|
if (!agentId) {
|
|
@@ -18,16 +25,52 @@ export async function runSetup(args) {
|
|
|
18
25
|
process.exit(1);
|
|
19
26
|
}
|
|
20
27
|
console.log(`\n🌮 Setting up Taco for ${agent.name}...\n`);
|
|
28
|
+
// Step 1: Write MCP config + rules file into the project (project level)
|
|
21
29
|
try {
|
|
22
30
|
await writeConfig(agent);
|
|
23
31
|
console.log(`✅ Taco has been added to ${agent.name}'s MCP config.`);
|
|
24
32
|
console.log(` Config file: ${agent.configPath}`);
|
|
25
|
-
console.log(`\n👉 Restart ${agent.name} to activate the connection.\n`);
|
|
26
33
|
}
|
|
27
34
|
catch (err) {
|
|
28
35
|
console.error(`❌ Failed to write config:`, err);
|
|
29
36
|
process.exit(1);
|
|
30
37
|
}
|
|
38
|
+
// Step 2: Write Taco Platform Config (~/.taco/config.json) with agent choice
|
|
39
|
+
try {
|
|
40
|
+
if (!existsSync(TACO_DIR)) {
|
|
41
|
+
mkdirSync(TACO_DIR, { recursive: true });
|
|
42
|
+
}
|
|
43
|
+
const configPath = join(TACO_DIR, 'config.json');
|
|
44
|
+
writeFileSync(configPath, JSON.stringify({ agent: agentId }, null, 2), 'utf-8');
|
|
45
|
+
console.log(`✅ Taco platform config written.`);
|
|
46
|
+
console.log(` Config file: ${configPath}`);
|
|
47
|
+
}
|
|
48
|
+
catch (err) {
|
|
49
|
+
console.error(`⚠️ Failed to write platform config:`, err);
|
|
50
|
+
}
|
|
51
|
+
// Step 3: Start the daemon as a detached process
|
|
52
|
+
try {
|
|
53
|
+
const child = spawn('node', [join(import.meta.dirname, 'index.js'), 'daemon'], {
|
|
54
|
+
detached: true,
|
|
55
|
+
stdio: 'ignore',
|
|
56
|
+
cwd: TACO_DIR,
|
|
57
|
+
});
|
|
58
|
+
child.unref();
|
|
59
|
+
console.log(`✅ Taco daemon started.`);
|
|
60
|
+
}
|
|
61
|
+
catch (err) {
|
|
62
|
+
console.error(`⚠️ Failed to start daemon:`, err);
|
|
63
|
+
console.error(` You can start it manually: npx -y @bbyqtbean/taco-helper@latest daemon`);
|
|
64
|
+
}
|
|
65
|
+
// Step 4: Register with launchd for persistence
|
|
66
|
+
try {
|
|
67
|
+
registerLaunchd();
|
|
68
|
+
console.log(`✅ Daemon registered with launchd (auto-starts on login).`);
|
|
69
|
+
}
|
|
70
|
+
catch (err) {
|
|
71
|
+
console.error(`⚠️ Failed to register with launchd:`, err);
|
|
72
|
+
}
|
|
73
|
+
console.log(`\n👉 Restart ${agent.name} to activate the connection.\n`);
|
|
31
74
|
}
|
|
32
75
|
export async function runUninstall(args) {
|
|
33
76
|
const agentId = getArgValue(args, '--agent');
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/daemon.d.ts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Daemon — persistent background process.
|
|
3
|
+
*
|
|
4
|
+
* The global singleton that owns port 7867, stores comments in SQLite,
|
|
5
|
+
* manages the project registry, and serves the HTTP API for the Chrome extension.
|
|
6
|
+
*
|
|
7
|
+
* See: daemon-mcp-strategy.md §1 (Global Daemon)
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Start the daemon.
|
|
11
|
+
* This is the main entry point for `npx taco-helper daemon`.
|
|
12
|
+
*/
|
|
13
|
+
export declare function startDaemon(): Promise<void>;
|
|
14
|
+
//# sourceMappingURL=daemon.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"daemon.d.ts","sourceRoot":"","sources":["../src/daemon.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AA4DH;;;GAGG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CA6KjD"}
|
package/dist/daemon.js
ADDED
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Daemon — persistent background process.
|
|
3
|
+
*
|
|
4
|
+
* The global singleton that owns port 7867, stores comments in SQLite,
|
|
5
|
+
* manages the project registry, and serves the HTTP API for the Chrome extension.
|
|
6
|
+
*
|
|
7
|
+
* See: daemon-mcp-strategy.md §1 (Global Daemon)
|
|
8
|
+
*/
|
|
9
|
+
import { createServer } from 'http';
|
|
10
|
+
import { readFile } from 'fs/promises';
|
|
11
|
+
import { join } from 'path';
|
|
12
|
+
import { SqliteStore, TACO_DIR } from './sqlite-store.js';
|
|
13
|
+
import { startIpcServer } from './ipc-server.js';
|
|
14
|
+
import { startAutoInjection } from './auto-inject.js';
|
|
15
|
+
import { getAgent } from './agents/index.js';
|
|
16
|
+
import { removeConfig, cleanRulesFile } from './agents/config-writer.js';
|
|
17
|
+
const PORT = 7867;
|
|
18
|
+
/** Active SSE connections */
|
|
19
|
+
const sseClients = new Set();
|
|
20
|
+
/** Read the full request body as a string. */
|
|
21
|
+
function readBody(req) {
|
|
22
|
+
return new Promise((resolve, reject) => {
|
|
23
|
+
const chunks = [];
|
|
24
|
+
req.on('data', (chunk) => chunks.push(chunk));
|
|
25
|
+
req.on('end', () => resolve(Buffer.concat(chunks).toString('utf-8')));
|
|
26
|
+
req.on('error', reject);
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
/** Send a JSON response with CORS headers. */
|
|
30
|
+
function json(res, status, data) {
|
|
31
|
+
res.writeHead(status, {
|
|
32
|
+
'Content-Type': 'application/json',
|
|
33
|
+
'Access-Control-Allow-Origin': '*',
|
|
34
|
+
'Access-Control-Allow-Methods': 'GET, POST, OPTIONS',
|
|
35
|
+
'Access-Control-Allow-Headers': 'Content-Type',
|
|
36
|
+
});
|
|
37
|
+
res.end(JSON.stringify(data));
|
|
38
|
+
}
|
|
39
|
+
/** Handle CORS preflight. Returns true if this was a preflight request. */
|
|
40
|
+
function handleCors(req, res) {
|
|
41
|
+
if (req.method === 'OPTIONS') {
|
|
42
|
+
res.writeHead(204, {
|
|
43
|
+
'Access-Control-Allow-Origin': '*',
|
|
44
|
+
'Access-Control-Allow-Methods': 'GET, POST, OPTIONS',
|
|
45
|
+
'Access-Control-Allow-Headers': 'Content-Type',
|
|
46
|
+
});
|
|
47
|
+
res.end();
|
|
48
|
+
return true;
|
|
49
|
+
}
|
|
50
|
+
return false;
|
|
51
|
+
}
|
|
52
|
+
/** Broadcast an SSE event to all connected clients. */
|
|
53
|
+
function broadcastSSE(event, data) {
|
|
54
|
+
const message = `event: ${event}\ndata: ${JSON.stringify(data)}\n\n`;
|
|
55
|
+
for (const client of sseClients) {
|
|
56
|
+
client.write(message);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Start the daemon.
|
|
61
|
+
* This is the main entry point for `npx taco-helper daemon`.
|
|
62
|
+
*/
|
|
63
|
+
export async function startDaemon() {
|
|
64
|
+
console.error('🌮 Starting Taco daemon...');
|
|
65
|
+
// Open SQLite store
|
|
66
|
+
const store = new SqliteStore();
|
|
67
|
+
console.error(`🌮 Database: ${join(TACO_DIR, 'comments.db')}`);
|
|
68
|
+
// Wire store events → SSE broadcasts
|
|
69
|
+
store.on('comment-received', (payload) => {
|
|
70
|
+
console.error(`🌮 [SSE] Broadcasting comment-received: ${payload.id}`);
|
|
71
|
+
broadcastSSE('comment-received', payload);
|
|
72
|
+
});
|
|
73
|
+
store.on('comment-actioned', (payload) => {
|
|
74
|
+
console.error(`🌮 [SSE] Broadcasting comment-actioned: ${payload.id}`);
|
|
75
|
+
broadcastSSE('comment-actioned', payload);
|
|
76
|
+
});
|
|
77
|
+
store.on('comment-resolved', (payload) => {
|
|
78
|
+
console.error(`🌮 [SSE] Broadcasting comment-resolved: ${payload.id}`);
|
|
79
|
+
broadcastSSE('comment-resolved', payload);
|
|
80
|
+
});
|
|
81
|
+
// Create HTTP server
|
|
82
|
+
const server = createServer(async (req, res) => {
|
|
83
|
+
// Handle CORS preflight
|
|
84
|
+
if (handleCors(req, res))
|
|
85
|
+
return;
|
|
86
|
+
const url = req.url ?? '/';
|
|
87
|
+
const method = req.method ?? 'GET';
|
|
88
|
+
try {
|
|
89
|
+
// ── GET /health ──────────────────────────────────────────
|
|
90
|
+
if (url === '/health' && method === 'GET') {
|
|
91
|
+
let projectName = null;
|
|
92
|
+
try {
|
|
93
|
+
const pkgPath = join(process.cwd(), 'package.json');
|
|
94
|
+
const pkgContent = await readFile(pkgPath, 'utf-8');
|
|
95
|
+
const pkg = JSON.parse(pkgContent);
|
|
96
|
+
projectName = pkg.name || null;
|
|
97
|
+
}
|
|
98
|
+
catch {
|
|
99
|
+
// package.json not found — that's okay
|
|
100
|
+
}
|
|
101
|
+
json(res, 200, { status: 'ok', projectName });
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
// ── GET /events (SSE) ────────────────────────────────────
|
|
105
|
+
if (url === '/events' && method === 'GET') {
|
|
106
|
+
res.writeHead(200, {
|
|
107
|
+
'Content-Type': 'text/event-stream',
|
|
108
|
+
'Cache-Control': 'no-cache',
|
|
109
|
+
'Connection': 'keep-alive',
|
|
110
|
+
'Access-Control-Allow-Origin': '*',
|
|
111
|
+
});
|
|
112
|
+
// Send initial connected event
|
|
113
|
+
res.write(`event: connected\ndata: {}\n\n`);
|
|
114
|
+
// Add to active clients
|
|
115
|
+
sseClients.add(res);
|
|
116
|
+
console.error(`🌮 [SSE] Client connected (${sseClients.size} active)`);
|
|
117
|
+
// Remove on disconnect
|
|
118
|
+
req.on('close', () => {
|
|
119
|
+
sseClients.delete(res);
|
|
120
|
+
console.error(`🌮 [SSE] Client disconnected (${sseClients.size} active)`);
|
|
121
|
+
});
|
|
122
|
+
// Keep connection alive with periodic heartbeat
|
|
123
|
+
const heartbeat = setInterval(() => {
|
|
124
|
+
res.write(`: heartbeat\n\n`);
|
|
125
|
+
}, 30_000);
|
|
126
|
+
req.on('close', () => clearInterval(heartbeat));
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
// ── POST /comment ────────────────────────────────────────
|
|
130
|
+
if (url === '/comment' && method === 'POST') {
|
|
131
|
+
const body = await readBody(req);
|
|
132
|
+
const comments = JSON.parse(body);
|
|
133
|
+
// Accept both single comment and array
|
|
134
|
+
const arr = Array.isArray(comments) ? comments : [comments];
|
|
135
|
+
const count = store.addComments(arr);
|
|
136
|
+
console.error(`🌮 Received ${count} comment(s)`);
|
|
137
|
+
json(res, 200, { received: count });
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
// ── POST /uninstall ──────────────────────────────────────
|
|
141
|
+
if (url === '/uninstall' && method === 'POST') {
|
|
142
|
+
const body = await readBody(req);
|
|
143
|
+
const { agent_id } = JSON.parse(body);
|
|
144
|
+
const agent = getAgent(agent_id);
|
|
145
|
+
if (!agent) {
|
|
146
|
+
json(res, 400, { error: `Unknown agent: "${agent_id}"` });
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
console.error(`🌮 Uninstalling Taco from ${agent.name}...`);
|
|
150
|
+
const removed = [];
|
|
151
|
+
try {
|
|
152
|
+
const configRemoved = await removeConfig(agent);
|
|
153
|
+
if (configRemoved)
|
|
154
|
+
removed.push('mcp_config');
|
|
155
|
+
}
|
|
156
|
+
catch (err) {
|
|
157
|
+
console.error(`⚠️ Failed to remove MCP config:`, err);
|
|
158
|
+
}
|
|
159
|
+
try {
|
|
160
|
+
const rulesRemoved = await cleanRulesFile(agent, process.cwd());
|
|
161
|
+
if (rulesRemoved)
|
|
162
|
+
removed.push('rules_file');
|
|
163
|
+
}
|
|
164
|
+
catch (err) {
|
|
165
|
+
console.error(`⚠️ Failed to clean rules file:`, err);
|
|
166
|
+
}
|
|
167
|
+
json(res, 200, { success: true, removed });
|
|
168
|
+
console.error('🌮 Uninstall completed.');
|
|
169
|
+
// Shut down after flushing the response
|
|
170
|
+
setTimeout(() => {
|
|
171
|
+
console.error('🌮 Daemon shutting down after uninstall.');
|
|
172
|
+
store.close();
|
|
173
|
+
process.exit(0);
|
|
174
|
+
}, 500);
|
|
175
|
+
return;
|
|
176
|
+
}
|
|
177
|
+
// ── 404 ──────────────────────────────────────────────────
|
|
178
|
+
json(res, 404, { error: 'Not found' });
|
|
179
|
+
}
|
|
180
|
+
catch (err) {
|
|
181
|
+
console.error('🌮 HTTP error:', err);
|
|
182
|
+
json(res, 500, { error: 'Internal server error' });
|
|
183
|
+
}
|
|
184
|
+
});
|
|
185
|
+
server.listen(PORT, '127.0.0.1', () => {
|
|
186
|
+
console.error(`🌮 Daemon HTTP server listening on http://127.0.0.1:${PORT}`);
|
|
187
|
+
});
|
|
188
|
+
server.on('error', (err) => {
|
|
189
|
+
if (err.code === 'EADDRINUSE') {
|
|
190
|
+
console.error(`❌ Port ${PORT} already in use. Another daemon may be running.`);
|
|
191
|
+
process.exit(1);
|
|
192
|
+
}
|
|
193
|
+
throw err;
|
|
194
|
+
});
|
|
195
|
+
// Start Unix socket IPC server for MCP shims
|
|
196
|
+
const ipcServer = startIpcServer(store, broadcastSSE);
|
|
197
|
+
// Start auto-injection watcher
|
|
198
|
+
startAutoInjection();
|
|
199
|
+
// Graceful shutdown
|
|
200
|
+
const shutdown = () => {
|
|
201
|
+
console.error('🌮 Daemon shutting down...');
|
|
202
|
+
store.close();
|
|
203
|
+
server.close();
|
|
204
|
+
ipcServer.close();
|
|
205
|
+
process.exit(0);
|
|
206
|
+
};
|
|
207
|
+
process.on('SIGINT', shutdown);
|
|
208
|
+
process.on('SIGTERM', shutdown);
|
|
209
|
+
console.error('🌮 Taco daemon is running. Press Ctrl+C to stop.');
|
|
210
|
+
}
|
|
211
|
+
//# sourceMappingURL=daemon.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"daemon.js","sourceRoot":"","sources":["../src/daemon.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -2,15 +2,24 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* taco-helper — entry point.
|
|
4
4
|
*
|
|
5
|
-
*
|
|
5
|
+
* Routes to the correct mode based on the subcommand:
|
|
6
6
|
*
|
|
7
7
|
* CLI mode (user runs manually):
|
|
8
|
-
* npx taco-helper setup --agent
|
|
9
|
-
* npx taco-helper uninstall --agent
|
|
8
|
+
* npx taco-helper setup --agent antigravity
|
|
9
|
+
* npx taco-helper uninstall --agent antigravity
|
|
10
|
+
* npx taco-helper status --agent antigravity
|
|
10
11
|
*
|
|
11
|
-
*
|
|
12
|
-
* npx taco-helper
|
|
13
|
-
* → starts
|
|
12
|
+
* Daemon mode (persistent background process):
|
|
13
|
+
* npx taco-helper daemon
|
|
14
|
+
* → starts HTTP server on :7867, SQLite, Unix socket
|
|
15
|
+
*
|
|
16
|
+
* MCP shim mode (spawned per workspace by the agent):
|
|
17
|
+
* npx taco-helper mcp
|
|
18
|
+
* → starts MCP stdio transport, proxies to daemon
|
|
19
|
+
*
|
|
20
|
+
* Default (no subcommand) → daemon mode (for launchd plist)
|
|
21
|
+
*
|
|
22
|
+
* See: taco-helper-package-spec.md §Entry Point Logic
|
|
14
23
|
*/
|
|
15
24
|
export {};
|
|
16
25
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;;;;;;;;;;;;GAqBG"}
|
package/dist/index.js
CHANGED
|
@@ -2,20 +2,28 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* taco-helper — entry point.
|
|
4
4
|
*
|
|
5
|
-
*
|
|
5
|
+
* Routes to the correct mode based on the subcommand:
|
|
6
6
|
*
|
|
7
7
|
* CLI mode (user runs manually):
|
|
8
|
-
* npx taco-helper setup --agent
|
|
9
|
-
* npx taco-helper uninstall --agent
|
|
8
|
+
* npx taco-helper setup --agent antigravity
|
|
9
|
+
* npx taco-helper uninstall --agent antigravity
|
|
10
|
+
* npx taco-helper status --agent antigravity
|
|
10
11
|
*
|
|
11
|
-
*
|
|
12
|
-
* npx taco-helper
|
|
13
|
-
* → starts
|
|
12
|
+
* Daemon mode (persistent background process):
|
|
13
|
+
* npx taco-helper daemon
|
|
14
|
+
* → starts HTTP server on :7867, SQLite, Unix socket
|
|
15
|
+
*
|
|
16
|
+
* MCP shim mode (spawned per workspace by the agent):
|
|
17
|
+
* npx taco-helper mcp
|
|
18
|
+
* → starts MCP stdio transport, proxies to daemon
|
|
19
|
+
*
|
|
20
|
+
* Default (no subcommand) → daemon mode (for launchd plist)
|
|
21
|
+
*
|
|
22
|
+
* See: taco-helper-package-spec.md §Entry Point Logic
|
|
14
23
|
*/
|
|
15
24
|
import { runSetup, runUninstall, runStatus } from './cli.js';
|
|
16
|
-
import {
|
|
17
|
-
import {
|
|
18
|
-
import { startMcpServer } from './mcp-server.js';
|
|
25
|
+
import { startDaemon } from './daemon.js';
|
|
26
|
+
import { startMcpShim } from './mcp-shim.js';
|
|
19
27
|
const command = process.argv[2];
|
|
20
28
|
if (command === 'setup') {
|
|
21
29
|
// CLI mode: write MCP config and exit
|
|
@@ -29,13 +37,16 @@ else if (command === 'status') {
|
|
|
29
37
|
// CLI mode: check if taco is installed (read-only)
|
|
30
38
|
await runStatus(process.argv.slice(2));
|
|
31
39
|
}
|
|
40
|
+
else if (command === 'daemon') {
|
|
41
|
+
// Daemon mode: persistent background process
|
|
42
|
+
await startDaemon();
|
|
43
|
+
}
|
|
44
|
+
else if (command === 'mcp') {
|
|
45
|
+
// MCP shim mode: proxy tool calls to daemon
|
|
46
|
+
await startMcpShim();
|
|
47
|
+
}
|
|
32
48
|
else {
|
|
33
|
-
//
|
|
34
|
-
|
|
35
|
-
// Start the HTTP server (for the Chrome extension)
|
|
36
|
-
startHttpServer(store);
|
|
37
|
-
// Start the MCP server on stdio (for the agent)
|
|
38
|
-
await startMcpServer(store);
|
|
39
|
-
console.error('🌮 Taco Helper is running. Press Ctrl+C to stop.');
|
|
49
|
+
// Default: daemon mode (for launchd plist)
|
|
50
|
+
await startDaemon();
|
|
40
51
|
}
|
|
41
52
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7C,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAEhC,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC;IACtB,sCAAsC;IACtC,MAAM,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AAC1C,CAAC;KAAM,IAAI,OAAO,KAAK,WAAW,EAAE,CAAC;IACjC,uCAAuC;IACvC,MAAM,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AAC9C,CAAC;KAAM,IAAI,OAAO,KAAK,QAAQ,EAAE,CAAC;IAC9B,mDAAmD;IACnD,MAAM,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AAC3C,CAAC;KAAM,IAAI,OAAO,KAAK,QAAQ,EAAE,CAAC;IAC9B,6CAA6C;IAC7C,MAAM,WAAW,EAAE,CAAC;AACxB,CAAC;KAAM,IAAI,OAAO,KAAK,KAAK,EAAE,CAAC;IAC3B,4CAA4C;IAC5C,MAAM,YAAY,EAAE,CAAC;AACzB,CAAC;KAAM,CAAC;IACJ,2CAA2C;IAC3C,MAAM,WAAW,EAAE,CAAC;AACxB,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* IPC server — Unix socket interface for MCP shims.
|
|
3
|
+
*
|
|
4
|
+
* The daemon listens on ~/.taco/daemon.sock.
|
|
5
|
+
* Each shim connects, registers its CWD, and proxies tool calls.
|
|
6
|
+
*
|
|
7
|
+
* Protocol: newline-delimited JSON.
|
|
8
|
+
*
|
|
9
|
+
* See: daemon-mcp-strategy.md §IPC Protocol
|
|
10
|
+
*/
|
|
11
|
+
import { Server } from 'net';
|
|
12
|
+
import { SqliteStore } from './sqlite-store.js';
|
|
13
|
+
/**
|
|
14
|
+
* Start the IPC server on the Unix socket.
|
|
15
|
+
* Returns the server instance for cleanup.
|
|
16
|
+
*/
|
|
17
|
+
export declare function startIpcServer(store: SqliteStore, onBroadcast: (event: string, data: Record<string, unknown>) => void): Server;
|
|
18
|
+
/**
|
|
19
|
+
* Send a message to a specific shim by shimId.
|
|
20
|
+
* Used for daemon-initiated messages (e.g. sampling trigger).
|
|
21
|
+
*/
|
|
22
|
+
export declare function sendToShim(shimId: string, message: Record<string, unknown>): boolean;
|
|
23
|
+
/**
|
|
24
|
+
* Send a message to all connected shims.
|
|
25
|
+
*/
|
|
26
|
+
export declare function broadcastToShims(message: Record<string, unknown>): void;
|
|
27
|
+
/**
|
|
28
|
+
* Get a list of all connected shim IDs.
|
|
29
|
+
*/
|
|
30
|
+
export declare function getConnectedShims(): string[];
|
|
31
|
+
//# sourceMappingURL=ipc-server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ipc-server.d.ts","sourceRoot":"","sources":["../src/ipc-server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAgB,MAAM,EAAU,MAAM,KAAK,CAAC;AAInD,OAAO,EAAE,WAAW,EAAY,MAAM,mBAAmB,CAAC;AAuJ1D;;;GAGG;AACH,wBAAgB,cAAc,CAC1B,KAAK,EAAE,WAAW,EAClB,WAAW,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,GACpE,MAAM,CAmDR;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAKpF;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAKvE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,EAAE,CAE5C"}
|