@a-company/paradigm 3.24.1 → 3.27.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 (36) hide show
  1. package/dist/{accept-orchestration-AAYFKS74.js → accept-orchestration-6EM5EHXA.js} +4 -4
  2. package/dist/{auto-B22FVSQI.js → auto-24ICVUH4.js} +1 -1
  3. package/dist/{chunk-EZ6XW6FB.js → chunk-7IJ5JVKT.js} +1 -1
  4. package/dist/{chunk-6EQRU7WC.js → chunk-J26YQVAK.js} +1 -1
  5. package/dist/{chunk-VHSTF72C.js → chunk-N6RNYCZD.js} +1 -1
  6. package/dist/{chunk-XKI55IFI.js → chunk-SCC77UUP.js} +82 -62
  7. package/dist/chunk-UPLDI7CN.js +1334 -0
  8. package/dist/{chunk-GC6X3YM7.js → chunk-ZOH24ZPF.js} +5 -5
  9. package/dist/conductor-CAIY5LJA.js +74 -0
  10. package/dist/{diff-QC7PWIPF.js → diff-AH7L4PRQ.js} +4 -4
  11. package/dist/discipline-5F5OVTXB.js +24 -0
  12. package/dist/{doctor-RVODPMHJ.js → doctor-INBOLZC7.js} +1 -1
  13. package/dist/index.js +57 -25
  14. package/dist/{list-CAL7KS7B.js → list-QTFWN35D.js} +3 -2
  15. package/dist/mcp.js +285 -23
  16. package/dist/{orchestrate-NNNWNELP.js → orchestrate-HMSQ2CED.js} +4 -4
  17. package/dist/{providers-NKGY36QF.js → providers-YW3FG6DA.js} +1 -1
  18. package/dist/{reindex-CMZARW5K.js → reindex-YG3KIXAK.js} +1 -1
  19. package/dist/{shift-R6TQ6MBP.js → shift-DRF5M3G6.js} +23 -17
  20. package/dist/{spawn-52PASJJL.js → spawn-DIY7T4QW.js} +2 -2
  21. package/dist/{team-JZHIH7H5.js → team-YOGT2Q2X.js} +5 -5
  22. package/dist/{timeline-B6TMGWRU.js → timeline-RKXNRMKF.js} +4 -3
  23. package/dist/university-content/courses/.purpose +4 -4
  24. package/dist/university-content/courses/para-101.json +1 -1
  25. package/dist/university-content/courses/para-201.json +18 -2
  26. package/dist/university-content/plsat/.purpose +18 -0
  27. package/dist/university-content/plsat/v3.0.json +105 -0
  28. package/dist/university-ui/assets/{index-BPzqnvrg.js → index-TcsCEBMo.js} +2 -2
  29. package/dist/university-ui/assets/{index-BPzqnvrg.js.map → index-TcsCEBMo.js.map} +1 -1
  30. package/dist/university-ui/index.html +1 -1
  31. package/package.json +1 -1
  32. package/templates/paradigm/config.yaml +1 -0
  33. package/dist/chunk-CHSHON3O.js +0 -669
  34. package/dist/{chunk-7WTOOH23.js → chunk-5SXMV4SP.js} +0 -0
  35. package/dist/{chunk-4UC6AQOC.js → chunk-C5ZE6WEX.js} +0 -0
  36. package/dist/{flow-KZKMMXJC.js → flow-UFMPVOEM.js} +1 -1
package/dist/mcp.js CHANGED
@@ -76,7 +76,7 @@ import {
76
76
  validatePersona,
77
77
  validateProtocol,
78
78
  validatePurposeFile
79
- } from "./chunk-EZ6XW6FB.js";
79
+ } from "./chunk-7IJ5JVKT.js";
80
80
  import {
81
81
  deleteLoreEntry,
82
82
  loadLoreEntries,
@@ -757,7 +757,8 @@ async function loadProjectContext(rootDir) {
757
757
  if (config && typeof config.workspace === "string") {
758
758
  workspace = loadWorkspaceContext(absoluteRoot, config.workspace);
759
759
  }
760
- } catch {
760
+ } catch (e) {
761
+ console.error(`[paradigm] Warning: Failed to load workspace config: ${e.message}`);
761
762
  }
762
763
  }
763
764
  return {
@@ -2025,8 +2026,8 @@ function registerResources(server, getContext2) {
2025
2026
  }
2026
2027
 
2027
2028
  // ../paradigm-mcp/src/tools/index.ts
2028
- import * as os3 from "os";
2029
- import * as path28 from "path";
2029
+ import * as os4 from "os";
2030
+ import * as path29 from "path";
2030
2031
  import {
2031
2032
  ListToolsRequestSchema,
2032
2033
  CallToolRequestSchema
@@ -2790,7 +2791,7 @@ function navigateExplore(config, target, rootDir) {
2790
2791
  }
2791
2792
  if (result.paths.length === 0) {
2792
2793
  const areaSymbols = Object.entries(config.symbols).filter(
2793
- ([sym, path29]) => sym.toLowerCase().includes(targetLower) || path29.toLowerCase().includes(targetLower)
2794
+ ([sym, path30]) => sym.toLowerCase().includes(targetLower) || path30.toLowerCase().includes(targetLower)
2794
2795
  ).slice(0, 10);
2795
2796
  result.paths = [...new Set(areaSymbols.map(([, p]) => p))];
2796
2797
  result.symbols = areaSymbols.map(([s]) => s);
@@ -11288,8 +11289,8 @@ function generateRunId() {
11288
11289
  var TEMPLATE_REGEX = /\{\{([^}]+)\}\}/g;
11289
11290
  function interpolate(value, scope) {
11290
11291
  if (typeof value === "string") {
11291
- return value.replace(TEMPLATE_REGEX, (_match, path29) => {
11292
- const resolved = resolvePath(path29.trim(), scope);
11292
+ return value.replace(TEMPLATE_REGEX, (_match, path30) => {
11293
+ const resolved = resolvePath(path30.trim(), scope);
11293
11294
  return resolved !== void 0 ? String(resolved) : _match;
11294
11295
  });
11295
11296
  }
@@ -11322,8 +11323,8 @@ function resolvePath(dotPath, scope) {
11322
11323
  return void 0;
11323
11324
  }
11324
11325
  }
11325
- function deepGet(obj, path29) {
11326
- const parts = path29.split(/[.\[\]]+/).filter(Boolean);
11326
+ function deepGet(obj, path30) {
11327
+ const parts = path30.split(/[.\[\]]+/).filter(Boolean);
11327
11328
  let current = obj;
11328
11329
  for (const part of parts) {
11329
11330
  if (current == null || typeof current !== "object") return void 0;
@@ -11559,11 +11560,11 @@ async function runPersonaObject(rootDir, persona, options) {
11559
11560
  }
11560
11561
  async function runChain(rootDir, chainId, options) {
11561
11562
  const start = Date.now();
11562
- const fs25 = await import("fs");
11563
- const path29 = await import("path");
11563
+ const fs26 = await import("fs");
11564
+ const path30 = await import("path");
11564
11565
  const yaml15 = await import("js-yaml");
11565
- const chainPath = path29.join(rootDir, ".paradigm", "personas", "chains", `${chainId}.yaml`);
11566
- if (!fs25.existsSync(chainPath)) {
11566
+ const chainPath = path30.join(rootDir, ".paradigm", "personas", "chains", `${chainId}.yaml`);
11567
+ if (!fs26.existsSync(chainPath)) {
11567
11568
  return {
11568
11569
  chain_id: chainId,
11569
11570
  status: "error",
@@ -11572,7 +11573,7 @@ async function runChain(rootDir, chainId, options) {
11572
11573
  duration_ms: Date.now() - start
11573
11574
  };
11574
11575
  }
11575
- const chain = yaml15.load(fs25.readFileSync(chainPath, "utf8"));
11576
+ const chain = yaml15.load(fs26.readFileSync(chainPath, "utf8"));
11576
11577
  let permutation;
11577
11578
  if (options.permutation && chain.permutations) {
11578
11579
  permutation = chain.permutations.find((p) => p.id === options.permutation);
@@ -11676,8 +11677,8 @@ function validateInterpolation(persona) {
11676
11677
  const serialized = JSON.stringify(step);
11677
11678
  const templates = serialized.match(TEMPLATE_REGEX) || [];
11678
11679
  for (const template of templates) {
11679
- const path29 = template.replace("{{", "").replace("}}", "").trim();
11680
- const [namespace, ...rest] = path29.split(".");
11680
+ const path30 = template.replace("{{", "").replace("}}", "").trim();
11681
+ const [namespace, ...rest] = path30.split(".");
11681
11682
  const key = rest.join(".");
11682
11683
  switch (namespace) {
11683
11684
  case "fixtures":
@@ -13742,9 +13743,259 @@ async function handlePipelineTool(name, args, ctx) {
13742
13743
  }
13743
13744
  }
13744
13745
 
13745
- // ../paradigm-mcp/src/tools/fallback-grep.ts
13746
- import * as path27 from "path";
13746
+ // ../paradigm-mcp/src/tools/conductor.ts
13747
13747
  import { execSync as execSync5 } from "child_process";
13748
+
13749
+ // ../paradigm-mcp/src/utils/conductor-loader.ts
13750
+ import * as fs25 from "fs";
13751
+ import * as path27 from "path";
13752
+ import * as os3 from "os";
13753
+ var CONDUCTOR_DIR = path27.join(os3.homedir(), ".conductor");
13754
+ var SESSIONS_DIR = path27.join(CONDUCTOR_DIR, "sessions");
13755
+ function ensureSessionsDir() {
13756
+ if (!fs25.existsSync(SESSIONS_DIR)) {
13757
+ fs25.mkdirSync(SESSIONS_DIR, { recursive: true });
13758
+ }
13759
+ }
13760
+ function registerConductorSession(session) {
13761
+ ensureSessionsDir();
13762
+ const entry = {
13763
+ ...session,
13764
+ registeredAt: (/* @__PURE__ */ new Date()).toISOString()
13765
+ };
13766
+ const filePath = path27.join(SESSIONS_DIR, `${session.pid}.json`);
13767
+ fs25.writeFileSync(filePath, JSON.stringify(entry, null, 2), "utf-8");
13768
+ return entry;
13769
+ }
13770
+ function unregisterConductorSession(pid) {
13771
+ const filePath = path27.join(SESSIONS_DIR, `${pid}.json`);
13772
+ if (fs25.existsSync(filePath)) {
13773
+ fs25.unlinkSync(filePath);
13774
+ return true;
13775
+ }
13776
+ return false;
13777
+ }
13778
+ function listConductorSessions() {
13779
+ ensureSessionsDir();
13780
+ const files = fs25.readdirSync(SESSIONS_DIR).filter((f) => f.endsWith(".json"));
13781
+ const sessions = [];
13782
+ for (const file of files) {
13783
+ try {
13784
+ const content = fs25.readFileSync(path27.join(SESSIONS_DIR, file), "utf-8");
13785
+ const session = JSON.parse(content);
13786
+ sessions.push(session);
13787
+ } catch {
13788
+ }
13789
+ }
13790
+ return sessions;
13791
+ }
13792
+ function cleanStaleSessions() {
13793
+ const sessions = listConductorSessions();
13794
+ let cleaned = 0;
13795
+ for (const session of sessions) {
13796
+ if (!isProcessAlive(session.pid)) {
13797
+ unregisterConductorSession(session.pid);
13798
+ cleaned++;
13799
+ }
13800
+ }
13801
+ return cleaned;
13802
+ }
13803
+ function isProcessAlive(pid) {
13804
+ try {
13805
+ process.kill(pid, 0);
13806
+ return true;
13807
+ } catch {
13808
+ return false;
13809
+ }
13810
+ }
13811
+
13812
+ // ../paradigm-mcp/src/tools/conductor.ts
13813
+ function getConductorToolsList() {
13814
+ return [
13815
+ {
13816
+ name: "paradigm_conductor_register",
13817
+ description: 'Register this Claude Code session with Paradigm Conductor. Makes the session visible in the Conductor overlay for voice/gesture/gaze dispatch. Call this when the user says "/conduct" or wants to surface a session to Conductor. ~100 tokens.',
13818
+ inputSchema: {
13819
+ type: "object",
13820
+ properties: {
13821
+ label: {
13822
+ type: "string",
13823
+ description: 'Human-readable label for this session (e.g., "backend refactor", "auth feature")'
13824
+ },
13825
+ terminal: {
13826
+ type: "string",
13827
+ description: 'Terminal bundle ID (e.g., "com.mitchellh.ghostty"). Auto-detected if omitted.'
13828
+ }
13829
+ },
13830
+ required: []
13831
+ },
13832
+ annotations: {
13833
+ title: "Register with Conductor",
13834
+ readOnlyHint: false,
13835
+ destructiveHint: false,
13836
+ idempotentHint: true,
13837
+ openWorldHint: false
13838
+ }
13839
+ },
13840
+ {
13841
+ name: "paradigm_conductor_unregister",
13842
+ description: "Unregister this Claude Code session from Paradigm Conductor. Removes it from the Conductor overlay. Call when ending a session or when the user wants to hide from Conductor. ~50 tokens.",
13843
+ inputSchema: {
13844
+ type: "object",
13845
+ properties: {},
13846
+ required: []
13847
+ },
13848
+ annotations: {
13849
+ title: "Unregister from Conductor",
13850
+ readOnlyHint: false,
13851
+ destructiveHint: false,
13852
+ idempotentHint: true,
13853
+ openWorldHint: false
13854
+ }
13855
+ },
13856
+ {
13857
+ name: "paradigm_conductor_list",
13858
+ description: "List all Claude Code sessions currently registered with Paradigm Conductor. Shows PIDs, project dirs, and labels. ~150 tokens.",
13859
+ inputSchema: {
13860
+ type: "object",
13861
+ properties: {
13862
+ clean: {
13863
+ type: "boolean",
13864
+ description: "If true, clean up stale sessions (dead PIDs) before listing"
13865
+ }
13866
+ },
13867
+ required: []
13868
+ },
13869
+ annotations: {
13870
+ title: "List Conductor sessions",
13871
+ readOnlyHint: true,
13872
+ destructiveHint: false,
13873
+ idempotentHint: true,
13874
+ openWorldHint: false
13875
+ }
13876
+ }
13877
+ ];
13878
+ }
13879
+ async function handleConductorTool(name, args, ctx) {
13880
+ switch (name) {
13881
+ case "paradigm_conductor_register": {
13882
+ 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
+ }
13897
+ let parentPid;
13898
+ try {
13899
+ const ppid = execSync5(`ps -o ppid= -p ${pid}`, {
13900
+ encoding: "utf-8",
13901
+ timeout: 3e3
13902
+ }).trim();
13903
+ parentPid = parseInt(ppid, 10);
13904
+ if (isNaN(parentPid)) parentPid = void 0;
13905
+ } catch {
13906
+ }
13907
+ const session = registerConductorSession({
13908
+ pid,
13909
+ parentPid,
13910
+ projectDir: projectDir2,
13911
+ terminal,
13912
+ label: args.label,
13913
+ branch
13914
+ });
13915
+ const lines = [
13916
+ `\u2713 Registered with Conductor`,
13917
+ ``,
13918
+ ` PID: ${session.pid}`,
13919
+ ` Project: ${session.projectDir}`
13920
+ ];
13921
+ if (session.branch) lines.push(` Branch: ${session.branch}`);
13922
+ if (session.label) lines.push(` Label: ${session.label}`);
13923
+ if (session.terminal) lines.push(` Terminal: ${session.terminal}`);
13924
+ lines.push(` File: ~/.conductor/sessions/${session.pid}.json`);
13925
+ lines.push(``);
13926
+ lines.push(`This session is now visible in Paradigm Conductor.`);
13927
+ lines.push(`Conductor will auto-discover it via the registration file.`);
13928
+ return { text: lines.join("\n"), handled: true };
13929
+ }
13930
+ case "paradigm_conductor_unregister": {
13931
+ const pid = process.pid;
13932
+ const removed = unregisterConductorSession(pid);
13933
+ if (removed) {
13934
+ return {
13935
+ text: `\u2713 Unregistered from Conductor (PID ${pid}).
13936
+ This session is no longer visible in the Conductor overlay.`,
13937
+ handled: true
13938
+ };
13939
+ } else {
13940
+ return {
13941
+ text: `Session (PID ${pid}) was not registered with Conductor.`,
13942
+ handled: true
13943
+ };
13944
+ }
13945
+ }
13946
+ case "paradigm_conductor_list": {
13947
+ if (args.clean) {
13948
+ const cleaned = cleanStaleSessions();
13949
+ if (cleaned > 0) {
13950
+ }
13951
+ }
13952
+ const sessions = listConductorSessions();
13953
+ if (sessions.length === 0) {
13954
+ return {
13955
+ text: "No sessions registered with Conductor.\nUse paradigm_conductor_register or /conduct to register.",
13956
+ handled: true
13957
+ };
13958
+ }
13959
+ const lines = [`${sessions.length} session(s) registered with Conductor:
13960
+ `];
13961
+ for (const s of sessions) {
13962
+ const parts = [` PID ${s.pid}`];
13963
+ if (s.label) parts.push(`"${s.label}"`);
13964
+ parts.push(`\u2014 ${s.projectDir}`);
13965
+ if (s.branch) parts.push(`(${s.branch})`);
13966
+ lines.push(parts.join(" "));
13967
+ }
13968
+ if (args.clean) {
13969
+ lines.push(`
13970
+ (Stale sessions cleaned)`);
13971
+ }
13972
+ return { text: lines.join("\n"), handled: true };
13973
+ }
13974
+ default:
13975
+ return { text: "", handled: false };
13976
+ }
13977
+ }
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
+
13996
+ // ../paradigm-mcp/src/tools/fallback-grep.ts
13997
+ import * as path28 from "path";
13998
+ import { execSync as execSync6 } from "child_process";
13748
13999
  function grepForReferences(rootDir, symbol, options = {}) {
13749
14000
  const { maxResults = 20 } = options;
13750
14001
  const results = [];
@@ -13758,7 +14009,7 @@ function grepForReferences(rootDir, symbol, options = {}) {
13758
14009
  let output = "";
13759
14010
  for (const cmd of grepCommands) {
13760
14011
  try {
13761
- output = execSync5(cmd, { encoding: "utf8", maxBuffer: 1024 * 1024 });
14012
+ output = execSync6(cmd, { encoding: "utf8", maxBuffer: 1024 * 1024 });
13762
14013
  if (output.trim()) break;
13763
14014
  } catch {
13764
14015
  continue;
@@ -13772,7 +14023,7 @@ function grepForReferences(rootDir, symbol, options = {}) {
13772
14023
  const match = line.match(/^(.+?):(\d+):(.*)$/);
13773
14024
  if (match) {
13774
14025
  const [, filePath, lineNum, content] = match;
13775
- const relativePath = path27.relative(rootDir, filePath);
14026
+ const relativePath = path28.relative(rootDir, filePath);
13776
14027
  let context2 = "unknown";
13777
14028
  if (relativePath.includes(".purpose") || relativePath.includes("portal.yaml")) {
13778
14029
  context2 = "purpose";
@@ -14041,6 +14292,8 @@ function registerTools(server, getContext2, reloadContext2) {
14041
14292
  ...getHeatmapToolsList(),
14042
14293
  // Pipeline tools
14043
14294
  ...getPipelineToolsList(),
14295
+ // Conductor session registration tools
14296
+ ...getConductorToolsList(),
14044
14297
  // Plugin update check
14045
14298
  {
14046
14299
  name: "paradigm_plugin_check",
@@ -14431,7 +14684,7 @@ function registerTools(server, getContext2, reloadContext2) {
14431
14684
  const symbols = getSymbolsByType(ctx.index, type);
14432
14685
  examples[type] = symbols.slice(0, 3).map((s) => s.symbol);
14433
14686
  }
14434
- const platform2 = os3.platform();
14687
+ const platform2 = os4.platform();
14435
14688
  const isWindows = platform2 === "win32";
14436
14689
  const shell = isWindows ? "PowerShell/CMD" : platform2 === "darwin" ? "zsh/bash" : "bash";
14437
14690
  let protocols;
@@ -14671,10 +14924,10 @@ Update command:
14671
14924
  trackToolCall(noWsText.length, name);
14672
14925
  return { content: [{ type: "text", text: noWsText }] };
14673
14926
  }
14674
- const { rebuildStaticFiles: rebuildStaticFiles2 } = await import("./reindex-CMZARW5K.js");
14927
+ const { rebuildStaticFiles: rebuildStaticFiles2 } = await import("./reindex-YG3KIXAK.js");
14675
14928
  const memberResults = [];
14676
14929
  for (const member of ctx.workspace.config.members) {
14677
- const memberAbsPath = path28.resolve(path28.dirname(ctx.workspace.workspacePath), member.path);
14930
+ const memberAbsPath = path29.resolve(path29.dirname(ctx.workspace.workspacePath), member.path);
14678
14931
  try {
14679
14932
  const result = await rebuildStaticFiles2(memberAbsPath);
14680
14933
  memberResults.push({
@@ -14889,6 +15142,15 @@ Update command:
14889
15142
  };
14890
15143
  }
14891
15144
  }
15145
+ if (name.startsWith("paradigm_conductor_")) {
15146
+ const result = await handleConductorTool(name, args, ctx);
15147
+ if (result.handled) {
15148
+ trackToolCall(result.text.length, name);
15149
+ return {
15150
+ content: [{ type: "text", text: result.text }]
15151
+ };
15152
+ }
15153
+ }
14892
15154
  if (name === "paradigm_reindex") {
14893
15155
  const reload = reloadContext2 || (async () => {
14894
15156
  });
@@ -2,14 +2,15 @@
2
2
  import {
3
3
  BackgroundOrchestrator,
4
4
  Orchestrator
5
- } from "./chunk-GC6X3YM7.js";
5
+ } from "./chunk-ZOH24ZPF.js";
6
6
  import "./chunk-6QC3YGB6.js";
7
- import "./chunk-6EQRU7WC.js";
7
+ import "./chunk-J26YQVAK.js";
8
8
  import "./chunk-PBHIFAL4.js";
9
- import "./chunk-7WTOOH23.js";
9
+ import "./chunk-5SXMV4SP.js";
10
10
  import {
11
11
  loadAgentsManifest
12
12
  } from "./chunk-PMXRGPRQ.js";
13
+ import "./chunk-MW5DMGBB.js";
13
14
  import {
14
15
  formatCost,
15
16
  formatTokens
@@ -17,7 +18,6 @@ import {
17
18
  import "./chunk-6P4IFIK2.js";
18
19
  import "./chunk-MRENOFTR.js";
19
20
  import "./chunk-IRKUEJVW.js";
20
- import "./chunk-MW5DMGBB.js";
21
21
  import "./chunk-ZXMDA7VB.js";
22
22
 
23
23
  // src/commands/team/orchestrate.ts
@@ -4,7 +4,7 @@ import {
4
4
  getBestProvider,
5
5
  getConfiguredProvider,
6
6
  setConfiguredProvider
7
- } from "./chunk-7WTOOH23.js";
7
+ } from "./chunk-5SXMV4SP.js";
8
8
  import "./chunk-ZXMDA7VB.js";
9
9
 
10
10
  // src/commands/team/providers.ts
@@ -3,7 +3,7 @@ import {
3
3
  getReindexToolsList,
4
4
  handleReindexTool,
5
5
  rebuildStaticFiles
6
- } from "./chunk-EZ6XW6FB.js";
6
+ } from "./chunk-7IJ5JVKT.js";
7
7
  import "./chunk-3DYYXGDC.js";
8
8
  export {
9
9
  getReindexToolsList,
@@ -1,12 +1,12 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  teamInitCommand
4
- } from "./chunk-VHSTF72C.js";
5
- import "./chunk-GC6X3YM7.js";
4
+ } from "./chunk-N6RNYCZD.js";
5
+ import "./chunk-ZOH24ZPF.js";
6
6
  import "./chunk-6QC3YGB6.js";
7
- import "./chunk-6EQRU7WC.js";
7
+ import "./chunk-J26YQVAK.js";
8
8
  import "./chunk-PBHIFAL4.js";
9
- import "./chunk-7WTOOH23.js";
9
+ import "./chunk-5SXMV4SP.js";
10
10
  import {
11
11
  agentsConfigured
12
12
  } from "./chunk-PMXRGPRQ.js";
@@ -16,16 +16,14 @@ import {
16
16
  import {
17
17
  detectProjectRole
18
18
  } from "./chunk-OXG5GVDJ.js";
19
+ import "./chunk-MW5DMGBB.js";
19
20
  import {
20
21
  doctorCommand
21
- } from "./chunk-4UC6AQOC.js";
22
+ } from "./chunk-C5ZE6WEX.js";
22
23
  import "./chunk-5JGJACDU.js";
23
24
  import {
24
25
  initCommand
25
- } from "./chunk-XKI55IFI.js";
26
- import {
27
- detectDiscipline
28
- } from "./chunk-CHSHON3O.js";
26
+ } from "./chunk-SCC77UUP.js";
29
27
  import {
30
28
  indexCommand
31
29
  } from "./chunk-W4VFKZVF.js";
@@ -34,6 +32,9 @@ import "./chunk-6P4IFIK2.js";
34
32
  import "./chunk-MRENOFTR.js";
35
33
  import "./chunk-IRKUEJVW.js";
36
34
  import "./chunk-Z7W7HNRG.js";
35
+ import {
36
+ detectDiscipline
37
+ } from "./chunk-UPLDI7CN.js";
37
38
  import {
38
39
  syncCommand
39
40
  } from "./chunk-RP6TZYGE.js";
@@ -42,7 +43,6 @@ import "./chunk-YO6DVTL7.js";
42
43
  import {
43
44
  log
44
45
  } from "./chunk-4NCFWYGG.js";
45
- import "./chunk-MW5DMGBB.js";
46
46
  import "./chunk-ZXMDA7VB.js";
47
47
 
48
48
  // src/commands/shift.ts
@@ -72,7 +72,8 @@ async function shiftCommand(options = {}) {
72
72
  force: options.force,
73
73
  quick: true,
74
74
  // We'll scan separately for better UX
75
- name: projectName
75
+ name: projectName,
76
+ stack: options.stack
76
77
  });
77
78
  spinner.succeed(chalk.green("Paradigm initialized"));
78
79
  } catch (error) {
@@ -110,7 +111,8 @@ discipline: ${detected}`
110
111
  }
111
112
  }
112
113
  }
113
- } catch {
114
+ } catch (e) {
115
+ log.operation("shift").debug("Discipline detection failed", { error: e.message });
114
116
  }
115
117
  }
116
118
  }
@@ -187,7 +189,8 @@ workspace: "${relWsPath}"
187
189
  }
188
190
  console.log(chalk.green(` \u2713 Linked workspace in config.yaml`));
189
191
  }
190
- } catch {
192
+ } catch (e) {
193
+ log.operation("shift").debug("Workspace config link failed", { error: e.message });
191
194
  }
192
195
  } else if (fs.existsSync(configPath)) {
193
196
  try {
@@ -211,7 +214,8 @@ workspace: "${relPath}"
211
214
  searchDir = parent;
212
215
  }
213
216
  }
214
- } catch {
217
+ } catch (e) {
218
+ log.operation("shift").debug("Workspace auto-detect failed", { error: e.message });
215
219
  }
216
220
  }
217
221
  }
@@ -259,7 +263,8 @@ workspace: "${relPath}"
259
263
  spinner.warn(chalk.yellow(`Workspace reindex: ${e.message}`));
260
264
  }
261
265
  }
262
- } catch {
266
+ } catch (e) {
267
+ log.operation("shift").debug("Workspace config read failed", { error: e.message });
263
268
  }
264
269
  }
265
270
  }
@@ -275,7 +280,7 @@ workspace: "${relPath}"
275
280
  try {
276
281
  await syncCommand(ide, { quiet: true, force: true });
277
282
  syncResults.push(ide);
278
- } catch {
283
+ } catch (e) {
279
284
  }
280
285
  }
281
286
  if (syncResults.length > 0) {
@@ -337,7 +342,8 @@ workspace: "${relPath}"
337
342
  const wsRelPath = path.relative(cwd, wsAbsPath);
338
343
  files.push({ path: wsRelPath, desc: "Multi-project workspace", optional: true });
339
344
  }
340
- } catch {
345
+ } catch (e) {
346
+ log.operation("shift").debug("Summary config read failed", { error: e.message });
341
347
  }
342
348
  }
343
349
  for (const file of files) {
@@ -1,11 +1,11 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  AgentSpawner
4
- } from "./chunk-6EQRU7WC.js";
4
+ } from "./chunk-J26YQVAK.js";
5
5
  import "./chunk-PBHIFAL4.js";
6
6
  import {
7
7
  getBestProvider
8
- } from "./chunk-7WTOOH23.js";
8
+ } from "./chunk-5SXMV4SP.js";
9
9
  import {
10
10
  loadAgentsManifest
11
11
  } from "./chunk-PMXRGPRQ.js";
@@ -8,18 +8,18 @@ import {
8
8
  teamModelsCommand,
9
9
  teamResetCommand,
10
10
  teamStatusCommand
11
- } from "./chunk-VHSTF72C.js";
12
- import "./chunk-GC6X3YM7.js";
11
+ } from "./chunk-N6RNYCZD.js";
12
+ import "./chunk-ZOH24ZPF.js";
13
13
  import "./chunk-6QC3YGB6.js";
14
- import "./chunk-6EQRU7WC.js";
14
+ import "./chunk-J26YQVAK.js";
15
15
  import "./chunk-PBHIFAL4.js";
16
- import "./chunk-7WTOOH23.js";
16
+ import "./chunk-5SXMV4SP.js";
17
17
  import "./chunk-PMXRGPRQ.js";
18
+ import "./chunk-MW5DMGBB.js";
18
19
  import "./chunk-5JGJACDU.js";
19
20
  import "./chunk-6P4IFIK2.js";
20
21
  import "./chunk-MRENOFTR.js";
21
22
  import "./chunk-IRKUEJVW.js";
22
- import "./chunk-MW5DMGBB.js";
23
23
  import "./chunk-ZXMDA7VB.js";
24
24
  export {
25
25
  teamAcceptCommand,
@@ -48,7 +48,7 @@ async function loreTimelineCommand(options) {
48
48
  for (const [date, dayEntries] of byDate) {
49
49
  grouped[date] = dayEntries.map((e) => ({
50
50
  id: e.id,
51
- type: e.type,
51
+ type: e.type || "note",
52
52
  title: e.title,
53
53
  author: e.author,
54
54
  symbols: e.symbols_touched || []
@@ -81,10 +81,11 @@ async function loreTimelineCommand(options) {
81
81
  for (const [date, dayEntries] of byDate) {
82
82
  console.log(chalk.white.bold(` ${date}`) + chalk.gray(` (${dayEntries.length} entries)`));
83
83
  for (const entry of dayEntries) {
84
- const colorFn = typeColor[entry.type] || chalk.white;
84
+ const entryType = entry.type || "note";
85
+ const colorFn = typeColor[entryType] || chalk.white;
85
86
  const time = entry.timestamp.slice(11, 16);
86
87
  const authorIcon = entry.agent ? "\u{1F916}" : "\u{1F464}";
87
- console.log(` ${chalk.gray(time)} ${colorFn(entry.type.padEnd(14))} ${chalk.white(entry.title)}`);
88
+ console.log(` ${chalk.gray(time)} ${colorFn(entryType.padEnd(14))} ${chalk.white(entry.title)}`);
88
89
  console.log(` ${authorIcon} ${chalk.gray(entry.author)} ${(entry.symbols_touched || []).slice(0, 4).map((s) => chalk.cyan(s)).join(" ")}`);
89
90
  }
90
91
  console.log();
@@ -47,10 +47,10 @@ components:
47
47
  references: ["#portal-protocol"]
48
48
 
49
49
  para-101-first-steps:
50
- description: "First Steps — paradigm init, paradigm shift, setting up a project"
50
+ description: "First Steps — paradigm init, paradigm shift, stack auto-detection, cold start for existing projects"
51
51
  file: para-101.json
52
52
  tags: [course-content, para-101]
53
- references: ["#symbol-system", "#purpose-files", "#scan-index"]
53
+ references: ["#symbol-system", "#purpose-files", "#scan-index", "#stack-presets", "#cold-start"]
54
54
 
55
55
  # PARA 201: Architecture (11 lessons)
56
56
 
@@ -85,10 +85,10 @@ components:
85
85
  references: ["#portal-protocol"]
86
86
 
87
87
  para-201-disciplines:
88
- description: "Disciplines — web, backend, fullstack, api, cli, ml, monorepo symbol mappings"
88
+ description: "Disciplines and Stack Presets 14 disciplines, 16 stack presets, auto-detection, framework-specific config"
89
89
  file: para-201.json
90
90
  tags: [course-content, para-201]
91
- references: ["#symbol-system"]
91
+ references: ["#symbol-system", "#stack-presets", "#disciplines"]
92
92
 
93
93
  para-201-symbol-naming:
94
94
  description: "Symbol Naming — kebab-case, PascalCase, conventions"