jumpstart-mode 1.1.11 → 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 (188) hide show
  1. package/.github/agents/jumpstart-adversary.agent.md +2 -1
  2. package/.github/agents/jumpstart-architect.agent.md +6 -7
  3. package/.github/agents/jumpstart-challenger.agent.md +2 -1
  4. package/.github/agents/jumpstart-developer.agent.md +1 -1
  5. package/.github/agents/jumpstart-devops.agent.md +2 -2
  6. package/.github/agents/jumpstart-diagram-verifier.agent.md +2 -1
  7. package/.github/agents/jumpstart-maintenance.agent.md +1 -0
  8. package/.github/agents/jumpstart-performance.agent.md +1 -0
  9. package/.github/agents/jumpstart-pm.agent.md +1 -1
  10. package/.github/agents/jumpstart-refactor.agent.md +1 -0
  11. package/.github/agents/jumpstart-requirements-extractor.agent.md +1 -0
  12. package/.github/agents/jumpstart-researcher.agent.md +1 -0
  13. package/.github/agents/jumpstart-retrospective.agent.md +1 -0
  14. package/.github/agents/jumpstart-reviewer.agent.md +2 -0
  15. package/.github/agents/jumpstart-scout.agent.md +1 -1
  16. package/.github/agents/jumpstart-scrum-master.agent.md +1 -0
  17. package/.github/agents/jumpstart-security.agent.md +2 -1
  18. package/.github/agents/jumpstart-tech-writer.agent.md +1 -0
  19. package/.github/agents/jumpstart-uiux-designer.agent.md +66 -0
  20. package/.github/workflows/quality.yml +19 -2
  21. package/.jumpstart/agents/analyst.md +38 -0
  22. package/.jumpstart/agents/architect.md +39 -1
  23. package/.jumpstart/agents/challenger.md +38 -0
  24. package/.jumpstart/agents/developer.md +41 -0
  25. package/.jumpstart/agents/pm.md +38 -0
  26. package/.jumpstart/agents/scout.md +33 -0
  27. package/.jumpstart/agents/ux-designer.md +29 -9
  28. package/.jumpstart/commands/commands.md +6 -5
  29. package/.jumpstart/config.yaml +25 -1
  30. package/.jumpstart/roadmap.md +1 -1
  31. package/.jumpstart/schemas/timeline.schema.json +1 -0
  32. package/.jumpstart/skills/README.md +1 -0
  33. package/.jumpstart/skills/quality-gates/SKILL.md +126 -0
  34. package/.jumpstart/skills/skill-creator/SKILL.md +485 -357
  35. package/.jumpstart/skills/skill-creator/agents/analyzer.md +274 -0
  36. package/.jumpstart/skills/skill-creator/agents/comparator.md +202 -0
  37. package/.jumpstart/skills/skill-creator/agents/grader.md +223 -0
  38. package/.jumpstart/skills/skill-creator/assets/eval_review.html +146 -0
  39. package/.jumpstart/skills/skill-creator/eval-viewer/generate_review.py +471 -0
  40. package/.jumpstart/skills/skill-creator/eval-viewer/viewer.html +1325 -0
  41. package/.jumpstart/skills/skill-creator/references/schemas.md +430 -0
  42. package/.jumpstart/skills/skill-creator/scripts/__init__.py +0 -0
  43. package/.jumpstart/skills/skill-creator/scripts/aggregate_benchmark.py +401 -0
  44. package/.jumpstart/skills/skill-creator/scripts/generate_report.py +326 -0
  45. package/.jumpstart/skills/skill-creator/scripts/improve_description.py +247 -0
  46. package/.jumpstart/skills/skill-creator/scripts/package_skill.py +136 -110
  47. package/.jumpstart/skills/skill-creator/scripts/run_eval.py +310 -0
  48. package/.jumpstart/skills/skill-creator/scripts/run_loop.py +328 -0
  49. package/.jumpstart/skills/skill-creator/scripts/utils.py +47 -0
  50. package/.jumpstart/skills/ui-ux-pro-max/SKILL.md +266 -0
  51. package/.jumpstart/skills/ui-ux-pro-max/data/charts.csv +26 -0
  52. package/.jumpstart/skills/ui-ux-pro-max/data/colors.csv +97 -0
  53. package/.jumpstart/skills/ui-ux-pro-max/data/icons.csv +101 -0
  54. package/.jumpstart/skills/ui-ux-pro-max/data/landing.csv +31 -0
  55. package/.jumpstart/skills/ui-ux-pro-max/data/products.csv +97 -0
  56. package/.jumpstart/skills/ui-ux-pro-max/data/react-performance.csv +45 -0
  57. package/.jumpstart/skills/ui-ux-pro-max/data/stacks/astro.csv +54 -0
  58. package/.jumpstart/skills/ui-ux-pro-max/data/stacks/flutter.csv +53 -0
  59. package/.jumpstart/skills/ui-ux-pro-max/data/stacks/html-tailwind.csv +56 -0
  60. package/.jumpstart/skills/ui-ux-pro-max/data/stacks/jetpack-compose.csv +53 -0
  61. package/.jumpstart/skills/ui-ux-pro-max/data/stacks/nextjs.csv +53 -0
  62. package/.jumpstart/skills/ui-ux-pro-max/data/stacks/nuxt-ui.csv +51 -0
  63. package/.jumpstart/skills/ui-ux-pro-max/data/stacks/nuxtjs.csv +59 -0
  64. package/.jumpstart/skills/ui-ux-pro-max/data/stacks/react-native.csv +52 -0
  65. package/.jumpstart/skills/ui-ux-pro-max/data/stacks/react.csv +54 -0
  66. package/.jumpstart/skills/ui-ux-pro-max/data/stacks/shadcn.csv +61 -0
  67. package/.jumpstart/skills/ui-ux-pro-max/data/stacks/svelte.csv +54 -0
  68. package/.jumpstart/skills/ui-ux-pro-max/data/stacks/swiftui.csv +51 -0
  69. package/.jumpstart/skills/ui-ux-pro-max/data/stacks/vue.csv +50 -0
  70. package/.jumpstart/skills/ui-ux-pro-max/data/styles.csv +68 -0
  71. package/.jumpstart/skills/ui-ux-pro-max/data/typography.csv +58 -0
  72. package/.jumpstart/skills/ui-ux-pro-max/data/ui-reasoning.csv +101 -0
  73. package/.jumpstart/skills/ui-ux-pro-max/data/ux-guidelines.csv +100 -0
  74. package/.jumpstart/skills/ui-ux-pro-max/data/web-interface.csv +31 -0
  75. package/.jumpstart/skills/ui-ux-pro-max/scripts/core.py +253 -0
  76. package/.jumpstart/skills/ui-ux-pro-max/scripts/design_system.py +1067 -0
  77. package/.jumpstart/skills/ui-ux-pro-max/scripts/search.py +114 -0
  78. package/.jumpstart/state/timeline.json +659 -0
  79. package/.jumpstart/templates/model-map.md +1 -1
  80. package/.jumpstart/templates/ux-design.md +3 -3
  81. package/.jumpstart/usage-log.json +74 -3
  82. package/AGENTS.md +1 -1
  83. package/README.md +64 -3
  84. package/bin/cli.js +3217 -1
  85. package/bin/headless-runner.js +62 -2
  86. package/bin/lib/agent-checkpoint.js +168 -0
  87. package/bin/lib/ai-evaluation.js +104 -0
  88. package/bin/lib/ai-intake.js +152 -0
  89. package/bin/lib/ambiguity-heatmap.js +152 -0
  90. package/bin/lib/artifact-comparison.js +104 -0
  91. package/bin/lib/ast-edit-engine.js +157 -0
  92. package/bin/lib/backlog-sync.js +338 -0
  93. package/bin/lib/bcdr-planning.js +158 -0
  94. package/bin/lib/bidirectional-trace.js +199 -0
  95. package/bin/lib/branch-workflow.js +266 -0
  96. package/bin/lib/cab-output.js +119 -0
  97. package/bin/lib/chat-integration.js +122 -0
  98. package/bin/lib/ci-cd-integration.js +208 -0
  99. package/bin/lib/codebase-retrieval.js +125 -0
  100. package/bin/lib/collaboration.js +168 -0
  101. package/bin/lib/compliance-packs.js +213 -0
  102. package/bin/lib/context-chunker.js +128 -0
  103. package/bin/lib/context-onboarding.js +122 -0
  104. package/bin/lib/contract-first.js +124 -0
  105. package/bin/lib/cost-router.js +148 -0
  106. package/bin/lib/credential-boundary.js +155 -0
  107. package/bin/lib/data-classification.js +180 -0
  108. package/bin/lib/data-contracts.js +129 -0
  109. package/bin/lib/db-evolution.js +158 -0
  110. package/bin/lib/decision-conflicts.js +299 -0
  111. package/bin/lib/delivery-confidence.js +361 -0
  112. package/bin/lib/dependency-upgrade.js +153 -0
  113. package/bin/lib/design-system.js +133 -0
  114. package/bin/lib/deterministic-artifacts.js +151 -0
  115. package/bin/lib/diagram-studio.js +115 -0
  116. package/bin/lib/domain-ontology.js +140 -0
  117. package/bin/lib/ea-review-packet.js +151 -0
  118. package/bin/lib/enterprise-search.js +123 -0
  119. package/bin/lib/enterprise-templates.js +140 -0
  120. package/bin/lib/environment-promotion.js +220 -0
  121. package/bin/lib/estimation-studio.js +130 -0
  122. package/bin/lib/event-modeling.js +133 -0
  123. package/bin/lib/evidence-collector.js +179 -0
  124. package/bin/lib/finops-planner.js +182 -0
  125. package/bin/lib/fitness-functions.js +279 -0
  126. package/bin/lib/focus.js +448 -0
  127. package/bin/lib/governance-dashboard.js +165 -0
  128. package/bin/lib/guided-handoff.js +120 -0
  129. package/bin/lib/impact-analysis.js +190 -0
  130. package/bin/lib/incident-feedback.js +157 -0
  131. package/bin/lib/integrate.js +1 -1
  132. package/bin/lib/knowledge-graph.js +122 -0
  133. package/bin/lib/legacy-modernizer.js +160 -0
  134. package/bin/lib/migration-planner.js +144 -0
  135. package/bin/lib/model-governance.js +185 -0
  136. package/bin/lib/model-router.js +144 -0
  137. package/bin/lib/multi-repo.js +272 -0
  138. package/bin/lib/next-phase.js +53 -8
  139. package/bin/lib/ops-ownership.js +152 -0
  140. package/bin/lib/parallel-agents.js +257 -0
  141. package/bin/lib/pattern-library.js +115 -0
  142. package/bin/lib/persona-packs.js +99 -0
  143. package/bin/lib/plan-executor.js +366 -0
  144. package/bin/lib/platform-engineering.js +119 -0
  145. package/bin/lib/playback-summaries.js +126 -0
  146. package/bin/lib/policy-engine.js +240 -0
  147. package/bin/lib/portfolio-reporting.js +357 -0
  148. package/bin/lib/pr-package.js +197 -0
  149. package/bin/lib/project-memory.js +235 -0
  150. package/bin/lib/prompt-governance.js +130 -0
  151. package/bin/lib/promptless-mode.js +128 -0
  152. package/bin/lib/quality-graph.js +193 -0
  153. package/bin/lib/raci-matrix.js +188 -0
  154. package/bin/lib/refactor-planner.js +167 -0
  155. package/bin/lib/reference-architectures.js +304 -0
  156. package/bin/lib/release-readiness.js +171 -0
  157. package/bin/lib/repo-graph.js +262 -0
  158. package/bin/lib/requirements-baseline.js +358 -0
  159. package/bin/lib/risk-register.js +211 -0
  160. package/bin/lib/role-approval.js +249 -0
  161. package/bin/lib/role-views.js +142 -0
  162. package/bin/lib/root-cause-analysis.js +132 -0
  163. package/bin/lib/runtime-debugger.js +154 -0
  164. package/bin/lib/safe-rename.js +135 -0
  165. package/bin/lib/secret-scanner.js +313 -0
  166. package/bin/lib/semantic-diff.js +335 -0
  167. package/bin/lib/sla-slo.js +210 -0
  168. package/bin/lib/smoke-tester.js +344 -0
  169. package/bin/lib/spec-comments.js +147 -0
  170. package/bin/lib/spec-maturity.js +287 -0
  171. package/bin/lib/sre-integration.js +154 -0
  172. package/bin/lib/structured-elicitation.js +174 -0
  173. package/bin/lib/telemetry-feedback.js +118 -0
  174. package/bin/lib/test-generator.js +146 -0
  175. package/bin/lib/timeline.js +2 -1
  176. package/bin/lib/tool-bridge.js +159 -0
  177. package/bin/lib/tool-guardrails.js +139 -0
  178. package/bin/lib/tool-schemas.js +281 -3
  179. package/bin/lib/transcript-ingestion.js +150 -0
  180. package/bin/lib/type-checker.js +261 -0
  181. package/bin/lib/uat-coverage.js +411 -0
  182. package/bin/lib/vendor-risk.js +173 -0
  183. package/bin/lib/waiver-workflow.js +174 -0
  184. package/bin/lib/web-dashboard.js +126 -0
  185. package/bin/lib/workshop-mode.js +165 -0
  186. package/bin/lib/workstream-ownership.js +104 -0
  187. package/package.json +1 -1
  188. package/.github/agents/jumpstart-ux-designer.agent.md +0 -45
@@ -247,6 +247,7 @@ const ALL_TOOLS = [
247
247
  'approval', 'rejection',
248
248
  'subagent_invoked', 'subagent_completed',
249
249
  'llm_turn_start', 'llm_turn_end',
250
+ 'prompt_logged',
250
251
  'research_query', 'checkpoint_created', 'rewind',
251
252
  'handoff', 'usage_logged', 'custom'
252
253
  ],
@@ -280,6 +281,283 @@ const ALL_TOOLS = [
280
281
  required: ['event_type', 'action']
281
282
  }
282
283
  }
284
+ },
285
+ // ─── Usage Logging ──────────────────────────────────────────────────────────
286
+ {
287
+ type: 'function',
288
+ function: {
289
+ name: 'log_usage',
290
+ description: 'Log token usage and estimated cost for the current agent session to the usage log (.jumpstart/usage-log.json). Call this at the end of each phase or significant agent interaction to maintain an audit trail of LLM consumption.',
291
+ parameters: {
292
+ type: 'object',
293
+ properties: {
294
+ phase: {
295
+ type: 'string',
296
+ description: 'Phase identifier (e.g., "phase-0", "scout", "phase-3").'
297
+ },
298
+ agent: {
299
+ type: 'string',
300
+ description: 'Agent name (e.g., "Challenger", "Architect", "Developer").'
301
+ },
302
+ action: {
303
+ type: 'string',
304
+ description: 'Action description (e.g., "generation", "review", "consultation").'
305
+ },
306
+ estimated_tokens: {
307
+ type: 'number',
308
+ description: 'Estimated total token count for this interaction.'
309
+ },
310
+ estimated_cost_usd: {
311
+ type: 'number',
312
+ description: 'Estimated cost in USD (optional — computed from tokens if omitted).'
313
+ },
314
+ model: {
315
+ type: 'string',
316
+ description: 'Model name/ID used for this interaction.'
317
+ },
318
+ metadata: {
319
+ type: 'object',
320
+ description: 'Additional metadata (e.g., { "turns": 12, "artifact": "specs/prd.md" }).'
321
+ }
322
+ },
323
+ required: ['phase', 'agent', 'action', 'estimated_tokens']
324
+ }
325
+ }
326
+ },
327
+ // ─── Item-Tagged Feature Tools ─────────────────────────────────────────
328
+ {
329
+ type: 'function',
330
+ function: {
331
+ name: 'run_revert',
332
+ description: 'Archive a rejected artifact draft and restore the last approved version from git. (Item 40)',
333
+ parameters: {
334
+ type: 'object',
335
+ properties: {
336
+ artifact: { type: 'string', description: 'Path to the artifact file to revert.' },
337
+ reason: { type: 'string', description: 'Reason for reverting.' },
338
+ archive_dir: { type: 'string', description: 'Archive directory (default: .jumpstart/archive).' }
339
+ },
340
+ required: ['artifact']
341
+ }
342
+ }
343
+ },
344
+ {
345
+ type: 'function',
346
+ function: {
347
+ name: 'run_adr_index',
348
+ description: 'Build or search an index of Architecture Decision Records. (Item 51)',
349
+ parameters: {
350
+ type: 'object',
351
+ properties: {
352
+ action: { type: 'string', enum: ['build', 'search'], description: 'Action to perform.' },
353
+ root: { type: 'string', description: 'Project root directory.' },
354
+ query: { type: 'string', description: 'Search query (for search action).' },
355
+ tag: { type: 'string', description: 'Filter by tag (for search action).' }
356
+ },
357
+ required: ['action']
358
+ }
359
+ }
360
+ },
361
+ {
362
+ type: 'function',
363
+ function: {
364
+ name: 'run_complexity',
365
+ description: 'Calculate adaptive planning depth (quick/standard/deep) from project signals. (Item 33)',
366
+ parameters: {
367
+ type: 'object',
368
+ properties: {
369
+ description: { type: 'string', description: 'Free-text problem statement.' },
370
+ root: { type: 'string', description: 'Project root directory.' }
371
+ }
372
+ }
373
+ }
374
+ },
375
+ {
376
+ type: 'function',
377
+ function: {
378
+ name: 'run_crossref',
379
+ description: 'Validate cross-reference links in spec artifacts and detect broken links and orphan sections. (Item 47)',
380
+ parameters: {
381
+ type: 'object',
382
+ properties: {
383
+ specs_dir: { type: 'string', description: 'Path to specs directory (default: specs).' },
384
+ root: { type: 'string', description: 'Project root directory.' }
385
+ }
386
+ }
387
+ }
388
+ },
389
+ {
390
+ type: 'function',
391
+ function: {
392
+ name: 'run_init',
393
+ description: 'Generate initialization configuration based on skill level and project type. (Item 76)',
394
+ parameters: {
395
+ type: 'object',
396
+ properties: {
397
+ skill_level: { type: 'string', enum: ['beginner', 'intermediate', 'expert'], description: 'User skill level.' },
398
+ project_type: { type: 'string', enum: ['greenfield', 'brownfield'], description: 'Project type.' }
399
+ }
400
+ }
401
+ }
402
+ },
403
+ {
404
+ type: 'function',
405
+ function: {
406
+ name: 'run_lock',
407
+ description: 'Manage artifact file locks for concurrent agent access. (Item 45)',
408
+ parameters: {
409
+ type: 'object',
410
+ properties: {
411
+ action: { type: 'string', enum: ['acquire', 'release', 'status', 'list'], description: 'Lock action.' },
412
+ file: { type: 'string', description: 'File path to lock/unlock (required for acquire/release/status).' },
413
+ agent: { type: 'string', description: 'Agent name acquiring/releasing the lock.' }
414
+ },
415
+ required: ['action']
416
+ }
417
+ }
418
+ },
419
+ {
420
+ type: 'function',
421
+ function: {
422
+ name: 'run_timestamp',
423
+ description: 'Generate, validate, or audit UTC timestamps in ISO 8601 format. (Item 60)',
424
+ parameters: {
425
+ type: 'object',
426
+ properties: {
427
+ action: { type: 'string', enum: ['now', 'validate', 'audit'], description: 'Timestamp action.' },
428
+ value: { type: 'string', description: 'Timestamp string to validate (for validate action).' },
429
+ file: { type: 'string', description: 'File path to audit timestamps in (for audit action).' }
430
+ },
431
+ required: ['action']
432
+ }
433
+ }
434
+ },
435
+ {
436
+ type: 'function',
437
+ function: {
438
+ name: 'run_scan',
439
+ description: 'Scan project directory to detect tech stack, dependencies, patterns, and risks. (Item 49)',
440
+ parameters: {
441
+ type: 'object',
442
+ properties: {
443
+ root: { type: 'string', description: 'Project root directory.' },
444
+ ignore: {
445
+ type: 'array',
446
+ items: { type: 'string' },
447
+ description: 'Directories to ignore.'
448
+ }
449
+ }
450
+ }
451
+ }
452
+ },
453
+ // ─── Quality Gate Tools ────────────────────────────────────────────────────
454
+ {
455
+ type: 'function',
456
+ function: {
457
+ name: 'run_secret_scan',
458
+ description: 'Scan files for accidentally committed secrets (API keys, tokens, passwords, private keys). Returns structured findings with severity levels.',
459
+ parameters: {
460
+ type: 'object',
461
+ properties: {
462
+ files: {
463
+ type: 'array',
464
+ items: { type: 'string' },
465
+ description: 'Array of file paths to scan.'
466
+ },
467
+ root: { type: 'string', description: 'Project root directory.' },
468
+ config: {
469
+ type: 'object',
470
+ description: 'Optional configuration.',
471
+ properties: {
472
+ custom_patterns: {
473
+ type: 'array',
474
+ description: 'Additional secret patterns to check.',
475
+ items: {
476
+ type: 'object',
477
+ properties: {
478
+ name: { type: 'string' },
479
+ pattern: { type: 'string' },
480
+ severity: { type: 'string', enum: ['critical', 'high'] }
481
+ },
482
+ required: ['name', 'pattern']
483
+ }
484
+ },
485
+ allowlist: {
486
+ type: 'array',
487
+ items: { type: 'string' },
488
+ description: 'File paths to skip during scanning.'
489
+ }
490
+ }
491
+ }
492
+ },
493
+ required: ['files']
494
+ }
495
+ }
496
+ },
497
+ {
498
+ type: 'function',
499
+ function: {
500
+ name: 'run_type_check',
501
+ description: 'Run automated type checking (TypeScript tsc, Python mypy/pyright). Auto-detects the type checker from project configuration.',
502
+ parameters: {
503
+ type: 'object',
504
+ properties: {
505
+ files: {
506
+ type: 'array',
507
+ items: { type: 'string' },
508
+ description: 'Specific files to filter results for (optional — type checker runs project-wide).'
509
+ },
510
+ root: { type: 'string', description: 'Project root directory.' },
511
+ config: {
512
+ type: 'object',
513
+ description: 'Optional configuration.',
514
+ properties: {
515
+ type_command: { type: 'string', description: 'Override the auto-detected type check command.' },
516
+ strict: { type: 'boolean', description: 'Enable strict mode (TypeScript).' }
517
+ }
518
+ }
519
+ }
520
+ }
521
+ }
522
+ },
523
+ {
524
+ type: 'function',
525
+ function: {
526
+ name: 'run_smoke_test',
527
+ description: 'Perform a smoke test: build the project and optionally check if the application starts and responds to HTTP requests.',
528
+ parameters: {
529
+ type: 'object',
530
+ properties: {
531
+ root: { type: 'string', description: 'Project root directory.' },
532
+ config: {
533
+ type: 'object',
534
+ description: 'Optional configuration.',
535
+ properties: {
536
+ build_command: { type: 'string', description: 'Override the auto-detected build command.' },
537
+ start_command: { type: 'string', description: 'Override the auto-detected start command.' },
538
+ health_url: { type: 'string', description: 'URL to check for health (default: http://localhost:3000/health).' },
539
+ health_timeout: { type: 'number', description: 'Timeout in ms for health check (default: 10000).' },
540
+ skip_health_check: { type: 'boolean', description: 'Skip the health check and only verify the build.' }
541
+ }
542
+ }
543
+ }
544
+ }
545
+ }
546
+ },
547
+ {
548
+ type: 'function',
549
+ function: {
550
+ name: 'run_uat_coverage',
551
+ description: 'Check UAT alignment: verify that PRD acceptance criteria (Gherkin or bullet-point) are covered by actual test files. Returns coverage percentages and detailed mapping.',
552
+ parameters: {
553
+ type: 'object',
554
+ properties: {
555
+ prd_path: { type: 'string', description: 'Path to the PRD markdown file.' },
556
+ test_dir: { type: 'string', description: 'Path to the test directory.' }
557
+ },
558
+ required: ['prd_path', 'test_dir']
559
+ }
560
+ }
283
561
  }
284
562
  ];
285
563
 
@@ -289,7 +567,7 @@ const ALL_TOOLS = [
289
567
  const BASE_TOOLS = [
290
568
  'read_file', 'create_file', 'replace_string_in_file', 'list_dir',
291
569
  'file_search', 'grep_search', 'semantic_search',
292
- 'ask_questions', 'manage_todo_list', 'record_timeline_event'
570
+ 'ask_questions', 'manage_todo_list', 'record_timeline_event', 'log_usage'
293
571
  ];
294
572
 
295
573
  /** Additional tools unlocked per phase */
@@ -298,8 +576,8 @@ const PHASE_TOOL_ADDITIONS = {
298
576
  challenger: [],
299
577
  analyst: [],
300
578
  pm: [],
301
- architect: ['marketplace_install'],
302
- developer: ['run_in_terminal', 'marketplace_install']
579
+ architect: ['marketplace_install', 'run_adr_index', 'run_complexity', 'run_crossref', 'run_lock', 'run_scan', 'run_init'],
580
+ developer: ['run_in_terminal', 'marketplace_install', 'run_secret_scan', 'run_type_check', 'run_smoke_test', 'run_uat_coverage', 'run_revert', 'run_adr_index', 'run_complexity', 'run_crossref', 'run_lock', 'run_timestamp', 'run_scan', 'run_init']
303
581
  };
304
582
 
305
583
  /**
@@ -0,0 +1,150 @@
1
+ /**
2
+ * transcript-ingestion.js — Meeting Transcript Ingestion (Item 74)
3
+ *
4
+ * Convert notes and transcripts into artifact updates,
5
+ * decision proposals, and action items.
6
+ *
7
+ * Usage:
8
+ * node bin/lib/transcript-ingestion.js ingest|extract|list [options]
9
+ *
10
+ * State file: .jumpstart/state/transcripts.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', 'transcripts.json');
19
+
20
+ const ACTION_PATTERNS = [
21
+ /\baction(?:\s+item)?:\s*(.+)/gi,
22
+ /\bTODO:\s*(.+)/gi,
23
+ /\b(?:will|should|needs? to)\s+(.+?)(?:\.|$)/gi
24
+ ];
25
+
26
+ const DECISION_PATTERNS = [
27
+ /\bdecided?\s+(?:to\s+)?(.+?)(?:\.|$)/gi,
28
+ /\bdecision:\s*(.+)/gi,
29
+ /\bagreed\s+(?:to\s+)?(.+?)(?:\.|$)/gi
30
+ ];
31
+
32
+ function defaultState() {
33
+ return { version: '1.0.0', transcripts: [], last_updated: null };
34
+ }
35
+
36
+ function loadState(stateFile) {
37
+ const fp = stateFile || DEFAULT_STATE_FILE;
38
+ if (!fs.existsSync(fp)) return defaultState();
39
+ try { return JSON.parse(fs.readFileSync(fp, 'utf8')); }
40
+ catch { return defaultState(); }
41
+ }
42
+
43
+ function saveState(state, stateFile) {
44
+ const fp = stateFile || DEFAULT_STATE_FILE;
45
+ const dir = path.dirname(fp);
46
+ if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true });
47
+ state.last_updated = new Date().toISOString();
48
+ fs.writeFileSync(fp, JSON.stringify(state, null, 2) + '\n', 'utf8');
49
+ }
50
+
51
+ /**
52
+ * Ingest a transcript text.
53
+ */
54
+ function ingestTranscript(text, options = {}) {
55
+ if (!text) return { success: false, error: 'Transcript text is required' };
56
+
57
+ const stateFile = options.stateFile || DEFAULT_STATE_FILE;
58
+ const state = loadState(stateFile);
59
+
60
+ const transcript = {
61
+ id: `TR-${Date.now()}`,
62
+ title: options.title || 'Untitled Meeting',
63
+ source: options.source || 'manual',
64
+ text_length: text.length,
65
+ ingested_at: new Date().toISOString(),
66
+ actions: [],
67
+ decisions: [],
68
+ key_topics: []
69
+ };
70
+
71
+ // Extract action items
72
+ for (const pattern of ACTION_PATTERNS) {
73
+ let match;
74
+ pattern.lastIndex = 0;
75
+ while ((match = pattern.exec(text)) !== null) {
76
+ transcript.actions.push({ text: match[1].trim(), source_pattern: pattern.source.substring(0, 30) });
77
+ }
78
+ }
79
+
80
+ // Extract decisions
81
+ for (const pattern of DECISION_PATTERNS) {
82
+ let match;
83
+ pattern.lastIndex = 0;
84
+ while ((match = pattern.exec(text)) !== null) {
85
+ transcript.decisions.push({ text: match[1].trim() });
86
+ }
87
+ }
88
+
89
+ // Extract key topics (headings or emphasized text)
90
+ const headings = text.match(/^#+\s+(.+)$/gm);
91
+ if (headings) {
92
+ transcript.key_topics = headings.map(h => h.replace(/^#+\s+/, '').trim());
93
+ }
94
+
95
+ state.transcripts.push(transcript);
96
+ saveState(state, stateFile);
97
+
98
+ return { success: true, transcript };
99
+ }
100
+
101
+ /**
102
+ * Extract structured data from a transcript.
103
+ */
104
+ function extractFromTranscript(transcriptId, options = {}) {
105
+ const stateFile = options.stateFile || DEFAULT_STATE_FILE;
106
+ const state = loadState(stateFile);
107
+
108
+ const transcript = state.transcripts.find(t => t.id === transcriptId);
109
+ if (!transcript) return { success: false, error: `Transcript ${transcriptId} not found` };
110
+
111
+ return {
112
+ success: true,
113
+ id: transcript.id,
114
+ title: transcript.title,
115
+ actions: transcript.actions,
116
+ decisions: transcript.decisions,
117
+ key_topics: transcript.key_topics,
118
+ summary: {
119
+ action_count: transcript.actions.length,
120
+ decision_count: transcript.decisions.length,
121
+ topic_count: transcript.key_topics.length
122
+ }
123
+ };
124
+ }
125
+
126
+ /**
127
+ * List ingested transcripts.
128
+ */
129
+ function listTranscripts(options = {}) {
130
+ const stateFile = options.stateFile || DEFAULT_STATE_FILE;
131
+ const state = loadState(stateFile);
132
+
133
+ return {
134
+ success: true,
135
+ total: state.transcripts.length,
136
+ transcripts: state.transcripts.map(t => ({
137
+ id: t.id,
138
+ title: t.title,
139
+ actions: t.actions.length,
140
+ decisions: t.decisions.length,
141
+ ingested_at: t.ingested_at
142
+ }))
143
+ };
144
+ }
145
+
146
+ module.exports = {
147
+ ingestTranscript, extractFromTranscript, listTranscripts,
148
+ loadState, saveState, defaultState,
149
+ ACTION_PATTERNS, DECISION_PATTERNS
150
+ };