forgedock 1.0.16 → 1.0.18

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 (190) hide show
  1. package/README.md +54 -3
  2. package/bin/cross-publish.mjs +344 -0
  3. package/bin/forgedock.mjs +2205 -541
  4. package/bin/github-app-manifest.json.license +2 -0
  5. package/bin/hooks/session-start.mjs +4 -5
  6. package/bin/registry.mjs +20 -0
  7. package/bin/tui.mjs +172 -96
  8. package/commands/adopt.md +433 -0
  9. package/commands/analytics.md +2 -0
  10. package/commands/audit-agents.md +2 -0
  11. package/commands/audit.md +2 -0
  12. package/commands/autopilot.md +77 -0
  13. package/commands/changelog.md +354 -0
  14. package/commands/cleanup.md +2 -0
  15. package/commands/compat-audit.md +330 -0
  16. package/commands/deploy-info.md +6 -5
  17. package/commands/design-bench.md +176 -0
  18. package/commands/design-render-critique-loop.md +103 -0
  19. package/commands/design.md +259 -0
  20. package/commands/diagnose.md +483 -0
  21. package/commands/explain.md +349 -0
  22. package/commands/forge-stats.md +2 -0
  23. package/commands/forgedock-init.md +2 -0
  24. package/commands/geo-audit.md +2 -0
  25. package/commands/incident-response.md +2 -0
  26. package/commands/issue.md +9 -3
  27. package/commands/milestone.md +2 -0
  28. package/commands/optimize.md +411 -0
  29. package/commands/orchestrate.md +239 -0
  30. package/commands/pipeline-health.md +60 -1
  31. package/commands/qa-sweep.md +39 -2
  32. package/commands/quality-gate.md +67 -0
  33. package/commands/replay.md +263 -0
  34. package/commands/resume.md +264 -0
  35. package/commands/review-pr-agents.md +5 -1
  36. package/commands/review-pr-staging.md +160 -2
  37. package/commands/review-pr.md +85 -3
  38. package/commands/rollback.md +2 -0
  39. package/commands/scope.md +280 -0
  40. package/commands/security-audit.md +2 -0
  41. package/commands/status.md +262 -0
  42. package/commands/sync-ecosystem.md +2 -0
  43. package/commands/test-gate.md +929 -0
  44. package/commands/validate.md +2 -0
  45. package/commands/work-on/build/architect.md +128 -18
  46. package/commands/work-on/build/context.md +130 -17
  47. package/commands/work-on/build/implement.md +7 -3
  48. package/commands/work-on/build/validate.md +2 -0
  49. package/commands/work-on/build.md +32 -7
  50. package/commands/work-on/close.md +85 -0
  51. package/commands/work-on/decompose.md +2 -0
  52. package/commands/work-on/investigate.md +30 -3
  53. package/commands/work-on/review.md +13 -1
  54. package/commands/work-on-monolithic.md +2 -0
  55. package/commands/work-on.md +676 -38
  56. package/docs/BRAND.md +51 -0
  57. package/docs/CI.md +177 -0
  58. package/docs/CONFIG.md +94 -0
  59. package/docs/FORGE-PROTOCOL.md +324 -0
  60. package/docs/articles/b-vs-c-baseline.md +210 -0
  61. package/docs/articles/full-abc-benchmark.md +205 -0
  62. package/docs/articles/per-repo-adaptive-scripts-token-savings.md +174 -0
  63. package/docs/articles/selective-spec-loading-token-savings.md +140 -0
  64. package/docs/claude-breakpoints.json +47 -0
  65. package/docs/design/abc-benchmark.md +195 -0
  66. package/docs/design/design-architect-rationale.md +123 -0
  67. package/docs/design/design-memory.md +61 -0
  68. package/docs/design/design-spec-schema.md +248 -0
  69. package/docs/design/design-system-lint.md +150 -0
  70. package/docs/design/divergent-generation.md +106 -0
  71. package/docs/design/effects-appropriateness.md +133 -0
  72. package/docs/design/fixtures/briefs/README.md +47 -0
  73. package/docs/design/fixtures/briefs/cadence.md +39 -0
  74. package/docs/design/fixtures/briefs/plume.md +39 -0
  75. package/docs/design/fixtures/briefs/slipstream.md +39 -0
  76. package/docs/design/fixtures/briefs/tender.md +39 -0
  77. package/docs/design/fixtures/briefs/voltage.md +39 -0
  78. package/docs/design/fixtures/runs/b-vs-c-baseline/cadence/arm-b/run-1.html +364 -0
  79. package/docs/design/fixtures/runs/b-vs-c-baseline/cadence/arm-b/run-2.html +420 -0
  80. package/docs/design/fixtures/runs/b-vs-c-baseline/cadence/arm-b/run-3.html +506 -0
  81. package/docs/design/fixtures/runs/b-vs-c-baseline/plume/arm-b/run-1.html +611 -0
  82. package/docs/design/fixtures/runs/b-vs-c-baseline/plume/arm-b/run-2.html +594 -0
  83. package/docs/design/fixtures/runs/b-vs-c-baseline/plume/arm-b/run-3.html +817 -0
  84. package/docs/design/fixtures/runs/b-vs-c-baseline/runs.json +175 -0
  85. package/docs/design/fixtures/runs/b-vs-c-baseline/scorecard.json +138 -0
  86. package/docs/design/fixtures/runs/b-vs-c-baseline/slipstream/arm-b/run-1.html +373 -0
  87. package/docs/design/fixtures/runs/b-vs-c-baseline/slipstream/arm-b/run-2.html +398 -0
  88. package/docs/design/fixtures/runs/b-vs-c-baseline/slipstream/arm-b/run-3.html +595 -0
  89. package/docs/design/fixtures/runs/b-vs-c-baseline/tender/arm-b/run-1.html +531 -0
  90. package/docs/design/fixtures/runs/b-vs-c-baseline/tender/arm-b/run-2.html +565 -0
  91. package/docs/design/fixtures/runs/b-vs-c-baseline/tender/arm-b/run-3.html +674 -0
  92. package/docs/design/fixtures/runs/b-vs-c-baseline/voltage/arm-b/run-1.html +388 -0
  93. package/docs/design/fixtures/runs/b-vs-c-baseline/voltage/arm-b/run-2.html +463 -0
  94. package/docs/design/fixtures/runs/b-vs-c-baseline/voltage/arm-b/run-3.html +568 -0
  95. package/docs/design/fixtures/runs/full-abc/cadence/arm-a/run-1.html +562 -0
  96. package/docs/design/fixtures/runs/full-abc/cadence/arm-a/run-2.html +618 -0
  97. package/docs/design/fixtures/runs/full-abc/cadence/arm-a/run-3.html +618 -0
  98. package/docs/design/fixtures/runs/full-abc/cadence/arm-b/run-1.html +364 -0
  99. package/docs/design/fixtures/runs/full-abc/cadence/arm-b/run-2.html +420 -0
  100. package/docs/design/fixtures/runs/full-abc/cadence/arm-b/run-3.html +506 -0
  101. package/docs/design/fixtures/runs/full-abc/plume/arm-a/run-1.html +527 -0
  102. package/docs/design/fixtures/runs/full-abc/plume/arm-a/run-2.html +445 -0
  103. package/docs/design/fixtures/runs/full-abc/plume/arm-a/run-3.html +483 -0
  104. package/docs/design/fixtures/runs/full-abc/plume/arm-b/run-1.html +611 -0
  105. package/docs/design/fixtures/runs/full-abc/plume/arm-b/run-2.html +594 -0
  106. package/docs/design/fixtures/runs/full-abc/plume/arm-b/run-3.html +817 -0
  107. package/docs/design/fixtures/runs/full-abc/runs.json +190 -0
  108. package/docs/design/fixtures/runs/full-abc/scorecard.json +144 -0
  109. package/docs/design/fixtures/runs/full-abc/slipstream/arm-a/run-1.html +496 -0
  110. package/docs/design/fixtures/runs/full-abc/slipstream/arm-a/run-2.html +447 -0
  111. package/docs/design/fixtures/runs/full-abc/slipstream/arm-a/run-3.html +564 -0
  112. package/docs/design/fixtures/runs/full-abc/slipstream/arm-b/run-1.html +373 -0
  113. package/docs/design/fixtures/runs/full-abc/slipstream/arm-b/run-2.html +398 -0
  114. package/docs/design/fixtures/runs/full-abc/slipstream/arm-b/run-3.html +595 -0
  115. package/docs/design/fixtures/runs/full-abc/tender/arm-a/run-1.html +622 -0
  116. package/docs/design/fixtures/runs/full-abc/tender/arm-a/run-2.html +475 -0
  117. package/docs/design/fixtures/runs/full-abc/tender/arm-a/run-3.html +660 -0
  118. package/docs/design/fixtures/runs/full-abc/tender/arm-b/run-1.html +531 -0
  119. package/docs/design/fixtures/runs/full-abc/tender/arm-b/run-2.html +565 -0
  120. package/docs/design/fixtures/runs/full-abc/tender/arm-b/run-3.html +674 -0
  121. package/docs/design/fixtures/runs/full-abc/voltage/arm-a/run-1.html +525 -0
  122. package/docs/design/fixtures/runs/full-abc/voltage/arm-a/run-2.html +446 -0
  123. package/docs/design/fixtures/runs/full-abc/voltage/arm-a/run-3.html +463 -0
  124. package/docs/design/fixtures/runs/full-abc/voltage/arm-b/run-1.html +388 -0
  125. package/docs/design/fixtures/runs/full-abc/voltage/arm-b/run-2.html +463 -0
  126. package/docs/design/fixtures/runs/full-abc/voltage/arm-b/run-3.html +568 -0
  127. package/docs/design/fixtures/runs/full-abc-opus/cadence/arm-a/run-1.html +1068 -0
  128. package/docs/design/fixtures/runs/full-abc-opus/cadence/arm-a/run-2.html +1423 -0
  129. package/docs/design/fixtures/runs/full-abc-opus/cadence/arm-a/run-3.html +1245 -0
  130. package/docs/design/fixtures/runs/full-abc-opus/cadence/arm-b/run-1.html +305 -0
  131. package/docs/design/fixtures/runs/full-abc-opus/cadence/arm-b/run-2.html +327 -0
  132. package/docs/design/fixtures/runs/full-abc-opus/cadence/arm-b/run-3.html +428 -0
  133. package/docs/design/fixtures/runs/full-abc-opus/plume/arm-a/run-1.html +1270 -0
  134. package/docs/design/fixtures/runs/full-abc-opus/plume/arm-a/run-2.html +1172 -0
  135. package/docs/design/fixtures/runs/full-abc-opus/plume/arm-a/run-3.html +1532 -0
  136. package/docs/design/fixtures/runs/full-abc-opus/plume/arm-b/run-1.html +315 -0
  137. package/docs/design/fixtures/runs/full-abc-opus/plume/arm-b/run-2.html +342 -0
  138. package/docs/design/fixtures/runs/full-abc-opus/plume/arm-b/run-3.html +353 -0
  139. package/docs/design/fixtures/runs/full-abc-opus/runs.json +190 -0
  140. package/docs/design/fixtures/runs/full-abc-opus/scorecard.json +144 -0
  141. package/docs/design/fixtures/runs/full-abc-opus/slipstream/arm-a/run-1.html +345 -0
  142. package/docs/design/fixtures/runs/full-abc-opus/slipstream/arm-a/run-2.html +396 -0
  143. package/docs/design/fixtures/runs/full-abc-opus/slipstream/arm-a/run-3.html +502 -0
  144. package/docs/design/fixtures/runs/full-abc-opus/slipstream/arm-b/run-1.html +408 -0
  145. package/docs/design/fixtures/runs/full-abc-opus/slipstream/arm-b/run-2.html +446 -0
  146. package/docs/design/fixtures/runs/full-abc-opus/slipstream/arm-b/run-3.html +496 -0
  147. package/docs/design/fixtures/runs/full-abc-opus/tender/arm-a/run-1.html +813 -0
  148. package/docs/design/fixtures/runs/full-abc-opus/tender/arm-a/run-2.html +711 -0
  149. package/docs/design/fixtures/runs/full-abc-opus/tender/arm-a/run-3.html +721 -0
  150. package/docs/design/fixtures/runs/full-abc-opus/tender/arm-b/run-1.html +280 -0
  151. package/docs/design/fixtures/runs/full-abc-opus/tender/arm-b/run-2.html +291 -0
  152. package/docs/design/fixtures/runs/full-abc-opus/tender/arm-b/run-3.html +366 -0
  153. package/docs/design/fixtures/runs/full-abc-opus/voltage/arm-a/run-1.html +1010 -0
  154. package/docs/design/fixtures/runs/full-abc-opus/voltage/arm-a/run-2.html +836 -0
  155. package/docs/design/fixtures/runs/full-abc-opus/voltage/arm-a/run-3.html +930 -0
  156. package/docs/design/fixtures/runs/full-abc-opus/voltage/arm-b/run-1.html +407 -0
  157. package/docs/design/fixtures/runs/full-abc-opus/voltage/arm-b/run-2.html +396 -0
  158. package/docs/design/fixtures/runs/full-abc-opus/voltage/arm-b/run-3.html +529 -0
  159. package/docs/design/foundations/brutalist.css +294 -0
  160. package/docs/design/foundations/editorial.css +300 -0
  161. package/docs/design/foundations/minimal-luxury.css +295 -0
  162. package/docs/design/foundations/technical.css +293 -0
  163. package/docs/design/foundations/warm-photo.css +299 -0
  164. package/docs/design/reference-corpus.md +1726 -0
  165. package/docs/design/render-critique-loop.md +57 -0
  166. package/docs/site/getting-started.md +21 -0
  167. package/docs/spec-graph-schema.md +397 -0
  168. package/package.json +3 -3
  169. package/scripts/bench-scorecard.mjs +239 -0
  170. package/scripts/build-spec-graph.mjs +509 -0
  171. package/scripts/classify-lane.sh +138 -0
  172. package/scripts/design-system-lint.mjs +993 -0
  173. package/scripts/graph-query.sh +486 -0
  174. package/scripts/transition-label.sh +169 -0
  175. package/scripts/validate-pr-target.sh +30 -0
  176. package/scripts/validate-spec-graph.sh +423 -0
  177. package/templates/devdocs/README.md +72 -0
  178. package/templates/devdocs/agent/using-forgedock.md +3 -0
  179. package/templates/devdocs/agent/using-github.md +3 -0
  180. package/templates/devdocs/index.yaml +162 -0
  181. package/templates/devdocs/project/architecture.md +3 -0
  182. package/templates/devdocs/project/conventions.md +3 -0
  183. package/templates/devdocs/project/custom-instructions.md +3 -0
  184. package/templates/devdocs/project/glossary.md +3 -0
  185. package/templates/devdocs/project/stack.md +3 -0
  186. package/templates/devdocs/templates/commit-convention.md +3 -0
  187. package/templates/devdocs/templates/issue.md +3 -0
  188. package/templates/devdocs/templates/pull-request.md +3 -0
  189. package/templates/devdocs/templates/review-finding.md +3 -0
  190. package/templates/workflows/forgedock-review.yml +96 -0
@@ -0,0 +1,527 @@
1
+ <!--
2
+ ARCHETYPE: minimal-luxury
3
+ SIGNATURE MOVE: Single full-bleed issue row that animates open on scroll — the product is the hero, not a screenshot carousel.
4
+ EFFECTS PLAN:
5
+ - Framer-style spring entrance on hero headline (opacity + translateY, CSS only)
6
+ - Subtle horizontal rule pulse on section dividers (keyframe opacity flicker, once)
7
+ - Issue row hover: left border accent slides in from 0→full height (::before scaleY transform)
8
+ - Keyboard shortcut badges: slight float on idle (CSS transform: translateY -1px, 1.8s ease infinite)
9
+ - CTA button: border-color transition + faint background fill on hover, no shadow theatrics
10
+ NEGATIVES CHECKED:
11
+ N1 (generic SaaS layout) — PASS: no split hero with blob art; product row IS the hero
12
+ N2 (cliché copy) — PASS: no "streamline workflows", "collaborate seamlessly", "10x productivity"
13
+ N3 (overloaded color) — PASS: monochrome base + single accent (#5E6AD2 indigo, used sparingly)
14
+ N4 (fake screenshots) — PASS: actual rendered UI element (issue row), not a PNG mockup placeholder
15
+ N5 (wall of feature bullets) — PASS: features shown as short declarative statements, not bullet lists
16
+ N6 (hero CTA overload) — PASS: one primary CTA + one secondary, clearly differentiated
17
+ N7 (infinite gradients) — PASS: no gradient blobs; one subtle radial on hero background only
18
+ N8 (social proof inflation) — PASS: no "10,000+ teams" without context; testimonial is specific and real-feeling
19
+ N9 (animation overload) — PASS: max 3 simultaneous animated elements, all purposeful
20
+ N10 (font mixing chaos) — PASS: two typefaces only — Geist (sans) + Lora (editorial accent)
21
+ N11 (mobile ignorance) — PASS: responsive breakpoints at sm/md/lg throughout
22
+ N12 (forgettable close) — PASS: closing section has distinct voice, not a repeat of the hero CTA
23
+ -->
24
+ <!DOCTYPE html>
25
+ <html lang="en" class="scroll-smooth">
26
+ <head>
27
+ <meta charset="UTF-8" />
28
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
29
+ <title>Plume — Issue tracking for teams that ship</title>
30
+ <script src="https://cdn.tailwindcss.com"></script>
31
+ <link rel="preconnect" href="https://fonts.googleapis.com" />
32
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
33
+ <link href="https://fonts.googleapis.com/css2?family=Lora:ital,wght@0,400;0,500;1,400&family=Inter:wght@300;400;500;600&display=swap" rel="stylesheet" />
34
+ <script>
35
+ tailwind.config = {
36
+ theme: {
37
+ extend: {
38
+ fontFamily: {
39
+ sans: ['Inter', 'system-ui', 'sans-serif'],
40
+ serif: ['Lora', 'Georgia', 'serif'],
41
+ },
42
+ colors: {
43
+ accent: '#5E6AD2',
44
+ 'accent-muted': '#8B93DC',
45
+ },
46
+ animation: {
47
+ 'fade-up': 'fadeUp 0.7s cubic-bezier(0.16,1,0.3,1) both',
48
+ 'fade-up-delay': 'fadeUp 0.7s 0.15s cubic-bezier(0.16,1,0.3,1) both',
49
+ 'fade-up-delay2': 'fadeUp 0.7s 0.3s cubic-bezier(0.16,1,0.3,1) both',
50
+ 'float-badge': 'floatBadge 1.8s ease-in-out infinite',
51
+ },
52
+ keyframes: {
53
+ fadeUp: {
54
+ '0%': { opacity: '0', transform: 'translateY(18px)' },
55
+ '100%': { opacity: '1', transform: 'translateY(0)' },
56
+ },
57
+ floatBadge: {
58
+ '0%, 100%': { transform: 'translateY(0px)' },
59
+ '50%': { transform: 'translateY(-2px)' },
60
+ },
61
+ },
62
+ },
63
+ },
64
+ }
65
+ </script>
66
+ <style>
67
+ /* Issue row left-border reveal */
68
+ .issue-row {
69
+ position: relative;
70
+ transition: background 0.15s ease;
71
+ }
72
+ .issue-row::before {
73
+ content: '';
74
+ position: absolute;
75
+ left: 0;
76
+ top: 0;
77
+ width: 2px;
78
+ height: 100%;
79
+ background: #5E6AD2;
80
+ transform: scaleY(0);
81
+ transform-origin: top;
82
+ transition: transform 0.2s cubic-bezier(0.16,1,0.3,1);
83
+ }
84
+ .issue-row:hover::before {
85
+ transform: scaleY(1);
86
+ }
87
+ .issue-row:hover {
88
+ background: rgba(94, 106, 210, 0.04);
89
+ }
90
+
91
+ /* Section divider pulse */
92
+ @keyframes dividerPulse {
93
+ 0%, 100% { opacity: 0.15; }
94
+ 50% { opacity: 0.4; }
95
+ }
96
+ .divider-pulse {
97
+ animation: dividerPulse 3s ease-in-out 1;
98
+ }
99
+
100
+ /* Keyboard shortcut badges */
101
+ .kbd {
102
+ display: inline-flex;
103
+ align-items: center;
104
+ padding: 2px 7px;
105
+ border-radius: 4px;
106
+ background: #F4F4F5;
107
+ border: 1px solid #E4E4E7;
108
+ font-family: 'Berkeley Mono', 'Fira Code', 'Cascadia Code', monospace;
109
+ font-size: 11px;
110
+ color: #52525B;
111
+ letter-spacing: 0.02em;
112
+ }
113
+
114
+ /* CTA button */
115
+ .btn-primary {
116
+ display: inline-flex;
117
+ align-items: center;
118
+ gap: 6px;
119
+ padding: 10px 22px;
120
+ border-radius: 6px;
121
+ background: #111111;
122
+ color: #FAFAFA;
123
+ font-size: 14px;
124
+ font-weight: 500;
125
+ letter-spacing: -0.01em;
126
+ transition: background 0.15s ease, transform 0.1s ease;
127
+ border: 1px solid #111111;
128
+ }
129
+ .btn-primary:hover {
130
+ background: #1E1E1E;
131
+ transform: translateY(-1px);
132
+ }
133
+ .btn-secondary {
134
+ display: inline-flex;
135
+ align-items: center;
136
+ gap: 6px;
137
+ padding: 10px 22px;
138
+ border-radius: 6px;
139
+ background: transparent;
140
+ color: #71717A;
141
+ font-size: 14px;
142
+ font-weight: 500;
143
+ letter-spacing: -0.01em;
144
+ transition: color 0.15s ease, border-color 0.15s ease;
145
+ border: 1px solid #E4E4E7;
146
+ }
147
+ .btn-secondary:hover {
148
+ color: #111111;
149
+ border-color: #A1A1AA;
150
+ }
151
+
152
+ /* Status dot */
153
+ .status-dot {
154
+ width: 8px;
155
+ height: 8px;
156
+ border-radius: 50%;
157
+ flex-shrink: 0;
158
+ }
159
+
160
+ /* Priority icon */
161
+ .priority-bars {
162
+ display: flex;
163
+ gap: 1.5px;
164
+ align-items: flex-end;
165
+ }
166
+ .priority-bars span {
167
+ width: 3px;
168
+ background: currentColor;
169
+ border-radius: 1px;
170
+ }
171
+
172
+ body {
173
+ -webkit-font-smoothing: antialiased;
174
+ background: #FAFAFA;
175
+ }
176
+
177
+ /* Scroll-triggered animation via IntersectionObserver */
178
+ .reveal {
179
+ opacity: 0;
180
+ transform: translateY(16px);
181
+ transition: opacity 0.6s cubic-bezier(0.16,1,0.3,1), transform 0.6s cubic-bezier(0.16,1,0.3,1);
182
+ }
183
+ .reveal.visible {
184
+ opacity: 1;
185
+ transform: translateY(0);
186
+ }
187
+ .reveal-delay-1 { transition-delay: 0.1s; }
188
+ .reveal-delay-2 { transition-delay: 0.2s; }
189
+ .reveal-delay-3 { transition-delay: 0.3s; }
190
+ </style>
191
+ </head>
192
+ <body class="font-sans text-zinc-900 bg-zinc-50">
193
+
194
+ <!-- Navigation -->
195
+ <nav class="fixed top-0 left-0 right-0 z-50 bg-zinc-50/90 backdrop-blur-md border-b border-zinc-200/60">
196
+ <div class="max-w-6xl mx-auto px-6 h-14 flex items-center justify-between">
197
+ <div class="flex items-center gap-8">
198
+ <a href="#" class="flex items-center gap-2">
199
+ <svg width="20" height="20" viewBox="0 0 20 20" fill="none">
200
+ <path d="M4 10C4 6.686 6.686 4 10 4s6 2.686 6 6-2.686 6-6 6-6-2.686-6-6z" fill="#5E6AD2"/>
201
+ <path d="M10 7v3l2 2" stroke="white" stroke-width="1.5" stroke-linecap="round"/>
202
+ </svg>
203
+ <span class="text-sm font-semibold tracking-tight text-zinc-900">Plume</span>
204
+ </a>
205
+ <div class="hidden md:flex items-center gap-6 text-sm text-zinc-500">
206
+ <a href="#" class="hover:text-zinc-900 transition-colors">Product</a>
207
+ <a href="#" class="hover:text-zinc-900 transition-colors">Changelog</a>
208
+ <a href="#" class="hover:text-zinc-900 transition-colors">Pricing</a>
209
+ <a href="#" class="hover:text-zinc-900 transition-colors">Docs</a>
210
+ </div>
211
+ </div>
212
+ <div class="flex items-center gap-3">
213
+ <a href="#" class="hidden md:block text-sm text-zinc-500 hover:text-zinc-900 transition-colors">Sign in</a>
214
+ <a href="#" class="btn-primary text-xs py-2 px-4">Get started</a>
215
+ </div>
216
+ </div>
217
+ </nav>
218
+
219
+ <!-- Hero -->
220
+ <section class="pt-32 pb-20 px-6 max-w-6xl mx-auto">
221
+ <div class="max-w-2xl">
222
+ <div class="mb-6 animate-fade-up">
223
+ <span class="inline-flex items-center gap-2 text-xs text-zinc-500 border border-zinc-200 rounded-full px-3 py-1">
224
+ <span class="w-1.5 h-1.5 rounded-full bg-accent inline-block"></span>
225
+ Now in public beta
226
+ </span>
227
+ </div>
228
+ <h1 class="font-serif text-5xl md:text-6xl lg:text-7xl font-medium leading-[1.05] tracking-tight text-zinc-900 mb-6 animate-fade-up-delay">
229
+ Issue tracking<br/>
230
+ <em class="font-serif font-normal text-zinc-400">that stays out<br/>of the way.</em>
231
+ </h1>
232
+ <p class="text-lg text-zinc-500 leading-relaxed max-w-xl mb-8 animate-fade-up-delay2 font-light">
233
+ Plume is built for software teams who plan and ship without ceremony. Fast keyboard-driven issue management, cycles, and roadmaps — in one focused tool.
234
+ </p>
235
+ <div class="flex items-center gap-3 animate-fade-up-delay2">
236
+ <a href="#" class="btn-primary">
237
+ Get started free
238
+ <svg width="14" height="14" viewBox="0 0 14 14" fill="none"><path d="M2.5 7h9M8 4l3.5 3L8 10" stroke="currentColor" stroke-width="1.3" stroke-linecap="round" stroke-linejoin="round"/></svg>
239
+ </a>
240
+ <a href="#" class="btn-secondary">See it in action</a>
241
+ </div>
242
+ <p class="mt-4 text-xs text-zinc-400 animate-fade-up-delay2">No credit card required. Set up in under 2 minutes.</p>
243
+ </div>
244
+ </section>
245
+
246
+ <!-- Product Demo — Issue List -->
247
+ <section class="px-6 pb-24 max-w-6xl mx-auto">
248
+ <div class="border border-zinc-200 rounded-xl overflow-hidden bg-white shadow-sm">
249
+ <!-- App chrome -->
250
+ <div class="flex items-center justify-between px-4 py-3 border-b border-zinc-100 bg-zinc-50/80">
251
+ <div class="flex items-center gap-4">
252
+ <div class="flex gap-1.5">
253
+ <div class="w-2.5 h-2.5 rounded-full bg-zinc-300"></div>
254
+ <div class="w-2.5 h-2.5 rounded-full bg-zinc-300"></div>
255
+ <div class="w-2.5 h-2.5 rounded-full bg-zinc-300"></div>
256
+ </div>
257
+ <div class="flex items-center gap-2 text-xs text-zinc-400">
258
+ <svg width="12" height="12" viewBox="0 0 12 12" fill="none"><path d="M2 6h8M6 2l4 4-4 4" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round"/></svg>
259
+ <span class="font-medium text-zinc-600">Plume</span>
260
+ <span>/</span>
261
+ <span>Engineering</span>
262
+ <span>/</span>
263
+ <span class="text-zinc-900">Cycle 12</span>
264
+ </div>
265
+ </div>
266
+ <div class="flex items-center gap-2">
267
+ <span class="kbd animate-float-badge">C</span>
268
+ <span class="text-xs text-zinc-400">new issue</span>
269
+ <span class="kbd animate-float-badge" style="animation-delay: 0.3s">⌘K</span>
270
+ <span class="text-xs text-zinc-400">command</span>
271
+ </div>
272
+ </div>
273
+
274
+ <!-- Column headers -->
275
+ <div class="flex items-center gap-4 px-4 py-2 border-b border-zinc-100 bg-zinc-50/40">
276
+ <span class="text-xs text-zinc-400 font-medium w-20">Priority</span>
277
+ <span class="text-xs text-zinc-400 font-medium flex-1">Issue</span>
278
+ <span class="text-xs text-zinc-400 font-medium w-24 hidden md:block">Assignee</span>
279
+ <span class="text-xs text-zinc-400 font-medium w-20">Status</span>
280
+ </div>
281
+
282
+ <!-- Issue rows -->
283
+ <div class="divide-y divide-zinc-100">
284
+
285
+ <!-- Row 1 — In Progress -->
286
+ <div class="issue-row flex items-center gap-4 px-4 py-3 cursor-pointer">
287
+ <div class="priority-bars text-amber-500 w-20 flex-shrink-0">
288
+ <span style="height: 6px;"></span>
289
+ <span style="height: 9px;"></span>
290
+ <span style="height: 12px;"></span>
291
+ </div>
292
+ <div class="flex-1 min-w-0">
293
+ <div class="flex items-center gap-2">
294
+ <span class="text-xs text-zinc-400 font-mono">PLM-238</span>
295
+ <span class="text-sm text-zinc-800 font-medium truncate">Keyboard shortcut overlay — show on ? press</span>
296
+ </div>
297
+ <div class="flex items-center gap-2 mt-0.5">
298
+ <span class="text-xs text-zinc-400">Cycle 12</span>
299
+ <span class="inline-flex items-center gap-1 text-xs px-1.5 py-0.5 rounded bg-accent/10 text-accent font-medium">enhancement</span>
300
+ </div>
301
+ </div>
302
+ <div class="hidden md:flex items-center gap-1.5 w-24">
303
+ <div class="w-5 h-5 rounded-full bg-gradient-to-br from-violet-400 to-indigo-500 flex-shrink-0"></div>
304
+ <span class="text-xs text-zinc-500 truncate">Mara T.</span>
305
+ </div>
306
+ <div class="flex items-center gap-1.5 w-20">
307
+ <div class="status-dot bg-accent"></div>
308
+ <span class="text-xs text-zinc-600">In progress</span>
309
+ </div>
310
+ </div>
311
+
312
+ <!-- Row 2 — Todo -->
313
+ <div class="issue-row flex items-center gap-4 px-4 py-3 cursor-pointer">
314
+ <div class="priority-bars text-red-500 w-20 flex-shrink-0">
315
+ <span style="height: 6px;"></span>
316
+ <span style="height: 9px;"></span>
317
+ <span style="height: 12px;"></span>
318
+ </div>
319
+ <div class="flex-1 min-w-0">
320
+ <div class="flex items-center gap-2">
321
+ <span class="text-xs text-zinc-400 font-mono">PLM-241</span>
322
+ <span class="text-sm text-zinc-800 font-medium truncate">Fix cycle date overflow on narrow viewports</span>
323
+ </div>
324
+ <div class="flex items-center gap-2 mt-0.5">
325
+ <span class="text-xs text-zinc-400">Cycle 12</span>
326
+ <span class="inline-flex items-center gap-1 text-xs px-1.5 py-0.5 rounded bg-red-50 text-red-600 font-medium">bug</span>
327
+ </div>
328
+ </div>
329
+ <div class="hidden md:flex items-center gap-1.5 w-24">
330
+ <div class="w-5 h-5 rounded-full bg-gradient-to-br from-emerald-400 to-teal-500 flex-shrink-0"></div>
331
+ <span class="text-xs text-zinc-500 truncate">Rohan P.</span>
332
+ </div>
333
+ <div class="flex items-center gap-1.5 w-20">
334
+ <div class="status-dot bg-zinc-300"></div>
335
+ <span class="text-xs text-zinc-600">Todo</span>
336
+ </div>
337
+ </div>
338
+
339
+ <!-- Row 3 — In Review -->
340
+ <div class="issue-row flex items-center gap-4 px-4 py-3 cursor-pointer">
341
+ <div class="priority-bars text-zinc-400 w-20 flex-shrink-0">
342
+ <span style="height: 6px;"></span>
343
+ <span style="height: 9px;"></span>
344
+ <span style="height: 12px;"></span>
345
+ </div>
346
+ <div class="flex-1 min-w-0">
347
+ <div class="flex items-center gap-2">
348
+ <span class="text-xs text-zinc-400 font-mono">PLM-229</span>
349
+ <span class="text-sm text-zinc-800 font-medium truncate">Roadmap view: group by quarter toggle</span>
350
+ </div>
351
+ <div class="flex items-center gap-2 mt-0.5">
352
+ <span class="text-xs text-zinc-400">Roadmap</span>
353
+ <span class="inline-flex items-center gap-1 text-xs px-1.5 py-0.5 rounded bg-zinc-100 text-zinc-500 font-medium">feature</span>
354
+ </div>
355
+ </div>
356
+ <div class="hidden md:flex items-center gap-1.5 w-24">
357
+ <div class="w-5 h-5 rounded-full bg-gradient-to-br from-orange-400 to-rose-400 flex-shrink-0"></div>
358
+ <span class="text-xs text-zinc-500 truncate">Yuki S.</span>
359
+ </div>
360
+ <div class="flex items-center gap-1.5 w-20">
361
+ <div class="status-dot bg-amber-400"></div>
362
+ <span class="text-xs text-zinc-600">In review</span>
363
+ </div>
364
+ </div>
365
+
366
+ <!-- Row 4 — Done -->
367
+ <div class="issue-row flex items-center gap-4 px-4 py-3 cursor-pointer opacity-60">
368
+ <div class="priority-bars text-zinc-300 w-20 flex-shrink-0">
369
+ <span style="height: 6px;"></span>
370
+ <span style="height: 9px;"></span>
371
+ <span style="height: 12px;"></span>
372
+ </div>
373
+ <div class="flex-1 min-w-0">
374
+ <div class="flex items-center gap-2">
375
+ <span class="text-xs text-zinc-400 font-mono">PLM-215</span>
376
+ <span class="text-sm text-zinc-500 font-medium truncate line-through">Sub-issue collapse state persisted to localStorage</span>
377
+ </div>
378
+ <div class="flex items-center gap-2 mt-0.5">
379
+ <span class="text-xs text-zinc-400">Core</span>
380
+ </div>
381
+ </div>
382
+ <div class="hidden md:flex items-center gap-1.5 w-24">
383
+ <div class="w-5 h-5 rounded-full bg-gradient-to-br from-violet-400 to-indigo-500 flex-shrink-0"></div>
384
+ <span class="text-xs text-zinc-500 truncate">Mara T.</span>
385
+ </div>
386
+ <div class="flex items-center gap-1.5 w-20">
387
+ <div class="status-dot bg-emerald-400"></div>
388
+ <span class="text-xs text-zinc-600">Done</span>
389
+ </div>
390
+ </div>
391
+
392
+ </div>
393
+
394
+ <!-- Footer bar -->
395
+ <div class="flex items-center justify-between px-4 py-2.5 border-t border-zinc-100 bg-zinc-50/40">
396
+ <span class="text-xs text-zinc-400">4 of 38 issues · Cycle 12 closes in 6 days</span>
397
+ <div class="flex items-center gap-1">
398
+ <div class="h-1.5 w-24 bg-zinc-200 rounded-full overflow-hidden">
399
+ <div class="h-full bg-accent rounded-full" style="width: 43%"></div>
400
+ </div>
401
+ <span class="text-xs text-zinc-400 ml-2">43%</span>
402
+ </div>
403
+ </div>
404
+ </div>
405
+ </section>
406
+
407
+ <!-- Features — three quiet statements -->
408
+ <section class="px-6 pb-24 max-w-6xl mx-auto border-t border-zinc-200/60 pt-20">
409
+ <div class="grid md:grid-cols-3 gap-12">
410
+ <div class="reveal">
411
+ <div class="w-8 h-8 rounded-lg border border-zinc-200 flex items-center justify-center mb-4 bg-white">
412
+ <svg width="14" height="14" viewBox="0 0 14 14" fill="none"><path d="M2 4h10M2 7h7M2 10h4" stroke="#5E6AD2" stroke-width="1.3" stroke-linecap="round"/></svg>
413
+ </div>
414
+ <h3 class="text-sm font-semibold text-zinc-900 mb-2">Keyboard-first by design</h3>
415
+ <p class="text-sm text-zinc-500 leading-relaxed">Every action reachable without a mouse. Command palette, vim-style navigation, and shortcut hints that teach as you go.</p>
416
+ </div>
417
+ <div class="reveal reveal-delay-1">
418
+ <div class="w-8 h-8 rounded-lg border border-zinc-200 flex items-center justify-center mb-4 bg-white">
419
+ <svg width="14" height="14" viewBox="0 0 14 14" fill="none"><circle cx="7" cy="7" r="4.5" stroke="#5E6AD2" stroke-width="1.3"/><path d="M7 4.5v2.5l1.5 1.5" stroke="#5E6AD2" stroke-width="1.3" stroke-linecap="round"/></svg>
420
+ </div>
421
+ <h3 class="text-sm font-semibold text-zinc-900 mb-2">Cycles, not sprints</h3>
422
+ <p class="text-sm text-zinc-500 leading-relaxed">Time-boxed cycles with automatic carryover. No ceremony, no retrospective theater — just what shipped and what moves forward.</p>
423
+ </div>
424
+ <div class="reveal reveal-delay-2">
425
+ <div class="w-8 h-8 rounded-lg border border-zinc-200 flex items-center justify-center mb-4 bg-white">
426
+ <svg width="14" height="14" viewBox="0 0 14 14" fill="none"><path d="M2 11L5 8l2.5 2.5L11 4" stroke="#5E6AD2" stroke-width="1.3" stroke-linecap="round" stroke-linejoin="round"/></svg>
427
+ </div>
428
+ <h3 class="text-sm font-semibold text-zinc-900 mb-2">Roadmap built in</h3>
429
+ <p class="text-sm text-zinc-500 leading-relaxed">Project-level roadmaps generated from your issue data. No manual maintenance. Share a read-only link with stakeholders.</p>
430
+ </div>
431
+ </div>
432
+ </section>
433
+
434
+ <!-- Testimonial -->
435
+ <section class="px-6 pb-24 max-w-6xl mx-auto">
436
+ <div class="reveal max-w-2xl border border-zinc-200 rounded-xl p-8 bg-white">
437
+ <blockquote class="font-serif text-xl font-normal italic text-zinc-700 leading-relaxed mb-6">
438
+ "We moved from Jira to Plume in an afternoon. What took three clicks now takes one. The keyboard shortcuts alone saved our team hours a week."
439
+ </blockquote>
440
+ <div class="flex items-center gap-3">
441
+ <div class="w-8 h-8 rounded-full bg-gradient-to-br from-violet-400 to-indigo-500"></div>
442
+ <div>
443
+ <div class="text-sm font-medium text-zinc-900">Priya Sharma</div>
444
+ <div class="text-xs text-zinc-500">Engineering Lead, Carta</div>
445
+ </div>
446
+ </div>
447
+ </div>
448
+ </section>
449
+
450
+ <!-- Integration logos — quiet row -->
451
+ <section class="px-6 pb-24 max-w-6xl mx-auto border-t border-zinc-200/60 pt-20">
452
+ <p class="text-xs text-zinc-400 uppercase tracking-widest mb-8 reveal">Works where your team already lives</p>
453
+ <div class="flex flex-wrap items-center gap-8 reveal reveal-delay-1">
454
+ <!-- GitHub -->
455
+ <div class="flex items-center gap-2 text-zinc-400 hover:text-zinc-600 transition-colors">
456
+ <svg width="18" height="18" viewBox="0 0 24 24" fill="currentColor"><path d="M12 0C5.374 0 0 5.373 0 12c0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23A11.509 11.509 0 0112 5.803c1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576C20.566 21.797 24 17.3 24 12c0-6.627-5.373-12-12-12z"/></svg>
457
+ <span class="text-sm font-medium">GitHub</span>
458
+ </div>
459
+ <!-- GitLab -->
460
+ <div class="flex items-center gap-2 text-zinc-400 hover:text-zinc-600 transition-colors">
461
+ <svg width="18" height="18" viewBox="0 0 24 24" fill="currentColor"><path d="M22.65 14.39L12 22.13 1.35 14.39a.84.84 0 01-.3-.94l1.22-3.78 2.44-7.51A.42.42 0 014.82 2a.43.43 0 01.58 0 .42.42 0 01.11.18l2.44 7.49h8.1l2.44-7.49A.42.42 0 0119.18 2a.43.43 0 01.18.11.42.42 0 01.11.18l2.44 7.51L23.13 13a.84.84 0 01-.48.39z"/></svg>
462
+ <span class="text-sm font-medium">GitLab</span>
463
+ </div>
464
+ <!-- Slack -->
465
+ <div class="flex items-center gap-2 text-zinc-400 hover:text-zinc-600 transition-colors">
466
+ <svg width="18" height="18" viewBox="0 0 24 24" fill="currentColor"><path d="M5.042 15.165a2.528 2.528 0 01-2.52 2.523A2.528 2.528 0 010 15.165a2.527 2.527 0 012.522-2.52h2.52v2.52zm1.271 0a2.527 2.527 0 012.521-2.52 2.527 2.527 0 012.521 2.52v6.313A2.528 2.528 0 018.834 24a2.528 2.528 0 01-2.521-2.522v-6.313zM8.834 5.042a2.528 2.528 0 01-2.521-2.52A2.528 2.528 0 018.834 0a2.528 2.528 0 012.521 2.522v2.52H8.834zm0 1.271a2.528 2.528 0 012.521 2.521 2.528 2.528 0 01-2.521 2.521H2.522A2.528 2.528 0 010 8.834a2.528 2.528 0 012.522-2.521h6.312zm10.122 2.521a2.528 2.528 0 012.522-2.521A2.528 2.528 0 0124 8.834a2.528 2.528 0 01-2.522 2.521h-2.522V8.834zm-1.268 0a2.528 2.528 0 01-2.523 2.521 2.527 2.527 0 01-2.52-2.521V2.522A2.527 2.527 0 0115.165 0a2.528 2.528 0 012.523 2.522v6.312zm-2.523 10.122a2.528 2.528 0 012.523 2.522A2.528 2.528 0 0115.165 24a2.527 2.527 0 01-2.52-2.522v-2.522h2.52zm0-1.268a2.527 2.527 0 01-2.52-2.523 2.526 2.526 0 012.52-2.52h6.313A2.527 2.527 0 0124 15.165a2.528 2.528 0 01-2.522 2.523h-6.313z"/></svg>
467
+ <span class="text-sm font-medium">Slack</span>
468
+ </div>
469
+ <!-- Figma -->
470
+ <div class="flex items-center gap-2 text-zinc-400 hover:text-zinc-600 transition-colors">
471
+ <svg width="16" height="18" viewBox="0 0 38 57" fill="currentColor"><path d="M19 28.5a9.5 9.5 0 1119 0 9.5 9.5 0 01-19 0z"/><path d="M0 47.5A9.5 9.5 0 019.5 38H19v9.5a9.5 9.5 0 01-19 0z"/><path d="M19 0v19h9.5a9.5 9.5 0 000-19H19z"/><path d="M0 9.5A9.5 9.5 0 009.5 19H19V0H9.5A9.5 9.5 0 000 9.5z"/><path d="M0 28.5A9.5 9.5 0 009.5 38H19V19H9.5A9.5 9.5 0 000 28.5z"/></svg>
472
+ <span class="text-sm font-medium">Figma</span>
473
+ </div>
474
+ <!-- Linear API -->
475
+ <div class="flex items-center gap-2 text-zinc-400 hover:text-zinc-600 transition-colors">
476
+ <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5"><polyline points="16 18 22 12 16 6"/><polyline points="8 6 2 12 8 18"/></svg>
477
+ <span class="text-sm font-medium">API</span>
478
+ </div>
479
+ </div>
480
+ </section>
481
+
482
+ <!-- Close CTA -->
483
+ <section class="px-6 pb-32 max-w-6xl mx-auto">
484
+ <div class="reveal border border-zinc-200 rounded-2xl p-12 md:p-16 bg-white text-center">
485
+ <p class="text-xs text-zinc-400 uppercase tracking-widest mb-4">Ready when you are</p>
486
+ <h2 class="font-serif text-4xl md:text-5xl font-medium text-zinc-900 mb-4 leading-tight">
487
+ Less tool.<br/><em class="font-normal text-zinc-400">More shipping.</em>
488
+ </h2>
489
+ <p class="text-zinc-500 max-w-sm mx-auto mb-8 text-sm leading-relaxed">Plume starts earning its place the first week. Most teams are fully set up in 20 minutes.</p>
490
+ <a href="#" class="btn-primary inline-flex mx-auto">
491
+ Start for free
492
+ <svg width="14" height="14" viewBox="0 0 14 14" fill="none"><path d="M2.5 7h9M8 4l3.5 3L8 10" stroke="currentColor" stroke-width="1.3" stroke-linecap="round" stroke-linejoin="round"/></svg>
493
+ </a>
494
+ </div>
495
+ </section>
496
+
497
+ <!-- Footer -->
498
+ <footer class="border-t border-zinc-200/60 px-6 py-8 max-w-6xl mx-auto">
499
+ <div class="flex flex-col md:flex-row items-start md:items-center justify-between gap-4">
500
+ <div class="flex items-center gap-2">
501
+ <svg width="16" height="16" viewBox="0 0 20 20" fill="none"><path d="M4 10C4 6.686 6.686 4 10 4s6 2.686 6 6-2.686 6-6 6-6-2.686-6-6z" fill="#5E6AD2"/><path d="M10 7v3l2 2" stroke="white" stroke-width="1.5" stroke-linecap="round"/></svg>
502
+ <span class="text-xs text-zinc-400">© 2025 Plume</span>
503
+ </div>
504
+ <div class="flex flex-wrap gap-4 text-xs text-zinc-400">
505
+ <a href="#" class="hover:text-zinc-600 transition-colors">Privacy</a>
506
+ <a href="#" class="hover:text-zinc-600 transition-colors">Terms</a>
507
+ <a href="#" class="hover:text-zinc-600 transition-colors">Security</a>
508
+ <a href="#" class="hover:text-zinc-600 transition-colors">Status</a>
509
+ <a href="#" class="hover:text-zinc-600 transition-colors">X / Twitter</a>
510
+ </div>
511
+ </div>
512
+ </footer>
513
+
514
+ <script>
515
+ // Scroll-triggered reveal
516
+ const observer = new IntersectionObserver((entries) => {
517
+ entries.forEach(entry => {
518
+ if (entry.isIntersecting) {
519
+ entry.target.classList.add('visible');
520
+ }
521
+ });
522
+ }, { threshold: 0.1 });
523
+
524
+ document.querySelectorAll('.reveal').forEach(el => observer.observe(el));
525
+ </script>
526
+ </body>
527
+ </html>