@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.
- package/app/commands/agent.js +1 -1
- package/app/commands/index.js +4 -3
- package/app/commands/skill.js +56 -2
- package/app/commands/tool.js +112 -0
- package/app/components/checklist.js +6 -4
- package/app/components/markdown-textarea.js +132 -0
- package/app/css/components/forms.css +45 -0
- package/app/css/components/layout.css +12 -0
- package/app/css/components/surfaces.css +22 -0
- package/app/css/pages/detail.css +50 -0
- package/app/css/pages/job-builder.css +0 -42
- package/app/formatters/agent/profile.js +61 -9
- package/app/formatters/agent/skill.js +48 -6
- package/app/formatters/job/description.js +21 -16
- package/app/formatters/job/dom.js +9 -70
- package/app/formatters/shared.js +58 -0
- package/app/formatters/skill/dom.js +57 -2
- package/app/formatters/skill/markdown.js +18 -0
- package/app/formatters/skill/shared.js +12 -4
- package/app/formatters/stage/microdata.js +1 -1
- package/app/formatters/stage/shared.js +1 -1
- package/app/formatters/tool/shared.js +72 -0
- package/app/handout-main.js +7 -7
- package/app/index.html +10 -3
- package/app/lib/card-mappers.js +64 -17
- package/app/lib/render.js +4 -0
- package/app/lib/yaml-loader.js +12 -1
- package/app/main.js +4 -0
- package/app/model/agent.js +26 -18
- package/app/model/derivation.js +3 -3
- package/app/model/levels.js +2 -0
- package/app/model/loader.js +12 -1
- package/app/model/validation.js +74 -8
- package/app/pages/agent-builder.js +2 -2
- package/app/pages/landing.js +34 -14
- package/app/pages/self-assessment.js +7 -5
- package/app/pages/skill.js +5 -17
- package/app/pages/stage.js +10 -6
- package/app/pages/tool.js +50 -0
- package/app/slides/index.js +25 -25
- package/bin/pathway.js +31 -16
- package/examples/capabilities/business.yaml +17 -17
- package/examples/capabilities/delivery.yaml +51 -36
- package/examples/capabilities/reliability.yaml +127 -114
- package/examples/capabilities/scale.yaml +38 -36
- package/examples/disciplines/engineering_management.yaml +1 -1
- package/examples/framework.yaml +12 -0
- package/examples/grades.yaml +5 -7
- package/examples/self-assessments.yaml +1 -1
- package/package.json +1 -1
- 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
|
+
}
|
package/app/slides/index.js
CHANGED
|
@@ -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
|
-
//
|
|
83
|
+
// Tracks
|
|
103
84
|
div(
|
|
104
85
|
{ className: "slide-section" },
|
|
105
86
|
a(
|
|
106
|
-
{ href: "#/overview/
|
|
87
|
+
{ href: "#/overview/track" },
|
|
107
88
|
heading2(
|
|
108
89
|
{ className: "slide-section-title" },
|
|
109
|
-
`${getConceptEmoji(data.framework, "
|
|
110
|
-
span({ className: "gradient-text" }, "
|
|
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.
|
|
116
|
-
li({}, a({ href: `#/
|
|
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
|
-
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
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> <
|
|
99
|
-
interview <discipline> <
|
|
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> <
|
|
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
|
|
137
|
-
npx pathway job
|
|
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
|
-
|
|
107
|
-
READMEs, API docs, specifications, or any technical content
|
|
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
|
-
|
|
176
|
-
|
|
175
|
+
implementationReference: |
|
|
176
|
+
## Document Types
|
|
177
177
|
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
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
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
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
|
-
|
|
79
|
-
|
|
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
|
-
|
|
148
|
-
|
|
148
|
+
implementationReference: |
|
|
149
|
+
## Common Patterns
|
|
149
150
|
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
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
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
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
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
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
|
-
|
|
201
|
-
|
|
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
|
-
|
|
270
|
-
|
|
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
|
-
|
|
273
|
-
|
|
274
|
-
|
|
287
|
+
### Primary Languages
|
|
288
|
+
- **JavaScript/TypeScript**: Frontend and Node.js backend
|
|
289
|
+
- **Python**: Backend APIs and data processing
|
|
275
290
|
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
291
|
+
### Infrastructure
|
|
292
|
+
- **Terraform**: Cloud infrastructure as code
|
|
293
|
+
- **CloudFormation**: AWS-specific infrastructure
|
|
294
|
+
- **Docker**: Containerization
|
|
280
295
|
|
|
281
|
-
|
|
296
|
+
## Layer Responsibilities
|
|
282
297
|
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
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 |
|