@forwardimpact/pathway 0.1.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 (227) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +104 -0
  3. package/app/commands/agent.js +430 -0
  4. package/app/commands/behaviour.js +61 -0
  5. package/app/commands/command-factory.js +211 -0
  6. package/app/commands/discipline.js +58 -0
  7. package/app/commands/driver.js +94 -0
  8. package/app/commands/grade.js +60 -0
  9. package/app/commands/index.js +20 -0
  10. package/app/commands/init.js +67 -0
  11. package/app/commands/interview.js +68 -0
  12. package/app/commands/job.js +157 -0
  13. package/app/commands/progress.js +77 -0
  14. package/app/commands/questions.js +179 -0
  15. package/app/commands/serve.js +143 -0
  16. package/app/commands/site.js +121 -0
  17. package/app/commands/skill.js +76 -0
  18. package/app/commands/stage.js +129 -0
  19. package/app/commands/track.js +70 -0
  20. package/app/components/action-buttons.js +66 -0
  21. package/app/components/behaviour-profile.js +53 -0
  22. package/app/components/builder.js +341 -0
  23. package/app/components/card.js +98 -0
  24. package/app/components/checklist.js +145 -0
  25. package/app/components/comparison-radar.js +237 -0
  26. package/app/components/detail.js +230 -0
  27. package/app/components/error-page.js +72 -0
  28. package/app/components/grid.js +109 -0
  29. package/app/components/list.js +120 -0
  30. package/app/components/modifier-table.js +142 -0
  31. package/app/components/nav.js +64 -0
  32. package/app/components/progression-table.js +320 -0
  33. package/app/components/radar-chart.js +102 -0
  34. package/app/components/skill-matrix.js +97 -0
  35. package/app/css/base.css +56 -0
  36. package/app/css/bundles/app.css +40 -0
  37. package/app/css/bundles/handout.css +43 -0
  38. package/app/css/bundles/slides.css +40 -0
  39. package/app/css/components/badges.css +215 -0
  40. package/app/css/components/buttons.css +101 -0
  41. package/app/css/components/forms.css +105 -0
  42. package/app/css/components/layout.css +209 -0
  43. package/app/css/components/nav.css +166 -0
  44. package/app/css/components/progress.css +166 -0
  45. package/app/css/components/states.css +82 -0
  46. package/app/css/components/surfaces.css +243 -0
  47. package/app/css/components/tables.css +362 -0
  48. package/app/css/components/typography.css +122 -0
  49. package/app/css/components/utilities.css +41 -0
  50. package/app/css/pages/agent-builder.css +391 -0
  51. package/app/css/pages/assessment-results.css +453 -0
  52. package/app/css/pages/detail.css +59 -0
  53. package/app/css/pages/interview-builder.css +148 -0
  54. package/app/css/pages/job-builder.css +134 -0
  55. package/app/css/pages/landing.css +92 -0
  56. package/app/css/pages/lifecycle.css +118 -0
  57. package/app/css/pages/progress-builder.css +274 -0
  58. package/app/css/pages/self-assessment.css +502 -0
  59. package/app/css/reset.css +50 -0
  60. package/app/css/tokens.css +153 -0
  61. package/app/css/views/handout.css +30 -0
  62. package/app/css/views/print.css +608 -0
  63. package/app/css/views/slide-animations.css +113 -0
  64. package/app/css/views/slide-base.css +330 -0
  65. package/app/css/views/slide-sections.css +597 -0
  66. package/app/css/views/slide-tables.css +275 -0
  67. package/app/formatters/agent/dom.js +540 -0
  68. package/app/formatters/agent/profile.js +133 -0
  69. package/app/formatters/agent/skill.js +58 -0
  70. package/app/formatters/behaviour/dom.js +91 -0
  71. package/app/formatters/behaviour/markdown.js +54 -0
  72. package/app/formatters/behaviour/shared.js +64 -0
  73. package/app/formatters/discipline/dom.js +187 -0
  74. package/app/formatters/discipline/markdown.js +87 -0
  75. package/app/formatters/discipline/shared.js +131 -0
  76. package/app/formatters/driver/dom.js +103 -0
  77. package/app/formatters/driver/shared.js +92 -0
  78. package/app/formatters/grade/dom.js +208 -0
  79. package/app/formatters/grade/markdown.js +94 -0
  80. package/app/formatters/grade/shared.js +86 -0
  81. package/app/formatters/index.js +50 -0
  82. package/app/formatters/interview/dom.js +97 -0
  83. package/app/formatters/interview/markdown.js +66 -0
  84. package/app/formatters/interview/shared.js +332 -0
  85. package/app/formatters/job/description.js +176 -0
  86. package/app/formatters/job/dom.js +411 -0
  87. package/app/formatters/job/markdown.js +102 -0
  88. package/app/formatters/progress/dom.js +135 -0
  89. package/app/formatters/progress/markdown.js +86 -0
  90. package/app/formatters/progress/shared.js +339 -0
  91. package/app/formatters/questions/json.js +43 -0
  92. package/app/formatters/questions/markdown.js +303 -0
  93. package/app/formatters/questions/shared.js +274 -0
  94. package/app/formatters/questions/yaml.js +76 -0
  95. package/app/formatters/shared.js +71 -0
  96. package/app/formatters/skill/dom.js +168 -0
  97. package/app/formatters/skill/markdown.js +109 -0
  98. package/app/formatters/skill/shared.js +125 -0
  99. package/app/formatters/stage/dom.js +135 -0
  100. package/app/formatters/stage/index.js +12 -0
  101. package/app/formatters/stage/shared.js +111 -0
  102. package/app/formatters/track/dom.js +128 -0
  103. package/app/formatters/track/markdown.js +105 -0
  104. package/app/formatters/track/shared.js +181 -0
  105. package/app/handout-main.js +421 -0
  106. package/app/handout.html +21 -0
  107. package/app/index.html +59 -0
  108. package/app/lib/card-mappers.js +173 -0
  109. package/app/lib/cli-output.js +270 -0
  110. package/app/lib/error-boundary.js +70 -0
  111. package/app/lib/errors.js +49 -0
  112. package/app/lib/form-controls.js +47 -0
  113. package/app/lib/job-cache.js +86 -0
  114. package/app/lib/markdown.js +114 -0
  115. package/app/lib/radar.js +866 -0
  116. package/app/lib/reactive.js +77 -0
  117. package/app/lib/render.js +212 -0
  118. package/app/lib/router-core.js +160 -0
  119. package/app/lib/router-pages.js +16 -0
  120. package/app/lib/router-slides.js +202 -0
  121. package/app/lib/state.js +148 -0
  122. package/app/lib/utils.js +14 -0
  123. package/app/lib/yaml-loader.js +327 -0
  124. package/app/main.js +213 -0
  125. package/app/model/agent.js +702 -0
  126. package/app/model/checklist.js +137 -0
  127. package/app/model/derivation.js +699 -0
  128. package/app/model/index-generator.js +71 -0
  129. package/app/model/interview.js +539 -0
  130. package/app/model/job.js +222 -0
  131. package/app/model/levels.js +591 -0
  132. package/app/model/loader.js +564 -0
  133. package/app/model/matching.js +858 -0
  134. package/app/model/modifiers.js +158 -0
  135. package/app/model/profile.js +266 -0
  136. package/app/model/progression.js +507 -0
  137. package/app/model/validation.js +1385 -0
  138. package/app/pages/agent-builder.js +823 -0
  139. package/app/pages/assessment-results.js +507 -0
  140. package/app/pages/behaviour.js +70 -0
  141. package/app/pages/discipline.js +71 -0
  142. package/app/pages/driver.js +106 -0
  143. package/app/pages/grade.js +117 -0
  144. package/app/pages/interview-builder.js +50 -0
  145. package/app/pages/interview.js +304 -0
  146. package/app/pages/job-builder.js +50 -0
  147. package/app/pages/job.js +58 -0
  148. package/app/pages/landing.js +305 -0
  149. package/app/pages/progress-builder.js +58 -0
  150. package/app/pages/progress.js +495 -0
  151. package/app/pages/self-assessment.js +729 -0
  152. package/app/pages/skill.js +113 -0
  153. package/app/pages/stage.js +231 -0
  154. package/app/pages/track.js +69 -0
  155. package/app/slide-main.js +360 -0
  156. package/app/slides/behaviour.js +38 -0
  157. package/app/slides/chapter.js +82 -0
  158. package/app/slides/discipline.js +40 -0
  159. package/app/slides/driver.js +39 -0
  160. package/app/slides/grade.js +32 -0
  161. package/app/slides/index.js +198 -0
  162. package/app/slides/interview.js +58 -0
  163. package/app/slides/job.js +55 -0
  164. package/app/slides/overview.js +126 -0
  165. package/app/slides/progress.js +83 -0
  166. package/app/slides/skill.js +40 -0
  167. package/app/slides/track.js +39 -0
  168. package/app/slides.html +56 -0
  169. package/app/types.js +147 -0
  170. package/bin/pathway.js +489 -0
  171. package/examples/agents/.claude/skills/architecture-design/SKILL.md +88 -0
  172. package/examples/agents/.claude/skills/cloud-platforms/SKILL.md +90 -0
  173. package/examples/agents/.claude/skills/code-quality-review/SKILL.md +67 -0
  174. package/examples/agents/.claude/skills/data-modeling/SKILL.md +99 -0
  175. package/examples/agents/.claude/skills/developer-experience/SKILL.md +99 -0
  176. package/examples/agents/.claude/skills/devops-cicd/SKILL.md +96 -0
  177. package/examples/agents/.claude/skills/full-stack-development/SKILL.md +90 -0
  178. package/examples/agents/.claude/skills/knowledge-management/SKILL.md +100 -0
  179. package/examples/agents/.claude/skills/pattern-generalization/SKILL.md +102 -0
  180. package/examples/agents/.claude/skills/sre-practices/SKILL.md +117 -0
  181. package/examples/agents/.claude/skills/technical-debt-management/SKILL.md +123 -0
  182. package/examples/agents/.claude/skills/technical-writing/SKILL.md +129 -0
  183. package/examples/agents/.github/agents/se-platform-code.agent.md +181 -0
  184. package/examples/agents/.github/agents/se-platform-plan.agent.md +178 -0
  185. package/examples/agents/.github/agents/se-platform-review.agent.md +113 -0
  186. package/examples/agents/.vscode/settings.json +8 -0
  187. package/examples/behaviours/_index.yaml +8 -0
  188. package/examples/behaviours/outcome_ownership.yaml +44 -0
  189. package/examples/behaviours/polymathic_knowledge.yaml +42 -0
  190. package/examples/behaviours/precise_communication.yaml +40 -0
  191. package/examples/behaviours/relentless_curiosity.yaml +38 -0
  192. package/examples/behaviours/systems_thinking.yaml +41 -0
  193. package/examples/capabilities/_index.yaml +8 -0
  194. package/examples/capabilities/business.yaml +251 -0
  195. package/examples/capabilities/delivery.yaml +352 -0
  196. package/examples/capabilities/people.yaml +100 -0
  197. package/examples/capabilities/reliability.yaml +318 -0
  198. package/examples/capabilities/scale.yaml +394 -0
  199. package/examples/disciplines/_index.yaml +5 -0
  200. package/examples/disciplines/data_engineering.yaml +76 -0
  201. package/examples/disciplines/software_engineering.yaml +76 -0
  202. package/examples/drivers.yaml +205 -0
  203. package/examples/framework.yaml +58 -0
  204. package/examples/grades.yaml +118 -0
  205. package/examples/questions/behaviours/outcome_ownership.yaml +52 -0
  206. package/examples/questions/behaviours/polymathic_knowledge.yaml +48 -0
  207. package/examples/questions/behaviours/precise_communication.yaml +55 -0
  208. package/examples/questions/behaviours/relentless_curiosity.yaml +51 -0
  209. package/examples/questions/behaviours/systems_thinking.yaml +53 -0
  210. package/examples/questions/skills/architecture_design.yaml +54 -0
  211. package/examples/questions/skills/cloud_platforms.yaml +48 -0
  212. package/examples/questions/skills/code_quality.yaml +49 -0
  213. package/examples/questions/skills/data_modeling.yaml +46 -0
  214. package/examples/questions/skills/devops.yaml +47 -0
  215. package/examples/questions/skills/full_stack_development.yaml +48 -0
  216. package/examples/questions/skills/sre_practices.yaml +44 -0
  217. package/examples/questions/skills/stakeholder_management.yaml +49 -0
  218. package/examples/questions/skills/team_collaboration.yaml +43 -0
  219. package/examples/questions/skills/technical_writing.yaml +43 -0
  220. package/examples/self-assessments.yaml +66 -0
  221. package/examples/stages.yaml +76 -0
  222. package/examples/tracks/_index.yaml +6 -0
  223. package/examples/tracks/manager.yaml +53 -0
  224. package/examples/tracks/platform.yaml +54 -0
  225. package/examples/tracks/sre.yaml +58 -0
  226. package/examples/vscode-settings.yaml +22 -0
  227. package/package.json +68 -0
@@ -0,0 +1,305 @@
1
+ /**
2
+ * Landing page
3
+ */
4
+
5
+ import { render, div, h1, h2, p, a, span } from "../lib/render.js";
6
+ import { getState } from "../lib/state.js";
7
+ import { createStatCard } from "../components/card.js";
8
+ import { groupSkillsByCapability, getConceptEmoji } from "../model/levels.js";
9
+ import { getStageEmoji } from "../formatters/stage/shared.js";
10
+
11
+ /**
12
+ * Create lifecycle flow visualization for landing page
13
+ * @param {Array} stages - Array of stage objects
14
+ * @returns {HTMLElement}
15
+ */
16
+ function createLifecycleFlow(stages) {
17
+ const flowItems = stages.map((stage, index) => {
18
+ const emoji = getStageEmoji(stages, stage.id);
19
+ const isLast = index === stages.length - 1;
20
+
21
+ return div(
22
+ { className: "lifecycle-flow-item" },
23
+ a(
24
+ { href: `#/stage/${stage.id}`, className: "lifecycle-stage" },
25
+ span({ className: "lifecycle-emoji" }, emoji),
26
+ span({ className: "lifecycle-name" }, stage.name),
27
+ ),
28
+ !isLast ? span({ className: "lifecycle-arrow" }, "→") : null,
29
+ );
30
+ });
31
+
32
+ return div({ className: "lifecycle-flow" }, ...flowItems);
33
+ }
34
+
35
+ /**
36
+ * Render the landing page
37
+ */
38
+ export function renderLanding() {
39
+ const { data } = getState();
40
+ const { framework } = data;
41
+ const stages = data.stages || [];
42
+
43
+ // Calculate stats using centralized capability ordering
44
+ const skillsByCapability = groupSkillsByCapability(data.skills);
45
+ const capabilityCount = Object.keys(skillsByCapability).length;
46
+
47
+ const page = div(
48
+ { className: "landing-page" },
49
+ // Hero section
50
+ div(
51
+ { className: "landing-hero" },
52
+ div(
53
+ { className: "hero-title-wrapper" },
54
+ h1({}, `${framework.emoji} ${framework.title}`),
55
+ span({ className: "brand-tag brand-tag-hero" }, framework.tag),
56
+ ),
57
+ p({}, framework.description.trim()),
58
+ // Job builder CTA
59
+ div(
60
+ { className: "page-actions", style: "justify-content: center" },
61
+ a(
62
+ { href: "#/job-builder", className: "btn btn-primary btn-lg" },
63
+ "Build a Job",
64
+ ),
65
+ a(
66
+ { href: "#/agent-builder", className: "btn btn-primary btn-lg" },
67
+ "Build an Agent",
68
+ ),
69
+ a(
70
+ { href: "#/interview-prep", className: "btn btn-secondary btn-lg" },
71
+ "Interview Prep",
72
+ ),
73
+ a(
74
+ { href: "#/career-progress", className: "btn btn-secondary btn-lg" },
75
+ "Career Progress",
76
+ ),
77
+ a(
78
+ { href: "#/self-assessment", className: "btn btn-secondary btn-lg" },
79
+ "Self-Assessment",
80
+ ),
81
+ ),
82
+ ),
83
+
84
+ // Stats grid
85
+ div(
86
+ { className: "grid grid-6" },
87
+ createStatCard({
88
+ value: data.disciplines.length,
89
+ label: "Disciplines",
90
+ href: "/discipline",
91
+ }),
92
+ createStatCard({
93
+ value: data.tracks.length,
94
+ label: "Tracks",
95
+ href: "/track",
96
+ }),
97
+ createStatCard({
98
+ value: data.grades.length,
99
+ label: "Grades",
100
+ href: "/grade",
101
+ }),
102
+ createStatCard({
103
+ value: data.skills.length,
104
+ label: "Skills",
105
+ href: "/skill",
106
+ }),
107
+ createStatCard({
108
+ value: data.behaviours.length,
109
+ label: "Behaviours",
110
+ href: "/behaviour",
111
+ }),
112
+ createStatCard({
113
+ value: stages.length,
114
+ label: "Stages",
115
+ href: "/stage",
116
+ }),
117
+ ),
118
+
119
+ // Lifecycle flow visualization
120
+ stages.length > 0
121
+ ? div(
122
+ { className: "section section-detail" },
123
+ h2({ className: "section-title" }, "🔄 Engineering Lifecycle"),
124
+ p(
125
+ { className: "text-muted", style: "margin-bottom: 1rem" },
126
+ "The three stages of engineering work, from planning through review.",
127
+ ),
128
+ createLifecycleFlow(stages),
129
+ )
130
+ : null,
131
+
132
+ // Quick links section
133
+ div(
134
+ { className: "section section-detail" },
135
+ h2({ className: "section-title" }, "Explore the Framework"),
136
+ div(
137
+ { className: "grid grid-3" },
138
+ createQuickLinkCard(
139
+ `${getConceptEmoji(framework, "discipline")} ${framework.entityDefinitions.discipline.title}`,
140
+ `${data.disciplines.length} ${framework.entityDefinitions.discipline.title.toLowerCase()} — ${framework.entityDefinitions.discipline.description.trim().split("\n")[0]}`,
141
+ "/discipline",
142
+ ),
143
+ createQuickLinkCard(
144
+ `${getConceptEmoji(framework, "track")} ${framework.entityDefinitions.track.title}`,
145
+ `${data.tracks.length} ${framework.entityDefinitions.track.title.toLowerCase()} — ${framework.entityDefinitions.track.description.trim().split("\n")[0]}`,
146
+ "/track",
147
+ ),
148
+ createQuickLinkCard(
149
+ `${getConceptEmoji(framework, "grade")} ${framework.entityDefinitions.grade.title}`,
150
+ `${data.grades.length} ${framework.entityDefinitions.grade.title.toLowerCase()} — ${framework.entityDefinitions.grade.description.trim().split("\n")[0]}`,
151
+ "/grade",
152
+ ),
153
+ createQuickLinkCard(
154
+ `${getConceptEmoji(framework, "skill")} ${framework.entityDefinitions.skill.title}`,
155
+ `${data.skills.length} ${framework.entityDefinitions.skill.title.toLowerCase()} across ${capabilityCount} capabilities — ${framework.entityDefinitions.skill.description.trim().split("\n")[0]}`,
156
+ "/skill",
157
+ ),
158
+ createQuickLinkCard(
159
+ `${getConceptEmoji(framework, "behaviour")} ${framework.entityDefinitions.behaviour.title}`,
160
+ `${data.behaviours.length} ${framework.entityDefinitions.behaviour.title.toLowerCase()} — ${framework.entityDefinitions.behaviour.description.trim().split("\n")[0]}`,
161
+ "/behaviour",
162
+ ),
163
+ createQuickLinkCard(
164
+ "🔄 Stages",
165
+ `${stages.length} stages — The engineering lifecycle from planning through review.`,
166
+ "/stage",
167
+ ),
168
+ createQuickLinkCard(
169
+ `${getConceptEmoji(framework, "driver")} ${framework.entityDefinitions.driver.title}`,
170
+ `${data.drivers.length} ${framework.entityDefinitions.driver.title.toLowerCase()} — ${framework.entityDefinitions.driver.description.trim().split("\n")[0]}`,
171
+ "/driver",
172
+ ),
173
+ ),
174
+ ),
175
+
176
+ // Build Your Team section
177
+ div(
178
+ { className: "section section-detail" },
179
+ h2({ className: "section-title" }, "Build Your Team"),
180
+
181
+ // CTA cards grid
182
+ div(
183
+ { className: "grid grid-2" },
184
+ // Job builder CTA
185
+ div(
186
+ { className: "card", style: "text-align: center" },
187
+ h2({}, "🔨 Build a Job Definition"),
188
+ p(
189
+ {},
190
+ "Combine a discipline, track, and grade to generate a complete job definition " +
191
+ "with skill matrices and behaviour profiles.",
192
+ ),
193
+ div(
194
+ { className: "page-actions", style: "justify-content: center" },
195
+ a(
196
+ { href: "#/job-builder", className: "btn btn-primary btn-lg" },
197
+ "Start Building →",
198
+ ),
199
+ ),
200
+ ),
201
+
202
+ // Interview prep CTA
203
+ div(
204
+ { className: "card", style: "text-align: center" },
205
+ h2({}, "🎤 Prep for an Interview"),
206
+ p(
207
+ {},
208
+ "Generate tailored interview questions based on role requirements " +
209
+ "to ensure comprehensive candidate assessment.",
210
+ ),
211
+ div(
212
+ { className: "page-actions", style: "justify-content: center" },
213
+ a(
214
+ { href: "#/interview-prep", className: "btn btn-primary btn-lg" },
215
+ "Interview Prep →",
216
+ ),
217
+ ),
218
+ ),
219
+
220
+ // Career progress CTA
221
+ div(
222
+ { className: "card", style: "text-align: center" },
223
+ h2({}, "📈 Plan Your Career"),
224
+ p(
225
+ {},
226
+ "Visualize your progression to the next grade and compare expectations " +
227
+ "across different tracks to plan your career development.",
228
+ ),
229
+ div(
230
+ { className: "page-actions", style: "justify-content: center" },
231
+ a(
232
+ {
233
+ href: "#/career-progress",
234
+ className: "btn btn-primary btn-lg",
235
+ },
236
+ "Career Progress →",
237
+ ),
238
+ ),
239
+ ),
240
+
241
+ // Self-assessment CTA
242
+ div(
243
+ { className: "card", style: "text-align: center" },
244
+ h2({}, `${getConceptEmoji(framework, "driver")} Assess Your Skills`),
245
+ p(
246
+ {},
247
+ "Assess your current skills and behaviours to discover matching roles " +
248
+ "and identify development opportunities.",
249
+ ),
250
+ div(
251
+ { className: "page-actions", style: "justify-content: center" },
252
+ a(
253
+ {
254
+ href: "#/self-assessment",
255
+ className: "btn btn-primary btn-lg",
256
+ },
257
+ "Start Assessment →",
258
+ ),
259
+ ),
260
+ ),
261
+
262
+ // Agent builder CTA
263
+ div(
264
+ { className: "card", style: "text-align: center" },
265
+ h2({}, "🤖 Build an AI Agent"),
266
+ p(
267
+ {},
268
+ "Generate AI coding agent configurations from discipline × track combinations " +
269
+ "for GitHub Copilot custom agents.",
270
+ ),
271
+ div(
272
+ { className: "page-actions", style: "justify-content: center" },
273
+ a(
274
+ { href: "#/agent-builder", className: "btn btn-primary btn-lg" },
275
+ "Build Agent →",
276
+ ),
277
+ ),
278
+ ),
279
+ ),
280
+ ),
281
+ );
282
+
283
+ render(page);
284
+ }
285
+
286
+ /**
287
+ * Create a quick link card
288
+ * @param {string} title
289
+ * @param {string} description
290
+ * @param {string} href
291
+ * @returns {HTMLElement}
292
+ */
293
+ function createQuickLinkCard(title, description, href) {
294
+ const card = div(
295
+ { className: "card card-clickable" },
296
+ h2({ className: "card-title", style: "font-size: 1.25rem" }, title),
297
+ p({ className: "card-description" }, description),
298
+ );
299
+
300
+ card.addEventListener("click", () => {
301
+ window.location.hash = href;
302
+ });
303
+
304
+ return card;
305
+ }
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Career progress selection page
3
+ */
4
+
5
+ import { render } from "../lib/render.js";
6
+ import { getState } from "../lib/state.js";
7
+ import { createBuilder, createProgressPreview } from "../components/builder.js";
8
+ import { prepareCareerProgressPreview } from "../formatters/progress/shared.js";
9
+
10
+ /**
11
+ * Render career progress selection page
12
+ */
13
+ export function renderCareerProgress() {
14
+ const { data } = getState();
15
+
16
+ render(
17
+ createBuilder({
18
+ title: "Career Progress",
19
+ description:
20
+ "Select your current role to visualize career progression. See what skills and behaviours " +
21
+ "change as you advance to the next grade, or compare expectations across different tracks.",
22
+ formTitle: "Select Your Current Role",
23
+ emptyPreviewText:
24
+ "Select all three components to preview progression paths.",
25
+ buttonText: "View Career Progress →",
26
+ previewPresenter: (selection) =>
27
+ prepareCareerProgressPreview({
28
+ ...selection,
29
+ grades: data.grades,
30
+ tracks: data.tracks,
31
+ }),
32
+ detailPath: (sel) =>
33
+ `/progress/${sel.discipline}/${sel.track}/${sel.grade}`,
34
+ renderPreview: createProgressPreview,
35
+ labels: {
36
+ grade: "Current Grade",
37
+ },
38
+ helpItems: [
39
+ {
40
+ label: "📈 Grade Progression",
41
+ text: "See exactly which skills and behaviours need to grow to advance to the next grade level.",
42
+ },
43
+ {
44
+ label: "🔀 Track Comparison",
45
+ text: "Compare how expectations differ across tracks at the same grade - useful for exploring lateral moves.",
46
+ },
47
+ {
48
+ label: "🎯 Development Focus",
49
+ text: "Identify the specific areas to focus on for career growth based on the engineering pathway.",
50
+ },
51
+ {
52
+ label: "📊 Visual Comparison",
53
+ text: "Radar charts and comparison tables make it easy to see gaps and growth areas at a glance.",
54
+ },
55
+ ],
56
+ }),
57
+ );
58
+ }