@polymorphism-tech/morph-spec 8.47.0 → 9.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CLAUDE.md +51 -43
- package/README.md +39 -38
- package/bin/morph-spec.js +41 -113
- package/bin/validate.js +1 -147
- package/claude-plugin.json +1 -1
- package/docs/CHEATSHEET.md +1 -1
- package/docs/QUICKSTART.md +1 -1
- package/framework/CLAUDE.md +41 -101
- package/framework/MORPH.md +95 -252
- package/framework/agents.json +86 -21
- package/framework/commands/morph-apply.md +5 -28
- package/framework/commands/morph-archive.md +1 -1
- package/framework/commands/morph-hotfix.md +8 -8
- package/framework/commands/morph-infra.md +1 -1
- package/framework/commands/morph-preflight.md +2 -3
- package/framework/commands/morph-status.md +4 -4
- package/framework/docs/CLI.md +574 -286
- package/framework/evals/review-checklist.md +82 -41
- package/framework/hooks/README.md +10 -11
- package/framework/hooks/claude-code/core/block-destructive-worktree-removal.js +6 -49
- package/framework/hooks/claude-code/core/block-raw-worktree-add.js +2 -35
- package/framework/hooks/claude-code/core/chain.js +4 -65
- package/framework/hooks/claude-code/core/comment-guard.js +3 -17
- package/framework/hooks/claude-code/core/denylist.json +33 -3
- package/framework/hooks/claude-code/core/enforce-phase-writes.js +15 -63
- package/framework/hooks/claude-code/core/gate-guard.js +9 -78
- package/framework/hooks/claude-code/core/graph-refresh-kick.js +3 -24
- package/framework/hooks/claude-code/core/heavy-gate.js +3 -21
- package/framework/hooks/claude-code/core/heavy-release.js +2 -13
- package/framework/hooks/claude-code/core/loop-detect.js +2 -31
- package/framework/hooks/claude-code/core/pre-bash-denylist.js +36 -2
- package/framework/hooks/claude-code/core/protect-spec-files.js +25 -297
- package/framework/hooks/claude-code/core/state-sync.js +15 -85
- package/framework/hooks/claude-code/core/telemetry-log.js +15 -96
- package/framework/hooks/claude-code/core/validate-completion.js +37 -147
- package/framework/hooks/claude-code/core/warn-bash-source-write.js +23 -0
- package/framework/hooks/claude-code/core/worktree-context.js +15 -114
- package/framework/hooks/claude-code/core/worktree-create.js +6 -70
- package/framework/hooks/claude-code/core/worktree-env-inject.js +5 -56
- package/framework/hooks/claude-code/core/worktree-remove.js +5 -31
- package/framework/hooks/claude-code/statusline.py +55 -41
- package/framework/hooks/package.json +3 -0
- package/framework/hooks/shared/activity-logger.js +9 -89
- package/framework/hooks/shared/agent-reap.js +2 -17
- package/framework/hooks/shared/build-check.js +11 -76
- package/framework/hooks/shared/claim-registry.js +9 -119
- package/framework/hooks/shared/command-tokens.js +168 -44
- package/framework/hooks/shared/comment-rules.js +5 -20
- package/framework/hooks/shared/comment-scanner.js +11 -43
- package/framework/hooks/shared/comment-stripper.js +11 -85
- package/framework/hooks/shared/e2e-check.js +0 -0
- package/framework/hooks/shared/errata.js +59 -0
- package/framework/hooks/shared/feature-locator.js +11 -95
- package/framework/hooks/shared/frontend-locations.js +4 -0
- package/framework/hooks/shared/gate-question.js +12 -0
- package/framework/hooks/shared/git-exclude.js +3 -20
- package/framework/hooks/shared/git-paths.js +8 -104
- package/framework/hooks/shared/graph-freshness.js +22 -166
- package/framework/hooks/shared/graph-refresh.js +21 -149
- package/framework/hooks/shared/heavy-command.js +4 -12
- package/framework/hooks/shared/hook-response.js +8 -83
- package/framework/hooks/shared/morph-cli.js +8 -52
- package/framework/hooks/shared/payload-utils.js +10 -132
- package/framework/hooks/shared/phase-utils.js +14 -72
- package/framework/hooks/shared/redact-secrets.js +4 -15
- package/framework/hooks/shared/reparse-scan.js +6 -66
- package/framework/hooks/shared/slice-progress.js +99 -0
- package/framework/hooks/shared/source-files.js +4 -17
- package/framework/hooks/shared/spawn-command.js +23 -0
- package/framework/hooks/shared/state-reader.js +51 -247
- package/framework/hooks/shared/state-writer.js +9 -54
- package/framework/hooks/shared/stdin-reader.js +1 -11
- package/framework/hooks/shared/telemetry-logger.js +7 -67
- package/framework/hooks/shared/transcript-usage.js +7 -29
- package/framework/hooks/shared/worktree-root.js +7 -29
- package/framework/mcp/registry.json +3 -4
- package/framework/phases.json +23 -39
- package/framework/rules/csharp-standards.md +1 -1
- package/framework/rules/frontend-standards.md +1 -0
- package/framework/rules/hangfire-standards.md +1 -1
- package/framework/rules/neon-standards.md +1 -1
- package/framework/schemas/config.schema.json +14 -9
- package/framework/schemas/feature.schema.json +15 -50
- package/framework/skills/README.md +3 -4
- package/framework/skills/core/create-umbraco-lp/SKILL.md +1 -1
- package/framework/skills/core/migrate-lp-to-umbraco/SKILL.md +1 -1
- package/framework/skills/core/morph-apply/SKILL.md +149 -222
- package/framework/skills/core/morph-hotfix/SKILL.md +33 -42
- package/framework/skills/core/morph-machine/SKILL.md +2 -2
- package/framework/skills/core/morph-media/SKILL.md +1 -1
- package/framework/skills/core/morph-plan/SKILL.md +137 -299
- package/framework/skills/core/morph-review/SKILL.md +111 -136
- package/framework/skills/core/morph-standards/SKILL.md +27 -39
- package/framework/skills/core/morph-uiux/SKILL.md +94 -152
- package/framework/standards/STANDARDS.json +109 -1219
- package/framework/standards/STANDARDS.meta.json +1319 -0
- package/framework/standards/ai-agents/agent-archetypes.md +2 -2
- package/framework/standards/ai-agents/agent-session.md +1 -1
- package/framework/standards/ai-agents/conversational-agent-with-phases.md +4 -4
- package/framework/standards/ai-agents/durable-workflows-hitl.md +3 -3
- package/framework/standards/ai-agents/evals-with-cache.md +1 -2
- package/framework/standards/ai-agents/guardrails.md +1 -1
- package/framework/standards/ai-agents/multi-agent-patterns.md +2 -2
- package/framework/standards/ai-agents/observability-patterns.md +1 -1
- package/framework/standards/ai-agents/production.md +1 -1
- package/framework/standards/ai-agents/prompt-sources.md +2 -2
- package/framework/standards/ai-agents/providers/model-registry.md +1 -1
- package/framework/standards/ai-agents/rag-custom-pgvector.md +2 -2
- package/framework/standards/ai-agents/setup.md +3 -3
- package/framework/standards/ai-agents/sweet-spot.md +2 -2
- package/framework/standards/ai-agents/tool-adapters.md +0 -2
- package/framework/standards/ai-agents/vector-data-extensions.md +4 -4
- package/framework/standards/ai-agents/workflows.md +1 -1
- package/framework/standards/architecture/code-comments.md +7 -7
- package/framework/standards/architecture/vertical-slice/vertical-slice.md +1 -1
- package/framework/standards/backend/api/validation.md +1 -1
- package/framework/standards/backend/dotnet/vsa-handler-patterns.md +5 -5
- package/framework/standards/backend/integrations/hangfire/hangfire-jobs.md +1 -1
- package/framework/standards/backend/integrations/neon-auth/neon-auth.md +2 -2
- package/framework/standards/data/nosql/cache/redis.md +1 -1
- package/framework/standards/data/nosql/cosmos-db.md +3 -3
- package/framework/standards/frontend/admin-app/forms.md +1 -1
- package/framework/standards/frontend/design-system/art-direction.md +88 -0
- package/framework/standards/frontend/design-system/premium-finish.md +77 -2
- package/framework/standards/infrastructure/neon/neon-pgvector.md +5 -5
- package/framework/standards/integration/mcp/mcp-tools.md +7 -7
- package/framework/templates/CLAUDE.md.core.template +3 -3
- package/framework/templates/README.md +2 -3
- package/framework/templates/REGISTRY.json +15 -179
- package/framework/templates/docs/plan.md +72 -0
- package/framework/templates/docs/ui-mockups.md +4 -0
- package/framework/templates/dotnet/ai-kit/README.md +1 -9
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/Morph.AiKit.Tests.csproj +0 -10
- package/framework/templates/meta-prompts/squad-leaders/backend-squad.md +1 -1
- package/framework/templates/meta-prompts/squad-leaders/frontend-squad.md +1 -1
- package/framework/templates/meta-prompts/squad-leaders/squad-leader.md +1 -1
- package/framework/templates/meta-prompts/validators/pre-commit-validator.md +3 -4
- package/package.json +1 -1
- package/src/commands/context/context-refresh.js +0 -16
- package/src/commands/dashboard/dashboard.js +2 -8
- package/src/commands/e2e/e2e.js +18 -105
- package/src/commands/graph/affected.js +0 -14
- package/src/commands/graph/build.js +11 -50
- package/src/commands/graph/explain.js +0 -16
- package/src/commands/graph/status.js +1 -12
- package/src/commands/mcp/mcp-setup.js +4 -62
- package/src/commands/observability/cost.js +17 -111
- package/src/commands/observability/telemetry.js +1 -14
- package/src/commands/project/branch.js +4 -45
- package/src/commands/project/claim.js +4 -48
- package/src/commands/project/doctor-procs.js +1 -1
- package/src/commands/project/doctor.js +53 -307
- package/src/commands/project/env.js +1 -27
- package/src/commands/project/fleet.js +6 -35
- package/src/commands/project/heavy.js +3 -3
- package/src/commands/project/init.js +8 -68
- package/src/commands/project/install-plugin-cmd.js +0 -1
- package/src/commands/project/setup-infra-cmd.js +2 -1
- package/src/commands/project/stack-scan.js +58 -0
- package/src/commands/project/standards.js +65 -72
- package/src/commands/project/status.js +28 -121
- package/src/commands/project/update.js +31 -223
- package/src/commands/project/worktree.js +109 -883
- package/src/commands/scaffold/scaffold.js +0 -25
- package/src/commands/state/advance.js +65 -120
- package/src/commands/state/approve.js +87 -229
- package/src/commands/state/archive.js +23 -139
- package/src/commands/state/auto-approval.js +65 -0
- package/src/commands/state/create.js +49 -109
- package/src/commands/state/delete.js +11 -63
- package/src/commands/state/finish.js +105 -494
- package/src/commands/state/gate-check.js +74 -183
- package/src/commands/state/gate-decision.js +8 -42
- package/src/commands/state/handoff.js +4 -31
- package/src/commands/state/list.js +21 -91
- package/src/commands/state/report-check.js +134 -338
- package/src/commands/state/retype.js +12 -28
- package/src/commands/validation/index.js +0 -3
- package/src/commands/validation/mutate.js +79 -19
- package/src/commands/validation/plan-check.js +81 -0
- package/src/commands/validation/validate-feature.js +52 -216
- package/src/commands/validation/verify.js +45 -160
- package/src/core/paths/output-schema.js +9 -155
- package/src/core/state/feature-identity.js +1 -25
- package/src/core/state/gate-order.js +2 -30
- package/src/core/state/lifecycle-audit.js +8 -100
- package/src/core/state/state-manager.js +32 -395
- package/src/core/templates/template-registry.js +2 -97
- package/src/core/templates/template-renderer.js +13 -93
- package/src/core/templates/template-seed.js +21 -0
- package/src/core/work-types.js +10 -45
- package/src/dashboard/app/App.jsx +1 -8
- package/src/dashboard/app/components/ActivityFeed.jsx +2 -8
- package/src/dashboard/app/components/CommandPalette.jsx +4 -11
- package/src/dashboard/app/components/DetailPanel.jsx +1 -5
- package/src/dashboard/app/components/EntityLink.jsx +0 -12
- package/src/dashboard/app/components/ErrorBoundary.jsx +1 -8
- package/src/dashboard/app/components/KnowledgeMarkdown.jsx +0 -11
- package/src/dashboard/app/components/Markdown.jsx +0 -9
- package/src/dashboard/app/components/PhaseRail.jsx +0 -11
- package/src/dashboard/app/components/SearchFilter.jsx +0 -4
- package/src/dashboard/app/components/Sidebar.jsx +0 -5
- package/src/dashboard/app/hooks/useMorphQuery.js +1 -11
- package/src/dashboard/app/hooks/usePref.js +1 -5
- package/src/dashboard/app/lib/format.js +0 -2
- package/src/dashboard/app/lib/phases.js +3 -9
- package/src/dashboard/app/lib/project.js +0 -12
- package/src/dashboard/app/pages/Activity.jsx +1 -1
- package/src/dashboard/app/pages/AgentMap.jsx +1 -8
- package/src/dashboard/app/pages/FeatureDetail.jsx +139 -133
- package/src/dashboard/app/pages/Features.jsx +9 -16
- package/src/dashboard/app/pages/Guide.jsx +2 -3
- package/src/dashboard/app/pages/HookInspector.jsx +2 -23
- package/src/dashboard/app/pages/PhasePipeline.jsx +3 -7
- package/src/dashboard/app/pages/Portfolio.jsx +0 -1
- package/src/dashboard/app/pages/RulesMap.jsx +1 -16
- package/src/dashboard/app/pages/SkillsLibrary.jsx +1 -16
- package/src/dashboard/app/pages/Standards.jsx +2 -17
- package/src/dashboard/scanner/activity-scanner.js +14 -83
- package/src/dashboard/scanner/agents-scanner.js +1 -23
- package/src/dashboard/scanner/docs-scanner.js +1 -7
- package/src/dashboard/scanner/feature-status.js +2 -5
- package/src/dashboard/scanner/features-scanner.js +92 -113
- package/src/dashboard/scanner/hooks-scanner.js +5 -28
- package/src/dashboard/scanner/index.js +0 -4
- package/src/dashboard/scanner/portfolio.js +5 -29
- package/src/dashboard/scanner/project-api.js +8 -54
- package/src/dashboard/scanner/rules-scanner.js +1 -2
- package/src/dashboard/scanner/skills-scanner.js +2 -12
- package/src/dashboard/scanner/standards-scanner.js +4 -7
- package/src/dashboard/vite-plugin-morph-data.js +5 -19
- package/src/lib/ai/ai-checks.js +7 -52
- package/src/lib/ai/ai-project-scan.js +14 -108
- package/src/lib/ai/code-audit.js +7 -63
- package/src/lib/ai/pin-drift.js +8 -51
- package/src/lib/ai/registry-audit.js +11 -90
- package/src/lib/ci/ci-verify.js +14 -13
- package/src/lib/ci/github-ci.js +9 -37
- package/src/lib/ci/workflow-scaffold.js +2 -10
- package/src/lib/detectors/claude-config-detector.js +13 -74
- package/src/lib/detectors/index.js +8 -59
- package/src/lib/e2e/compose-env.js +5 -66
- package/src/lib/e2e/stack-teardown.js +6 -40
- package/src/lib/generators/architecture-scanner.js +18 -156
- package/src/lib/generators/handoff-generator.js +37 -112
- package/src/lib/generators/scaffold-generator.js +5 -101
- package/src/lib/generators/settings-generator.js +11 -122
- package/src/lib/git/branch-classifier.js +11 -84
- package/src/lib/git/default-branch.js +14 -169
- package/src/lib/git/evidence-staleness.js +2 -1
- package/src/lib/git/gh.js +2 -17
- package/src/lib/git/pending-prs.js +6 -37
- package/src/lib/git/pr-files.js +3 -28
- package/src/lib/git/pr-index.js +3 -34
- package/src/lib/git/tree-fingerprint.js +17 -17
- package/src/lib/git/tree-state.js +6 -33
- package/src/lib/graph/god-nodes.js +2 -22
- package/src/lib/graph/graph-health.js +3 -24
- package/src/lib/graph/graph-loader.js +5 -56
- package/src/lib/graph/graphify-runtime.js +7 -37
- package/src/lib/graph/graphifyignore.js +8 -74
- package/src/lib/graph/sanitize.js +16 -136
- package/src/lib/heavy/cleanup.js +2 -6
- package/src/lib/installers/effects.js +8 -93
- package/src/lib/installers/mcp-installer.js +9 -169
- package/src/lib/installers/memory-installer.js +8 -33
- package/src/lib/installers/templates-reconcile.js +5 -60
- package/src/lib/mutation/commands.js +3 -2
- package/src/lib/mutation/dotnet-introspection.js +281 -0
- package/src/lib/mutation/plan.js +14 -6
- package/src/lib/mutation/runner.js +1 -1
- package/src/lib/mutation/subset.js +47 -13
- package/src/lib/plan/artifact-vocabulary.js +40 -0
- package/src/lib/plan/checks.js +208 -0
- package/src/lib/plan/plan-parser.js +204 -0
- package/src/lib/plan/plan-template.js +18 -0
- package/src/lib/projects/registry.js +7 -44
- package/src/lib/review-reports.js +204 -0
- package/src/lib/risk-detector.js +131 -274
- package/src/lib/specs/adr-index.js +38 -85
- package/src/lib/specs/design-seed.js +18 -0
- package/src/lib/specs/frontmatter.js +31 -0
- package/src/lib/specs/gfm-table.js +11 -0
- package/src/lib/specs/revocations.js +31 -102
- package/src/lib/specs/screen-checklist.js +56 -132
- package/src/lib/stack/dotnet-build-ignores.js +43 -0
- package/src/lib/stack/stack-profile.js +1 -28
- package/src/lib/stack/stack-scan.js +260 -0
- package/src/lib/stack-filter.js +4 -27
- package/src/lib/standards/registry.js +37 -0
- package/src/lib/standards/sections.js +47 -0
- package/src/lib/standards/verified-against.js +19 -191
- package/src/lib/tasks/eval-node.js +23 -179
- package/src/lib/tasks/linux-runner.js +18 -142
- package/src/lib/tasks/test-nodes.js +43 -313
- package/src/lib/tasks/test-runner.js +107 -447
- package/src/lib/telemetry/metrics.js +13 -103
- package/src/lib/telemetry/telemetry-reader.js +13 -238
- package/src/lib/telemetry/verify-event.js +4 -34
- package/src/lib/validators/code-budget/code-budget-validator.js +4 -44
- package/src/lib/validators/code-budget/index.js +0 -7
- package/src/lib/validators/contracts/contract-compliance-validator.js +4 -26
- package/src/lib/validators/contracts/index.js +0 -6
- package/src/lib/validators/nextjs/index.js +0 -5
- package/src/lib/validators/nextjs/next-component-validator.js +4 -81
- package/src/lib/validators/packages/index.js +0 -6
- package/src/lib/validators/packages/package-validator.js +6 -56
- package/src/lib/validators/reuse/index.js +0 -8
- package/src/lib/validators/reuse/reuse-validator.js +24 -137
- package/src/lib/validators/reuse/symbol-scanner.js +6 -62
- package/src/lib/validators/traceability-check.js +54 -156
- package/src/lib/validators/validation-runner.js +20 -125
- package/src/lib/validators/verify-runner.js +152 -575
- package/src/lib/work-type-detector.js +5 -67
- package/src/lib/worktree/docker-audit.js +17 -137
- package/src/lib/worktree/env-allocator.js +10 -98
- package/src/lib/worktree/feature-truth.js +12 -115
- package/src/lib/worktree/finish-backup.js +32 -242
- package/src/lib/worktree/fleet-scanner.js +31 -126
- package/src/lib/worktree/ignored-triage.js +15 -91
- package/src/lib/worktree/vscode-settings.js +2 -3
- package/src/lib/worktree/worktree-audit.js +21 -213
- package/src/lib/worktree/worktree-include.js +3 -5
- package/src/scripts/global-install.js +3 -9
- package/src/scripts/install-plugin.js +1 -13
- package/src/scripts/setup-infra.js +17 -138
- package/src/utils/agents-installer.js +92 -272
- package/src/utils/banner.js +4 -25
- package/src/utils/claude-md-injector.js +1 -37
- package/src/utils/claude-settings-manager.js +1 -87
- package/src/utils/file-copier.js +32 -90
- package/src/utils/hooks-installer.js +26 -296
- package/src/utils/skills-installer.js +4 -102
- package/src/utils/version-checker.js +4 -83
- package/framework/commands/morph-proposal.md +0 -57
- package/framework/evals/trace-schema.md +0 -67
- package/framework/hooks/claude-code/core/tasks-json-guard.js +0 -83
- package/framework/hooks/claude-code/core/trace-autogen.js +0 -277
- package/framework/hooks/git/pre-commit/specs.sh +0 -50
- package/framework/hooks/shared/tasks-validator.js +0 -111
- package/framework/rules/morph-task-tracking.md +0 -54
- package/framework/rules/morph-workflow.md +0 -244
- package/framework/schemas/tasks.schema.json +0 -79
- package/framework/skills/core/morph-brainstorming/SKILL.md +0 -161
- package/framework/skills/core/morph-implement/SKILL.md +0 -194
- package/framework/skills/core/morph-proposal/SKILL.md +0 -152
- package/framework/skills/core/morph-stack-scan/SKILL.md +0 -145
- package/framework/templates/docs/proposal.md +0 -192
- package/framework/templates/docs/spec.md +0 -57
- package/framework/templates/docs/ui-components.md +0 -52
- package/framework/templates/docs/ui-design-system.md +0 -76
- package/framework/templates/docs/ui-flows.md +0 -167
- package/framework/templates/examples/spec-examples.md +0 -91
- package/framework/templates/feature/decisions.md +0 -124
- package/framework/templates/feature/recap.md +0 -145
- package/framework/templates/tasks.template.json +0 -17
- package/src/commands/state/usecase.js +0 -143
- package/src/commands/tasks/dag.js +0 -181
- package/src/commands/utils/index.js +0 -3
- package/src/lib/agents/output-collector.js +0 -76
- package/src/lib/detectors/design-system-detector.js +0 -188
- package/src/lib/evaluator-report.js +0 -104
- package/src/lib/generators/design-system-generator.js +0 -508
- package/src/lib/specs/acervo-format.js +0 -70
- package/src/lib/specs/acervo-lifecycle.js +0 -264
- package/src/lib/specs/done-criteria-check.js +0 -200
- package/src/lib/specs/usecase-check.js +0 -301
- package/src/lib/specs/usecase-promoter.js +0 -301
- package/src/lib/specs/usecase-registry.js +0 -237
- package/src/lib/tasks/dispatch-planner.js +0 -319
- package/src/lib/tasks/dotnet-test-introspection.js +0 -632
- package/src/lib/tasks/mermaid-renderer.js +0 -132
- package/src/lib/tasks/task-classifier.js +0 -30
- package/src/lib/tasks/task-parser.js +0 -209
- package/src/lib/tasks/tasks-json-parser.js +0 -296
- package/src/lib/tasks/test-scope.js +0 -597
- package/src/utils/agent-id-mapper.js +0 -11
|
@@ -3,9 +3,9 @@
|
|
|
3
3
|
> **Scope:** frontend-design-system
|
|
4
4
|
> **Layer:** 3
|
|
5
5
|
> **Keywords:** premium, polish, typography, film grain, atmosphere, load-in, scrim, legibility over video, accent
|
|
6
|
-
> **Load When:** ui-designer active, or the brief asks for a premium or high-end feel
|
|
6
|
+
> **Load When:** ui-designer active (every surface), or the brief asks for a premium or high-end feel
|
|
7
7
|
|
|
8
|
-
**Verified against:** Production landing pages, CSS-only techniques, no runtime dependency. Last-verified: 2026-
|
|
8
|
+
**Verified against:** Production landing pages, CSS-only techniques, no runtime dependency; app patterns from an approved login prototype (2026-10-06). Last-verified: 2026-10-06.
|
|
9
9
|
|
|
10
10
|
---
|
|
11
11
|
|
|
@@ -148,6 +148,78 @@ Finish with fresh eyes: open the page as if you were the client. Whatever looks
|
|
|
148
148
|
|
|
149
149
|
---
|
|
150
150
|
|
|
151
|
+
## Section 8: Patterns For App Screens
|
|
152
|
+
|
|
153
|
+
The finish is not only for marketing pages. Login, onboarding, the first screen after sign-up, an empty state and a success moment are brand moments inside the product, and a data screen also has to look designed: elegant density, illustrated empty states, skeletons with shimmer, transitions between states. These patterns come from an app login that was approved on first sight after a plain one was rejected.
|
|
154
|
+
|
|
155
|
+
### Bottom sheet on mobile
|
|
156
|
+
|
|
157
|
+
On a phone the form lives in a sheet anchored to the bottom, inside the thumb zone, with the brand scene above it. Never the desktop card centered and shrunk.
|
|
158
|
+
|
|
159
|
+
```css
|
|
160
|
+
.sheet {
|
|
161
|
+
position: fixed; inset: auto 0 0 0;
|
|
162
|
+
padding: 12px 20px calc(20px + env(safe-area-inset-bottom));
|
|
163
|
+
border-radius: 24px 24px 0 0;
|
|
164
|
+
background: var(--surface);
|
|
165
|
+
box-shadow: 0 -12px 40px color-mix(in oklab, var(--brand) 18%, transparent);
|
|
166
|
+
}
|
|
167
|
+
.sheet::before {
|
|
168
|
+
content: ''; display: block; width: 36px; height: 4px; margin: 0 auto 16px;
|
|
169
|
+
border-radius: 2px; background: var(--border);
|
|
170
|
+
}
|
|
171
|
+
.sheet button, .sheet input { min-height: 44px; }
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
### Stories-style progress
|
|
175
|
+
|
|
176
|
+
A sequence of scenes reads like stories: thin segmented bars at the top, each filling while its scene is on. One keyframe, the delay per segment, and the scene swap keyed to the same delays.
|
|
177
|
+
|
|
178
|
+
```css
|
|
179
|
+
.stories { display: flex; gap: 4px; }
|
|
180
|
+
.stories span { flex: 1; height: 3px; border-radius: 2px; background: color-mix(in oklab, var(--fg) 20%, transparent); overflow: hidden; }
|
|
181
|
+
.stories span::after {
|
|
182
|
+
content: ''; display: block; height: 100%; background: var(--fg);
|
|
183
|
+
transform: scaleX(0); transform-origin: left;
|
|
184
|
+
animation: fill var(--beat) linear forwards;
|
|
185
|
+
animation-delay: calc(var(--i) * var(--beat));
|
|
186
|
+
}
|
|
187
|
+
@keyframes fill { to { transform: scaleX(1); } }
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
### Synchronized highlight by `animation-delay`
|
|
191
|
+
|
|
192
|
+
When a scene card lights up while its story bar runs, both share `--i` and `--beat`. No JavaScript timer: the browser keeps them in step, and pausing is one `animation-play-state: paused` on the parent.
|
|
193
|
+
|
|
194
|
+
### Scene cards without real data
|
|
195
|
+
|
|
196
|
+
A card that illustrates the product cycle shows shapes, icons and labels, never a metric. A made-up number on a real screen reads as a real number ("R$ 12.430 recovered") and becomes a claim nobody can back. Use bars without values, avatars without names, a check without a count.
|
|
197
|
+
|
|
198
|
+
### Dot grid faded with `mask-image`
|
|
199
|
+
|
|
200
|
+
Texture for a hero or a sheet backdrop, cheaper than an image and on brand:
|
|
201
|
+
|
|
202
|
+
```css
|
|
203
|
+
.dots {
|
|
204
|
+
background-image: radial-gradient(color-mix(in oklab, var(--fg) 22%, transparent) 1px, transparent 1px);
|
|
205
|
+
background-size: 16px 16px;
|
|
206
|
+
mask-image: radial-gradient(ellipse at 50% 30%, #000 30%, transparent 75%);
|
|
207
|
+
}
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
### Static version for reduced motion
|
|
211
|
+
|
|
212
|
+
`prefers-reduced-motion: reduce` gets a composed still frame (the best scene, every bar full, the highlight on), not the first frame of a stopped animation.
|
|
213
|
+
|
|
214
|
+
```css
|
|
215
|
+
@media (prefers-reduced-motion: reduce) {
|
|
216
|
+
.stories span::after { animation: none; transform: scaleX(1); }
|
|
217
|
+
.scene { animation: none; opacity: 1; }
|
|
218
|
+
}
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
---
|
|
222
|
+
|
|
151
223
|
## Checklist
|
|
152
224
|
|
|
153
225
|
- [ ] Display font chosen from the brand, not from stack defaults or the AI-tell list
|
|
@@ -157,4 +229,7 @@ Finish with fresh eyes: open the page as if you were the client. Whatever looks
|
|
|
157
229
|
- [ ] Directional scrim plus text-shadow on every text-over-media block
|
|
158
230
|
- [ ] Accent used in three places or fewer
|
|
159
231
|
- [ ] Details swept: scrollbar, selection, hairlines, hover micro-transitions
|
|
232
|
+
- [ ] App screen: mobile designed on its own (bottom sheet, thumb zone, 44px targets), never the desktop stacked
|
|
233
|
+
- [ ] No invented number or data on a real screen
|
|
234
|
+
- [ ] Reduced motion gets a composed static frame
|
|
160
235
|
- [ ] Fresh-eyes pass done, and it does not read as a template
|
|
@@ -19,7 +19,7 @@ Stack: .NET VSA + Neon Serverless Postgres. For the end-to-end RAG pipeline (ing
|
|
|
19
19
|
- ALWAYS call `UseVector()` on the `UseNpgsql(...)` options builder (EF Core); `NpgsqlDataSourceBuilder.UseVector()` is only for raw Npgsql
|
|
20
20
|
- ALWAYS register the `vector` extension in `OnModelCreating` (`HasPostgresExtension("vector")`)
|
|
21
21
|
- Map vector properties as `Pgvector.Vector` -- EF Core does not map `float[]` or `ReadOnlyMemory<float>` to the `vector` column
|
|
22
|
-
- Query through the `ApplicationDbContext` in the slice handler with the `CosineDistance`/`L2Distance`/`MaxInnerProduct` LINQ translations -- no repository class, no raw SQL from C# without a `
|
|
22
|
+
- Query through the `ApplicationDbContext` in the slice handler with the `CosineDistance`/`L2Distance`/`MaxInnerProduct` LINQ translations -- no repository class, no raw SQL from C# without a `plan.md` (`## Decisões`) justification
|
|
23
23
|
- IDs come from the app (`Guid.CreateVersion7()`), never from a `gen_random_uuid()` column default
|
|
24
24
|
|
|
25
25
|
## Enable pgvector
|
|
@@ -39,7 +39,7 @@ CREATE EXTENSION IF NOT EXISTS vector;
|
|
|
39
39
|
<PackageReference Include="Pgvector.EntityFrameworkCore" Version="0.3.0" />
|
|
40
40
|
```
|
|
41
41
|
|
|
42
|
-
`Pgvector.EntityFrameworkCore` 0.3.0 requires `Npgsql.EntityFrameworkCore.PostgreSQL` >= 9.0.1 and brings `Pgvector` (the `Vector` type and the raw-Npgsql plugin) transitively. The configuration below maps each column to the snake_case names of `backend/database/postgresql/database.md` (`embedding`, `created_at`) with `HasColumnName`; without it EF creates `"Embedding"`, `"CreatedAt"` and every SQL snippet below would have to quote PascalCase names. (A project that wants this for every entity can add `EFCore.NamingConventions` and `UseSnakeCaseNamingConvention()` once, instead of per column -- a project-wide decision for `
|
|
42
|
+
`Pgvector.EntityFrameworkCore` 0.3.0 requires `Npgsql.EntityFrameworkCore.PostgreSQL` >= 9.0.1 and brings `Pgvector` (the `Vector` type and the raw-Npgsql plugin) transitively. The configuration below maps each column to the snake_case names of `backend/database/postgresql/database.md` (`embedding`, `created_at`) with `HasColumnName`; without it EF creates `"Embedding"`, `"CreatedAt"` and every SQL snippet below would have to quote PascalCase names. (A project that wants this for every entity can add `EFCore.NamingConventions` and `UseSnakeCaseNamingConvention()` once, instead of per column -- a project-wide decision for `plan.md` (`## Decisões`).)
|
|
43
43
|
|
|
44
44
|
### Entity Definition
|
|
45
45
|
|
|
@@ -196,9 +196,9 @@ public sealed class SearchDocumentsHandler(
|
|
|
196
196
|
|
|
197
197
|
Storing an embedding is an ordinary EF write in the handler that owns the document: `document.Embedding = new Vector(await embeddings.GenerateVectorAsync(text, cancellationToken: ct));` followed by `SaveChangesAsync`. No `UPDATE ... SET embedding` from C#.
|
|
198
198
|
|
|
199
|
-
### SQL Functions (only with a `
|
|
199
|
+
### SQL Functions (only with a `plan.md` (`## Decisões`) justification)
|
|
200
200
|
|
|
201
|
-
When the query must live in the database (called from several apps, or a hybrid score the LINQ translation cannot express), a SQL function is acceptable -- record why in `
|
|
201
|
+
When the query must live in the database (called from several apps, or a hybrid score the LINQ translation cannot express), a SQL function is acceptable -- record why in `plan.md` (`## Decisões`), call it through EF Core with interpolated parameters, and keep the same distance rules:
|
|
202
202
|
|
|
203
203
|
```sql
|
|
204
204
|
CREATE OR REPLACE FUNCTION match_documents(
|
|
@@ -218,7 +218,7 @@ $$;
|
|
|
218
218
|
|
|
219
219
|
## Hybrid Search (Vector + Full-Text)
|
|
220
220
|
|
|
221
|
-
Blends the vector score with `ts_rank`. Same rule as above: a SQL function, justified in `
|
|
221
|
+
Blends the vector score with `ts_rank`. Same rule as above: a SQL function, justified in `plan.md` (`## Decisões`).
|
|
222
222
|
|
|
223
223
|
```sql
|
|
224
224
|
CREATE OR REPLACE FUNCTION hybrid_search(
|
|
@@ -195,14 +195,14 @@ Fallback: WebSearch for library capabilities.
|
|
|
195
195
|
|
|
196
196
|
| Tool | Use Case | Example |
|
|
197
197
|
|------|----------|---------|
|
|
198
|
-
| **GitHub CLI (`gh`)** | Create issues from
|
|
198
|
+
| **GitHub CLI (`gh`)** | Create issues from slices, link to milestone | `gh issue create` (Bash) |
|
|
199
199
|
| **Context7** | Estimate complexity based on library docs | `mcp__context7__query-docs()` |
|
|
200
200
|
|
|
201
201
|
```bash
|
|
202
|
-
# Create GitHub issues from
|
|
203
|
-
# — one `gh issue create` per
|
|
204
|
-
gh issue create --title "
|
|
205
|
-
--body "
|
|
202
|
+
# Create GitHub issues from the plan's slices (if team uses GitHub Projects)
|
|
203
|
+
# — one `gh issue create` per slice of .morph/features/{f}/2-plan/checks.json:
|
|
204
|
+
gh issue create --title "F1: Create Entity Lead" \
|
|
205
|
+
--body "fatia F1 do plan.md + cenários que ela cobre" \
|
|
206
206
|
--label "backend" --milestone "feature-x"
|
|
207
207
|
```
|
|
208
208
|
|
|
@@ -234,7 +234,7 @@ psql $(neonctl connection-string) -c "SELECT column_name, data_type FROM informa
|
|
|
234
234
|
psql $(neonctl connection-string) -c "SELECT policyname, cmd, qual FROM pg_policies WHERE tablename = 'leads'"
|
|
235
235
|
```
|
|
236
236
|
|
|
237
|
-
Look up the API while coding, then smoke test the deployed feature: the snapshot shows whether the page renders, the console messages catch JavaScript errors and failed API calls, and the screenshot goes to `
|
|
237
|
+
Look up the API while coding, then smoke test the deployed feature: the snapshot shows whether the page renders, the console messages catch JavaScript errors and failed API calls, and the screenshot goes to the slice report (`3-implement/reports/F{n}.md`). Vercel covers deployment status, logs and environment variables.
|
|
238
238
|
|
|
239
239
|
```javascript
|
|
240
240
|
const docs = await mcp__context7__query-docs({
|
|
@@ -329,7 +329,7 @@ await mcp__playwright__browser_file_upload({ ref: "s1e20", paths: ["/path/to/fil
|
|
|
329
329
|
| Implement (7) | Smoke test deployed features | `browser_navigate` + `browser_click` + `browser_snapshot` |
|
|
330
330
|
| Implement (7) | Verify form flows end-to-end | `browser_fill_form` + `browser_click` + `browser_snapshot` |
|
|
331
331
|
| Implement (7) | Check console errors after deploy | `browser_navigate` + `browser_console_messages` |
|
|
332
|
-
| Implement (7) | Screenshot for
|
|
332
|
+
| Implement (7) | Screenshot for the slice report | `browser_take_screenshot` |
|
|
333
333
|
|
|
334
334
|
---
|
|
335
335
|
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
|
|
7
7
|
VSA + .NET 10 + EF Core + Neon (Postgres) + Microsoft Agent Framework + Next.js (App Router) + Tailwind + Framer Motion + Shadcn + Hangfire (quando necessário).
|
|
8
8
|
|
|
9
|
-
Padrões proibidos por padrão: `Guid.NewGuid()` (use `Guid.CreateVersion7()`), classes não-sealed sem justificativa, exceptions como fluxo de controle, camada de Service/Manager entre handler e dados, repository genérico (`IRepository<T>`/`IUnitOfWork`), SQL cru sem justificativa. Acesso a dados: `ApplicationDbContext` direto no slice (`DbSet<T>` já é repository, `DbContext` já é unit of work); para concorrência ou SQL específico, store dedicado hand-written com justificativa em `
|
|
9
|
+
Padrões proibidos por padrão: `Guid.NewGuid()` (use `Guid.CreateVersion7()`), classes não-sealed sem justificativa, exceptions como fluxo de controle, camada de Service/Manager entre handler e dados, repository genérico (`IRepository<T>`/`IUnitOfWork`), SQL cru sem justificativa. Acesso a dados: `ApplicationDbContext` direto no slice (`DbSet<T>` já é repository, `DbContext` já é unit of work); para concorrência ou SQL específico, store dedicado hand-written com justificativa em `plan.md` (`## Decisões`).
|
|
10
10
|
|
|
11
11
|
## Harness
|
|
12
12
|
|
|
@@ -18,5 +18,5 @@ morph-spec NLH — leia `.morph/framework/MORPH.md` ao iniciar cada sessão. Em
|
|
|
18
18
|
|
|
19
19
|
## Slash commands
|
|
20
20
|
|
|
21
|
-
- `/morph-
|
|
22
|
-
- `/morph-apply {feature}` —
|
|
21
|
+
- `/morph-plan {feature}` — entrevista, `plan.md`, `plan-check` e gate do plano
|
|
22
|
+
- `/morph-apply {feature}` — fatias do plano, `verify` e review (Gate 3)
|
|
@@ -18,8 +18,7 @@ through the registry, and this README never repeats a path the registry already
|
|
|
18
18
|
|
|
19
19
|
```
|
|
20
20
|
framework/templates/
|
|
21
|
-
├── docs/ #
|
|
22
|
-
├── feature/ # decisions.md, recap.md
|
|
21
|
+
├── docs/ # plan.md (the plan's single source) and ui-mockups.md
|
|
23
22
|
├── context/ # ARCHITECTURE.md, design-system.md
|
|
24
23
|
│
|
|
25
24
|
├── code/ # Code templates, by technology
|
|
@@ -38,7 +37,7 @@ framework/templates/
|
|
|
38
37
|
├── integrations/ # asaas-client, asaas-webhook, neon-auth-config
|
|
39
38
|
├── ui/ # design-system.css
|
|
40
39
|
├── meta-prompts/ # fusion, squad-leaders, validators
|
|
41
|
-
├── examples/ #
|
|
40
|
+
├── examples/ # design-system-examples.md
|
|
42
41
|
└── REGISTRY.json # template metadata — the index every consumer reads
|
|
43
42
|
```
|
|
44
43
|
|
|
@@ -29,84 +29,18 @@
|
|
|
29
29
|
],
|
|
30
30
|
"templates": [
|
|
31
31
|
{
|
|
32
|
-
"id": "
|
|
32
|
+
"id": "plan",
|
|
33
33
|
"kind": "template",
|
|
34
|
-
"name": "Feature
|
|
35
|
-
"path": "docs/
|
|
36
|
-
"location": "framework",
|
|
37
|
-
"category": "documentation",
|
|
38
|
-
"phase": "proposal",
|
|
39
|
-
"required": true,
|
|
40
|
-
"description": "Feature proposal with overview, problem statement, solution approach, and cost estimates",
|
|
41
|
-
"outputName": "proposal.md",
|
|
42
|
-
"placeholders": [
|
|
43
|
-
"AUTHOR",
|
|
44
|
-
"DATE",
|
|
45
|
-
"STACK"
|
|
46
|
-
],
|
|
47
|
-
"stackSpecific": false,
|
|
48
|
-
"engine": "handlebars",
|
|
49
|
-
"deprecated": false,
|
|
50
|
-
"technology": "handlebars",
|
|
51
|
-
"validatePlaceholders": true
|
|
52
|
-
},
|
|
53
|
-
{
|
|
54
|
-
"id": "spec",
|
|
55
|
-
"kind": "template",
|
|
56
|
-
"name": "Technical Specification",
|
|
57
|
-
"path": "docs/spec.md",
|
|
34
|
+
"name": "Feature Plan",
|
|
35
|
+
"path": "docs/plan.md",
|
|
58
36
|
"location": "framework",
|
|
59
37
|
"category": "documentation",
|
|
60
38
|
"phase": "plan",
|
|
61
39
|
"required": true,
|
|
62
|
-
"description": "
|
|
63
|
-
"outputName": "
|
|
40
|
+
"description": "Single source of a feature: problem, scenarios (Cn with proof), decisions (ADRs), reuse, slices (Fn) and errata — parsed by morph-spec plan-check into checks.json",
|
|
41
|
+
"outputName": "plan.md",
|
|
64
42
|
"placeholders": [
|
|
65
|
-
"
|
|
66
|
-
"FEATURE_NAME",
|
|
67
|
-
"STACK"
|
|
68
|
-
],
|
|
69
|
-
"stackSpecific": false,
|
|
70
|
-
"engine": "handlebars",
|
|
71
|
-
"deprecated": false,
|
|
72
|
-
"technology": "handlebars",
|
|
73
|
-
"validatePlaceholders": true
|
|
74
|
-
},
|
|
75
|
-
{
|
|
76
|
-
"id": "decisions",
|
|
77
|
-
"kind": "template",
|
|
78
|
-
"name": "Architecture Decision Records",
|
|
79
|
-
"path": "feature/decisions.md",
|
|
80
|
-
"location": "framework",
|
|
81
|
-
"category": "documentation",
|
|
82
|
-
"phase": "plan",
|
|
83
|
-
"required": true,
|
|
84
|
-
"description": "ADR format for documenting architectural decisions with context, alternatives, consequences",
|
|
85
|
-
"outputName": "decisions.md",
|
|
86
|
-
"placeholders": [
|
|
87
|
-
"DATE"
|
|
88
|
-
],
|
|
89
|
-
"stackSpecific": false,
|
|
90
|
-
"engine": "handlebars",
|
|
91
|
-
"deprecated": false,
|
|
92
|
-
"technology": "handlebars",
|
|
93
|
-
"validatePlaceholders": true
|
|
94
|
-
},
|
|
95
|
-
{
|
|
96
|
-
"id": "recap",
|
|
97
|
-
"kind": "template",
|
|
98
|
-
"name": "Feature Recap",
|
|
99
|
-
"path": "feature/recap.md",
|
|
100
|
-
"location": "framework",
|
|
101
|
-
"category": "documentation",
|
|
102
|
-
"phase": "implement",
|
|
103
|
-
"required": true,
|
|
104
|
-
"description": "Post-implementation summary with deliverables, metrics, lessons learned",
|
|
105
|
-
"outputName": "recap.md",
|
|
106
|
-
"placeholders": [
|
|
107
|
-
"DATE",
|
|
108
|
-
"FEATURE_NAME",
|
|
109
|
-
"STACK"
|
|
43
|
+
"FEATURE_NAME"
|
|
110
44
|
],
|
|
111
45
|
"stackSpecific": false,
|
|
112
46
|
"engine": "handlebars",
|
|
@@ -121,7 +55,7 @@
|
|
|
121
55
|
"path": "context/ARCHITECTURE.md",
|
|
122
56
|
"location": "framework",
|
|
123
57
|
"category": "context",
|
|
124
|
-
"phase": "
|
|
58
|
+
"phase": "plan",
|
|
125
59
|
"required": false,
|
|
126
60
|
"description": "Auto-scanned architecture context with entities, endpoints, pages, components, integrations, database tables, and package versions",
|
|
127
61
|
"outputName": "ARCHITECTURE.md",
|
|
@@ -132,24 +66,6 @@
|
|
|
132
66
|
"technology": "handlebars",
|
|
133
67
|
"validatePlaceholders": true
|
|
134
68
|
},
|
|
135
|
-
{
|
|
136
|
-
"id": "spec-examples",
|
|
137
|
-
"kind": "template",
|
|
138
|
-
"name": "Spec Examples",
|
|
139
|
-
"path": "examples/spec-examples.md",
|
|
140
|
-
"location": "framework",
|
|
141
|
-
"category": "examples",
|
|
142
|
-
"phase": null,
|
|
143
|
-
"required": false,
|
|
144
|
-
"description": "Example technical specs for reference",
|
|
145
|
-
"outputName": null,
|
|
146
|
-
"placeholders": [],
|
|
147
|
-
"stackSpecific": false,
|
|
148
|
-
"engine": null,
|
|
149
|
-
"deprecated": false,
|
|
150
|
-
"technology": null,
|
|
151
|
-
"validatePlaceholders": true
|
|
152
|
-
},
|
|
153
69
|
{
|
|
154
70
|
"id": "design-system-examples",
|
|
155
71
|
"kind": "template",
|
|
@@ -263,7 +179,7 @@
|
|
|
263
179
|
"path": "code/dotnet/contracts/README.md",
|
|
264
180
|
"location": "framework",
|
|
265
181
|
"category": "documentation",
|
|
266
|
-
"phase": "
|
|
182
|
+
"phase": "implement",
|
|
267
183
|
"required": false,
|
|
268
184
|
"description": "Documentation for contract patterns and usage",
|
|
269
185
|
"outputName": "README.md",
|
|
@@ -284,7 +200,7 @@
|
|
|
284
200
|
"path": "code/dotnet/contracts/contracts-vsa.cs",
|
|
285
201
|
"location": "framework",
|
|
286
202
|
"category": "code",
|
|
287
|
-
"phase": "
|
|
203
|
+
"phase": "implement",
|
|
288
204
|
"required": false,
|
|
289
205
|
"description": "Feature slice completo: Abstractions, Entity, Errors, e um slice de operação (Request, Response, Validator, Handler, Endpoint). Padrão KanaiyaKatarmal (.NET 10, Minimal APIs, EF Core 10, FluentValidation 12, Scrutor 7).",
|
|
290
206
|
"outputName": "contracts.cs",
|
|
@@ -306,7 +222,7 @@
|
|
|
306
222
|
"path": "code/typescript/contracts.ts",
|
|
307
223
|
"location": "framework",
|
|
308
224
|
"category": "code",
|
|
309
|
-
"phase": "
|
|
225
|
+
"phase": "implement",
|
|
310
226
|
"required": false,
|
|
311
227
|
"description": "TypeScript type definitions and interfaces",
|
|
312
228
|
"outputName": "contracts.ts",
|
|
@@ -614,71 +530,6 @@
|
|
|
614
530
|
"technology": "handlebars",
|
|
615
531
|
"validatePlaceholders": true
|
|
616
532
|
},
|
|
617
|
-
{
|
|
618
|
-
"id": "ui-flows",
|
|
619
|
-
"kind": "template",
|
|
620
|
-
"name": "UI Flows",
|
|
621
|
-
"path": "docs/ui-flows.md",
|
|
622
|
-
"location": "framework",
|
|
623
|
-
"category": "documentation",
|
|
624
|
-
"phase": "uiux",
|
|
625
|
-
"required": false,
|
|
626
|
-
"description": "User flows and interaction patterns with state diagrams and edge cases",
|
|
627
|
-
"outputName": "flows.md",
|
|
628
|
-
"placeholders": [
|
|
629
|
-
"DATE",
|
|
630
|
-
"FEATURE_NAME"
|
|
631
|
-
],
|
|
632
|
-
"stackSpecific": false,
|
|
633
|
-
"engine": "handlebars",
|
|
634
|
-
"deprecated": false,
|
|
635
|
-
"technology": "handlebars",
|
|
636
|
-
"validatePlaceholders": true
|
|
637
|
-
},
|
|
638
|
-
{
|
|
639
|
-
"id": "ui-components",
|
|
640
|
-
"kind": "template",
|
|
641
|
-
"name": "UI Components",
|
|
642
|
-
"path": "docs/ui-components.md",
|
|
643
|
-
"location": "framework",
|
|
644
|
-
"category": "documentation",
|
|
645
|
-
"phase": "uiux",
|
|
646
|
-
"required": false,
|
|
647
|
-
"description": "Component specifications mapping UI elements to shadcn/ui components with props and events",
|
|
648
|
-
"outputName": "components.md",
|
|
649
|
-
"placeholders": [
|
|
650
|
-
"DATE",
|
|
651
|
-
"FEATURE_NAME",
|
|
652
|
-
"STACK"
|
|
653
|
-
],
|
|
654
|
-
"stackSpecific": false,
|
|
655
|
-
"engine": "handlebars",
|
|
656
|
-
"deprecated": false,
|
|
657
|
-
"technology": "handlebars",
|
|
658
|
-
"validatePlaceholders": true
|
|
659
|
-
},
|
|
660
|
-
{
|
|
661
|
-
"id": "ui-design-system",
|
|
662
|
-
"kind": "template",
|
|
663
|
-
"name": "UI Design System",
|
|
664
|
-
"path": "docs/ui-design-system.md",
|
|
665
|
-
"location": "framework",
|
|
666
|
-
"category": "documentation",
|
|
667
|
-
"phase": "uiux",
|
|
668
|
-
"required": false,
|
|
669
|
-
"description": "Design system documentation with color palette, typography, spacing, and semantic tokens",
|
|
670
|
-
"outputName": "design-system.md",
|
|
671
|
-
"placeholders": [
|
|
672
|
-
"DATE",
|
|
673
|
-
"FEATURE_NAME",
|
|
674
|
-
"PROJECT_NAME"
|
|
675
|
-
],
|
|
676
|
-
"stackSpecific": false,
|
|
677
|
-
"engine": "handlebars",
|
|
678
|
-
"deprecated": false,
|
|
679
|
-
"technology": "handlebars",
|
|
680
|
-
"validatePlaceholders": true
|
|
681
|
-
},
|
|
682
533
|
{
|
|
683
534
|
"id": "github-workflow-dotnet-build",
|
|
684
535
|
"kind": "template",
|
|
@@ -687,7 +538,7 @@
|
|
|
687
538
|
"location": "framework",
|
|
688
539
|
"category": "infrastructure",
|
|
689
540
|
"technology": "github-actions",
|
|
690
|
-
"phase": "
|
|
541
|
+
"phase": "implement",
|
|
691
542
|
"required": false,
|
|
692
543
|
"description": "Reusable workflow for building .NET applications with restore, build, test, coverage",
|
|
693
544
|
"outputName": "dotnet-build.yml",
|
|
@@ -711,7 +562,7 @@
|
|
|
711
562
|
"location": "framework",
|
|
712
563
|
"category": "infrastructure",
|
|
713
564
|
"technology": "github-actions",
|
|
714
|
-
"phase": "
|
|
565
|
+
"phase": "implement",
|
|
715
566
|
"required": false,
|
|
716
567
|
"description": "Reusable workflow for building and pushing Docker images to registry",
|
|
717
568
|
"outputName": "docker-build-push.yml",
|
|
@@ -733,7 +584,7 @@
|
|
|
733
584
|
"location": "framework",
|
|
734
585
|
"category": "infrastructure",
|
|
735
586
|
"technology": "github-actions",
|
|
736
|
-
"phase": "
|
|
587
|
+
"phase": "implement",
|
|
737
588
|
"required": false,
|
|
738
589
|
"description": "Reusable workflow for deploying to Coolify via SSH (API is not publicly exposed)",
|
|
739
590
|
"outputName": "deploy-coolify.yml",
|
|
@@ -755,7 +606,7 @@
|
|
|
755
606
|
"location": "framework",
|
|
756
607
|
"category": "infrastructure",
|
|
757
608
|
"technology": "github-actions",
|
|
758
|
-
"phase": "
|
|
609
|
+
"phase": "implement",
|
|
759
610
|
"required": false,
|
|
760
611
|
"description": "Composite action for building and pushing Docker images",
|
|
761
612
|
"outputName": "action.yml",
|
|
@@ -777,7 +628,7 @@
|
|
|
777
628
|
"location": "framework",
|
|
778
629
|
"category": "infrastructure",
|
|
779
630
|
"technology": "github-actions",
|
|
780
|
-
"phase": "
|
|
631
|
+
"phase": "implement",
|
|
781
632
|
"required": false,
|
|
782
633
|
"description": "Composite action for polling health endpoint until ready",
|
|
783
634
|
"outputName": "action.yml",
|
|
@@ -1460,21 +1311,6 @@
|
|
|
1460
1311
|
"TIMESTAMP"
|
|
1461
1312
|
],
|
|
1462
1313
|
"validatePlaceholders": true
|
|
1463
|
-
},
|
|
1464
|
-
{
|
|
1465
|
-
"id": "tasks-template",
|
|
1466
|
-
"kind": "template",
|
|
1467
|
-
"consumption": "reference",
|
|
1468
|
-
"name": "tasks.json",
|
|
1469
|
-
"path": "tasks.template.json",
|
|
1470
|
-
"category": "context",
|
|
1471
|
-
"phase": null,
|
|
1472
|
-
"outputName": null,
|
|
1473
|
-
"description": "Initial tasks.json scaffold",
|
|
1474
|
-
"engine": "handlebars",
|
|
1475
|
-
"deprecated": false,
|
|
1476
|
-
"placeholders": [],
|
|
1477
|
-
"validatePlaceholders": true
|
|
1478
1314
|
}
|
|
1479
1315
|
]
|
|
1480
1316
|
}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
# Plano — {{FEATURE_NAME}}
|
|
2
|
+
|
|
3
|
+
<!-- Fonte única da feature. `morph-spec plan-check {{FEATURE_NAME}}` lê este arquivo e grava 2-plan/checks.json.
|
|
4
|
+
Depois do gate plan, o corpo congela: fato errado sobre o código vai em ## Errata (append-only). -->
|
|
5
|
+
|
|
6
|
+
## Problema
|
|
7
|
+
|
|
8
|
+
<O que dói hoje, para quem, e como se percebe. Duas a cinco frases.>
|
|
9
|
+
|
|
10
|
+
## Fora de escopo
|
|
11
|
+
|
|
12
|
+
- <o que esta feature deliberadamente não faz>
|
|
13
|
+
|
|
14
|
+
## Suposições não confirmadas
|
|
15
|
+
|
|
16
|
+
- <o que foi assumido sem prova; "nenhuma" vale>
|
|
17
|
+
|
|
18
|
+
## Cenários
|
|
19
|
+
|
|
20
|
+
<!-- Um cenário por comportamento observável. `prova:` é teste | e2e | eval | manual.
|
|
21
|
+
Cenário que fala de arquivo, grep ou texto exige a linha "> Por que artefato:" logo abaixo. -->
|
|
22
|
+
|
|
23
|
+
- **C1** — Dado <estado>, quando <ação>, então <resultado observável>.
|
|
24
|
+
prova: teste
|
|
25
|
+
|
|
26
|
+
## Decisões
|
|
27
|
+
|
|
28
|
+
### ADR-001 — <título>
|
|
29
|
+
**Alcance:** feature
|
|
30
|
+
|
|
31
|
+
<Contexto, decisão e consequência. `projeto` quando a decisão vale além desta feature.>
|
|
32
|
+
|
|
33
|
+
### Conflitos com o acervo
|
|
34
|
+
|
|
35
|
+
<!-- ADR do índice (.morph/specs/adrs/) que este plano contradiz: "nenhum", ou a tabela abaixo fora do bloco.
|
|
36
|
+
O finish aplica cada linha: total retira o ADR do índice; parcial o mantém com o escopo onde ainda vale.
|
|
37
|
+
```
|
|
38
|
+
| ADR | Mudança | Escopo em que o antigo ainda vale |
|
|
39
|
+
|---|---|---|
|
|
40
|
+
| {feature}/ADR-{nnn} | parcial | <onde o antigo ainda vale> |
|
|
41
|
+
| {feature}/ADR-{nnn} | total | — |
|
|
42
|
+
```
|
|
43
|
+
-->
|
|
44
|
+
|
|
45
|
+
nenhum
|
|
46
|
+
|
|
47
|
+
## Arquitetura
|
|
48
|
+
|
|
49
|
+
<Onde o código entra, o que conversa com o quê. Diagrama só se ajudar.>
|
|
50
|
+
|
|
51
|
+
## Reuso
|
|
52
|
+
|
|
53
|
+
| conceito | veredito | alvo | why |
|
|
54
|
+
|---|---|---|---|
|
|
55
|
+
| <conceito> | REUSAR | <arquivo ou símbolo existente> | |
|
|
56
|
+
|
|
57
|
+
## Fatias
|
|
58
|
+
|
|
59
|
+
<!-- Uma fatia = uma unidade de entrega (com ou sem dispatch), relatório em 3-implement/reports/Fn.md.
|
|
60
|
+
arquivos ≤ 8; superfície e depende são opcionais; toda Cn é coberta por alguma fatia. -->
|
|
61
|
+
|
|
62
|
+
### F1 — <título>
|
|
63
|
+
- persona: dotnet-senior
|
|
64
|
+
- standards: <id>
|
|
65
|
+
- arquivos: <caminho/a.cs>, <caminho/b.cs>
|
|
66
|
+
- cobre: C1
|
|
67
|
+
|
|
68
|
+
## Contrato de implementação
|
|
69
|
+
|
|
70
|
+
<Assinaturas, records, enums e rotas que as fatias precisam honrar.>
|
|
71
|
+
|
|
72
|
+
## Errata
|
|
@@ -18,6 +18,10 @@
|
|
|
18
18
|
|
|
19
19
|
## Tela: {Primary Screen}
|
|
20
20
|
|
|
21
|
+
**Protótipo:** 1-design/prototipos/{tela}.html
|
|
22
|
+
|
|
23
|
+
O protótipo renderizado é a fonte visual da tela; os prints `{tela}-1280.png` e `{tela}-390.png` ficam ao lado dele, e sem os três arquivos o Gate uiux pausa. O layout em texto abaixo é opcional.
|
|
24
|
+
|
|
21
25
|
### Desktop Layout
|
|
22
26
|
|
|
23
27
|
```
|
|
@@ -58,15 +58,7 @@ dotnet test --solution Morph.AiKit.sln -c Release --no-build
|
|
|
58
58
|
> do `morph-spec verify`); por isso nenhum chamador repassa a flag. Ao adicionar
|
|
59
59
|
> testes, suba o piso — `test/framework/ai-kit-ci-packaging.test.js` reprova um
|
|
60
60
|
> piso que ficou para trás da contagem de `[Fact]`/`[Theory]`.
|
|
61
|
-
|
|
62
|
-
> linha de comando não sobrescreve o valor do projeto (medido: o recorte verde
|
|
63
|
-
> sai 9 do mesmo jeito), mas a propriedade global do MSBuild sim. Por isso
|
|
64
|
-
> `morph-spec verify {f} {task}` estreita este projeto repassando
|
|
65
|
-
> `"-p:TestingPlatformCommandLineArguments=…"` com o valor do `.csproj` e o piso
|
|
66
|
-
> em 1 — verde sai 0, zero testes segue saindo 8, nada recompila (issue #114).
|
|
67
|
-
> Mantenha o piso **nesse** elemento, literal (sem `Condition`, sem `$(…)`, sem
|
|
68
|
-
> outra declaração da propriedade em `Directory.Build.*`): em qualquer outra
|
|
69
|
-
> forma o recorte volta a rodar o nó inteiro.
|
|
61
|
+
|
|
70
62
|
|
|
71
63
|
> **`dotnet test` precisa rodar COM O CWD DENTRO deste diretório.** O opt-in do
|
|
72
64
|
> Microsoft.Testing.Platform (que `xunit.v3` 4.x usa) vive em `global.json`, e o
|
|
@@ -30,16 +30,6 @@
|
|
|
30
30
|
de workflow. Uma unica verdade: nenhum chamador repassa a flag na linha de
|
|
31
31
|
comando, porque repassa-la duplicaria a opcao.
|
|
32
32
|
|
|
33
|
-
Consequencia para o recorte por task (`morph-spec verify {f} {task}`): a
|
|
34
|
-
mesma opcao com valor 1 na linha de comando NAO sobrescreve o valor do
|
|
35
|
-
projeto (medido: o recorte verde sai 9 do mesmo jeito), mas a propriedade
|
|
36
|
-
global do MSBuild sim. O recorte estreita este projeto repassando
|
|
37
|
-
"-p:TestingPlatformCommandLineArguments=" com ESTE valor e o piso em 1
|
|
38
|
-
(issue #114: verde sai 0, zero testes segue saindo 8, nada recompila). Por
|
|
39
|
-
isso o piso fica NESTE elemento, literal: sem Condition, sem $(...), sem
|
|
40
|
-
outra declaracao da propriedade em Directory.Build.* — em qualquer outra
|
|
41
|
-
forma o recorte volta a rodar o no inteiro.
|
|
42
|
-
|
|
43
33
|
O numero e o total de CASOS EXECUTADOS (275), nao de atributos nem de casos
|
|
44
34
|
DESCOBERTOS (276): os [Theory] expandem, e um caso IGNORADO nao conta para o piso — a
|
|
45
35
|
suite descobre 276 e executa 275, porque o semeador da cache exemplar de eval
|
|
@@ -78,7 +78,7 @@ Backend deliverables typically include:
|
|
|
78
78
|
2. Create migrations before writing service logic
|
|
79
79
|
3. Implement services with proper unit-testable interfaces
|
|
80
80
|
4. Wire up API endpoints last (depends on services)
|
|
81
|
-
5. After every 3
|
|
81
|
+
5. After every 3 slices, write each finished slice's report (`3-implement/reports/F{n}.md`) and run the checkpoint
|
|
82
82
|
6. If blocked (compilation error, migration conflict), document and continue with next unblocked task
|
|
83
83
|
|
|
84
84
|
## Report Back When Done
|
|
@@ -72,7 +72,7 @@ Frontend deliverables typically include:
|
|
|
72
72
|
2. Build reusable sub-components before composing pages
|
|
73
73
|
3. Wire up API calls/services last (after UI is structured)
|
|
74
74
|
4. Test each component with loading + error + empty states
|
|
75
|
-
5. After every 3
|
|
75
|
+
5. After every 3 slices, write each finished slice's report (`3-implement/reports/F{n}.md`) and run the checkpoint
|
|
76
76
|
|
|
77
77
|
## Report Back When Done
|
|
78
78
|
Provide a summary of:
|
|
@@ -32,7 +32,7 @@ You are a **Squad Leader** in the MORPH-SPEC agent hierarchy.
|
|
|
32
32
|
## How to Work
|
|
33
33
|
1. Read your standards carefully before starting
|
|
34
34
|
2. Implement each task in order (respecting dependencies)
|
|
35
|
-
3. After every 3
|
|
35
|
+
3. After every 3 slices, write each finished slice's report (`3-implement/reports/F{n}.md`) and run the checkpoint
|
|
36
36
|
4. If blocked, document the blocker and continue with the next unblocked task
|
|
37
37
|
5. Report completion with: files created, any blockers, checkpoint results
|
|
38
38
|
|