@forwardimpact/pathway 0.25.7 → 0.25.9

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/bin/fit-pathway.js +39 -39
  2. package/package.json +7 -7
  3. package/src/commands/agent.js +46 -14
  4. package/src/commands/behaviour.js +6 -6
  5. package/src/commands/build.js +1 -1
  6. package/src/commands/command-factory.js +2 -2
  7. package/src/commands/discipline.js +6 -6
  8. package/src/commands/driver.js +6 -6
  9. package/src/commands/init.js +26 -46
  10. package/src/commands/interview.js +4 -4
  11. package/src/commands/job.js +16 -16
  12. package/src/commands/level.js +6 -6
  13. package/src/commands/progress.js +4 -4
  14. package/src/commands/questions.js +7 -7
  15. package/src/commands/skill.js +8 -8
  16. package/src/commands/stage.js +5 -5
  17. package/src/commands/tool.js +5 -5
  18. package/src/commands/track.js +6 -6
  19. package/src/formatters/agent/dom.js +13 -0
  20. package/src/formatters/questions/yaml.js +1 -1
  21. package/src/index.html +1 -1
  22. package/src/lib/cli-command.js +33 -33
  23. package/starter/behaviours/systems_thinking.yaml +32 -0
  24. package/starter/capabilities/delivery.yaml +105 -0
  25. package/starter/capabilities/reliability.yaml +72 -0
  26. package/starter/disciplines/software_engineering.yaml +46 -0
  27. package/starter/drivers.yaml +10 -0
  28. package/starter/framework.yaml +49 -0
  29. package/starter/levels.yaml +39 -0
  30. package/starter/questions/behaviours/.gitkeep +0 -0
  31. package/starter/questions/capabilities/.gitkeep +0 -0
  32. package/starter/questions/skills/.gitkeep +0 -0
  33. package/starter/stages.yaml +21 -0
  34. package/starter/tracks/forward_deployed.yaml +33 -0
  35. package/starter/tracks/platform.yaml +33 -0
  36. package/templates/install.template.sh +3 -4
@@ -1,4 +1,4 @@
1
- #!/usr/bin/env node
1
+ #!/usr/bin/env bun
2
2
  /**
3
3
  * Engineering Pathway CLI
4
4
  *
@@ -6,7 +6,7 @@
6
6
  * interview questions, career progression analysis, and AI agent configurations.
7
7
  *
8
8
  * Usage:
9
- * npx fit-pathway <command> [options]
9
+ * bunx fit-pathway <command> [options]
10
10
  *
11
11
  * Commands:
12
12
  * discipline [<id>] Show disciplines
@@ -88,12 +88,12 @@ const HELP_TEXT = `
88
88
  Engineering Pathway CLI
89
89
 
90
90
  Usage:
91
- npx fit-pathway <command> [options]
91
+ bunx fit-pathway <command> [options]
92
92
 
93
93
  Global Options:
94
94
  --list Output IDs only (for piping to other commands)
95
95
  --json Output as JSON
96
- --data=PATH Path to data directory (default: ./data or examples/)
96
+ --data=PATH Path to data directory (default: ./data)
97
97
  --version Show version number
98
98
  --help Show this help message
99
99
 
@@ -131,15 +131,15 @@ JOB COMMAND
131
131
  Generate job definitions from discipline × level × track combinations.
132
132
 
133
133
  Usage:
134
- npx fit-pathway job Summary with stats
135
- npx fit-pathway job --track=<track> Summary filtered by track
136
- npx fit-pathway job --list All valid combinations
137
- npx fit-pathway job --list --track=<track> Combinations for a track
138
- npx fit-pathway job <discipline> <level> Detail view (trackless)
139
- npx fit-pathway job <d> <l> --track=<track> Detail view (with track)
140
- npx fit-pathway job <d> <l> --skills Plain list of skill IDs
141
- npx fit-pathway job <d> <l> --tools Plain list of tool names
142
- npx fit-pathway job <d> <l> --checklist=<stage> Show handoff checklist
134
+ bunx fit-pathway job Summary with stats
135
+ bunx fit-pathway job --track=<track> Summary filtered by track
136
+ bunx fit-pathway job --list All valid combinations
137
+ bunx fit-pathway job --list --track=<track> Combinations for a track
138
+ bunx fit-pathway job <discipline> <level> Detail view (trackless)
139
+ bunx fit-pathway job <d> <l> --track=<track> Detail view (with track)
140
+ bunx fit-pathway job <d> <l> --skills Plain list of skill IDs
141
+ bunx fit-pathway job <d> <l> --tools Plain list of tool names
142
+ bunx fit-pathway job <d> <l> --checklist=<stage> Show handoff checklist
143
143
 
144
144
  Options:
145
145
  --track=TRACK Track specialization (e.g., platform, forward_deployed)
@@ -149,11 +149,11 @@ Options:
149
149
  --checklist=STAGE Show checklist for stage handoff (plan, code)
150
150
 
151
151
  Examples:
152
- npx fit-pathway job # overview of all jobs
153
- npx fit-pathway job --track=forward_deployed # jobs on a specific track
154
- npx fit-pathway job --list --track=forward_deployed # list for piping
155
- npx fit-pathway job software_engineering J060 # trackless job detail
156
- npx fit-pathway job software_engineering J060 --track=platform # with track
152
+ bunx fit-pathway job # overview of all jobs
153
+ bunx fit-pathway job --track=forward_deployed # jobs on a specific track
154
+ bunx fit-pathway job --list --track=forward_deployed # list for piping
155
+ bunx fit-pathway job software_engineering J060 # trackless job detail
156
+ bunx fit-pathway job software_engineering J060 --track=platform # with track
157
157
 
158
158
  ────────────────────────────────────────────────────────────────────────────────
159
159
  AGENT COMMAND
@@ -162,12 +162,12 @@ AGENT COMMAND
162
162
  Generate AI coding agent configurations from discipline × track × stage.
163
163
 
164
164
  Usage:
165
- npx fit-pathway agent Summary with stats
166
- npx fit-pathway agent --list All valid combinations
167
- npx fit-pathway agent <discipline> --track=<track> Generate all stage agents
168
- npx fit-pathway agent <d> --track=<t> --stage=<s> Generate single stage agent
169
- npx fit-pathway agent <d> --track=<t> --skills Plain list of skill IDs
170
- npx fit-pathway agent <d> --track=<t> --tools Plain list of tool names
165
+ bunx fit-pathway agent Summary with stats
166
+ bunx fit-pathway agent --list All valid combinations
167
+ bunx fit-pathway agent <discipline> --track=<track> Generate all stage agents
168
+ bunx fit-pathway agent <d> --track=<t> --stage=<s> Generate single stage agent
169
+ bunx fit-pathway agent <d> --track=<t> --skills Plain list of skill IDs
170
+ bunx fit-pathway agent <d> --track=<t> --tools Plain list of tool names
171
171
 
172
172
  Options:
173
173
  --track=TRACK Track for the agent (required for generation)
@@ -177,10 +177,10 @@ Options:
177
177
  --tools Output plain list of tool names (for piping)
178
178
 
179
179
  Examples:
180
- npx fit-pathway agent software_engineering --track=platform
181
- npx fit-pathway agent software_engineering --track=platform --stage=plan
182
- npx fit-pathway agent software_engineering --track=platform --output=./agents
183
- npx fit-pathway agent software_engineering --track=platform --skills
180
+ bunx fit-pathway agent software_engineering --track=platform
181
+ bunx fit-pathway agent software_engineering --track=platform --stage=plan
182
+ bunx fit-pathway agent software_engineering --track=platform --output=./agents
183
+ bunx fit-pathway agent software_engineering --track=platform --skills
184
184
 
185
185
  ────────────────────────────────────────────────────────────────────────────────
186
186
  INTERVIEW COMMAND
@@ -189,9 +189,9 @@ INTERVIEW COMMAND
189
189
  Generate interview question sets based on job requirements.
190
190
 
191
191
  Usage:
192
- npx fit-pathway interview <discipline> <level> All types
193
- npx fit-pathway interview <d> <l> --track=<track> With track
194
- npx fit-pathway interview <d> <l> --track=<t> --type=<type> Single type
192
+ bunx fit-pathway interview <discipline> <level> All types
193
+ bunx fit-pathway interview <d> <l> --track=<track> With track
194
+ bunx fit-pathway interview <d> <l> --track=<t> --type=<type> Single type
195
195
 
196
196
  Options:
197
197
  --track=TRACK Track specialization
@@ -205,9 +205,9 @@ PROGRESS COMMAND
205
205
  Analyze career progression between levels.
206
206
 
207
207
  Usage:
208
- npx fit-pathway progress <discipline> <level>
209
- npx fit-pathway progress <d> <l> --track=<track>
210
- npx fit-pathway progress <d> <l> --compare=<to_level>
208
+ bunx fit-pathway progress <discipline> <level>
209
+ bunx fit-pathway progress <d> <l> --track=<track>
210
+ bunx fit-pathway progress <d> <l> --compare=<to_level>
211
211
 
212
212
  Options:
213
213
  --track=TRACK Track specialization
@@ -220,10 +220,10 @@ QUESTIONS COMMAND
220
220
  Browse and filter interview questions.
221
221
 
222
222
  Usage:
223
- npx fit-pathway questions
224
- npx fit-pathway questions --level=practitioner
225
- npx fit-pathway questions --skill=architecture_design
226
- npx fit-pathway questions --stats
223
+ bunx fit-pathway questions
224
+ bunx fit-pathway questions --level=practitioner
225
+ bunx fit-pathway questions --skill=architecture_design
226
+ bunx fit-pathway questions --stats
227
227
 
228
228
  Options:
229
229
  --level=LEVEL Filter by skill proficiency
@@ -411,7 +411,7 @@ async function main() {
411
411
 
412
412
  if (!handler) {
413
413
  console.error(formatError(`Unknown command: ${command}`));
414
- console.error(`Run 'npx fit-pathway --help' for usage.`);
414
+ console.error(`Run 'bunx fit-pathway --help' for usage.`);
415
415
  process.exit(1);
416
416
  }
417
417
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@forwardimpact/pathway",
3
- "version": "0.25.7",
3
+ "version": "0.25.9",
4
4
  "description": "Career progression web app and CLI for exploring roles and generating agent teams",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {
@@ -25,13 +25,14 @@
25
25
  "fit-pathway": "./bin/fit-pathway.js"
26
26
  },
27
27
  "scripts": {
28
- "start": "node ./bin/fit-pathway.js serve",
29
- "pathway": "node ./bin/fit-pathway.js",
30
- "site": "node ./bin/fit-pathway.js site"
28
+ "start": "bun ./bin/fit-pathway.js serve",
29
+ "pathway": "bun ./bin/fit-pathway.js",
30
+ "site": "bun ./bin/fit-pathway.js site"
31
31
  },
32
32
  "files": [
33
33
  "bin/",
34
34
  "src/",
35
+ "starter/",
35
36
  "templates/"
36
37
  ],
37
38
  "exports": {
@@ -40,17 +41,16 @@
40
41
  "./commands": "./src/commands/index.js"
41
42
  },
42
43
  "dependencies": {
43
- "@forwardimpact/map": "^0.14.0",
44
+ "@forwardimpact/map": "^0.15.5",
44
45
  "@forwardimpact/libskill": "^4.0.0",
45
46
  "@forwardimpact/libtemplate": "^0.2.0",
46
47
  "@forwardimpact/libui": "^1.0.0",
47
48
  "@forwardimpact/libutil": "^0.1.64",
48
49
  "mustache": "^4.2.0",
49
- "simple-icons": "^16.13.0",
50
50
  "yaml": "^2.8.3"
51
51
  },
52
52
  "engines": {
53
- "node": ">=18.0.0"
53
+ "bun": ">=1.2.0"
54
54
  },
55
55
  "publishConfig": {
56
56
  "access": "public"
@@ -11,17 +11,17 @@
11
11
  * By default, outputs to console. Use --output to write files.
12
12
  *
13
13
  * Usage:
14
- * npx pathway agent <discipline> [--track=<track>]
15
- * npx pathway agent <discipline> --track=<track> --stage=plan
16
- * npx pathway agent <discipline> --track=<track> --output=./agents
17
- * npx pathway agent <discipline> [--track=<track>] --skills # Plain list of skill IDs
18
- * npx pathway agent <discipline> [--track=<track>] --tools # Plain list of tool names
19
- * npx pathway agent --list
14
+ * bunx pathway agent <discipline> [--track=<track>]
15
+ * bunx pathway agent <discipline> --track=<track> --stage=plan
16
+ * bunx pathway agent <discipline> --track=<track> --output=./agents
17
+ * bunx pathway agent <discipline> [--track=<track>] --skills # Plain list of skill IDs
18
+ * bunx pathway agent <discipline> [--track=<track>] --tools # Plain list of tool names
19
+ * bunx pathway agent --list
20
20
  *
21
21
  * Examples:
22
- * npx pathway agent software_engineering --track=platform
23
- * npx pathway agent software_engineering --track=platform --stage=plan
24
- * npx pathway agent software_engineering --track=platform --output=./agents
22
+ * bunx pathway agent software_engineering --track=platform
23
+ * bunx pathway agent software_engineering --track=platform --stage=plan
24
+ * bunx pathway agent software_engineering --track=platform --output=./agents
25
25
  */
26
26
 
27
27
  import { writeFile, mkdir, readFile } from "fs/promises";
@@ -38,6 +38,7 @@ import {
38
38
  deriveToolkit,
39
39
  getDisciplineAbbreviation,
40
40
  toKebabCase,
41
+ interpolateTeamInstructions,
41
42
  } from "@forwardimpact/libskill";
42
43
  import { formatAgentProfile } from "../formatters/agent/profile.js";
43
44
  import {
@@ -117,9 +118,9 @@ function showAgentSummary(data, agentData, skillsWithAgent) {
117
118
  );
118
119
  console.log(`Stages: ${data.stages.length} available`);
119
120
  console.log(`\nValid combinations: ${validCombinations}`);
120
- console.log(`\nRun 'npx pathway agent --list' for all combinations`);
121
+ console.log(`\nRun 'bunx pathway agent --list' for all combinations`);
121
122
  console.log(
122
- `Run 'npx pathway agent <discipline> <track>' to generate files\n`,
123
+ `Run 'bunx pathway agent <discipline> <track>' to generate files\n`,
123
124
  );
124
125
  }
125
126
 
@@ -181,7 +182,7 @@ function listAgentCombinations(data, agentData, verbose = false) {
181
182
  );
182
183
  const humanTrack = data.tracks.find((t) => t.id === track.id);
183
184
  if (humanDiscipline && humanTrack) {
184
- console.log(` npx pathway agent ${discipline.id} ${track.id}`);
185
+ console.log(` bunx pathway agent ${discipline.id} ${track.id}`);
185
186
  }
186
187
  }
187
188
  }
@@ -207,6 +208,21 @@ async function writeProfile(profile, baseDir, template) {
207
208
  return profilePath;
208
209
  }
209
210
 
211
+ /**
212
+ * Write team instructions to CLAUDE.md
213
+ * @param {string|null} teamInstructions - Interpolated team instructions content
214
+ * @param {string} baseDir - Base output directory
215
+ * @returns {string|null} Path written, or null if skipped
216
+ */
217
+ async function writeTeamInstructions(teamInstructions, baseDir) {
218
+ if (!teamInstructions) return null;
219
+ const filePath = join(baseDir, ".claude", "CLAUDE.md");
220
+ await ensureDir(filePath);
221
+ await writeFile(filePath, teamInstructions.trim() + "\n", "utf-8");
222
+ console.log(formatSuccess(`Created: ${filePath}`));
223
+ return filePath;
224
+ }
225
+
210
226
  /**
211
227
  * Write skill files (SKILL.md, scripts/install.sh, references/REFERENCE.md)
212
228
  * @param {Array} skills - Generated skills
@@ -298,11 +314,11 @@ export async function runAgentCommand({
298
314
  if (!disciplineId) {
299
315
  console.error(
300
316
  formatError(
301
- "Usage: npx pathway agent <discipline_id> [--track=<track_id>]",
317
+ "Usage: bunx pathway agent <discipline_id> [--track=<track_id>]",
302
318
  ),
303
319
  );
304
320
  console.error(
305
- "\nRun 'npx pathway agent --list' to see available combinations.",
321
+ "\nRun 'bunx pathway agent --list' to see available combinations.",
306
322
  );
307
323
  process.exit(1);
308
324
  }
@@ -434,10 +450,18 @@ export async function runAgentCommand({
434
450
 
435
451
  // Output to console (default) or write to files (with --output)
436
452
  if (!options.output) {
453
+ const teamInstructions = interpolateTeamInstructions(agentTrack, humanDiscipline);
454
+ if (teamInstructions) {
455
+ console.log("# Team Instructions (CLAUDE.md)\n");
456
+ console.log(teamInstructions.trim());
457
+ console.log("\n---\n");
458
+ }
437
459
  console.log(formatAgentProfile(profile, agentTemplate));
438
460
  return;
439
461
  }
440
462
 
463
+ const teamInstructions = interpolateTeamInstructions(agentTrack, humanDiscipline);
464
+ await writeTeamInstructions(teamInstructions, baseDir);
441
465
  await writeProfile(profile, baseDir, agentTemplate);
442
466
  await generateClaudeCodeSettings(baseDir, agentData.claudeCodeSettings);
443
467
  console.log("");
@@ -516,6 +540,12 @@ export async function runAgentCommand({
516
540
 
517
541
  // Output to console (default) or write to files (with --output)
518
542
  if (!options.output) {
543
+ const teamInstructions = interpolateTeamInstructions(agentTrack, humanDiscipline);
544
+ if (teamInstructions) {
545
+ console.log("# Team Instructions (CLAUDE.md)\n");
546
+ console.log(teamInstructions.trim());
547
+ console.log("\n---\n");
548
+ }
519
549
  for (const profile of profiles) {
520
550
  console.log(formatAgentProfile(profile, agentTemplate));
521
551
  console.log("\n---\n");
@@ -523,6 +553,8 @@ export async function runAgentCommand({
523
553
  return;
524
554
  }
525
555
 
556
+ const teamInstructions = interpolateTeamInstructions(agentTrack, humanDiscipline);
557
+ await writeTeamInstructions(teamInstructions, baseDir);
526
558
  for (const profile of profiles) {
527
559
  await writeProfile(profile, baseDir, agentTemplate);
528
560
  }
@@ -4,10 +4,10 @@
4
4
  * Handles behaviour summary, listing, and detail display in the terminal.
5
5
  *
6
6
  * Usage:
7
- * npx pathway behaviour # Summary with stats
8
- * npx pathway behaviour --list # IDs only (for piping)
9
- * npx pathway behaviour <id> # Detail view
10
- * npx pathway behaviour --validate # Validation checks
7
+ * bunx pathway behaviour # Summary with stats
8
+ * bunx pathway behaviour --list # IDs only (for piping)
9
+ * bunx pathway behaviour <id> # Detail view
10
+ * bunx pathway behaviour --validate # Validation checks
11
11
  */
12
12
 
13
13
  import { createEntityCommand } from "./command-factory.js";
@@ -43,8 +43,8 @@ function formatSummary(behaviours, data) {
43
43
 
44
44
  console.log(formatTable(["ID", "Name", "Drivers"], rows));
45
45
  console.log(`\nTotal: ${behaviours.length} behaviours`);
46
- console.log(`\nRun 'npx pathway behaviour --list' for IDs and names`);
47
- console.log(`Run 'npx pathway behaviour <id>' for details\n`);
46
+ console.log(`\nRun 'bunx pathway behaviour --list' for IDs and names`);
47
+ console.log(`Run 'bunx pathway behaviour <id>' for details\n`);
48
48
  }
49
49
 
50
50
  /**
@@ -215,7 +215,7 @@ Output: ${outputDir}
215
215
  ${siteUrl ? `\nDistribution:\n ${outputDir}/bundle.tar.gz\n ${outputDir}/install.sh\n` : ""}
216
216
  To serve locally:
217
217
  cd ${relative(process.cwd(), outputDir) || "."}
218
- npx serve .
218
+ bunx serve .
219
219
  `);
220
220
  }
221
221
 
@@ -89,7 +89,7 @@ export function createEntityCommand({
89
89
  function handleValidate({ data, _entityName, pluralName, validate }) {
90
90
  if (!validate) {
91
91
  console.log(`No specific validation for ${pluralName}.`);
92
- console.log(`Run 'npx pathway --validate' for full data validation.`);
92
+ console.log(`Run 'bunx pathway --validate' for full data validation.`);
93
93
  return;
94
94
  }
95
95
 
@@ -178,7 +178,7 @@ export function createCompositeCommand({
178
178
  return async function runCommand({ data, args, options }) {
179
179
  if (args.length < requiredArgs.length) {
180
180
  const argsList = requiredArgs.map((arg) => `<${arg}>`).join(" ");
181
- console.error(`Usage: npx pathway ${commandName} ${argsList}`);
181
+ console.error(`Usage: bunx pathway ${commandName} ${argsList}`);
182
182
  if (usageExample) {
183
183
  console.error(`Example: ${usageExample}`);
184
184
  }
@@ -4,10 +4,10 @@
4
4
  * Handles discipline summary, listing, and detail display in the terminal.
5
5
  *
6
6
  * Usage:
7
- * npx pathway discipline # Summary with stats
8
- * npx pathway discipline --list # IDs only (for piping)
9
- * npx pathway discipline <id> # Detail view
10
- * npx pathway discipline --validate # Validation checks
7
+ * bunx pathway discipline # Summary with stats
8
+ * bunx pathway discipline --list # IDs only (for piping)
9
+ * bunx pathway discipline <id> # Detail view
10
+ * bunx pathway discipline --validate # Validation checks
11
11
  */
12
12
 
13
13
  import { createEntityCommand } from "./command-factory.js";
@@ -43,8 +43,8 @@ function formatSummary(disciplines) {
43
43
 
44
44
  console.log(formatTable(["ID", "Specialization", "Type", "Tracks"], rows));
45
45
  console.log(`\nTotal: ${disciplines.length} disciplines`);
46
- console.log(`\nRun 'npx pathway discipline --list' for IDs and names`);
47
- console.log(`Run 'npx pathway discipline <id>' for details\n`);
46
+ console.log(`\nRun 'bunx pathway discipline --list' for IDs and names`);
47
+ console.log(`Run 'bunx pathway discipline <id>' for details\n`);
48
48
  }
49
49
 
50
50
  /**
@@ -4,10 +4,10 @@
4
4
  * Handles driver summary, listing, and detail display in the terminal.
5
5
  *
6
6
  * Usage:
7
- * npx pathway driver # Summary with stats
8
- * npx pathway driver --list # IDs only (for piping)
9
- * npx pathway driver <id> # Detail view
10
- * npx pathway driver --validate # Validation checks
7
+ * bunx pathway driver # Summary with stats
8
+ * bunx pathway driver --list # IDs only (for piping)
9
+ * bunx pathway driver <id> # Detail view
10
+ * bunx pathway driver --validate # Validation checks
11
11
  */
12
12
 
13
13
  import { createEntityCommand } from "./command-factory.js";
@@ -52,8 +52,8 @@ function formatSummary(drivers, data) {
52
52
 
53
53
  console.log(formatTable(["ID", "Name", "Skills", "Behaviours"], rows));
54
54
  console.log(`\nTotal: ${drivers.length} drivers`);
55
- console.log(`\nRun 'npx pathway driver --list' for IDs and names`);
56
- console.log(`Run 'npx pathway driver <id>' for details\n`);
55
+ console.log(`\nRun 'bunx pathway driver --list' for IDs and names`);
56
+ console.log(`Run 'bunx pathway driver <id>' for details\n`);
57
57
  }
58
58
 
59
59
  /**
@@ -1,26 +1,15 @@
1
1
  /**
2
2
  * Init Command
3
3
  *
4
- * Initializes a new Engineering Pathway project by copying example data.
4
+ * Initializes a new Engineering Pathway project by copying starter data.
5
5
  */
6
6
 
7
7
  import { cp, access } from "fs/promises";
8
8
  import { join, dirname } from "path";
9
9
  import { fileURLToPath } from "url";
10
10
 
11
- const __filename = fileURLToPath(import.meta.url);
12
- const __dirname = dirname(__filename);
13
- // Prefer monorepo root examples/framework/, fall back to legacy co-located examples/
14
- const monorepoExamplesDir = join(
15
- __dirname,
16
- "..",
17
- "..",
18
- "..",
19
- "..",
20
- "examples",
21
- "framework",
22
- );
23
- const legacyExamplesDir = join(__dirname, "..", "..", "examples");
11
+ const __dirname = dirname(fileURLToPath(import.meta.url));
12
+ const starterDir = join(__dirname, "..", "..", "starter");
24
13
 
25
14
  /**
26
15
  * Run the init command
@@ -29,56 +18,47 @@ const legacyExamplesDir = join(__dirname, "..", "..", "examples");
29
18
  */
30
19
  export async function runInitCommand({ options }) {
31
20
  const targetPath = options.path || process.cwd();
32
- const dataDir = join(targetPath, "data");
21
+ const dataDir = join(targetPath, "data", "pathway");
33
22
 
34
- // Check if data/ already exists
23
+ // Check if data/pathway/ already exists
35
24
  try {
36
25
  await access(dataDir);
37
- console.error("Error: ./data/ already exists.");
26
+ console.error("Error: ./data/pathway/ already exists.");
38
27
  console.error("Remove it first or use a different directory.");
39
28
  process.exit(1);
40
29
  } catch {
41
30
  // Directory doesn't exist, proceed
42
31
  }
43
32
 
44
- // Find examples directory monorepo root first, then legacy
45
- let examplesDir;
33
+ // Verify starter data is available
46
34
  try {
47
- await access(monorepoExamplesDir);
48
- examplesDir = monorepoExamplesDir;
35
+ await access(starterDir);
49
36
  } catch {
50
- try {
51
- await access(legacyExamplesDir);
52
- examplesDir = legacyExamplesDir;
53
- } catch {
54
- console.error("Error: Examples directory not found in package.");
55
- console.error("This may indicate a corrupted package installation.");
56
- process.exit(1);
57
- }
37
+ console.error("Error: Starter data not found in package.");
38
+ console.error("This may indicate a corrupted package installation.");
39
+ process.exit(1);
58
40
  }
59
41
 
60
- // Copy example data
61
- console.log("Creating ./data/ with example data...\n");
62
- await cp(examplesDir, dataDir, { recursive: true });
42
+ // Copy starter data
43
+ console.log("Creating ./data/pathway/ with starter data...\n");
44
+ await cp(starterDir, dataDir, { recursive: true });
63
45
 
64
- console.log(`✅ Created ./data/ with example data.
46
+ console.log(`✅ Created ./data/pathway/ with starter data.
65
47
 
66
48
  Next steps:
67
49
  1. Edit data files to match your organization
68
- 2. npx pathway --validate
69
- 3. npx pathway serve
50
+ 2. bunx fit-map validate
51
+ 3. bunx fit-pathway dev
70
52
 
71
53
  Data structure:
72
- data/
73
- ├── framework.yaml # Framework metadata
74
- ├── levels.yaml # Career levels
75
- ├── stages.yaml # Lifecycle stages
76
- ├── drivers.yaml # Business drivers
77
- ├── capabilities.yaml # Capability areas
78
- ├── disciplines/ # Engineering disciplines
79
- ├── tracks/ # Role tracks
80
- ├── skills/ # Technical skills
81
- ├── behaviours/ # Behavioural expectations
82
- └── questions/ # Interview questions
54
+ data/pathway/
55
+ ├── framework.yaml # Framework metadata
56
+ ├── levels.yaml # Career levels
57
+ ├── stages.yaml # Lifecycle stages
58
+ ├── drivers.yaml # Business drivers
59
+ ├── disciplines/ # Engineering disciplines
60
+ ├── capabilities/ # Capability areas with skills
61
+ ├── behaviours/ # Behavioural expectations
62
+ └── tracks/ # Track specializations
83
63
  `);
84
64
  }
@@ -4,9 +4,9 @@
4
4
  * Generates and displays interview questions in the terminal.
5
5
  *
6
6
  * Usage:
7
- * npx fit-pathway interview <discipline> <level> # All interview types
8
- * npx fit-pathway interview <discipline> <level> --track=<track> # With track
9
- * npx fit-pathway interview <discipline> <level> --track=<track> --type=mission # Single type
7
+ * bunx fit-pathway interview <discipline> <level> # All interview types
8
+ * bunx fit-pathway interview <discipline> <level> --track=<track> # With track
9
+ * bunx fit-pathway interview <discipline> <level> --track=<track> --type=mission # Single type
10
10
  */
11
11
 
12
12
  import { createCompositeCommand } from "./command-factory.js";
@@ -109,5 +109,5 @@ export const runInterviewCommand = createCompositeCommand({
109
109
  }
110
110
  },
111
111
  usageExample:
112
- "npx fit-pathway interview software_engineering J090 --track=platform --type=mission",
112
+ "bunx fit-pathway interview software_engineering J090 --track=platform --type=mission",
113
113
  });
@@ -4,14 +4,14 @@
4
4
  * Generates and displays job definitions in the terminal.
5
5
  *
6
6
  * Usage:
7
- * npx pathway job # Summary with stats
8
- * npx pathway job --list # All valid combinations (for piping)
9
- * npx pathway job <discipline> <level> # Detail view (trackless)
10
- * npx pathway job <discipline> <level> --track=<track> # Detail view (with track)
11
- * npx pathway job <d> <l> [--track=<t>] --skills # Plain list of skill IDs
12
- * npx pathway job <d> <l> [--track=<t>] --tools # Plain list of tool names
13
- * npx pathway job se L3 --track=platform --checklist=code # Show checklist for handoff
14
- * npx pathway job --validate # Validation checks
7
+ * bunx pathway job # Summary with stats
8
+ * bunx pathway job --list # All valid combinations (for piping)
9
+ * bunx pathway job <discipline> <level> # Detail view (trackless)
10
+ * bunx pathway job <discipline> <level> --track=<track> # Detail view (with track)
11
+ * bunx pathway job <d> <l> [--track=<t>] --skills # Plain list of skill IDs
12
+ * bunx pathway job <d> <l> [--track=<t>] --tools # Plain list of tool names
13
+ * bunx pathway job se L3 --track=platform --checklist=code # Show checklist for handoff
14
+ * bunx pathway job --validate # Validation checks
15
15
  */
16
16
 
17
17
  import { prepareJobDetail } from "@forwardimpact/libskill/job";
@@ -135,10 +135,10 @@ export async function runJobCommand({
135
135
  );
136
136
  console.log(`\nTotal: ${filteredJobs.length} valid job combinations`);
137
137
  console.log(
138
- `\nRun 'npx pathway job --list' for all combinations with titles`,
138
+ `\nRun 'bunx pathway job --list' for all combinations with titles`,
139
139
  );
140
140
  console.log(
141
- `Run 'npx pathway job <discipline> <level> [--track=<track>]' for details\n`,
141
+ `Run 'bunx pathway job <discipline> <level> [--track=<track>]' for details\n`,
142
142
  );
143
143
  return;
144
144
  }
@@ -151,7 +151,7 @@ export async function runJobCommand({
151
151
  const isTrack = data.tracks.some((t) => t.id === arg);
152
152
  if (isLevel) {
153
153
  console.error(
154
- `Missing discipline. Usage: npx pathway job <discipline> ${arg} [--track=<track>]`,
154
+ `Missing discipline. Usage: bunx pathway job <discipline> ${arg} [--track=<track>]`,
155
155
  );
156
156
  console.error(
157
157
  `Disciplines: ${data.disciplines.map((d) => d.id).join(", ")}`,
@@ -159,13 +159,13 @@ export async function runJobCommand({
159
159
  } else if (isTrack) {
160
160
  console.error(`Track must be passed as a flag: --track=${arg}`);
161
161
  console.error(
162
- `Usage: npx pathway job <discipline> <level> --track=${arg}`,
162
+ `Usage: bunx pathway job <discipline> <level> --track=${arg}`,
163
163
  );
164
164
  } else {
165
165
  console.error(
166
- "Usage: npx pathway job <discipline> <level> [--track=<track>]",
166
+ "Usage: bunx pathway job <discipline> <level> [--track=<track>]",
167
167
  );
168
- console.error(" npx pathway job --list");
168
+ console.error(" bunx pathway job --list");
169
169
  }
170
170
  process.exit(1);
171
171
  }
@@ -183,7 +183,7 @@ export async function runJobCommand({
183
183
  if (maybeLevel && maybeDiscipline) {
184
184
  console.error(`Arguments are in the wrong order. Try:`);
185
185
  console.error(
186
- ` npx pathway job ${args[1]} ${args[0]}${options.track ? ` --track=${options.track}` : ""}`,
186
+ ` bunx pathway job ${args[1]} ${args[0]}${options.track ? ` --track=${options.track}` : ""}`,
187
187
  );
188
188
  } else {
189
189
  console.error(`Discipline not found: ${args[0]}`);
@@ -201,7 +201,7 @@ export async function runJobCommand({
201
201
  console.error(
202
202
  `Track must be passed as a flag, not a positional argument:`,
203
203
  );
204
- console.error(` npx pathway job ${args[0]} <level> --track=${args[1]}`);
204
+ console.error(` bunx pathway job ${args[0]} <level> --track=${args[1]}`);
205
205
  console.error(`Levels: ${data.levels.map((g) => g.id).join(", ")}`);
206
206
  } else {
207
207
  console.error(`Level not found: ${args[1]}`);