@geraldmaron/construct 1.1.0 → 1.2.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 (425) hide show
  1. package/README.md +30 -18
  2. package/bin/construct +392 -91
  3. package/bin/construct-postinstall.mjs +30 -2
  4. package/examples/distribution/README.md +42 -0
  5. package/examples/distribution/manifest.json +53 -0
  6. package/examples/distribution/sources/adr.md +84 -0
  7. package/examples/distribution/sources/deck-one-pager.md +65 -0
  8. package/examples/distribution/sources/prd-platform.md +161 -0
  9. package/examples/distribution/sources/research-brief.md +80 -0
  10. package/examples/distribution/sources/rfc-platform.md +82 -0
  11. package/examples/distribution/sources/runbook.md +103 -0
  12. package/examples/distribution/sources/strategy.md +88 -0
  13. package/lib/adapters-sync.mjs +67 -0
  14. package/lib/artifact-gate-notice.mjs +38 -0
  15. package/lib/artifact-manifest.mjs +112 -0
  16. package/lib/artifact-release-gate.mjs +171 -0
  17. package/lib/artifact-reviewers.mjs +68 -0
  18. package/lib/artifact-type-from-path.mjs +79 -0
  19. package/lib/audit-skills.mjs +4 -0
  20. package/lib/audit-specialists.mjs +285 -0
  21. package/lib/audit-trail.mjs +77 -10
  22. package/lib/auto-docs.mjs +87 -18
  23. package/lib/beads/drift.mjs +27 -6
  24. package/lib/beads-client.mjs +49 -121
  25. package/lib/beads-optimistic.mjs +5 -12
  26. package/lib/brand-fonts.mjs +93 -0
  27. package/lib/brand-prose.mjs +214 -0
  28. package/lib/brand-tokens.mjs +92 -0
  29. package/lib/bridges/copilot-proxy.mjs +13 -26
  30. package/lib/capability-ledger.mjs +156 -0
  31. package/lib/certification/artifact-fixtures.mjs +132 -0
  32. package/lib/certification/artifact-gates.mjs +63 -0
  33. package/lib/certification/artifact-provenance.mjs +97 -0
  34. package/lib/certification/canonical-scenarios.mjs +78 -0
  35. package/lib/certification/cli.mjs +191 -0
  36. package/lib/certification/dashboard-api.mjs +71 -0
  37. package/lib/certification/demo-parity.mjs +116 -0
  38. package/lib/certification/document-io-fixtures.mjs +246 -0
  39. package/lib/certification/document-workflow.mjs +97 -0
  40. package/lib/certification/eval-bridge.mjs +77 -0
  41. package/lib/certification/model-routing.mjs +149 -0
  42. package/lib/certification/prompt-budget.mjs +119 -0
  43. package/lib/certification/rc-gate.mjs +206 -0
  44. package/lib/certification/real-llm-scenarios.mjs +303 -0
  45. package/lib/certification/role-cards.mjs +113 -0
  46. package/lib/certification/role-overlays.mjs +117 -0
  47. package/lib/certification/run.mjs +122 -0
  48. package/lib/certification/runner.mjs +323 -0
  49. package/lib/certification/scenarios.mjs +51 -0
  50. package/lib/certification/skill-inventory.mjs +289 -0
  51. package/lib/certification/skill-scenarios.mjs +147 -0
  52. package/lib/certification/specialist-contracts.mjs +85 -0
  53. package/lib/certification/specialist-scenarios.mjs +175 -0
  54. package/lib/certification/stale-impact.mjs +146 -0
  55. package/lib/certification/status.mjs +252 -0
  56. package/lib/certification/store.mjs +77 -0
  57. package/lib/chat/cli.mjs +333 -0
  58. package/lib/chat/command-suggest.mjs +161 -0
  59. package/lib/chat/commands.mjs +215 -0
  60. package/lib/chat/config.mjs +142 -0
  61. package/lib/chat/context-compactor.mjs +250 -0
  62. package/lib/chat/context-continuation.mjs +253 -0
  63. package/lib/chat/continuation-source.mjs +58 -0
  64. package/lib/chat/demo-guide.mjs +61 -0
  65. package/lib/chat/design-tokens.mjs +91 -0
  66. package/lib/chat/desktop-binary.mjs +79 -0
  67. package/lib/chat/desktop-build.mjs +130 -0
  68. package/lib/chat/desktop-launcher.mjs +133 -0
  69. package/lib/chat/evidence.mjs +145 -0
  70. package/lib/chat/export.mjs +74 -0
  71. package/lib/chat/harness/driver.mjs +91 -0
  72. package/lib/chat/list-picker.mjs +112 -0
  73. package/lib/chat/model-picker.mjs +356 -0
  74. package/lib/chat/openrouter-fallback.mjs +151 -0
  75. package/lib/chat/permission-prompt.mjs +33 -0
  76. package/lib/chat/picker-catalog.mjs +45 -0
  77. package/lib/chat/policy-telemetry.mjs +34 -0
  78. package/lib/chat/present.mjs +245 -0
  79. package/lib/chat/session-context.mjs +39 -0
  80. package/lib/chat/session-persist.mjs +73 -0
  81. package/lib/chat/session-restore.mjs +71 -0
  82. package/lib/chat/session-settings.mjs +53 -0
  83. package/lib/chat/system-prompt.mjs +52 -0
  84. package/lib/chat/transparency.mjs +93 -0
  85. package/lib/chat/tui/color-scheme.mjs +42 -0
  86. package/lib/chat/tui/markdown.mjs +123 -0
  87. package/lib/chat/tui/presentation.mjs +100 -0
  88. package/lib/chat/tui/render.mjs +500 -0
  89. package/lib/chat/tui/turn-block.mjs +284 -0
  90. package/lib/chat/tui/turn-present.mjs +18 -0
  91. package/lib/chat/tui/turn-state.mjs +88 -0
  92. package/lib/chat/tui/usage.mjs +122 -0
  93. package/lib/chat/web-commands.mjs +146 -0
  94. package/lib/chat/web-launcher.mjs +63 -0
  95. package/lib/chat/web-picker-keys.mjs +46 -0
  96. package/lib/chat/web-session.mjs +159 -0
  97. package/lib/cli-commands.mjs +232 -11
  98. package/lib/comment-lint.mjs +6 -4
  99. package/lib/config/schema.mjs +36 -5
  100. package/lib/contract-schemas/decision.json +50 -0
  101. package/lib/contract-schemas/implementation.json +51 -0
  102. package/lib/contract-schemas/review-report.json +32 -0
  103. package/lib/contract-schemas/test-report.json +43 -0
  104. package/lib/contracts/construct-handoff.mjs +60 -0
  105. package/lib/contracts/validate.mjs +32 -3
  106. package/lib/contracts/violation-log.mjs +58 -5
  107. package/lib/dashboard-demo.mjs +71 -0
  108. package/lib/dashboard-static.mjs +19 -5
  109. package/lib/decisions/registry.mjs +5 -3
  110. package/lib/deck-export-pptx.mjs +1152 -0
  111. package/lib/demo-recording.mjs +142 -0
  112. package/lib/demo-script.mjs +114 -0
  113. package/lib/demo-surface.mjs +249 -0
  114. package/lib/demo.mjs +703 -0
  115. package/lib/diagram-export.mjs +192 -0
  116. package/lib/diagram.mjs +302 -0
  117. package/lib/docs-verify.mjs +25 -7
  118. package/lib/doctor/index.mjs +4 -2
  119. package/lib/doctor/project-adapters.mjs +44 -0
  120. package/lib/doctor/watchers/cx-budget.mjs +98 -0
  121. package/lib/doctor/watchers/graph-staleness.mjs +52 -0
  122. package/lib/doctor/watchers/process-pressure.mjs +4 -3
  123. package/lib/doctor/watchers/service-health.mjs +1 -1
  124. package/lib/document-export.mjs +360 -36
  125. package/lib/document-extract.mjs +88 -0
  126. package/lib/document-ingest.mjs +32 -18
  127. package/lib/embed/cli.mjs +2 -2
  128. package/lib/embed/daemon.mjs +18 -46
  129. package/lib/embed/semantic.mjs +5 -2
  130. package/lib/embed/worker.mjs +2 -2
  131. package/lib/embedded-contract/model-resolve.mjs +10 -9
  132. package/lib/env-config.mjs +26 -0
  133. package/lib/evals/dataset.mjs +137 -0
  134. package/lib/evals/gates.mjs +175 -0
  135. package/lib/graph/build-co-change.mjs +54 -0
  136. package/lib/graph/build-from-registry.mjs +136 -0
  137. package/lib/graph/build-import-graph.mjs +153 -0
  138. package/lib/graph/cli.mjs +110 -0
  139. package/lib/graph/impact-cli.mjs +89 -0
  140. package/lib/graph/impact.mjs +108 -0
  141. package/lib/graph/staleness.mjs +44 -0
  142. package/lib/graph/store.mjs +172 -0
  143. package/lib/handoffs/cleanup.mjs +1 -1
  144. package/lib/health-check.mjs +90 -76
  145. package/lib/hooks/artifact-release-gate.mjs +43 -0
  146. package/lib/hooks/audit-trail.mjs +14 -28
  147. package/lib/hooks/brand-prose-lint.mjs +38 -0
  148. package/lib/hooks/graph-impact-advisory.mjs +62 -0
  149. package/lib/hooks/session-optimize.mjs +84 -207
  150. package/lib/hooks/session-start.mjs +4 -5
  151. package/lib/host-disposition.mjs +7 -0
  152. package/lib/improvement/cli.mjs +189 -0
  153. package/lib/improvement/controller.mjs +137 -0
  154. package/lib/improvement/proposal.mjs +120 -0
  155. package/lib/improvement/specialist-loop.mjs +192 -0
  156. package/lib/improvement/store.mjs +89 -0
  157. package/lib/improvement/surface.mjs +219 -0
  158. package/lib/ingest-tooling.mjs +97 -0
  159. package/lib/init/doc-lanes.mjs +165 -0
  160. package/lib/init-docs.mjs +31 -178
  161. package/lib/init-unified.mjs +27 -97
  162. package/lib/init-update-guide.mjs +102 -0
  163. package/lib/init-update.mjs +32 -1
  164. package/lib/init.mjs +8 -0
  165. package/lib/install/desktop-binary-download.mjs +85 -0
  166. package/lib/install/legacy-global-cleanup.mjs +189 -0
  167. package/lib/intake/daemon.mjs +2 -0
  168. package/lib/intake/git-queue.mjs +9 -8
  169. package/lib/intake/queue.mjs +2 -1
  170. package/lib/intake/session-prelude.mjs +90 -1
  171. package/lib/libreoffice-export.mjs +97 -0
  172. package/lib/logging/rotate.mjs +9 -0
  173. package/lib/maintenance/docker-reclaim.mjs +206 -0
  174. package/lib/mcp/external-schema-cost.mjs +74 -0
  175. package/lib/mcp/server.mjs +84 -9
  176. package/lib/mcp/stdio-mcp-probe.mjs +188 -0
  177. package/lib/mcp/tool-budget.mjs +55 -4
  178. package/lib/mcp/tools/document.mjs +18 -4
  179. package/lib/mcp/tools/skills.mjs +32 -3
  180. package/lib/mcp/tools/workflow.mjs +13 -1
  181. package/lib/model-free-selector.mjs +18 -0
  182. package/lib/model-registry.mjs +13 -229
  183. package/lib/model-router.mjs +425 -93
  184. package/lib/models/behavior-matrix.mjs +289 -0
  185. package/lib/models/catalog.mjs +209 -0
  186. package/lib/models/execution-capability-profile.mjs +196 -0
  187. package/lib/models/execution-policy.mjs +307 -0
  188. package/lib/models/provider-poll.mjs +383 -0
  189. package/lib/npm-spawn-env.mjs +17 -0
  190. package/lib/ollama/installed-models.mjs +129 -0
  191. package/lib/oracle/actions.mjs +187 -0
  192. package/lib/oracle/artifact-gate.mjs +99 -0
  193. package/lib/oracle/cli.mjs +204 -0
  194. package/lib/oracle/daemon-entry.mjs +14 -0
  195. package/lib/oracle/dispatch.mjs +81 -0
  196. package/lib/oracle/execute.mjs +143 -0
  197. package/lib/oracle/gaps.mjs +76 -0
  198. package/lib/oracle/index.mjs +84 -0
  199. package/lib/oracle/issues.mjs +164 -0
  200. package/lib/oracle/org-graph.mjs +170 -0
  201. package/lib/oracle/policy.mjs +80 -0
  202. package/lib/oracle/read-model.mjs +398 -0
  203. package/lib/oracle/reconcile.mjs +191 -0
  204. package/lib/oracle/routing.mjs +89 -0
  205. package/lib/oracle/synthesize.mjs +384 -0
  206. package/lib/oracle/verdicts.mjs +51 -0
  207. package/lib/orchestration/worker.mjs +88 -27
  208. package/lib/orchestration-policy.mjs +50 -0
  209. package/lib/parity.mjs +96 -2
  210. package/lib/persona-sections.mjs +66 -0
  211. package/lib/playwright-demo.mjs +252 -0
  212. package/lib/project-init-shared.mjs +4 -1
  213. package/lib/prompt-composer.js +9 -4
  214. package/lib/prompt-validation-contract.mjs +24 -0
  215. package/lib/provider-capabilities.js +57 -11
  216. package/lib/providers/contract/adapters/confluence/index.mjs +181 -0
  217. package/lib/providers/contract/adapters/git/index.mjs +115 -0
  218. package/lib/providers/contract/adapters/github/index.mjs +166 -0
  219. package/lib/providers/contract/adapters/jira/index.mjs +187 -0
  220. package/lib/providers/contract/adapters/slack/index.mjs +175 -0
  221. package/lib/providers/contract/contract-tests.mjs +57 -0
  222. package/lib/providers/contract/errors.mjs +48 -0
  223. package/lib/providers/contract/interface.mjs +50 -0
  224. package/lib/providers/contract/registry.mjs +102 -0
  225. package/lib/providers/copilot-auth.mjs +297 -0
  226. package/lib/providers/credential-bootstrap.mjs +178 -0
  227. package/lib/providers/credential-catalog.mjs +46 -0
  228. package/lib/providers/credential-sources.mjs +63 -0
  229. package/lib/providers/creds.mjs +5 -2
  230. package/lib/providers/op-run.mjs +59 -0
  231. package/lib/providers/secret-resolver.mjs +159 -0
  232. package/lib/publish-template.mjs +163 -0
  233. package/lib/publish-tooling.mjs +119 -0
  234. package/lib/publish.mjs +305 -0
  235. package/lib/registry/cli.mjs +82 -0
  236. package/lib/registry/consolidation.mjs +147 -0
  237. package/lib/registry/generate-docs.mjs +75 -0
  238. package/lib/registry/skill-verification.mjs +57 -0
  239. package/lib/registry/surface-map.mjs +76 -0
  240. package/lib/registry/validate.mjs +135 -0
  241. package/lib/resources/budget.mjs +82 -0
  242. package/lib/resources/process-budget.mjs +45 -0
  243. package/lib/rules-delivery.mjs +9 -2
  244. package/lib/rules-read.mjs +26 -0
  245. package/lib/runtime-env.mjs +23 -0
  246. package/lib/runtime-pressure.mjs +51 -7
  247. package/lib/schema-infer.mjs +13 -2
  248. package/lib/server/chat-loop.mjs +622 -0
  249. package/lib/server/demo-preview.mjs +63 -0
  250. package/lib/server/index.mjs +229 -8
  251. package/lib/server/langfuse-login.mjs +3 -3
  252. package/lib/service-manager.mjs +61 -9
  253. package/lib/session-store.mjs +1 -1
  254. package/lib/setup.mjs +102 -2
  255. package/lib/specialists/prompt-schema.mjs +19 -10
  256. package/lib/specialists/roster.mjs +43 -0
  257. package/lib/specialists/scaffold.mjs +56 -0
  258. package/lib/storage/backend.mjs +6 -6
  259. package/lib/storage/embeddings-local.mjs +6 -3
  260. package/lib/storage/file-lock.mjs +18 -11
  261. package/lib/storage/hybrid-query.mjs +7 -4
  262. package/lib/storage/state-source.mjs +5 -5
  263. package/lib/storage/sync.mjs +2 -3
  264. package/lib/telemetry/rule-calls.mjs +52 -0
  265. package/lib/template-registry.mjs +2 -2
  266. package/lib/templates/visual-requirements.mjs +27 -51
  267. package/lib/test-corpus-inventory.mjs +313 -0
  268. package/lib/uninstall/uninstall.mjs +19 -7
  269. package/lib/update.mjs +12 -0
  270. package/lib/upgrade.mjs +14 -0
  271. package/lib/wireframe.mjs +20 -14
  272. package/lib/worker/run.mjs +17 -4
  273. package/lib/worker/trace.mjs +11 -3
  274. package/package.json +29 -13
  275. package/personas/construct.md +13 -13
  276. package/platforms/claude/settings.template.json +36 -0
  277. package/rules/common/patterns.md +1 -1
  278. package/rules/common/release-gates.md +4 -3
  279. package/scripts/sync-specialists.mjs +187 -60
  280. package/skills/devops/data-engineering.md +1 -1
  281. package/skills/docs/adr-workflow.md +1 -0
  282. package/skills/docs/backlog-proposal-workflow.md +1 -0
  283. package/skills/docs/codebase-research-workflow.md +40 -0
  284. package/skills/docs/customer-profile-workflow.md +1 -0
  285. package/skills/docs/document-ingest-workflow.md +1 -0
  286. package/skills/docs/evidence-ingest-workflow.md +1 -0
  287. package/skills/docs/init-docs.md +2 -2
  288. package/skills/docs/init-project.md +8 -3
  289. package/skills/docs/prd-workflow.md +24 -1
  290. package/skills/docs/prfaq-workflow.md +1 -0
  291. package/skills/docs/product-intelligence-workflow.md +1 -0
  292. package/skills/docs/product-signal-workflow.md +1 -0
  293. package/skills/docs/research-workflow.md +54 -37
  294. package/skills/docs/runbook-workflow.md +1 -0
  295. package/skills/docs/strategy-workflow.md +1 -0
  296. package/skills/docs/user-research-workflow.md +40 -0
  297. package/skills/operating/orchestration-reference.md +1 -1
  298. package/skills/roles/architect.md +5 -0
  299. package/skills/roles/operator.docs.md +4 -0
  300. package/skills/routing.md +4 -2
  301. package/specialists/artifact-manifest.json +480 -0
  302. package/specialists/artifact-manifest.schema.json +53 -0
  303. package/specialists/audit-enrichments.json +454 -0
  304. package/specialists/contracts.json +37 -25
  305. package/specialists/prompts/_shared/validation-contract.md +26 -0
  306. package/specialists/prompts/cx-accessibility.md +21 -2
  307. package/specialists/prompts/cx-ai-engineer.md +24 -1
  308. package/specialists/prompts/cx-architect.md +4 -1
  309. package/specialists/prompts/cx-business-strategist.md +23 -2
  310. package/specialists/prompts/cx-data-analyst.md +22 -1
  311. package/specialists/prompts/cx-data-engineer.md +23 -2
  312. package/specialists/prompts/cx-debugger.md +21 -2
  313. package/specialists/prompts/cx-designer.md +26 -3
  314. package/specialists/prompts/cx-devil-advocate.md +19 -2
  315. package/specialists/prompts/cx-docs-keeper.md +28 -1
  316. package/specialists/prompts/cx-engineer.md +22 -1
  317. package/specialists/prompts/cx-evaluator.md +18 -1
  318. package/specialists/prompts/cx-explorer.md +21 -2
  319. package/specialists/prompts/cx-legal-compliance.md +21 -2
  320. package/specialists/prompts/cx-operations.md +21 -2
  321. package/specialists/prompts/cx-oracle.md +94 -0
  322. package/specialists/prompts/cx-orchestrator.md +20 -1
  323. package/specialists/prompts/cx-platform-engineer.md +25 -2
  324. package/specialists/prompts/cx-product-manager.md +32 -1
  325. package/specialists/prompts/cx-qa.md +24 -2
  326. package/specialists/prompts/cx-rd-lead.md +23 -2
  327. package/specialists/prompts/cx-release-manager.md +23 -2
  328. package/specialists/prompts/cx-researcher.md +22 -2
  329. package/specialists/prompts/cx-reviewer.md +18 -1
  330. package/specialists/prompts/cx-security.md +22 -2
  331. package/specialists/prompts/cx-sre.md +30 -3
  332. package/specialists/prompts/cx-test-automation.md +7 -1
  333. package/specialists/prompts/cx-trace-reviewer.md +22 -3
  334. package/specialists/prompts/cx-ux-researcher.md +21 -2
  335. package/specialists/registry.json +52 -173
  336. package/specialists/tone-profiles.json +42 -0
  337. package/templates/demos/playwright/demo-recording.config.mjs +47 -0
  338. package/templates/demos/recordings/agentic-platforms-prd.json +19 -0
  339. package/templates/demos/scripts/agentic-platforms-prd.json +44 -0
  340. package/templates/demos/specs/_helpers/scroll-artifact.ts +89 -0
  341. package/templates/demos/tapes/agentic-platforms-prd.tape +49 -0
  342. package/templates/demos/tapes/resource-guard-rails.tape +49 -0
  343. package/templates/demos/vhs/construct-cockpit.json +24 -0
  344. package/templates/distribution/construct-brand.typ +446 -0
  345. package/templates/distribution/construct-decision.typ +38 -0
  346. package/templates/distribution/construct-deck.html +95 -0
  347. package/templates/distribution/construct-pdf.typ +38 -0
  348. package/templates/distribution/construct-prd.typ +38 -0
  349. package/templates/distribution/construct-research.typ +38 -0
  350. package/templates/distribution/construct-web.html +92 -0
  351. package/templates/distribution/fonts/Geist-Bold.ttf +0 -0
  352. package/templates/distribution/fonts/Geist-Medium.ttf +0 -0
  353. package/templates/distribution/fonts/Geist-Regular.ttf +0 -0
  354. package/templates/distribution/fonts/Geist-SemiBold.ttf +0 -0
  355. package/templates/distribution/fonts/GeistMono-Medium.ttf +0 -0
  356. package/templates/distribution/fonts/GeistMono-Regular.ttf +0 -0
  357. package/templates/distribution/fonts/GeistMono-SemiBold.ttf +0 -0
  358. package/templates/distribution/fonts/IBMPlexMono-Regular.otf +0 -0
  359. package/templates/distribution/fonts/JetBrainsMono-Medium.ttf +0 -0
  360. package/templates/distribution/fonts/JetBrainsMono-Regular.ttf +0 -0
  361. package/templates/distribution/fonts/JetBrainsMono-SemiBold.ttf +0 -0
  362. package/templates/distribution/fonts/PlusJakartaSans-Bold.ttf +0 -0
  363. package/templates/distribution/fonts/PlusJakartaSans-Medium.ttf +0 -0
  364. package/templates/distribution/fonts/PlusJakartaSans-Regular.ttf +0 -0
  365. package/templates/distribution/fonts/PlusJakartaSans-SemiBold.ttf +0 -0
  366. package/templates/distribution/fonts/README.md +36 -0
  367. package/templates/distribution/fonts/SpaceGrotesk-Variable.ttf +0 -0
  368. package/templates/distribution/fonts/handwritten/Caveat.ttf +0 -0
  369. package/templates/distribution/fonts/legacy/IBMPlexMono-Regular.otf +0 -0
  370. package/templates/distribution/fonts/legacy/Inter-Medium.otf +0 -0
  371. package/templates/distribution/fonts/legacy/Inter-Regular.otf +0 -0
  372. package/templates/distribution/fonts/legacy/Inter-SemiBold.otf +0 -0
  373. package/templates/distribution/fonts/legacy/InterDisplay-SemiBold.otf +0 -0
  374. package/templates/distribution/fonts/legacy/SourceSerif4-Regular.otf +0 -0
  375. package/templates/distribution/fonts/legacy/SourceSerif4-Semibold.otf +0 -0
  376. package/templates/distribution/icons/activity.svg +15 -0
  377. package/templates/distribution/icons/alert-triangle.svg +17 -0
  378. package/templates/distribution/icons/book-open.svg +16 -0
  379. package/templates/distribution/icons/bot.svg +20 -0
  380. package/templates/distribution/icons/brain.svg +22 -0
  381. package/templates/distribution/icons/circle-check.svg +16 -0
  382. package/templates/distribution/icons/clipboard-check.svg +17 -0
  383. package/templates/distribution/icons/cpu.svg +28 -0
  384. package/templates/distribution/icons/database.svg +17 -0
  385. package/templates/distribution/icons/eye.svg +16 -0
  386. package/templates/distribution/icons/file-text.svg +19 -0
  387. package/templates/distribution/icons/gauge.svg +16 -0
  388. package/templates/distribution/icons/git-branch.svg +17 -0
  389. package/templates/distribution/icons/key.svg +17 -0
  390. package/templates/distribution/icons/layers.svg +17 -0
  391. package/templates/distribution/icons/list-checks.svg +19 -0
  392. package/templates/distribution/icons/lock.svg +16 -0
  393. package/templates/distribution/icons/message-square.svg +15 -0
  394. package/templates/distribution/icons/network.svg +19 -0
  395. package/templates/distribution/icons/route.svg +17 -0
  396. package/templates/distribution/icons/scale.svg +19 -0
  397. package/templates/distribution/icons/search.svg +16 -0
  398. package/templates/distribution/icons/send.svg +16 -0
  399. package/templates/distribution/icons/server.svg +18 -0
  400. package/templates/distribution/icons/shield-check.svg +16 -0
  401. package/templates/distribution/icons/users.svg +18 -0
  402. package/templates/distribution/icons/webhook.svg +17 -0
  403. package/templates/distribution/icons/workflow.svg +17 -0
  404. package/templates/distribution/icons/wrench.svg +15 -0
  405. package/templates/distribution/run.mjs +18 -1
  406. package/templates/docs/adr.md +7 -0
  407. package/templates/docs/construct_guide.md +10 -10
  408. package/templates/docs/customer-profile.md +4 -0
  409. package/templates/docs/one-pager.md +4 -0
  410. package/templates/docs/postmortem.md +31 -0
  411. package/templates/docs/prd-platform.md +19 -0
  412. package/templates/docs/prd.md +15 -0
  413. package/templates/docs/prfaq.md +7 -0
  414. package/templates/docs/qa-strategy.md +103 -0
  415. package/templates/docs/research-brief.md +8 -0
  416. package/templates/docs/rfc-platform.md +12 -0
  417. package/templates/docs/test-plan.md +7 -0
  418. package/lib/ingest/chunker.mjs +0 -94
  419. package/lib/ingest/pipeline.mjs +0 -53
  420. package/lib/ingest/store.mjs +0 -82
  421. package/lib/mode-commands.mjs +0 -122
  422. package/lib/policy/unified-gates.mjs +0 -96
  423. package/lib/profiles/validate-custom.mjs +0 -114
  424. package/lib/services/telemetry-backend.mjs +0 -177
  425. package/lib/storage/fusion.mjs +0 -95
@@ -0,0 +1,95 @@
1
+ <!--
2
+ templates/distribution/construct-deck.html — Construct branded 16:9 slide deck
3
+ HTML for `construct export --to=deck`. Pandoc emits section divs (--section-divs)
4
+ from markdown slides separated by ---; Space Grotesk via Google Fonts; monochrome ink
5
+ tokens mirror construct-brand.typ. Metadata variables fill the title slide.
6
+ -->
7
+ <!DOCTYPE html>
8
+ <html lang="en">
9
+ <head>
10
+ <meta charset="utf-8">
11
+ <meta name="viewport" content="width=device-width, initial-scale=1">
12
+ <title>$if(title)$$title$$else$Construct deck$endif$</title>
13
+ <link rel="preconnect" href="https://fonts.googleapis.com">
14
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
15
+ <link href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500;600&family=Space+Grotesk:wght@400;500;600;700&display=swap" rel="stylesheet">
16
+ <style>
17
+ :root {
18
+ --ink:#0a0c10; --ink-strong:#16191f; --ink-body:#23272e; --muted:#565c66; --faint:#9499a2;
19
+ --hairline:#e3e4e8; --hairline-strong:#cdd0d6; --surface:#fafafa; --surface-alt:#f3f4f6; --paper:#ffffff;
20
+ --sans:'Space Grotesk',system-ui,-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;
21
+ --mono:'JetBrains Mono',ui-monospace,'SF Mono',Menlo,monospace;
22
+ --slide-w:1280px;
23
+ --slide-h:720px;
24
+ }
25
+ * { box-sizing:border-box; }
26
+ html { scroll-behavior:smooth; -webkit-text-size-adjust:100%; }
27
+ body { margin:0; background:#e8e9ec; color:var(--ink-body); font-family:var(--sans); font-size:22px; line-height:1.45; -webkit-font-smoothing:antialiased; }
28
+ .deck { display:flex; flex-direction:column; align-items:center; gap:32px; padding:40px 24px 80px; }
29
+ section.slide {
30
+ width:min(100%, var(--slide-w));
31
+ aspect-ratio:16/9;
32
+ background:var(--paper);
33
+ border:1px solid var(--hairline);
34
+ border-radius:8px;
35
+ box-shadow:0 18px 48px rgba(10,12,16,.08);
36
+ padding:56px 64px 48px;
37
+ overflow:hidden;
38
+ display:flex;
39
+ flex-direction:column;
40
+ position:relative;
41
+ }
42
+ section.slide::after {
43
+ content:"";
44
+ position:absolute;
45
+ left:0; right:0; bottom:0;
46
+ height:4px;
47
+ background:linear-gradient(90deg, var(--ink) 46px, var(--hairline) 46px);
48
+ }
49
+ section.slide.title-slide { justify-content:center; }
50
+ section.slide.title-slide h1 { font-size:52px; line-height:1.06; letter-spacing:-.024em; margin:0 0 16px; color:var(--ink); font-weight:600; }
51
+ section.slide.title-slide .subtitle { font-size:26px; color:var(--muted); margin:0 0 28px; letter-spacing:-.005em; }
52
+ section.slide.title-slide .meta { font-size:15px; color:var(--muted); letter-spacing:.04em; text-transform:uppercase; font-weight:600; }
53
+ section.slide.title-slide .meta .sep { color:var(--faint); font-weight:400; }
54
+ section.slide h1 { font-size:40px; line-height:1.08; letter-spacing:-.02em; margin:0 0 20px; color:var(--ink); font-weight:600; }
55
+ section.slide h1::after { content:""; display:block; width:36px; height:3px; background:var(--ink); margin-top:14px; }
56
+ section.slide h2 { font-size:28px; font-weight:600; color:var(--ink-strong); margin:28px 0 12px; letter-spacing:-.01em; }
57
+ section.slide h3 { font-size:22px; font-weight:600; color:var(--ink-strong); margin:20px 0 8px; }
58
+ section.slide p { margin:0 0 14px; max-width:52em; }
59
+ section.slide ul, section.slide ol { margin:0 0 16px; padding-left:1.2em; }
60
+ section.slide li { margin:0 0 10px; }
61
+ section.slide li::marker { color:var(--ink); }
62
+ section.slide strong { color:var(--ink); font-weight:600; }
63
+ section.slide code { font-family:var(--mono); font-size:.84em; background:var(--surface-alt); padding:1px 6px; border-radius:4px; }
64
+ section.slide pre { background:var(--surface); border:1px solid var(--hairline); border-radius:8px; padding:16px 18px; overflow:auto; font-size:17px; }
65
+ section.slide pre code { background:none; padding:0; }
66
+ section.slide blockquote { margin:16px 0; padding:14px 18px; background:var(--surface-alt); border-left:3px solid var(--ink); border-radius:0 4px 4px 0; }
67
+ section.slide table { width:100%; border-collapse:collapse; font-size:18px; margin:12px 0; }
68
+ section.slide th, section.slide td { text-align:left; padding:8px 12px; border-bottom:1px solid var(--hairline); }
69
+ section.slide thead th { font-weight:700; color:var(--ink); border-bottom:2px solid var(--ink); }
70
+ section.slide figure { margin:16px 0; text-align:center; }
71
+ section.slide figure img { max-width:58%; max-height:42vh; width:auto; height:auto; object-fit:contain; border:1px solid var(--hairline); border-radius:6px; padding:8px; }
72
+ .slide-foot { margin-top:auto; padding-top:16px; font-size:13px; color:var(--faint); display:flex; justify-content:space-between; align-items:center; }
73
+ .slide-foot b { color:var(--ink); font-weight:600; }
74
+ @media print {
75
+ body { background:var(--paper); }
76
+ .deck { gap:0; padding:0; }
77
+ section.slide { box-shadow:none; border:none; border-radius:0; page-break-after:always; width:100%; height:100vh; }
78
+ }
79
+ </style>
80
+ </head>
81
+ <body>
82
+ <div class="deck">
83
+ $if(title)$
84
+ <section class="slide title-slide">
85
+ $if(artifactType)$<div class="meta">$artifactType$$if(docId)$ <span class="sep">&middot;</span> $docId$$endif$$if(version)$ <span class="sep">&middot;</span> v$version$$endif$</div>$endif$
86
+ <h1>$title$</h1>
87
+ $if(subtitle)$<p class="subtitle">$subtitle$</p>$endif$
88
+ $if(owner)$<p class="meta">$owner$$if(date)$ <span class="sep">&middot;</span> $date$$endif$$if(status)$ <span class="sep">&middot;</span> $status$$endif$</p>$endif$
89
+ <div class="slide-foot"><span><b>Construct</b>$if(classification)$ &middot; $classification$$endif$</span></div>
90
+ </section>
91
+ $endif$
92
+ $body$
93
+ </div>
94
+ </body>
95
+ </html>
@@ -0,0 +1,38 @@
1
+ /**
2
+ * templates/distribution/construct-pdf.typ — Construct distribution PDF.
3
+ */
4
+
5
+ #import "construct-brand.typ": *
6
+
7
+ #show: construct-theme
8
+
9
+ #set page(
10
+ paper: "a4",
11
+ margin: (x: 2cm, top: 1.8cm, bottom: 2.2cm),
12
+ numbering: "1",
13
+ header: construct-running-header(
14
+ "$if(title)$$title$$endif$",
15
+ doc-id: "$if(docId)$$docId$$endif$",
16
+ version: "$if(version)$$version$$endif$",
17
+ ),
18
+ footer: construct-running-footer(
19
+ "Construct brief",
20
+ classification: "$if(classification)$$classification$$endif$",
21
+ ),
22
+ )
23
+
24
+ $if(title)$
25
+ #construct-masthead(
26
+ "$title$",
27
+ "$if(subtitle)$$subtitle$$endif$",
28
+ "$if(status)$$status$$endif$",
29
+ "$if(owner)$$owner$$endif$",
30
+ "$if(date)$$date$$endif$",
31
+ "$if(artifactType)$$artifactType$$endif$",
32
+ version: "$if(version)$$version$$endif$",
33
+ doc-id: "$if(docId)$$docId$$endif$",
34
+ classification: "$if(classification)$$classification$$endif$",
35
+ )
36
+ $endif$
37
+
38
+ $body$
@@ -0,0 +1,38 @@
1
+ /**
2
+ * templates/distribution/construct-prd.typ — Construct distribution PDF.
3
+ */
4
+
5
+ #import "construct-brand.typ": *
6
+
7
+ #show: construct-theme
8
+
9
+ #set page(
10
+ paper: "a4",
11
+ margin: (x: 2cm, top: 1.8cm, bottom: 2.2cm),
12
+ numbering: "1",
13
+ header: construct-running-header(
14
+ "$if(title)$$title$$endif$",
15
+ doc-id: "$if(docId)$$docId$$endif$",
16
+ version: "$if(version)$$version$$endif$",
17
+ ),
18
+ footer: construct-running-footer(
19
+ "Editorial brief",
20
+ classification: "$if(classification)$$classification$$endif$",
21
+ ),
22
+ )
23
+
24
+ $if(title)$
25
+ #construct-masthead(
26
+ "$title$",
27
+ "$if(subtitle)$$subtitle$$endif$",
28
+ "$if(status)$$status$$endif$",
29
+ "$if(owner)$$owner$$endif$",
30
+ "$if(date)$$date$$endif$",
31
+ "$if(artifactType)$$artifactType$$endif$",
32
+ version: "$if(version)$$version$$endif$",
33
+ doc-id: "$if(docId)$$docId$$endif$",
34
+ classification: "$if(classification)$$classification$$endif$",
35
+ )
36
+ $endif$
37
+
38
+ $body$
@@ -0,0 +1,38 @@
1
+ /**
2
+ * templates/distribution/construct-research.typ — Construct distribution PDF.
3
+ */
4
+
5
+ #import "construct-brand.typ": *
6
+
7
+ #show: construct-theme
8
+
9
+ #set page(
10
+ paper: "a4",
11
+ margin: (x: 1.85cm, top: 1.75cm, bottom: 2.1cm),
12
+ numbering: "1",
13
+ header: construct-running-header(
14
+ "$if(title)$$title$$endif$",
15
+ doc-id: "$if(docId)$$docId$$endif$",
16
+ version: "$if(version)$$version$$endif$",
17
+ ),
18
+ footer: construct-running-footer(
19
+ "Research analytics",
20
+ classification: "$if(classification)$$classification$$endif$",
21
+ ),
22
+ )
23
+
24
+ $if(title)$
25
+ #construct-masthead(
26
+ "$title$",
27
+ "$if(subtitle)$$subtitle$$endif$",
28
+ "$if(status)$$status$$endif$",
29
+ "$if(owner)$$owner$$endif$",
30
+ "$if(date)$$date$$endif$",
31
+ "$if(artifactType)$$artifactType$$endif$",
32
+ version: "$if(version)$$version$$endif$",
33
+ doc-id: "$if(docId)$$docId$$endif$",
34
+ classification: "$if(classification)$$classification$$endif$",
35
+ )
36
+ $endif$
37
+
38
+ $body$
@@ -0,0 +1,92 @@
1
+ <!--
2
+ templates/distribution/construct-web.html — Construct branded standalone HTML
3
+ template for `construct export --to=html`. Monochrome design mirroring the PDF
4
+ brand (construct-brand.typ): Space Grotesk webfont, masthead from frontmatter metadata,
5
+ bold-header hairline tables, callout blockquotes, framed figures. Pandoc fills
6
+ $title$/$subtitle$/$status$/$owner$/$date$/$artifactType$/$version$/$docId$/
7
+ $classification$ and $body$; export runs with --embed-resources so diagrams and
8
+ fonts inline into a single portable file.
9
+ -->
10
+ <!DOCTYPE html>
11
+ <html lang="en">
12
+ <head>
13
+ <meta charset="utf-8">
14
+ <meta name="viewport" content="width=device-width, initial-scale=1">
15
+ <title>$if(title)$$title$$else$Construct document$endif$</title>
16
+ <link rel="preconnect" href="https://fonts.googleapis.com">
17
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
18
+ <link href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500;600&family=Space+Grotesk:wght@400;500;600;700&display=swap" rel="stylesheet">
19
+ <style>
20
+ :root {
21
+ --ink:#0a0c10; --ink-strong:#16191f; --ink-body:#23272e; --muted:#565c66; --faint:#9499a2;
22
+ --hairline:#e3e4e8; --hairline-strong:#cdd0d6; --surface:#fafafa; --surface-alt:#f3f4f6; --paper:#ffffff;
23
+ --sans:'Space Grotesk',system-ui,-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;
24
+ --mono:'JetBrains Mono',ui-monospace,'SF Mono',Menlo,monospace;
25
+ }
26
+ * { box-sizing:border-box; }
27
+ html { -webkit-text-size-adjust:100%; }
28
+ body { margin:0; background:var(--paper); color:var(--ink-body); font-family:var(--sans); font-size:16px; line-height:1.62; -webkit-font-smoothing:antialiased; text-rendering:optimizeLegibility; }
29
+ .doc { max-width:760px; margin:0 auto; padding:64px 28px 120px; }
30
+
31
+ .masthead { margin-bottom:8px; }
32
+ .chips { font-size:12px; font-weight:700; letter-spacing:.08em; color:var(--ink); text-transform:uppercase; margin-bottom:14px; }
33
+ .chips .sep { color:var(--faint); font-weight:400; }
34
+ .masthead .title { font-size:38px; line-height:1.08; letter-spacing:-.022em; font-weight:600; color:var(--ink); margin:0; }
35
+ .masthead .subtitle { font-size:18px; color:var(--muted); margin:12px 0 0; letter-spacing:-.005em; }
36
+ .byline { display:flex; align-items:center; gap:10px; margin-top:20px; font-size:14px; color:var(--muted); }
37
+ .byline .sep { color:var(--faint); }
38
+ .pill { font-size:11px; font-weight:700; letter-spacing:.05em; text-transform:uppercase; padding:3px 8px; border-radius:4px; border:1px solid var(--hairline-strong); color:var(--muted); }
39
+ .rule { position:relative; height:1px; background:var(--hairline); margin:24px 0 6px; }
40
+ .rule::before { content:""; position:absolute; left:0; top:-1px; width:46px; height:3px; background:var(--ink); }
41
+
42
+ h1,h2,h3,h4 { font-family:var(--sans); }
43
+ h2 { font-size:24px; font-weight:600; letter-spacing:-.015em; color:var(--ink); margin:54px 0 4px; }
44
+ h2::after { content:""; display:block; width:26px; height:2px; background:var(--ink); margin-top:10px; }
45
+ h3 { font-size:18px; font-weight:600; color:var(--ink-strong); margin:34px 0 8px; }
46
+ h4 { font-size:13px; font-weight:700; text-transform:uppercase; letter-spacing:.07em; color:var(--muted); margin:28px 0 8px; }
47
+ p { margin:0 0 16px; }
48
+ strong { color:var(--ink); font-weight:600; }
49
+ em { font-style:italic; }
50
+ a { color:var(--ink); text-decoration:underline; text-decoration-color:var(--hairline-strong); text-underline-offset:2px; }
51
+ a:hover { text-decoration-color:var(--ink); }
52
+ ul,ol { padding-left:22px; margin:0 0 18px; }
53
+ li { margin:0 0 9px; }
54
+ li::marker { color:var(--ink); }
55
+
56
+ code { font-family:var(--mono); font-size:.86em; background:var(--surface-alt); padding:1px 5px; border-radius:4px; color:var(--ink-strong); }
57
+ pre { background:var(--surface); border:1px solid var(--hairline); border-radius:8px; padding:14px 16px; overflow:auto; }
58
+ pre code { background:none; padding:0; }
59
+
60
+ blockquote { margin:20px 0; padding:14px 18px; background:var(--surface-alt); border-left:3px solid var(--ink); border-radius:0 4px 4px 0; color:var(--ink-body); }
61
+ blockquote p:last-child { margin:0; }
62
+
63
+ table { width:100%; border-collapse:collapse; margin:20px 0; font-size:15px; }
64
+ th,td { text-align:left; padding:9px 12px; border-bottom:1px solid var(--hairline); vertical-align:top; }
65
+ thead th { font-weight:700; color:var(--ink); border-bottom:2px solid var(--ink); }
66
+ tbody tr td:first-child { font-weight:600; color:var(--ink-strong); }
67
+
68
+ figure { margin:26px 0; text-align:center; }
69
+ figure img { max-width:58%; max-height:2.35in; width:auto; height:auto; object-fit:contain; border:1px solid var(--hairline); border-radius:6px; padding:8px; background:var(--paper); }
70
+ figcaption { font-size:13px; color:var(--muted); margin-top:8px; }
71
+ img { max-width:100%; }
72
+
73
+ .doc-foot { margin-top:64px; padding-top:16px; border-top:1px solid var(--hairline); font-size:12px; color:var(--faint); text-align:center; }
74
+ .doc-foot b { color:var(--ink); font-weight:600; }
75
+ </style>
76
+ </head>
77
+ <body>
78
+ <main class="doc">
79
+ $if(title)$
80
+ <header class="masthead">
81
+ $if(artifactType)$ <div class="chips">$artifactType$$if(docId)$ <span class="sep">&middot;</span> $docId$$endif$$if(version)$ <span class="sep">&middot;</span> v$version$$endif$$if(classification)$ <span class="sep">&middot;</span> $classification$$endif$</div>
82
+ $endif$ <div class="title">$title$</div>
83
+ $if(subtitle)$ <p class="subtitle">$subtitle$</p>
84
+ $endif$ <div class="byline">$if(status)$<span class="pill">$status$</span>$endif$$if(owner)$<span>$owner$</span>$endif$$if(date)$<span class="sep">&middot;</span><span>$date$</span>$endif$</div>
85
+ </header>
86
+ <div class="rule"></div>
87
+ $endif$
88
+ $body$
89
+ <div class="doc-foot"><b>Construct</b>$if(classification)$ &middot; $classification$$endif$</div>
90
+ </main>
91
+ </body>
92
+ </html>
@@ -0,0 +1,36 @@
1
+ # Distribution PDF fonts
2
+
3
+ Bundled for offline Typst export via `--font-path`. Family names must match Typst discovery (`Space Grotesk`, `JetBrains Mono`).
4
+
5
+ **Active `--font-path` faces** (only these belong at this directory root):
6
+
7
+ | File | Role | License |
8
+ | --- | --- | --- |
9
+ | SpaceGrotesk-Variable.ttf | Body, masthead, headings, deck/PPTX embed (weight axis 300–700) | [OFL-1.1](https://github.com/floriankarsten/space-grotesk/blob/master/OFL.txt) (Florian Karsten) |
10
+ | JetBrainsMono-*.ttf | Code, IDs, monospace (Regular/Medium/SemiBold) | [OFL-1.1](https://github.com/JetBrains/JetBrainsMono/blob/master/OFL.txt) (JetBrains) |
11
+
12
+ **Not active** — kept for reference or diagram labels only; do not copy back to the root unless re-promoting:
13
+
14
+ | Location | Contents |
15
+ | --- | --- |
16
+ | `legacy/` | Inter, Source Serif, older IBM Plex Mono copies |
17
+ | `PlusJakartaSans-*.ttf`, `Geist-*.ttf`, `GeistMono-*.ttf`, `IBMPlexMono-Regular.otf` | Pre-Space-Grotesk sans/mono (retired from brand) |
18
+ | `handwritten/Caveat.ttf` | Mermaid/D2 hand-drawn diagram labels |
19
+
20
+ Refresh the brand faces from upstream:
21
+
22
+ ```bash
23
+ DIR=templates/distribution/fonts
24
+ curl -fsSL -o "$DIR/SpaceGrotesk-Variable.ttf" \
25
+ "https://github.com/google/fonts/raw/main/ofl/spacegrotesk/SpaceGrotesk%5Bwght%5D.ttf"
26
+ JB=https://github.com/JetBrains/JetBrainsMono/raw/master/fonts/ttf
27
+ for f in JetBrainsMono-Regular.ttf JetBrainsMono-Medium.ttf JetBrainsMono-SemiBold.ttf; do
28
+ curl -fsSL -o "$DIR/$f" "$JB/$f"
29
+ done
30
+ ```
31
+
32
+ Space Grotesk ships as a single weight-axis variable TTF; Typst interpolates the 400/500/600/700 weights the brand references. Export passes `--font-path`, `--ignore-system-fonts`, and `--ignore-embedded-fonts` so Typst does not fall back to Libertinus Serif or DejaVu Sans Mono.
33
+
34
+ PPTX export embeds the Space Grotesk and JetBrains Mono TTF files via optional `pptx-embed-fonts` when `pptxgenjs` is installed.
35
+
36
+ Deck/PPTX **preview artifacts** are not stored here — run `npm run examples:deck` to write gitignored outputs under `.tmp/distribution-examples/`.
@@ -0,0 +1,15 @@
1
+ <!-- @license lucide-static v1.21.0 - ISC -->
2
+ <svg
3
+ class="lucide lucide-activity"
4
+ xmlns="http://www.w3.org/2000/svg"
5
+ width="24"
6
+ height="24"
7
+ viewBox="0 0 24 24"
8
+ fill="none"
9
+ stroke="#0a0c10"
10
+ stroke-width="2"
11
+ stroke-linecap="round"
12
+ stroke-linejoin="round"
13
+ >
14
+ <path d="M22 12h-2.48a2 2 0 0 0-1.93 1.46l-2.35 8.36a.25.25 0 0 1-.48 0L9.24 2.18a.25.25 0 0 0-.48 0l-2.35 8.36A2 2 0 0 1 4.49 12H2" />
15
+ </svg>
@@ -0,0 +1,17 @@
1
+ <!-- @license lucide-static v1.21.0 - ISC -->
2
+ <svg
3
+ class="lucide lucide-alert-triangle"
4
+ xmlns="http://www.w3.org/2000/svg"
5
+ width="24"
6
+ height="24"
7
+ viewBox="0 0 24 24"
8
+ fill="none"
9
+ stroke="#0a0c10"
10
+ stroke-width="2"
11
+ stroke-linecap="round"
12
+ stroke-linejoin="round"
13
+ >
14
+ <path d="m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3" />
15
+ <path d="M12 9v4" />
16
+ <path d="M12 17h.01" />
17
+ </svg>
@@ -0,0 +1,16 @@
1
+ <!-- @license lucide-static v1.21.0 - ISC -->
2
+ <svg
3
+ class="lucide lucide-book-open"
4
+ xmlns="http://www.w3.org/2000/svg"
5
+ width="24"
6
+ height="24"
7
+ viewBox="0 0 24 24"
8
+ fill="none"
9
+ stroke="#0a0c10"
10
+ stroke-width="2"
11
+ stroke-linecap="round"
12
+ stroke-linejoin="round"
13
+ >
14
+ <path d="M12 7v14" />
15
+ <path d="M3 18a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1h5a4 4 0 0 1 4 4 4 4 0 0 1 4-4h5a1 1 0 0 1 1 1v13a1 1 0 0 1-1 1h-6a3 3 0 0 0-3 3 3 3 0 0 0-3-3z" />
16
+ </svg>
@@ -0,0 +1,20 @@
1
+ <!-- @license lucide-static v1.21.0 - ISC -->
2
+ <svg
3
+ class="lucide lucide-bot"
4
+ xmlns="http://www.w3.org/2000/svg"
5
+ width="24"
6
+ height="24"
7
+ viewBox="0 0 24 24"
8
+ fill="none"
9
+ stroke="#0a0c10"
10
+ stroke-width="2"
11
+ stroke-linecap="round"
12
+ stroke-linejoin="round"
13
+ >
14
+ <path d="M12 8V4H8" />
15
+ <rect width="16" height="12" x="4" y="8" rx="2" />
16
+ <path d="M2 14h2" />
17
+ <path d="M20 14h2" />
18
+ <path d="M15 13v2" />
19
+ <path d="M9 13v2" />
20
+ </svg>
@@ -0,0 +1,22 @@
1
+ <!-- @license lucide-static v1.21.0 - ISC -->
2
+ <svg
3
+ class="lucide lucide-brain"
4
+ xmlns="http://www.w3.org/2000/svg"
5
+ width="24"
6
+ height="24"
7
+ viewBox="0 0 24 24"
8
+ fill="none"
9
+ stroke="#0a0c10"
10
+ stroke-width="2"
11
+ stroke-linecap="round"
12
+ stroke-linejoin="round"
13
+ >
14
+ <path d="M12 18V5" />
15
+ <path d="M15 13a4.17 4.17 0 0 1-3-4 4.17 4.17 0 0 1-3 4" />
16
+ <path d="M17.598 6.5A3 3 0 1 0 12 5a3 3 0 1 0-5.598 1.5" />
17
+ <path d="M17.997 5.125a4 4 0 0 1 2.526 5.77" />
18
+ <path d="M18 18a4 4 0 0 0 2-7.464" />
19
+ <path d="M19.967 17.483A4 4 0 1 1 12 18a4 4 0 1 1-7.967-.517" />
20
+ <path d="M6 18a4 4 0 0 1-2-7.464" />
21
+ <path d="M6.003 5.125a4 4 0 0 0-2.526 5.77" />
22
+ </svg>
@@ -0,0 +1,16 @@
1
+ <!-- @license lucide-static v1.21.0 - ISC -->
2
+ <svg
3
+ class="lucide lucide-circle-check"
4
+ xmlns="http://www.w3.org/2000/svg"
5
+ width="24"
6
+ height="24"
7
+ viewBox="0 0 24 24"
8
+ fill="none"
9
+ stroke="#0a0c10"
10
+ stroke-width="2"
11
+ stroke-linecap="round"
12
+ stroke-linejoin="round"
13
+ >
14
+ <circle cx="12" cy="12" r="10" />
15
+ <path d="m9 12 2 2 4-4" />
16
+ </svg>
@@ -0,0 +1,17 @@
1
+ <!-- @license lucide-static v1.21.0 - ISC -->
2
+ <svg
3
+ class="lucide lucide-clipboard-check"
4
+ xmlns="http://www.w3.org/2000/svg"
5
+ width="24"
6
+ height="24"
7
+ viewBox="0 0 24 24"
8
+ fill="none"
9
+ stroke="#0a0c10"
10
+ stroke-width="2"
11
+ stroke-linecap="round"
12
+ stroke-linejoin="round"
13
+ >
14
+ <rect width="8" height="4" x="8" y="2" rx="1" ry="1" />
15
+ <path d="M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2" />
16
+ <path d="m9 14 2 2 4-4" />
17
+ </svg>
@@ -0,0 +1,28 @@
1
+ <!-- @license lucide-static v1.21.0 - ISC -->
2
+ <svg
3
+ class="lucide lucide-cpu"
4
+ xmlns="http://www.w3.org/2000/svg"
5
+ width="24"
6
+ height="24"
7
+ viewBox="0 0 24 24"
8
+ fill="none"
9
+ stroke="#0a0c10"
10
+ stroke-width="2"
11
+ stroke-linecap="round"
12
+ stroke-linejoin="round"
13
+ >
14
+ <path d="M12 20v2" />
15
+ <path d="M12 2v2" />
16
+ <path d="M17 20v2" />
17
+ <path d="M17 2v2" />
18
+ <path d="M2 12h2" />
19
+ <path d="M2 17h2" />
20
+ <path d="M2 7h2" />
21
+ <path d="M20 12h2" />
22
+ <path d="M20 17h2" />
23
+ <path d="M20 7h2" />
24
+ <path d="M7 20v2" />
25
+ <path d="M7 2v2" />
26
+ <rect x="4" y="4" width="16" height="16" rx="2" />
27
+ <rect x="8" y="8" width="8" height="8" rx="1" />
28
+ </svg>
@@ -0,0 +1,17 @@
1
+ <!-- @license lucide-static v1.21.0 - ISC -->
2
+ <svg
3
+ class="lucide lucide-database"
4
+ xmlns="http://www.w3.org/2000/svg"
5
+ width="24"
6
+ height="24"
7
+ viewBox="0 0 24 24"
8
+ fill="none"
9
+ stroke="#0a0c10"
10
+ stroke-width="2"
11
+ stroke-linecap="round"
12
+ stroke-linejoin="round"
13
+ >
14
+ <ellipse cx="12" cy="5" rx="9" ry="3" />
15
+ <path d="M3 5V19A9 3 0 0 0 21 19V5" />
16
+ <path d="M3 12A9 3 0 0 0 21 12" />
17
+ </svg>
@@ -0,0 +1,16 @@
1
+ <!-- @license lucide-static v1.21.0 - ISC -->
2
+ <svg
3
+ class="lucide lucide-eye"
4
+ xmlns="http://www.w3.org/2000/svg"
5
+ width="24"
6
+ height="24"
7
+ viewBox="0 0 24 24"
8
+ fill="none"
9
+ stroke="#0a0c10"
10
+ stroke-width="2"
11
+ stroke-linecap="round"
12
+ stroke-linejoin="round"
13
+ >
14
+ <path d="M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0" />
15
+ <circle cx="12" cy="12" r="3" />
16
+ </svg>
@@ -0,0 +1,19 @@
1
+ <!-- @license lucide-static v1.21.0 - ISC -->
2
+ <svg
3
+ class="lucide lucide-file-text"
4
+ xmlns="http://www.w3.org/2000/svg"
5
+ width="24"
6
+ height="24"
7
+ viewBox="0 0 24 24"
8
+ fill="none"
9
+ stroke="#0a0c10"
10
+ stroke-width="2"
11
+ stroke-linecap="round"
12
+ stroke-linejoin="round"
13
+ >
14
+ <path d="M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z" />
15
+ <path d="M14 2v5a1 1 0 0 0 1 1h5" />
16
+ <path d="M10 9H8" />
17
+ <path d="M16 13H8" />
18
+ <path d="M16 17H8" />
19
+ </svg>
@@ -0,0 +1,16 @@
1
+ <!-- @license lucide-static v1.21.0 - ISC -->
2
+ <svg
3
+ class="lucide lucide-gauge"
4
+ xmlns="http://www.w3.org/2000/svg"
5
+ width="24"
6
+ height="24"
7
+ viewBox="0 0 24 24"
8
+ fill="none"
9
+ stroke="#0a0c10"
10
+ stroke-width="2"
11
+ stroke-linecap="round"
12
+ stroke-linejoin="round"
13
+ >
14
+ <path d="m12 14 4-4" />
15
+ <path d="M3.34 19a10 10 0 1 1 17.32 0" />
16
+ </svg>