@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.
- package/bin/fit-pathway.js +39 -39
- package/package.json +7 -7
- package/src/commands/agent.js +46 -14
- package/src/commands/behaviour.js +6 -6
- package/src/commands/build.js +1 -1
- package/src/commands/command-factory.js +2 -2
- package/src/commands/discipline.js +6 -6
- package/src/commands/driver.js +6 -6
- package/src/commands/init.js +26 -46
- package/src/commands/interview.js +4 -4
- package/src/commands/job.js +16 -16
- package/src/commands/level.js +6 -6
- package/src/commands/progress.js +4 -4
- package/src/commands/questions.js +7 -7
- package/src/commands/skill.js +8 -8
- package/src/commands/stage.js +5 -5
- package/src/commands/tool.js +5 -5
- package/src/commands/track.js +6 -6
- package/src/formatters/agent/dom.js +13 -0
- package/src/formatters/questions/yaml.js +1 -1
- package/src/index.html +1 -1
- package/src/lib/cli-command.js +33 -33
- package/starter/behaviours/systems_thinking.yaml +32 -0
- package/starter/capabilities/delivery.yaml +105 -0
- package/starter/capabilities/reliability.yaml +72 -0
- package/starter/disciplines/software_engineering.yaml +46 -0
- package/starter/drivers.yaml +10 -0
- package/starter/framework.yaml +49 -0
- package/starter/levels.yaml +39 -0
- package/starter/questions/behaviours/.gitkeep +0 -0
- package/starter/questions/capabilities/.gitkeep +0 -0
- package/starter/questions/skills/.gitkeep +0 -0
- package/starter/stages.yaml +21 -0
- package/starter/tracks/forward_deployed.yaml +33 -0
- package/starter/tracks/platform.yaml +33 -0
- package/templates/install.template.sh +3 -4
package/bin/fit-pathway.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
#!/usr/bin/env
|
|
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
|
-
*
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
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
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
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
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
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
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
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
|
-
|
|
193
|
-
|
|
194
|
-
|
|
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
|
-
|
|
209
|
-
|
|
210
|
-
|
|
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
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
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 '
|
|
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.
|
|
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": "
|
|
29
|
-
"pathway": "
|
|
30
|
-
"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.
|
|
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
|
-
"
|
|
53
|
+
"bun": ">=1.2.0"
|
|
54
54
|
},
|
|
55
55
|
"publishConfig": {
|
|
56
56
|
"access": "public"
|
package/src/commands/agent.js
CHANGED
|
@@ -11,17 +11,17 @@
|
|
|
11
11
|
* By default, outputs to console. Use --output to write files.
|
|
12
12
|
*
|
|
13
13
|
* Usage:
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
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
|
-
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
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 '
|
|
121
|
+
console.log(`\nRun 'bunx pathway agent --list' for all combinations`);
|
|
121
122
|
console.log(
|
|
122
|
-
`Run '
|
|
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(`
|
|
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:
|
|
317
|
+
"Usage: bunx pathway agent <discipline_id> [--track=<track_id>]",
|
|
302
318
|
),
|
|
303
319
|
);
|
|
304
320
|
console.error(
|
|
305
|
-
"\nRun '
|
|
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
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
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 '
|
|
47
|
-
console.log(`Run '
|
|
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
|
/**
|
package/src/commands/build.js
CHANGED
|
@@ -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 '
|
|
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:
|
|
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
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
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 '
|
|
47
|
-
console.log(`Run '
|
|
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
|
/**
|
package/src/commands/driver.js
CHANGED
|
@@ -4,10 +4,10 @@
|
|
|
4
4
|
* Handles driver summary, listing, and detail display in the terminal.
|
|
5
5
|
*
|
|
6
6
|
* Usage:
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
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 '
|
|
56
|
-
console.log(`Run '
|
|
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
|
/**
|
package/src/commands/init.js
CHANGED
|
@@ -1,26 +1,15 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Init Command
|
|
3
3
|
*
|
|
4
|
-
* Initializes a new Engineering Pathway project by copying
|
|
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
|
|
12
|
-
const
|
|
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
|
-
//
|
|
45
|
-
let examplesDir;
|
|
33
|
+
// Verify starter data is available
|
|
46
34
|
try {
|
|
47
|
-
await access(
|
|
48
|
-
examplesDir = monorepoExamplesDir;
|
|
35
|
+
await access(starterDir);
|
|
49
36
|
} catch {
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
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
|
|
61
|
-
console.log("Creating ./data/ with
|
|
62
|
-
await cp(
|
|
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
|
|
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.
|
|
69
|
-
3.
|
|
50
|
+
2. bunx fit-map validate
|
|
51
|
+
3. bunx fit-pathway dev
|
|
70
52
|
|
|
71
53
|
Data structure:
|
|
72
|
-
data/
|
|
73
|
-
├── framework.yaml
|
|
74
|
-
├── levels.yaml
|
|
75
|
-
├── stages.yaml
|
|
76
|
-
├── drivers.yaml
|
|
77
|
-
├──
|
|
78
|
-
├──
|
|
79
|
-
├──
|
|
80
|
-
|
|
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
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
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
|
-
"
|
|
112
|
+
"bunx fit-pathway interview software_engineering J090 --track=platform --type=mission",
|
|
113
113
|
});
|
package/src/commands/job.js
CHANGED
|
@@ -4,14 +4,14 @@
|
|
|
4
4
|
* Generates and displays job definitions in the terminal.
|
|
5
5
|
*
|
|
6
6
|
* Usage:
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
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 '
|
|
138
|
+
`\nRun 'bunx pathway job --list' for all combinations with titles`,
|
|
139
139
|
);
|
|
140
140
|
console.log(
|
|
141
|
-
`Run '
|
|
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:
|
|
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:
|
|
162
|
+
`Usage: bunx pathway job <discipline> <level> --track=${arg}`,
|
|
163
163
|
);
|
|
164
164
|
} else {
|
|
165
165
|
console.error(
|
|
166
|
-
"Usage:
|
|
166
|
+
"Usage: bunx pathway job <discipline> <level> [--track=<track>]",
|
|
167
167
|
);
|
|
168
|
-
console.error("
|
|
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
|
-
`
|
|
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(`
|
|
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]}`);
|