@codewithjuber/forgekit 0.8.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 (140) hide show
  1. package/.claude-plugin/marketplace.json +12 -0
  2. package/.claude-plugin/plugin.json +20 -0
  3. package/.codex-plugin/plugin.json +29 -0
  4. package/.mcp.json +8 -0
  5. package/ARCHITECTURE.md +314 -0
  6. package/CHANGELOG.md +467 -0
  7. package/LICENSE +21 -0
  8. package/ONBOARDING.md +180 -0
  9. package/README.md +286 -0
  10. package/bin/claude-init.sh +90 -0
  11. package/bin/claude-taste.sh +33 -0
  12. package/bin/learn-consolidate.sh +51 -0
  13. package/brand.json +15 -0
  14. package/global/CLAUDE.md +31 -0
  15. package/global/crew/frontend-verifier.md +36 -0
  16. package/global/crew/independent-reviewer.md +29 -0
  17. package/global/crew/scout.md +24 -0
  18. package/global/crew/verifier.md +28 -0
  19. package/global/guards/_guardlib.sh +36 -0
  20. package/global/guards/cortex.sh +14 -0
  21. package/global/guards/cost-budget.sh +41 -0
  22. package/global/guards/doom-loop.sh +25 -0
  23. package/global/guards/format-on-edit.sh +32 -0
  24. package/global/guards/lean-guard.sh +20 -0
  25. package/global/guards/protect-paths.sh +45 -0
  26. package/global/guards/recall-load.sh +22 -0
  27. package/global/guards/secret-redact.sh +18 -0
  28. package/global/guards/session-learner.sh +72 -0
  29. package/global/recall/MEMORY.md +7 -0
  30. package/global/rules/self-correction.md +17 -0
  31. package/global/rules/stack-notes.md +24 -0
  32. package/global/rules/tech-currency.md +19 -0
  33. package/global/settings.template.json +183 -0
  34. package/global/statusline.sh +51 -0
  35. package/global/taste/brutalist.json +9 -0
  36. package/global/taste/brutalist.md +19 -0
  37. package/global/taste/corporate.json +9 -0
  38. package/global/taste/corporate.md +19 -0
  39. package/global/taste/editorial.json +9 -0
  40. package/global/taste/editorial.md +19 -0
  41. package/global/taste/minimalist.json +9 -0
  42. package/global/taste/minimalist.md +20 -0
  43. package/global/taste/playful.json +9 -0
  44. package/global/taste/playful.md +19 -0
  45. package/global/tools/atlas/SKILL.md +27 -0
  46. package/global/tools/code-modernization/SKILL.md +275 -0
  47. package/global/tools/code-modernization/references/cost-impact-preflight.md +54 -0
  48. package/global/tools/code-modernization/references/design-patterns-cheatsheet.md +24 -0
  49. package/global/tools/code-modernization/references/research-protocol.md +42 -0
  50. package/global/tools/code-modernization/scripts/preflight_scan.py +190 -0
  51. package/global/tools/cognitive-substrate/SKILL.md +56 -0
  52. package/global/tools/cognitive-substrate/references/capability-map.md +17 -0
  53. package/global/tools/cost-guard/SKILL.md +50 -0
  54. package/global/tools/design-md/SKILL.md +54 -0
  55. package/global/tools/dev-radar/SKILL.md +56 -0
  56. package/global/tools/explore-plan-code/SKILL.md +24 -0
  57. package/global/tools/lean/SKILL.md +41 -0
  58. package/global/tools/recall/SKILL.md +31 -0
  59. package/global/tools/reuse-first/SKILL.md +64 -0
  60. package/global/tools/self-improve/SKILL.md +44 -0
  61. package/global/tools/taste/SKILL.md +26 -0
  62. package/global/tools/tech-selector/SKILL.md +35 -0
  63. package/global/tools/ui-workflow/SKILL.md +44 -0
  64. package/hooks/hooks.json +107 -0
  65. package/install.sh +88 -0
  66. package/package.json +93 -0
  67. package/public/index.html +45 -0
  68. package/scripts/build-pages.mjs +180 -0
  69. package/scripts/bump.mjs +322 -0
  70. package/skills/cognitive-substrate/SKILL.md +56 -0
  71. package/skills/cognitive-substrate/references/capability-map.md +17 -0
  72. package/source/mcp.json +10 -0
  73. package/source/rules.json +106 -0
  74. package/source/substrate.json +41 -0
  75. package/src/adjudicate.js +84 -0
  76. package/src/anchor.js +210 -0
  77. package/src/atlas.js +487 -0
  78. package/src/brain.js +84 -0
  79. package/src/brand.js +25 -0
  80. package/src/cli.js +1509 -0
  81. package/src/context.js +273 -0
  82. package/src/cortex.js +251 -0
  83. package/src/cortex_distill.js +55 -0
  84. package/src/cortex_features.js +81 -0
  85. package/src/cortex_hook.js +197 -0
  86. package/src/cortex_hook_main.js +139 -0
  87. package/src/cortex_mcp.js +352 -0
  88. package/src/cost_report.js +271 -0
  89. package/src/dash.html +396 -0
  90. package/src/dash.js +220 -0
  91. package/src/diagnose.js +0 -0
  92. package/src/doctor.js +315 -0
  93. package/src/embed.js +244 -0
  94. package/src/emit/_shared.js +39 -0
  95. package/src/emit/aider.js +22 -0
  96. package/src/emit/claude.js +44 -0
  97. package/src/emit/codex.js +17 -0
  98. package/src/emit/continue.js +28 -0
  99. package/src/emit/copilot.js +12 -0
  100. package/src/emit/cursor.js +23 -0
  101. package/src/emit/gemini.js +40 -0
  102. package/src/emit/mcp.js +94 -0
  103. package/src/emit/windsurf.js +22 -0
  104. package/src/emit/zed.js +34 -0
  105. package/src/eval.js +47 -0
  106. package/src/extract.js +82 -0
  107. package/src/harden.js +44 -0
  108. package/src/imagine.js +301 -0
  109. package/src/init.js +178 -0
  110. package/src/lean.js +149 -0
  111. package/src/ledger.js +475 -0
  112. package/src/ledger_bridge.js +279 -0
  113. package/src/ledger_read.js +152 -0
  114. package/src/ledger_store.js +360 -0
  115. package/src/lessons.js +185 -0
  116. package/src/lessons_store.js +137 -0
  117. package/src/metrics.js +54 -0
  118. package/src/model_tiers.js +17 -0
  119. package/src/model_tiers.json +39 -0
  120. package/src/predictor.js +143 -0
  121. package/src/preflight.js +410 -0
  122. package/src/providers.js +320 -0
  123. package/src/recall.js +103 -0
  124. package/src/reuse.js +0 -0
  125. package/src/route.js +323 -0
  126. package/src/scope.js +122 -0
  127. package/src/skillgate.js +89 -0
  128. package/src/speclock.js +64 -0
  129. package/src/substrate.js +492 -0
  130. package/src/sync.js +132 -0
  131. package/src/taste.js +55 -0
  132. package/src/uicheck.js +96 -0
  133. package/src/uifingerprint.js +861 -0
  134. package/src/uivisual.js +334 -0
  135. package/src/util.js +71 -0
  136. package/src/verify.js +117 -0
  137. package/templates/project-layer/.claude/settings.json +22 -0
  138. package/templates/project-layer/.claude/skills/hostlelo-deploy/SKILL.md +38 -0
  139. package/templates/project-layer/AGENTS.md +28 -0
  140. package/templates/project-layer/CLAUDE.md +40 -0
@@ -0,0 +1,183 @@
1
+ {
2
+ "$schema": "https://json.schemastore.org/claude-code-settings.json",
3
+ "model": "sonnet",
4
+ "includeCoAuthoredBy": false,
5
+ "cleanupPeriodDays": 30,
6
+ "statusLine": {
7
+ "type": "command",
8
+ "command": "bash ~/.forge/statusline.sh"
9
+ },
10
+ "permissions": {
11
+ "defaultMode": "default",
12
+ "allow": [
13
+ "Read",
14
+ "Glob",
15
+ "Grep",
16
+ "Bash(git status)",
17
+ "Bash(git status:*)",
18
+ "Bash(git diff)",
19
+ "Bash(git diff:*)",
20
+ "Bash(git log:*)",
21
+ "Bash(git show:*)",
22
+ "Bash(git branch:*)",
23
+ "Bash(git add:*)",
24
+ "Bash(git stash:*)",
25
+ "Bash(ls:*)",
26
+ "Bash(cat:*)",
27
+ "Bash(rg:*)",
28
+ "Bash(fd:*)",
29
+ "Bash(tree:*)",
30
+ "Bash(head:*)",
31
+ "Bash(tail:*)",
32
+ "Bash(wc:*)",
33
+ "Bash(npm run lint)",
34
+ "Bash(npm run lint:*)",
35
+ "Bash(npm run test)",
36
+ "Bash(npm run test:*)",
37
+ "Bash(npm run build)",
38
+ "Bash(npm run typecheck)",
39
+ "Bash(npm ci)",
40
+ "Bash(pnpm lint)",
41
+ "Bash(pnpm test:*)",
42
+ "Bash(pnpm build)",
43
+ "Bash(yarn lint)",
44
+ "Bash(yarn test:*)",
45
+ "Bash(node --version)",
46
+ "Bash(python -m pytest:*)",
47
+ "Bash(pytest:*)",
48
+ "Bash(ruff:*)",
49
+ "Bash(mypy:*)",
50
+ "Bash(gh pr view:*)",
51
+ "Bash(gh issue view:*)",
52
+ "Bash(gh pr diff:*)"
53
+ ],
54
+ "ask": [
55
+ "Bash(git push:*)",
56
+ "Bash(git commit:*)",
57
+ "Bash(gh pr create:*)",
58
+ "Bash(gh pr merge:*)"
59
+ ],
60
+ "deny": [
61
+ "Read(./.env)",
62
+ "Read(./.env.*)",
63
+ "Read(./**/.env)",
64
+ "Read(./**/.env.*)",
65
+ "Read(./**/*.pem)",
66
+ "Read(./**/id_rsa)",
67
+ "Read(./**/id_ed25519)",
68
+ "Read(./secrets/**)",
69
+ "Bash(rm -rf /:*)",
70
+ "Bash(rm -rf ~:*)",
71
+ "Bash(git push --force:*)",
72
+ "Bash(git push -f:*)",
73
+ "Bash(curl:* | sh)",
74
+ "Bash(curl:* | bash)",
75
+ "Bash(sudo:*)"
76
+ ]
77
+ },
78
+ "hooks": {
79
+ "UserPromptSubmit": [
80
+ {
81
+ "hooks": [
82
+ {
83
+ "type": "command",
84
+ "command": "bash ~/.forge/guards/cortex.sh prompt"
85
+ },
86
+ {
87
+ "type": "command",
88
+ "command": "bash ~/.forge/guards/cortex.sh preflight"
89
+ }
90
+ ]
91
+ }
92
+ ],
93
+ "SessionStart": [
94
+ {
95
+ "matcher": "startup|resume|clear",
96
+ "hooks": [
97
+ {
98
+ "type": "command",
99
+ "command": "bash ~/.forge/guards/recall-load.sh"
100
+ },
101
+ {
102
+ "type": "command",
103
+ "command": "bash ~/.forge/guards/cortex.sh session-start"
104
+ }
105
+ ]
106
+ }
107
+ ],
108
+ "PreToolUse": [
109
+ {
110
+ "matcher": "Edit|Write|MultiEdit|Bash",
111
+ "hooks": [
112
+ {
113
+ "type": "command",
114
+ "command": "bash ~/.forge/guards/protect-paths.sh"
115
+ },
116
+ {
117
+ "type": "command",
118
+ "command": "bash ~/.forge/guards/cost-budget.sh"
119
+ },
120
+ {
121
+ "type": "command",
122
+ "command": "bash ~/.forge/guards/doom-loop.sh"
123
+ }
124
+ ]
125
+ },
126
+ {
127
+ "matcher": "Edit|Write|MultiEdit",
128
+ "hooks": [
129
+ {
130
+ "type": "command",
131
+ "command": "bash ~/.forge/guards/cortex.sh pre-edit"
132
+ }
133
+ ]
134
+ }
135
+ ],
136
+ "PostToolUse": [
137
+ {
138
+ "matcher": "Edit|Write|MultiEdit",
139
+ "hooks": [
140
+ {
141
+ "type": "command",
142
+ "command": "bash ~/.forge/guards/format-on-edit.sh"
143
+ },
144
+ {
145
+ "type": "command",
146
+ "command": "bash ~/.forge/guards/cortex.sh capture"
147
+ }
148
+ ]
149
+ },
150
+ {
151
+ "matcher": "Bash|Read|Grep",
152
+ "hooks": [
153
+ {
154
+ "type": "command",
155
+ "command": "bash ~/.forge/guards/secret-redact.sh"
156
+ },
157
+ {
158
+ "type": "command",
159
+ "command": "bash ~/.forge/guards/cortex.sh capture"
160
+ }
161
+ ]
162
+ }
163
+ ],
164
+ "Stop": [
165
+ {
166
+ "hooks": [
167
+ {
168
+ "type": "command",
169
+ "command": "bash ~/.forge/guards/lean-guard.sh"
170
+ },
171
+ {
172
+ "type": "command",
173
+ "command": "bash ~/.forge/guards/session-learner.sh"
174
+ },
175
+ {
176
+ "type": "command",
177
+ "command": "bash ~/.forge/guards/cortex.sh stop"
178
+ }
179
+ ]
180
+ }
181
+ ]
182
+ }
183
+ }
@@ -0,0 +1,51 @@
1
+ #!/usr/bin/env bash
2
+ # Custom status line: dir · git branch · model · session cost · cache hit%.
3
+ # Surfaces context-cost AND prompt-cache health so you notice when to /clear,
4
+ # /compact, or why a turn went uncached (model switch, MCP reconnect, upgrade).
5
+ set -uo pipefail
6
+
7
+ input="$(cat)"
8
+
9
+ if command -v jq >/dev/null 2>&1; then
10
+ dir="$(printf '%s' "$input" | jq -r '.workspace.current_dir // .cwd // empty')"
11
+ model="$(printf '%s' "$input"| jq -r '.model.display_name // .model.id // "?"')"
12
+ cost="$(printf '%s' "$input" | jq -r '.cost.total_cost_usd // empty')"
13
+ add="$(printf '%s' "$input" | jq -r '.cost.total_lines_added // empty')"
14
+ del="$(printf '%s' "$input" | jq -r '.cost.total_lines_removed // empty')"
15
+ over="$(printf '%s' "$input" | jq -r '.exceeds_200k_tokens // false')"
16
+ cread="$(printf '%s' "$input"| jq -r '.current_usage.cache_read_input_tokens // .cost.cache_read_input_tokens // empty')"
17
+ cwrite="$(printf '%s' "$input"|jq -r '.current_usage.cache_creation_input_tokens // .cost.cache_creation_input_tokens // empty')"
18
+ else
19
+ dir="$PWD"; model="?"; cost=""; add=""; del=""; over="false"; cread=""; cwrite=""
20
+ fi
21
+
22
+ [ -n "${dir:-}" ] || dir="$PWD"
23
+ short="${dir/#$HOME/~}"
24
+
25
+ branch=""
26
+ if git -C "$dir" rev-parse --is-inside-work-tree >/dev/null 2>&1; then
27
+ branch="$(git -C "$dir" branch --show-current 2>/dev/null)"
28
+ [ -n "$branch" ] && branch=" \033[35m⎇ $branch\033[0m"
29
+ fi
30
+
31
+ costp=""
32
+ if [ -n "${cost:-}" ] && [ "$cost" != "null" ]; then
33
+ costp="$(printf ' \033[33m$%.3f\033[0m' "$cost" 2>/dev/null || echo " \$$cost")"
34
+ fi
35
+
36
+ diffp=""
37
+ if [ -n "${add:-}" ] && [ "$add" != "null" ]; then
38
+ diffp="$(printf ' \033[32m+%s\033[0m/\033[31m-%s\033[0m' "${add:-0}" "${del:-0}")"
39
+ fi
40
+
41
+ # Cache hit rate: read / (read + creation). High = cache working; low = prefix busted.
42
+ cachep=""
43
+ if [ -n "${cread:-}" ] && [ "$cread" != "null" ] && command -v awk >/dev/null 2>&1; then
44
+ cachep="$(awk -v r="${cread:-0}" -v w="${cwrite:-0}" 'BEGIN{t=r+w; if(t>0){p=100*r/t; c=(p>=70)?32:(p>=30)?33:31; printf " \033[%dm⚡%d%%\033[0m", c, p}}')"
45
+ fi
46
+
47
+ warn=""
48
+ [ "${over:-false}" = "true" ] && warn=" \033[41m ctx>200k — /clear \033[0m"
49
+
50
+ printf "\033[36m%s\033[0m%b \033[90m·\033[0m \033[1m%s\033[0m%b%b%b%b" \
51
+ "$short" "$branch" "$model" "$costp" "$diffp" "$cachep" "$warn"
@@ -0,0 +1,9 @@
1
+ {
2
+ "name": "brutalist",
3
+ "why": "Raw, honest, high-contrast (brutalist.md): pure #000/#FFF plus ONE loud accent -> max_hues 1 with chroma pinned high (chroma = HSL saturation/100 proxy, 0-1); 'DON'T round corners' -> radius_levels [0,0]; no SOFT shadows but a hard offset shadow is idiomatic brutalism -> shadow_levels [0,1]; visible size jumps -> wide geometric ratio; tau_slop is the highest of all profiles because brutalism must sit maximally far from the generic soft-template look.",
4
+ "palette": { "max_hues": 1, "chroma": [0.7, 1.0], "neutrals": "stark" },
5
+ "space": { "scale": "geometric", "ratio": [1.5, 2.0], "base": [4, 8] },
6
+ "type": { "max_families": 2 },
7
+ "shape": { "radius_levels": [0, 0], "shadow_levels": [0, 1] },
8
+ "gate": { "tau_slop": 0.45, "tau_conform": 0.5 }
9
+ }
@@ -0,0 +1,19 @@
1
+ # DESIGN.md — Brutalist
2
+
3
+ One direction: raw, honest, high-contrast. The structure IS the style.
4
+
5
+ ## Color
6
+ - Stark: pure #000 on #FFF (or inverted). One loud accent (#FF3B00 / #00E5FF).
7
+ - Flat fills only — no gradients, no tints.
8
+
9
+ ## Type
10
+ - Grotesk or monospace (Helvetica / Space Grotesk / JetBrains Mono).
11
+ - Big, tight, often uppercase headings with visible size jumps.
12
+
13
+ ## Layout & motion
14
+ - Thick solid borders (2–4px #000). Exposed grid; columns and rules visible.
15
+ - Motion: instant or snappy (≤120ms). Nothing that reads as "polished".
16
+
17
+ ## Do / Don't
18
+ - DO use borders as structure and oversize headers.
19
+ - DON'T round corners, add soft shadows, or use pastels.
@@ -0,0 +1,9 @@
1
+ {
2
+ "name": "corporate",
3
+ "why": "Trustworthy, clear, accessible (corporate.md): one professional primary (#2563EB) plus three semantic states -> max_hues 4; mid-to-high but never neon chroma (chroma = HSL saturation/100 proxy, 0-1); cool slate neutrals; 'consistent 8px spacing' -> base [8], linear scale with modest ratio; one clean sans -> max_families 1; moderate rounding and subtle elevation -> radius [1,2] / shadow [0,2]; tau_slop is the LOWEST of all profiles because corporate deliberately stays near convention, and tau_conform is tight because consistency is the whole point.",
4
+ "palette": { "max_hues": 4, "chroma": [0.3, 0.9], "neutrals": "cool" },
5
+ "space": { "scale": "linear", "ratio": [1.25, 1.5], "base": [8] },
6
+ "type": { "max_families": 1 },
7
+ "shape": { "radius_levels": [1, 2], "shadow_levels": [0, 2] },
8
+ "gate": { "tau_slop": 0.2, "tau_conform": 0.4 }
9
+ }
@@ -0,0 +1,19 @@
1
+ # DESIGN.md — Corporate
2
+
3
+ One direction: trustworthy, clear, accessible. Calm and structured.
4
+
5
+ ## Color
6
+ - Neutral base (#F8FAFC / #0F172A text) + a professional primary (#2563EB).
7
+ - Semantic states (success / warn / error) at WCAG AA contrast.
8
+
9
+ ## Type
10
+ - One clean sans (Inter / Source Sans), scale at 400 / 600 / 700.
11
+ - Comfortable body (16px+, 1.6); never below AA contrast.
12
+
13
+ ## Layout & motion
14
+ - Structured grid, consistent 8px spacing, obvious primary actions.
15
+ - Motion: subtle and functional (150–250ms ease); reinforces state, never decorative.
16
+
17
+ ## Do / Don't
18
+ - DO keep components consistent, labeled, and keyboard-accessible with focus states.
19
+ - DON'T rely on color alone for meaning or surprise the user.
@@ -0,0 +1,9 @@
1
+ {
2
+ "name": "editorial",
3
+ "why": "Magazine-grade (editorial.md): warm paper + rich ink + ONE muted accent, but max_hues 2 because the HSL saturation/100 chroma proxy (0-1) counts warm paper itself (#FBFAF7-class, s well above the neutral cutoff) as a hue bin — one accent + the paper cast; low-to-mid chroma band (#7C6A4E sits near 0.23); warm neutrals; spacious geometric rhythm near the classic 1.4-1.62 ratios; 'exactly one serif + one sans', 'DON'T use more than two families' -> max_families 2; thin rules over boxes -> radius [0,1], shadow [0,1]; tau_slop 0.35 (the spec Section 3 example) because considered typography must clear the template look by a wide margin.",
4
+ "palette": { "max_hues": 2, "chroma": [0.1, 0.45], "neutrals": "warm" },
5
+ "space": { "scale": "geometric", "ratio": [1.4, 1.62], "base": [4, 8] },
6
+ "type": { "max_families": 2 },
7
+ "shape": { "radius_levels": [0, 1], "shadow_levels": [0, 1] },
8
+ "gate": { "tau_slop": 0.35, "tau_conform": 0.5 }
9
+ }
@@ -0,0 +1,19 @@
1
+ # DESIGN.md — Editorial (high-end)
2
+
3
+ One direction: magazine-grade. Typographic, spacious, considered.
4
+
5
+ ## Color
6
+ - Warm paper (#FBFAF7), rich ink (#1A1A1A); one muted accent (deep teal / #7C6A4E).
7
+ - Restrained — color signals meaning, never decoration.
8
+
9
+ ## Type
10
+ - Serif display for headings (Fraunces / Georgia) + a clean sans body.
11
+ - Generous leading (1.7), measured line length (~66ch), real hanging quotes.
12
+
13
+ ## Layout & motion
14
+ - Asymmetric editorial grid; large hero type; captions and thin rules.
15
+ - Motion: slow, graceful (250–400ms ease-out); subtle parallax at most.
16
+
17
+ ## Do / Don't
18
+ - DO pair exactly one serif + one sans and respect the measure.
19
+ - DON'T cramp text edge-to-edge or use more than two families.
@@ -0,0 +1,9 @@
1
+ {
2
+ "name": "minimalist",
3
+ "why": "Restraint (minimalist.md): near-monochrome with exactly ONE saturated accent for the primary action -> max_hues 1, chroma band around a committed accent like #2563EB (chroma = HSL saturation/100 proxy, 0-1); neutral near-white/ink base; '8px spacing scale' -> base [8], calm linear-to-wide steps; one sans, 2 weights -> max_families 1; hairlines only, 'no bounce, no shadow' / 'DON'T add drop shadows' -> shadow_levels [0,0], radius [0,1]; tau_slop 0.3 because minimal surfaces are CLOSE to flat templates by construction yet must still avoid the default-blue-card centroid, tau_conform tight because a minimal system tolerates zero drift.",
4
+ "palette": { "max_hues": 1, "chroma": [0.4, 0.9], "neutrals": "neutral" },
5
+ "space": { "scale": "linear", "ratio": [1.5, 2.0], "base": [8] },
6
+ "type": { "max_families": 1 },
7
+ "shape": { "radius_levels": [0, 1], "shadow_levels": [0, 0] },
8
+ "gate": { "tau_slop": 0.3, "tau_conform": 0.4 }
9
+ }
@@ -0,0 +1,20 @@
1
+ # DESIGN.md — Minimalist
2
+
3
+ One direction: restraint. Content leads; the UI recedes. When unsure, remove.
4
+
5
+ ## Color
6
+ - Near-monochrome: near-white bg (#FAFAFA), ink text (#111).
7
+ - Exactly ONE accent (e.g. #2563EB), used only for the primary action.
8
+ - Hairline borders (#E5E7EB) — no boxes inside boxes.
9
+
10
+ ## Type
11
+ - One sans family (system-ui / Inter), 2 weights max (400 / 600).
12
+ - Large, calm headings; generous body line-height (1.6).
13
+
14
+ ## Layout & motion
15
+ - Wide margins, single column where possible; 8px spacing scale.
16
+ - Motion: 150–200ms ease, opacity/translate only. No bounce, no shadow.
17
+
18
+ ## Do / Don't
19
+ - DO align to a strict grid and let space breathe.
20
+ - DON'T add gradients, drop shadows, or a second accent.
@@ -0,0 +1,9 @@
1
+ {
2
+ "name": "playful",
3
+ "why": "Friendly, energetic (playful.md): '2-3 saturated hues' -> max_hues 3, the most permissive palette of the five, with chroma pinned high but short of neon-on-neon (chroma = HSL saturation/100 proxy, 0-1); warm soft background neutrals; grid-aligned but generous -> geometric 1.25-1.5 on a 4/8 base; one rounded sans plus an optional display face -> max_families 2; 'rounded fills (radius 12-20px)' and soft shadows -> radius [1,3], shadow [1,2] (some rounding and lift is REQUIRED, not just allowed); default tau_slop 0.25 — playful legitimately lives nearer the card-and-radius territory templates also occupy.",
4
+ "palette": { "max_hues": 3, "chroma": [0.55, 1.0], "neutrals": "warm" },
5
+ "space": { "scale": "geometric", "ratio": [1.25, 1.5], "base": [4, 8] },
6
+ "type": { "max_families": 2 },
7
+ "shape": { "radius_levels": [1, 3], "shadow_levels": [1, 2] },
8
+ "gate": { "tau_slop": 0.25, "tau_conform": 0.5 }
9
+ }
@@ -0,0 +1,19 @@
1
+ # DESIGN.md — Playful
2
+
3
+ One direction: friendly, energetic, human. Delight without clutter.
4
+
5
+ ## Color
6
+ - Vibrant, warm palette: 2–3 saturated hues (#FF7A59, #5B8DEF, #FFC24B) on a soft bg.
7
+ - Soft shadows and rounded fills (radius 12–20px).
8
+
9
+ ## Type
10
+ - Rounded / geometric sans (Nunito / Poppins). Bold, friendly headings.
11
+ - Slightly larger base size; comfortable spacing.
12
+
13
+ ## Layout & motion
14
+ - Cards, pills, generous radius — playful but still aligned to a grid.
15
+ - Motion: spring / bounce on interaction (200–300ms); hover lifts; gentle wiggle.
16
+
17
+ ## Do / Don't
18
+ - DO add ONE delightful micro-interaction per key action.
19
+ - DON'T animate everything or go neon-on-neon.
@@ -0,0 +1,27 @@
1
+ ---
2
+ name: atlas
3
+ description: Forge's code-graph. Use to find where a symbol is defined (where-is-X), to discover reusable code before writing new, and to check a symbol actually exists before calling it (anti-hallucination). Backed by `forge atlas`.
4
+ ---
5
+
6
+ # atlas — the code-graph
7
+
8
+ A precomputed, portable symbol index at `.forge/atlas.json`. Any tool reads it via
9
+ `forge atlas` or plain `jq` — no MCP required to consume.
10
+
11
+ ## Use it
12
+ - `forge atlas build` — (re)build the index for this repo. Cheap; run once, and
13
+ again after large changes.
14
+ - `forge atlas query <term>` — where is `<term>` defined? Returns file:line + kind.
15
+ Prefer this over grep-and-read-files (far fewer tokens).
16
+ - `forge atlas has <symbol>` — is this symbol defined anywhere? Use before calling
17
+ an unfamiliar function/class: "not found" is a strong hallucinated-API signal.
18
+
19
+ ## When
20
+ - Reuse-first: before writing a helper, `forge atlas query` for an existing one.
21
+ - Verification: after generating code that calls project symbols, spot-check the
22
+ unfamiliar ones with `forge atlas has`.
23
+
24
+ ## Honest boundary
25
+ v1 indexes symbol *definitions* + membership, not a full call graph ("what calls
26
+ Z"). It flags likely-missing symbols; it does not certify correctness. The call
27
+ graph is the documented upgrade (LSP / serena-backed export).