@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 CHANGED
@@ -1,12 +1,13 @@
1
1
  # @forwardimpact/pathway
2
2
 
3
- Career progression web app and CLI for exploring roles and generating agents.
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 AI agent profiles, and preparing interviews—all from a unified web
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.14.1",
4
- "description": "Career progression web app and CLI for exploring roles and generating agents",
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.7.0",
44
- "@forwardimpact/model": "^0.8.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"
@@ -182,14 +182,14 @@ export async function runJobCommand({ data, args, options, dataDir }) {
182
182
  process.exit(1);
183
183
  }
184
184
 
185
- const checklist = deriveChecklist({
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 (checklist.length === 0) {
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
- console.log(formatChecklistMarkdown(checklist));
201
- console.log("");
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
  }
@@ -192,7 +192,6 @@ function createRoleAgentCard(agent) {
192
192
  );
193
193
  }
194
194
 
195
-
196
195
  /**
197
196
  * Download all agent files as a ZIP
198
197
  * @param {Object} profile - Agent profile
@@ -23,7 +23,7 @@ import {
23
23
  */
24
24
 
25
25
  /**
26
- * @typedef {Object} ConfirmChecklistEntry
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 {ConfirmChecklistEntry[]} [params.bodyData.confirmChecklist] - Confirm Checklist entries
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 {ConfirmChecklistEntry[]} [profile.bodyData.confirmChecklist] - Confirm Checklist entries (optional)
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 AI coding agents from discipline × track × stage combinations. " +
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}
@@ -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 AI Agent"),
298
+ h2({}, "🤖 Build an Agent Team"),
299
299
  p(
300
300
  {},
301
- "Generate AI coding agent configurations from discipline × track combinations " +
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}}_stage_checklist>`** — Your stage-specific checklist. Follow
63
- the Read-Then-Do and Do-Then-Confirm items for the {{stageName}} stage.
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}}_stage_checklist>
36
+ </{{stageId}}_do_then_confirm>
33
37
  {{/stages}}
34
38
  {{/hasStages}}
35
39
  {{#hasToolReferences}}