jumpstart-mode 1.1.12 → 1.1.13

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 (146) hide show
  1. package/.github/agents/jumpstart-adversary.agent.md +2 -1
  2. package/.github/agents/jumpstart-architect.agent.md +5 -6
  3. package/.github/agents/jumpstart-challenger.agent.md +2 -1
  4. package/.github/agents/jumpstart-devops.agent.md +2 -2
  5. package/.github/agents/jumpstart-diagram-verifier.agent.md +2 -1
  6. package/.github/agents/jumpstart-maintenance.agent.md +1 -0
  7. package/.github/agents/jumpstart-performance.agent.md +1 -0
  8. package/.github/agents/jumpstart-pm.agent.md +1 -1
  9. package/.github/agents/jumpstart-refactor.agent.md +1 -0
  10. package/.github/agents/jumpstart-requirements-extractor.agent.md +1 -0
  11. package/.github/agents/jumpstart-researcher.agent.md +1 -0
  12. package/.github/agents/jumpstart-retrospective.agent.md +1 -0
  13. package/.github/agents/jumpstart-reviewer.agent.md +2 -0
  14. package/.github/agents/jumpstart-scout.agent.md +1 -1
  15. package/.github/agents/jumpstart-scrum-master.agent.md +1 -0
  16. package/.github/agents/jumpstart-security.agent.md +2 -1
  17. package/.github/agents/jumpstart-tech-writer.agent.md +1 -0
  18. package/.github/workflows/quality.yml +19 -2
  19. package/.jumpstart/agents/analyst.md +38 -0
  20. package/.jumpstart/agents/architect.md +38 -0
  21. package/.jumpstart/agents/challenger.md +38 -0
  22. package/.jumpstart/agents/developer.md +41 -0
  23. package/.jumpstart/agents/pm.md +38 -0
  24. package/.jumpstart/agents/scout.md +33 -0
  25. package/.jumpstart/agents/ux-designer.md +4 -0
  26. package/.jumpstart/config.yaml +24 -0
  27. package/.jumpstart/schemas/timeline.schema.json +1 -0
  28. package/.jumpstart/skills/skill-creator/SKILL.md +485 -357
  29. package/.jumpstart/skills/skill-creator/agents/analyzer.md +274 -0
  30. package/.jumpstart/skills/skill-creator/agents/comparator.md +202 -0
  31. package/.jumpstart/skills/skill-creator/agents/grader.md +223 -0
  32. package/.jumpstart/skills/skill-creator/assets/eval_review.html +146 -0
  33. package/.jumpstart/skills/skill-creator/eval-viewer/generate_review.py +471 -0
  34. package/.jumpstart/skills/skill-creator/eval-viewer/viewer.html +1325 -0
  35. package/.jumpstart/skills/skill-creator/references/schemas.md +430 -0
  36. package/.jumpstart/skills/skill-creator/scripts/__init__.py +0 -0
  37. package/.jumpstart/skills/skill-creator/scripts/aggregate_benchmark.py +401 -0
  38. package/.jumpstart/skills/skill-creator/scripts/generate_report.py +326 -0
  39. package/.jumpstart/skills/skill-creator/scripts/improve_description.py +247 -0
  40. package/.jumpstart/skills/skill-creator/scripts/package_skill.py +136 -110
  41. package/.jumpstart/skills/skill-creator/scripts/run_eval.py +310 -0
  42. package/.jumpstart/skills/skill-creator/scripts/run_loop.py +328 -0
  43. package/.jumpstart/skills/skill-creator/scripts/utils.py +47 -0
  44. package/.jumpstart/state/timeline.json +659 -0
  45. package/.jumpstart/usage-log.json +74 -3
  46. package/README.md +62 -1
  47. package/bin/cli.js +3217 -1
  48. package/bin/headless-runner.js +62 -2
  49. package/bin/lib/agent-checkpoint.js +168 -0
  50. package/bin/lib/ai-evaluation.js +104 -0
  51. package/bin/lib/ai-intake.js +152 -0
  52. package/bin/lib/ambiguity-heatmap.js +152 -0
  53. package/bin/lib/artifact-comparison.js +104 -0
  54. package/bin/lib/ast-edit-engine.js +157 -0
  55. package/bin/lib/backlog-sync.js +338 -0
  56. package/bin/lib/bcdr-planning.js +158 -0
  57. package/bin/lib/bidirectional-trace.js +199 -0
  58. package/bin/lib/branch-workflow.js +266 -0
  59. package/bin/lib/cab-output.js +119 -0
  60. package/bin/lib/chat-integration.js +122 -0
  61. package/bin/lib/ci-cd-integration.js +208 -0
  62. package/bin/lib/codebase-retrieval.js +125 -0
  63. package/bin/lib/collaboration.js +168 -0
  64. package/bin/lib/compliance-packs.js +213 -0
  65. package/bin/lib/context-chunker.js +128 -0
  66. package/bin/lib/context-onboarding.js +122 -0
  67. package/bin/lib/contract-first.js +124 -0
  68. package/bin/lib/cost-router.js +148 -0
  69. package/bin/lib/credential-boundary.js +155 -0
  70. package/bin/lib/data-classification.js +180 -0
  71. package/bin/lib/data-contracts.js +129 -0
  72. package/bin/lib/db-evolution.js +158 -0
  73. package/bin/lib/decision-conflicts.js +299 -0
  74. package/bin/lib/delivery-confidence.js +361 -0
  75. package/bin/lib/dependency-upgrade.js +153 -0
  76. package/bin/lib/design-system.js +133 -0
  77. package/bin/lib/deterministic-artifacts.js +151 -0
  78. package/bin/lib/diagram-studio.js +115 -0
  79. package/bin/lib/domain-ontology.js +140 -0
  80. package/bin/lib/ea-review-packet.js +151 -0
  81. package/bin/lib/enterprise-search.js +123 -0
  82. package/bin/lib/enterprise-templates.js +140 -0
  83. package/bin/lib/environment-promotion.js +220 -0
  84. package/bin/lib/estimation-studio.js +130 -0
  85. package/bin/lib/event-modeling.js +133 -0
  86. package/bin/lib/evidence-collector.js +179 -0
  87. package/bin/lib/finops-planner.js +182 -0
  88. package/bin/lib/fitness-functions.js +279 -0
  89. package/bin/lib/focus.js +448 -0
  90. package/bin/lib/governance-dashboard.js +165 -0
  91. package/bin/lib/guided-handoff.js +120 -0
  92. package/bin/lib/impact-analysis.js +190 -0
  93. package/bin/lib/incident-feedback.js +157 -0
  94. package/bin/lib/integrate.js +1 -1
  95. package/bin/lib/knowledge-graph.js +122 -0
  96. package/bin/lib/legacy-modernizer.js +160 -0
  97. package/bin/lib/migration-planner.js +144 -0
  98. package/bin/lib/model-governance.js +185 -0
  99. package/bin/lib/model-router.js +144 -0
  100. package/bin/lib/multi-repo.js +272 -0
  101. package/bin/lib/next-phase.js +53 -8
  102. package/bin/lib/ops-ownership.js +152 -0
  103. package/bin/lib/parallel-agents.js +257 -0
  104. package/bin/lib/pattern-library.js +115 -0
  105. package/bin/lib/persona-packs.js +99 -0
  106. package/bin/lib/plan-executor.js +366 -0
  107. package/bin/lib/platform-engineering.js +119 -0
  108. package/bin/lib/playback-summaries.js +126 -0
  109. package/bin/lib/policy-engine.js +240 -0
  110. package/bin/lib/portfolio-reporting.js +357 -0
  111. package/bin/lib/pr-package.js +197 -0
  112. package/bin/lib/project-memory.js +235 -0
  113. package/bin/lib/prompt-governance.js +130 -0
  114. package/bin/lib/promptless-mode.js +128 -0
  115. package/bin/lib/quality-graph.js +193 -0
  116. package/bin/lib/raci-matrix.js +188 -0
  117. package/bin/lib/refactor-planner.js +167 -0
  118. package/bin/lib/reference-architectures.js +304 -0
  119. package/bin/lib/release-readiness.js +171 -0
  120. package/bin/lib/repo-graph.js +262 -0
  121. package/bin/lib/requirements-baseline.js +358 -0
  122. package/bin/lib/risk-register.js +211 -0
  123. package/bin/lib/role-approval.js +249 -0
  124. package/bin/lib/role-views.js +142 -0
  125. package/bin/lib/root-cause-analysis.js +132 -0
  126. package/bin/lib/runtime-debugger.js +154 -0
  127. package/bin/lib/safe-rename.js +135 -0
  128. package/bin/lib/semantic-diff.js +335 -0
  129. package/bin/lib/sla-slo.js +210 -0
  130. package/bin/lib/spec-comments.js +147 -0
  131. package/bin/lib/spec-maturity.js +287 -0
  132. package/bin/lib/sre-integration.js +154 -0
  133. package/bin/lib/structured-elicitation.js +174 -0
  134. package/bin/lib/telemetry-feedback.js +118 -0
  135. package/bin/lib/test-generator.js +146 -0
  136. package/bin/lib/timeline.js +2 -1
  137. package/bin/lib/tool-bridge.js +107 -0
  138. package/bin/lib/tool-guardrails.js +139 -0
  139. package/bin/lib/tool-schemas.js +172 -3
  140. package/bin/lib/transcript-ingestion.js +150 -0
  141. package/bin/lib/vendor-risk.js +173 -0
  142. package/bin/lib/waiver-workflow.js +174 -0
  143. package/bin/lib/web-dashboard.js +126 -0
  144. package/bin/lib/workshop-mode.js +165 -0
  145. package/bin/lib/workstream-ownership.js +104 -0
  146. package/package.json +1 -1
@@ -0,0 +1,126 @@
1
+ /**
2
+ * web-dashboard.js — Rich Web UI / Local Dashboard (Item 61)
3
+ *
4
+ * Serve a local web control center for project management,
5
+ * phase tracking, artifact browsing, and governance overview.
6
+ *
7
+ * Usage:
8
+ * node bin/lib/web-dashboard.js start|status|config [options]
9
+ */
10
+
11
+ 'use strict';
12
+
13
+ const fs = require('fs');
14
+ const path = require('path');
15
+
16
+ const DEFAULT_PORT = 3000;
17
+ const DEFAULT_HOST = 'localhost';
18
+
19
+ const DASHBOARD_SECTIONS = ['phases', 'artifacts', 'governance', 'timeline', 'risks', 'metrics'];
20
+
21
+ /**
22
+ * Generate dashboard configuration.
23
+ */
24
+ function generateConfig(root, options = {}) {
25
+ const port = options.port || DEFAULT_PORT;
26
+ const host = options.host || DEFAULT_HOST;
27
+
28
+ const config = {
29
+ port,
30
+ host,
31
+ root: path.resolve(root),
32
+ sections: options.sections || DASHBOARD_SECTIONS,
33
+ theme: options.theme || 'default',
34
+ auth: options.auth || { enabled: false },
35
+ refresh_interval: options.refresh_interval || 30,
36
+ generated_at: new Date().toISOString()
37
+ };
38
+
39
+ return { success: true, config };
40
+ }
41
+
42
+ /**
43
+ * Gather dashboard data from project state.
44
+ */
45
+ function gatherDashboardData(root, options = {}) {
46
+ const data = {
47
+ project_root: root,
48
+ generated_at: new Date().toISOString(),
49
+ sections: {}
50
+ };
51
+
52
+ // Phase status
53
+ const stateFile = path.join(root, '.jumpstart', 'state', 'state.json');
54
+ if (fs.existsSync(stateFile)) {
55
+ try {
56
+ const state = JSON.parse(fs.readFileSync(stateFile, 'utf8'));
57
+ data.sections.phases = {
58
+ current_phase: state.current_phase || 0,
59
+ current_agent: state.current_agent || null,
60
+ last_completed_step: state.last_completed_step || null
61
+ };
62
+ } catch { data.sections.phases = { current_phase: 0 }; }
63
+ } else {
64
+ data.sections.phases = { current_phase: 0 };
65
+ }
66
+
67
+ // Artifacts
68
+ const specsDir = path.join(root, 'specs');
69
+ const artifacts = [];
70
+ if (fs.existsSync(specsDir)) {
71
+ for (const f of fs.readdirSync(specsDir).filter(f => f.endsWith('.md'))) {
72
+ const fp = path.join(specsDir, f);
73
+ const stat = fs.statSync(fp);
74
+ artifacts.push({ name: f, size: stat.size, modified: stat.mtime.toISOString() });
75
+ }
76
+ }
77
+ data.sections.artifacts = { total: artifacts.length, files: artifacts };
78
+
79
+ // Config summary
80
+ const configFile = path.join(root, '.jumpstart', 'config.yaml');
81
+ data.sections.config = { exists: fs.existsSync(configFile) };
82
+
83
+ return { success: true, ...data };
84
+ }
85
+
86
+ /**
87
+ * Generate static HTML dashboard.
88
+ */
89
+ function generateStaticDashboard(data) {
90
+ const html = `<!DOCTYPE html>
91
+ <html lang="en">
92
+ <head><meta charset="UTF-8"><title>Jump Start Dashboard</title></head>
93
+ <body>
94
+ <h1>Jump Start Dashboard</h1>
95
+ <p>Generated: ${data.generated_at}</p>
96
+ <h2>Phase Status</h2>
97
+ <p>Current Phase: ${data.sections.phases.current_phase}</p>
98
+ <h2>Artifacts (${data.sections.artifacts.total})</h2>
99
+ <ul>${data.sections.artifacts.files.map(f => `<li>${f.name} (${f.size} bytes)</li>`).join('')}</ul>
100
+ </body>
101
+ </html>`;
102
+ return { success: true, html };
103
+ }
104
+
105
+ /**
106
+ * Get server status.
107
+ */
108
+ function getServerStatus(options = {}) {
109
+ return {
110
+ success: true,
111
+ running: false,
112
+ port: options.port || DEFAULT_PORT,
113
+ host: options.host || DEFAULT_HOST,
114
+ uptime: null
115
+ };
116
+ }
117
+
118
+ module.exports = {
119
+ generateConfig,
120
+ gatherDashboardData,
121
+ generateStaticDashboard,
122
+ getServerStatus,
123
+ DASHBOARD_SECTIONS,
124
+ DEFAULT_PORT,
125
+ DEFAULT_HOST
126
+ };
@@ -0,0 +1,165 @@
1
+ /**
2
+ * workshop-mode.js — Live Workshop Mode (Item 64)
3
+ *
4
+ * Facilitate discovery sessions and convert outputs directly
5
+ * into challenger brief, product brief, and PRD.
6
+ *
7
+ * Usage:
8
+ * node bin/lib/workshop-mode.js start|capture|convert|status [options]
9
+ *
10
+ * State file: .jumpstart/state/workshop.json
11
+ */
12
+
13
+ 'use strict';
14
+
15
+ const fs = require('fs');
16
+ const path = require('path');
17
+
18
+ const DEFAULT_STATE_FILE = path.join('.jumpstart', 'state', 'workshop.json');
19
+
20
+ const WORKSHOP_TYPES = ['discovery', 'ideation', 'refinement', 'retrospective'];
21
+ const OUTPUT_ARTIFACTS = ['challenger-brief', 'product-brief', 'prd'];
22
+
23
+ function defaultState() {
24
+ return {
25
+ version: '1.0.0',
26
+ sessions: [],
27
+ last_updated: null
28
+ };
29
+ }
30
+
31
+ function loadState(stateFile) {
32
+ const fp = stateFile || DEFAULT_STATE_FILE;
33
+ if (!fs.existsSync(fp)) return defaultState();
34
+ try { return JSON.parse(fs.readFileSync(fp, 'utf8')); }
35
+ catch { return defaultState(); }
36
+ }
37
+
38
+ function saveState(state, stateFile) {
39
+ const fp = stateFile || DEFAULT_STATE_FILE;
40
+ const dir = path.dirname(fp);
41
+ if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true });
42
+ state.last_updated = new Date().toISOString();
43
+ fs.writeFileSync(fp, JSON.stringify(state, null, 2) + '\n', 'utf8');
44
+ }
45
+
46
+ /**
47
+ * Start a new workshop session.
48
+ */
49
+ function startSession(name, options = {}) {
50
+ if (!name) return { success: false, error: 'Session name is required' };
51
+
52
+ const stateFile = options.stateFile || DEFAULT_STATE_FILE;
53
+ const state = loadState(stateFile);
54
+
55
+ const session = {
56
+ id: `WS-${Date.now()}`,
57
+ name,
58
+ type: options.type || 'discovery',
59
+ status: 'active',
60
+ facilitator: options.facilitator || null,
61
+ participants: options.participants || [],
62
+ captures: [],
63
+ created_at: new Date().toISOString(),
64
+ ended_at: null
65
+ };
66
+
67
+ if (!WORKSHOP_TYPES.includes(session.type)) {
68
+ return { success: false, error: `Unknown type: ${session.type}. Valid: ${WORKSHOP_TYPES.join(', ')}` };
69
+ }
70
+
71
+ state.sessions.push(session);
72
+ saveState(state, stateFile);
73
+
74
+ return { success: true, session };
75
+ }
76
+
77
+ /**
78
+ * Capture a workshop insight or decision.
79
+ */
80
+ function captureInsight(sessionId, text, options = {}) {
81
+ if (!sessionId || !text) return { success: false, error: 'sessionId and text are required' };
82
+
83
+ const stateFile = options.stateFile || DEFAULT_STATE_FILE;
84
+ const state = loadState(stateFile);
85
+
86
+ const session = state.sessions.find(s => s.id === sessionId);
87
+ if (!session) return { success: false, error: `Session ${sessionId} not found` };
88
+
89
+ const capture = {
90
+ id: `CAP-${Date.now()}`,
91
+ text,
92
+ category: options.category || 'insight',
93
+ author: options.author || 'anonymous',
94
+ timestamp: new Date().toISOString()
95
+ };
96
+
97
+ session.captures.push(capture);
98
+ saveState(state, stateFile);
99
+
100
+ return { success: true, capture };
101
+ }
102
+
103
+ /**
104
+ * Convert session captures to artifact outline.
105
+ */
106
+ function convertToArtifact(sessionId, artifactType, options = {}) {
107
+ if (!sessionId || !artifactType) return { success: false, error: 'sessionId and artifactType are required' };
108
+ if (!OUTPUT_ARTIFACTS.includes(artifactType)) {
109
+ return { success: false, error: `Unknown artifact type. Valid: ${OUTPUT_ARTIFACTS.join(', ')}` };
110
+ }
111
+
112
+ const stateFile = options.stateFile || DEFAULT_STATE_FILE;
113
+ const state = loadState(stateFile);
114
+
115
+ const session = state.sessions.find(s => s.id === sessionId);
116
+ if (!session) return { success: false, error: `Session ${sessionId} not found` };
117
+
118
+ const sections = session.captures.reduce((acc, cap) => {
119
+ const cat = cap.category || 'general';
120
+ if (!acc[cat]) acc[cat] = [];
121
+ acc[cat].push(cap.text);
122
+ return acc;
123
+ }, {});
124
+
125
+ return {
126
+ success: true,
127
+ artifact_type: artifactType,
128
+ session_name: session.name,
129
+ sections,
130
+ captures_used: session.captures.length
131
+ };
132
+ }
133
+
134
+ /**
135
+ * Get session status.
136
+ */
137
+ function getSessionStatus(options = {}) {
138
+ const stateFile = options.stateFile || DEFAULT_STATE_FILE;
139
+ const state = loadState(stateFile);
140
+
141
+ return {
142
+ success: true,
143
+ total_sessions: state.sessions.length,
144
+ active: state.sessions.filter(s => s.status === 'active').length,
145
+ sessions: state.sessions.map(s => ({
146
+ id: s.id,
147
+ name: s.name,
148
+ type: s.type,
149
+ status: s.status,
150
+ captures: s.captures.length
151
+ }))
152
+ };
153
+ }
154
+
155
+ module.exports = {
156
+ startSession,
157
+ captureInsight,
158
+ convertToArtifact,
159
+ getSessionStatus,
160
+ loadState,
161
+ saveState,
162
+ defaultState,
163
+ WORKSHOP_TYPES,
164
+ OUTPUT_ARTIFACTS
165
+ };
@@ -0,0 +1,104 @@
1
+ /**
2
+ * workstream-ownership.js — Workstream Ownership Visualization (Item 79)
3
+ *
4
+ * Make dependencies and responsibilities visible across pods and teams.
5
+ *
6
+ * Usage:
7
+ * node bin/lib/workstream-ownership.js define|query|report [options]
8
+ *
9
+ * State file: .jumpstart/state/workstream-ownership.json
10
+ */
11
+
12
+ 'use strict';
13
+
14
+ const fs = require('fs');
15
+ const path = require('path');
16
+
17
+ const DEFAULT_STATE_FILE = path.join('.jumpstart', 'state', 'workstream-ownership.json');
18
+
19
+ function defaultState() {
20
+ return { version: '1.0.0', workstreams: [], dependencies: [], last_updated: null };
21
+ }
22
+
23
+ function loadState(stateFile) {
24
+ const fp = stateFile || DEFAULT_STATE_FILE;
25
+ if (!fs.existsSync(fp)) return defaultState();
26
+ try { return JSON.parse(fs.readFileSync(fp, 'utf8')); }
27
+ catch { return defaultState(); }
28
+ }
29
+
30
+ function saveState(state, stateFile) {
31
+ const fp = stateFile || DEFAULT_STATE_FILE;
32
+ const dir = path.dirname(fp);
33
+ if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true });
34
+ state.last_updated = new Date().toISOString();
35
+ fs.writeFileSync(fp, JSON.stringify(state, null, 2) + '\n', 'utf8');
36
+ }
37
+
38
+ function defineWorkstream(name, options = {}) {
39
+ if (!name) return { success: false, error: 'Workstream name is required' };
40
+
41
+ const stateFile = options.stateFile || DEFAULT_STATE_FILE;
42
+ const state = loadState(stateFile);
43
+
44
+ const ws = {
45
+ id: `WS-${Date.now()}`,
46
+ name,
47
+ team: options.team || null,
48
+ owner: options.owner || null,
49
+ status: options.status || 'active',
50
+ components: options.components || [],
51
+ created_at: new Date().toISOString()
52
+ };
53
+
54
+ state.workstreams.push(ws);
55
+ saveState(state, stateFile);
56
+
57
+ return { success: true, workstream: ws };
58
+ }
59
+
60
+ function addDependency(fromId, toId, options = {}) {
61
+ if (!fromId || !toId) return { success: false, error: 'fromId and toId are required' };
62
+
63
+ const stateFile = options.stateFile || DEFAULT_STATE_FILE;
64
+ const state = loadState(stateFile);
65
+
66
+ const dep = {
67
+ from: fromId,
68
+ to: toId,
69
+ type: options.type || 'depends-on',
70
+ description: options.description || null,
71
+ created_at: new Date().toISOString()
72
+ };
73
+
74
+ state.dependencies.push(dep);
75
+ saveState(state, stateFile);
76
+
77
+ return { success: true, dependency: dep };
78
+ }
79
+
80
+ function generateReport(options = {}) {
81
+ const stateFile = options.stateFile || DEFAULT_STATE_FILE;
82
+ const state = loadState(stateFile);
83
+
84
+ const byTeam = {};
85
+ for (const ws of state.workstreams) {
86
+ const team = ws.team || 'unassigned';
87
+ if (!byTeam[team]) byTeam[team] = [];
88
+ byTeam[team].push(ws.name);
89
+ }
90
+
91
+ return {
92
+ success: true,
93
+ total_workstreams: state.workstreams.length,
94
+ total_dependencies: state.dependencies.length,
95
+ by_team: byTeam,
96
+ workstreams: state.workstreams,
97
+ dependencies: state.dependencies
98
+ };
99
+ }
100
+
101
+ module.exports = {
102
+ defineWorkstream, addDependency, generateReport,
103
+ loadState, saveState, defaultState
104
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "jumpstart-mode",
3
- "version": "1.1.12",
3
+ "version": "1.1.13",
4
4
  "description": "Spec-driven agentic engineering framework that transforms ideas into production code through AI-powered sequential phases",
5
5
  "keywords": [
6
6
  "jumpstart",