@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.
- package/LICENSE +201 -0
- package/README.md +104 -0
- package/app/commands/agent.js +430 -0
- package/app/commands/behaviour.js +61 -0
- package/app/commands/command-factory.js +211 -0
- package/app/commands/discipline.js +58 -0
- package/app/commands/driver.js +94 -0
- package/app/commands/grade.js +60 -0
- package/app/commands/index.js +20 -0
- package/app/commands/init.js +67 -0
- package/app/commands/interview.js +68 -0
- package/app/commands/job.js +157 -0
- package/app/commands/progress.js +77 -0
- package/app/commands/questions.js +179 -0
- package/app/commands/serve.js +143 -0
- package/app/commands/site.js +121 -0
- package/app/commands/skill.js +76 -0
- package/app/commands/stage.js +129 -0
- package/app/commands/track.js +70 -0
- package/app/components/action-buttons.js +66 -0
- package/app/components/behaviour-profile.js +53 -0
- package/app/components/builder.js +341 -0
- package/app/components/card.js +98 -0
- package/app/components/checklist.js +145 -0
- package/app/components/comparison-radar.js +237 -0
- package/app/components/detail.js +230 -0
- package/app/components/error-page.js +72 -0
- package/app/components/grid.js +109 -0
- package/app/components/list.js +120 -0
- package/app/components/modifier-table.js +142 -0
- package/app/components/nav.js +64 -0
- package/app/components/progression-table.js +320 -0
- package/app/components/radar-chart.js +102 -0
- package/app/components/skill-matrix.js +97 -0
- package/app/css/base.css +56 -0
- package/app/css/bundles/app.css +40 -0
- package/app/css/bundles/handout.css +43 -0
- package/app/css/bundles/slides.css +40 -0
- package/app/css/components/badges.css +215 -0
- package/app/css/components/buttons.css +101 -0
- package/app/css/components/forms.css +105 -0
- package/app/css/components/layout.css +209 -0
- package/app/css/components/nav.css +166 -0
- package/app/css/components/progress.css +166 -0
- package/app/css/components/states.css +82 -0
- package/app/css/components/surfaces.css +243 -0
- package/app/css/components/tables.css +362 -0
- package/app/css/components/typography.css +122 -0
- package/app/css/components/utilities.css +41 -0
- package/app/css/pages/agent-builder.css +391 -0
- package/app/css/pages/assessment-results.css +453 -0
- package/app/css/pages/detail.css +59 -0
- package/app/css/pages/interview-builder.css +148 -0
- package/app/css/pages/job-builder.css +134 -0
- package/app/css/pages/landing.css +92 -0
- package/app/css/pages/lifecycle.css +118 -0
- package/app/css/pages/progress-builder.css +274 -0
- package/app/css/pages/self-assessment.css +502 -0
- package/app/css/reset.css +50 -0
- package/app/css/tokens.css +153 -0
- package/app/css/views/handout.css +30 -0
- package/app/css/views/print.css +608 -0
- package/app/css/views/slide-animations.css +113 -0
- package/app/css/views/slide-base.css +330 -0
- package/app/css/views/slide-sections.css +597 -0
- package/app/css/views/slide-tables.css +275 -0
- package/app/formatters/agent/dom.js +540 -0
- package/app/formatters/agent/profile.js +133 -0
- package/app/formatters/agent/skill.js +58 -0
- package/app/formatters/behaviour/dom.js +91 -0
- package/app/formatters/behaviour/markdown.js +54 -0
- package/app/formatters/behaviour/shared.js +64 -0
- package/app/formatters/discipline/dom.js +187 -0
- package/app/formatters/discipline/markdown.js +87 -0
- package/app/formatters/discipline/shared.js +131 -0
- package/app/formatters/driver/dom.js +103 -0
- package/app/formatters/driver/shared.js +92 -0
- package/app/formatters/grade/dom.js +208 -0
- package/app/formatters/grade/markdown.js +94 -0
- package/app/formatters/grade/shared.js +86 -0
- package/app/formatters/index.js +50 -0
- package/app/formatters/interview/dom.js +97 -0
- package/app/formatters/interview/markdown.js +66 -0
- package/app/formatters/interview/shared.js +332 -0
- package/app/formatters/job/description.js +176 -0
- package/app/formatters/job/dom.js +411 -0
- package/app/formatters/job/markdown.js +102 -0
- package/app/formatters/progress/dom.js +135 -0
- package/app/formatters/progress/markdown.js +86 -0
- package/app/formatters/progress/shared.js +339 -0
- package/app/formatters/questions/json.js +43 -0
- package/app/formatters/questions/markdown.js +303 -0
- package/app/formatters/questions/shared.js +274 -0
- package/app/formatters/questions/yaml.js +76 -0
- package/app/formatters/shared.js +71 -0
- package/app/formatters/skill/dom.js +168 -0
- package/app/formatters/skill/markdown.js +109 -0
- package/app/formatters/skill/shared.js +125 -0
- package/app/formatters/stage/dom.js +135 -0
- package/app/formatters/stage/index.js +12 -0
- package/app/formatters/stage/shared.js +111 -0
- package/app/formatters/track/dom.js +128 -0
- package/app/formatters/track/markdown.js +105 -0
- package/app/formatters/track/shared.js +181 -0
- package/app/handout-main.js +421 -0
- package/app/handout.html +21 -0
- package/app/index.html +59 -0
- package/app/lib/card-mappers.js +173 -0
- package/app/lib/cli-output.js +270 -0
- package/app/lib/error-boundary.js +70 -0
- package/app/lib/errors.js +49 -0
- package/app/lib/form-controls.js +47 -0
- package/app/lib/job-cache.js +86 -0
- package/app/lib/markdown.js +114 -0
- package/app/lib/radar.js +866 -0
- package/app/lib/reactive.js +77 -0
- package/app/lib/render.js +212 -0
- package/app/lib/router-core.js +160 -0
- package/app/lib/router-pages.js +16 -0
- package/app/lib/router-slides.js +202 -0
- package/app/lib/state.js +148 -0
- package/app/lib/utils.js +14 -0
- package/app/lib/yaml-loader.js +327 -0
- package/app/main.js +213 -0
- package/app/model/agent.js +702 -0
- package/app/model/checklist.js +137 -0
- package/app/model/derivation.js +699 -0
- package/app/model/index-generator.js +71 -0
- package/app/model/interview.js +539 -0
- package/app/model/job.js +222 -0
- package/app/model/levels.js +591 -0
- package/app/model/loader.js +564 -0
- package/app/model/matching.js +858 -0
- package/app/model/modifiers.js +158 -0
- package/app/model/profile.js +266 -0
- package/app/model/progression.js +507 -0
- package/app/model/validation.js +1385 -0
- package/app/pages/agent-builder.js +823 -0
- package/app/pages/assessment-results.js +507 -0
- package/app/pages/behaviour.js +70 -0
- package/app/pages/discipline.js +71 -0
- package/app/pages/driver.js +106 -0
- package/app/pages/grade.js +117 -0
- package/app/pages/interview-builder.js +50 -0
- package/app/pages/interview.js +304 -0
- package/app/pages/job-builder.js +50 -0
- package/app/pages/job.js +58 -0
- package/app/pages/landing.js +305 -0
- package/app/pages/progress-builder.js +58 -0
- package/app/pages/progress.js +495 -0
- package/app/pages/self-assessment.js +729 -0
- package/app/pages/skill.js +113 -0
- package/app/pages/stage.js +231 -0
- package/app/pages/track.js +69 -0
- package/app/slide-main.js +360 -0
- package/app/slides/behaviour.js +38 -0
- package/app/slides/chapter.js +82 -0
- package/app/slides/discipline.js +40 -0
- package/app/slides/driver.js +39 -0
- package/app/slides/grade.js +32 -0
- package/app/slides/index.js +198 -0
- package/app/slides/interview.js +58 -0
- package/app/slides/job.js +55 -0
- package/app/slides/overview.js +126 -0
- package/app/slides/progress.js +83 -0
- package/app/slides/skill.js +40 -0
- package/app/slides/track.js +39 -0
- package/app/slides.html +56 -0
- package/app/types.js +147 -0
- package/bin/pathway.js +489 -0
- package/examples/agents/.claude/skills/architecture-design/SKILL.md +88 -0
- package/examples/agents/.claude/skills/cloud-platforms/SKILL.md +90 -0
- package/examples/agents/.claude/skills/code-quality-review/SKILL.md +67 -0
- package/examples/agents/.claude/skills/data-modeling/SKILL.md +99 -0
- package/examples/agents/.claude/skills/developer-experience/SKILL.md +99 -0
- package/examples/agents/.claude/skills/devops-cicd/SKILL.md +96 -0
- package/examples/agents/.claude/skills/full-stack-development/SKILL.md +90 -0
- package/examples/agents/.claude/skills/knowledge-management/SKILL.md +100 -0
- package/examples/agents/.claude/skills/pattern-generalization/SKILL.md +102 -0
- package/examples/agents/.claude/skills/sre-practices/SKILL.md +117 -0
- package/examples/agents/.claude/skills/technical-debt-management/SKILL.md +123 -0
- package/examples/agents/.claude/skills/technical-writing/SKILL.md +129 -0
- package/examples/agents/.github/agents/se-platform-code.agent.md +181 -0
- package/examples/agents/.github/agents/se-platform-plan.agent.md +178 -0
- package/examples/agents/.github/agents/se-platform-review.agent.md +113 -0
- package/examples/agents/.vscode/settings.json +8 -0
- package/examples/behaviours/_index.yaml +8 -0
- package/examples/behaviours/outcome_ownership.yaml +44 -0
- package/examples/behaviours/polymathic_knowledge.yaml +42 -0
- package/examples/behaviours/precise_communication.yaml +40 -0
- package/examples/behaviours/relentless_curiosity.yaml +38 -0
- package/examples/behaviours/systems_thinking.yaml +41 -0
- package/examples/capabilities/_index.yaml +8 -0
- package/examples/capabilities/business.yaml +251 -0
- package/examples/capabilities/delivery.yaml +352 -0
- package/examples/capabilities/people.yaml +100 -0
- package/examples/capabilities/reliability.yaml +318 -0
- package/examples/capabilities/scale.yaml +394 -0
- package/examples/disciplines/_index.yaml +5 -0
- package/examples/disciplines/data_engineering.yaml +76 -0
- package/examples/disciplines/software_engineering.yaml +76 -0
- package/examples/drivers.yaml +205 -0
- package/examples/framework.yaml +58 -0
- package/examples/grades.yaml +118 -0
- package/examples/questions/behaviours/outcome_ownership.yaml +52 -0
- package/examples/questions/behaviours/polymathic_knowledge.yaml +48 -0
- package/examples/questions/behaviours/precise_communication.yaml +55 -0
- package/examples/questions/behaviours/relentless_curiosity.yaml +51 -0
- package/examples/questions/behaviours/systems_thinking.yaml +53 -0
- package/examples/questions/skills/architecture_design.yaml +54 -0
- package/examples/questions/skills/cloud_platforms.yaml +48 -0
- package/examples/questions/skills/code_quality.yaml +49 -0
- package/examples/questions/skills/data_modeling.yaml +46 -0
- package/examples/questions/skills/devops.yaml +47 -0
- package/examples/questions/skills/full_stack_development.yaml +48 -0
- package/examples/questions/skills/sre_practices.yaml +44 -0
- package/examples/questions/skills/stakeholder_management.yaml +49 -0
- package/examples/questions/skills/team_collaboration.yaml +43 -0
- package/examples/questions/skills/technical_writing.yaml +43 -0
- package/examples/self-assessments.yaml +66 -0
- package/examples/stages.yaml +76 -0
- package/examples/tracks/_index.yaml +6 -0
- package/examples/tracks/manager.yaml +53 -0
- package/examples/tracks/platform.yaml +54 -0
- package/examples/tracks/sre.yaml +58 -0
- package/examples/vscode-settings.yaml +22 -0
- 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
|
+
}
|