@a-company/paradigm 3.11.0 → 3.12.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.
@@ -1,12 +1,12 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  BackgroundOrchestrator
4
- } from "./chunk-24AAVLME.js";
4
+ } from "./chunk-CQFNTBFJ.js";
5
5
  import "./chunk-6QC3YGB6.js";
6
- import "./chunk-CP6IZGUN.js";
6
+ import "./chunk-JQYGPVLQ.js";
7
+ import "./chunk-5N5LR2KS.js";
7
8
  import "./chunk-PMXRGPRQ.js";
8
9
  import "./chunk-PBHIFAL4.js";
9
- import "./chunk-5N5LR2KS.js";
10
10
  import "./chunk-6P4IFIK2.js";
11
11
  import "./chunk-MRENOFTR.js";
12
12
  import "./chunk-IRKUEJVW.js";
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  BackgroundOrchestrator
4
- } from "./chunk-24AAVLME.js";
4
+ } from "./chunk-CQFNTBFJ.js";
5
5
  import {
6
6
  AGENT_MODEL_RECOMMENDATIONS,
7
7
  addActivity,
@@ -2,14 +2,9 @@
2
2
  import {
3
3
  indexCommand
4
4
  } from "./chunk-UI3XXVJ6.js";
5
- import "./chunk-AK5M6KJB.js";
6
- import "./chunk-6P4IFIK2.js";
7
- import "./chunk-MRENOFTR.js";
8
- import "./chunk-IRKUEJVW.js";
9
5
  import {
10
6
  log
11
7
  } from "./chunk-4NCFWYGG.js";
12
- import "./chunk-MO4EEYFW.js";
13
8
 
14
9
  // src/commands/workspace/index.ts
15
10
  import * as fs from "fs";
@@ -264,8 +259,10 @@ function getMemberStatus(workspaceDir, member) {
264
259
  }
265
260
  return result;
266
261
  }
262
+
267
263
  export {
268
264
  workspaceInitCommand,
265
+ workspaceStatusCommand,
269
266
  workspaceReindexCommand,
270
- workspaceStatusCommand
267
+ detectProjectRole
271
268
  };
@@ -5,7 +5,7 @@ import {
5
5
  import {
6
6
  AgentSpawner,
7
7
  extractSymbols
8
- } from "./chunk-CP6IZGUN.js";
8
+ } from "./chunk-JQYGPVLQ.js";
9
9
  import {
10
10
  loadAgentsManifest
11
11
  } from "./chunk-PMXRGPRQ.js";
@@ -2,13 +2,13 @@
2
2
  import {
3
3
  detectIDE,
4
4
  getAdapter
5
- } from "./chunk-2QNZ6PVD.js";
6
- import {
7
- log
8
- } from "./chunk-4NCFWYGG.js";
5
+ } from "./chunk-KB4XJWE3.js";
9
6
  import {
10
7
  parseParadigmConfig
11
8
  } from "./chunk-YO6DVTL7.js";
9
+ import {
10
+ log
11
+ } from "./chunk-4NCFWYGG.js";
12
12
 
13
13
  // src/commands/doctor.ts
14
14
  import * as fs from "fs";
@@ -1,11 +1,11 @@
1
1
  #!/usr/bin/env node
2
- import {
3
- indexCommand
4
- } from "./chunk-UI3XXVJ6.js";
5
2
  import {
6
3
  detectDiscipline,
7
4
  getDisciplineConfig
8
5
  } from "./chunk-CHSHON3O.js";
6
+ import {
7
+ indexCommand
8
+ } from "./chunk-UI3XXVJ6.js";
9
9
  import {
10
10
  getDefaultPremiseContent
11
11
  } from "./chunk-6P4IFIK2.js";
@@ -16,7 +16,7 @@ import {
16
16
  detectIDE,
17
17
  loadParadigmFiles,
18
18
  syncToIDE
19
- } from "./chunk-2QNZ6PVD.js";
19
+ } from "./chunk-KB4XJWE3.js";
20
20
  import {
21
21
  log
22
22
  } from "./chunk-4NCFWYGG.js";
@@ -474,6 +474,41 @@ function generateLlmsTxtSection() {
474
474
  lines.push("");
475
475
  return lines.join("\n");
476
476
  }
477
+ function generateWorkspaceSection(files) {
478
+ if (!files.workspace) return "";
479
+ const ws = files.workspace;
480
+ const siblings = ws.members.filter((m) => m.name !== ws.currentMember);
481
+ if (siblings.length === 0) return "";
482
+ const lines = [];
483
+ lines.push(`## Workspace: ${ws.name}`);
484
+ lines.push("");
485
+ lines.push("This project is part of a multi-project workspace.");
486
+ lines.push("");
487
+ lines.push("| Member | Role | Path |");
488
+ lines.push("|--------|------|------|");
489
+ for (const m of ws.members) {
490
+ const tag = m.name === ws.currentMember ? " **(this project)**" : "";
491
+ lines.push(`| ${m.name}${tag} | ${m.role || "-"} | \`${m.path}\` |`);
492
+ }
493
+ lines.push("");
494
+ lines.push("### Cross-Project Tools");
495
+ lines.push("");
496
+ lines.push("Use `includeWorkspace: true` when:");
497
+ lines.push("- Modifying symbols consumed by sibling projects");
498
+ lines.push("- Adding API endpoints or gates that siblings depend on");
499
+ lines.push("- Investigating cross-project impact of changes");
500
+ lines.push("");
501
+ lines.push("| Tool | Workspace Parameter |");
502
+ lines.push("|------|-------------------|");
503
+ lines.push("| `paradigm_search` | `includeWorkspace: true` \u2014 search sibling indices |");
504
+ lines.push("| `paradigm_ripple` | `includeWorkspace: true` \u2014 cross-project impact |");
505
+ lines.push("| `paradigm_gates_for_route` | Automatic \u2014 learns from sibling portal.yaml |");
506
+ lines.push("| `paradigm_workspace_reindex` | Rebuild all member indices |");
507
+ lines.push("");
508
+ lines.push("Cross-project symbols are prefixed: " + siblings.map((s) => `\`${s.name}/#symbol\``).join(", "));
509
+ lines.push("");
510
+ return lines.join("\n");
511
+ }
477
512
  function generateFooter() {
478
513
  const lines = [];
479
514
  lines.push("---");
@@ -1971,6 +2006,10 @@ var ClaudeAdapter = class {
1971
2006
  sections.push('paradigm_orchestrate_inline({ task: "...", mode: "plan" })');
1972
2007
  sections.push("```");
1973
2008
  sections.push("");
2009
+ const workspaceSection = generateWorkspaceSection(files);
2010
+ if (workspaceSection) {
2011
+ sections.push(workspaceSection);
2012
+ }
1974
2013
  sections.push("## Flow-First Development");
1975
2014
  sections.push("");
1976
2015
  sections.push("**Define flows BEFORE implementing features that span multiple steps.**");
@@ -2231,6 +2270,7 @@ var AgentsAdapter = class {
2231
2270
  var agentsAdapter = new AgentsAdapter();
2232
2271
 
2233
2272
  // src/core/ide-adapters/index.ts
2273
+ import * as yaml2 from "js-yaml";
2234
2274
  var adapters = /* @__PURE__ */ new Map([
2235
2275
  ["cursor", cursorAdapter],
2236
2276
  ["copilot", copilotAdapter],
@@ -2328,11 +2368,33 @@ function loadParadigmFiles(rootDir) {
2328
2368
  }
2329
2369
  }
2330
2370
  }
2371
+ let workspace = void 0;
2372
+ const rawConfig = yaml2.load(fs6.readFileSync(configPath, "utf8"));
2373
+ const wsField = rawConfig.workspace;
2374
+ if (typeof wsField === "string") {
2375
+ const wsPath = path6.resolve(rootDir, wsField);
2376
+ if (fs6.existsSync(wsPath)) {
2377
+ try {
2378
+ const wsConfig = yaml2.load(fs6.readFileSync(wsPath, "utf8"));
2379
+ const wsDir = path6.dirname(wsPath);
2380
+ const currentName = wsConfig.members?.find(
2381
+ (m) => path6.resolve(wsDir, m.path) === rootDir
2382
+ )?.name || path6.basename(rootDir);
2383
+ workspace = {
2384
+ name: wsConfig.name,
2385
+ currentMember: currentName,
2386
+ members: wsConfig.members || []
2387
+ };
2388
+ } catch {
2389
+ }
2390
+ }
2391
+ }
2331
2392
  return {
2332
2393
  config,
2333
2394
  specs,
2334
2395
  docs,
2335
- projectName: path6.basename(rootDir)
2396
+ projectName: path6.basename(rootDir),
2397
+ workspace
2336
2398
  };
2337
2399
  }
2338
2400
  function syncToIDE(rootDir, ideName, files, force = false) {
@@ -8,7 +8,7 @@ import {
8
8
  syncToIDE,
9
9
  writeMcpConfig,
10
10
  writeNestedContexts
11
- } from "./chunk-2QNZ6PVD.js";
11
+ } from "./chunk-KB4XJWE3.js";
12
12
  import {
13
13
  log
14
14
  } from "./chunk-4NCFWYGG.js";
@@ -1,12 +1,12 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  BackgroundOrchestrator
4
- } from "./chunk-24AAVLME.js";
4
+ } from "./chunk-CQFNTBFJ.js";
5
5
  import "./chunk-6QC3YGB6.js";
6
- import "./chunk-CP6IZGUN.js";
6
+ import "./chunk-JQYGPVLQ.js";
7
+ import "./chunk-5N5LR2KS.js";
7
8
  import "./chunk-PMXRGPRQ.js";
8
9
  import "./chunk-PBHIFAL4.js";
9
- import "./chunk-5N5LR2KS.js";
10
10
  import "./chunk-6P4IFIK2.js";
11
11
  import "./chunk-MRENOFTR.js";
12
12
  import "./chunk-IRKUEJVW.js";
@@ -1,10 +1,10 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  doctorCommand
4
- } from "./chunk-OSYMVGWX.js";
5
- import "./chunk-2QNZ6PVD.js";
6
- import "./chunk-4NCFWYGG.js";
4
+ } from "./chunk-CYGHL7PQ.js";
5
+ import "./chunk-KB4XJWE3.js";
7
6
  import "./chunk-YO6DVTL7.js";
7
+ import "./chunk-4NCFWYGG.js";
8
8
  import "./chunk-MO4EEYFW.js";
9
9
  export {
10
10
  doctorCommand
package/dist/index.js CHANGED
@@ -1,9 +1,9 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  initCommand
4
- } from "./chunk-BC6XKMUA.js";
5
- import "./chunk-UI3XXVJ6.js";
4
+ } from "./chunk-K34C7NAN.js";
6
5
  import "./chunk-CHSHON3O.js";
6
+ import "./chunk-UI3XXVJ6.js";
7
7
  import "./chunk-AK5M6KJB.js";
8
8
  import {
9
9
  aggregateFromDirectory,
@@ -16,11 +16,11 @@ import {
16
16
  import {
17
17
  findGateFiles
18
18
  } from "./chunk-IRKUEJVW.js";
19
- import "./chunk-2QNZ6PVD.js";
19
+ import "./chunk-KB4XJWE3.js";
20
+ import "./chunk-YO6DVTL7.js";
20
21
  import {
21
22
  log
22
23
  } from "./chunk-4NCFWYGG.js";
23
- import "./chunk-YO6DVTL7.js";
24
24
  import "./chunk-MO4EEYFW.js";
25
25
 
26
26
  // src/index.ts
@@ -109,8 +109,8 @@ ${chalk2.magenta("\u2569 ")}${chalk2.cyan("\u2534 \u2534\u2534\u2514\u2500\u253
109
109
  `;
110
110
  program.name("paradigm").description("Unified developer tools ecosystem").version(VERSION).addHelpText("before", banner);
111
111
  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("--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);
112
- 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").action(async (options) => {
113
- const { shiftCommand } = await import("./shift-6I6N6RNK.js");
112
+ 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("--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) => {
113
+ const { shiftCommand } = await import("./shift-G2ZCIR5Q.js");
114
114
  await shiftCommand(options);
115
115
  });
116
116
  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) => {
@@ -162,11 +162,11 @@ premiseCmd.command("snapshot <name>").description("Create a timeline snapshot").
162
162
  await premiseSnapshotCommand(name, options.description);
163
163
  });
164
164
  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) => {
165
- const { syncCommand } = await import("./sync-5VJPZQNX.js");
165
+ const { syncCommand } = await import("./sync-4CNRHUWX.js");
166
166
  await syncCommand(ide, options);
167
167
  });
168
168
  program.command("sync-llms").description("Generate llms.txt \u2014 LLM-readable project summary").option("-o, --output <path>", "Output path (default: ./llms.txt)").action(async (options) => {
169
- const { syncLlmsCommand } = await import("./sync-llms-7QDA3ZWC.js");
169
+ const { syncLlmsCommand } = await import("./sync-llms-MCWB37HN.js");
170
170
  await syncLlmsCommand(options);
171
171
  });
172
172
  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) => {
@@ -184,7 +184,7 @@ probeCmd.command("index [path]").description("Generate probe index (alias for `p
184
184
  await indexCommand(path2, options);
185
185
  });
186
186
  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) => {
187
- const { upgradeCommand } = await import("./upgrade-RBSE4M6I.js");
187
+ const { upgradeCommand } = await import("./upgrade-HGF4MBGV.js");
188
188
  await upgradeCommand(path2, options);
189
189
  });
190
190
  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) => {
@@ -216,7 +216,7 @@ flowCmd.action(() => {
216
216
  });
217
217
  var teamCmd = program.command("team").description("Multi-agent orchestration commands");
218
218
  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) => {
219
- const { teamInitCommand } = await import("./team-AFOKQ7YQ.js");
219
+ const { teamInitCommand } = await import("./team-XUZBPIFZ.js");
220
220
  await teamInitCommand(path2, {
221
221
  ...options,
222
222
  configureModels: options.configureModels,
@@ -224,47 +224,47 @@ teamCmd.command("init [path]").description("Initialize team configuration with d
224
224
  });
225
225
  });
226
226
  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) => {
227
- const { teamStatusCommand } = await import("./team-AFOKQ7YQ.js");
227
+ const { teamStatusCommand } = await import("./team-XUZBPIFZ.js");
228
228
  await teamStatusCommand(path2, options);
229
229
  });
230
230
  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) => {
231
- const { teamHandoffCommand } = await import("./team-AFOKQ7YQ.js");
231
+ const { teamHandoffCommand } = await import("./team-XUZBPIFZ.js");
232
232
  await teamHandoffCommand(path2, options);
233
233
  });
234
234
  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) => {
235
- const { teamAcceptCommand } = await import("./team-AFOKQ7YQ.js");
235
+ const { teamAcceptCommand } = await import("./team-XUZBPIFZ.js");
236
236
  await teamAcceptCommand(handoffId, path2, options);
237
237
  });
238
238
  teamCmd.command("check [path]").description("Check for conflicts and team health issues").option("--json", "Output as JSON").action(async (path2, options) => {
239
- const { teamCheckCommand } = await import("./team-AFOKQ7YQ.js");
239
+ const { teamCheckCommand } = await import("./team-XUZBPIFZ.js");
240
240
  await teamCheckCommand(path2, options);
241
241
  });
242
242
  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) => {
243
- const { teamHistoryCommand } = await import("./team-AFOKQ7YQ.js");
243
+ const { teamHistoryCommand } = await import("./team-XUZBPIFZ.js");
244
244
  await teamHistoryCommand(path2, { ...options, limit: parseInt(options.limit) });
245
245
  });
246
246
  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) => {
247
- const { teamResetCommand } = await import("./team-AFOKQ7YQ.js");
247
+ const { teamResetCommand } = await import("./team-XUZBPIFZ.js");
248
248
  await teamResetCommand(path2, options);
249
249
  });
250
250
  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) => {
251
- const { teamSpawnCommand } = await import("./spawn-WGFJ5RQZ.js");
251
+ const { teamSpawnCommand } = await import("./spawn-7SDONTJN.js");
252
252
  await teamSpawnCommand(agent, path2, options);
253
253
  });
254
254
  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) => {
255
- const { teamOrchestrateCommand } = await import("./orchestrate-BGRFBGBH.js");
255
+ const { teamOrchestrateCommand } = await import("./orchestrate-IV54FMHD.js");
256
256
  await teamOrchestrateCommand(task, path2, options);
257
257
  });
258
258
  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) => {
259
- const { teamDiffCommand } = await import("./diff-PZAYCIAE.js");
259
+ const { teamDiffCommand } = await import("./diff-4FV7T35U.js");
260
260
  await teamDiffCommand(orchestrationId, path2, options);
261
261
  });
262
262
  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) => {
263
- const { teamAcceptOrchestrationCommand } = await import("./accept-orchestration-Z35I5AYN.js");
263
+ const { teamAcceptOrchestrationCommand } = await import("./accept-orchestration-YKMKMWGA.js");
264
264
  await teamAcceptOrchestrationCommand(orchestrationId, path2, options);
265
265
  });
266
266
  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) => {
267
- const { teamRejectOrchestrationCommand } = await import("./accept-orchestration-Z35I5AYN.js");
267
+ const { teamRejectOrchestrationCommand } = await import("./accept-orchestration-YKMKMWGA.js");
268
268
  await teamRejectOrchestrationCommand(orchestrationId, path2, options);
269
269
  });
270
270
  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) => {
@@ -280,7 +280,7 @@ teamCmd.command("providers [path]").description("Show available agent providers
280
280
  await teamProvidersCommand(path2, options);
281
281
  });
282
282
  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) => {
283
- const { teamModelsCommand } = await import("./team-AFOKQ7YQ.js");
283
+ const { teamModelsCommand } = await import("./team-XUZBPIFZ.js");
284
284
  await teamModelsCommand(path2, options);
285
285
  });
286
286
  var agentsCmd = teamCmd.command("agents").description("Agent management commands");
@@ -295,7 +295,7 @@ agentsCmd.action(() => {
295
295
  console.log("\nRun `paradigm team agents suggest --help` for options.\n");
296
296
  });
297
297
  teamCmd.action(async () => {
298
- const { teamStatusCommand } = await import("./team-AFOKQ7YQ.js");
298
+ const { teamStatusCommand } = await import("./team-XUZBPIFZ.js");
299
299
  await teamStatusCommand(void 0, {});
300
300
  });
301
301
  var pluginCmd = program.command("plugin").description("Plugin management commands");
@@ -309,23 +309,23 @@ pluginCmd.action(async () => {
309
309
  });
310
310
  var workspaceCmd = program.command("workspace").description("Multi-project workspace commands");
311
311
  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) => {
312
- const { workspaceInitCommand } = await import("./workspace-VBTW7OYL.js");
312
+ const { workspaceInitCommand } = await import("./workspace-7CWY4IWV.js");
313
313
  await workspaceInitCommand(options);
314
314
  });
315
315
  workspaceCmd.command("status").description("Show workspace member status and symbol counts").option("--json", "Output as JSON").action(async (options) => {
316
- const { workspaceStatusCommand } = await import("./workspace-VBTW7OYL.js");
316
+ const { workspaceStatusCommand } = await import("./workspace-7CWY4IWV.js");
317
317
  await workspaceStatusCommand(options);
318
318
  });
319
319
  workspaceCmd.command("reindex").description("Rebuild scan-index.json for all workspace members").option("-q, --quiet", "Suppress progress output").action(async (options) => {
320
- const { workspaceReindexCommand } = await import("./workspace-VBTW7OYL.js");
320
+ const { workspaceReindexCommand } = await import("./workspace-7CWY4IWV.js");
321
321
  await workspaceReindexCommand(options);
322
322
  });
323
323
  workspaceCmd.action(async () => {
324
- const { workspaceStatusCommand } = await import("./workspace-VBTW7OYL.js");
324
+ const { workspaceStatusCommand } = await import("./workspace-7CWY4IWV.js");
325
325
  await workspaceStatusCommand({});
326
326
  });
327
327
  program.command("doctor").description("Health check - validate Paradigm setup").action(async () => {
328
- const { doctorCommand } = await import("./doctor-3YQ55536.js");
328
+ const { doctorCommand } = await import("./doctor-2KM5HOK6.js");
329
329
  await doctorCommand();
330
330
  });
331
331
  var driftCmd = program.command("drift").description("Aspect anchor drift detection");
@@ -342,11 +342,11 @@ globalCmd.action(() => {
342
342
  globalCmd.outputHelp();
343
343
  });
344
344
  program.command("watch").description("Watch for changes and auto-sync IDE files").action(async () => {
345
- const { watchCommand } = await import("./watch-PAEH6MOG.js");
345
+ const { watchCommand } = await import("./watch-CL2PPS2K.js");
346
346
  await watchCommand();
347
347
  });
348
348
  program.command("summary").description("Generate .paradigm/project.md with project stats").action(async () => {
349
- const { summaryCommand } = await import("./summary-E2PU4UN2.js");
349
+ const { summaryCommand } = await import("./summary-F46FRO3Y.js");
350
350
  await summaryCommand();
351
351
  });
352
352
  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) => {
@@ -2,14 +2,14 @@
2
2
  import {
3
3
  BackgroundOrchestrator,
4
4
  Orchestrator
5
- } from "./chunk-24AAVLME.js";
5
+ } from "./chunk-CQFNTBFJ.js";
6
6
  import "./chunk-6QC3YGB6.js";
7
- import "./chunk-CP6IZGUN.js";
7
+ import "./chunk-JQYGPVLQ.js";
8
+ import "./chunk-5N5LR2KS.js";
8
9
  import {
9
10
  loadAgentsManifest
10
11
  } from "./chunk-PMXRGPRQ.js";
11
12
  import "./chunk-PBHIFAL4.js";
12
- import "./chunk-5N5LR2KS.js";
13
13
  import "./chunk-6P4IFIK2.js";
14
14
  import "./chunk-MRENOFTR.js";
15
15
  import "./chunk-IRKUEJVW.js";
@@ -1,43 +1,46 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  teamInitCommand
4
- } from "./chunk-3TWXFFZ3.js";
5
- import "./chunk-24AAVLME.js";
4
+ } from "./chunk-4PEQHWD7.js";
5
+ import "./chunk-CQFNTBFJ.js";
6
6
  import "./chunk-6QC3YGB6.js";
7
- import "./chunk-CP6IZGUN.js";
7
+ import "./chunk-JQYGPVLQ.js";
8
+ import "./chunk-5N5LR2KS.js";
8
9
  import {
9
10
  agentsConfigured
10
11
  } from "./chunk-PMXRGPRQ.js";
11
12
  import "./chunk-PBHIFAL4.js";
12
- import "./chunk-5N5LR2KS.js";
13
13
  import {
14
14
  hooksInstallCommand
15
15
  } from "./chunk-DS5QY37M.js";
16
16
  import {
17
- initCommand
18
- } from "./chunk-BC6XKMUA.js";
17
+ detectProjectRole
18
+ } from "./chunk-C3BK3E23.js";
19
19
  import {
20
- indexCommand
21
- } from "./chunk-UI3XXVJ6.js";
20
+ initCommand
21
+ } from "./chunk-K34C7NAN.js";
22
22
  import {
23
23
  detectDiscipline
24
24
  } from "./chunk-CHSHON3O.js";
25
+ import {
26
+ indexCommand
27
+ } from "./chunk-UI3XXVJ6.js";
25
28
  import "./chunk-AK5M6KJB.js";
26
29
  import "./chunk-6P4IFIK2.js";
27
30
  import "./chunk-MRENOFTR.js";
28
31
  import "./chunk-IRKUEJVW.js";
29
32
  import {
30
33
  syncCommand
31
- } from "./chunk-QHJGB5TV.js";
34
+ } from "./chunk-RP6TZYGE.js";
32
35
  import "./chunk-MW5DMGBB.js";
33
36
  import {
34
37
  doctorCommand
35
- } from "./chunk-OSYMVGWX.js";
36
- import "./chunk-2QNZ6PVD.js";
38
+ } from "./chunk-CYGHL7PQ.js";
39
+ import "./chunk-KB4XJWE3.js";
40
+ import "./chunk-YO6DVTL7.js";
37
41
  import {
38
42
  log
39
43
  } from "./chunk-4NCFWYGG.js";
40
- import "./chunk-YO6DVTL7.js";
41
44
  import "./chunk-5JGJACDU.js";
42
45
  import "./chunk-MO4EEYFW.js";
43
46
 
@@ -112,7 +115,80 @@ discipline: ${detected}`
112
115
  }
113
116
  {
114
117
  const configPath = path.join(paradigmDir, "config.yaml");
115
- if (fs.existsSync(configPath)) {
118
+ if (options.workspace && fs.existsSync(configPath)) {
119
+ const wsFilePath = options.workspacePath ? path.resolve(cwd, options.workspacePath) : path.join(path.dirname(cwd), ".paradigm-workspace");
120
+ if (fs.existsSync(wsFilePath)) {
121
+ try {
122
+ const wsConfig = yaml.load(fs.readFileSync(wsFilePath, "utf8"));
123
+ const currentName = path.basename(cwd);
124
+ const wsDir = path.dirname(wsFilePath);
125
+ const relPath = "./" + path.relative(wsDir, cwd);
126
+ const alreadyMember = wsConfig.members.some(
127
+ (m) => path.resolve(wsDir, m.path) === cwd
128
+ );
129
+ if (!alreadyMember) {
130
+ const role = detectProjectRole(currentName, cwd);
131
+ wsConfig.members.push({
132
+ name: currentName,
133
+ path: relPath,
134
+ ...role && { role }
135
+ });
136
+ fs.writeFileSync(
137
+ wsFilePath,
138
+ yaml.dump(wsConfig, { indent: 2, lineWidth: 120, noRefs: true, sortKeys: false, quotingType: '"' }),
139
+ "utf8"
140
+ );
141
+ console.log(chalk.green(` \u2713 Joined workspace: ${chalk.cyan(wsConfig.name)} (added as member)`));
142
+ } else {
143
+ console.log(chalk.green(` \u2713 Already a member of workspace: ${chalk.cyan(wsConfig.name)}`));
144
+ }
145
+ } catch (e) {
146
+ console.log(chalk.yellow(` \u26A0 Failed to join workspace: ${e.message}`));
147
+ }
148
+ } else {
149
+ try {
150
+ const currentName = path.basename(cwd);
151
+ const wsDir = path.dirname(wsFilePath);
152
+ const relPath = "./" + path.relative(wsDir, cwd);
153
+ const role = detectProjectRole(currentName, cwd);
154
+ const wsConfig = {
155
+ version: "1.0",
156
+ name: options.workspace,
157
+ members: [{ name: currentName, path: relPath, ...role && { role } }]
158
+ };
159
+ fs.mkdirSync(path.dirname(wsFilePath), { recursive: true });
160
+ fs.writeFileSync(
161
+ wsFilePath,
162
+ yaml.dump(wsConfig, { indent: 2, lineWidth: 120, noRefs: true, sortKeys: false, quotingType: '"' }),
163
+ "utf8"
164
+ );
165
+ console.log(chalk.green(` \u2713 Created workspace: ${chalk.cyan(options.workspace)} at ${chalk.gray(path.relative(cwd, wsFilePath))}`));
166
+ } catch (e) {
167
+ console.log(chalk.yellow(` \u26A0 Failed to create workspace: ${e.message}`));
168
+ }
169
+ }
170
+ try {
171
+ const configContent = fs.readFileSync(configPath, "utf8");
172
+ const config = yaml.load(configContent);
173
+ const relWsPath = path.relative(cwd, wsFilePath);
174
+ if (config.workspace !== relWsPath) {
175
+ if (config.workspace) {
176
+ const updated = configContent.replace(
177
+ /^workspace:\s*.*$/m,
178
+ `workspace: "${relWsPath}"`
179
+ );
180
+ fs.writeFileSync(configPath, updated, "utf8");
181
+ } else {
182
+ const updated = configContent.trimEnd() + `
183
+ workspace: "${relWsPath}"
184
+ `;
185
+ fs.writeFileSync(configPath, updated, "utf8");
186
+ }
187
+ console.log(chalk.green(` \u2713 Linked workspace in config.yaml`));
188
+ }
189
+ } catch {
190
+ }
191
+ } else if (fs.existsSync(configPath)) {
116
192
  try {
117
193
  const configContent = fs.readFileSync(configPath, "utf8");
118
194
  const config = yaml.load(configContent);
@@ -167,6 +243,25 @@ workspace: "${relPath}"
167
243
  } else {
168
244
  spinner.succeed(chalk.gray("Step 3/6: Skipped scan (--quick mode)"));
169
245
  }
246
+ {
247
+ const configPath = path.join(paradigmDir, "config.yaml");
248
+ if (fs.existsSync(configPath)) {
249
+ try {
250
+ const configForWs = yaml.load(fs.readFileSync(configPath, "utf8"));
251
+ if (configForWs.workspace) {
252
+ spinner.start("Step 3b/6: Reindexing workspace members...");
253
+ try {
254
+ const { workspaceReindexCommand } = await import("./workspace-7CWY4IWV.js");
255
+ await workspaceReindexCommand({ quiet: true });
256
+ spinner.succeed(chalk.green("Workspace members reindexed"));
257
+ } catch (e) {
258
+ spinner.warn(chalk.yellow(`Workspace reindex: ${e.message}`));
259
+ }
260
+ }
261
+ } catch {
262
+ }
263
+ }
264
+ }
170
265
  const lorePath = path.join(cwd, ".paradigm", "lore");
171
266
  if (!fs.existsSync(lorePath)) {
172
267
  fs.mkdirSync(lorePath, { recursive: true });
@@ -232,6 +327,18 @@ workspace: "${relPath}"
232
327
  { path: ".claude/hooks/", desc: "Claude Code enforcement hooks", isDir: true, optional: true },
233
328
  { path: ".cursor/hooks/", desc: "Cursor enforcement hooks", isDir: true, optional: true }
234
329
  ];
330
+ const configPathForSummary = path.join(paradigmDir, "config.yaml");
331
+ if (fs.existsSync(configPathForSummary)) {
332
+ try {
333
+ const cfg = yaml.load(fs.readFileSync(configPathForSummary, "utf8"));
334
+ if (typeof cfg.workspace === "string") {
335
+ const wsAbsPath = path.resolve(cwd, cfg.workspace);
336
+ const wsRelPath = path.relative(cwd, wsAbsPath);
337
+ files.push({ path: wsRelPath, desc: "Multi-project workspace", optional: true });
338
+ }
339
+ } catch {
340
+ }
341
+ }
235
342
  for (const file of files) {
236
343
  const fullPath = path.join(cwd, file.path);
237
344
  if (fs.existsSync(fullPath)) {
@@ -251,10 +358,14 @@ workspace: "${relPath}"
251
358
  console.log("");
252
359
  console.log(chalk.white(" Next steps:"));
253
360
  console.log(chalk.gray(" \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"));
254
- console.log(chalk.white(" 1. ") + chalk.gray("Edit ") + chalk.cyan(".purpose") + chalk.gray(" to define your features"));
255
- console.log(chalk.white(" 2. ") + chalk.gray("Create ") + chalk.cyan("portal.yaml") + chalk.gray(" if you have authorization"));
256
- console.log(chalk.white(" 3. ") + chalk.gray("Add ") + chalk.cyan(".purpose") + chalk.gray(" files to feature directories"));
257
- console.log(chalk.white(" 4. ") + chalk.gray("Run ") + chalk.cyan("paradigm shift --verify") + chalk.gray(" to check health"));
361
+ let nextStep = 1;
362
+ if (options.workspace) {
363
+ console.log(chalk.white(` ${nextStep++}. `) + chalk.gray("Run ") + chalk.cyan(`paradigm shift --workspace "${options.workspace}"`) + chalk.gray(" in sibling projects"));
364
+ }
365
+ console.log(chalk.white(` ${nextStep++}. `) + chalk.gray("Edit ") + chalk.cyan(".purpose") + chalk.gray(" to define your features"));
366
+ console.log(chalk.white(` ${nextStep++}. `) + chalk.gray("Create ") + chalk.cyan("portal.yaml") + chalk.gray(" if you have authorization"));
367
+ console.log(chalk.white(` ${nextStep++}. `) + chalk.gray("Add ") + chalk.cyan(".purpose") + chalk.gray(" files to feature directories"));
368
+ console.log(chalk.white(` ${nextStep++}. `) + chalk.gray("Run ") + chalk.cyan("paradigm shift --verify") + chalk.gray(" to check health"));
258
369
  console.log("");
259
370
  tracker.success("Paradigm shift complete", { project: projectName });
260
371
  }
@@ -1,14 +1,14 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  AgentSpawner
4
- } from "./chunk-CP6IZGUN.js";
4
+ } from "./chunk-JQYGPVLQ.js";
5
+ import {
6
+ getBestProvider
7
+ } from "./chunk-5N5LR2KS.js";
5
8
  import {
6
9
  loadAgentsManifest
7
10
  } from "./chunk-PMXRGPRQ.js";
8
11
  import "./chunk-PBHIFAL4.js";
9
- import {
10
- getBestProvider
11
- } from "./chunk-5N5LR2KS.js";
12
12
  import {
13
13
  formatTokens
14
14
  } from "./chunk-5JGJACDU.js";
@@ -7,7 +7,7 @@ import "./chunk-IRKUEJVW.js";
7
7
  import {
8
8
  detectIDE,
9
9
  getAdapter
10
- } from "./chunk-2QNZ6PVD.js";
10
+ } from "./chunk-KB4XJWE3.js";
11
11
  import "./chunk-YO6DVTL7.js";
12
12
  import "./chunk-MO4EEYFW.js";
13
13
 
@@ -1,10 +1,10 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  syncCommand
4
- } from "./chunk-QHJGB5TV.js";
5
- import "./chunk-2QNZ6PVD.js";
6
- import "./chunk-4NCFWYGG.js";
4
+ } from "./chunk-RP6TZYGE.js";
5
+ import "./chunk-KB4XJWE3.js";
7
6
  import "./chunk-YO6DVTL7.js";
7
+ import "./chunk-4NCFWYGG.js";
8
8
  import "./chunk-MO4EEYFW.js";
9
9
  export {
10
10
  syncCommand
@@ -1,11 +1,11 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  loadParadigmFiles
4
- } from "./chunk-2QNZ6PVD.js";
4
+ } from "./chunk-KB4XJWE3.js";
5
+ import "./chunk-YO6DVTL7.js";
5
6
  import {
6
7
  log
7
8
  } from "./chunk-4NCFWYGG.js";
8
- import "./chunk-YO6DVTL7.js";
9
9
  import "./chunk-MO4EEYFW.js";
10
10
 
11
11
  // src/commands/sync-llms.ts
@@ -8,13 +8,13 @@ import {
8
8
  teamModelsCommand,
9
9
  teamResetCommand,
10
10
  teamStatusCommand
11
- } from "./chunk-3TWXFFZ3.js";
12
- import "./chunk-24AAVLME.js";
11
+ } from "./chunk-4PEQHWD7.js";
12
+ import "./chunk-CQFNTBFJ.js";
13
13
  import "./chunk-6QC3YGB6.js";
14
- import "./chunk-CP6IZGUN.js";
14
+ import "./chunk-JQYGPVLQ.js";
15
+ import "./chunk-5N5LR2KS.js";
15
16
  import "./chunk-PMXRGPRQ.js";
16
17
  import "./chunk-PBHIFAL4.js";
17
- import "./chunk-5N5LR2KS.js";
18
18
  import "./chunk-6P4IFIK2.js";
19
19
  import "./chunk-MRENOFTR.js";
20
20
  import "./chunk-IRKUEJVW.js";
@@ -3,7 +3,7 @@ import {
3
3
  detectIDE,
4
4
  loadParadigmFiles,
5
5
  syncToIDE
6
- } from "./chunk-2QNZ6PVD.js";
6
+ } from "./chunk-KB4XJWE3.js";
7
7
  import {
8
8
  parseParadigmConfig,
9
9
  serializeParadigmConfig
@@ -3,7 +3,7 @@ import {
3
3
  detectIDE,
4
4
  loadParadigmFiles,
5
5
  syncToIDE
6
- } from "./chunk-2QNZ6PVD.js";
6
+ } from "./chunk-KB4XJWE3.js";
7
7
  import "./chunk-YO6DVTL7.js";
8
8
  import "./chunk-MO4EEYFW.js";
9
9
 
@@ -0,0 +1,20 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ detectProjectRole,
4
+ workspaceInitCommand,
5
+ workspaceReindexCommand,
6
+ workspaceStatusCommand
7
+ } from "./chunk-C3BK3E23.js";
8
+ import "./chunk-UI3XXVJ6.js";
9
+ import "./chunk-AK5M6KJB.js";
10
+ import "./chunk-6P4IFIK2.js";
11
+ import "./chunk-MRENOFTR.js";
12
+ import "./chunk-IRKUEJVW.js";
13
+ import "./chunk-4NCFWYGG.js";
14
+ import "./chunk-MO4EEYFW.js";
15
+ export {
16
+ detectProjectRole,
17
+ workspaceInitCommand,
18
+ workspaceReindexCommand,
19
+ workspaceStatusCommand
20
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@a-company/paradigm",
3
- "version": "3.11.0",
3
+ "version": "3.12.0",
4
4
  "description": "Unified CLI for Paradigm developer tools",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,14 +1,14 @@
1
1
  #!/usr/bin/env node
2
+ import {
3
+ getProvider,
4
+ initializeProviders
5
+ } from "./chunk-5N5LR2KS.js";
2
6
  import {
3
7
  loadAgentsManifest
4
8
  } from "./chunk-PMXRGPRQ.js";
5
9
  import {
6
10
  AuditLogger
7
11
  } from "./chunk-PBHIFAL4.js";
8
- import {
9
- getProvider,
10
- initializeProviders
11
- } from "./chunk-5N5LR2KS.js";
12
12
  import {
13
13
  calculateCost,
14
14
  formatCost,