@forwardimpact/pathway 0.3.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/app/commands/agent.js +1 -1
  2. package/app/commands/index.js +4 -3
  3. package/app/commands/skill.js +56 -2
  4. package/app/commands/tool.js +112 -0
  5. package/app/components/checklist.js +6 -4
  6. package/app/components/markdown-textarea.js +132 -0
  7. package/app/css/components/forms.css +45 -0
  8. package/app/css/components/layout.css +12 -0
  9. package/app/css/components/surfaces.css +22 -0
  10. package/app/css/pages/detail.css +50 -0
  11. package/app/css/pages/job-builder.css +0 -42
  12. package/app/formatters/agent/profile.js +61 -9
  13. package/app/formatters/agent/skill.js +48 -6
  14. package/app/formatters/job/description.js +21 -16
  15. package/app/formatters/job/dom.js +9 -70
  16. package/app/formatters/shared.js +58 -0
  17. package/app/formatters/skill/dom.js +57 -2
  18. package/app/formatters/skill/markdown.js +18 -0
  19. package/app/formatters/skill/shared.js +12 -4
  20. package/app/formatters/stage/microdata.js +1 -1
  21. package/app/formatters/stage/shared.js +1 -1
  22. package/app/formatters/tool/shared.js +72 -0
  23. package/app/handout-main.js +7 -7
  24. package/app/index.html +10 -3
  25. package/app/lib/card-mappers.js +64 -17
  26. package/app/lib/render.js +4 -0
  27. package/app/lib/yaml-loader.js +12 -1
  28. package/app/main.js +4 -0
  29. package/app/model/agent.js +26 -18
  30. package/app/model/derivation.js +3 -3
  31. package/app/model/levels.js +2 -0
  32. package/app/model/loader.js +12 -1
  33. package/app/model/validation.js +74 -8
  34. package/app/pages/agent-builder.js +2 -2
  35. package/app/pages/landing.js +34 -14
  36. package/app/pages/self-assessment.js +7 -5
  37. package/app/pages/skill.js +5 -17
  38. package/app/pages/stage.js +10 -6
  39. package/app/pages/tool.js +50 -0
  40. package/app/slides/index.js +25 -25
  41. package/bin/pathway.js +31 -16
  42. package/examples/capabilities/business.yaml +17 -17
  43. package/examples/capabilities/delivery.yaml +51 -36
  44. package/examples/capabilities/reliability.yaml +127 -114
  45. package/examples/capabilities/scale.yaml +38 -36
  46. package/examples/disciplines/engineering_management.yaml +1 -1
  47. package/examples/framework.yaml +12 -0
  48. package/examples/grades.yaml +5 -7
  49. package/examples/self-assessments.yaml +1 -1
  50. package/package.json +1 -1
  51. package/templates/skill.template.md +31 -12
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Tools page
3
+ *
4
+ * Displays aggregated tools from all skills with links to skill context.
5
+ */
6
+
7
+ import { render, div, h1, p } from "../lib/render.js";
8
+ import { getState } from "../lib/state.js";
9
+ import { prepareToolsList } from "../formatters/tool/shared.js";
10
+ import { createBadge } from "../components/card.js";
11
+ import { createCardList } from "../components/list.js";
12
+ import { toolToCardConfig } from "../lib/card-mappers.js";
13
+ import { getConceptEmoji } from "../model/levels.js";
14
+
15
+ /**
16
+ * Render tools list page
17
+ */
18
+ export function renderToolsList() {
19
+ const { data } = getState();
20
+ const { framework } = data;
21
+ const toolEmoji = getConceptEmoji(framework, "tool");
22
+
23
+ const { tools, totalCount } = prepareToolsList(data.skills);
24
+
25
+ const page = div(
26
+ { className: "tools-page" },
27
+ // Header
28
+ div(
29
+ { className: "page-header" },
30
+ h1(
31
+ { className: "page-title" },
32
+ `${toolEmoji} ${framework.entityDefinitions.tool.title}`,
33
+ ),
34
+ p(
35
+ { className: "page-description" },
36
+ framework.entityDefinitions.tool.description.trim().split("\n")[0],
37
+ ),
38
+ createBadge(`${totalCount} tools`, "default"),
39
+ ),
40
+
41
+ // Tools list using standard card grid
42
+ createCardList(
43
+ tools,
44
+ (tool) => toolToCardConfig(tool, data.capabilities),
45
+ "No tools defined yet.",
46
+ ),
47
+ );
48
+
49
+ render(page);
50
+ }
@@ -55,25 +55,6 @@ export function renderSlideIndex({ render, data }) {
55
55
  ),
56
56
  ),
57
57
 
58
- // Tracks
59
- div(
60
- { className: "slide-section" },
61
- a(
62
- { href: "#/overview/track" },
63
- heading2(
64
- { className: "slide-section-title" },
65
- `${getConceptEmoji(data.framework, "track")} `,
66
- span({ className: "gradient-text" }, "Tracks"),
67
- ),
68
- ),
69
- ul(
70
- { className: "related-list" },
71
- ...data.tracks.map((track) =>
72
- li({}, a({ href: `#/track/${track.id}` }, track.name)),
73
- ),
74
- ),
75
- ),
76
-
77
58
  // Grades
78
59
  div(
79
60
  { className: "slide-section" },
@@ -99,21 +80,21 @@ export function renderSlideIndex({ render, data }) {
99
80
  ),
100
81
  ),
101
82
 
102
- // Skills
83
+ // Tracks
103
84
  div(
104
85
  { className: "slide-section" },
105
86
  a(
106
- { href: "#/overview/skill" },
87
+ { href: "#/overview/track" },
107
88
  heading2(
108
89
  { className: "slide-section-title" },
109
- `${getConceptEmoji(data.framework, "skill")} `,
110
- span({ className: "gradient-text" }, "Skills"),
90
+ `${getConceptEmoji(data.framework, "track")} `,
91
+ span({ className: "gradient-text" }, "Tracks"),
111
92
  ),
112
93
  ),
113
94
  ul(
114
95
  { className: "related-list" },
115
- ...data.skills.map((skill) =>
116
- li({}, a({ href: `#/skill/${skill.id}` }, skill.name)),
96
+ ...data.tracks.map((track) =>
97
+ li({}, a({ href: `#/track/${track.id}` }, track.name)),
117
98
  ),
118
99
  ),
119
100
  ),
@@ -137,6 +118,25 @@ export function renderSlideIndex({ render, data }) {
137
118
  ),
138
119
  ),
139
120
 
121
+ // Skills
122
+ div(
123
+ { className: "slide-section" },
124
+ a(
125
+ { href: "#/overview/skill" },
126
+ heading2(
127
+ { className: "slide-section-title" },
128
+ `${getConceptEmoji(data.framework, "skill")} `,
129
+ span({ className: "gradient-text" }, "Skills"),
130
+ ),
131
+ ),
132
+ ul(
133
+ { className: "related-list" },
134
+ ...data.skills.map((skill) =>
135
+ li({}, a({ href: `#/skill/${skill.id}` }, skill.name)),
136
+ ),
137
+ ),
138
+ ),
139
+
140
140
  // Drivers
141
141
  div(
142
142
  { className: "slide-section" },
package/bin/pathway.js CHANGED
@@ -9,15 +9,17 @@
9
9
  * npx pathway <command> [options]
10
10
  *
11
11
  * Commands:
12
- * skill [<id>] Show skills (summary, --list, or detail)
13
- * behaviour [<id>] Show behaviours
14
12
  * discipline [<id>] Show disciplines
15
13
  * grade [<id>] Show grades
16
14
  * track [<id>] Show tracks
15
+ * behaviour [<id>] Show behaviours
16
+ * skill [<id>] Show skills (summary, --list, or detail)
17
17
  * driver [<id>] Show drivers
18
- * job [<discipline> <track> <grade>] Generate job definition
19
- * interview <discipline> <track> <grade> [--type=TYPE] Generate interview
20
- * progress <discipline> <track> <grade> [--compare=GRADE] Career progression
18
+ * stage [<id>] Show stages
19
+ * tool [<name>] Show tools
20
+ * job [<discipline> <grade>] [--track=TRACK] Generate job definition
21
+ * interview <discipline> <grade> [--track=TRACK] [--type=TYPE] Generate interview
22
+ * progress <discipline> <grade> [--track=TRACK] [--compare=GRADE] Career progression
21
23
  * questions [options] Browse interview questions
22
24
  * agent [<discipline> <track>] [--output=PATH] Generate AI agent
23
25
  *
@@ -37,13 +39,14 @@ import { formatError } from "../app/lib/cli-output.js";
37
39
  import { runSchemaValidation } from "../app/model/schema-validation.js";
38
40
 
39
41
  // Import command handlers
40
- import { runSkillCommand } from "../app/commands/skill.js";
41
- import { runBehaviourCommand } from "../app/commands/behaviour.js";
42
42
  import { runDisciplineCommand } from "../app/commands/discipline.js";
43
43
  import { runGradeCommand } from "../app/commands/grade.js";
44
44
  import { runTrackCommand } from "../app/commands/track.js";
45
+ import { runBehaviourCommand } from "../app/commands/behaviour.js";
46
+ import { runSkillCommand } from "../app/commands/skill.js";
45
47
  import { runDriverCommand } from "../app/commands/driver.js";
46
48
  import { runStageCommand } from "../app/commands/stage.js";
49
+ import { runToolCommand } from "../app/commands/tool.js";
47
50
  import { runJobCommand } from "../app/commands/job.js";
48
51
  import { runInterviewCommand } from "../app/commands/interview.js";
49
52
  import { runProgressCommand } from "../app/commands/progress.js";
@@ -58,13 +61,14 @@ const __dirname = dirname(__filename);
58
61
  const rootDir = join(__dirname, "..");
59
62
 
60
63
  const COMMANDS = {
61
- skill: runSkillCommand,
62
- behaviour: runBehaviourCommand,
63
64
  discipline: runDisciplineCommand,
64
65
  grade: runGradeCommand,
65
66
  track: runTrackCommand,
67
+ behaviour: runBehaviourCommand,
68
+ skill: runSkillCommand,
66
69
  driver: runDriverCommand,
67
70
  stage: runStageCommand,
71
+ tool: runToolCommand,
68
72
  job: runJobCommand,
69
73
  interview: runInterviewCommand,
70
74
  progress: runProgressCommand,
@@ -86,19 +90,21 @@ Getting Started:
86
90
  site [--output=PATH] Generate static site to ./site/
87
91
 
88
92
  Entity Commands (summary by default, --list for IDs, <id> for detail):
89
- skill [<id>] Browse skills
90
- behaviour [<id>] Browse behaviours
91
93
  discipline [<id>] Browse disciplines
92
94
  grade [<id>] Browse grades
93
95
  track [<id>] Browse tracks
96
+ behaviour [<id>] Browse behaviours
97
+ skill [<id>] Browse skills
98
+ --agent Output as agent SKILL.md format
94
99
  driver [<id>] Browse drivers
95
100
  stage [<id>] Browse lifecycle stages
101
+ tool [<name>] Browse recommended tools
96
102
 
97
103
  Composite Commands:
98
- job [<discipline> <track> <grade>] Generate job definition
99
- interview <discipline> <track> <grade> [--type=TYPE]
104
+ job [<discipline> <grade>] [--track=TRACK] Generate job definition
105
+ interview <discipline> <grade> [--track=TRACK] [--type=TYPE]
100
106
  Generate interview questions
101
- progress <discipline> <track> <grade> [--compare=GRADE]
107
+ progress <discipline> <grade> [--track=TRACK] [--compare=GRADE]
102
108
  Show career progression
103
109
  questions [filters] Browse interview questions
104
110
  agent <discipline> [--track=<track>] Generate AI coding agent
@@ -130,11 +136,17 @@ Examples:
130
136
  npx pathway skill # Summary of all skills
131
137
  npx pathway skill --list # Skill IDs for piping
132
138
  npx pathway skill ai_evaluation # Detail view
139
+ npx pathway skill architecture_design --agent # Agent SKILL.md output
140
+
141
+ npx pathway tool # Summary of all tools
142
+ npx pathway tool --list # Tool names for piping
143
+ npx pathway tool DuckDB # Tool detail with skill usages
133
144
 
134
145
  npx pathway job # Summary of valid combinations
135
146
  npx pathway job --list # All combinations for piping
136
- npx pathway job software_engineering platform L4
137
- npx pathway job se platform L3 --checklist=code_to_review
147
+ npx pathway job software_engineering L4
148
+ npx pathway job software_engineering L4 --track=platform
149
+ npx pathway job se L3 --track=platform --checklist=code
138
150
 
139
151
  npx pathway questions --level=practitioner
140
152
  npx pathway questions --stats
@@ -176,6 +188,7 @@ function parseArgs(args) {
176
188
  output: null,
177
189
  stage: null,
178
190
  "all-stages": false,
191
+ agent: false,
179
192
  // Serve command options
180
193
  port: null,
181
194
  // Init command options
@@ -227,6 +240,8 @@ function parseArgs(args) {
227
240
  result.stage = arg.slice(8);
228
241
  } else if (arg === "--all-stages") {
229
242
  result["all-stages"] = true;
243
+ } else if (arg === "--agent") {
244
+ result.agent = true;
230
245
  } else if (arg.startsWith("--checklist=")) {
231
246
  result.checklist = arg.slice(12);
232
247
  } else if (arg.startsWith("--port=")) {
@@ -102,10 +102,10 @@ skills:
102
102
  initiatives.
103
103
  agent:
104
104
  name: technical-writing
105
- description: |
106
- Guide for creating clear technical documentation. Use when writing
107
- READMEs, API docs, specifications, or any technical content that needs
108
- to be clear and accurate.
105
+ description: Guide for creating clear technical documentation.
106
+ useWhen: |
107
+ Writing READMEs, API docs, specifications, or any technical content
108
+ that needs to be clear and accurate.
109
109
  stages:
110
110
  specify:
111
111
  focus: |
@@ -172,18 +172,18 @@ skills:
172
172
  - Audience can discover and find it
173
173
  - Search and navigation are updated
174
174
  - Maintenance schedule is established
175
- reference: |
176
- ## Document Types
175
+ implementationReference: |
176
+ ## Document Types
177
177
 
178
- | Type | Purpose | Key Sections |
179
- |------|---------|--------------|
180
- | README | Project overview | Description, Getting Started, Usage |
181
- | API Docs | API reference | Endpoints, Parameters, Examples |
182
- | Spec | Design proposal | Problem, Solution, Alternatives |
183
- | Tutorial | Learning guide | Objective, Steps, Outcomes |
178
+ | Type | Purpose | Key Sections |
179
+ |------|---------|--------------|
180
+ | README | Project overview | Description, Getting Started, Usage |
181
+ | API Docs | API reference | Endpoints, Parameters, Examples |
182
+ | Spec | Design proposal | Problem, Solution, Alternatives |
183
+ | Tutorial | Learning guide | Objective, Steps, Outcomes |
184
184
 
185
- ## Writing Principles
186
- - Use simple, direct language
187
- - One idea per sentence
188
- - Active voice over passive
189
- - Lead with most important info
185
+ ## Writing Principles
186
+ - Use simple, direct language
187
+ - One idea per sentence
188
+ - Active voice over passive
189
+ - Lead with most important info
@@ -73,10 +73,11 @@ skills:
73
73
  architecture authority.
74
74
  agent:
75
75
  name: architecture-design
76
- description: |
76
+ description:
77
77
  Guide for designing software systems and making architectural decisions.
78
- Use when asked to design a system, evaluate architecture options, or
79
- make structural decisions about code organization.
78
+ useWhen: |
79
+ Asked to design a system, evaluate architecture options, or make
80
+ structural decisions about code organization.
80
81
  stages:
81
82
  specify:
82
83
  focus: |
@@ -144,23 +145,23 @@ skills:
144
145
  - Performance meets requirements
145
146
  - Monitoring confirms design assumptions
146
147
  - Operational procedures are documented
147
- reference: |
148
- ## Common Patterns
148
+ implementationReference: |
149
+ ## Common Patterns
149
150
 
150
- ### Service Architecture
151
- - **Microservices**: Independent deployment, clear boundaries
152
- - **Monolith**: Simpler deployment, easier refactoring
153
- - **Modular monolith**: Boundaries within single deployment
151
+ ### Service Architecture
152
+ - **Microservices**: Independent deployment, clear boundaries
153
+ - **Monolith**: Simpler deployment, easier refactoring
154
+ - **Modular monolith**: Boundaries within single deployment
154
155
 
155
- ### Data Patterns
156
- - **Event sourcing**: Full audit trail, complex queries
157
- - **CQRS**: Separate read and write models
158
- - **Repository pattern**: Abstract data access
156
+ ### Data Patterns
157
+ - **Event sourcing**: Full audit trail, complex queries
158
+ - **CQRS**: Separate read and write models
159
+ - **Repository pattern**: Abstract data access
159
160
 
160
- ### Communication Patterns
161
- - **REST**: Synchronous, request-response
162
- - **Event-driven**: Asynchronous, loose coupling
163
- - **gRPC**: Efficient, strongly typed
161
+ ### Communication Patterns
162
+ - **REST**: Synchronous, request-response
163
+ - **Event-driven**: Asynchronous, loose coupling
164
+ - **gRPC**: Efficient, strongly typed
164
165
  - id: full_stack_development
165
166
  name: Full-Stack Development
166
167
  human:
@@ -195,10 +196,11 @@ skills:
195
196
  polymathic engineering.
196
197
  agent:
197
198
  name: full-stack-development
198
- description: |
199
+ description:
199
200
  Guide for building complete solutions across the full technology stack.
200
- Use when implementing features spanning frontend, backend, database,
201
- and infrastructure layers.
201
+ useWhen: |
202
+ Implementing features spanning frontend, backend, database, and
203
+ infrastructure layers.
202
204
  stages:
203
205
  specify:
204
206
  focus: |
@@ -266,23 +268,36 @@ skills:
266
268
  - Feature works end-to-end in production
267
269
  - No errors in monitoring
268
270
  - Performance meets requirements
269
- reference: |
270
- ## Technology Stack
271
+ toolReferences:
272
+ - name: Terraform
273
+ url: https://developer.hashicorp.com/terraform/docs
274
+ description: Infrastructure as code tool
275
+ useWhen: Provisioning and managing cloud infrastructure
276
+ - name: CloudFormation
277
+ url: https://docs.aws.amazon.com/cloudformation/
278
+ description: AWS infrastructure as code service
279
+ useWhen: Managing AWS infrastructure as code
280
+ - name: Docker
281
+ url: https://docs.docker.com/
282
+ description: Container platform
283
+ useWhen: Containerizing applications or managing container environments
284
+ implementationReference: |
285
+ ## Technology Stack
271
286
 
272
- ### Primary Languages
273
- - **JavaScript/TypeScript**: Frontend and Node.js backend
274
- - **Python**: Backend APIs and data processing
287
+ ### Primary Languages
288
+ - **JavaScript/TypeScript**: Frontend and Node.js backend
289
+ - **Python**: Backend APIs and data processing
275
290
 
276
- ### Infrastructure
277
- - **Terraform**: Cloud infrastructure as code
278
- - **CloudFormation**: AWS-specific infrastructure
279
- - **Docker**: Containerization
291
+ ### Infrastructure
292
+ - **Terraform**: Cloud infrastructure as code
293
+ - **CloudFormation**: AWS-specific infrastructure
294
+ - **Docker**: Containerization
280
295
 
281
- ## Layer Responsibilities
296
+ ## Layer Responsibilities
282
297
 
283
- | Layer | Responsibilities |
284
- |-------|-----------------|
285
- | Frontend | UI/UX, client validation, API integration |
286
- | Backend | Business logic, auth, external services |
287
- | Database | Persistence, queries, migrations |
288
- | Infrastructure | Deployment, scaling, monitoring |
298
+ | Layer | Responsibilities |
299
+ |-------|-----------------|
300
+ | Frontend | UI/UX, client validation, API integration |
301
+ | Backend | Business logic, auth, external services |
302
+ | Database | Persistence, queries, migrations |
303
+ | Infrastructure | Deployment, scaling, monitoring |