@sentry/warden 0.0.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 (199) hide show
  1. package/.agents/skills/find-bugs/SKILL.md +75 -0
  2. package/.agents/skills/vercel-react-best-practices/AGENTS.md +2934 -0
  3. package/.agents/skills/vercel-react-best-practices/SKILL.md +136 -0
  4. package/.agents/skills/vercel-react-best-practices/rules/advanced-event-handler-refs.md +55 -0
  5. package/.agents/skills/vercel-react-best-practices/rules/advanced-init-once.md +42 -0
  6. package/.agents/skills/vercel-react-best-practices/rules/advanced-use-latest.md +39 -0
  7. package/.agents/skills/vercel-react-best-practices/rules/async-api-routes.md +38 -0
  8. package/.agents/skills/vercel-react-best-practices/rules/async-defer-await.md +80 -0
  9. package/.agents/skills/vercel-react-best-practices/rules/async-dependencies.md +51 -0
  10. package/.agents/skills/vercel-react-best-practices/rules/async-parallel.md +28 -0
  11. package/.agents/skills/vercel-react-best-practices/rules/async-suspense-boundaries.md +99 -0
  12. package/.agents/skills/vercel-react-best-practices/rules/bundle-barrel-imports.md +59 -0
  13. package/.agents/skills/vercel-react-best-practices/rules/bundle-conditional.md +31 -0
  14. package/.agents/skills/vercel-react-best-practices/rules/bundle-defer-third-party.md +49 -0
  15. package/.agents/skills/vercel-react-best-practices/rules/bundle-dynamic-imports.md +35 -0
  16. package/.agents/skills/vercel-react-best-practices/rules/bundle-preload.md +50 -0
  17. package/.agents/skills/vercel-react-best-practices/rules/client-event-listeners.md +74 -0
  18. package/.agents/skills/vercel-react-best-practices/rules/client-localstorage-schema.md +71 -0
  19. package/.agents/skills/vercel-react-best-practices/rules/client-passive-event-listeners.md +48 -0
  20. package/.agents/skills/vercel-react-best-practices/rules/client-swr-dedup.md +56 -0
  21. package/.agents/skills/vercel-react-best-practices/rules/js-batch-dom-css.md +107 -0
  22. package/.agents/skills/vercel-react-best-practices/rules/js-cache-function-results.md +80 -0
  23. package/.agents/skills/vercel-react-best-practices/rules/js-cache-property-access.md +28 -0
  24. package/.agents/skills/vercel-react-best-practices/rules/js-cache-storage.md +70 -0
  25. package/.agents/skills/vercel-react-best-practices/rules/js-combine-iterations.md +32 -0
  26. package/.agents/skills/vercel-react-best-practices/rules/js-early-exit.md +50 -0
  27. package/.agents/skills/vercel-react-best-practices/rules/js-hoist-regexp.md +45 -0
  28. package/.agents/skills/vercel-react-best-practices/rules/js-index-maps.md +37 -0
  29. package/.agents/skills/vercel-react-best-practices/rules/js-length-check-first.md +49 -0
  30. package/.agents/skills/vercel-react-best-practices/rules/js-min-max-loop.md +82 -0
  31. package/.agents/skills/vercel-react-best-practices/rules/js-set-map-lookups.md +24 -0
  32. package/.agents/skills/vercel-react-best-practices/rules/js-tosorted-immutable.md +57 -0
  33. package/.agents/skills/vercel-react-best-practices/rules/rendering-activity.md +26 -0
  34. package/.agents/skills/vercel-react-best-practices/rules/rendering-animate-svg-wrapper.md +47 -0
  35. package/.agents/skills/vercel-react-best-practices/rules/rendering-conditional-render.md +40 -0
  36. package/.agents/skills/vercel-react-best-practices/rules/rendering-content-visibility.md +38 -0
  37. package/.agents/skills/vercel-react-best-practices/rules/rendering-hoist-jsx.md +46 -0
  38. package/.agents/skills/vercel-react-best-practices/rules/rendering-hydration-no-flicker.md +82 -0
  39. package/.agents/skills/vercel-react-best-practices/rules/rendering-hydration-suppress-warning.md +30 -0
  40. package/.agents/skills/vercel-react-best-practices/rules/rendering-svg-precision.md +28 -0
  41. package/.agents/skills/vercel-react-best-practices/rules/rendering-usetransition-loading.md +75 -0
  42. package/.agents/skills/vercel-react-best-practices/rules/rerender-defer-reads.md +39 -0
  43. package/.agents/skills/vercel-react-best-practices/rules/rerender-dependencies.md +45 -0
  44. package/.agents/skills/vercel-react-best-practices/rules/rerender-derived-state-no-effect.md +40 -0
  45. package/.agents/skills/vercel-react-best-practices/rules/rerender-derived-state.md +29 -0
  46. package/.agents/skills/vercel-react-best-practices/rules/rerender-functional-setstate.md +74 -0
  47. package/.agents/skills/vercel-react-best-practices/rules/rerender-lazy-state-init.md +58 -0
  48. package/.agents/skills/vercel-react-best-practices/rules/rerender-memo-with-default-value.md +38 -0
  49. package/.agents/skills/vercel-react-best-practices/rules/rerender-memo.md +44 -0
  50. package/.agents/skills/vercel-react-best-practices/rules/rerender-move-effect-to-event.md +45 -0
  51. package/.agents/skills/vercel-react-best-practices/rules/rerender-simple-expression-in-memo.md +35 -0
  52. package/.agents/skills/vercel-react-best-practices/rules/rerender-transitions.md +40 -0
  53. package/.agents/skills/vercel-react-best-practices/rules/rerender-use-ref-transient-values.md +73 -0
  54. package/.agents/skills/vercel-react-best-practices/rules/server-after-nonblocking.md +73 -0
  55. package/.agents/skills/vercel-react-best-practices/rules/server-auth-actions.md +96 -0
  56. package/.agents/skills/vercel-react-best-practices/rules/server-cache-lru.md +41 -0
  57. package/.agents/skills/vercel-react-best-practices/rules/server-cache-react.md +76 -0
  58. package/.agents/skills/vercel-react-best-practices/rules/server-dedup-props.md +65 -0
  59. package/.agents/skills/vercel-react-best-practices/rules/server-parallel-fetching.md +83 -0
  60. package/.agents/skills/vercel-react-best-practices/rules/server-serialization.md +38 -0
  61. package/.claude/settings.json +57 -0
  62. package/.claude/settings.local.json +88 -0
  63. package/.claude/skills/agent-prompt/SKILL.md +54 -0
  64. package/.claude/skills/agent-prompt/references/agentic-patterns.md +94 -0
  65. package/.claude/skills/agent-prompt/references/anti-patterns.md +140 -0
  66. package/.claude/skills/agent-prompt/references/context-design.md +124 -0
  67. package/.claude/skills/agent-prompt/references/core-principles.md +75 -0
  68. package/.claude/skills/agent-prompt/references/model-guidance.md +118 -0
  69. package/.claude/skills/agent-prompt/references/output-formats.md +98 -0
  70. package/.claude/skills/agent-prompt/references/skill-structure.md +115 -0
  71. package/.claude/skills/agent-prompt/references/system-prompts.md +115 -0
  72. package/.claude/skills/notseer/SKILL.md +131 -0
  73. package/.claude/skills/skill-writer/SKILL.md +140 -0
  74. package/.claude/skills/testing-guidelines/SKILL.md +132 -0
  75. package/.claude/skills/warden-skill/SKILL.md +250 -0
  76. package/.claude/skills/warden-skill/references/config-schema.md +133 -0
  77. package/.dex/config.toml +2 -0
  78. package/.github/workflows/ci.yml +33 -0
  79. package/.github/workflows/release.yml +54 -0
  80. package/.github/workflows/warden.yml +40 -0
  81. package/AGENTS.md +89 -0
  82. package/CONTRIBUTING.md +60 -0
  83. package/LICENSE +105 -0
  84. package/README.md +43 -0
  85. package/SPEC.md +263 -0
  86. package/action.yml +87 -0
  87. package/assets/favicon.png +0 -0
  88. package/assets/warden-icon-bw.svg +5 -0
  89. package/assets/warden-icon-purple.png +0 -0
  90. package/assets/warden-icon-purple.svg +5 -0
  91. package/docs/.claude/settings.local.json +11 -0
  92. package/docs/astro.config.mjs +43 -0
  93. package/docs/package.json +19 -0
  94. package/docs/pnpm-lock.yaml +4000 -0
  95. package/docs/public/favicon.svg +5 -0
  96. package/docs/src/components/Code.astro +141 -0
  97. package/docs/src/components/PackageManagerTabs.astro +183 -0
  98. package/docs/src/components/Terminal.astro +212 -0
  99. package/docs/src/layouts/Base.astro +380 -0
  100. package/docs/src/pages/cli.astro +167 -0
  101. package/docs/src/pages/config.astro +394 -0
  102. package/docs/src/pages/guide.astro +449 -0
  103. package/docs/src/pages/index.astro +490 -0
  104. package/docs/src/styles/global.css +551 -0
  105. package/docs/tsconfig.json +3 -0
  106. package/docs/vercel.json +5 -0
  107. package/eslint.config.js +33 -0
  108. package/package.json +73 -0
  109. package/src/action/index.ts +1 -0
  110. package/src/action/main.ts +868 -0
  111. package/src/cli/args.test.ts +477 -0
  112. package/src/cli/args.ts +415 -0
  113. package/src/cli/commands/add.ts +447 -0
  114. package/src/cli/commands/init.test.ts +136 -0
  115. package/src/cli/commands/init.ts +132 -0
  116. package/src/cli/commands/setup-app/browser.ts +38 -0
  117. package/src/cli/commands/setup-app/credentials.ts +45 -0
  118. package/src/cli/commands/setup-app/manifest.ts +48 -0
  119. package/src/cli/commands/setup-app/server.ts +172 -0
  120. package/src/cli/commands/setup-app.ts +156 -0
  121. package/src/cli/commands/sync.ts +114 -0
  122. package/src/cli/context.ts +131 -0
  123. package/src/cli/files.test.ts +155 -0
  124. package/src/cli/files.ts +89 -0
  125. package/src/cli/fix.test.ts +310 -0
  126. package/src/cli/fix.ts +387 -0
  127. package/src/cli/git.test.ts +119 -0
  128. package/src/cli/git.ts +318 -0
  129. package/src/cli/index.ts +14 -0
  130. package/src/cli/main.ts +672 -0
  131. package/src/cli/output/box.ts +235 -0
  132. package/src/cli/output/formatters.test.ts +187 -0
  133. package/src/cli/output/formatters.ts +269 -0
  134. package/src/cli/output/icons.ts +13 -0
  135. package/src/cli/output/index.ts +44 -0
  136. package/src/cli/output/ink-runner.tsx +337 -0
  137. package/src/cli/output/jsonl.test.ts +347 -0
  138. package/src/cli/output/jsonl.ts +126 -0
  139. package/src/cli/output/reporter.ts +435 -0
  140. package/src/cli/output/tasks.ts +374 -0
  141. package/src/cli/output/tty.test.ts +117 -0
  142. package/src/cli/output/tty.ts +60 -0
  143. package/src/cli/output/verbosity.test.ts +40 -0
  144. package/src/cli/output/verbosity.ts +31 -0
  145. package/src/cli/terminal.test.ts +148 -0
  146. package/src/cli/terminal.ts +301 -0
  147. package/src/config/index.ts +3 -0
  148. package/src/config/loader.test.ts +313 -0
  149. package/src/config/loader.ts +103 -0
  150. package/src/config/schema.ts +168 -0
  151. package/src/config/writer.test.ts +119 -0
  152. package/src/config/writer.ts +84 -0
  153. package/src/diff/classify.test.ts +162 -0
  154. package/src/diff/classify.ts +92 -0
  155. package/src/diff/coalesce.test.ts +208 -0
  156. package/src/diff/coalesce.ts +133 -0
  157. package/src/diff/context.test.ts +226 -0
  158. package/src/diff/context.ts +201 -0
  159. package/src/diff/index.ts +4 -0
  160. package/src/diff/parser.test.ts +212 -0
  161. package/src/diff/parser.ts +149 -0
  162. package/src/event/context.ts +132 -0
  163. package/src/event/index.ts +2 -0
  164. package/src/event/schedule-context.ts +101 -0
  165. package/src/examples/examples.integration.test.ts +66 -0
  166. package/src/examples/index.test.ts +101 -0
  167. package/src/examples/index.ts +122 -0
  168. package/src/examples/setup.ts +25 -0
  169. package/src/index.ts +115 -0
  170. package/src/output/dedup.test.ts +419 -0
  171. package/src/output/dedup.ts +607 -0
  172. package/src/output/github-checks.test.ts +300 -0
  173. package/src/output/github-checks.ts +476 -0
  174. package/src/output/github-issues.ts +329 -0
  175. package/src/output/index.ts +5 -0
  176. package/src/output/issue-renderer.ts +197 -0
  177. package/src/output/renderer.test.ts +727 -0
  178. package/src/output/renderer.ts +217 -0
  179. package/src/output/stale.test.ts +375 -0
  180. package/src/output/stale.ts +155 -0
  181. package/src/output/types.ts +34 -0
  182. package/src/sdk/index.ts +1 -0
  183. package/src/sdk/runner.test.ts +806 -0
  184. package/src/sdk/runner.ts +1232 -0
  185. package/src/skills/index.ts +36 -0
  186. package/src/skills/loader.test.ts +300 -0
  187. package/src/skills/loader.ts +423 -0
  188. package/src/skills/remote.test.ts +704 -0
  189. package/src/skills/remote.ts +604 -0
  190. package/src/triggers/matcher.test.ts +277 -0
  191. package/src/triggers/matcher.ts +152 -0
  192. package/src/types/index.ts +194 -0
  193. package/src/utils/async.ts +18 -0
  194. package/src/utils/index.test.ts +84 -0
  195. package/src/utils/index.ts +50 -0
  196. package/tsconfig.json +25 -0
  197. package/vitest.config.ts +8 -0
  198. package/vitest.integration.config.ts +11 -0
  199. package/warden.toml +19 -0
@@ -0,0 +1,490 @@
1
+ ---
2
+ import Base from '../layouts/Base.astro';
3
+ import Terminal from '../components/Terminal.astro';
4
+ import PackageManagerTabs from '../components/PackageManagerTabs.astro';
5
+
6
+ const base = import.meta.env.BASE_URL.replace(/\/$/, '');
7
+ ---
8
+
9
+ <Base title="Home" description="Agents that review your code. Locally or on every PR.">
10
+ <div class="hero">
11
+ <p class="tagline">Your Code Is Under New Management</p>
12
+ <p class="tagline-sub">Agents that review your code. Locally or on every PR.</p>
13
+
14
+ <div class="cta-buttons">
15
+ <a href={`${base}/guide`} class="btn btn-primary">Get Started</a>
16
+ </div>
17
+ </div>
18
+
19
+ <section class="quick-start">
20
+ <div class="step">
21
+ <h3>Install</h3>
22
+ <p>Install the CLI globally.</p>
23
+ <PackageManagerTabs
24
+ npm="npm install -g @sentry/warden"
25
+ pnpm="pnpm add -g @sentry/warden"
26
+ bun="bun add -g @sentry/warden"
27
+ />
28
+ </div>
29
+
30
+ <div class="step">
31
+ <h3>Initialize</h3>
32
+ <p>Scaffold your project with config and GitHub workflow.</p>
33
+ <Terminal showCopy={true} copyText="warden init">
34
+ <pre class="cli-output"><span class="cli-dim">$</span> warden init
35
+
36
+ <span class="cli-green">Created</span> warden.toml
37
+ <span class="cli-green">Created</span> .github/workflows/warden.yml
38
+
39
+ <span class="cli-bold">Next steps:</span>
40
+ 1. Add a skill: <span class="cli-cyan">warden add &lt;skill-name&gt;</span>
41
+ 2. Set <span class="cli-cyan">WARDEN_ANTHROPIC_API_KEY</span> in .env.local
42
+ 3. Add <span class="cli-cyan">WARDEN_ANTHROPIC_API_KEY</span> to repository secrets
43
+ <span class="cli-dim">https://github.com/your-org/your-repo/settings/secrets/actions</span>
44
+ 4. Commit and open a PR to test</pre>
45
+ </Terminal>
46
+ </div>
47
+
48
+ <div class="step">
49
+ <h3>Add some skills</h3>
50
+ <p>Install a skill from the community. Vercel's React best practices is a great start.</p>
51
+ <PackageManagerTabs
52
+ npm={`npx skills add vercel-labs/agent-skills --skill vercel-react-best-practices
53
+ warden add vercel-react-best-practices`}
54
+ pnpm={`pnpx skills add vercel-labs/agent-skills --skill vercel-react-best-practices
55
+ warden add vercel-react-best-practices`}
56
+ bun={`bunx skills add vercel-labs/agent-skills --skill vercel-react-best-practices
57
+ warden add vercel-react-best-practices`}
58
+ />
59
+ </div>
60
+
61
+ <div class="step">
62
+ <h3>Run Locally</h3>
63
+ <p>Catch issues before you push. Fix them immediately.</p>
64
+ <Terminal showCopy={false}>
65
+ <pre class="cli-output"><span class="cli-dim">$</span> warden
66
+
67
+ Analyzing uncommitted changes...
68
+
69
+ <span class="cli-bold">FILES</span> <span class="cli-cyan">3 files</span> <span class="cli-dim">· 5 chunks</span>
70
+ <span class="cli-yellow">~</span> src/components/UserList.tsx <span class="cli-dim">(2 chunks)</span>
71
+ <span class="cli-yellow">~</span> src/components/Dashboard.tsx <span class="cli-dim">(2 chunks)</span>
72
+ <span class="cli-green">+</span> src/components/Modal.tsx <span class="cli-dim">(1 chunk)</span>
73
+
74
+ ┌─ <span class="cli-bold">vercel-react-best-practices</span> ──────────────────────────── <span class="cli-dim">8.2s</span> ─┐
75
+ │ <span class="cli-bold">2 findings:</span> <span class="cli-yellow">●</span> 1 medium <span class="cli-cyan">●</span> 1 low │
76
+ ├─────────────────────────────────────────────────────────────────┤
77
+ │ │
78
+ │ <span class="cli-yellow">●</span> <span class="cli-bold">Missing React.memo for list items</span> │
79
+ │ <span class="cli-dim">src/components/UserList.tsx:15</span> │
80
+ │ <span class="cli-dim">15 │</span> const UserCard = (&#123; user &#125;) =&gt; &lt;div&gt;&#123;user.name&#125;&lt;/div&gt;; │
81
+ │ │
82
+ │ List item components should be memoized to prevent │
83
+ │ unnecessary re-renders when parent state changes. │
84
+ │ │
85
+ │ <span class="cli-cyan">●</span> <span class="cli-bold">useEffect missing dependency</span> │
86
+ │ <span class="cli-dim">src/components/Dashboard.tsx:23</span> │
87
+ │ <span class="cli-dim">23 │</span> useEffect(() =&gt; &#123; fetchData() &#125;, []) │
88
+ │ │
89
+ │ The dependency array is missing 'fetchData'. This could │
90
+ │ lead to stale closures or unexpected behavior. │
91
+ │ │
92
+ └─────────────────────────────────────────────────────────────────┘
93
+
94
+ <span class="cli-bold">SUMMARY</span>
95
+ <span class="cli-bold">2 findings:</span> <span class="cli-yellow">●</span> 1 medium <span class="cli-cyan">●</span> 1 low
96
+ Analysis completed in <span class="cli-dim">8.2s</span></pre>
97
+ </Terminal>
98
+ </div>
99
+
100
+ <div class="step">
101
+ <h3>Keep an Eye on GitHub</h3>
102
+ <p>Open a PR and Warden reviews it automatically. Findings appear as suggested changes you can apply with one click.</p>
103
+ <div class="pr-mock">
104
+ <div class="pr-mock-header">
105
+ <div class="pr-mock-avatar">
106
+ <svg width="32" height="32" viewBox="0 0 24 24" fill="none">
107
+ <circle cx="12" cy="12" r="12" fill="#000"/>
108
+ <g transform="translate(12, 12) scale(0.65) translate(-12, -12)">
109
+ <path d="M14.2666 4.9061C15.1564 4.09409 16.5921 4.60917 16.7627 5.80162L18.1123 15.2519C18.9476 14.5758 19.6675 14.156 20.2706 13.9423C20.9583 13.6988 21.61 13.6893 22.0606 14.0459C22.5331 14.4202 22.576 15.0232 22.4131 15.5224C22.2471 16.0308 21.8525 16.5326 21.2774 16.916C20.2382 17.6088 19.1848 18.1368 17.7432 18.4863C16.3131 18.833 14.518 19 12 19C9.48202 19 7.68685 18.833 6.25679 18.4863C4.81521 18.1368 3.76183 17.6088 2.72259 16.916C2.14753 16.5326 1.75289 16.0308 1.58684 15.5224C1.42401 15.0233 1.46701 14.4202 1.93938 14.0459C2.38997 13.6893 3.04168 13.6988 3.72943 13.9423C4.33238 14.1559 5.05163 14.5761 5.88667 15.2519L7.23727 5.80162C7.40784 4.60919 8.84362 4.09419 9.73338 4.9061L11.6631 6.66686C11.854 6.84121 12.146 6.84121 12.3369 6.66686L14.2666 4.9061Z" fill="white"/>
110
+ <path d="M12 8L13.1226 11.1094H16.7553L13.8164 13.0312L14.9389 16.1406L12 14.2188L9.06107 16.1406L10.1836 13.0312L7.24472 11.1094H10.8774L12 8Z" fill="#000"/>
111
+ </g>
112
+ </svg>
113
+ </div>
114
+ <div class="pr-mock-meta">
115
+ <span class="pr-mock-name">warden</span>
116
+ <span class="pr-mock-badge">bot</span>
117
+ <span class="pr-mock-time">commented now</span>
118
+ </div>
119
+ </div>
120
+ <div class="pr-mock-body">
121
+ <div class="pr-mock-finding">
122
+ <span class="pr-mock-severity severity-medium"></span>
123
+ <span class="pr-mock-title">Missing React.memo for list items</span>
124
+ </div>
125
+ <p class="pr-mock-desc">List item components should be memoized to prevent unnecessary re-renders when parent state changes.</p>
126
+ <p class="pr-mock-suggestion-label"><strong>Suggested fix:</strong> Wrap UserCard with React.memo</p>
127
+ <div class="pr-mock-suggestion">
128
+ <div class="pr-mock-suggestion-header">
129
+ <svg width="16" height="16" viewBox="0 0 16 16" fill="currentColor">
130
+ <path d="M8.75 1.75V5H12a.75.75 0 010 1.5H8.75v3.25a.75.75 0 01-1.5 0V6.5H4a.75.75 0 010-1.5h3.25V1.75a.75.75 0 011.5 0zM4 13a.75.75 0 000 1.5h8a.75.75 0 000-1.5H4z"/>
131
+ </svg>
132
+ <span>Suggested change</span>
133
+ </div>
134
+ <div class="pr-mock-suggestion-diff">
135
+ <div class="pr-mock-diff-line diff-old">
136
+ <span class="diff-marker">−</span>
137
+ <span class="diff-content">const UserCard = (&#123; user &#125;) =&gt; &lt;div&gt;&#123;user.name&#125;&lt;/div&gt;;</span>
138
+ </div>
139
+ <div class="pr-mock-diff-line diff-new">
140
+ <span class="diff-marker">+</span>
141
+ <span class="diff-content">const UserCard = React.memo((&#123; user &#125;) =&gt; (</span>
142
+ </div>
143
+ <div class="pr-mock-diff-line diff-new">
144
+ <span class="diff-marker">+</span>
145
+ <span class="diff-content"> &lt;div&gt;&#123;user.name&#125;&lt;/div&gt;</span>
146
+ </div>
147
+ <div class="pr-mock-diff-line diff-new">
148
+ <span class="diff-marker">+</span>
149
+ <span class="diff-content">));</span>
150
+ </div>
151
+ </div>
152
+ <div class="pr-mock-suggestion-actions">
153
+ <button class="pr-mock-commit-btn">Commit suggestion</button>
154
+ </div>
155
+ </div>
156
+ </div>
157
+ <div class="pr-mock-footer">
158
+ <a href="#" class="pr-mock-link">View all 2 findings</a>
159
+ </div>
160
+ </div>
161
+ </div>
162
+ </section>
163
+
164
+ <section class="section next-steps">
165
+ <h2>Next Steps</h2>
166
+ <div class="next-steps-grid">
167
+ <a href={`${base}/cli`} class="next-step-card">
168
+ <strong>CLI Reference</strong>
169
+ <p>Commands, options, and usage examples</p>
170
+ </a>
171
+ <a href={`${base}/guide`} class="next-step-card">
172
+ <strong>Configure triggers</strong>
173
+ <p>Control when skills run with <code>warden.toml</code></p>
174
+ </a>
175
+ </div>
176
+ </section>
177
+
178
+ </Base>
179
+
180
+ <style>
181
+ .hero {
182
+ text-align: center;
183
+ padding: 3rem 0 2rem;
184
+ }
185
+
186
+ .tagline {
187
+ font-family: var(--font-mono);
188
+ font-size: 2.5rem;
189
+ font-weight: 700;
190
+ margin: 0;
191
+ line-height: 1.1;
192
+ text-transform: uppercase;
193
+ letter-spacing: 0.05em;
194
+ color: #fff;
195
+ }
196
+
197
+ .tagline-sub {
198
+ font-size: 1.25rem;
199
+ color: var(--text-secondary);
200
+ margin: 1rem 0 2rem;
201
+ }
202
+
203
+ .cta-buttons {
204
+ display: flex;
205
+ gap: 1rem;
206
+ justify-content: center;
207
+ }
208
+
209
+ .btn {
210
+ display: inline-block;
211
+ padding: 0.75rem 1.5rem;
212
+ border-radius: 6px;
213
+ font-weight: 600;
214
+ text-decoration: none;
215
+ transition: opacity 0.15s ease;
216
+ }
217
+
218
+ .btn-primary {
219
+ background: #fff;
220
+ color: #000;
221
+ }
222
+
223
+ .btn-primary:hover {
224
+ opacity: 0.9;
225
+ color: #000;
226
+ }
227
+
228
+ /* Quick Start Steps */
229
+ .quick-start {
230
+ margin-top: 3rem;
231
+ }
232
+
233
+ .step {
234
+ margin-bottom: 2.5rem;
235
+ }
236
+
237
+ .step:last-child {
238
+ margin-bottom: 0;
239
+ }
240
+
241
+ .step h3 {
242
+ margin: 0 0 0.5rem;
243
+ font-family: var(--font-mono);
244
+ font-size: 1.125rem;
245
+ font-weight: 700;
246
+ text-transform: uppercase;
247
+ letter-spacing: 0.05em;
248
+ }
249
+
250
+ .step > p {
251
+ color: var(--text-secondary);
252
+ margin-bottom: 1rem;
253
+ }
254
+
255
+ /* PR Mock */
256
+ .pr-mock {
257
+ background: #000;
258
+ border: 1px solid #21262d;
259
+ border-radius: 6px;
260
+ overflow: hidden;
261
+ font-size: 0.875rem;
262
+ margin-top: 1rem;
263
+ }
264
+
265
+ .pr-mock-header {
266
+ display: flex;
267
+ align-items: center;
268
+ gap: 0.5rem;
269
+ padding: 0.75rem 1rem;
270
+ background: #0d1117;
271
+ border-bottom: 1px solid #21262d;
272
+ }
273
+
274
+ .pr-mock-avatar {
275
+ width: 32px;
276
+ height: 32px;
277
+ border-radius: 50%;
278
+ overflow: hidden;
279
+ }
280
+
281
+ .pr-mock-meta {
282
+ display: flex;
283
+ align-items: center;
284
+ gap: 0.5rem;
285
+ }
286
+
287
+ .pr-mock-name {
288
+ font-weight: 600;
289
+ color: #8b949e;
290
+ }
291
+
292
+ .pr-mock-badge {
293
+ background: #238636;
294
+ color: #fff;
295
+ font-size: 0.6875rem;
296
+ padding: 0.125rem 0.375rem;
297
+ border-radius: 9999px;
298
+ font-weight: 500;
299
+ text-transform: uppercase;
300
+ }
301
+
302
+ .pr-mock-time {
303
+ color: #8b949e;
304
+ font-size: 0.75rem;
305
+ }
306
+
307
+ .pr-mock-body {
308
+ padding: 1rem;
309
+ }
310
+
311
+ .pr-mock-finding {
312
+ display: flex;
313
+ align-items: center;
314
+ gap: 0.5rem;
315
+ margin-bottom: 0.75rem;
316
+ }
317
+
318
+ .pr-mock-severity {
319
+ width: 10px;
320
+ height: 10px;
321
+ border-radius: 50%;
322
+ }
323
+
324
+ .pr-mock-severity.severity-medium {
325
+ background: #d29922;
326
+ }
327
+
328
+ .pr-mock-title {
329
+ font-weight: 600;
330
+ color: #9198a1;
331
+ }
332
+
333
+ .pr-mock-desc {
334
+ color: #9198a1;
335
+ margin: 0 0 0.75rem;
336
+ line-height: 1.5;
337
+ }
338
+
339
+ .pr-mock-suggestion-label {
340
+ color: #9198a1;
341
+ margin: 0 0 0.75rem;
342
+ }
343
+
344
+ .pr-mock-suggestion {
345
+ background: #0d1117;
346
+ border: 1px solid #21262d;
347
+ border-radius: 6px;
348
+ overflow: hidden;
349
+ }
350
+
351
+ .pr-mock-suggestion-header {
352
+ display: flex;
353
+ align-items: center;
354
+ gap: 0.5rem;
355
+ padding: 0.5rem 0.75rem;
356
+ background: #161b22;
357
+ border-bottom: 1px solid #21262d;
358
+ font-size: 0.75rem;
359
+ font-weight: 600;
360
+ color: #8b949e;
361
+ }
362
+
363
+ .pr-mock-suggestion-diff {
364
+ font-family: var(--font-mono);
365
+ font-size: 0.75rem;
366
+ line-height: 1.6;
367
+ }
368
+
369
+ .pr-mock-diff-line {
370
+ display: flex;
371
+ padding: 0 0.75rem;
372
+ }
373
+
374
+ .pr-mock-diff-line.diff-old {
375
+ background: rgba(248, 81, 73, 0.15);
376
+ }
377
+
378
+ .pr-mock-diff-line.diff-new {
379
+ background: rgba(63, 185, 80, 0.15);
380
+ }
381
+
382
+ .diff-marker {
383
+ width: 1.5rem;
384
+ flex-shrink: 0;
385
+ text-align: center;
386
+ user-select: none;
387
+ }
388
+
389
+ .diff-content {
390
+ flex: 1;
391
+ white-space: pre;
392
+ }
393
+
394
+ .diff-old .diff-marker { color: #f85149; }
395
+ .diff-old .diff-content { color: #ffa198; }
396
+
397
+ .diff-new .diff-marker { color: #3fb950; }
398
+ .diff-new .diff-content { color: #7ee787; }
399
+
400
+ .pr-mock-suggestion-actions {
401
+ display: flex;
402
+ justify-content: flex-end;
403
+ padding: 0.5rem 0.75rem;
404
+ border-top: 1px solid #21262d;
405
+ background: #161b22;
406
+ }
407
+
408
+ .pr-mock-commit-btn {
409
+ background: #238636;
410
+ color: #fff;
411
+ border: none;
412
+ border-radius: 6px;
413
+ padding: 0.375rem 0.75rem;
414
+ font-size: 0.75rem;
415
+ font-weight: 600;
416
+ cursor: pointer;
417
+ }
418
+
419
+ .pr-mock-commit-btn:hover {
420
+ background: #2ea043;
421
+ }
422
+
423
+ .pr-mock-footer {
424
+ padding: 0.75rem 1rem;
425
+ border-top: 1px solid #30363d;
426
+ }
427
+
428
+ .pr-mock-link {
429
+ font-size: 0.8125rem;
430
+ color: #58a6ff;
431
+ }
432
+
433
+ .pr-mock-link:hover {
434
+ text-decoration: underline;
435
+ }
436
+
437
+ /* Next Steps */
438
+ .next-steps-grid {
439
+ display: grid;
440
+ grid-template-columns: repeat(2, 1fr);
441
+ gap: 1rem;
442
+ }
443
+
444
+ .next-step-card {
445
+ display: block;
446
+ padding: 1.25rem 1.5rem;
447
+ background: rgba(255, 255, 255, 0.02);
448
+ border: 1px solid var(--border);
449
+ border-radius: 8px;
450
+ transition: border-color 0.15s ease, background 0.15s ease;
451
+ color: inherit;
452
+ }
453
+
454
+ .next-step-card:hover {
455
+ border-color: var(--border-strong);
456
+ background: rgba(255, 255, 255, 0.04);
457
+ color: inherit;
458
+ }
459
+
460
+ .next-step-card strong {
461
+ display: block;
462
+ margin-bottom: 0.25rem;
463
+ color: var(--text);
464
+ }
465
+
466
+ .next-step-card p {
467
+ margin: 0;
468
+ font-size: 0.875rem;
469
+ color: var(--text-secondary);
470
+ }
471
+
472
+ .next-step-card code {
473
+ font-size: 0.8125rem;
474
+ }
475
+
476
+ @media (max-width: 768px) {
477
+ .tagline {
478
+ font-size: 1.25rem;
479
+ letter-spacing: 0.02em;
480
+ }
481
+
482
+ .next-steps-grid {
483
+ grid-template-columns: 1fr;
484
+ }
485
+
486
+ .step > p {
487
+ margin-left: 0;
488
+ }
489
+ }
490
+ </style>