@a-company/paradigm 3.27.0 → 3.34.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/dist/{accept-orchestration-6EM5EHXA.js → accept-orchestration-XXANWJVZ.js} +3 -3
  2. package/dist/{aggregate-M5WMUI6B.js → aggregate-XHQ6GI3Z.js} +2 -2
  3. package/dist/{beacon-XL2ALH5O.js → beacon-BTLQMYQL.js} +2 -2
  4. package/dist/{chunk-AK5M6KJB.js → chunk-36TKPM5Z.js} +20 -2
  5. package/dist/{chunk-ZOH24ZPF.js → chunk-3BGSDKWD.js} +3 -3
  6. package/dist/{chunk-6P4IFIK2.js → chunk-CTF6RHKG.js} +37 -3
  7. package/dist/{chunk-SCC77UUP.js → chunk-H4TVBJD4.js} +3 -3
  8. package/dist/{chunk-KWDTBXP2.js → chunk-LHLIAYQ3.js} +1 -1
  9. package/dist/{chunk-7IJ5JVKT.js → chunk-PFLWLC6J.js} +59 -7
  10. package/dist/{chunk-W4VFKZVF.js → chunk-S5TDFT5Q.js} +2 -2
  11. package/dist/{chunk-N6RNYCZD.js → chunk-UQNTJ5VB.js} +1 -1
  12. package/dist/{chunk-MRENOFTR.js → chunk-VUSCJJ4A.js} +6 -1
  13. package/dist/{chunk-OXG5GVDJ.js → chunk-WOONGZ3C.js} +1 -1
  14. package/dist/{commands-6ZVTD74M.js → commands-KPT2T2OZ.js} +1 -1
  15. package/dist/{conductor-CAIY5LJA.js → conductor-HLWYWUVH.js} +14 -0
  16. package/dist/{constellation-NXU6Q2HM.js → constellation-LZ6XIKDT.js} +2 -2
  17. package/dist/{cost-CTGSLSOC.js → cost-4SZM7OUS.js} +1 -1
  18. package/dist/{cursorrules-XBWFX66V.js → cursorrules-3TKZ4E4R.js} +2 -2
  19. package/dist/{diff-AH7L4PRQ.js → diff-T6YJSAAC.js} +3 -3
  20. package/dist/{dist-KY5HGDDL.js → dist-OH4DBV2O.js} +42 -3
  21. package/dist/{dist-7U64HDSC.js → dist-QSBAGCZT.js} +8 -2
  22. package/dist/index.js +44 -40
  23. package/dist/{lint-53GPXKKI.js → lint-MTRZB5EC.js} +1 -1
  24. package/dist/mcp.js +117 -42
  25. package/dist/migrate-HRN5TUBQ.js +871 -0
  26. package/dist/{orchestrate-HMSQ2CED.js → orchestrate-3SI6ON33.js} +3 -3
  27. package/dist/{probe-SN4BNXOC.js → probe-ABMGCXQG.js} +4 -4
  28. package/dist/{reindex-YG3KIXAK.js → reindex-YC7LD4MN.js} +1 -1
  29. package/dist/{remember-IEBQHXHZ.js → remember-WR6ZVXLT.js} +1 -1
  30. package/dist/{ripple-DFMXLFWI.js → ripple-QTXKJCEI.js} +2 -2
  31. package/dist/sentinel.js +6 -6
  32. package/dist/{setup-HOI52TN3.js → setup-ASR6OMKV.js} +4 -4
  33. package/dist/{shift-DRF5M3G6.js → shift-7XLSBLDW.js} +19 -9
  34. package/dist/{snapshot-XHINQBZS.js → snapshot-QZFD7YBI.js} +2 -2
  35. package/dist/{summary-NV7SBV5O.js → summary-R4CSYNNP.js} +2 -2
  36. package/dist/{team-YOGT2Q2X.js → team-VH3HYABB.js} +4 -4
  37. package/dist/university-content/courses/para-101.json +53 -0
  38. package/dist/university-content/plsat/v3.0.json +78 -1
  39. package/dist/{upgrade-65QOQXRC.js → upgrade-ANX3LVSA.js} +1 -0
  40. package/dist/{validate-TKKRGJKC.js → validate-OUHUBZPO.js} +1 -1
  41. package/dist/{workspace-L27RR5MF.js → workspace-5RBSALXC.js} +5 -5
  42. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -1,17 +1,17 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  initCommand
4
- } from "./chunk-SCC77UUP.js";
5
- import "./chunk-W4VFKZVF.js";
6
- import "./chunk-AK5M6KJB.js";
4
+ } from "./chunk-H4TVBJD4.js";
5
+ import "./chunk-S5TDFT5Q.js";
6
+ import "./chunk-36TKPM5Z.js";
7
7
  import {
8
8
  aggregateFromDirectory,
9
9
  buildSymbolIndex,
10
10
  getSymbolCounts
11
- } from "./chunk-6P4IFIK2.js";
11
+ } from "./chunk-CTF6RHKG.js";
12
12
  import {
13
13
  findPurposeFiles
14
- } from "./chunk-MRENOFTR.js";
14
+ } from "./chunk-VUSCJJ4A.js";
15
15
  import {
16
16
  findGateFiles
17
17
  } from "./chunk-IRKUEJVW.js";
@@ -111,7 +111,7 @@ ${chalk2.magenta("\u2569 ")}${chalk2.cyan("\u2534 \u2534\u2534\u2514\u2500\u253
111
111
  program.name("paradigm").description("Unified developer tools ecosystem").version(VERSION).addHelpText("before", banner);
112
112
  program.command("init").description("Initialize Paradigm in the current project").option("-f, --force", "Overwrite existing files").option("--name <name>", "Project name").option("--ide <ide>", "Target IDE: cursor, copilot, windsurf, claude").option("--stack <stack>", "Stack preset (e.g., nextjs, fastapi, swift-ios). Auto-detected if omitted.").option("--migrate", "Output migration prompt for existing IDE files").option("--quick", "Non-interactive mode with smart defaults").option("--dry-run", "Show what would be created without creating").action(initCommand);
113
113
  program.command("shift").description("Full project setup in one command (init + team init + scan + sync all IDEs + doctor)").option("-f, --force", "Reinitialize even if already setup").option("-q, --quick", "Skip slow operations (scan)").option("--verify", "Run health checks after setup").option("--ide <ide>", "Target specific IDE instead of all").option("--configure-models", "Force model configuration prompts for team agents").option("--stack <stack>", "Stack preset (e.g., nextjs, fastapi, swift-ios). Auto-detected if omitted.").option("--workspace <name>", "Create or join a multi-project workspace with this name (creates ../.paradigm-workspace)").option("--workspace-path <path>", "Custom workspace file location (default: ../.paradigm-workspace)").action(async (options) => {
114
- const { shiftCommand } = await import("./shift-DRF5M3G6.js");
114
+ const { shiftCommand } = await import("./shift-7XLSBLDW.js");
115
115
  await shiftCommand(options);
116
116
  });
117
117
  program.command("presets").description("List available stack presets for paradigm init/shift").option("-d, --discipline <discipline>", "Filter by discipline (e.g., fullstack, api, mobile)").action(async (options) => {
@@ -143,17 +143,17 @@ program.command("presets").description("List available stack presets for paradig
143
143
  `));
144
144
  });
145
145
  program.command("setup [path]").description("Interactive setup wizard for Paradigm").option("-y, --yes", "Accept all defaults (non-interactive)").option("-f, --force", "Overwrite existing .paradigm config").action(async (path2, options) => {
146
- const { setupCommand } = await import("./setup-HOI52TN3.js");
146
+ const { setupCommand } = await import("./setup-ASR6OMKV.js");
147
147
  await setupCommand(path2, options);
148
148
  });
149
149
  program.command("status").alias("st").description("Show project status and symbol counts").action(statusCommand);
150
150
  var purposeCmd = program.command("purpose").description("Purpose-related commands");
151
151
  purposeCmd.command("remember [path]").description("Aggregate and display purpose context").action(async (path2 = ".") => {
152
- const { purposeRememberCommand } = await import("./remember-IEBQHXHZ.js");
152
+ const { purposeRememberCommand } = await import("./remember-WR6ZVXLT.js");
153
153
  await purposeRememberCommand(path2);
154
154
  });
155
155
  purposeCmd.command("validate [path]").description("Validate purpose files").action(async (path2 = ".") => {
156
- const { purposeValidateCommand } = await import("./validate-TKKRGJKC.js");
156
+ const { purposeValidateCommand } = await import("./validate-OUHUBZPO.js");
157
157
  await purposeValidateCommand(path2);
158
158
  });
159
159
  var portalCmd = program.command("portal").description("Portal-related commands");
@@ -183,11 +183,11 @@ portalCmd.command("export [path]").description("Export portal configuration in j
183
183
  });
184
184
  var premiseCmd = program.command("premise").description("Premise-related commands");
185
185
  premiseCmd.command("aggregate [path]").description("Aggregate all sources into symbol index").action(async (path2 = ".") => {
186
- const { premiseAggregateCommand } = await import("./aggregate-M5WMUI6B.js");
186
+ const { premiseAggregateCommand } = await import("./aggregate-XHQ6GI3Z.js");
187
187
  await premiseAggregateCommand(path2);
188
188
  });
189
189
  premiseCmd.command("snapshot <name>").description("Create a timeline snapshot").option("-d, --description <desc>", "Snapshot description").action(async (name, options) => {
190
- const { premiseSnapshotCommand } = await import("./snapshot-XHINQBZS.js");
190
+ const { premiseSnapshotCommand } = await import("./snapshot-QZFD7YBI.js");
191
191
  await premiseSnapshotCommand(name, options.description);
192
192
  });
193
193
  program.command("sync [ide]").description("Generate IDE instruction files from .paradigm/ config").option("--all", "Sync all supported IDEs").option("-f, --force", "Overwrite existing files").option("--mcp", "Generate MCP configuration (default: true)").option("--no-mcp", "Skip MCP configuration generation").option("--nested", "Generate nested CLAUDE.md files for directories with .purpose").action(async (ide, options) => {
@@ -200,28 +200,32 @@ program.command("sync-llms").description("Generate llms.txt \u2014 LLM-readable
200
200
  });
201
201
  program.command("cursorrules [path]").description("[DEPRECATED] Use `paradigm sync cursor` instead").option("-a, --append", "Append to existing .cursorrules").option("-f, --force", "Overwrite existing .cursorrules").option("-p, --preview", "Preview output without writing").option("--init", "Create default .paradigm config if missing").option("--with-scan", "Include probe protocol section").action(async (path2, options) => {
202
202
  console.log("\x1B[33m\u26A0\uFE0F `paradigm cursorrules` is deprecated. Use `paradigm sync cursor` instead.\x1B[0m\n");
203
- const { cursorrrulesCommand } = await import("./cursorrules-XBWFX66V.js");
203
+ const { cursorrrulesCommand } = await import("./cursorrules-3TKZ4E4R.js");
204
204
  await cursorrrulesCommand(path2, options);
205
205
  });
206
206
  program.command("index [path]").description("Generate probe index for visual discovery").option("-o, --output <path>", "Output path for probe-index.json").option("-q, --quiet", "Suppress output").action(async (path2, options) => {
207
- const { indexCommand } = await import("./probe-SN4BNXOC.js");
207
+ const { indexCommand } = await import("./probe-ABMGCXQG.js");
208
208
  await indexCommand(path2, options);
209
209
  });
210
210
  var probeCmd = program.command("probe").description("Probe-related commands");
211
211
  probeCmd.command("index [path]").description("Generate probe index (alias for `paradigm index`)").option("-o, --output <path>", "Output path for probe-index.json").option("-q, --quiet", "Suppress output").action(async (path2, options) => {
212
- const { indexCommand } = await import("./probe-SN4BNXOC.js");
212
+ const { indexCommand } = await import("./probe-ABMGCXQG.js");
213
213
  await indexCommand(path2, options);
214
214
  });
215
- program.command("upgrade [path]").description("Upgrade project with new Paradigm features").option("--features <features...>", "Features to upgrade (probe, logger)").option("--all", "Apply all available upgrades").option("--from-horizon", "Migrate from Horizon to Paradigm").option("--dry-run", "Show what would be upgraded without making changes").option("-f, --force", "Force re-upgrade even if already configured").action(async (path2, options) => {
216
- const { upgradeCommand } = await import("./upgrade-65QOQXRC.js");
215
+ program.command("migrate").description("Detect and apply migrations to bring project up to date").option("--dry-run", "Preview changes without applying").option("--apply", "Apply all auto migrations without prompting").option("-f, --force", "Re-run previously applied migrations").option("--only <ids...>", "Run specific migrations by ID").option("--category <cat>", "Run migrations in a category (directory, config, template, hook)").option("--no-sync", "Skip template sync").option("--list", "List all migrations and their status").option("-v, --verbose", "Show detailed output").action(async (options) => {
216
+ const { migrateCommand } = await import("./migrate-HRN5TUBQ.js");
217
+ await migrateCommand(options);
218
+ });
219
+ program.command("upgrade [path]").description("(Deprecated) Upgrade project with new Paradigm features \u2014 use `paradigm migrate`").option("--features <features...>", "Features to upgrade (probe, logger)").option("--all", "Apply all available upgrades").option("--from-horizon", "Migrate from Horizon to Paradigm").option("--dry-run", "Show what would be upgraded without making changes").option("-f, --force", "Force re-upgrade even if already configured").action(async (path2, options) => {
220
+ const { upgradeCommand } = await import("./upgrade-ANX3LVSA.js");
217
221
  await upgradeCommand(path2, options);
218
222
  });
219
223
  program.command("lint [path]").description("Validate .purpose files for schema errors").option("-f, --fix", "Auto-fix issues where possible").option("-s, --strict", "Fail on warnings (not just errors)").option("-q, --quiet", "Suppress output except errors").option("--json", "Output as JSON").option("--auto-populate", "Scan for undocumented source dirs and suggest .purpose entries (use with --fix to write)").action(async (path2, options) => {
220
- const { lintCommand } = await import("./lint-53GPXKKI.js");
224
+ const { lintCommand } = await import("./lint-MTRZB5EC.js");
221
225
  await lintCommand(path2, options);
222
226
  });
223
227
  program.command("cost [path]").description("Analyze token costs for AI context").option("-d, --detailed", "Show detailed breakdown by file").option("--json", "Output as JSON").action(async (path2, options) => {
224
- const { costCommand } = await import("./cost-CTGSLSOC.js");
228
+ const { costCommand } = await import("./cost-4SZM7OUS.js");
225
229
  await costCommand(path2, options);
226
230
  });
227
231
  var scanCmd = program.command("scan").description("Visual discovery and auto-generation commands");
@@ -245,7 +249,7 @@ flowCmd.action(() => {
245
249
  });
246
250
  var teamCmd = program.command("team").description("Multi-agent orchestration commands");
247
251
  teamCmd.command("init [path]").description("Initialize team configuration with default agents").option("-f, --force", "Overwrite existing configuration").option("--configure-models", "Force model configuration prompts").option("--no-configure-models", "Skip model configuration").option("--json", "Output as JSON").action(async (path2, options) => {
248
- const { teamInitCommand } = await import("./team-YOGT2Q2X.js");
252
+ const { teamInitCommand } = await import("./team-VH3HYABB.js");
249
253
  await teamInitCommand(path2, {
250
254
  ...options,
251
255
  configureModels: options.configureModels,
@@ -253,27 +257,27 @@ teamCmd.command("init [path]").description("Initialize team configuration with d
253
257
  });
254
258
  });
255
259
  teamCmd.command("status [path]").description("Show current team status").option("--running", "Show only running orchestrations").option("--id <id>", "Show specific orchestration").option("--json", "Output as JSON").action(async (path2, options) => {
256
- const { teamStatusCommand } = await import("./team-YOGT2Q2X.js");
260
+ const { teamStatusCommand } = await import("./team-VH3HYABB.js");
257
261
  await teamStatusCommand(path2, options);
258
262
  });
259
263
  teamCmd.command("handoff [path]").description("Hand off current task to another agent").requiredOption("-t, --to <agent>", "Target agent name").option("-s, --summary <text>", "Summary of what was done").option("--json", "Output as JSON").action(async (path2, options) => {
260
- const { teamHandoffCommand } = await import("./team-YOGT2Q2X.js");
264
+ const { teamHandoffCommand } = await import("./team-VH3HYABB.js");
261
265
  await teamHandoffCommand(path2, options);
262
266
  });
263
267
  teamCmd.command("accept [handoff-id] [path]").description("Accept a pending handoff").option("-n, --note <text>", "Acceptance note").option("--json", "Output as JSON").action(async (handoffId, path2, options) => {
264
- const { teamAcceptCommand } = await import("./team-YOGT2Q2X.js");
268
+ const { teamAcceptCommand } = await import("./team-VH3HYABB.js");
265
269
  await teamAcceptCommand(handoffId, path2, options);
266
270
  });
267
271
  teamCmd.command("check [path]").description("Check for conflicts and team health issues").option("--json", "Output as JSON").action(async (path2, options) => {
268
- const { teamCheckCommand } = await import("./team-YOGT2Q2X.js");
272
+ const { teamCheckCommand } = await import("./team-VH3HYABB.js");
269
273
  await teamCheckCommand(path2, options);
270
274
  });
271
275
  teamCmd.command("history [path]").description("Show full activity log").option("-l, --limit <number>", "Number of entries to show", "50").option("--json", "Output as JSON").action(async (path2, options) => {
272
- const { teamHistoryCommand } = await import("./team-YOGT2Q2X.js");
276
+ const { teamHistoryCommand } = await import("./team-VH3HYABB.js");
273
277
  await teamHistoryCommand(path2, { ...options, limit: parseInt(options.limit) });
274
278
  });
275
279
  teamCmd.command("reset [path]").description("Reset team state for fresh start").option("-f, --force", "Force reset even with pending work").option("--json", "Output as JSON").action(async (path2, options) => {
276
- const { teamResetCommand } = await import("./team-YOGT2Q2X.js");
280
+ const { teamResetCommand } = await import("./team-VH3HYABB.js");
277
281
  await teamResetCommand(path2, options);
278
282
  });
279
283
  teamCmd.command("spawn <agent> [path]").description("Spawn an AI agent to work on a task").requiredOption("-t, --task <task>", "Task for the agent to perform").option("-m, --model <model>", "Model to use: opus, sonnet, haiku").option("-p, --provider <provider>", "Provider: auto, claude, claude-code, claude-cli, manual").option("--budget <budget>", 'Budget limits (e.g., "tokens=100000,cost=2")').option("--timeout <ms>", "Timeout in milliseconds").option("--checkpoint", "Pause for approval before writes/deletes").option("-q, --quiet", "Suppress output").option("--json", "Output as JSON").action(async (agent, path2, options) => {
@@ -281,19 +285,19 @@ teamCmd.command("spawn <agent> [path]").description("Spawn an AI agent to work o
281
285
  await teamSpawnCommand(agent, path2, options);
282
286
  });
283
287
  teamCmd.command("orchestrate <task> [path]").description("Orchestrate a multi-agent task").option("--solo", "Run in solo mode (single Claude)").option("--faceted", "Run in faceted mode (multi-agent, default)").option("--compare", "Run both modes and compare results").option("--background", "Run in background mode (returns immediately)").option("--notify <methods>", "Notification methods: bell,desktop,file,webhook (default: bell)").option("-m, --model <model>", "Orchestrator model: opus, sonnet, haiku").option("-p, --provider <provider>", "Provider: auto, claude, claude-code, claude-cli, manual").option("--budget <budget>", 'Budget limits (e.g., "tokens=500000,cost=5")').option("--checkpoint", "Pause for approval between agents").option("--live", "Stream agent output live").option("--pm", "Enable PM governance (compliance checks before/after)").option("-q, --quiet", "Suppress output").option("--json", "Output as JSON").action(async (task, path2, options) => {
284
- const { teamOrchestrateCommand } = await import("./orchestrate-HMSQ2CED.js");
288
+ const { teamOrchestrateCommand } = await import("./orchestrate-3SI6ON33.js");
285
289
  await teamOrchestrateCommand(task, path2, options);
286
290
  });
287
291
  teamCmd.command("diff <orchestration-id> [path]").description("Show diff of changes from a completed orchestration").option("--full", "Show full file contents").option("--json", "Output as JSON").action(async (orchestrationId, path2, options) => {
288
- const { teamDiffCommand } = await import("./diff-AH7L4PRQ.js");
292
+ const { teamDiffCommand } = await import("./diff-T6YJSAAC.js");
289
293
  await teamDiffCommand(orchestrationId, path2, options);
290
294
  });
291
295
  teamCmd.command("accept-orch <orchestration-id> [path]").description("Accept orchestration changes").option("-n, --note <text>", "Acceptance note").option("--json", "Output as JSON").action(async (orchestrationId, path2, options) => {
292
- const { teamAcceptOrchestrationCommand } = await import("./accept-orchestration-6EM5EHXA.js");
296
+ const { teamAcceptOrchestrationCommand } = await import("./accept-orchestration-XXANWJVZ.js");
293
297
  await teamAcceptOrchestrationCommand(orchestrationId, path2, options);
294
298
  });
295
299
  teamCmd.command("reject-orch <orchestration-id> [path]").description("Reject orchestration changes").option("-r, --reason <text>", "Rejection reason").option("--cleanup", "Delete created files").option("--json", "Output as JSON").action(async (orchestrationId, path2, options) => {
296
- const { teamRejectOrchestrationCommand } = await import("./accept-orchestration-6EM5EHXA.js");
300
+ const { teamRejectOrchestrationCommand } = await import("./accept-orchestration-XXANWJVZ.js");
297
301
  await teamRejectOrchestrationCommand(orchestrationId, path2, options);
298
302
  });
299
303
  teamCmd.command("cost [path]").description("Show cost summary for orchestrations").option("--from <date>", "From date (ISO format)").option("--to <date>", "To date (ISO format)").option("--days <n>", "Last N days").option("-d, --detailed", "Show detailed breakdown").option("--json", "Output as JSON").action(async (path2, options) => {
@@ -309,7 +313,7 @@ teamCmd.command("providers [path]").description("Show available agent providers
309
313
  await teamProvidersCommand(path2, options);
310
314
  });
311
315
  teamCmd.command("models [path]").description("Configure or view agent model assignments").option("--refresh", "Refresh model cache from environment").option("--json", "Output as JSON").action(async (path2, options) => {
312
- const { teamModelsCommand } = await import("./team-YOGT2Q2X.js");
316
+ const { teamModelsCommand } = await import("./team-VH3HYABB.js");
313
317
  await teamModelsCommand(path2, options);
314
318
  });
315
319
  var agentsCmd = teamCmd.command("agents").description("Agent management commands");
@@ -324,7 +328,7 @@ agentsCmd.action(() => {
324
328
  console.log("\nRun `paradigm team agents suggest --help` for options.\n");
325
329
  });
326
330
  teamCmd.action(async () => {
327
- const { teamStatusCommand } = await import("./team-YOGT2Q2X.js");
331
+ const { teamStatusCommand } = await import("./team-VH3HYABB.js");
328
332
  await teamStatusCommand(void 0, {});
329
333
  });
330
334
  var pluginCmd = program.command("plugin").description("Plugin management commands");
@@ -338,19 +342,19 @@ pluginCmd.action(async () => {
338
342
  });
339
343
  var workspaceCmd = program.command("workspace").description("Multi-project workspace commands");
340
344
  workspaceCmd.command("init").description("Create a .paradigm-workspace file from sibling projects").option("-n, --name <name>", "Workspace name (default: directory name)").option("-f, --force", "Overwrite existing workspace file").action(async (options) => {
341
- const { workspaceInitCommand } = await import("./workspace-L27RR5MF.js");
345
+ const { workspaceInitCommand } = await import("./workspace-5RBSALXC.js");
342
346
  await workspaceInitCommand(options);
343
347
  });
344
348
  workspaceCmd.command("status").description("Show workspace member status and symbol counts").option("--json", "Output as JSON").action(async (options) => {
345
- const { workspaceStatusCommand } = await import("./workspace-L27RR5MF.js");
349
+ const { workspaceStatusCommand } = await import("./workspace-5RBSALXC.js");
346
350
  await workspaceStatusCommand(options);
347
351
  });
348
352
  workspaceCmd.command("reindex").description("Rebuild scan-index.json for all workspace members").option("-q, --quiet", "Suppress progress output").action(async (options) => {
349
- const { workspaceReindexCommand } = await import("./workspace-L27RR5MF.js");
353
+ const { workspaceReindexCommand } = await import("./workspace-5RBSALXC.js");
350
354
  await workspaceReindexCommand(options);
351
355
  });
352
356
  workspaceCmd.action(async () => {
353
- const { workspaceStatusCommand } = await import("./workspace-L27RR5MF.js");
357
+ const { workspaceStatusCommand } = await import("./workspace-5RBSALXC.js");
354
358
  await workspaceStatusCommand({});
355
359
  });
356
360
  program.command("doctor").description("Health check - validate Paradigm setup").option("--context", "Run only context audit checks (CLAUDE.md quality)").action(async (options) => {
@@ -379,19 +383,19 @@ program.command("watch").description("Watch for changes and auto-sync IDE files"
379
383
  await watchCommand();
380
384
  });
381
385
  program.command("summary").description("Generate .paradigm/project.md with project stats").action(async () => {
382
- const { summaryCommand } = await import("./summary-NV7SBV5O.js");
386
+ const { summaryCommand } = await import("./summary-R4CSYNNP.js");
383
387
  await summaryCommand();
384
388
  });
385
389
  program.command("constellation [path]").alias("const").description("Generate .paradigm/constellation.json - symbol relationship graph for AI agents").option("-f, --format <format>", "Output format: json or yaml", "json").option("-o, --output <path>", "Custom output path").option("-q, --quiet", "Suppress output").action(async (path2, options) => {
386
- const { constellationCommand } = await import("./constellation-NXU6Q2HM.js");
390
+ const { constellationCommand } = await import("./constellation-LZ6XIKDT.js");
387
391
  await constellationCommand(path2, options);
388
392
  });
389
393
  program.command("beacon [path]").description("Generate .paradigm/beacon.md - quick-start orientation for AI agents").option("-r, --refresh", "Regenerate even if beacon exists").option("-o, --output <path>", "Custom output path").option("--json", "Output as JSON (for AI agent queries)").option("-q, --quiet", "Suppress output").action(async (path2, options) => {
390
- const { beaconCommand } = await import("./beacon-XL2ALH5O.js");
394
+ const { beaconCommand } = await import("./beacon-BTLQMYQL.js");
391
395
  await beaconCommand(path2, options);
392
396
  });
393
397
  program.command("ripple <symbol> [path]").description("Show change impact analysis for a symbol").option("-d, --depth <depth>", "Analysis depth (default: 1)", "1").option("--json", "Output as JSON").option("-q, --quiet", "Suppress output").action(async (symbol, path2, options) => {
394
- const { rippleCommand } = await import("./ripple-DFMXLFWI.js");
398
+ const { rippleCommand } = await import("./ripple-QTXKJCEI.js");
395
399
  await rippleCommand(symbol, path2, options);
396
400
  });
397
401
  var threadCmd = program.command("thread").description("Session continuity - pass context between AI agent sessions");
@@ -748,7 +752,7 @@ sentinelCmd.command("defend [path]", { isDefault: true }).description("Launch th
748
752
  await sentinelCommand(path2, options);
749
753
  });
750
754
  program.command("conductor").description("Launch Paradigm Conductor \u2014 multimodal mission control for Claude Code sessions").option("--build", "Force rebuild the native binary").option("-v, --verbose", "Show build output").action(async (options) => {
751
- const { conductorCommand } = await import("./conductor-CAIY5LJA.js");
755
+ const { conductorCommand } = await import("./conductor-HLWYWUVH.js");
752
756
  await conductorCommand(options);
753
757
  });
754
758
  program.command("university").description("Launch Paradigm University - interactive learning platform & PLSAT certification").option("-p, --port <port>", "Port to run on", "3839").option("--no-open", "Don't open browser automatically").action(async (options) => {
@@ -4,7 +4,7 @@ import {
4
4
  parsePurposeFileDetailed,
5
5
  serializePurposeFile,
6
6
  validatePurposeFile
7
- } from "./chunk-MRENOFTR.js";
7
+ } from "./chunk-VUSCJJ4A.js";
8
8
  import {
9
9
  log
10
10
  } from "./chunk-4NCFWYGG.js";
package/dist/mcp.js CHANGED
@@ -76,7 +76,7 @@ import {
76
76
  validatePersona,
77
77
  validateProtocol,
78
78
  validatePurposeFile
79
- } from "./chunk-7IJ5JVKT.js";
79
+ } from "./chunk-PFLWLC6J.js";
80
80
  import {
81
81
  deleteLoreEntry,
82
82
  loadLoreEntries,
@@ -6420,6 +6420,14 @@ var purposeAddComponentTool = {
6420
6420
  type: "array",
6421
6421
  items: { type: "string" },
6422
6422
  description: 'Component references (e.g. ["#stripe-service"])'
6423
+ },
6424
+ type: {
6425
+ type: "string",
6426
+ description: 'Component type (e.g., "view", "service", "model", "tool"). Open string per project vocabulary.'
6427
+ },
6428
+ parent: {
6429
+ type: "string",
6430
+ description: 'Parent component (e.g., "#payment-page"). Establishes hierarchy.'
6423
6431
  }
6424
6432
  },
6425
6433
  required: ["purposeFile", "id", "description"]
@@ -6957,7 +6965,9 @@ async function handleAddComponent(args, ctx, reloadContext2) {
6957
6965
  gates,
6958
6966
  signals,
6959
6967
  aspects,
6960
- components
6968
+ components,
6969
+ type: componentType,
6970
+ parent
6961
6971
  } = args;
6962
6972
  const filePath = resolvePurposeFilePath(purposeFile, ctx.rootDir);
6963
6973
  const data = readPurposeFile(filePath);
@@ -6977,6 +6987,8 @@ async function handleAddComponent(args, ctx, reloadContext2) {
6977
6987
  if (signals !== void 0) item.signals = signals.map((s) => ensurePrefix(s, "!"));
6978
6988
  if (aspects !== void 0) item.aspects = aspects.map((a) => ensurePrefix(a, "~"));
6979
6989
  if (components !== void 0) item.components = components.map((c) => ensurePrefix(c, "#"));
6990
+ if (componentType !== void 0) item.type = componentType;
6991
+ if (parent !== void 0) item.parent = ensurePrefix(parent, "#");
6980
6992
  existing[bareId] = item;
6981
6993
  data[sec] = existing;
6982
6994
  writePurposeFile(filePath, data);
@@ -13744,12 +13756,13 @@ async function handlePipelineTool(name, args, ctx) {
13744
13756
  }
13745
13757
 
13746
13758
  // ../paradigm-mcp/src/tools/conductor.ts
13747
- import { execSync as execSync5 } from "child_process";
13759
+ import { execSync as execSync6 } from "child_process";
13748
13760
 
13749
13761
  // ../paradigm-mcp/src/utils/conductor-loader.ts
13750
13762
  import * as fs25 from "fs";
13751
13763
  import * as path27 from "path";
13752
13764
  import * as os3 from "os";
13765
+ import { execSync as execSync5 } from "child_process";
13753
13766
  var CONDUCTOR_DIR = path27.join(os3.homedir(), ".conductor");
13754
13767
  var SESSIONS_DIR = path27.join(CONDUCTOR_DIR, "sessions");
13755
13768
  function ensureSessionsDir() {
@@ -13808,6 +13821,72 @@ function isProcessAlive(pid) {
13808
13821
  return false;
13809
13822
  }
13810
13823
  }
13824
+ function detectTerminalBundleId() {
13825
+ try {
13826
+ const script = `
13827
+ tell application "System Events"
13828
+ set frontApp to first application process whose frontmost is true
13829
+ return bundle identifier of frontApp
13830
+ end tell
13831
+ `;
13832
+ const result = execSync5(`osascript -e '${script}'`, {
13833
+ encoding: "utf-8",
13834
+ timeout: 3e3
13835
+ }).trim();
13836
+ return result || void 0;
13837
+ } catch {
13838
+ return void 0;
13839
+ }
13840
+ }
13841
+ function detectGitBranch(cwd) {
13842
+ try {
13843
+ return execSync5("git rev-parse --abbrev-ref HEAD", {
13844
+ cwd,
13845
+ encoding: "utf-8",
13846
+ timeout: 3e3
13847
+ }).trim() || void 0;
13848
+ } catch {
13849
+ return void 0;
13850
+ }
13851
+ }
13852
+ function autoRegisterWithConductor(projectDir2) {
13853
+ try {
13854
+ const pid = process.pid;
13855
+ const terminal = detectTerminalBundleId();
13856
+ const branch = detectGitBranch(projectDir2);
13857
+ let parentPid;
13858
+ try {
13859
+ const ppid = execSync5(`ps -o ppid= -p ${pid}`, {
13860
+ encoding: "utf-8",
13861
+ timeout: 3e3
13862
+ }).trim();
13863
+ parentPid = parseInt(ppid, 10);
13864
+ if (isNaN(parentPid)) parentPid = void 0;
13865
+ } catch {
13866
+ }
13867
+ registerConductorSession({
13868
+ pid,
13869
+ parentPid,
13870
+ projectDir: projectDir2,
13871
+ terminal,
13872
+ branch
13873
+ });
13874
+ const cleanup = () => {
13875
+ try {
13876
+ unregisterConductorSession(pid);
13877
+ } catch {
13878
+ }
13879
+ };
13880
+ process.on("exit", cleanup);
13881
+ process.on("SIGTERM", () => {
13882
+ cleanup();
13883
+ process.exit(0);
13884
+ });
13885
+ console.error(`[paradigm-mcp] Auto-registered with Conductor (PID ${pid})`);
13886
+ } catch {
13887
+ console.error("[paradigm-mcp] Auto-registration with Conductor skipped (non-fatal)");
13888
+ }
13889
+ }
13811
13890
 
13812
13891
  // ../paradigm-mcp/src/tools/conductor.ts
13813
13892
  function getConductorToolsList() {
@@ -13880,23 +13959,12 @@ async function handleConductorTool(name, args, ctx) {
13880
13959
  switch (name) {
13881
13960
  case "paradigm_conductor_register": {
13882
13961
  const pid = process.pid;
13883
- const projectDir2 = ctx.projectRoot;
13884
- let terminal = args.terminal;
13885
- if (!terminal) {
13886
- terminal = detectTerminalBundleId();
13887
- }
13888
- let branch;
13889
- try {
13890
- branch = execSync5("git rev-parse --abbrev-ref HEAD", {
13891
- cwd: projectDir2,
13892
- encoding: "utf-8",
13893
- timeout: 3e3
13894
- }).trim();
13895
- } catch {
13896
- }
13962
+ const projectDir2 = ctx.rootDir;
13963
+ const terminal = args.terminal || detectTerminalBundleId();
13964
+ const branch = detectGitBranch(projectDir2);
13897
13965
  let parentPid;
13898
13966
  try {
13899
- const ppid = execSync5(`ps -o ppid= -p ${pid}`, {
13967
+ const ppid = execSync6(`ps -o ppid= -p ${pid}`, {
13900
13968
  encoding: "utf-8",
13901
13969
  timeout: 3e3
13902
13970
  }).trim();
@@ -13975,27 +14043,10 @@ This session is no longer visible in the Conductor overlay.`,
13975
14043
  return { text: "", handled: false };
13976
14044
  }
13977
14045
  }
13978
- function detectTerminalBundleId() {
13979
- try {
13980
- const script = `
13981
- tell application "System Events"
13982
- set frontApp to first application process whose frontmost is true
13983
- return bundle identifier of frontApp
13984
- end tell
13985
- `;
13986
- const result = execSync5(`osascript -e '${script}'`, {
13987
- encoding: "utf-8",
13988
- timeout: 3e3
13989
- }).trim();
13990
- return result || void 0;
13991
- } catch {
13992
- return void 0;
13993
- }
13994
- }
13995
14046
 
13996
14047
  // ../paradigm-mcp/src/tools/fallback-grep.ts
13997
14048
  import * as path28 from "path";
13998
- import { execSync as execSync6 } from "child_process";
14049
+ import { execSync as execSync7 } from "child_process";
13999
14050
  function grepForReferences(rootDir, symbol, options = {}) {
14000
14051
  const { maxResults = 20 } = options;
14001
14052
  const results = [];
@@ -14009,7 +14060,7 @@ function grepForReferences(rootDir, symbol, options = {}) {
14009
14060
  let output = "";
14010
14061
  for (const cmd of grepCommands) {
14011
14062
  try {
14012
- output = execSync6(cmd, { encoding: "utf8", maxBuffer: 1024 * 1024 });
14063
+ output = execSync7(cmd, { encoding: "utf8", maxBuffer: 1024 * 1024 });
14013
14064
  if (output.trim()) break;
14014
14065
  } catch {
14015
14066
  continue;
@@ -14161,6 +14212,10 @@ function registerTools(server, getContext2, reloadContext2) {
14161
14212
  includeWorkspace: {
14162
14213
  type: "boolean",
14163
14214
  description: "Also search sibling workspace projects (default: false). Requires workspace configured in config.yaml."
14215
+ },
14216
+ componentType: {
14217
+ type: "string",
14218
+ description: 'Filter components by type (e.g., "view", "service", "tool"). Only applies to #component symbols.'
14164
14219
  }
14165
14220
  },
14166
14221
  required: ["query"]
@@ -14343,13 +14398,16 @@ function registerTools(server, getContext2, reloadContext2) {
14343
14398
  const toolResult = await (async () => {
14344
14399
  switch (name) {
14345
14400
  case "paradigm_search": {
14346
- const { query, type, limit = 10, fuzzy = true, includeWorkspace = false } = args;
14347
- const cacheKey = `search:${query}:${type || ""}:${limit}:${fuzzy}:${includeWorkspace}`;
14401
+ const { query, type, limit = 10, fuzzy = true, includeWorkspace = false, componentType } = args;
14402
+ const cacheKey = `search:${query}:${type || ""}:${limit}:${fuzzy}:${includeWorkspace}:${componentType || ""}`;
14348
14403
  let results = await toolCache.getOrCompute(cacheKey, () => {
14349
14404
  let r = searchSymbols(ctx.index, query);
14350
14405
  if (type) {
14351
14406
  r = r.filter((s) => s.type === type);
14352
14407
  }
14408
+ if (componentType) {
14409
+ r = r.filter((s) => s.componentType === componentType);
14410
+ }
14353
14411
  return r;
14354
14412
  });
14355
14413
  let fuzzyMatches = [];
@@ -14372,7 +14430,9 @@ function registerTools(server, getContext2, reloadContext2) {
14372
14430
  symbol: s.symbol,
14373
14431
  type: s.type,
14374
14432
  description: s.description,
14375
- filePath: s.filePath
14433
+ filePath: s.filePath,
14434
+ ...s.componentType ? { componentType: s.componentType } : {},
14435
+ ...s.parentSymbol ? { parentSymbol: s.parentSymbol } : {}
14376
14436
  }))
14377
14437
  };
14378
14438
  if (fuzzyMatches.length > 0) {
@@ -14695,6 +14755,14 @@ function registerTools(server, getContext2, reloadContext2) {
14695
14755
  }
14696
14756
  } catch {
14697
14757
  }
14758
+ const allComponents = getSymbolsByType(ctx.index, "component");
14759
+ const componentTypeBreakdown = {};
14760
+ for (const comp of allComponents) {
14761
+ if (comp.componentType) {
14762
+ componentTypeBreakdown[comp.componentType] = (componentTypeBreakdown[comp.componentType] || 0) + 1;
14763
+ }
14764
+ }
14765
+ const untypedCount = allComponents.filter((c) => !c.componentType).length;
14698
14766
  return JSON.stringify({
14699
14767
  project: ctx.projectName,
14700
14768
  symbolSystem: "v2",
@@ -14706,11 +14774,17 @@ function registerTools(server, getContext2, reloadContext2) {
14706
14774
  "~ aspects": counts.aspect
14707
14775
  },
14708
14776
  total,
14777
+ ...Object.keys(componentTypeBreakdown).length > 0 ? {
14778
+ componentTypes: {
14779
+ ...componentTypeBreakdown,
14780
+ ...untypedCount > 0 ? { "(untyped)": untypedCount } : {}
14781
+ }
14782
+ } : {},
14709
14783
  examples,
14710
14784
  hasPortalYaml: ctx.gateConfig !== null,
14711
14785
  purposeFiles: ctx.aggregation.purposeFiles.length,
14712
14786
  ...protocols ? { protocols } : {},
14713
- note: "Symbol System v2: Use tags [feature], [state], [integration], [idea] for classification",
14787
+ note: "Symbol System v2: Use tags [feature], [state], [integration], [idea] for classification. Use type field for structural role (view, service, tool, etc.)",
14714
14788
  environment: {
14715
14789
  os: platform2,
14716
14790
  shell,
@@ -14924,7 +14998,7 @@ Update command:
14924
14998
  trackToolCall(noWsText.length, name);
14925
14999
  return { content: [{ type: "text", text: noWsText }] };
14926
15000
  }
14927
- const { rebuildStaticFiles: rebuildStaticFiles2 } = await import("./reindex-YG3KIXAK.js");
15001
+ const { rebuildStaticFiles: rebuildStaticFiles2 } = await import("./reindex-YC7LD4MN.js");
14928
15002
  const memberResults = [];
14929
15003
  for (const member of ctx.workspace.config.members) {
14930
15004
  const memberAbsPath = path29.resolve(path29.dirname(ctx.workspace.workspacePath), member.path);
@@ -15202,6 +15276,7 @@ async function main() {
15202
15276
  console.error(`[paradigm-mcp] Error loading project:`, error);
15203
15277
  process.exit(1);
15204
15278
  }
15279
+ autoRegisterWithConductor(projectDir);
15205
15280
  const server = new Server(
15206
15281
  {
15207
15282
  name: "paradigm",