@geraldmaron/construct 1.1.1 → 1.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +30 -19
- package/bin/construct +487 -87
- package/bin/construct-postinstall.mjs +30 -2
- package/examples/distribution/README.md +42 -0
- package/examples/distribution/manifest.json +53 -0
- package/examples/distribution/sources/adr.md +84 -0
- package/examples/distribution/sources/deck-one-pager.md +65 -0
- package/examples/distribution/sources/prd-platform.md +161 -0
- package/examples/distribution/sources/research-brief.md +80 -0
- package/examples/distribution/sources/rfc-platform.md +82 -0
- package/examples/distribution/sources/runbook.md +103 -0
- package/examples/distribution/sources/strategy.md +88 -0
- package/lib/adapters-sync.mjs +67 -0
- package/lib/artifact-gate-notice.mjs +38 -0
- package/lib/artifact-manifest.mjs +258 -0
- package/lib/artifact-release-gate.mjs +171 -0
- package/lib/artifact-reviewers.mjs +68 -0
- package/lib/artifact-type-from-path.mjs +79 -0
- package/lib/artifact-workflow.mjs +252 -0
- package/lib/audit-skills.mjs +4 -0
- package/lib/audit-specialists.mjs +285 -0
- package/lib/audit-trail.mjs +1 -1
- package/lib/auto-docs.mjs +90 -19
- package/lib/beads/drift.mjs +27 -6
- package/lib/beads-client.mjs +49 -121
- package/lib/beads-optimistic.mjs +5 -12
- package/lib/brand-fonts.mjs +93 -0
- package/lib/brand-prose.mjs +214 -0
- package/lib/brand-tokens.mjs +92 -0
- package/lib/bridges/copilot-proxy.mjs +13 -26
- package/lib/capability-ledger.mjs +156 -0
- package/lib/certification/artifact-fixtures.mjs +132 -0
- package/lib/certification/artifact-gates.mjs +63 -0
- package/lib/certification/artifact-provenance.mjs +97 -0
- package/lib/certification/canonical-scenarios.mjs +78 -0
- package/lib/certification/cli.mjs +191 -0
- package/lib/certification/dashboard-api.mjs +71 -0
- package/lib/certification/demo-parity.mjs +116 -0
- package/lib/certification/document-io-fixtures.mjs +246 -0
- package/lib/certification/document-workflow.mjs +97 -0
- package/lib/certification/eval-bridge.mjs +77 -0
- package/lib/certification/model-routing.mjs +149 -0
- package/lib/certification/prompt-budget.mjs +119 -0
- package/lib/certification/rc-gate.mjs +206 -0
- package/lib/certification/real-llm-scenarios.mjs +303 -0
- package/lib/certification/role-cards.mjs +113 -0
- package/lib/certification/role-overlays.mjs +117 -0
- package/lib/certification/run.mjs +122 -0
- package/lib/certification/runner.mjs +323 -0
- package/lib/certification/scenarios.mjs +51 -0
- package/lib/certification/skill-inventory.mjs +289 -0
- package/lib/certification/skill-scenarios.mjs +147 -0
- package/lib/certification/specialist-contracts.mjs +85 -0
- package/lib/certification/specialist-scenarios.mjs +175 -0
- package/lib/certification/stale-impact.mjs +146 -0
- package/lib/certification/status.mjs +252 -0
- package/lib/certification/store.mjs +77 -0
- package/lib/chat/cli.mjs +333 -0
- package/lib/chat/command-suggest.mjs +161 -0
- package/lib/chat/commands.mjs +215 -0
- package/lib/chat/config.mjs +142 -0
- package/lib/chat/context-compactor.mjs +250 -0
- package/lib/chat/context-continuation.mjs +253 -0
- package/lib/chat/continuation-source.mjs +58 -0
- package/lib/chat/demo-guide.mjs +61 -0
- package/lib/chat/design-tokens.mjs +91 -0
- package/lib/chat/desktop-binary.mjs +79 -0
- package/lib/chat/desktop-build.mjs +130 -0
- package/lib/chat/desktop-launcher.mjs +133 -0
- package/lib/chat/evidence.mjs +145 -0
- package/lib/chat/export.mjs +74 -0
- package/lib/chat/harness/driver.mjs +91 -0
- package/lib/chat/list-picker.mjs +112 -0
- package/lib/chat/model-picker.mjs +356 -0
- package/lib/chat/openrouter-fallback.mjs +151 -0
- package/lib/chat/permission-prompt.mjs +33 -0
- package/lib/chat/picker-catalog.mjs +45 -0
- package/lib/chat/policy-telemetry.mjs +34 -0
- package/lib/chat/present.mjs +246 -0
- package/lib/chat/session-context.mjs +39 -0
- package/lib/chat/session-persist.mjs +73 -0
- package/lib/chat/session-restore.mjs +71 -0
- package/lib/chat/session-settings.mjs +53 -0
- package/lib/chat/system-prompt.mjs +52 -0
- package/lib/chat/transparency.mjs +93 -0
- package/lib/chat/tui/color-scheme.mjs +42 -0
- package/lib/chat/tui/markdown.mjs +123 -0
- package/lib/chat/tui/presentation.mjs +100 -0
- package/lib/chat/tui/render.mjs +500 -0
- package/lib/chat/tui/turn-block.mjs +284 -0
- package/lib/chat/tui/turn-present.mjs +18 -0
- package/lib/chat/tui/turn-state.mjs +88 -0
- package/lib/chat/tui/usage.mjs +122 -0
- package/lib/chat/web-commands.mjs +146 -0
- package/lib/chat/web-launcher.mjs +63 -0
- package/lib/chat/web-picker-keys.mjs +46 -0
- package/lib/chat/web-session.mjs +159 -0
- package/lib/cli-commands.mjs +146 -15
- package/lib/cli-service-inventory.mjs +42 -0
- package/lib/comment-lint.mjs +6 -4
- package/lib/config/intake-policy.mjs +209 -0
- package/lib/config/project-config.mjs +11 -2
- package/lib/config/schema.mjs +86 -6
- package/lib/config/source-targets.mjs +311 -0
- package/lib/contract-schemas/decision.json +50 -0
- package/lib/contract-schemas/implementation.json +51 -0
- package/lib/contract-schemas/review-report.json +32 -0
- package/lib/contract-schemas/test-report.json +43 -0
- package/lib/contracts/construct-handoff.mjs +60 -0
- package/lib/contracts/validate.mjs +32 -3
- package/lib/contracts/violation-log.mjs +58 -5
- package/lib/dashboard-demo.mjs +71 -0
- package/lib/dashboard-static.mjs +19 -5
- package/lib/decisions/registry.mjs +5 -3
- package/lib/deck-export-pptx.mjs +1152 -0
- package/lib/demo-recording.mjs +142 -0
- package/lib/demo-script.mjs +114 -0
- package/lib/demo-surface.mjs +249 -0
- package/lib/demo.mjs +598 -140
- package/lib/diagram-export.mjs +192 -0
- package/lib/diagram.mjs +13 -11
- package/lib/docs-verify.mjs +25 -7
- package/lib/doctor/index.mjs +3 -1
- package/lib/doctor/project-adapters.mjs +44 -0
- package/lib/doctor/source-checkout.mjs +16 -0
- package/lib/doctor/watchers/cx-budget.mjs +98 -0
- package/lib/doctor/watchers/graph-staleness.mjs +52 -0
- package/lib/doctor/watchers/process-pressure.mjs +4 -3
- package/lib/document-export.mjs +384 -38
- package/lib/document-extract.mjs +44 -4
- package/lib/document-ingest.mjs +29 -20
- package/lib/embed/auto-sources.mjs +44 -0
- package/lib/embed/cli.mjs +4 -3
- package/lib/embed/daemon.mjs +18 -46
- package/lib/embed/demand-fetch.mjs +50 -19
- package/lib/embed/inbox.mjs +6 -10
- package/lib/embed/worker.mjs +4 -3
- package/lib/embedded-contract/index.mjs +11 -0
- package/lib/embedded-contract/model-resolve.mjs +10 -9
- package/lib/env-config.mjs +26 -0
- package/lib/evals/dataset.mjs +137 -0
- package/lib/evals/gates.mjs +175 -0
- package/lib/export-branding.mjs +32 -0
- package/lib/graph/build-co-change.mjs +54 -0
- package/lib/graph/build-from-registry.mjs +136 -0
- package/lib/graph/build-import-graph.mjs +153 -0
- package/lib/graph/cli.mjs +110 -0
- package/lib/graph/impact-cli.mjs +89 -0
- package/lib/graph/impact.mjs +108 -0
- package/lib/graph/staleness.mjs +44 -0
- package/lib/graph/store.mjs +172 -0
- package/lib/health-check.mjs +90 -76
- package/lib/hooks/artifact-release-gate.mjs +43 -0
- package/lib/hooks/brand-prose-lint.mjs +38 -0
- package/lib/hooks/graph-impact-advisory.mjs +62 -0
- package/lib/hooks/session-optimize.mjs +84 -207
- package/lib/hooks/session-start.mjs +18 -16
- package/lib/host-disposition.mjs +7 -0
- package/lib/improvement/cli.mjs +189 -0
- package/lib/improvement/controller.mjs +137 -0
- package/lib/improvement/proposal.mjs +120 -0
- package/lib/improvement/specialist-loop.mjs +192 -0
- package/lib/improvement/store.mjs +89 -0
- package/lib/improvement/surface.mjs +219 -0
- package/lib/ingest-tooling.mjs +97 -0
- package/lib/init/doc-lanes.mjs +165 -0
- package/lib/init-docs.mjs +31 -178
- package/lib/init-unified.mjs +50 -119
- package/lib/init-update-guide.mjs +102 -0
- package/lib/init-update.mjs +32 -1
- package/lib/init.mjs +8 -0
- package/lib/install/desktop-binary-download.mjs +85 -0
- package/lib/install/legacy-global-cleanup.mjs +189 -0
- package/lib/intake/constants.mjs +29 -0
- package/lib/intake/daemon.mjs +2 -0
- package/lib/intake/git-queue.mjs +9 -8
- package/lib/intake/intake-config.mjs +52 -105
- package/lib/intake/legacy-paths.mjs +5 -0
- package/lib/intake/queue.mjs +2 -1
- package/lib/intake/session-prelude.mjs +90 -1
- package/lib/libreoffice-export.mjs +97 -0
- package/lib/logging/rotate.mjs +9 -0
- package/lib/maintenance/docker-reclaim.mjs +206 -0
- package/lib/mcp/external-schema-cost.mjs +74 -0
- package/lib/mcp/server.mjs +103 -10
- package/lib/mcp/stdio-mcp-probe.mjs +188 -0
- package/lib/mcp/tool-budget.mjs +55 -4
- package/lib/mcp/tools/document.mjs +18 -4
- package/lib/mcp/tools/embedded-contract.mjs +14 -0
- package/lib/mcp/tools/skills.mjs +32 -3
- package/lib/mcp/tools/workflow.mjs +13 -1
- package/lib/model-free-selector.mjs +18 -0
- package/lib/model-registry.mjs +13 -229
- package/lib/model-router.mjs +373 -92
- package/lib/models/behavior-matrix.mjs +289 -0
- package/lib/models/catalog.mjs +209 -0
- package/lib/models/execution-capability-profile.mjs +196 -0
- package/lib/models/execution-policy.mjs +307 -0
- package/lib/models/provider-poll.mjs +383 -0
- package/lib/npm-spawn-env.mjs +17 -0
- package/lib/ollama/installed-models.mjs +129 -0
- package/lib/oracle/actions.mjs +187 -0
- package/lib/oracle/artifact-gate.mjs +99 -0
- package/lib/oracle/cli.mjs +204 -0
- package/lib/oracle/daemon-entry.mjs +14 -0
- package/lib/oracle/dispatch.mjs +81 -0
- package/lib/oracle/execute.mjs +143 -0
- package/lib/oracle/gaps.mjs +76 -0
- package/lib/oracle/index.mjs +84 -0
- package/lib/oracle/issues.mjs +164 -0
- package/lib/oracle/org-graph.mjs +170 -0
- package/lib/oracle/policy.mjs +80 -0
- package/lib/oracle/read-model.mjs +398 -0
- package/lib/oracle/reconcile.mjs +191 -0
- package/lib/oracle/routing.mjs +89 -0
- package/lib/oracle/synthesize.mjs +384 -0
- package/lib/oracle/verdicts.mjs +51 -0
- package/lib/orchestration/worker.mjs +88 -27
- package/lib/orchestration-policy.mjs +50 -0
- package/lib/parity.mjs +96 -2
- package/lib/playwright-demo.mjs +254 -0
- package/lib/project-init-shared.mjs +4 -1
- package/lib/prompt-composer.js +7 -3
- package/lib/prompt-validation-contract.mjs +24 -0
- package/lib/provider-capabilities.js +57 -11
- package/lib/providers/contract/adapters/confluence/index.mjs +181 -0
- package/lib/providers/contract/adapters/git/index.mjs +115 -0
- package/lib/providers/contract/adapters/github/index.mjs +166 -0
- package/lib/providers/contract/adapters/jira/index.mjs +187 -0
- package/lib/providers/contract/adapters/slack/index.mjs +175 -0
- package/lib/providers/contract/contract-tests.mjs +57 -0
- package/lib/providers/contract/errors.mjs +48 -0
- package/lib/providers/contract/interface.mjs +50 -0
- package/lib/providers/contract/registry.mjs +102 -0
- package/lib/providers/copilot-auth.mjs +297 -0
- package/lib/providers/credential-bootstrap.mjs +178 -0
- package/lib/providers/credential-catalog.mjs +46 -0
- package/lib/providers/credential-sources.mjs +63 -0
- package/lib/providers/creds.mjs +5 -2
- package/lib/providers/op-run.mjs +59 -0
- package/lib/providers/secret-resolver.mjs +159 -0
- package/lib/publish-template.mjs +163 -0
- package/lib/publish-tooling.mjs +119 -0
- package/lib/publish.mjs +305 -0
- package/lib/registry/cli.mjs +82 -0
- package/lib/registry/consolidation.mjs +147 -0
- package/lib/registry/generate-docs.mjs +75 -0
- package/lib/registry/skill-verification.mjs +57 -0
- package/lib/registry/surface-map.mjs +76 -0
- package/lib/registry/validate.mjs +135 -0
- package/lib/resources/budget.mjs +82 -0
- package/lib/resources/process-budget.mjs +45 -0
- package/lib/rules-delivery.mjs +9 -2
- package/lib/rules-read.mjs +26 -0
- package/lib/runtime-env.mjs +23 -0
- package/lib/runtime-pressure.mjs +51 -7
- package/lib/schema-infer.mjs +13 -2
- package/lib/server/chat-loop.mjs +622 -0
- package/lib/server/demo-preview.mjs +63 -0
- package/lib/server/index.mjs +259 -9
- package/lib/server/rate-limit.mjs +5 -3
- package/lib/server/webhook.mjs +3 -2
- package/lib/service-manager.mjs +60 -8
- package/lib/setup.mjs +70 -7
- package/lib/specialists/prompt-schema.mjs +19 -10
- package/lib/specialists/roster.mjs +43 -0
- package/lib/specialists/scaffold.mjs +56 -0
- package/lib/storage/backend.mjs +6 -6
- package/lib/storage/hybrid-query.mjs +7 -4
- package/lib/storage/state-source.mjs +5 -5
- package/lib/storage/sync.mjs +2 -3
- package/lib/telemetry/rule-calls.mjs +52 -0
- package/lib/template-registry.mjs +2 -2
- package/lib/templates/visual-requirements.mjs +27 -51
- package/lib/test-corpus-inventory.mjs +313 -0
- package/lib/uninstall/uninstall.mjs +19 -7
- package/lib/update.mjs +12 -0
- package/lib/upgrade.mjs +14 -0
- package/lib/wireframe.mjs +20 -14
- package/lib/worker/run.mjs +17 -4
- package/lib/worker/trace.mjs +11 -3
- package/package.json +28 -14
- package/personas/construct.md +2 -2
- package/platforms/claude/settings.template.json +36 -0
- package/rules/common/patterns.md +1 -1
- package/rules/common/release-gates.md +4 -3
- package/scripts/sync-specialists.mjs +41 -28
- package/skills/devops/data-engineering.md +1 -1
- package/skills/docs/adr-workflow.md +1 -0
- package/skills/docs/backlog-proposal-workflow.md +1 -0
- package/skills/docs/codebase-research-workflow.md +40 -0
- package/skills/docs/customer-profile-workflow.md +1 -0
- package/skills/docs/document-ingest-workflow.md +1 -0
- package/skills/docs/evidence-ingest-workflow.md +1 -0
- package/skills/docs/init-docs.md +2 -2
- package/skills/docs/init-project.md +7 -2
- package/skills/docs/prd-workflow.md +24 -1
- package/skills/docs/prfaq-workflow.md +1 -0
- package/skills/docs/product-intelligence-workflow.md +1 -0
- package/skills/docs/product-signal-workflow.md +1 -0
- package/skills/docs/research-workflow.md +54 -37
- package/skills/docs/runbook-workflow.md +1 -0
- package/skills/docs/strategy-workflow.md +1 -0
- package/skills/docs/user-research-workflow.md +40 -0
- package/skills/operating/orchestration-reference.md +1 -1
- package/skills/roles/architect.md +5 -0
- package/skills/roles/operator.docs.md +4 -0
- package/skills/routing.md +4 -2
- package/specialists/artifact-manifest.json +489 -0
- package/specialists/artifact-manifest.schema.json +83 -0
- package/specialists/audit-enrichments.json +454 -0
- package/specialists/contracts.json +37 -25
- package/specialists/prompts/_shared/validation-contract.md +26 -0
- package/specialists/prompts/cx-accessibility.md +21 -2
- package/specialists/prompts/cx-ai-engineer.md +24 -1
- package/specialists/prompts/cx-architect.md +4 -1
- package/specialists/prompts/cx-business-strategist.md +23 -2
- package/specialists/prompts/cx-data-analyst.md +22 -1
- package/specialists/prompts/cx-data-engineer.md +23 -2
- package/specialists/prompts/cx-debugger.md +21 -2
- package/specialists/prompts/cx-designer.md +26 -3
- package/specialists/prompts/cx-devil-advocate.md +19 -2
- package/specialists/prompts/cx-docs-keeper.md +28 -1
- package/specialists/prompts/cx-engineer.md +22 -1
- package/specialists/prompts/cx-evaluator.md +18 -1
- package/specialists/prompts/cx-explorer.md +21 -2
- package/specialists/prompts/cx-legal-compliance.md +21 -2
- package/specialists/prompts/cx-operations.md +21 -2
- package/specialists/prompts/cx-oracle.md +94 -0
- package/specialists/prompts/cx-orchestrator.md +20 -1
- package/specialists/prompts/cx-platform-engineer.md +25 -2
- package/specialists/prompts/cx-product-manager.md +32 -1
- package/specialists/prompts/cx-qa.md +24 -2
- package/specialists/prompts/cx-rd-lead.md +23 -2
- package/specialists/prompts/cx-release-manager.md +23 -2
- package/specialists/prompts/cx-researcher.md +22 -2
- package/specialists/prompts/cx-reviewer.md +18 -1
- package/specialists/prompts/cx-security.md +22 -2
- package/specialists/prompts/cx-sre.md +30 -3
- package/specialists/prompts/cx-test-automation.md +7 -1
- package/specialists/prompts/cx-trace-reviewer.md +22 -3
- package/specialists/prompts/cx-ux-researcher.md +21 -2
- package/specialists/registry.json +52 -173
- package/specialists/tone-profiles.json +42 -0
- package/templates/demos/playwright/demo-recording.config.mjs +47 -0
- package/templates/demos/recordings/agentic-platforms-prd.json +19 -0
- package/templates/demos/scripts/agentic-platforms-prd.json +44 -0
- package/templates/demos/specs/_helpers/scroll-artifact.ts +89 -0
- package/templates/demos/tapes/agentic-platforms-prd.tape +49 -0
- package/templates/demos/tapes/resource-guard-rails.tape +49 -0
- package/templates/demos/vhs/construct-cockpit.json +24 -0
- package/templates/distribution/construct-brand.typ +446 -0
- package/templates/distribution/construct-decision.typ +38 -0
- package/templates/distribution/construct-deck.html +95 -0
- package/templates/distribution/construct-pdf.typ +38 -0
- package/templates/distribution/construct-prd.typ +38 -0
- package/templates/distribution/construct-reference.docx +0 -0
- package/templates/distribution/construct-research.typ +38 -0
- package/templates/distribution/construct-web.html +92 -0
- package/templates/distribution/fonts/Geist-Bold.ttf +0 -0
- package/templates/distribution/fonts/Geist-Medium.ttf +0 -0
- package/templates/distribution/fonts/Geist-Regular.ttf +0 -0
- package/templates/distribution/fonts/Geist-SemiBold.ttf +0 -0
- package/templates/distribution/fonts/GeistMono-Medium.ttf +0 -0
- package/templates/distribution/fonts/GeistMono-Regular.ttf +0 -0
- package/templates/distribution/fonts/GeistMono-SemiBold.ttf +0 -0
- package/templates/distribution/fonts/IBMPlexMono-Regular.otf +0 -0
- package/templates/distribution/fonts/JetBrainsMono-Medium.ttf +0 -0
- package/templates/distribution/fonts/JetBrainsMono-Regular.ttf +0 -0
- package/templates/distribution/fonts/JetBrainsMono-SemiBold.ttf +0 -0
- package/templates/distribution/fonts/PlusJakartaSans-Bold.ttf +0 -0
- package/templates/distribution/fonts/PlusJakartaSans-Medium.ttf +0 -0
- package/templates/distribution/fonts/PlusJakartaSans-Regular.ttf +0 -0
- package/templates/distribution/fonts/PlusJakartaSans-SemiBold.ttf +0 -0
- package/templates/distribution/fonts/README.md +36 -0
- package/templates/distribution/fonts/SpaceGrotesk-Variable.ttf +0 -0
- package/templates/distribution/fonts/handwritten/Caveat.ttf +0 -0
- package/templates/distribution/fonts/legacy/IBMPlexMono-Regular.otf +0 -0
- package/templates/distribution/fonts/legacy/Inter-Medium.otf +0 -0
- package/templates/distribution/fonts/legacy/Inter-Regular.otf +0 -0
- package/templates/distribution/fonts/legacy/Inter-SemiBold.otf +0 -0
- package/templates/distribution/fonts/legacy/InterDisplay-SemiBold.otf +0 -0
- package/templates/distribution/fonts/legacy/SourceSerif4-Regular.otf +0 -0
- package/templates/distribution/fonts/legacy/SourceSerif4-Semibold.otf +0 -0
- package/templates/distribution/icons/activity.svg +15 -0
- package/templates/distribution/icons/alert-triangle.svg +17 -0
- package/templates/distribution/icons/book-open.svg +16 -0
- package/templates/distribution/icons/bot.svg +20 -0
- package/templates/distribution/icons/brain.svg +22 -0
- package/templates/distribution/icons/circle-check.svg +16 -0
- package/templates/distribution/icons/clipboard-check.svg +17 -0
- package/templates/distribution/icons/cpu.svg +28 -0
- package/templates/distribution/icons/database.svg +17 -0
- package/templates/distribution/icons/eye.svg +16 -0
- package/templates/distribution/icons/file-text.svg +19 -0
- package/templates/distribution/icons/gauge.svg +16 -0
- package/templates/distribution/icons/git-branch.svg +17 -0
- package/templates/distribution/icons/key.svg +17 -0
- package/templates/distribution/icons/layers.svg +17 -0
- package/templates/distribution/icons/list-checks.svg +19 -0
- package/templates/distribution/icons/lock.svg +16 -0
- package/templates/distribution/icons/message-square.svg +15 -0
- package/templates/distribution/icons/network.svg +19 -0
- package/templates/distribution/icons/route.svg +17 -0
- package/templates/distribution/icons/scale.svg +19 -0
- package/templates/distribution/icons/search.svg +16 -0
- package/templates/distribution/icons/send.svg +16 -0
- package/templates/distribution/icons/server.svg +18 -0
- package/templates/distribution/icons/shield-check.svg +16 -0
- package/templates/distribution/icons/users.svg +18 -0
- package/templates/distribution/icons/webhook.svg +17 -0
- package/templates/distribution/icons/workflow.svg +17 -0
- package/templates/distribution/icons/wrench.svg +15 -0
- package/templates/distribution/run.mjs +18 -1
- package/templates/docs/adr.md +7 -0
- package/templates/docs/construct_guide.md +8 -8
- package/templates/docs/customer-profile.md +4 -0
- package/templates/docs/one-pager.md +4 -0
- package/templates/docs/postmortem.md +31 -0
- package/templates/docs/prd-platform.md +19 -0
- package/templates/docs/prd.md +15 -0
- package/templates/docs/prfaq.md +7 -0
- package/templates/docs/qa-strategy.md +103 -0
- package/templates/docs/research-brief.md +8 -0
- package/templates/docs/rfc-platform.md +12 -0
- package/templates/docs/test-plan.md +7 -0
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* templates/demos/playwright/demo-recording.config.mjs — Playwright config scaffold.
|
|
3
|
+
*
|
|
4
|
+
* Copied to .cx/demos/playwright.config.mjs on `construct demo init`. webServer
|
|
5
|
+
* command/url come from DEMO_WEB_SERVER_* env injected by recordPlaywrightDemo.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { defineConfig, devices } from '@playwright/test';
|
|
9
|
+
import path from 'node:path';
|
|
10
|
+
import { fileURLToPath } from 'node:url';
|
|
11
|
+
|
|
12
|
+
const DEMO_ROOT = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..');
|
|
13
|
+
const DEMO_OUTPUT = process.env.DEMO_OUTPUT_DIR || path.join(DEMO_ROOT, '.cx', 'demos');
|
|
14
|
+
|
|
15
|
+
const webServerCommand = process.env.DEMO_WEB_SERVER_COMMAND;
|
|
16
|
+
const webServerUrl = process.env.DEMO_WEB_SERVER_URL;
|
|
17
|
+
|
|
18
|
+
export default defineConfig({
|
|
19
|
+
testDir: path.join(DEMO_ROOT, '.cx', 'demos', 'specs'),
|
|
20
|
+
timeout: 180_000,
|
|
21
|
+
fullyParallel: false,
|
|
22
|
+
workers: 1,
|
|
23
|
+
reporter: 'list',
|
|
24
|
+
use: {
|
|
25
|
+
baseURL: process.env.BASE_URL || webServerUrl || 'http://127.0.0.1:3456',
|
|
26
|
+
trace: 'off',
|
|
27
|
+
screenshot: 'off',
|
|
28
|
+
video: 'on',
|
|
29
|
+
viewport: { width: 1280, height: 720 },
|
|
30
|
+
},
|
|
31
|
+
projects: [
|
|
32
|
+
{
|
|
33
|
+
name: 'demo-recording',
|
|
34
|
+
use: { ...devices['Desktop Chrome'] },
|
|
35
|
+
},
|
|
36
|
+
],
|
|
37
|
+
outputDir: DEMO_OUTPUT,
|
|
38
|
+
webServer: process.env.SKIP_WEBSERVER || process.env.CHECKLY || !webServerCommand
|
|
39
|
+
? undefined
|
|
40
|
+
: {
|
|
41
|
+
command: webServerCommand,
|
|
42
|
+
url: webServerUrl || process.env.BASE_URL || 'http://127.0.0.1:3456',
|
|
43
|
+
reuseExistingServer: !process.env.CI,
|
|
44
|
+
timeout: Number(process.env.DEMO_WEB_SERVER_TIMEOUT || 120_000),
|
|
45
|
+
cwd: process.env.DEMO_WEB_SERVER_CWD || DEMO_ROOT,
|
|
46
|
+
},
|
|
47
|
+
});
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "agentic-platforms-prd",
|
|
3
|
+
"title": "Publish guardrails — agentic platforms PRD",
|
|
4
|
+
"engine": "playwright",
|
|
5
|
+
"workspace": "apps/dashboard",
|
|
6
|
+
"spec": "apps/dashboard/e2e/demo/agentic-platforms-prd.spec.ts",
|
|
7
|
+
"baseUrl": "http://127.0.0.1:4242",
|
|
8
|
+
"project": "demo-recording",
|
|
9
|
+
"artifactReveal": {
|
|
10
|
+
"mode": "constructPreview",
|
|
11
|
+
"staticDir": ".",
|
|
12
|
+
"file": "prd-platform.pdf",
|
|
13
|
+
"scroll": true
|
|
14
|
+
},
|
|
15
|
+
"output": {
|
|
16
|
+
"format": "mp4",
|
|
17
|
+
"path": ".cx/demos/dashboard/agentic-platforms-prd.mp4"
|
|
18
|
+
}
|
|
19
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "agentic-platforms-prd",
|
|
3
|
+
"title": "Publish guardrails — agentic platforms PRD",
|
|
4
|
+
"summary": "Prove Construct's path: workflow invoke returns a plan only, validate and publish fail on the thin stub, then pass on the golden fixture with styled PDF export.",
|
|
5
|
+
"systemOverlay": "Demo mode for publish guardrails. Run the exact construct CLI commands from each step using shell or construct_tool. Do not hand-author production PRD markdown in chat — the passing artifact is tests/fixtures/publish/golden-prd-platform.md. The stub is tests/fixtures/publish/agentic-platforms-stub.md.",
|
|
6
|
+
"tape": "agentic-platforms-prd",
|
|
7
|
+
"dashboardDemo": "agentic-platforms-prd",
|
|
8
|
+
"fallbackSurface": "tape",
|
|
9
|
+
"artifactReveal": {
|
|
10
|
+
"path": "prd-platform.pdf",
|
|
11
|
+
"scroll": true
|
|
12
|
+
},
|
|
13
|
+
"fixtures": {
|
|
14
|
+
"stub": "tests/fixtures/publish/agentic-platforms-stub.md",
|
|
15
|
+
"golden": "tests/fixtures/publish/golden-prd-platform.md"
|
|
16
|
+
},
|
|
17
|
+
"steps": [
|
|
18
|
+
{
|
|
19
|
+
"title": "Plan only — workflow invoke",
|
|
20
|
+
"prompt": "Run construct workflow invoke for prd-draft and show the specialist chain. This is plan-only — it does not draft the PRD.",
|
|
21
|
+
"command": "node bin/construct workflow invoke --json --workflow-type prd-draft --approval-mode proposal-only --text 'Enterprise agentic platform PRD'"
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
"title": "Release gate FAIL — thin stub",
|
|
25
|
+
"prompt": "Run artifact validate on the stub fixture with type prd-platform. It must fail (structure, visuals, citations).",
|
|
26
|
+
"command": "node bin/construct artifact validate tests/fixtures/publish/agentic-platforms-stub.md --type=prd-platform"
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
"title": "Publish FAIL — gate blocks distribution",
|
|
30
|
+
"prompt": "Run construct publish on the stub with --figures. Publish must exit 2 and block at the release gate.",
|
|
31
|
+
"command": "node bin/construct publish tests/fixtures/publish/agentic-platforms-stub.md --figures"
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
"title": "Golden fixture PASS — validate",
|
|
35
|
+
"prompt": "Run artifact validate on the golden prd-platform fixture. It must pass the release gate.",
|
|
36
|
+
"command": "node bin/construct artifact validate tests/fixtures/publish/golden-prd-platform.md --type=prd-platform"
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
"title": "Publish PASS — styled PDF",
|
|
40
|
+
"prompt": "Publish the golden fixture with --type=prd-platform --figures to .cx/publish/golden-prd-platform.pdf, then confirm the file exists.",
|
|
41
|
+
"command": "node bin/construct publish tests/fixtures/publish/golden-prd-platform.md --type=prd-platform --figures --output .cx/publish/golden-prd-platform.pdf"
|
|
42
|
+
}
|
|
43
|
+
]
|
|
44
|
+
}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* templates/demos/specs/_helpers/scroll-artifact.ts — shared Act 2 scroll helpers.
|
|
3
|
+
*
|
|
4
|
+
* Used by Construct cockpit demos and copied into project .cx/demos/specs/ on init.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import { type Page, expect } from '@playwright/test';
|
|
8
|
+
import fs from 'node:fs';
|
|
9
|
+
import path from 'node:path';
|
|
10
|
+
|
|
11
|
+
type RevealArtifactOpts = {
|
|
12
|
+
file?: string;
|
|
13
|
+
basePath?: string;
|
|
14
|
+
artifactDir?: string;
|
|
15
|
+
mode?: string;
|
|
16
|
+
baseUrl?: string;
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
export async function scrollPdfViewer(page: Page) {
|
|
20
|
+
await page.waitForTimeout(1500);
|
|
21
|
+
const viewer = page.locator('embed[type="application/pdf"], #viewer, pdf-viewer');
|
|
22
|
+
if (await viewer.count()) {
|
|
23
|
+
await viewer.first().click({ timeout: 5000 }).catch(() => page.mouse.click(640, 360));
|
|
24
|
+
} else {
|
|
25
|
+
await page.mouse.click(640, 360);
|
|
26
|
+
}
|
|
27
|
+
await page.waitForTimeout(800);
|
|
28
|
+
|
|
29
|
+
for (let i = 0; i < 8; i += 1) {
|
|
30
|
+
await page.keyboard.press('PageDown');
|
|
31
|
+
await page.waitForTimeout(900);
|
|
32
|
+
}
|
|
33
|
+
await page.waitForTimeout(1500);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export async function scrollPage(page: Page, { steps = 10, delta = 500, pauseMs = 700 } = {}) {
|
|
37
|
+
await page.waitForTimeout(1000);
|
|
38
|
+
for (let i = 0; i < steps; i += 1) {
|
|
39
|
+
await page.mouse.wheel(0, delta);
|
|
40
|
+
await page.waitForTimeout(pauseMs);
|
|
41
|
+
}
|
|
42
|
+
await page.waitForTimeout(1000);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export async function revealArtifact(page: Page, {
|
|
46
|
+
file,
|
|
47
|
+
basePath = '/demo-preview',
|
|
48
|
+
artifactDir = process.env.CONSTRUCT_DEMO_ARTIFACT_DIR || '',
|
|
49
|
+
mode = process.env.DEMO_ARTIFACT_REVEAL_MODE || 'constructPreview',
|
|
50
|
+
baseUrl = process.env.BASE_URL || '',
|
|
51
|
+
}: RevealArtifactOpts = {}) {
|
|
52
|
+
const artifactFile = file || process.env.DEMO_ARTIFACT_FILE || '';
|
|
53
|
+
const dir = artifactDir;
|
|
54
|
+
const artifactPath = dir && artifactFile ? path.join(dir, artifactFile) : '';
|
|
55
|
+
if (!artifactFile || !dir || !fs.existsSync(artifactPath)) {
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
const encoded = encodeURIComponent(artifactFile);
|
|
60
|
+
const url = mode === 'sameOrigin' && baseUrl
|
|
61
|
+
? `${baseUrl.replace(/\/$/, '')}/${encoded}`
|
|
62
|
+
: `${basePath}/${encoded}`;
|
|
63
|
+
|
|
64
|
+
await page.goto(url);
|
|
65
|
+
await page.waitForLoadState('domcontentloaded');
|
|
66
|
+
|
|
67
|
+
let usedPdf = true;
|
|
68
|
+
try {
|
|
69
|
+
await expect(page).toHaveURL(new RegExp(artifactFile.replace('.', '\\.')));
|
|
70
|
+
await scrollPdfViewer(page);
|
|
71
|
+
} catch {
|
|
72
|
+
usedPdf = false;
|
|
73
|
+
const htmlName = artifactFile.replace(/\.pdf$/i, '.html');
|
|
74
|
+
const htmlPath = path.join(dir, htmlName);
|
|
75
|
+
if (!fs.existsSync(htmlPath)) {
|
|
76
|
+
throw new Error(`PDF viewer scroll failed and HTML fallback missing: ${htmlPath}`);
|
|
77
|
+
}
|
|
78
|
+
const htmlUrl = mode === 'sameOrigin' && baseUrl
|
|
79
|
+
? `${baseUrl.replace(/\/$/, '')}/${encodeURIComponent(htmlName)}`
|
|
80
|
+
: `${basePath}/${encodeURIComponent(htmlName)}`;
|
|
81
|
+
await page.goto(htmlUrl);
|
|
82
|
+
await page.waitForLoadState('domcontentloaded');
|
|
83
|
+
await scrollPage(page);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
if (!usedPdf && process.env.CI) {
|
|
87
|
+
throw new Error('PDF viewer automation failed on CI; HTML fallback used — fix PDF scroll selectors');
|
|
88
|
+
}
|
|
89
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
Require node
|
|
2
|
+
Require vhs
|
|
3
|
+
# construct demo: publish guardrails via construct chat cockpit (violet theme)
|
|
4
|
+
Output .cx/demos/agentic-platforms-prd.mp4
|
|
5
|
+
Set FontSize 18
|
|
6
|
+
Set Width 1200
|
|
7
|
+
Set Height 720
|
|
8
|
+
Set Theme {"name":"Construct Cockpit","background":"#0c1018","foreground":"#e8eaed","cursor":"#8b5cf6","cursorAccent":"#0c1018","selection":"#1e1b4b","black":"#0c1018","red":"#e06c75","green":"#98c379","yellow":"#e5c07b","blue":"#8b5cf6","magenta":"#c4b5fd","cyan":"#a78bfa","white":"#e8eaed","brightBlack":"#6b7280","brightRed":"#f87171","brightGreen":"#86efac","brightYellow":"#fbbf24","brightBlue":"#a78bfa","brightMagenta":"#ddd6fe","brightCyan":"#c4b5fd","brightWhite":"#ffffff"}
|
|
9
|
+
Set TypingSpeed 42ms
|
|
10
|
+
|
|
11
|
+
Type "node bin/construct chat --demo=agentic-platforms-prd --plain"
|
|
12
|
+
Sleep 800ms
|
|
13
|
+
Enter
|
|
14
|
+
Sleep 3s
|
|
15
|
+
|
|
16
|
+
Type "/demo steps"
|
|
17
|
+
Sleep 400ms
|
|
18
|
+
Enter
|
|
19
|
+
Sleep 2s
|
|
20
|
+
|
|
21
|
+
Type "/demo next"
|
|
22
|
+
Sleep 400ms
|
|
23
|
+
Enter
|
|
24
|
+
Sleep 2s
|
|
25
|
+
|
|
26
|
+
Type "/demo next"
|
|
27
|
+
Sleep 400ms
|
|
28
|
+
Enter
|
|
29
|
+
Sleep 2s
|
|
30
|
+
|
|
31
|
+
Type "/demo next"
|
|
32
|
+
Sleep 400ms
|
|
33
|
+
Enter
|
|
34
|
+
Sleep 2s
|
|
35
|
+
|
|
36
|
+
Type "/demo next"
|
|
37
|
+
Sleep 400ms
|
|
38
|
+
Enter
|
|
39
|
+
Sleep 2s
|
|
40
|
+
|
|
41
|
+
Type "/demo next"
|
|
42
|
+
Sleep 400ms
|
|
43
|
+
Enter
|
|
44
|
+
Sleep 2s
|
|
45
|
+
|
|
46
|
+
Type "/exit"
|
|
47
|
+
Sleep 400ms
|
|
48
|
+
Enter
|
|
49
|
+
Sleep 1s
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
Require node
|
|
2
|
+
Require vhs
|
|
3
|
+
# construct demo: resource guard rails — disk budget walkthrough
|
|
4
|
+
Output .cx/demos/resource-guard-rails.mp4
|
|
5
|
+
Set FontSize 18
|
|
6
|
+
Set Width 1200
|
|
7
|
+
Set Height 680
|
|
8
|
+
Set Theme "Dracula"
|
|
9
|
+
Set TypingSpeed 55ms
|
|
10
|
+
|
|
11
|
+
Type "# 1) Show .cx/ usage vs cap in doctor"
|
|
12
|
+
Sleep 400ms
|
|
13
|
+
Enter
|
|
14
|
+
Sleep 800ms
|
|
15
|
+
|
|
16
|
+
Type "node bin/construct doctor 2>&1 | tail -25"
|
|
17
|
+
Sleep 400ms
|
|
18
|
+
Enter
|
|
19
|
+
Sleep 3s
|
|
20
|
+
|
|
21
|
+
Type "# 2) Preview retention prune (dry-run)"
|
|
22
|
+
Sleep 400ms
|
|
23
|
+
Enter
|
|
24
|
+
Sleep 800ms
|
|
25
|
+
|
|
26
|
+
Type "node bin/construct prune --dry-run"
|
|
27
|
+
Sleep 400ms
|
|
28
|
+
Enter
|
|
29
|
+
Sleep 2s
|
|
30
|
+
|
|
31
|
+
Type "# 3) Run resource budget functional test"
|
|
32
|
+
Sleep 400ms
|
|
33
|
+
Enter
|
|
34
|
+
Sleep 800ms
|
|
35
|
+
|
|
36
|
+
Type "node --test tests/functional/resource-write-guard.functional.test.mjs"
|
|
37
|
+
Sleep 400ms
|
|
38
|
+
Enter
|
|
39
|
+
Sleep 3s
|
|
40
|
+
|
|
41
|
+
Type "# 4) User-scope cleanup (logs + pressure)"
|
|
42
|
+
Sleep 400ms
|
|
43
|
+
Enter
|
|
44
|
+
Sleep 800ms
|
|
45
|
+
|
|
46
|
+
Type "node bin/construct cleanup --disk-only --dry-run"
|
|
47
|
+
Sleep 400ms
|
|
48
|
+
Enter
|
|
49
|
+
Sleep 2s
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "Construct Cockpit",
|
|
3
|
+
"background": "#0a0c10",
|
|
4
|
+
"foreground": "#e8eaed",
|
|
5
|
+
"cursor": "#ffffff",
|
|
6
|
+
"cursorAccent": "#0a0c10",
|
|
7
|
+
"selection": "#23272e",
|
|
8
|
+
"black": "#0a0c10",
|
|
9
|
+
"red": "#e06c75",
|
|
10
|
+
"green": "#98c379",
|
|
11
|
+
"yellow": "#e5c07b",
|
|
12
|
+
"blue": "#8a93a3",
|
|
13
|
+
"magenta": "#b8bec8",
|
|
14
|
+
"cyan": "#aab2bd",
|
|
15
|
+
"white": "#e8eaed",
|
|
16
|
+
"brightBlack": "#565c66",
|
|
17
|
+
"brightRed": "#f87171",
|
|
18
|
+
"brightGreen": "#86efac",
|
|
19
|
+
"brightYellow": "#fbbf24",
|
|
20
|
+
"brightBlue": "#cdd0d6",
|
|
21
|
+
"brightMagenta": "#e3e4e8",
|
|
22
|
+
"brightCyan": "#d6dae0",
|
|
23
|
+
"brightWhite": "#ffffff"
|
|
24
|
+
}
|