@proletariat/cli 0.3.57 → 0.3.59

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 (219) hide show
  1. package/dist/commands/{spec/view.d.ts → dashboard/index.d.ts} +4 -6
  2. package/dist/commands/dashboard/index.js +117 -0
  3. package/dist/commands/dashboard/index.js.map +1 -0
  4. package/dist/commands/execution/config.js +5 -4
  5. package/dist/commands/execution/config.js.map +1 -1
  6. package/dist/commands/execution/stop.js +4 -2
  7. package/dist/commands/execution/stop.js.map +1 -1
  8. package/dist/commands/execution/view.js +3 -0
  9. package/dist/commands/execution/view.js.map +1 -1
  10. package/dist/commands/init.d.ts +1 -0
  11. package/dist/commands/init.js +40 -3
  12. package/dist/commands/init.js.map +1 -1
  13. package/dist/commands/mcp-server.js +1 -2
  14. package/dist/commands/mcp-server.js.map +1 -1
  15. package/dist/commands/media/add.d.ts +19 -0
  16. package/dist/commands/media/add.js +94 -0
  17. package/dist/commands/media/add.js.map +1 -0
  18. package/dist/commands/{spec → media}/index.d.ts +1 -1
  19. package/dist/commands/media/index.js +85 -0
  20. package/dist/commands/media/index.js.map +1 -0
  21. package/dist/commands/{spec/link/remove.d.ts → media/list.d.ts} +3 -6
  22. package/dist/commands/media/list.js +89 -0
  23. package/dist/commands/media/list.js.map +1 -0
  24. package/dist/commands/media/preprocess.d.ts +19 -0
  25. package/dist/commands/media/preprocess.js +91 -0
  26. package/dist/commands/media/preprocess.js.map +1 -0
  27. package/dist/commands/{spec/delete.d.ts → media/remove.d.ts} +2 -2
  28. package/dist/commands/media/remove.js +101 -0
  29. package/dist/commands/media/remove.js.map +1 -0
  30. package/dist/commands/{spec/link/index.d.ts → media/show.d.ts} +3 -3
  31. package/dist/commands/media/show.js +122 -0
  32. package/dist/commands/media/show.js.map +1 -0
  33. package/dist/commands/orchestrator/start.js +5 -0
  34. package/dist/commands/orchestrator/start.js.map +1 -1
  35. package/dist/commands/session/exec.d.ts +19 -0
  36. package/dist/commands/session/exec.js +205 -0
  37. package/dist/commands/session/exec.js.map +1 -0
  38. package/dist/commands/session/index.js +12 -0
  39. package/dist/commands/session/index.js.map +1 -1
  40. package/dist/commands/{spec/link/depends.d.ts → session/inspect.d.ts} +4 -4
  41. package/dist/commands/session/inspect.js +316 -0
  42. package/dist/commands/session/inspect.js.map +1 -0
  43. package/dist/commands/session/peek.d.ts +15 -0
  44. package/dist/commands/session/peek.js +141 -8
  45. package/dist/commands/session/peek.js.map +1 -1
  46. package/dist/commands/session/poke.d.ts +4 -1
  47. package/dist/commands/session/poke.js +175 -20
  48. package/dist/commands/session/poke.js.map +1 -1
  49. package/dist/commands/session/restart.d.ts +20 -0
  50. package/dist/commands/session/restart.js +320 -0
  51. package/dist/commands/session/restart.js.map +1 -0
  52. package/dist/commands/tools/add.d.ts +20 -0
  53. package/dist/commands/tools/add.js +129 -0
  54. package/dist/commands/tools/add.js.map +1 -0
  55. package/dist/commands/tools/check.d.ts +10 -0
  56. package/dist/commands/tools/check.js +75 -0
  57. package/dist/commands/tools/check.js.map +1 -0
  58. package/dist/commands/tools/detect.d.ts +11 -0
  59. package/dist/commands/tools/detect.js +107 -0
  60. package/dist/commands/tools/detect.js.map +1 -0
  61. package/dist/commands/tools/index.d.ts +11 -0
  62. package/dist/commands/tools/index.js +87 -0
  63. package/dist/commands/tools/index.js.map +1 -0
  64. package/dist/commands/tools/remove.d.ts +13 -0
  65. package/dist/commands/tools/remove.js +55 -0
  66. package/dist/commands/tools/remove.js.map +1 -0
  67. package/dist/commands/trello/configure.d.ts +16 -0
  68. package/dist/commands/trello/configure.js +259 -0
  69. package/dist/commands/trello/configure.js.map +1 -0
  70. package/dist/commands/{spec/plan.d.ts → trello/import.d.ts} +3 -5
  71. package/dist/commands/trello/import.js +241 -0
  72. package/dist/commands/trello/import.js.map +1 -0
  73. package/dist/commands/{spec/ticket.d.ts → trello/sync.d.ts} +5 -6
  74. package/dist/commands/trello/sync.js +190 -0
  75. package/dist/commands/trello/sync.js.map +1 -0
  76. package/dist/commands/work/start.d.ts +2 -0
  77. package/dist/commands/work/start.js +27 -41
  78. package/dist/commands/work/start.js.map +1 -1
  79. package/dist/lib/dashboard/data.d.ts +64 -0
  80. package/dist/lib/dashboard/data.js +259 -0
  81. package/dist/lib/dashboard/data.js.map +1 -0
  82. package/dist/lib/dashboard/html.d.ts +7 -0
  83. package/dist/lib/dashboard/html.js +682 -0
  84. package/dist/lib/dashboard/html.js.map +1 -0
  85. package/dist/lib/dashboard/server.d.ts +20 -0
  86. package/dist/lib/dashboard/server.js +114 -0
  87. package/dist/lib/dashboard/server.js.map +1 -0
  88. package/dist/lib/database/index.d.ts +49 -1
  89. package/dist/lib/database/index.js +127 -0
  90. package/dist/lib/database/index.js.map +1 -1
  91. package/dist/lib/execution/config.d.ts +8 -0
  92. package/dist/lib/execution/config.js +83 -4
  93. package/dist/lib/execution/config.js.map +1 -1
  94. package/dist/lib/execution/runners.d.ts +60 -4
  95. package/dist/lib/execution/runners.js +398 -79
  96. package/dist/lib/execution/runners.js.map +1 -1
  97. package/dist/lib/execution/spawner.d.ts +4 -2
  98. package/dist/lib/execution/spawner.js +54 -47
  99. package/dist/lib/execution/spawner.js.map +1 -1
  100. package/dist/lib/execution/types.d.ts +27 -5
  101. package/dist/lib/execution/types.js +24 -0
  102. package/dist/lib/execution/types.js.map +1 -1
  103. package/dist/lib/external-issues/adapters.d.ts +17 -0
  104. package/dist/lib/external-issues/adapters.js +88 -0
  105. package/dist/lib/external-issues/adapters.js.map +1 -1
  106. package/dist/lib/external-issues/mapping-store.js +1 -1
  107. package/dist/lib/external-issues/shortcut.js +2 -1
  108. package/dist/lib/external-issues/shortcut.js.map +1 -1
  109. package/dist/lib/external-issues/trello.d.ts +80 -0
  110. package/dist/lib/external-issues/trello.js +266 -0
  111. package/dist/lib/external-issues/trello.js.map +1 -0
  112. package/dist/lib/external-issues/types.d.ts +3 -3
  113. package/dist/lib/external-issues/types.js +1 -1
  114. package/dist/lib/external-issues/types.js.map +1 -1
  115. package/dist/lib/linear/client.d.ts +4 -3
  116. package/dist/lib/linear/client.js +185 -122
  117. package/dist/lib/linear/client.js.map +1 -1
  118. package/dist/lib/mcp/tools/cli-passthrough.js +77 -0
  119. package/dist/lib/mcp/tools/cli-passthrough.js.map +1 -1
  120. package/dist/lib/mcp/tools/index.d.ts +0 -1
  121. package/dist/lib/mcp/tools/index.js +0 -1
  122. package/dist/lib/mcp/tools/index.js.map +1 -1
  123. package/dist/lib/media/index.d.ts +91 -0
  124. package/dist/lib/media/index.js +475 -0
  125. package/dist/lib/media/index.js.map +1 -0
  126. package/dist/lib/onboarding/detect-tools.d.ts +15 -0
  127. package/dist/lib/onboarding/detect-tools.js +44 -0
  128. package/dist/lib/onboarding/detect-tools.js.map +1 -0
  129. package/dist/lib/onboarding/index.d.ts +2 -0
  130. package/dist/lib/onboarding/index.js +3 -0
  131. package/dist/lib/onboarding/index.js.map +1 -0
  132. package/dist/lib/onboarding/wizard.d.ts +25 -0
  133. package/dist/lib/onboarding/wizard.js +156 -0
  134. package/dist/lib/onboarding/wizard.js.map +1 -0
  135. package/dist/lib/pmo/schema.d.ts +2 -1
  136. package/dist/lib/pmo/schema.js +3 -1
  137. package/dist/lib/pmo/schema.js.map +1 -1
  138. package/dist/lib/runners/claude-code-runner.js +6 -0
  139. package/dist/lib/runners/claude-code-runner.js.map +1 -1
  140. package/dist/lib/tool-registry/detect.d.ts +20 -0
  141. package/dist/lib/tool-registry/detect.js +95 -0
  142. package/dist/lib/tool-registry/detect.js.map +1 -0
  143. package/dist/lib/tool-registry/index.d.ts +10 -0
  144. package/dist/lib/tool-registry/index.js +13 -0
  145. package/dist/lib/tool-registry/index.js.map +1 -0
  146. package/dist/lib/tool-registry/policy.d.ts +32 -0
  147. package/dist/lib/tool-registry/policy.js +97 -0
  148. package/dist/lib/tool-registry/policy.js.map +1 -0
  149. package/dist/lib/tool-registry/registry.d.ts +42 -0
  150. package/dist/lib/tool-registry/registry.js +120 -0
  151. package/dist/lib/tool-registry/registry.js.map +1 -0
  152. package/dist/lib/tool-registry/spawn.d.ts +50 -0
  153. package/dist/lib/tool-registry/spawn.js +103 -0
  154. package/dist/lib/tool-registry/spawn.js.map +1 -0
  155. package/dist/lib/tool-registry/types.d.ts +56 -0
  156. package/dist/lib/tool-registry/types.js +109 -0
  157. package/dist/lib/tool-registry/types.js.map +1 -0
  158. package/dist/lib/trello/client.d.ts +23 -0
  159. package/dist/lib/trello/client.js +114 -0
  160. package/dist/lib/trello/client.js.map +1 -0
  161. package/dist/lib/trello/config.d.ts +55 -0
  162. package/dist/lib/trello/config.js +127 -0
  163. package/dist/lib/trello/config.js.map +1 -0
  164. package/dist/lib/trello/index.d.ts +5 -0
  165. package/dist/lib/trello/index.js +5 -0
  166. package/dist/lib/trello/index.js.map +1 -0
  167. package/dist/lib/trello/mapper.d.ts +13 -0
  168. package/dist/lib/trello/mapper.js +71 -0
  169. package/dist/lib/trello/mapper.js.map +1 -0
  170. package/dist/lib/trello/sync.d.ts +13 -0
  171. package/dist/lib/trello/sync.js +38 -0
  172. package/dist/lib/trello/sync.js.map +1 -0
  173. package/dist/lib/trello/types.d.ts +53 -0
  174. package/dist/lib/trello/types.js +2 -0
  175. package/dist/lib/trello/types.js.map +1 -0
  176. package/dist/lib/work-source/client.js +17 -0
  177. package/dist/lib/work-source/client.js.map +1 -1
  178. package/dist/lib/work-source/config.d.ts +6 -1
  179. package/dist/lib/work-source/config.js +30 -1
  180. package/dist/lib/work-source/config.js.map +1 -1
  181. package/dist/lib/work-source/index.d.ts +1 -1
  182. package/dist/lib/work-source/index.js +1 -1
  183. package/dist/lib/work-source/index.js.map +1 -1
  184. package/oclif.manifest.json +6524 -6171
  185. package/package.json +6 -2
  186. package/dist/commands/spec/create.d.ts +0 -20
  187. package/dist/commands/spec/create.js +0 -171
  188. package/dist/commands/spec/create.js.map +0 -1
  189. package/dist/commands/spec/delete.js +0 -112
  190. package/dist/commands/spec/delete.js.map +0 -1
  191. package/dist/commands/spec/edit.d.ts +0 -23
  192. package/dist/commands/spec/edit.js +0 -262
  193. package/dist/commands/spec/edit.js.map +0 -1
  194. package/dist/commands/spec/index.js +0 -88
  195. package/dist/commands/spec/index.js.map +0 -1
  196. package/dist/commands/spec/link/depends.js +0 -87
  197. package/dist/commands/spec/link/depends.js.map +0 -1
  198. package/dist/commands/spec/link/index.js +0 -93
  199. package/dist/commands/spec/link/index.js.map +0 -1
  200. package/dist/commands/spec/link/remove.js +0 -91
  201. package/dist/commands/spec/link/remove.js.map +0 -1
  202. package/dist/commands/spec/list.d.ts +0 -14
  203. package/dist/commands/spec/list.js +0 -101
  204. package/dist/commands/spec/list.js.map +0 -1
  205. package/dist/commands/spec/plan.js +0 -102
  206. package/dist/commands/spec/plan.js.map +0 -1
  207. package/dist/commands/spec/ticket.js +0 -144
  208. package/dist/commands/spec/ticket.js.map +0 -1
  209. package/dist/commands/spec/view.js +0 -202
  210. package/dist/commands/spec/view.js.map +0 -1
  211. package/dist/lib/mcp/tools/spec.d.ts +0 -6
  212. package/dist/lib/mcp/tools/spec.js +0 -197
  213. package/dist/lib/mcp/tools/spec.js.map +0 -1
  214. package/dist/lib/pmo/spec-parser.d.ts +0 -25
  215. package/dist/lib/pmo/spec-parser.js +0 -206
  216. package/dist/lib/pmo/spec-parser.js.map +0 -1
  217. package/dist/lib/pmo/spec-types.d.ts +0 -43
  218. package/dist/lib/pmo/spec-types.js +0 -8
  219. package/dist/lib/pmo/spec-types.js.map +0 -1
@@ -0,0 +1,120 @@
1
+ /**
2
+ * Tool Registry — Load, save, and manage tools.yaml config
3
+ *
4
+ * The tools.yaml file lives at .proletariat/tools.yaml in the HQ root.
5
+ * It registers MCP servers and CLI tools that agents can use.
6
+ */
7
+ import * as fs from 'node:fs';
8
+ import * as path from 'node:path';
9
+ import yaml from 'js-yaml';
10
+ import { BUILTIN_PRLT_TOOL } from './types.js';
11
+ const TOOLS_FILENAME = 'tools.yaml';
12
+ /**
13
+ * Get the path to the tools.yaml file for a given HQ root.
14
+ */
15
+ export function getToolsConfigPath(hqPath) {
16
+ return path.join(hqPath, '.proletariat', TOOLS_FILENAME);
17
+ }
18
+ /**
19
+ * Load the tool registry from .proletariat/tools.yaml.
20
+ * Returns an empty registry if the file doesn't exist.
21
+ */
22
+ export function loadToolRegistry(hqPath) {
23
+ const configPath = getToolsConfigPath(hqPath);
24
+ const empty = {
25
+ 'mcp-servers': {},
26
+ 'cli-tools': {},
27
+ };
28
+ if (!fs.existsSync(configPath)) {
29
+ return empty;
30
+ }
31
+ try {
32
+ const content = fs.readFileSync(configPath, 'utf-8');
33
+ const parsed = yaml.load(content);
34
+ return {
35
+ 'mcp-servers': parsed?.['mcp-servers'] ?? {},
36
+ 'cli-tools': parsed?.['cli-tools'] ?? {},
37
+ };
38
+ }
39
+ catch {
40
+ return empty;
41
+ }
42
+ }
43
+ /**
44
+ * Save the tool registry to .proletariat/tools.yaml.
45
+ */
46
+ export function saveToolRegistry(hqPath, registry) {
47
+ const configPath = getToolsConfigPath(hqPath);
48
+ const dir = path.dirname(configPath);
49
+ fs.mkdirSync(dir, { recursive: true });
50
+ const content = yaml.dump(registry, {
51
+ indent: 2,
52
+ lineWidth: 120,
53
+ noRefs: true,
54
+ sortKeys: true,
55
+ });
56
+ fs.writeFileSync(configPath, content, 'utf-8');
57
+ }
58
+ /**
59
+ * Get all MCP servers from the registry, hydrated with their names.
60
+ */
61
+ export function getMcpServers(registry) {
62
+ return Object.entries(registry['mcp-servers']).map(([name, config]) => ({
63
+ name,
64
+ ...config,
65
+ }));
66
+ }
67
+ /**
68
+ * Get all CLI tools from the registry, hydrated with their names.
69
+ * Always includes the built-in prlt tool.
70
+ */
71
+ export function getCliTools(registry) {
72
+ const tools = Object.entries(registry['cli-tools']).map(([name, config]) => ({
73
+ name,
74
+ ...config,
75
+ }));
76
+ // Ensure prlt is always present
77
+ if (!tools.some(t => t.name === 'prlt')) {
78
+ tools.push(BUILTIN_PRLT_TOOL);
79
+ }
80
+ return tools;
81
+ }
82
+ /**
83
+ * Add an MCP server to the registry.
84
+ */
85
+ export function addMcpServer(hqPath, name, config) {
86
+ const registry = loadToolRegistry(hqPath);
87
+ registry['mcp-servers'][name] = config;
88
+ saveToolRegistry(hqPath, registry);
89
+ }
90
+ /**
91
+ * Add a CLI tool to the registry.
92
+ */
93
+ export function addCliTool(hqPath, name, config) {
94
+ const registry = loadToolRegistry(hqPath);
95
+ registry['cli-tools'][name] = config;
96
+ saveToolRegistry(hqPath, registry);
97
+ }
98
+ /**
99
+ * Remove a tool (MCP or CLI) from the registry.
100
+ * Returns true if the tool was found and removed.
101
+ */
102
+ export function removeTool(hqPath, name) {
103
+ const registry = loadToolRegistry(hqPath);
104
+ if (name in registry['mcp-servers']) {
105
+ delete registry['mcp-servers'][name];
106
+ saveToolRegistry(hqPath, registry);
107
+ return true;
108
+ }
109
+ if (name in registry['cli-tools']) {
110
+ const tool = registry['cli-tools'][name];
111
+ if (tool.builtin) {
112
+ return false; // Can't remove built-in tools
113
+ }
114
+ delete registry['cli-tools'][name];
115
+ saveToolRegistry(hqPath, registry);
116
+ return true;
117
+ }
118
+ return false;
119
+ }
120
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/lib/tool-registry/registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Tool Registry — Spawn-time integration
3
+ *
4
+ * At agent spawn time:
5
+ * 1. Load tool registry and policy profile
6
+ * 2. Filter tools by policy
7
+ * 3. Generate mcp-config.json for MCP servers (passed to Claude Code via --mcp-config)
8
+ * 4. Build tools section for agent prompt (CLI tools + MCP descriptions)
9
+ */
10
+ import type { McpServerConfig, CliToolConfig } from './types.js';
11
+ interface McpConfigEntry {
12
+ url?: string;
13
+ command?: string;
14
+ args?: string[];
15
+ env?: Record<string, string>;
16
+ }
17
+ interface McpConfigJson {
18
+ mcpServers: Record<string, McpConfigEntry>;
19
+ }
20
+ /**
21
+ * Generate mcp-config.json content from a list of MCP servers.
22
+ * This JSON is passed to Claude Code via the --mcp-config flag.
23
+ */
24
+ export declare function generateMcpConfig(servers: McpServerConfig[]): McpConfigJson;
25
+ /**
26
+ * Write mcp-config.json to a temporary location and return the path.
27
+ * Returns null if there are no MCP servers to configure.
28
+ */
29
+ export declare function writeMcpConfigFile(servers: McpServerConfig[], outputDir: string): string | null;
30
+ /**
31
+ * Build the AVAILABLE TOOLS section for agent prompts.
32
+ * Describes MCP servers and CLI tools the agent has access to.
33
+ */
34
+ export declare function buildToolsPromptSection(mcpServers: McpServerConfig[], cliTools: CliToolConfig[]): string;
35
+ export interface SpawnToolsResult {
36
+ mcpConfigPath: string | null;
37
+ promptSection: string;
38
+ mcpServers: McpServerConfig[];
39
+ cliTools: CliToolConfig[];
40
+ }
41
+ /**
42
+ * Resolve tools for an agent spawn.
43
+ * Loads registry, applies policy, generates MCP config, builds prompt section.
44
+ *
45
+ * @param hqPath - HQ root path
46
+ * @param policyName - Optional policy profile name (e.g., "code-agent")
47
+ * @param outputDir - Directory for writing mcp-config.json
48
+ */
49
+ export declare function resolveToolsForSpawn(hqPath: string, policyName: string | undefined, outputDir: string): SpawnToolsResult;
50
+ export {};
@@ -0,0 +1,103 @@
1
+ /**
2
+ * Tool Registry — Spawn-time integration
3
+ *
4
+ * At agent spawn time:
5
+ * 1. Load tool registry and policy profile
6
+ * 2. Filter tools by policy
7
+ * 3. Generate mcp-config.json for MCP servers (passed to Claude Code via --mcp-config)
8
+ * 4. Build tools section for agent prompt (CLI tools + MCP descriptions)
9
+ */
10
+ import * as fs from 'node:fs';
11
+ import * as path from 'node:path';
12
+ import { loadToolRegistry } from './registry.js';
13
+ import { loadToolPolicy, filterByPolicy } from './policy.js';
14
+ /**
15
+ * Generate mcp-config.json content from a list of MCP servers.
16
+ * This JSON is passed to Claude Code via the --mcp-config flag.
17
+ */
18
+ export function generateMcpConfig(servers) {
19
+ const mcpServers = {};
20
+ for (const server of servers) {
21
+ const entry = {};
22
+ if (server.url) {
23
+ entry.url = server.url;
24
+ }
25
+ if (server.command) {
26
+ const parts = server.command.split(/\s+/);
27
+ entry.command = parts[0];
28
+ if (parts.length > 1 || server.args) {
29
+ entry.args = [...parts.slice(1), ...(server.args || [])];
30
+ }
31
+ }
32
+ if (server.auth) {
33
+ // Resolve ${ENV_VAR} references
34
+ const envVar = server.auth.replace(/^\$\{(.+)\}$/, '$1');
35
+ const value = process.env[envVar];
36
+ if (value) {
37
+ entry.env = { [envVar]: value };
38
+ }
39
+ }
40
+ mcpServers[server.name] = entry;
41
+ }
42
+ return { mcpServers };
43
+ }
44
+ /**
45
+ * Write mcp-config.json to a temporary location and return the path.
46
+ * Returns null if there are no MCP servers to configure.
47
+ */
48
+ export function writeMcpConfigFile(servers, outputDir) {
49
+ if (servers.length === 0)
50
+ return null;
51
+ const config = generateMcpConfig(servers);
52
+ fs.mkdirSync(outputDir, { recursive: true });
53
+ const configPath = path.join(outputDir, 'mcp-config.json');
54
+ fs.writeFileSync(configPath, JSON.stringify(config, null, 2), 'utf-8');
55
+ return configPath;
56
+ }
57
+ // =============================================================================
58
+ // Agent Prompt Injection
59
+ // =============================================================================
60
+ /**
61
+ * Build the AVAILABLE TOOLS section for agent prompts.
62
+ * Describes MCP servers and CLI tools the agent has access to.
63
+ */
64
+ export function buildToolsPromptSection(mcpServers, cliTools) {
65
+ if (mcpServers.length === 0 && cliTools.length === 0)
66
+ return '';
67
+ let section = `## Available Tools\n\n`;
68
+ if (mcpServers.length > 0) {
69
+ section += `**MCP Servers:**\n`;
70
+ for (const server of mcpServers) {
71
+ section += `- ${server.name} (${server.description})\n`;
72
+ }
73
+ section += `\n`;
74
+ }
75
+ if (cliTools.length > 0) {
76
+ section += `**CLI Tools:**\n`;
77
+ for (const tool of cliTools) {
78
+ section += `- ${tool.command} — ${tool.description}\n`;
79
+ }
80
+ section += `\n`;
81
+ }
82
+ section += `Use these tools for external interactions. Prefer registered tools over raw curl or API calls.\n\n`;
83
+ return section;
84
+ }
85
+ /**
86
+ * Resolve tools for an agent spawn.
87
+ * Loads registry, applies policy, generates MCP config, builds prompt section.
88
+ *
89
+ * @param hqPath - HQ root path
90
+ * @param policyName - Optional policy profile name (e.g., "code-agent")
91
+ * @param outputDir - Directory for writing mcp-config.json
92
+ */
93
+ export function resolveToolsForSpawn(hqPath, policyName, outputDir) {
94
+ const registry = loadToolRegistry(hqPath);
95
+ const policy = policyName
96
+ ? loadToolPolicy(hqPath, policyName)
97
+ : null;
98
+ const { mcpServers, cliTools } = filterByPolicy(registry, policy);
99
+ const mcpConfigPath = writeMcpConfigFile(mcpServers, outputDir);
100
+ const promptSection = buildToolsPromptSection(mcpServers, cliTools);
101
+ return { mcpConfigPath, promptSection, mcpServers, cliTools };
102
+ }
103
+ //# sourceMappingURL=spawn.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spawn.js","sourceRoot":"","sources":["../../../src/lib/tool-registry/spawn.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Tool Registry Types
3
+ *
4
+ * Types for MCP servers and CLI tools as pluggable integration providers
5
+ * with per-agent access control via policy profiles.
6
+ */
7
+ export interface McpServerConfig {
8
+ /** Server name (unique identifier) */
9
+ name: string;
10
+ /** URL for remote MCP servers */
11
+ url?: string;
12
+ /** Command for local MCP servers (e.g., "node ./tools/my-mcp-server.js") */
13
+ command?: string;
14
+ /** Args for local MCP server command */
15
+ args?: string[];
16
+ /** Environment variable name for auth token (e.g., "${ARCADE_API_KEY}") */
17
+ auth?: string;
18
+ /** Human-readable description */
19
+ description: string;
20
+ }
21
+ export interface CliToolConfig {
22
+ /** Tool name (unique identifier) */
23
+ name: string;
24
+ /** The command/binary to invoke */
25
+ command: string;
26
+ /** Human-readable description */
27
+ description: string;
28
+ /** Shell command to detect if tool is installed (e.g., "which gh") */
29
+ detect?: string;
30
+ /** Shell command to install the tool (e.g., "brew install gh") */
31
+ install?: string;
32
+ /** Whether this is a built-in tool (always available, no config needed) */
33
+ builtin?: boolean;
34
+ }
35
+ export interface ToolRegistry {
36
+ 'mcp-servers': Record<string, Omit<McpServerConfig, 'name'>>;
37
+ 'cli-tools': Record<string, Omit<CliToolConfig, 'name'>>;
38
+ }
39
+ export interface ToolPolicy {
40
+ mcp: string[];
41
+ cli: string[];
42
+ /** Per-MCP-server fine-grained access (e.g., arcade: { allow: ['asana', 'slack'] }) */
43
+ [serverName: string]: string[] | {
44
+ allow: string[];
45
+ } | undefined;
46
+ }
47
+ export interface ToolCheckResult {
48
+ name: string;
49
+ type: 'mcp' | 'cli';
50
+ available: boolean;
51
+ error?: string;
52
+ installHint?: string;
53
+ }
54
+ export declare const COMMON_CLI_TOOLS: CliToolConfig[];
55
+ /** Default built-in tool (prlt itself) */
56
+ export declare const BUILTIN_PRLT_TOOL: CliToolConfig;
@@ -0,0 +1,109 @@
1
+ /**
2
+ * Tool Registry Types
3
+ *
4
+ * Types for MCP servers and CLI tools as pluggable integration providers
5
+ * with per-agent access control via policy profiles.
6
+ */
7
+ // =============================================================================
8
+ // Common CLI tools for auto-detection
9
+ // =============================================================================
10
+ export const COMMON_CLI_TOOLS = [
11
+ {
12
+ name: 'gh',
13
+ command: 'gh',
14
+ description: 'GitHub CLI — PRs, issues, releases',
15
+ detect: 'which gh',
16
+ install: 'brew install gh',
17
+ },
18
+ {
19
+ name: 'jq',
20
+ command: 'jq',
21
+ description: 'JSON processor',
22
+ detect: 'which jq',
23
+ install: 'brew install jq',
24
+ },
25
+ {
26
+ name: 'ffmpeg',
27
+ command: 'ffmpeg',
28
+ description: 'Video/audio processing',
29
+ detect: 'which ffmpeg',
30
+ install: 'brew install ffmpeg',
31
+ },
32
+ {
33
+ name: 'aws',
34
+ command: 'aws',
35
+ description: 'AWS CLI',
36
+ detect: 'which aws',
37
+ install: 'brew install awscli',
38
+ },
39
+ {
40
+ name: 'gcloud',
41
+ command: 'gcloud',
42
+ description: 'Google Cloud CLI',
43
+ detect: 'which gcloud',
44
+ },
45
+ {
46
+ name: 'kubectl',
47
+ command: 'kubectl',
48
+ description: 'Kubernetes CLI',
49
+ detect: 'which kubectl',
50
+ install: 'brew install kubectl',
51
+ },
52
+ {
53
+ name: 'terraform',
54
+ command: 'terraform',
55
+ description: 'Infrastructure as Code',
56
+ detect: 'which terraform',
57
+ install: 'brew install terraform',
58
+ },
59
+ {
60
+ name: 'docker',
61
+ command: 'docker',
62
+ description: 'Container runtime',
63
+ detect: 'which docker',
64
+ install: 'brew install --cask docker',
65
+ },
66
+ {
67
+ name: 'node',
68
+ command: 'node',
69
+ description: 'Node.js runtime',
70
+ detect: 'which node',
71
+ install: 'brew install node',
72
+ },
73
+ {
74
+ name: 'python3',
75
+ command: 'python3',
76
+ description: 'Python 3 runtime',
77
+ detect: 'which python3',
78
+ install: 'brew install python',
79
+ },
80
+ {
81
+ name: 'curl',
82
+ command: 'curl',
83
+ description: 'URL transfer tool',
84
+ detect: 'which curl',
85
+ },
86
+ {
87
+ name: 'git',
88
+ command: 'git',
89
+ description: 'Version control',
90
+ detect: 'which git',
91
+ install: 'brew install git',
92
+ },
93
+ {
94
+ name: 'ripgrep',
95
+ command: 'rg',
96
+ description: 'Fast search (ripgrep)',
97
+ detect: 'which rg',
98
+ install: 'brew install ripgrep',
99
+ },
100
+ ];
101
+ /** Default built-in tool (prlt itself) */
102
+ export const BUILTIN_PRLT_TOOL = {
103
+ name: 'prlt',
104
+ command: 'prlt',
105
+ description: 'Proletariat CLI (always available)',
106
+ detect: 'which prlt',
107
+ builtin: true,
108
+ };
109
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/lib/tool-registry/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAwEH,gFAAgF;AAChF,sCAAsC;AACtC,gFAAgF;AAEhF,MAAM,CAAC,MAAM,gBAAgB,GAAoB;IAC/C;QACE,IAAI,EAAE,IAAI;QACV,OAAO,EAAE,IAAI;QACb,WAAW,EAAE,oCAAoC;QACjD,MAAM,EAAE,UAAU;QAClB,OAAO,EAAE,iBAAiB;KAC3B;IACD;QACE,IAAI,EAAE,IAAI;QACV,OAAO,EAAE,IAAI;QACb,WAAW,EAAE,gBAAgB;QAC7B,MAAM,EAAE,UAAU;QAClB,OAAO,EAAE,iBAAiB;KAC3B;IACD;QACE,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,QAAQ;QACjB,WAAW,EAAE,wBAAwB;QACrC,MAAM,EAAE,cAAc;QACtB,OAAO,EAAE,qBAAqB;KAC/B;IACD;QACE,IAAI,EAAE,KAAK;QACX,OAAO,EAAE,KAAK;QACd,WAAW,EAAE,SAAS;QACtB,MAAM,EAAE,WAAW;QACnB,OAAO,EAAE,qBAAqB;KAC/B;IACD;QACE,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,QAAQ;QACjB,WAAW,EAAE,kBAAkB;QAC/B,MAAM,EAAE,cAAc;KACvB;IACD;QACE,IAAI,EAAE,SAAS;QACf,OAAO,EAAE,SAAS;QAClB,WAAW,EAAE,gBAAgB;QAC7B,MAAM,EAAE,eAAe;QACvB,OAAO,EAAE,sBAAsB;KAChC;IACD;QACE,IAAI,EAAE,WAAW;QACjB,OAAO,EAAE,WAAW;QACpB,WAAW,EAAE,wBAAwB;QACrC,MAAM,EAAE,iBAAiB;QACzB,OAAO,EAAE,wBAAwB;KAClC;IACD;QACE,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,QAAQ;QACjB,WAAW,EAAE,mBAAmB;QAChC,MAAM,EAAE,cAAc;QACtB,OAAO,EAAE,4BAA4B;KACtC;IACD;QACE,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE,MAAM;QACf,WAAW,EAAE,iBAAiB;QAC9B,MAAM,EAAE,YAAY;QACpB,OAAO,EAAE,mBAAmB;KAC7B;IACD;QACE,IAAI,EAAE,SAAS;QACf,OAAO,EAAE,SAAS;QAClB,WAAW,EAAE,kBAAkB;QAC/B,MAAM,EAAE,eAAe;QACvB,OAAO,EAAE,qBAAqB;KAC/B;IACD;QACE,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE,MAAM;QACf,WAAW,EAAE,mBAAmB;QAChC,MAAM,EAAE,YAAY;KACrB;IACD;QACE,IAAI,EAAE,KAAK;QACX,OAAO,EAAE,KAAK;QACd,WAAW,EAAE,iBAAiB;QAC9B,MAAM,EAAE,WAAW;QACnB,OAAO,EAAE,kBAAkB;KAC5B;IACD;QACE,IAAI,EAAE,SAAS;QACf,OAAO,EAAE,IAAI;QACb,WAAW,EAAE,uBAAuB;QACpC,MAAM,EAAE,UAAU;QAClB,OAAO,EAAE,sBAAsB;KAChC;CACF,CAAA;AAED,0CAA0C;AAC1C,MAAM,CAAC,MAAM,iBAAiB,GAAkB;IAC9C,IAAI,EAAE,MAAM;IACZ,OAAO,EAAE,MAAM;IACf,WAAW,EAAE,oCAAoC;IACjD,MAAM,EAAE,YAAY;IACpB,OAAO,EAAE,IAAI;CACd,CAAA"}
@@ -0,0 +1,23 @@
1
+ import type { TrelloBoard, TrelloCard, TrelloCardUpsertInput, TrelloList, TrelloMember } from './types.js';
2
+ export declare class TrelloClient {
3
+ private apiKey;
4
+ private apiToken;
5
+ private readonly baseUrl;
6
+ constructor(apiKey: string, apiToken: string);
7
+ private request;
8
+ verify(): Promise<TrelloMember>;
9
+ getCard(cardId: string): Promise<TrelloCard | null>;
10
+ searchCards(query: string, options?: {
11
+ limit?: number;
12
+ boardId?: string;
13
+ }): Promise<TrelloCard[]>;
14
+ getBoard(boardId: string): Promise<TrelloBoard | null>;
15
+ getBoardLists(boardId: string): Promise<TrelloList[]>;
16
+ getBoardCards(boardId: string, options?: {
17
+ limit?: number;
18
+ filter?: string;
19
+ }): Promise<TrelloCard[]>;
20
+ getBoards(): Promise<TrelloBoard[]>;
21
+ createCard(input: TrelloCardUpsertInput): Promise<TrelloCard>;
22
+ updateCard(cardId: string, input: TrelloCardUpsertInput): Promise<TrelloCard>;
23
+ }
@@ -0,0 +1,114 @@
1
+ export class TrelloClient {
2
+ apiKey;
3
+ apiToken;
4
+ baseUrl = 'https://api.trello.com/1';
5
+ constructor(apiKey, apiToken) {
6
+ this.apiKey = apiKey;
7
+ this.apiToken = apiToken;
8
+ }
9
+ async request(path, init = {}) {
10
+ const url = new URL(`${this.baseUrl}${path}`);
11
+ url.searchParams.set('key', this.apiKey);
12
+ url.searchParams.set('token', this.apiToken);
13
+ if (init.query) {
14
+ for (const [key, value] of Object.entries(init.query)) {
15
+ if (value !== undefined) {
16
+ url.searchParams.set(key, String(value));
17
+ }
18
+ }
19
+ }
20
+ const response = await fetch(url, {
21
+ method: init.method ?? 'GET',
22
+ headers: {
23
+ 'Content-Type': 'application/json',
24
+ },
25
+ body: init.body ? JSON.stringify(init.body) : undefined,
26
+ });
27
+ if (response.status === 401) {
28
+ throw new Error('Trello authentication failed. Verify your API key and token.');
29
+ }
30
+ if (response.status === 429) {
31
+ throw new Error('Trello API rate limit exceeded. Wait a moment and try again.');
32
+ }
33
+ if (!response.ok) {
34
+ const text = await response.text().catch(() => '');
35
+ throw new Error(`Trello API request failed (${response.status}): ${text}`);
36
+ }
37
+ return response.json();
38
+ }
39
+ async verify() {
40
+ return this.request('/members/me', {
41
+ query: { fields: 'id,fullName,username' },
42
+ });
43
+ }
44
+ async getCard(cardId) {
45
+ try {
46
+ return await this.request(`/cards/${cardId}`, {
47
+ query: { fields: 'id,name,desc,url,shortUrl,idBoard,idList,idMembers,closed,due,dueComplete', members: true, member_fields: 'fullName,username', labels: 'all' },
48
+ });
49
+ }
50
+ catch {
51
+ return null;
52
+ }
53
+ }
54
+ async searchCards(query, options) {
55
+ const limit = Math.max(1, Math.min(options?.limit ?? 20, 100));
56
+ const result = await this.request('/search', {
57
+ query: {
58
+ query,
59
+ modelTypes: 'cards',
60
+ cards_limit: limit,
61
+ card_fields: 'id,name,desc,url,shortUrl,idBoard,idList,idMembers,closed,due,dueComplete',
62
+ card_members: true,
63
+ card_member_fields: 'fullName,username',
64
+ card_labels: 'all',
65
+ ...(options?.boardId ? { idBoards: options.boardId } : {}),
66
+ },
67
+ });
68
+ return result.cards ?? [];
69
+ }
70
+ async getBoard(boardId) {
71
+ try {
72
+ return await this.request(`/boards/${boardId}`, {
73
+ query: { fields: 'id,name,url' },
74
+ });
75
+ }
76
+ catch {
77
+ return null;
78
+ }
79
+ }
80
+ async getBoardLists(boardId) {
81
+ return this.request(`/boards/${boardId}/lists`, {
82
+ query: { fields: 'id,name' },
83
+ });
84
+ }
85
+ async getBoardCards(boardId, options) {
86
+ const filter = options?.filter ?? 'open';
87
+ return this.request(`/boards/${boardId}/cards/${filter}`, {
88
+ query: {
89
+ fields: 'id,name,desc,url,shortUrl,idBoard,idList,idMembers,closed,due,dueComplete',
90
+ members: true,
91
+ member_fields: 'fullName,username',
92
+ labels: 'all',
93
+ },
94
+ });
95
+ }
96
+ async getBoards() {
97
+ return this.request('/members/me/boards', {
98
+ query: { fields: 'id,name,url', filter: 'open' },
99
+ });
100
+ }
101
+ async createCard(input) {
102
+ return this.request('/cards', {
103
+ method: 'POST',
104
+ body: input,
105
+ });
106
+ }
107
+ async updateCard(cardId, input) {
108
+ return this.request(`/cards/${cardId}`, {
109
+ method: 'PUT',
110
+ body: input,
111
+ });
112
+ }
113
+ }
114
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/lib/trello/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Trello Configuration Storage
3
+ *
4
+ * Stores Trello credentials and preferences in the workspace_settings table.
5
+ * Mirrors the Shortcut/Asana config module pattern.
6
+ */
7
+ import Database from 'better-sqlite3';
8
+ export interface TrelloConfig {
9
+ apiKey: string;
10
+ apiToken: string;
11
+ boardId?: string;
12
+ boardName?: string;
13
+ }
14
+ /**
15
+ * Check if Trello is configured.
16
+ * Returns true if either:
17
+ * - Database has trello.api_key and trello.api_token stored, OR
18
+ * - Environment variables PRLT_TRELLO_API_KEY/TRELLO_API_KEY and PRLT_TRELLO_API_TOKEN/TRELLO_API_TOKEN are set
19
+ */
20
+ export declare function isTrelloConfigured(db: Database.Database): boolean;
21
+ /**
22
+ * Load Trello configuration from the database + environment.
23
+ * Returns null if not configured.
24
+ */
25
+ export declare function loadTrelloConfig(db: Database.Database): TrelloConfig | null;
26
+ /**
27
+ * Save Trello configuration to the database.
28
+ */
29
+ export declare function saveTrelloConfig(db: Database.Database, config: TrelloConfig): void;
30
+ /**
31
+ * Save the Trello API key.
32
+ */
33
+ export declare function saveTrelloApiKey(db: Database.Database, apiKey: string): void;
34
+ /**
35
+ * Save the Trello API token.
36
+ */
37
+ export declare function saveTrelloApiToken(db: Database.Database, apiToken: string): void;
38
+ /**
39
+ * Save the Trello board.
40
+ */
41
+ export declare function saveTrelloBoard(db: Database.Database, boardId: string, boardName: string): void;
42
+ /**
43
+ * Clear all Trello configuration from the database.
44
+ */
45
+ export declare function clearTrelloConfig(db: Database.Database): void;
46
+ /**
47
+ * Get the stored Trello API key.
48
+ * Also checks PRLT_TRELLO_API_KEY and TRELLO_API_KEY environment variables.
49
+ */
50
+ export declare function getTrelloApiKey(db: Database.Database): string | null;
51
+ /**
52
+ * Get the stored Trello API token.
53
+ * Also checks PRLT_TRELLO_API_TOKEN and TRELLO_API_TOKEN environment variables.
54
+ */
55
+ export declare function getTrelloApiToken(db: Database.Database): string | null;