@forwardimpact/pathway 0.14.1 → 0.16.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/README.md +3 -2
- package/package.json +4 -4
- package/src/commands/job.js +12 -4
- package/src/css/components/surfaces.css +20 -0
- package/src/formatters/agent/dom.js +0 -1
- package/src/formatters/agent/profile.js +14 -3
- package/src/index.html +9 -1
- package/src/pages/agent-builder.js +2 -4
- package/src/pages/landing.js +4 -4
- package/templates/agent.template.md +22 -2
- package/templates/skill.template.md +7 -3
package/README.md
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
# @forwardimpact/pathway
|
|
2
2
|
|
|
3
|
-
Career progression web app and CLI for exploring roles and generating
|
|
3
|
+
Career progression web app and CLI for exploring roles and generating agent
|
|
4
|
+
teams.
|
|
4
5
|
|
|
5
6
|
## Role in the Vision
|
|
6
7
|
|
|
7
8
|
Pathway is the primary interface for interacting with engineering competency
|
|
8
9
|
data. It provides tools for browsing career paths, generating job descriptions,
|
|
9
|
-
creating
|
|
10
|
+
creating agent team profiles, and preparing interviews—all from a unified web
|
|
10
11
|
experience and command line.
|
|
11
12
|
|
|
12
13
|
## What It Does
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@forwardimpact/pathway",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "Career progression web app and CLI for exploring roles and generating
|
|
3
|
+
"version": "0.16.0",
|
|
4
|
+
"description": "Career progression web app and CLI for exploring roles and generating agent teams",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"repository": {
|
|
7
7
|
"type": "git",
|
|
@@ -40,8 +40,8 @@
|
|
|
40
40
|
"./commands": "./src/commands/index.js"
|
|
41
41
|
},
|
|
42
42
|
"dependencies": {
|
|
43
|
-
"@forwardimpact/schema": "^0.
|
|
44
|
-
"@forwardimpact/model": "^0.
|
|
43
|
+
"@forwardimpact/schema": "^0.8.0",
|
|
44
|
+
"@forwardimpact/model": "^1.0.0",
|
|
45
45
|
"mustache": "^4.2.0",
|
|
46
46
|
"simple-icons": "^16.7.0",
|
|
47
47
|
"yaml": "^2.3.4"
|
package/src/commands/job.js
CHANGED
|
@@ -182,14 +182,14 @@ export async function runJobCommand({ data, args, options, dataDir }) {
|
|
|
182
182
|
process.exit(1);
|
|
183
183
|
}
|
|
184
184
|
|
|
185
|
-
const
|
|
185
|
+
const { readChecklist, confirmChecklist } = deriveChecklist({
|
|
186
186
|
stageId: options.checklist,
|
|
187
187
|
skillMatrix: view.skillMatrix,
|
|
188
188
|
skills: data.skills,
|
|
189
189
|
capabilities: data.capabilities,
|
|
190
190
|
});
|
|
191
191
|
|
|
192
|
-
if (
|
|
192
|
+
if (readChecklist.length === 0 && confirmChecklist.length === 0) {
|
|
193
193
|
console.log(`\nNo checklist items for ${options.checklist} stage\n`);
|
|
194
194
|
return;
|
|
195
195
|
}
|
|
@@ -197,8 +197,16 @@ export async function runJobCommand({ data, args, options, dataDir }) {
|
|
|
197
197
|
const stageLabel =
|
|
198
198
|
options.checklist.charAt(0).toUpperCase() + options.checklist.slice(1);
|
|
199
199
|
console.log(`\n# ${view.title} — ${stageLabel} Stage Checklist\n`);
|
|
200
|
-
|
|
201
|
-
|
|
200
|
+
if (readChecklist.length > 0) {
|
|
201
|
+
console.log("## Read-Then-Do\n");
|
|
202
|
+
console.log(formatChecklistMarkdown(readChecklist));
|
|
203
|
+
console.log("");
|
|
204
|
+
}
|
|
205
|
+
if (confirmChecklist.length > 0) {
|
|
206
|
+
console.log("## Do-Then-Confirm\n");
|
|
207
|
+
console.log(formatChecklistMarkdown(confirmChecklist));
|
|
208
|
+
console.log("");
|
|
209
|
+
}
|
|
202
210
|
return;
|
|
203
211
|
}
|
|
204
212
|
|
|
@@ -324,4 +324,24 @@
|
|
|
324
324
|
color: var(--color-primary);
|
|
325
325
|
text-decoration: underline;
|
|
326
326
|
}
|
|
327
|
+
|
|
328
|
+
.footer-quote {
|
|
329
|
+
margin: var(--space-lg) auto 0;
|
|
330
|
+
max-width: 50em;
|
|
331
|
+
font-style: italic;
|
|
332
|
+
color: var(--color-text-muted);
|
|
333
|
+
border: none;
|
|
334
|
+
padding: 0;
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
.footer-quote p {
|
|
338
|
+
margin: 0 0 var(--space-xs) 0;
|
|
339
|
+
font-size: var(--font-size-sm);
|
|
340
|
+
line-height: 1.5;
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
.footer-quote cite {
|
|
344
|
+
font-size: var(--font-size-xs);
|
|
345
|
+
font-style: normal;
|
|
346
|
+
}
|
|
327
347
|
}
|
|
@@ -23,7 +23,7 @@ import {
|
|
|
23
23
|
*/
|
|
24
24
|
|
|
25
25
|
/**
|
|
26
|
-
* @typedef {Object}
|
|
26
|
+
* @typedef {Object} ChecklistEntry
|
|
27
27
|
* @property {{id: string, name: string}} skill - Skill info
|
|
28
28
|
* @property {{id: string, name: string, emojiIcon: string}} capability - Capability info
|
|
29
29
|
* @property {string[]} items - Checklist items
|
|
@@ -49,7 +49,8 @@ import {
|
|
|
49
49
|
* @param {Array<{name: string, dirname: string, useWhen: string}>} params.bodyData.skillIndex - Skill index entries
|
|
50
50
|
* @param {string} params.bodyData.roleContext - Role context text
|
|
51
51
|
* @param {WorkingStyleEntry[]} params.bodyData.workingStyles - Working style entries
|
|
52
|
-
* @param {
|
|
52
|
+
* @param {ChecklistEntry[]} [params.bodyData.readChecklist] - Read-Then-Do Checklist entries
|
|
53
|
+
* @param {ChecklistEntry[]} [params.bodyData.confirmChecklist] - Do-Then-Confirm Checklist entries
|
|
53
54
|
* @param {string[]} params.bodyData.constraints - List of constraints
|
|
54
55
|
* @param {Array<{id: string, name: string, description: string}>} [params.bodyData.agentIndex] - List of all available agents
|
|
55
56
|
* @param {boolean} [params.bodyData.hasAgentIndex] - Whether agent index is available
|
|
@@ -80,6 +81,13 @@ function prepareAgentProfileData({ frontmatter, bodyData }) {
|
|
|
80
81
|
content: "required",
|
|
81
82
|
});
|
|
82
83
|
|
|
84
|
+
// Process readChecklist: trim items in each entry
|
|
85
|
+
const readChecklist = (bodyData.readChecklist || []).map((entry) => ({
|
|
86
|
+
skill: entry.skill,
|
|
87
|
+
capability: entry.capability,
|
|
88
|
+
items: (entry.items || []).map((item) => trimRequired(item)),
|
|
89
|
+
}));
|
|
90
|
+
|
|
83
91
|
// Process confirmChecklist: trim items in each entry
|
|
84
92
|
const confirmChecklist = (bodyData.confirmChecklist || []).map((entry) => ({
|
|
85
93
|
skill: entry.skill,
|
|
@@ -107,6 +115,8 @@ function prepareAgentProfileData({ frontmatter, bodyData }) {
|
|
|
107
115
|
roleContext: trimValue(bodyData.roleContext),
|
|
108
116
|
workingStyles,
|
|
109
117
|
hasWorkingStyles: workingStyles.length > 0,
|
|
118
|
+
readChecklist,
|
|
119
|
+
hasReadChecklist: readChecklist.length > 0,
|
|
110
120
|
confirmChecklist,
|
|
111
121
|
hasConfirmChecklist: confirmChecklist.length > 0,
|
|
112
122
|
constraints,
|
|
@@ -133,7 +143,8 @@ function prepareAgentProfileData({ frontmatter, bodyData }) {
|
|
|
133
143
|
* @param {Array<{name: string, dirname: string, useWhen: string}>} profile.bodyData.skillIndex - Skill index entries
|
|
134
144
|
* @param {string} profile.bodyData.roleContext - Role context text
|
|
135
145
|
* @param {WorkingStyleEntry[]} profile.bodyData.workingStyles - Working style entries
|
|
136
|
-
* @param {
|
|
146
|
+
* @param {ChecklistEntry[]} [profile.bodyData.readChecklist] - Read-Then-Do Checklist entries (optional)
|
|
147
|
+
* @param {ChecklistEntry[]} [profile.bodyData.confirmChecklist] - Do-Then-Confirm Checklist entries (optional)
|
|
137
148
|
* @param {string[]} profile.bodyData.constraints - List of constraints
|
|
138
149
|
* @param {string} template - Mustache template string
|
|
139
150
|
* @returns {string} Complete .agent.md file content
|
package/src/index.html
CHANGED
|
@@ -94,7 +94,7 @@
|
|
|
94
94
|
<div class="drawer-section">
|
|
95
95
|
<span class="drawer-section-label">Work</span>
|
|
96
96
|
<a href="#/job-builder" class="drawer-cta">Build a Job</a>
|
|
97
|
-
<a href="#/agent-builder" class="drawer-cta">Build an Agent</a>
|
|
97
|
+
<a href="#/agent-builder" class="drawer-cta">Build an Agent Team</a>
|
|
98
98
|
<a href="#/interview-prep" class="drawer-cta">Interview Prep</a>
|
|
99
99
|
<a href="#/career-progress" class="drawer-cta">Career Progress</a>
|
|
100
100
|
<a href="#/self-assessment" class="drawer-cta">Self-Assessment</a>
|
|
@@ -116,6 +116,14 @@
|
|
|
116
116
|
<a href="slides.html">Slides</a>
|
|
117
117
|
<a href="handout.html">Handouts</a>
|
|
118
118
|
</nav>
|
|
119
|
+
<blockquote class="footer-quote">
|
|
120
|
+
<p>
|
|
121
|
+
“The aim of leadership should be to improve the performance of man
|
|
122
|
+
and machine, to improve quality, to increase output, and
|
|
123
|
+
simultaneously to bring pride of workmanship to people.”
|
|
124
|
+
</p>
|
|
125
|
+
<cite>— W. Edwards Deming</cite>
|
|
126
|
+
</blockquote>
|
|
119
127
|
</footer>
|
|
120
128
|
</div>
|
|
121
129
|
</div>
|
|
@@ -305,10 +305,10 @@ export async function renderAgentBuilder() {
|
|
|
305
305
|
// Header
|
|
306
306
|
div(
|
|
307
307
|
{ className: "page-header" },
|
|
308
|
-
h1({ className: "page-title" }, "🤖 Agent Builder"),
|
|
308
|
+
h1({ className: "page-title" }, "🤖 Agent Team Builder"),
|
|
309
309
|
p(
|
|
310
310
|
{ className: "page-description" },
|
|
311
|
-
"Generate
|
|
311
|
+
"Generate coding agent teams from discipline × track × stage combinations. " +
|
|
312
312
|
"Export complete agent profiles and skill files for GitHub Copilot.",
|
|
313
313
|
),
|
|
314
314
|
),
|
|
@@ -930,8 +930,6 @@ async function importJSZip() {
|
|
|
930
930
|
return module.default;
|
|
931
931
|
}
|
|
932
932
|
|
|
933
|
-
|
|
934
|
-
|
|
935
933
|
/**
|
|
936
934
|
* Create help section explaining how agent builder works
|
|
937
935
|
* @returns {HTMLElement}
|
package/src/pages/landing.js
CHANGED
|
@@ -79,7 +79,7 @@ export function renderLanding() {
|
|
|
79
79
|
),
|
|
80
80
|
a(
|
|
81
81
|
{ href: "#/agent-builder", className: "btn btn-primary btn-lg" },
|
|
82
|
-
"Build an Agent",
|
|
82
|
+
"Build an Agent Team",
|
|
83
83
|
),
|
|
84
84
|
a(
|
|
85
85
|
{ href: "#/interview-prep", className: "btn btn-secondary btn-lg" },
|
|
@@ -295,17 +295,17 @@ export function renderLanding() {
|
|
|
295
295
|
// Agent builder CTA
|
|
296
296
|
div(
|
|
297
297
|
{ className: "card", style: "text-align: center" },
|
|
298
|
-
h2({}, "🤖 Build an
|
|
298
|
+
h2({}, "🤖 Build an Agent Team"),
|
|
299
299
|
p(
|
|
300
300
|
{},
|
|
301
|
-
"Generate
|
|
301
|
+
"Generate coding agent team configurations from discipline × track combinations " +
|
|
302
302
|
"for GitHub Copilot custom agents.",
|
|
303
303
|
),
|
|
304
304
|
div(
|
|
305
305
|
{ className: "page-actions", style: "justify-content: center" },
|
|
306
306
|
a(
|
|
307
307
|
{ href: "#/agent-builder", className: "btn btn-primary btn-lg" },
|
|
308
|
-
"Build Agent →",
|
|
308
|
+
"Build Agent Team →",
|
|
309
309
|
),
|
|
310
310
|
),
|
|
311
311
|
),
|
|
@@ -59,8 +59,12 @@ override general knowledge.
|
|
|
59
59
|
|
|
60
60
|
Each skill file contains XML-tagged sections for precise navigation:
|
|
61
61
|
|
|
62
|
-
- **`<{{stageId}}
|
|
63
|
-
|
|
62
|
+
- **`<{{stageId}}_read_then_do>`** — Read-Then-Do checklist for the
|
|
63
|
+
{{stageName}} stage. Read and understand these items BEFORE starting work.
|
|
64
|
+
These are prerequisites and context you must absorb first.
|
|
65
|
+
- **`<{{stageId}}_do_then_confirm>`** — Do-Then-Confirm checklist for the
|
|
66
|
+
{{stageName}} stage. Complete your work, then verify each item. These are
|
|
67
|
+
quality gates to check AFTER implementation.
|
|
64
68
|
- **`<required_tools>`** — Mandatory tools for this skill. You MUST use these
|
|
65
69
|
organizational standards that override general knowledge or personal
|
|
66
70
|
preferences.
|
|
@@ -95,6 +99,22 @@ and (3) the compromised approach with acknowledged limitations.
|
|
|
95
99
|
| `{{id}}` | {{{name}}} | {{{description}}} |
|
|
96
100
|
{{/agentIndex}}
|
|
97
101
|
{{/hasAgentIndex}}
|
|
102
|
+
{{#hasReadChecklist}}
|
|
103
|
+
|
|
104
|
+
## Read-Then-Do Checklist
|
|
105
|
+
|
|
106
|
+
Before starting work, read and understand these items. They are prerequisites
|
|
107
|
+
and context that must be absorbed before implementation begins:
|
|
108
|
+
|
|
109
|
+
{{#readChecklist}}
|
|
110
|
+
### {{{capability.emojiIcon}}} {{{skill.name}}}
|
|
111
|
+
|
|
112
|
+
{{#items}}
|
|
113
|
+
- [ ] {{{.}}}
|
|
114
|
+
{{/items}}
|
|
115
|
+
|
|
116
|
+
{{/readChecklist}}
|
|
117
|
+
{{/hasReadChecklist}}
|
|
98
118
|
{{#hasConfirmChecklist}}
|
|
99
119
|
|
|
100
120
|
## Do-Then-Confirm Checklist
|
|
@@ -13,23 +13,27 @@ description: {{{description}}}{{#hasUseWhen}} Use When: {{{useWhen}}}{{/hasUseWh
|
|
|
13
13
|
## Stage Guidance
|
|
14
14
|
{{#stages}}
|
|
15
15
|
|
|
16
|
-
<{{stageId}}_stage_checklist>
|
|
17
|
-
|
|
18
16
|
### {{stageName}} Stage
|
|
19
17
|
|
|
20
18
|
**Focus:** {{{focus}}}
|
|
21
19
|
|
|
20
|
+
<{{stageId}}_read_then_do>
|
|
21
|
+
|
|
22
22
|
**Read-Then-Do Checklist:**
|
|
23
23
|
{{#readChecklist}}
|
|
24
24
|
- [ ] {{{.}}}
|
|
25
25
|
{{/readChecklist}}
|
|
26
26
|
|
|
27
|
+
</{{stageId}}_read_then_do>
|
|
28
|
+
|
|
29
|
+
<{{stageId}}_do_then_confirm>
|
|
30
|
+
|
|
27
31
|
**Do-Then-Confirm Checklist:**
|
|
28
32
|
{{#confirmChecklist}}
|
|
29
33
|
- [ ] {{{.}}}
|
|
30
34
|
{{/confirmChecklist}}
|
|
31
35
|
|
|
32
|
-
</{{stageId}}
|
|
36
|
+
</{{stageId}}_do_then_confirm>
|
|
33
37
|
{{/stages}}
|
|
34
38
|
{{/hasStages}}
|
|
35
39
|
{{#hasToolReferences}}
|