@forwardimpact/pathway 0.25.22 → 0.25.25

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 (40) hide show
  1. package/bin/fit-pathway.js +117 -325
  2. package/package.json +2 -2
  3. package/src/commands/agent-io.js +1 -1
  4. package/src/commands/agent-list.js +164 -0
  5. package/src/commands/agent.js +83 -184
  6. package/src/commands/behaviour.js +22 -10
  7. package/src/commands/build-packs.js +208 -34
  8. package/src/commands/build.js +2 -2
  9. package/src/commands/command-factory.js +39 -14
  10. package/src/commands/discipline.js +24 -10
  11. package/src/commands/driver.js +28 -19
  12. package/src/commands/index.js +0 -1
  13. package/src/commands/interview.js +15 -10
  14. package/src/commands/job.js +110 -62
  15. package/src/commands/level.js +23 -11
  16. package/src/commands/progress.js +12 -7
  17. package/src/commands/questions.js +32 -14
  18. package/src/commands/skill.js +36 -18
  19. package/src/commands/stage.js +37 -27
  20. package/src/commands/tool.js +29 -19
  21. package/src/commands/track.js +23 -10
  22. package/src/formatters/questions/yaml.js +1 -1
  23. package/src/index.html +1 -1
  24. package/src/lib/cli-command.js +33 -33
  25. package/src/lib/cli-output.js +9 -189
  26. package/src/pages/agent-builder-install.js +6 -5
  27. package/src/commands/init.js +0 -64
  28. package/starter/behaviours/systems_thinking.yaml +0 -32
  29. package/starter/capabilities/delivery.yaml +0 -105
  30. package/starter/capabilities/reliability.yaml +0 -72
  31. package/starter/disciplines/software_engineering.yaml +0 -46
  32. package/starter/drivers.yaml +0 -10
  33. package/starter/framework.yaml +0 -49
  34. package/starter/levels.yaml +0 -39
  35. package/starter/questions/behaviours/.gitkeep +0 -0
  36. package/starter/questions/capabilities/.gitkeep +0 -0
  37. package/starter/questions/skills/.gitkeep +0 -0
  38. package/starter/stages.yaml +0 -21
  39. package/starter/tracks/forward_deployed.yaml +0 -33
  40. package/starter/tracks/platform.yaml +0 -33
@@ -4,9 +4,9 @@
4
4
  * Handles stage summary, listing, and detail display in the terminal.
5
5
  *
6
6
  * Usage:
7
- * bunx pathway stage # Summary with lifecycle flow
8
- * bunx pathway stage --list # IDs only (for piping)
9
- * bunx pathway stage <id> # Detail view
7
+ * npx fit-pathway stage # Summary with lifecycle flow
8
+ * npx fit-pathway stage --list # IDs only (for piping)
9
+ * npx fit-pathway stage <id> # Detail view
10
10
  */
11
11
 
12
12
  import { createEntityCommand } from "./command-factory.js";
@@ -14,12 +14,13 @@ import {
14
14
  prepareStageDetail,
15
15
  getStageEmoji,
16
16
  } from "../formatters/stage/shared.js";
17
- import { formatTable } from "../lib/cli-output.js";
18
17
  import {
18
+ formatTable,
19
19
  formatHeader,
20
20
  formatSubheader,
21
21
  formatBullet,
22
- } from "../lib/cli-output.js";
22
+ formatWarning,
23
+ } from "@forwardimpact/libcli";
23
24
 
24
25
  /**
25
26
  * Format stage list item for --list output
@@ -36,13 +37,13 @@ function formatListItem(stage) {
36
37
  * @param {Object} _data - Full data context (unused)
37
38
  */
38
39
  function formatSummary(stages, _data) {
39
- console.log("\n🔄 Stages\n");
40
+ process.stdout.write("\n" + formatHeader("\u{1F504} Stages") + "\n\n");
40
41
 
41
42
  // Show lifecycle flow
42
43
  const flow = stages
43
44
  .map((s) => `${getStageEmoji(stages, s.id)} ${s.name}`)
44
45
  .join(" → ");
45
- console.log(`Lifecycle: ${flow}\n`);
46
+ process.stdout.write(formatSubheader(`Lifecycle: ${flow}`) + "\n\n");
46
47
 
47
48
  const rows = stages.map((s) => {
48
49
  const toolCount = s.tools?.length || 0;
@@ -50,10 +51,18 @@ function formatSummary(stages, _data) {
50
51
  return [s.id, s.name, s.mode, toolCount, handoffCount];
51
52
  });
52
53
 
53
- console.log(formatTable(["ID", "Name", "Mode", "Tools", "Handoffs"], rows));
54
- console.log(`\nTotal: ${stages.length} stages`);
55
- console.log(`\nRun 'bunx pathway stage --list' for IDs and names`);
56
- console.log(`Run 'bunx pathway stage <id>' for details\n`);
54
+ process.stdout.write(
55
+ formatTable(["ID", "Name", "Mode", "Tools", "Handoffs"], rows) + "\n",
56
+ );
57
+ process.stdout.write(
58
+ "\n" + formatSubheader(`Total: ${stages.length} stages`) + "\n\n",
59
+ );
60
+ process.stdout.write(
61
+ formatBullet("Run 'npx fit-pathway stage --list' for IDs and names") + "\n",
62
+ );
63
+ process.stdout.write(
64
+ formatBullet("Run 'npx fit-pathway stage <id>' for details") + "\n\n",
65
+ );
57
66
  }
58
67
 
59
68
  /**
@@ -66,51 +75,52 @@ function formatDetail(viewAndContext, _framework) {
66
75
  const view = prepareStageDetail(stage);
67
76
  const emoji = getStageEmoji(stages, stage.id);
68
77
 
69
- console.log(formatHeader(`\n${emoji} ${view.name}\n`));
70
- console.log(`${view.description}\n`);
78
+ process.stdout.write("\n" + formatHeader(`${emoji} ${view.name}`) + "\n\n");
79
+ process.stdout.write(view.description + "\n\n");
71
80
 
72
81
  // Read checklist
73
82
  if (view.readChecklist.length > 0) {
74
- console.log(formatSubheader("Read-Then-Do Checklist\n"));
83
+ process.stdout.write(formatSubheader("Read-Then-Do Checklist") + "\n\n");
75
84
  for (const item of view.readChecklist) {
76
- console.log(formatBullet(item, 1));
85
+ process.stdout.write(formatBullet(item, 1) + "\n");
77
86
  }
78
- console.log();
87
+ process.stdout.write("\n");
79
88
  }
80
89
 
81
90
  // Confirm checklist
82
91
  if (view.confirmChecklist.length > 0) {
83
- console.log(formatSubheader("Do-Then-Confirm Checklist\n"));
92
+ process.stdout.write(formatSubheader("Do-Then-Confirm Checklist") + "\n\n");
84
93
  for (const item of view.confirmChecklist) {
85
- console.log(formatBullet(item, 1));
94
+ process.stdout.write(formatBullet(item, 1) + "\n");
86
95
  }
87
- console.log();
96
+ process.stdout.write("\n");
88
97
  }
89
98
 
90
99
  // Constraints
91
100
  if (view.constraints.length > 0) {
92
- console.log(formatSubheader("Constraints\n"));
101
+ process.stdout.write(formatSubheader("Constraints") + "\n\n");
93
102
  for (const item of view.constraints) {
94
- console.log(formatBullet(`⚠️ ${item}`, 1));
103
+ process.stdout.write(" " + formatWarning(item) + "\n");
95
104
  }
96
- console.log();
105
+ process.stdout.write("\n");
97
106
  }
98
107
 
99
108
  // Handoffs
100
109
  if (view.handoffs.length > 0) {
101
- console.log(formatSubheader("Handoffs\n"));
110
+ process.stdout.write(formatSubheader("Handoffs") + "\n\n");
102
111
  for (const handoff of view.handoffs) {
103
112
  const targetStage = stages.find((s) => s.id === handoff.target);
104
113
  const targetEmoji = getStageEmoji(stages, handoff.target);
105
114
  const targetName = targetStage?.name || handoff.target;
106
- console.log(
107
- formatBullet(`${targetEmoji} ${handoff.label} → ${targetName}`, 1),
115
+ process.stdout.write(
116
+ formatBullet(`${targetEmoji} ${handoff.label} → ${targetName}`, 1) +
117
+ "\n",
108
118
  );
109
119
  if (handoff.prompt) {
110
- console.log(` "${handoff.prompt}"`);
120
+ process.stdout.write(` "${handoff.prompt}"\n`);
111
121
  }
112
122
  }
113
- console.log();
123
+ process.stdout.write("\n");
114
124
  }
115
125
  }
116
126
 
@@ -4,9 +4,9 @@
4
4
  * Handles tool summary, listing, and detail display in the terminal.
5
5
  *
6
6
  * Usage:
7
- * bunx pathway tool # Summary with stats
8
- * bunx pathway tool --list # Tool names only (for piping)
9
- * bunx pathway tool <name> # Detail view for specific tool
7
+ * npx fit-pathway tool # Summary with stats
8
+ * npx fit-pathway tool --list # Tool names only (for piping)
9
+ * npx fit-pathway tool <name> # Detail view for specific tool
10
10
  */
11
11
 
12
12
  import { truncate } from "../formatters/shared.js";
@@ -15,7 +15,9 @@ import {
15
15
  formatTable,
16
16
  formatHeader,
17
17
  formatSubheader,
18
- } from "../lib/cli-output.js";
18
+ formatBullet,
19
+ formatError,
20
+ } from "@forwardimpact/libcli";
19
21
 
20
22
  /**
21
23
  * Run tool command
@@ -50,8 +52,8 @@ export async function runToolCommand({ data, args, options }) {
50
52
  const tool = tools.find((t) => t.name.toLowerCase() === name.toLowerCase());
51
53
 
52
54
  if (!tool) {
53
- console.error(`Tool not found: ${name}`);
54
- console.error(`Available: ${tools.map((t) => t.name).join(", ")}`);
55
+ process.stderr.write(formatError(`Tool not found: ${name}`) + "\n");
56
+ process.stderr.write(`Available: ${tools.map((t) => t.name).join(", ")}\n`);
55
57
  process.exit(1);
56
58
  }
57
59
 
@@ -69,7 +71,7 @@ export async function runToolCommand({ data, args, options }) {
69
71
  * @param {number} totalCount - Total tool count
70
72
  */
71
73
  function formatSummary(tools, totalCount) {
72
- console.log(`\n🔧 Tools\n`);
74
+ process.stdout.write("\n" + formatHeader("\u{1F527} Tools") + "\n\n");
73
75
 
74
76
  // Show tools sorted by usage count
75
77
  const sorted = [...tools].sort((a, b) => b.usages.length - a.usages.length);
@@ -83,15 +85,24 @@ function formatSummary(tools, totalCount) {
83
85
  : t.description,
84
86
  ]);
85
87
 
86
- console.log(formatTable(["Tool", "Skills", "Description"], rows));
87
- console.log(`\nTotal: ${totalCount} tools`);
88
+ process.stdout.write(
89
+ formatTable(["Tool", "Skills", "Description"], rows) + "\n",
90
+ );
91
+ process.stdout.write(
92
+ "\n" + formatSubheader(`Total: ${totalCount} tools`) + "\n",
93
+ );
88
94
  if (sorted.length > 15) {
89
- console.log(`(showing top 15 by usage)`);
95
+ process.stdout.write(formatBullet("(showing top 15 by usage)") + "\n");
90
96
  }
91
- console.log(
92
- `\nRun 'bunx pathway tool --list' for all tool names and descriptions`,
97
+ process.stdout.write("\n");
98
+ process.stdout.write(
99
+ formatBullet(
100
+ "Run 'npx fit-pathway tool --list' for all tool names and descriptions",
101
+ ) + "\n",
102
+ );
103
+ process.stdout.write(
104
+ formatBullet("Run 'npx fit-pathway tool <name>' for details") + "\n\n",
93
105
  );
94
- console.log(`Run 'bunx pathway tool <name>' for details\n`);
95
106
  }
96
107
 
97
108
  /**
@@ -99,17 +110,16 @@ function formatSummary(tools, totalCount) {
99
110
  * @param {Object} tool - Aggregated tool with usages
100
111
  */
101
112
  function formatDetail(tool) {
102
- console.log(formatHeader(`\n🔧 ${tool.name}\n`));
103
- console.log(`${tool.description}\n`);
113
+ process.stdout.write("\n" + formatHeader(`\u{1F527} ${tool.name}`) + "\n\n");
114
+ process.stdout.write(tool.description + "\n\n");
104
115
 
105
116
  if (tool.url) {
106
- console.log(`Documentation: ${tool.url}\n`);
117
+ process.stdout.write(`Documentation: ${tool.url}\n\n`);
107
118
  }
108
119
 
109
120
  if (tool.usages.length > 0) {
110
- console.log(formatSubheader("Used in Skills\n"));
121
+ process.stdout.write(formatSubheader("Used in Skills") + "\n\n");
111
122
  const rows = tool.usages.map((u) => [u.skillName, u.useWhen]);
112
- console.log(formatTable(["Skill", "Use When"], rows));
113
- console.log();
123
+ process.stdout.write(formatTable(["Skill", "Use When"], rows) + "\n\n");
114
124
  }
115
125
  }
@@ -4,16 +4,21 @@
4
4
  * Handles track summary, listing, and detail display in the terminal.
5
5
  *
6
6
  * Usage:
7
- * bunx pathway track # Summary with stats
8
- * bunx pathway track --list # IDs only (for piping)
9
- * bunx pathway track <id> # Detail view
10
- * bunx pathway track --validate # Validation checks
7
+ * npx fit-pathway track # Summary with stats
8
+ * npx fit-pathway track --list # IDs only (for piping)
9
+ * npx fit-pathway track <id> # Detail view
10
+ * npx fit-pathway track --validate # Validation checks
11
11
  */
12
12
 
13
13
  import { createEntityCommand } from "./command-factory.js";
14
14
  import { trackToMarkdown } from "../formatters/track/markdown.js";
15
15
  import { sortTracksByName } from "../formatters/track/shared.js";
16
- import { formatTable } from "../lib/cli-output.js";
16
+ import {
17
+ formatTable,
18
+ formatHeader,
19
+ formatSubheader,
20
+ formatBullet,
21
+ } from "@forwardimpact/libcli";
17
22
  import { getConceptEmoji } from "@forwardimpact/map/levels";
18
23
 
19
24
  /**
@@ -34,7 +39,7 @@ function formatSummary(tracks, data) {
34
39
  const { framework, disciplines } = data;
35
40
  const emoji = framework ? getConceptEmoji(framework, "track") : "🛤️";
36
41
 
37
- console.log(`\n${emoji} Tracks\n`);
42
+ process.stdout.write("\n" + formatHeader(`${emoji} Tracks`) + "\n\n");
38
43
 
39
44
  const rows = tracks.map((t) => {
40
45
  const modCount = Object.keys(t.skillModifiers || {}).length;
@@ -47,10 +52,18 @@ function formatSummary(tracks, data) {
47
52
  return [t.id, t.name, modCount, disciplineNames || "—"];
48
53
  });
49
54
 
50
- console.log(formatTable(["ID", "Name", "Modifiers", "Disciplines"], rows));
51
- console.log(`\nTotal: ${tracks.length} tracks`);
52
- console.log(`\nRun 'bunx pathway track --list' for IDs and names`);
53
- console.log(`Run 'bunx pathway track <id>' for details\n`);
55
+ process.stdout.write(
56
+ formatTable(["ID", "Name", "Modifiers", "Disciplines"], rows) + "\n",
57
+ );
58
+ process.stdout.write(
59
+ "\n" + formatSubheader(`Total: ${tracks.length} tracks`) + "\n\n",
60
+ );
61
+ process.stdout.write(
62
+ formatBullet("Run 'npx fit-pathway track --list' for IDs and names") + "\n",
63
+ );
64
+ process.stdout.write(
65
+ formatBullet("Run 'npx fit-pathway track <id>' for details") + "\n\n",
66
+ );
54
67
  }
55
68
 
56
69
  /**
@@ -26,7 +26,7 @@ export function questionsToYaml(view, _options = {}) {
26
26
 
27
27
  const filterStr =
28
28
  filterParts.length > 0 ? filterParts.join(" ") : "(no filters)";
29
- const header = `# Generated by: bunx pathway questions ${filterStr}\n# Questions: ${questions.length}\n\n`;
29
+ const header = `# Generated by: npx fit-pathway questions ${filterStr}\n# Questions: ${questions.length}\n\n`;
30
30
 
31
31
  // Group questions by source
32
32
  const bySource = {};
package/src/index.html CHANGED
@@ -83,7 +83,7 @@
83
83
  <div class="top-bar__command">
84
84
  <span class="top-bar__prompt">$</span>
85
85
  <span class="top-bar__command-text" id="cli-command"
86
- >bunx fit-pathway</span
86
+ >npx fit-pathway</span
87
87
  >
88
88
  <button class="top-bar__copy" id="cli-copy" aria-label="Copy command">
89
89
  <svg viewBox="0 0 24 24">
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * CLI Command Mapping
3
3
  *
4
- * Maps hash routes to their equivalent `bunx fit-pathway` CLI commands.
4
+ * Maps hash routes to their equivalent `npx fit-pathway` CLI commands.
5
5
  */
6
6
 
7
7
  /**
@@ -11,122 +11,122 @@
11
11
  */
12
12
  const ROUTE_COMMANDS = [
13
13
  // Landing
14
- { pattern: /^\/$/, toCommand: () => "bunx fit-pathway" },
14
+ { pattern: /^\/$/, toCommand: () => "npx fit-pathway" },
15
15
 
16
16
  // Entity lists
17
- { pattern: /^\/skill$/, toCommand: () => "bunx fit-pathway skill" },
18
- { pattern: /^\/behaviour$/, toCommand: () => "bunx fit-pathway behaviour" },
17
+ { pattern: /^\/skill$/, toCommand: () => "npx fit-pathway skill" },
18
+ { pattern: /^\/behaviour$/, toCommand: () => "npx fit-pathway behaviour" },
19
19
  {
20
20
  pattern: /^\/discipline$/,
21
- toCommand: () => "bunx fit-pathway discipline",
21
+ toCommand: () => "npx fit-pathway discipline",
22
22
  },
23
- { pattern: /^\/track$/, toCommand: () => "bunx fit-pathway track" },
24
- { pattern: /^\/level$/, toCommand: () => "bunx fit-pathway level" },
25
- { pattern: /^\/driver$/, toCommand: () => "bunx fit-pathway driver" },
26
- { pattern: /^\/stage$/, toCommand: () => "bunx fit-pathway stage" },
27
- { pattern: /^\/tool$/, toCommand: () => "bunx fit-pathway tool" },
23
+ { pattern: /^\/track$/, toCommand: () => "npx fit-pathway track" },
24
+ { pattern: /^\/level$/, toCommand: () => "npx fit-pathway level" },
25
+ { pattern: /^\/driver$/, toCommand: () => "npx fit-pathway driver" },
26
+ { pattern: /^\/stage$/, toCommand: () => "npx fit-pathway stage" },
27
+ { pattern: /^\/tool$/, toCommand: () => "npx fit-pathway tool" },
28
28
 
29
29
  // Entity details
30
30
  {
31
31
  pattern: /^\/skill\/(.+)$/,
32
- toCommand: (m) => `bunx fit-pathway skill ${m[1]}`,
32
+ toCommand: (m) => `npx fit-pathway skill ${m[1]}`,
33
33
  },
34
34
  {
35
35
  pattern: /^\/behaviour\/(.+)$/,
36
- toCommand: (m) => `bunx fit-pathway behaviour ${m[1]}`,
36
+ toCommand: (m) => `npx fit-pathway behaviour ${m[1]}`,
37
37
  },
38
38
  {
39
39
  pattern: /^\/discipline\/(.+)$/,
40
- toCommand: (m) => `bunx fit-pathway discipline ${m[1]}`,
40
+ toCommand: (m) => `npx fit-pathway discipline ${m[1]}`,
41
41
  },
42
42
  {
43
43
  pattern: /^\/track\/(.+)$/,
44
- toCommand: (m) => `bunx fit-pathway track ${m[1]}`,
44
+ toCommand: (m) => `npx fit-pathway track ${m[1]}`,
45
45
  },
46
46
  {
47
47
  pattern: /^\/level\/(.+)$/,
48
- toCommand: (m) => `bunx fit-pathway level ${m[1]}`,
48
+ toCommand: (m) => `npx fit-pathway level ${m[1]}`,
49
49
  },
50
50
  {
51
51
  pattern: /^\/driver\/(.+)$/,
52
- toCommand: (m) => `bunx fit-pathway driver ${m[1]}`,
52
+ toCommand: (m) => `npx fit-pathway driver ${m[1]}`,
53
53
  },
54
54
  {
55
55
  pattern: /^\/stage\/(.+)$/,
56
- toCommand: (m) => `bunx fit-pathway stage ${m[1]}`,
56
+ toCommand: (m) => `npx fit-pathway stage ${m[1]}`,
57
57
  },
58
58
 
59
59
  // Job builder + detail
60
60
  {
61
61
  pattern: /^\/job-builder$/,
62
- toCommand: () => "bunx fit-pathway job --list",
62
+ toCommand: () => "npx fit-pathway job --list",
63
63
  },
64
64
  {
65
65
  pattern: /^\/job\/([^/]+)\/([^/]+)\/([^/]+)$/,
66
- toCommand: (m) => `bunx fit-pathway job ${m[1]} ${m[2]} --track=${m[3]}`,
66
+ toCommand: (m) => `npx fit-pathway job ${m[1]} ${m[2]} --track=${m[3]}`,
67
67
  },
68
68
  {
69
69
  pattern: /^\/job\/([^/]+)\/([^/]+)$/,
70
- toCommand: (m) => `bunx fit-pathway job ${m[1]} ${m[2]}`,
70
+ toCommand: (m) => `npx fit-pathway job ${m[1]} ${m[2]}`,
71
71
  },
72
72
 
73
73
  // Interview builder + detail
74
74
  {
75
75
  pattern: /^\/interview-prep$/,
76
- toCommand: () => "bunx fit-pathway interview --list",
76
+ toCommand: () => "npx fit-pathway interview --list",
77
77
  },
78
78
  {
79
79
  pattern: /^\/interview\/([^/]+)\/([^/]+)\/([^/]+)$/,
80
80
  toCommand: (m) =>
81
- `bunx fit-pathway interview ${m[1]} ${m[2]} --track=${m[3]}`,
81
+ `npx fit-pathway interview ${m[1]} ${m[2]} --track=${m[3]}`,
82
82
  },
83
83
  {
84
84
  pattern: /^\/interview\/([^/]+)\/([^/]+)$/,
85
- toCommand: (m) => `bunx fit-pathway interview ${m[1]} ${m[2]}`,
85
+ toCommand: (m) => `npx fit-pathway interview ${m[1]} ${m[2]}`,
86
86
  },
87
87
 
88
88
  // Career progress builder + detail
89
89
  {
90
90
  pattern: /^\/career-progress$/,
91
- toCommand: () => "bunx fit-pathway progress --list",
91
+ toCommand: () => "npx fit-pathway progress --list",
92
92
  },
93
93
  {
94
94
  pattern: /^\/progress\/([^/]+)\/([^/]+)\/([^/]+)$/,
95
95
  toCommand: (m) =>
96
- `bunx fit-pathway progress ${m[1]} ${m[2]} --track=${m[3]}`,
96
+ `npx fit-pathway progress ${m[1]} ${m[2]} --track=${m[3]}`,
97
97
  },
98
98
  {
99
99
  pattern: /^\/progress\/([^/]+)\/([^/]+)$/,
100
- toCommand: (m) => `bunx fit-pathway progress ${m[1]} ${m[2]}`,
100
+ toCommand: (m) => `npx fit-pathway progress ${m[1]} ${m[2]}`,
101
101
  },
102
102
 
103
103
  // Self-assessment
104
104
  {
105
105
  pattern: /^\/self-assessment$/,
106
- toCommand: () => "bunx fit-pathway self-assessment",
106
+ toCommand: () => "npx fit-pathway self-assessment",
107
107
  },
108
108
  {
109
109
  pattern: /^\/self-assessment\/results$/,
110
- toCommand: () => "bunx fit-pathway self-assessment",
110
+ toCommand: () => "npx fit-pathway self-assessment",
111
111
  },
112
112
 
113
113
  // Agent builder + detail
114
114
  {
115
115
  pattern: /^\/agent-builder$/,
116
- toCommand: () => "bunx fit-pathway agent --list",
116
+ toCommand: () => "npx fit-pathway agent --list",
117
117
  },
118
118
  {
119
119
  pattern: /^\/agent\/([^/]+)\/([^/]+)\/([^/]+)$/,
120
120
  toCommand: (m) =>
121
- `bunx fit-pathway agent ${m[1]} --track=${m[2]} --stage=${m[3]}`,
121
+ `npx fit-pathway agent ${m[1]} --track=${m[2]} --stage=${m[3]}`,
122
122
  },
123
123
  {
124
124
  pattern: /^\/agent\/([^/]+)\/([^/]+)$/,
125
- toCommand: (m) => `bunx fit-pathway agent ${m[1]} --track=${m[2]}`,
125
+ toCommand: (m) => `npx fit-pathway agent ${m[1]} --track=${m[2]}`,
126
126
  },
127
127
  {
128
128
  pattern: /^\/agent\/([^/]+)$/,
129
- toCommand: (m) => `bunx fit-pathway agent ${m[1]}`,
129
+ toCommand: (m) => `npx fit-pathway agent ${m[1]}`,
130
130
  },
131
131
  ];
132
132
 
@@ -141,5 +141,5 @@ export function getCliCommand(hashPath) {
141
141
  const match = path.match(pattern);
142
142
  if (match) return toCommand(match);
143
143
  }
144
- return "bunx fit-pathway";
144
+ return "npx fit-pathway";
145
145
  }