@forwardimpact/pathway 0.25.6 → 0.25.8
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 +14 -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/questions/yaml.js +1 -1
- package/src/handout-main.js +15 -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.8",
|
|
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";
|
|
@@ -117,9 +117,9 @@ function showAgentSummary(data, agentData, skillsWithAgent) {
|
|
|
117
117
|
);
|
|
118
118
|
console.log(`Stages: ${data.stages.length} available`);
|
|
119
119
|
console.log(`\nValid combinations: ${validCombinations}`);
|
|
120
|
-
console.log(`\nRun '
|
|
120
|
+
console.log(`\nRun 'bunx pathway agent --list' for all combinations`);
|
|
121
121
|
console.log(
|
|
122
|
-
`Run '
|
|
122
|
+
`Run 'bunx pathway agent <discipline> <track>' to generate files\n`,
|
|
123
123
|
);
|
|
124
124
|
}
|
|
125
125
|
|
|
@@ -181,7 +181,7 @@ function listAgentCombinations(data, agentData, verbose = false) {
|
|
|
181
181
|
);
|
|
182
182
|
const humanTrack = data.tracks.find((t) => t.id === track.id);
|
|
183
183
|
if (humanDiscipline && humanTrack) {
|
|
184
|
-
console.log(`
|
|
184
|
+
console.log(` bunx pathway agent ${discipline.id} ${track.id}`);
|
|
185
185
|
}
|
|
186
186
|
}
|
|
187
187
|
}
|
|
@@ -298,11 +298,11 @@ export async function runAgentCommand({
|
|
|
298
298
|
if (!disciplineId) {
|
|
299
299
|
console.error(
|
|
300
300
|
formatError(
|
|
301
|
-
"Usage:
|
|
301
|
+
"Usage: bunx pathway agent <discipline_id> [--track=<track_id>]",
|
|
302
302
|
),
|
|
303
303
|
);
|
|
304
304
|
console.error(
|
|
305
|
-
"\nRun '
|
|
305
|
+
"\nRun 'bunx pathway agent --list' to see available combinations.",
|
|
306
306
|
);
|
|
307
307
|
process.exit(1);
|
|
308
308
|
}
|
|
@@ -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]}`);
|
package/src/commands/level.js
CHANGED
|
@@ -4,10 +4,10 @@
|
|
|
4
4
|
* Handles level summary, listing, and detail display in the terminal.
|
|
5
5
|
*
|
|
6
6
|
* Usage:
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
7
|
+
* bunx pathway level # Summary with stats
|
|
8
|
+
* bunx pathway level --list # IDs only (for piping)
|
|
9
|
+
* bunx pathway level <id> # Detail view
|
|
10
|
+
* bunx pathway level --validate # Validation checks
|
|
11
11
|
*/
|
|
12
12
|
|
|
13
13
|
import { createEntityCommand } from "./command-factory.js";
|
|
@@ -57,8 +57,8 @@ function formatSummary(levels, data) {
|
|
|
57
57
|
),
|
|
58
58
|
);
|
|
59
59
|
console.log(`\nTotal: ${levels.length} levels`);
|
|
60
|
-
console.log(`\nRun '
|
|
61
|
-
console.log(`Run '
|
|
60
|
+
console.log(`\nRun 'bunx pathway level --list' for IDs and titles`);
|
|
61
|
+
console.log(`Run 'bunx pathway level <id>' for details\n`);
|
|
62
62
|
}
|
|
63
63
|
|
|
64
64
|
/**
|
package/src/commands/progress.js
CHANGED
|
@@ -4,9 +4,9 @@
|
|
|
4
4
|
* Shows career progression analysis in the terminal.
|
|
5
5
|
*
|
|
6
6
|
* Usage:
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
7
|
+
* bunx pathway progress <discipline> <level> # Progress for trackless job
|
|
8
|
+
* bunx pathway progress <discipline> <level> --track=<track> # Progress with track
|
|
9
|
+
* bunx pathway progress <discipline> <from_level> --compare=<to_level> # Compare levels
|
|
10
10
|
*/
|
|
11
11
|
|
|
12
12
|
import { createCompositeCommand } from "./command-factory.js";
|
|
@@ -80,5 +80,5 @@ export const runProgressCommand = createCompositeCommand({
|
|
|
80
80
|
}),
|
|
81
81
|
formatter: formatProgress,
|
|
82
82
|
usageExample:
|
|
83
|
-
"
|
|
83
|
+
"bunx pathway progress software_engineering L3 --track=platform --compare=L4",
|
|
84
84
|
});
|