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,483 @@
1
+ <!--
2
+ ARCHETYPE: editorial-typographic
3
+ SIGNATURE MOVE: A newspaper-style two-column layout where the left column is a full-height sticky "editorial" — a single strong thesis statement set in large serif — while the right column scrolls through product sections like magazine spreads. Type is the art.
4
+ EFFECTS PLAN:
5
+ - Left column: sticky with a thin vertical rule, thesis text fills the column edge-to-edge
6
+ - Section transitions: thin numbered rules (01, 02, 03) used as chapter markers — editorial pacing
7
+ - Pull quote: oversized serif italic floated outside the grid with a hairline border-left
8
+ - Issue list: set as a typographic table — monospaced identifiers, ragged-right titles
9
+ - CTA: inverted type treatment — white on black, letterpress-style, no box-shadow theatrics
10
+ - Hover on nav links: underline slides from left (scaleX transform on ::after pseudo)
11
+ NEGATIVES CHECKED:
12
+ N1 (generic SaaS layout) — PASS: editorial two-column newspaper grid, no hero blob or split with screenshot
13
+ N2 (cliché copy) — PASS: "Work like you mean it." — short, declarative; no productivity buzzwords
14
+ N3 (overloaded color) — PASS: warm off-white (#FAFAF7) + black + single accent terracotta (#C4603A), used sparingly
15
+ N4 (fake screenshots) — PASS: issue table is live-rendered HTML, typographically styled
16
+ N5 (wall of feature bullets) — PASS: features written as editorial paragraph statements with pull numbers
17
+ N6 (hero CTA overload) — PASS: one CTA in hero ("Start free"), sign-in is just a link
18
+ N7 (infinite gradients) — PASS: no gradients; warm background tint only
19
+ N8 (social proof inflation) — PASS: one specific quote with publication-style attribution
20
+ N9 (animation overload) — PASS: only nav underline and scroll reveal; nothing looping or ambient
21
+ N10 (font mixing chaos) — PASS: Playfair Display (editorial serif) + DM Sans (body) — deliberate pairing
22
+ N11 (mobile ignorance) — PASS: sticky column collapses to stacked on mobile, all breakpoints handled
23
+ N12 (forgettable close) — PASS: closing chapter has its own editorial thesis ("The tool should disappear.")
24
+ -->
25
+ <!DOCTYPE html>
26
+ <html lang="en">
27
+ <head>
28
+ <meta charset="UTF-8" />
29
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
30
+ <title>Plume — Work like you mean it.</title>
31
+ <script src="https://cdn.tailwindcss.com"></script>
32
+ <link rel="preconnect" href="https://fonts.googleapis.com" />
33
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
34
+ <link href="https://fonts.googleapis.com/css2?family=Playfair+Display:ital,wght@0,400;0,500;0,700;1,400;1,500&family=DM+Sans:wght@300;400;500;600&family=DM+Mono:wght@400;500&display=swap" rel="stylesheet" />
35
+ <script>
36
+ tailwind.config = {
37
+ theme: {
38
+ extend: {
39
+ fontFamily: {
40
+ serif: ['Playfair Display', 'Georgia', 'serif'],
41
+ sans: ['DM Sans', 'system-ui', 'sans-serif'],
42
+ mono: ['DM Mono', 'Fira Code', 'monospace'],
43
+ },
44
+ colors: {
45
+ terra: '#C4603A',
46
+ 'warm-bg': '#FAFAF7',
47
+ 'warm-rule': '#E8E6E0',
48
+ ink: '#1A1814',
49
+ },
50
+ },
51
+ },
52
+ }
53
+ </script>
54
+ <style>
55
+ * { -webkit-font-smoothing: antialiased; }
56
+ body { background: #FAFAF7; color: #1A1814; }
57
+
58
+ /* Nav underline animation */
59
+ .nav-link {
60
+ position: relative;
61
+ text-decoration: none;
62
+ color: #5A5750;
63
+ font-size: 13px;
64
+ font-weight: 400;
65
+ padding-bottom: 2px;
66
+ }
67
+ .nav-link::after {
68
+ content: '';
69
+ position: absolute;
70
+ bottom: 0;
71
+ left: 0;
72
+ width: 100%;
73
+ height: 1px;
74
+ background: #1A1814;
75
+ transform: scaleX(0);
76
+ transform-origin: left;
77
+ transition: transform 0.25s cubic-bezier(0.16,1,0.3,1);
78
+ }
79
+ .nav-link:hover::after { transform: scaleX(1); }
80
+ .nav-link:hover { color: #1A1814; }
81
+
82
+ /* Chapter rule */
83
+ .chapter-rule {
84
+ border-top: 1px solid #1A1814;
85
+ padding-top: 10px;
86
+ }
87
+ .chapter-num {
88
+ font-family: 'DM Mono', monospace;
89
+ font-size: 10px;
90
+ letter-spacing: 0.15em;
91
+ color: #C4603A;
92
+ display: block;
93
+ margin-bottom: 4px;
94
+ }
95
+
96
+ /* Pull quote */
97
+ .pull-quote {
98
+ border-left: 3px solid #C4603A;
99
+ padding-left: 20px;
100
+ }
101
+
102
+ /* Issue table row */
103
+ .issue-editorial {
104
+ display: grid;
105
+ grid-template-columns: 80px 1fr 90px 80px;
106
+ align-items: center;
107
+ border-bottom: 1px solid #E8E6E0;
108
+ padding: 10px 0;
109
+ gap: 8px;
110
+ }
111
+ .issue-editorial:hover {
112
+ background: rgba(196, 96, 58, 0.04);
113
+ }
114
+
115
+ /* CTA button */
116
+ .btn-editorial {
117
+ display: inline-flex;
118
+ align-items: center;
119
+ gap: 6px;
120
+ padding: 12px 24px;
121
+ background: #1A1814;
122
+ color: #FAFAF7;
123
+ font-family: 'DM Sans', sans-serif;
124
+ font-weight: 500;
125
+ font-size: 14px;
126
+ letter-spacing: 0.01em;
127
+ border: 1px solid #1A1814;
128
+ text-decoration: none;
129
+ transition: background 0.2s, color 0.2s;
130
+ }
131
+ .btn-editorial:hover {
132
+ background: #C4603A;
133
+ border-color: #C4603A;
134
+ }
135
+
136
+ /* Scroll reveal */
137
+ .reveal {
138
+ opacity: 0;
139
+ transform: translateY(12px);
140
+ transition: opacity 0.7s cubic-bezier(0.16,1,0.3,1), transform 0.7s cubic-bezier(0.16,1,0.3,1);
141
+ }
142
+ .reveal.visible {
143
+ opacity: 1;
144
+ transform: translateY(0);
145
+ }
146
+ .reveal-d1 { transition-delay: 0.1s; }
147
+ .reveal-d2 { transition-delay: 0.2s; }
148
+ .reveal-d3 { transition-delay: 0.3s; }
149
+
150
+ /* Status treatment */
151
+ .status-editorial {
152
+ font-family: 'DM Mono', monospace;
153
+ font-size: 10px;
154
+ letter-spacing: 0.08em;
155
+ text-transform: uppercase;
156
+ }
157
+
158
+ /* Horizontal rule style */
159
+ hr.editorial { border: none; border-top: 1px solid #E8E6E0; }
160
+
161
+ /* Background tint block */
162
+ .tint-block { background: #F0EDE4; }
163
+
164
+ /* Large editorial number */
165
+ .editorial-stat {
166
+ font-family: 'Playfair Display', serif;
167
+ font-weight: 700;
168
+ font-size: clamp(3rem, 6vw, 5rem);
169
+ line-height: 1;
170
+ letter-spacing: -0.02em;
171
+ color: #1A1814;
172
+ }
173
+ </style>
174
+ </head>
175
+ <body class="font-sans bg-warm-bg text-ink">
176
+
177
+ <!-- Masthead / Nav -->
178
+ <header class="border-b border-warm-rule bg-warm-bg/95 backdrop-blur-sm sticky top-0 z-50">
179
+ <!-- Top strip -->
180
+ <div class="border-b border-warm-rule px-6 py-1.5 flex items-center justify-between">
181
+ <span class="font-mono text-xs text-zinc-400 tracking-widest uppercase">Issue tracking for teams who ship</span>
182
+ <a href="#" class="text-xs font-medium text-terra hover:underline">→ Now in public beta</a>
183
+ </div>
184
+ <!-- Main nav -->
185
+ <div class="max-w-7xl mx-auto px-6 h-14 flex items-center justify-between">
186
+ <div class="flex items-center gap-8">
187
+ <a href="#" class="font-serif text-xl font-bold tracking-tight text-ink">Plume</a>
188
+ <nav class="hidden md:flex items-center gap-6">
189
+ <a href="#" class="nav-link">Product</a>
190
+ <a href="#" class="nav-link">Changelog</a>
191
+ <a href="#" class="nav-link">Pricing</a>
192
+ <a href="#" class="nav-link">Docs</a>
193
+ </nav>
194
+ </div>
195
+ <div class="flex items-center gap-4">
196
+ <a href="#" class="nav-link">Sign in</a>
197
+ <a href="#" class="btn-editorial py-2 px-5 text-sm">Start free</a>
198
+ </div>
199
+ </div>
200
+ </header>
201
+
202
+ <!-- Layout container — editorial two-column -->
203
+ <div class="max-w-7xl mx-auto px-6">
204
+ <div class="md:flex">
205
+
206
+ <!-- LEFT COLUMN — sticky editorial thesis -->
207
+ <div class="hidden md:block md:w-72 lg:w-80 flex-shrink-0 border-r border-warm-rule">
208
+ <div class="sticky top-28 py-16 pr-10">
209
+ <span class="chapter-num">Plume · 2025</span>
210
+ <h1 class="font-serif text-4xl lg:text-5xl font-bold leading-[1.05] tracking-tight mb-6">
211
+ Work like<br/>you<br/>mean it.
212
+ </h1>
213
+ <hr class="editorial mb-6" />
214
+ <p class="text-sm text-zinc-600 leading-relaxed mb-8">
215
+ Issue tracking that respects your attention. Built for software teams who'd rather ship than manage their tools.
216
+ </p>
217
+ <a href="#" class="btn-editorial">Get started free</a>
218
+ <p class="mt-4 text-xs text-zinc-400 leading-relaxed">No credit card · Setup in minutes</p>
219
+
220
+ <!-- Pull stat -->
221
+ <div class="mt-12 pt-8 border-t border-warm-rule">
222
+ <div class="editorial-stat text-terra">2.8k</div>
223
+ <p class="text-xs text-zinc-500 mt-1 leading-relaxed font-mono uppercase tracking-wider">Issues closed<br/>today across<br/>Plume teams</p>
224
+ </div>
225
+ </div>
226
+ </div>
227
+
228
+ <!-- RIGHT COLUMN — scrollable content -->
229
+ <div class="md:flex-1 md:pl-12 lg:pl-16">
230
+
231
+ <!-- Mobile hero (only visible < md) -->
232
+ <div class="md:hidden py-12 border-b border-warm-rule mb-12">
233
+ <h1 class="font-serif text-5xl font-bold leading-[1.05] tracking-tight mb-5">Work like<br/>you mean it.</h1>
234
+ <p class="text-base text-zinc-600 leading-relaxed mb-6">Issue tracking that respects your attention. Built for software teams who'd rather ship than manage their tools.</p>
235
+ <a href="#" class="btn-editorial">Get started free</a>
236
+ </div>
237
+
238
+ <!-- Chapter 01 — The interface -->
239
+ <div class="py-14 border-b border-warm-rule">
240
+ <div class="chapter-rule reveal mb-8">
241
+ <span class="chapter-num">01 / Interface</span>
242
+ <h2 class="font-serif text-2xl md:text-3xl font-medium leading-tight">Every issue, exactly where it belongs.</h2>
243
+ </div>
244
+
245
+ <!-- Issue table -->
246
+ <div class="reveal reveal-d1 mb-8">
247
+ <!-- Header -->
248
+ <div class="issue-editorial" style="border-bottom: 2px solid #1A1814; padding-bottom: 6px;">
249
+ <span class="font-mono text-xs uppercase tracking-widest text-zinc-400">ID</span>
250
+ <span class="font-mono text-xs uppercase tracking-widest text-zinc-400">Title</span>
251
+ <span class="font-mono text-xs uppercase tracking-widest text-zinc-400 hidden sm:block">Status</span>
252
+ <span class="font-mono text-xs uppercase tracking-widest text-zinc-400">Priority</span>
253
+ </div>
254
+
255
+ <div class="issue-editorial">
256
+ <span class="font-mono text-xs text-zinc-400">PLM-238</span>
257
+ <span class="text-sm font-medium">Keyboard shortcut overlay</span>
258
+ <span class="status-editorial text-terra hidden sm:block">In progress</span>
259
+ <span class="font-mono text-xs font-medium text-red-600">Urgent</span>
260
+ </div>
261
+
262
+ <div class="issue-editorial">
263
+ <span class="font-mono text-xs text-zinc-400">PLM-241</span>
264
+ <span class="text-sm font-medium">Cycle date overflow on narrow viewports</span>
265
+ <span class="status-editorial text-zinc-500 hidden sm:block">Todo</span>
266
+ <span class="font-mono text-xs font-medium text-red-600">Urgent</span>
267
+ </div>
268
+
269
+ <div class="issue-editorial">
270
+ <span class="font-mono text-xs text-zinc-400">PLM-229</span>
271
+ <span class="text-sm font-medium">Roadmap: group by quarter</span>
272
+ <span class="status-editorial text-amber-600 hidden sm:block">In review</span>
273
+ <span class="font-mono text-xs font-medium text-zinc-500">Medium</span>
274
+ </div>
275
+
276
+ <div class="issue-editorial" style="border-bottom:none;">
277
+ <span class="font-mono text-xs text-zinc-400">PLM-215</span>
278
+ <span class="text-sm text-zinc-400 line-through">Sub-issue collapse state</span>
279
+ <span class="status-editorial text-green-600 hidden sm:block">Done</span>
280
+ <span class="font-mono text-xs font-medium text-zinc-400">Low</span>
281
+ </div>
282
+ </div>
283
+
284
+ <!-- Keyboard shortcuts bar -->
285
+ <div class="reveal reveal-d2 flex items-center gap-3 text-xs text-zinc-500 border border-warm-rule p-3 bg-white">
286
+ <span class="font-mono uppercase tracking-wider text-xs">Shortcuts</span>
287
+ <span class="mx-2 text-zinc-300">|</span>
288
+ <kbd class="font-mono bg-warm-bg border border-warm-rule px-2 py-0.5 text-xs">C</kbd>
289
+ <span>New issue</span>
290
+ <kbd class="font-mono bg-warm-bg border border-warm-rule px-2 py-0.5 text-xs ml-4">⌘K</kbd>
291
+ <span>Command</span>
292
+ <kbd class="font-mono bg-warm-bg border border-warm-rule px-2 py-0.5 text-xs ml-4">?</kbd>
293
+ <span>All shortcuts</span>
294
+ </div>
295
+ </div>
296
+
297
+ <!-- Chapter 02 — Cycles -->
298
+ <div class="py-14 border-b border-warm-rule">
299
+ <div class="chapter-rule reveal mb-8">
300
+ <span class="chapter-num">02 / Cycles</span>
301
+ <h2 class="font-serif text-2xl md:text-3xl font-medium leading-tight">Time-boxed. Automatic. No ceremony.</h2>
302
+ </div>
303
+
304
+ <div class="grid sm:grid-cols-2 gap-8 mb-10">
305
+ <div class="reveal">
306
+ <p class="text-sm text-zinc-700 leading-relaxed">
307
+ A Plume cycle is a fixed time window with a clear scope. Issues carry over automatically. When the cycle closes, you see exactly what shipped — no manual tally.
308
+ </p>
309
+ </div>
310
+ <div class="reveal reveal-d1">
311
+ <p class="text-sm text-zinc-700 leading-relaxed">
312
+ Cycle health is visible at a glance: completion rate, velocity trend, scope creep. All the signal you need without building a dashboard.
313
+ </p>
314
+ </div>
315
+ </div>
316
+
317
+ <!-- Cycle progress visual -->
318
+ <div class="reveal tint-block border border-warm-rule p-6">
319
+ <div class="flex items-center justify-between mb-4">
320
+ <div>
321
+ <span class="font-mono text-xs uppercase tracking-widest text-zinc-500">Cycle 12</span>
322
+ <h3 class="font-serif text-xl font-medium mt-0.5">Q3 Sprint — Week 2</h3>
323
+ </div>
324
+ <div class="text-right">
325
+ <span class="font-serif text-3xl font-bold text-terra">43%</span>
326
+ <p class="font-mono text-xs text-zinc-500 uppercase tracking-wider">Complete</p>
327
+ </div>
328
+ </div>
329
+ <div class="w-full h-2 bg-zinc-200 rounded-full mb-4">
330
+ <div class="h-full rounded-full" style="width:43%; background:#C4603A;"></div>
331
+ </div>
332
+ <div class="flex items-center gap-6 text-xs font-mono text-zinc-500 uppercase tracking-wider">
333
+ <span><strong class="text-ink font-bold font-sans">16</strong> closed</span>
334
+ <span><strong class="text-ink font-bold font-sans">8</strong> in progress</span>
335
+ <span><strong class="text-ink font-bold font-sans">14</strong> todo</span>
336
+ <span class="ml-auto"><strong class="text-terra font-bold font-sans">6 days</strong> left</span>
337
+ </div>
338
+ </div>
339
+ </div>
340
+
341
+ <!-- Pull quote break -->
342
+ <div class="py-14 border-b border-warm-rule">
343
+ <div class="reveal pull-quote max-w-lg">
344
+ <p class="font-serif text-2xl md:text-3xl italic font-normal leading-snug text-ink mb-4">
345
+ "We moved from Linear to Plume because it types like a text editor and thinks like a project manager."
346
+ </p>
347
+ <p class="font-mono text-xs uppercase tracking-widest text-zinc-500">
348
+ Denise Moreau — Engineering Director, Vercel
349
+ </p>
350
+ </div>
351
+ </div>
352
+
353
+ <!-- Chapter 03 — Roadmap -->
354
+ <div class="py-14 border-b border-warm-rule">
355
+ <div class="chapter-rule reveal mb-8">
356
+ <span class="chapter-num">03 / Roadmap</span>
357
+ <h2 class="font-serif text-2xl md:text-3xl font-medium leading-tight">The roadmap writes itself.</h2>
358
+ </div>
359
+
360
+ <div class="reveal mb-6">
361
+ <p class="text-sm text-zinc-700 leading-relaxed max-w-lg">
362
+ Plume's roadmap view is generated from your project and cycle data — not a separate doc you maintain in Notion. Share a read-only link with stakeholders. It updates as you work.
363
+ </p>
364
+ </div>
365
+
366
+ <!-- Mini roadmap visual -->
367
+ <div class="reveal reveal-d1 border border-warm-rule bg-white overflow-x-auto">
368
+ <div class="min-w-96 p-5">
369
+ <div class="flex items-center gap-2 mb-4">
370
+ <span class="font-mono text-xs uppercase tracking-widest text-zinc-400">Projects</span>
371
+ <span class="mx-2 text-zinc-200">·</span>
372
+ <span class="font-mono text-xs uppercase tracking-widest text-zinc-400">Q3 2025</span>
373
+ </div>
374
+ <div class="space-y-3">
375
+ <!-- Row -->
376
+ <div class="flex items-center gap-3">
377
+ <span class="w-28 text-xs font-medium truncate flex-shrink-0">Auth refactor</span>
378
+ <div class="flex-1 h-6 bg-warm-bg rounded-sm relative border border-warm-rule">
379
+ <div class="absolute left-0 top-0 h-full rounded-sm" style="width:80%; background:#C4603A; opacity:0.7;"></div>
380
+ <span class="absolute inset-0 flex items-center px-2 text-xs font-mono text-white mix-blend-multiply">80%</span>
381
+ </div>
382
+ </div>
383
+ <div class="flex items-center gap-3">
384
+ <span class="w-28 text-xs font-medium truncate flex-shrink-0">Mobile redesign</span>
385
+ <div class="flex-1 h-6 bg-warm-bg rounded-sm relative border border-warm-rule" style="margin-left: 15%;">
386
+ <div class="absolute left-0 top-0 h-full rounded-sm" style="width:40%; background:#1A1814; opacity:0.6;"></div>
387
+ <span class="absolute inset-0 flex items-center px-2 text-xs font-mono text-white">40%</span>
388
+ </div>
389
+ </div>
390
+ <div class="flex items-center gap-3">
391
+ <span class="w-28 text-xs font-medium truncate flex-shrink-0">API v2</span>
392
+ <div class="flex-1 h-6 bg-warm-bg rounded-sm relative border border-warm-rule" style="margin-left: 35%;">
393
+ <div class="absolute left-0 top-0 h-full rounded-sm" style="width:20%; background:#1A1814; opacity:0.4;"></div>
394
+ <span class="absolute inset-0 flex items-center px-2 text-xs font-mono text-zinc-500">Planning</span>
395
+ </div>
396
+ </div>
397
+ </div>
398
+ </div>
399
+ </div>
400
+ </div>
401
+
402
+ <!-- Chapter 04 — Integrations -->
403
+ <div class="py-14 border-b border-warm-rule">
404
+ <div class="chapter-rule reveal mb-8">
405
+ <span class="chapter-num">04 / Integrations</span>
406
+ <h2 class="font-serif text-2xl md:text-3xl font-medium leading-tight">Plume syncs. You don't have to.</h2>
407
+ </div>
408
+ <div class="grid grid-cols-2 sm:grid-cols-4 gap-px bg-warm-rule border border-warm-rule reveal">
409
+ <div class="bg-warm-bg p-5 text-center hover:bg-white transition-colors">
410
+ <p class="font-serif font-medium text-sm mb-1">GitHub</p>
411
+ <p class="font-mono text-xs text-zinc-400 uppercase tracking-wide">PRs → Issues</p>
412
+ </div>
413
+ <div class="bg-warm-bg p-5 text-center hover:bg-white transition-colors">
414
+ <p class="font-serif font-medium text-sm mb-1">Slack</p>
415
+ <p class="font-mono text-xs text-zinc-400 uppercase tracking-wide">Notifications</p>
416
+ </div>
417
+ <div class="bg-warm-bg p-5 text-center hover:bg-white transition-colors">
418
+ <p class="font-serif font-medium text-sm mb-1">Figma</p>
419
+ <p class="font-mono text-xs text-zinc-400 uppercase tracking-wide">Design links</p>
420
+ </div>
421
+ <div class="bg-warm-bg p-5 text-center hover:bg-white transition-colors">
422
+ <p class="font-serif font-medium text-sm mb-1">API</p>
423
+ <p class="font-mono text-xs text-zinc-400 uppercase tracking-wide">Build your own</p>
424
+ </div>
425
+ </div>
426
+ </div>
427
+
428
+ <!-- Chapter 05 — Close -->
429
+ <div class="py-20">
430
+ <div class="chapter-rule reveal mb-8">
431
+ <span class="chapter-num">05 / On tools</span>
432
+ <h2 class="font-serif text-3xl md:text-4xl font-medium italic leading-tight mb-6">
433
+ "The best tool is the one that disappears."
434
+ </h2>
435
+ </div>
436
+ <div class="reveal mb-10">
437
+ <p class="text-sm text-zinc-600 leading-relaxed max-w-lg">
438
+ Plume is designed to get out of the way. Your team opens it, does the work, and closes the tab. That's the product. Fast, focused, and finished — so you can ship.
439
+ </p>
440
+ </div>
441
+ <div class="reveal reveal-d1 border-t border-warm-rule pt-8">
442
+ <a href="#" class="btn-editorial">Start building with Plume</a>
443
+ <p class="mt-4 text-xs text-zinc-400">Free to start · Teams from $8/seat/mo · Cancel anytime</p>
444
+ </div>
445
+ </div>
446
+
447
+ </div>
448
+ </div>
449
+ </div>
450
+
451
+ <!-- Footer -->
452
+ <footer class="border-t-2 border-warm-rule bg-warm-bg px-6 py-10">
453
+ <div class="max-w-7xl mx-auto">
454
+ <div class="flex flex-col md:flex-row items-start md:items-center justify-between gap-6">
455
+ <div>
456
+ <span class="font-serif text-lg font-bold text-ink">Plume</span>
457
+ <p class="font-mono text-xs text-zinc-400 uppercase tracking-widest mt-1">Issue tracking for teams who ship.</p>
458
+ </div>
459
+ <div class="flex flex-wrap gap-6 text-xs text-zinc-400">
460
+ <a href="#" class="nav-link text-xs">Privacy</a>
461
+ <a href="#" class="nav-link text-xs">Terms</a>
462
+ <a href="#" class="nav-link text-xs">Security</a>
463
+ <a href="#" class="nav-link text-xs">Status</a>
464
+ <a href="#" class="nav-link text-xs">Twitter / X</a>
465
+ <a href="#" class="nav-link text-xs">GitHub</a>
466
+ </div>
467
+ </div>
468
+ <hr class="editorial mt-8 mb-4" />
469
+ <p class="font-mono text-xs text-zinc-400">© 2025 Plume, Inc. All rights reserved.</p>
470
+ </div>
471
+ </footer>
472
+
473
+ <script>
474
+ const observer = new IntersectionObserver((entries) => {
475
+ entries.forEach(entry => {
476
+ if (entry.isIntersecting) entry.target.classList.add('visible');
477
+ });
478
+ }, { threshold: 0.08 });
479
+
480
+ document.querySelectorAll('.reveal').forEach(el => observer.observe(el));
481
+ </script>
482
+ </body>
483
+ </html>