@hegemonart/get-design-done 1.19.5 → 1.20.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 (103) hide show
  1. package/.claude-plugin/marketplace.json +4 -4
  2. package/.claude-plugin/plugin.json +2 -2
  3. package/CHANGELOG.md +90 -0
  4. package/README.md +12 -0
  5. package/agents/design-auditor.md +12 -0
  6. package/agents/design-discussant.md +14 -0
  7. package/agents/design-reflector.md +23 -0
  8. package/connections/connections.md +3 -0
  9. package/connections/figma.md +2 -0
  10. package/connections/gdd-state.md +186 -0
  11. package/hooks/budget-enforcer.ts +716 -0
  12. package/hooks/context-exhaustion.ts +251 -0
  13. package/hooks/gdd-read-injection-scanner.ts +172 -0
  14. package/hooks/hooks.json +3 -3
  15. package/package.json +29 -7
  16. package/reference/authority-feeds.md +4 -2
  17. package/reference/checklists.md +30 -0
  18. package/reference/component-authoring.md +184 -0
  19. package/reference/config-schema.md +2 -2
  20. package/reference/emotional-design.md +124 -0
  21. package/reference/error-recovery.md +58 -0
  22. package/reference/first-principles.md +89 -0
  23. package/reference/heuristics.md +70 -0
  24. package/reference/motion-advanced.md +192 -3
  25. package/reference/registry.json +28 -0
  26. package/reference/schemas/budget.schema.json +42 -0
  27. package/reference/schemas/events.schema.json +55 -0
  28. package/reference/schemas/generated.d.ts +419 -0
  29. package/reference/schemas/iteration-budget.schema.json +36 -0
  30. package/reference/schemas/mcp-gdd-state-tools.schema.json +89 -0
  31. package/reference/schemas/rate-limits.schema.json +31 -0
  32. package/reference/shared-preamble.md +10 -0
  33. package/scripts/aggregate-agent-metrics.ts +282 -0
  34. package/scripts/codegen-schema-types.ts +149 -0
  35. package/scripts/lib/error-classifier.cjs +232 -0
  36. package/scripts/lib/error-classifier.d.cts +44 -0
  37. package/scripts/lib/event-stream/emitter.ts +88 -0
  38. package/scripts/lib/event-stream/index.ts +154 -0
  39. package/scripts/lib/event-stream/types.ts +127 -0
  40. package/scripts/lib/event-stream/writer.ts +154 -0
  41. package/scripts/lib/gdd-errors/classification.ts +124 -0
  42. package/scripts/lib/gdd-errors/index.ts +218 -0
  43. package/scripts/lib/gdd-state/gates.ts +216 -0
  44. package/scripts/lib/gdd-state/index.ts +167 -0
  45. package/scripts/lib/gdd-state/lockfile.ts +232 -0
  46. package/scripts/lib/gdd-state/mutator.ts +574 -0
  47. package/scripts/lib/gdd-state/parser.ts +523 -0
  48. package/scripts/lib/gdd-state/types.ts +179 -0
  49. package/scripts/lib/iteration-budget.cjs +205 -0
  50. package/scripts/lib/iteration-budget.d.cts +32 -0
  51. package/scripts/lib/jittered-backoff.cjs +112 -0
  52. package/scripts/lib/jittered-backoff.d.cts +38 -0
  53. package/scripts/lib/lockfile.cjs +177 -0
  54. package/scripts/lib/lockfile.d.cts +21 -0
  55. package/scripts/lib/prompt-sanitizer/index.ts +435 -0
  56. package/scripts/lib/prompt-sanitizer/patterns.ts +173 -0
  57. package/scripts/lib/rate-guard.cjs +365 -0
  58. package/scripts/lib/rate-guard.d.cts +38 -0
  59. package/scripts/mcp-servers/gdd-state/schemas/add_blocker.schema.json +67 -0
  60. package/scripts/mcp-servers/gdd-state/schemas/add_decision.schema.json +68 -0
  61. package/scripts/mcp-servers/gdd-state/schemas/add_must_have.schema.json +68 -0
  62. package/scripts/mcp-servers/gdd-state/schemas/checkpoint.schema.json +51 -0
  63. package/scripts/mcp-servers/gdd-state/schemas/frontmatter_update.schema.json +62 -0
  64. package/scripts/mcp-servers/gdd-state/schemas/get.schema.json +51 -0
  65. package/scripts/mcp-servers/gdd-state/schemas/probe_connections.schema.json +75 -0
  66. package/scripts/mcp-servers/gdd-state/schemas/resolve_blocker.schema.json +66 -0
  67. package/scripts/mcp-servers/gdd-state/schemas/set_status.schema.json +47 -0
  68. package/scripts/mcp-servers/gdd-state/schemas/transition_stage.schema.json +70 -0
  69. package/scripts/mcp-servers/gdd-state/schemas/update_progress.schema.json +58 -0
  70. package/scripts/mcp-servers/gdd-state/server.ts +288 -0
  71. package/scripts/mcp-servers/gdd-state/tools/add_blocker.ts +72 -0
  72. package/scripts/mcp-servers/gdd-state/tools/add_decision.ts +89 -0
  73. package/scripts/mcp-servers/gdd-state/tools/add_must_have.ts +113 -0
  74. package/scripts/mcp-servers/gdd-state/tools/checkpoint.ts +60 -0
  75. package/scripts/mcp-servers/gdd-state/tools/frontmatter_update.ts +91 -0
  76. package/scripts/mcp-servers/gdd-state/tools/get.ts +51 -0
  77. package/scripts/mcp-servers/gdd-state/tools/index.ts +51 -0
  78. package/scripts/mcp-servers/gdd-state/tools/probe_connections.ts +73 -0
  79. package/scripts/mcp-servers/gdd-state/tools/resolve_blocker.ts +84 -0
  80. package/scripts/mcp-servers/gdd-state/tools/set_status.ts +54 -0
  81. package/scripts/mcp-servers/gdd-state/tools/shared.ts +194 -0
  82. package/scripts/mcp-servers/gdd-state/tools/transition_stage.ts +80 -0
  83. package/scripts/mcp-servers/gdd-state/tools/update_progress.ts +81 -0
  84. package/scripts/validate-frontmatter.ts +114 -0
  85. package/scripts/validate-schemas.ts +401 -0
  86. package/skills/brief/SKILL.md +15 -6
  87. package/skills/design/SKILL.md +31 -13
  88. package/skills/explore/SKILL.md +41 -17
  89. package/skills/health/SKILL.md +15 -4
  90. package/skills/optimize/SKILL.md +3 -3
  91. package/skills/pause/SKILL.md +16 -10
  92. package/skills/plan/SKILL.md +33 -17
  93. package/skills/progress/SKILL.md +15 -11
  94. package/skills/resume/SKILL.md +19 -10
  95. package/skills/settings/SKILL.md +11 -3
  96. package/skills/todo/SKILL.md +12 -3
  97. package/skills/verify/SKILL.md +65 -29
  98. package/hooks/budget-enforcer.js +0 -329
  99. package/hooks/context-exhaustion.js +0 -127
  100. package/hooks/gdd-read-injection-scanner.js +0 -39
  101. package/scripts/aggregate-agent-metrics.js +0 -173
  102. package/scripts/validate-frontmatter.cjs +0 -68
  103. package/scripts/validate-schemas.cjs +0 -242
@@ -746,9 +746,198 @@ Fresh eyes catch what in-the-moment iteration misses. Animations feel correct wh
746
746
 
747
747
  ## Disney's 12 Principles — UX Mapping
748
748
 
749
- <!-- STUB: Disney's 12 Principles UX mapping Phase 19.6 will author this section -->
750
- <!-- Cross-reference: reference/motion-easings.md, reference/motion-spring.md -->
749
+ Original source: Frank Thomas & Ollie Johnston, *The Illusion of Life: Disney Animation* (1981). The 12 principles were developed for hand-drawn character animation; the UX mappings below translate each to interface motion.
751
750
 
752
- *This section is reserved for Phase 19.6 (Design Philosophy Layer). A full UX mapping of all 12 principles will be authored there and this stub will be replaced.*
751
+ ---
752
+
753
+ ### 1. Squash and Stretch
754
+
755
+ **Animation:** Objects deform under force — squash on impact, stretch during fast movement.
756
+
757
+ **UX mapping:** Scale feedback communicates physical weight and responsiveness.
758
+ ```tsx
759
+ // Press: squash slightly (wider, shorter)
760
+ // Release: snap back through scale(1.05) → scale(1)
761
+ <motion.button
762
+ whileTap={{ scaleX: 1.05, scaleY: 0.95 }}
763
+ transition={{ type: "spring", stiffness: 500, damping: 30 }}
764
+ />
765
+ ```
766
+ **Rule:** Constrain squash/stretch to ≤5% deviation — more reads as glitchy, not physical.
767
+
768
+ ---
769
+
770
+ ### 2. Anticipation
771
+
772
+ **Animation:** A small preparatory motion before the main action (e.g., a character bending knees before jumping).
773
+
774
+ **UX mapping:** Preview animations prime the user for what's about to happen.
775
+ ```tsx
776
+ // Drawer that "breathes" slightly before opening
777
+ <motion.div
778
+ animate={isOpen ? { x: 0 } : { x: -8 }}
779
+ initial={{ x: -8 }}
780
+ transition={{ type: "spring", stiffness: 300, damping: 24 }}
781
+ />
782
+ ```
783
+ **Rule:** Anticipation delays should be ≤80ms; longer delays read as lag, not anticipation.
784
+
785
+ ---
786
+
787
+ ### 3. Staging
788
+
789
+ **Animation:** Present one idea at a time; the primary action draws the eye; secondary elements are subordinate.
790
+
791
+ **UX mapping:** One primary motion per state change. All other motion is either absent or staggered to follow.
792
+ - Never animate two elements of equal visual weight simultaneously
793
+ - Use stagger to create a reading order for entering content
794
+ - The element the user acted on should move first
795
+
796
+ ---
797
+
798
+ ### 4. Straight Ahead vs Pose to Pose
799
+
800
+ **Animation:** Straight-ahead: draw each frame in sequence. Pose-to-pose: define key positions and interpolate.
801
+
802
+ **UX mapping:** All CSS transitions and spring animations are pose-to-pose by definition — you define start and end states. This means:
803
+ - Transitions retarget smoothly when interrupted (see CSS Transitions vs Keyframes section above)
804
+ - The in-between frames are computed by the engine, not designed
805
+ - Design the **poses** (states) carefully; the interpolation handles itself
806
+
807
+ ---
808
+
809
+ ### 5. Follow Through and Overlapping Action
810
+
811
+ **Animation:** Parts of an object continue moving after the main action stops; related elements finish at slightly different times.
812
+
813
+ **UX mapping:** Stagger exit animations and let secondary elements settle slightly after primary.
814
+ ```tsx
815
+ // List exit: items stagger out with slight delay between each
816
+ const container = {
817
+ exit: { transition: { staggerChildren: 0.04, staggerDirection: -1 } },
818
+ };
819
+ const item = {
820
+ exit: { opacity: 0, y: -8, transition: { duration: 0.2 } },
821
+ };
822
+ ```
823
+ **Rule:** Follow-through delay ≤60ms per level. Beyond this, the UI feels sluggish.
824
+
825
+ ---
826
+
827
+ ### 6. Slow In and Slow Out
828
+
829
+ **Animation:** Objects accelerate from rest and decelerate to a stop; they are never at constant velocity.
830
+
831
+ **UX mapping:** Never use `linear` easing for UI transitions. Always use a curve that starts slow, speeds up, and decelerates.
832
+ ```css
833
+ /* The standard Material/web ease — correct for most UI */
834
+ transition: transform 0.24s cubic-bezier(0.4, 0, 0.2, 1);
835
+
836
+ /* Enter (slow in) */
837
+ transition: transform 0.24s cubic-bezier(0, 0, 0.2, 1);
838
+
839
+ /* Exit (slow out) */
840
+ transition: transform 0.2s cubic-bezier(0.4, 0, 1, 1);
841
+ ```
842
+ **Rule:** `linear` easing is only valid for: scroll-driven animations tied to position, and progress bar fills.
843
+
844
+ ---
845
+
846
+ ### 7. Arcs
847
+
848
+ **Animation:** Objects in the real world move in slight arcs, not straight lines.
849
+
850
+ **UX mapping:** For spatial transitions (element moving from one position to another), a slight arc feels more natural than a straight-line translate. Achieved by animating both axes with slightly different timing:
851
+ ```tsx
852
+ <motion.div
853
+ initial={{ x: -40, y: 10, opacity: 0 }}
854
+ animate={{ x: 0, y: 0, opacity: 1 }}
855
+ transition={{
856
+ x: { type: "spring", stiffness: 300, damping: 28 },
857
+ y: { type: "spring", stiffness: 300, damping: 28, delay: 0.04 },
858
+ opacity: { duration: 0.2 },
859
+ }}
860
+ />
861
+ ```
862
+ **Rule:** Arcs apply only to spatial motion. Opacity, scale, and color changes do not arc.
863
+
864
+ ---
865
+
866
+ ### 8. Secondary Action
867
+
868
+ **Animation:** A supporting action that reinforces the primary one (e.g., a character's hair bouncing while they walk).
869
+
870
+ **UX mapping:** A small supplementary animation that confirms and amplifies the main interaction.
871
+ - Toast notification: icon pulses briefly after the toast appears (secondary action confirming the event)
872
+ - Success state: checkmark draws itself after the confirmation color appears
873
+ - Delete: item fades + the list count badge decrements with a small number-flip animation
874
+
875
+ **Rule:** Secondary actions must complete before or simultaneously with the primary — never after. They reinforce, not extend.
876
+
877
+ ---
878
+
879
+ ### 9. Timing
880
+
881
+ **Animation:** Duration communicates physical weight. Fast = light and snappy. Slow = heavy and significant.
882
+
883
+ **UX mapping:**
884
+
885
+ | Duration | Use for |
886
+ |---|---|
887
+ | 80–120ms | Micro-interactions: hover states, active states, icon swaps |
888
+ | 150–200ms | Standard component transitions: dropdowns, tooltips, toasts |
889
+ | 220–300ms | Page-level state changes, drawer open/close, modal appear |
890
+ | 300–500ms | Full-page route transitions |
891
+ | > 500ms | Reserved for intentionally cinematic moments only |
892
+
893
+ **Rule:** Match duration to the visual weight of the element. A small icon swap at 300ms feels lethargic; a full-page transition at 80ms feels jarring.
894
+
895
+ ---
896
+
897
+ ### 10. Exaggeration
898
+
899
+ **Animation:** Push key poses slightly beyond reality for emphasis and clarity.
900
+
901
+ **UX mapping:** Slight overshoot in spring animations communicates energy and intention.
902
+ ```tsx
903
+ // Slight overshoot via underdamped spring — not bouncy, but alive
904
+ <motion.div
905
+ animate={{ scale: 1 }}
906
+ transition={{ type: "spring", stiffness: 400, damping: 22, mass: 0.8 }}
907
+ />
908
+ // Peak scale ≈ 1.03–1.05 before settling — imperceptible consciously, felt physically
909
+ ```
910
+ **Rule:** Exaggeration in UI should be invisible when you're looking for it. If users notice the bounce, it's too much. Target spring `bounce` values of 0.1–0.2.
911
+
912
+ ---
913
+
914
+ ### 11. Solid Drawing
915
+
916
+ **Animation:** Characters have weight, depth, and obey perspective; they feel three-dimensional.
917
+
918
+ **UX mapping:** UI elements should feel visually grounded — not floating. Shadows, depth layering, and transform-origin choices communicate which layer an element lives on.
919
+ - Drawers and sheets slide from an edge — they feel physically attached
920
+ - Modals emerge from center or from the triggering element — they float above the page
921
+ - Tooltips appear near the cursor — they are attached to the pointer
922
+ - `transform-origin` must match where the element conceptually emerges from
923
+
924
+ ---
925
+
926
+ ### 12. Appeal
927
+
928
+ **Animation:** Characters have a quality that makes the audience want to watch them — not necessarily cute, but interesting.
929
+
930
+ **UX mapping:** Animation has personality that is consistent with the product's brand.
931
+
932
+ | Product type | Animation personality |
933
+ |---|---|
934
+ | Financial / serious tools | Crisp, minimal, sub-150ms, no bounce |
935
+ | Consumer apps | Warm, slightly slower, gentle ease-out |
936
+ | Playful / creative tools | Spring physics, slight overshoot, expressive icon animations |
937
+ | Data dashboards | Smooth, purposeful, transitions that reveal data sequentially |
938
+
939
+ **Rule:** Animation personality must be decided once per product and applied consistently. Mixed personalities (snappy in one area, bouncy in another) destroy cohesion.
940
+
941
+ ---
753
942
 
754
943
  See also: `reference/motion-easings.md`, `reference/motion-spring.md`, `reference/framer-motion-patterns.md`
@@ -3,6 +3,34 @@
3
3
  "version": 1,
4
4
  "generated_at": "2026-04-24T00:00:00.000Z",
5
5
  "entries": [
6
+ {
7
+ "name": "error-recovery",
8
+ "path": "reference/error-recovery.md",
9
+ "type": "meta-rules",
10
+ "phase": 20,
11
+ "description": "Phase 20 resilience recovery protocol — rate-limit + 429 + context-overflow retry guidance for the SDK runner (jittered-backoff / rate-guard / error-classifier / iteration-budget integration)"
12
+ },
13
+ {
14
+ "name": "component-authoring",
15
+ "path": "reference/component-authoring.md",
16
+ "type": "heuristic",
17
+ "phase": 19.6,
18
+ "description": "Kowalski/Sonner 6-principle component quality standard (P-01 Minimal API, P-02 Composability, P-03 Defaults, P-04 Animation as State, P-05 Accessibility First, P-06 Edge Honesty) with grep-able audit signals"
19
+ },
20
+ {
21
+ "name": "emotional-design",
22
+ "path": "reference/emotional-design.md",
23
+ "type": "heuristic",
24
+ "phase": 19.6,
25
+ "description": "Don Norman's visceral/behavioral/reflective three-level cross-cutting scoring lens with per-level rubrics and cross-level conflict patterns"
26
+ },
27
+ {
28
+ "name": "first-principles",
29
+ "path": "reference/first-principles.md",
30
+ "type": "heuristic",
31
+ "phase": 19.6,
32
+ "description": "3-invariant framework (body/attention/memory) with grep-able principle→code pairs and reducibility test; wired into design-discussant brief stage"
33
+ },
6
34
  {
7
35
  "name": "DEPRECATIONS",
8
36
  "path": "reference/DEPRECATIONS.md",
@@ -0,0 +1,42 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "$id": "https://get-design-done.example/schemas/budget.schema.json",
4
+ "title": ".design/budget.json",
5
+ "description": "Shape of .design/budget.json — the Phase 10.1 optimization-layer budget governance file. Consumed by hooks/budget-enforcer.ts on every PreToolUse:Agent spawn. Bootstrap writes the Default Config from reference/config-schema.md if the file is missing.",
6
+ "type": "object",
7
+ "additionalProperties": true,
8
+ "properties": {
9
+ "per_task_cap_usd": {
10
+ "type": "number",
11
+ "minimum": 0,
12
+ "description": "Hard ceiling per agent spawn (USD). Breach under enforcement_mode=enforce triggers D-02 block."
13
+ },
14
+ "per_phase_cap_usd": {
15
+ "type": "number",
16
+ "minimum": 0,
17
+ "description": "Cumulative ceiling across all spawns within the current phase (USD). Read from .design/STATE.md frontmatter `phase:` field."
18
+ },
19
+ "tier_overrides": {
20
+ "type": "object",
21
+ "additionalProperties": {
22
+ "type": "string",
23
+ "enum": ["haiku", "sonnet", "opus"]
24
+ },
25
+ "description": "Per-agent tier override map (agent-name -> tier). Wins over agent frontmatter default-tier per D-04."
26
+ },
27
+ "auto_downgrade_on_cap": {
28
+ "type": "boolean",
29
+ "description": "When true, hook silently rewrites tier -> haiku at 80% of per_task_cap_usd per D-03; logged as tier_downgraded: true in telemetry."
30
+ },
31
+ "cache_ttl_seconds": {
32
+ "type": "integer",
33
+ "minimum": 0,
34
+ "description": "TTL (seconds) driving .design/cache-manifest.json entry expiry per D-08 Layer B. Default 3600."
35
+ },
36
+ "enforcement_mode": {
37
+ "type": "string",
38
+ "enum": ["enforce", "warn", "log"],
39
+ "description": "D-11 enforcement policy. enforce = block + auto-downgrade; warn = print warnings but allow spawn; log = advisory-only telemetry without gating."
40
+ }
41
+ }
42
+ }
@@ -0,0 +1,55 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "$id": "https://raw.githubusercontent.com/hegemonart/get-design-done/main/reference/schemas/events.schema.json",
4
+ "title": "Event",
5
+ "description": "One line of .design/telemetry/events.jsonl — the append-only telemetry stream produced by Plan 20-06. Each event is a single JSON object followed by a newline. See .planning/phases/20-gdd-sdk-foundation/20-06-PLAN.md.",
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "required": ["type", "timestamp", "sessionId", "payload"],
9
+ "properties": {
10
+ "type": {
11
+ "type": "string",
12
+ "minLength": 1,
13
+ "description": "Free-form event type identifier. Pre-registered seeds: state.mutation, state.transition, stage.entered, stage.exited, hook.fired, error."
14
+ },
15
+ "timestamp": {
16
+ "type": "string",
17
+ "format": "date-time",
18
+ "description": "ISO-8601 timestamp of event emission."
19
+ },
20
+ "sessionId": {
21
+ "type": "string",
22
+ "minLength": 1,
23
+ "description": "Stable identifier per GDD pipeline run; correlates events across stages."
24
+ },
25
+ "stage": {
26
+ "type": "string",
27
+ "enum": ["brief", "explore", "plan", "design", "verify"],
28
+ "description": "Optional — present when the event is scoped to a pipeline stage."
29
+ },
30
+ "cycle": {
31
+ "type": "string",
32
+ "minLength": 1,
33
+ "description": "Optional — present when the event is scoped to a cycle identifier."
34
+ },
35
+ "payload": {
36
+ "type": "object",
37
+ "description": "Event-type-specific payload. Opaque at the envelope level."
38
+ },
39
+ "_meta": {
40
+ "type": "object",
41
+ "additionalProperties": false,
42
+ "required": ["pid", "host", "source"],
43
+ "properties": {
44
+ "pid": { "type": "integer", "minimum": 0 },
45
+ "host": { "type": "string" },
46
+ "source": { "type": "string" }
47
+ },
48
+ "description": "Writer-injected provenance. Never set by callers."
49
+ },
50
+ "_truncated": {
51
+ "type": "boolean",
52
+ "description": "Writer-set flag indicating the payload exceeded maxLineBytes and has been replaced by a placeholder."
53
+ }
54
+ }
55
+ }