@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,380 @@
1
+ ---
2
+ import { Font } from "astro:assets";
3
+
4
+ interface Props {
5
+ title: string;
6
+ description?: string;
7
+ }
8
+
9
+ const { title, description = 'Code review agents for GitHub' } = Astro.props;
10
+ const currentPath = Astro.url.pathname;
11
+ const base = import.meta.env.BASE_URL.replace(/\/$/, '');
12
+ const pageTitle = title === 'Home' ? 'Warden' : `${title} | Warden`;
13
+ ---
14
+
15
+ <!DOCTYPE html>
16
+ <html lang="en">
17
+ <head>
18
+ <meta charset="UTF-8" />
19
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
20
+ <meta name="description" content={description} />
21
+ <title>{pageTitle}</title>
22
+ <link rel="icon" type="image/svg+xml" href={`${base}/favicon.svg`} />
23
+ <Font cssVariable="--font-geist-mono" preload />
24
+ </head>
25
+ <body>
26
+ <nav class="nav">
27
+ <div class="nav-inner container">
28
+ <a href={`${base}/`} class="nav-logo">
29
+ <svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
30
+ <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="currentColor"/>
31
+ <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"/>
32
+ </svg>
33
+ Warden
34
+ </a>
35
+ <button class="nav-toggle" aria-label="Toggle menu" aria-expanded="false">
36
+ <span class="hamburger"></span>
37
+ </button>
38
+ <div class="nav-links">
39
+ <a href={`${base}/guide`} class:list={[{ active: currentPath.endsWith('/guide') || currentPath.endsWith('/guide/') }]}>Guide</a>
40
+ <a href={`${base}/config`} class:list={[{ active: currentPath.endsWith('/config') || currentPath.endsWith('/config/') }]}>Config</a>
41
+ <a href={`${base}/cli`} class:list={[{ active: currentPath.endsWith('/cli') || currentPath.endsWith('/cli/') }]}>CLI</a>
42
+ <a href="https://github.com/getsentry/warden" class="nav-github" aria-label="GitHub">
43
+ <svg width="20" height="20" viewBox="0 0 24 24" fill="currentColor">
44
+ <path d="M12 0c-6.626 0-12 5.373-12 12 0 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.23.957-.266 1.983-.399 3.003-.404 1.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.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z"/>
45
+ </svg>
46
+ </a>
47
+ </div>
48
+ </div>
49
+ </nav>
50
+ <script>
51
+ const toggle = document.querySelector('.nav-toggle');
52
+ const nav = document.querySelector('.nav');
53
+ toggle?.addEventListener('click', () => {
54
+ const expanded = toggle.getAttribute('aria-expanded') === 'true';
55
+ toggle.setAttribute('aria-expanded', String(!expanded));
56
+ nav?.classList.toggle('nav-open');
57
+ });
58
+
59
+ // Add anchor links to headings
60
+ function slugify(text: string): string {
61
+ return text
62
+ .toLowerCase()
63
+ .replace(/[^a-z0-9]+/g, '-')
64
+ .replace(/(^-|-$)/g, '');
65
+ }
66
+
67
+ const headings = document.querySelectorAll('main h2, main h3, main h4');
68
+ const usedIds = new Set<string>();
69
+
70
+ headings.forEach((heading) => {
71
+ const text = heading.textContent || '';
72
+ let id = slugify(text);
73
+
74
+ // Handle duplicates
75
+ let counter = 1;
76
+ let uniqueId = id;
77
+ while (usedIds.has(uniqueId)) {
78
+ uniqueId = `${id}-${counter++}`;
79
+ }
80
+ usedIds.add(uniqueId);
81
+
82
+ heading.id = uniqueId;
83
+
84
+ const anchor = document.createElement('a');
85
+ anchor.href = `#${uniqueId}`;
86
+ anchor.className = 'heading-anchor';
87
+ anchor.textContent = '#';
88
+ anchor.setAttribute('aria-label', `Link to ${text}`);
89
+ heading.prepend(anchor);
90
+ });
91
+
92
+ // Scroll to anchor on load if hash present
93
+ if (window.location.hash) {
94
+ const target = document.querySelector(window.location.hash);
95
+ if (target) {
96
+ setTimeout(() => target.scrollIntoView(), 0);
97
+ }
98
+ }
99
+
100
+ // Package manager preference (shared across all pages)
101
+ const PM_STORAGE_KEY = 'warden-docs-pm';
102
+
103
+ function setPackageManager(pm: string) {
104
+ document.querySelectorAll('.pm-tabs').forEach((container) => {
105
+ const buttons = container.querySelectorAll('.tab-btn');
106
+ const contents = container.querySelectorAll('.tab-content');
107
+
108
+ buttons.forEach((btn) => {
109
+ btn.classList.toggle('active', btn.getAttribute('data-pm') === pm);
110
+ });
111
+
112
+ contents.forEach((content) => {
113
+ content.classList.toggle('hidden', content.getAttribute('data-pm') !== pm);
114
+ });
115
+ });
116
+ }
117
+
118
+ function initPackageManagerTabs() {
119
+ const savedPm = localStorage.getItem(PM_STORAGE_KEY);
120
+ if (savedPm) {
121
+ setPackageManager(savedPm);
122
+ }
123
+
124
+ document.querySelectorAll('.pm-tabs').forEach((container) => {
125
+ container.querySelectorAll('.tab-btn').forEach((btn) => {
126
+ btn.addEventListener('click', () => {
127
+ const pm = btn.getAttribute('data-pm');
128
+ if (!pm) return;
129
+ localStorage.setItem(PM_STORAGE_KEY, pm);
130
+ setPackageManager(pm);
131
+ });
132
+ });
133
+
134
+ const copyButton = container.querySelector('.copy-button');
135
+ if (copyButton) {
136
+ copyButton.addEventListener('click', async () => {
137
+ const activeContent = container.querySelector('.tab-content:not(.hidden)');
138
+ if (!activeContent) return;
139
+
140
+ // Strip $ prompt from each line
141
+ const textToCopy = (activeContent.textContent || '')
142
+ .split('\n')
143
+ .map(line => line.replace(/^\s*[$>]\s*/, ''))
144
+ .join('\n')
145
+ .trim();
146
+
147
+ try {
148
+ await navigator.clipboard.writeText(textToCopy);
149
+ copyButton.classList.add('copied');
150
+ setTimeout(() => copyButton.classList.remove('copied'), 2000);
151
+ } catch (err) {
152
+ console.error('Failed to copy:', err);
153
+ }
154
+ });
155
+ }
156
+ });
157
+ }
158
+
159
+ initPackageManagerTabs();
160
+ document.addEventListener('astro:page-load', initPackageManagerTabs);
161
+
162
+ </script>
163
+ <main class="container">
164
+ <slot />
165
+ </main>
166
+ <footer class="footer">
167
+ <div class="container">
168
+ <p>FSL-1.1-ALv2 License &middot; <a href="https://github.com/getsentry/warden">GitHub</a></p>
169
+ </div>
170
+ </footer>
171
+ </body>
172
+ </html>
173
+
174
+ <style is:global>
175
+ @import '../styles/global.css';
176
+
177
+ .nav {
178
+ padding: 1rem 0;
179
+ position: sticky;
180
+ top: 0;
181
+ background: rgba(0, 0, 0, 0.9);
182
+ backdrop-filter: saturate(180%) blur(20px);
183
+ -webkit-backdrop-filter: saturate(180%) blur(20px);
184
+ z-index: 100;
185
+ }
186
+
187
+ .nav-inner {
188
+ display: flex;
189
+ justify-content: space-between;
190
+ align-items: center;
191
+ }
192
+
193
+ .nav-logo,
194
+ .nav-logo:link,
195
+ .nav-logo:visited,
196
+ .nav-logo:active {
197
+ font-family: var(--font-mono);
198
+ font-size: 1.5rem;
199
+ font-weight: 700;
200
+ color: #fff !important;
201
+ letter-spacing: -0.02em;
202
+ display: flex;
203
+ align-items: center;
204
+ gap: 0.5rem;
205
+ }
206
+
207
+ .nav-logo svg {
208
+ flex-shrink: 0;
209
+ }
210
+
211
+ .nav-logo:hover {
212
+ color: #fff !important;
213
+ opacity: 0.8;
214
+ }
215
+
216
+ .nav-links {
217
+ display: flex;
218
+ gap: 2rem;
219
+ align-items: center;
220
+ }
221
+
222
+ .nav-links a {
223
+ color: #fff;
224
+ font-size: 0.875rem;
225
+ font-weight: 500;
226
+ transition: opacity 0.15s ease;
227
+ padding-bottom: 4px;
228
+ border-bottom: 4px solid transparent;
229
+ margin-bottom: -4px;
230
+ }
231
+
232
+ .nav-links a:hover {
233
+ color: #fff;
234
+ opacity: 0.7;
235
+ }
236
+
237
+ .nav-links a.active {
238
+ color: #fff;
239
+ border-bottom-color: #fff;
240
+ opacity: 1;
241
+ }
242
+
243
+ .nav-github {
244
+ margin-left: 1rem;
245
+ display: flex;
246
+ align-items: center;
247
+ padding-bottom: 0;
248
+ border-bottom: none;
249
+ margin-bottom: 0;
250
+ }
251
+
252
+ .nav-github:hover {
253
+ opacity: 0.7;
254
+ }
255
+
256
+ .nav-github svg {
257
+ display: block;
258
+ }
259
+
260
+ .footer {
261
+ border-top: 1px solid var(--border);
262
+ padding: 2.5rem 0;
263
+ margin-top: 4rem;
264
+ text-align: center;
265
+ }
266
+
267
+ .footer p {
268
+ color: var(--text-tertiary);
269
+ font-size: 0.8125rem;
270
+ margin: 0;
271
+ }
272
+
273
+ .footer a {
274
+ color: var(--text-secondary);
275
+ }
276
+
277
+ .footer a:hover {
278
+ color: var(--text);
279
+ }
280
+
281
+ .footer .easter-egg {
282
+ font-size: 0.6875rem;
283
+ margin-top: 0.75rem;
284
+ opacity: 0.5;
285
+ }
286
+
287
+ /* Hamburger button */
288
+ .nav-toggle {
289
+ display: none;
290
+ background: none;
291
+ border: none;
292
+ cursor: pointer;
293
+ padding: 0.5rem;
294
+ margin-right: -0.5rem;
295
+ }
296
+
297
+ .hamburger {
298
+ display: block;
299
+ width: 20px;
300
+ height: 2px;
301
+ background: #fff;
302
+ position: relative;
303
+ transition: background 0.2s ease;
304
+ }
305
+
306
+ .hamburger::before,
307
+ .hamburger::after {
308
+ content: '';
309
+ position: absolute;
310
+ left: 0;
311
+ width: 20px;
312
+ height: 2px;
313
+ background: #fff;
314
+ transition: transform 0.2s ease;
315
+ }
316
+
317
+ .hamburger::before {
318
+ top: -6px;
319
+ }
320
+
321
+ .hamburger::after {
322
+ top: 6px;
323
+ }
324
+
325
+ /* Animate to X when open */
326
+ .nav-open .hamburger {
327
+ background: transparent;
328
+ }
329
+
330
+ .nav-open .hamburger::before {
331
+ transform: translateY(6px) rotate(45deg);
332
+ }
333
+
334
+ .nav-open .hamburger::after {
335
+ transform: translateY(-6px) rotate(-45deg);
336
+ }
337
+
338
+ @media (max-width: 768px) {
339
+ .nav-toggle {
340
+ display: block;
341
+ }
342
+
343
+ .nav-links {
344
+ display: none;
345
+ position: absolute;
346
+ top: 100%;
347
+ left: 0;
348
+ right: 0;
349
+ background: rgba(0, 0, 0, 0.95);
350
+ backdrop-filter: saturate(180%) blur(20px);
351
+ -webkit-backdrop-filter: saturate(180%) blur(20px);
352
+ flex-direction: column;
353
+ padding: 1rem 1.5rem 1.5rem;
354
+ gap: 0;
355
+ border-top: 1px solid rgba(255, 255, 255, 0.1);
356
+ }
357
+
358
+ .nav-open .nav-links {
359
+ display: flex;
360
+ }
361
+
362
+ .nav-links a {
363
+ padding: 0.75rem 0;
364
+ border-bottom: 1px solid rgba(255, 255, 255, 0.1);
365
+ margin-bottom: 0;
366
+ }
367
+
368
+ .nav-links a:last-child {
369
+ border-bottom: none;
370
+ }
371
+
372
+ .nav-github {
373
+ margin-left: 0;
374
+ padding-left: 0;
375
+ border-left: none;
376
+ padding-top: 1rem;
377
+ margin-top: 0.5rem;
378
+ }
379
+ }
380
+ </style>
@@ -0,0 +1,167 @@
1
+ ---
2
+ import Base from '../layouts/Base.astro';
3
+ import Terminal from '../components/Terminal.astro';
4
+ import { Code } from 'astro:components';
5
+ ---
6
+
7
+ <Base title="CLI" description="Warden CLI commands and options">
8
+ <h1>CLI</h1>
9
+
10
+ <div class="command-card">
11
+ <h3>warden</h3>
12
+ <div class="synopsis">warden [target] [options]</div>
13
+ <p>Run code analysis on the specified target. If no target is given, analyzes uncommitted changes.</p>
14
+ <ul>
15
+ <li><code>target</code> - Files, directories, or git refs to analyze (optional)</li>
16
+ </ul>
17
+ <Terminal>
18
+ <Code
19
+ code={`warden # Analyze uncommitted changes (default)
20
+ warden src/auth.ts # Analyze specific file
21
+ warden src/api/ # Analyze a directory
22
+ warden HEAD~3..HEAD # Analyze changes in a git range`}
23
+ lang="bash"
24
+ theme="vitesse-black"
25
+ />
26
+ </Terminal>
27
+ </div>
28
+
29
+ <div class="command-card">
30
+ <h3>warden init</h3>
31
+ <div class="synopsis">warden init [options]</div>
32
+ <p>Initialize Warden in your project. Creates a configuration file and GitHub workflow.</p>
33
+ <ul>
34
+ <li><code>-f, --force</code> - Overwrite existing files</li>
35
+ </ul>
36
+ <Terminal>
37
+ <Code
38
+ code={`warden init # Interactive setup
39
+ warden init --force # Overwrite existing files`}
40
+ lang="bash"
41
+ theme="vitesse-black"
42
+ />
43
+ </Terminal>
44
+ </div>
45
+
46
+ <div class="command-card">
47
+ <h3>warden add</h3>
48
+ <div class="synopsis">warden add [skill-name] [options]</div>
49
+ <p>Add a skill trigger to your configuration. Run without arguments for interactive mode.</p>
50
+ <ul>
51
+ <li><code>skill-name</code> - Name of the skill to add (optional, interactive if omitted)</li>
52
+ <li><code>--remote &lt;owner/repo[@sha]&gt;</code> - Install skill from a GitHub repository</li>
53
+ <li><code>--list</code> - List available skills</li>
54
+ </ul>
55
+ <Terminal>
56
+ <Code
57
+ code={`warden add # Interactive mode
58
+ warden add security-review # Add local skill
59
+ warden add --list # List available skills
60
+
61
+ # Remote skills from GitHub repositories
62
+ warden add --remote getsentry/warden-skills --skill security-review
63
+ warden add --remote getsentry/warden-skills@abc123 --skill api-review # Pinned to commit`}
64
+ lang="bash"
65
+ theme="vitesse-black"
66
+ />
67
+ </Terminal>
68
+ </div>
69
+
70
+ <div class="command-card">
71
+ <h3>warden sync</h3>
72
+ <div class="synopsis">warden sync [remote]</div>
73
+ <p>Update cached remote skills. Refreshes unpinned skills to their latest versions.</p>
74
+ <ul>
75
+ <li><code>remote</code> - Specific remote to sync (e.g., <code>owner/repo</code>). If omitted, syncs all.</li>
76
+ </ul>
77
+ <Terminal>
78
+ <Code
79
+ code={`warden sync # Update all remote skills
80
+ warden sync getsentry/warden-skills # Update specific remote`}
81
+ lang="bash"
82
+ theme="vitesse-black"
83
+ />
84
+ </Terminal>
85
+ </div>
86
+
87
+ <div class="command-card">
88
+ <h3>warden setup-app</h3>
89
+ <div class="synopsis">warden setup-app [options]</div>
90
+ <p>Create a GitHub App for Warden. This gives you a custom bot identity instead of the generic "github-actions" user.</p>
91
+ <ul>
92
+ <li><code>--org &lt;name&gt;</code> - Create the app for an organization instead of your personal account</li>
93
+ <li><code>--port &lt;number&gt;</code> - Local server port (default: 3000)</li>
94
+ <li><code>--timeout &lt;sec&gt;</code> - Callback timeout in seconds (default: 300)</li>
95
+ <li><code>--name &lt;string&gt;</code> - Custom app name (default: Warden)</li>
96
+ <li><code>--no-open</code> - Print URL instead of opening browser</li>
97
+ </ul>
98
+ <Terminal>
99
+ <Code
100
+ code={`warden setup-app # For a personal account
101
+ warden setup-app --org my-org # For an organization`}
102
+ lang="bash"
103
+ theme="vitesse-black"
104
+ />
105
+ </Terminal>
106
+ </div>
107
+
108
+ <h2>Global Options</h2>
109
+ <ul>
110
+ <li><code>--skill &lt;name-or-path&gt;</code> - Run a specific skill by name or path (see <a href="#skill-references">Skill References</a>)</li>
111
+ <li><code>--fix</code> - Automatically apply suggested fixes</li>
112
+ <li><code>--json</code> - Output results as JSON</li>
113
+ <li><code>--fail-on &lt;level&gt;</code> - Exit with error code if findings meet severity: <code>critical</code>, <code>high</code>, <code>medium</code>, <code>low</code></li>
114
+ <li><code>--config &lt;path&gt;</code> - Path to config file (default: <code>warden.toml</code>)</li>
115
+ <li><code>--verbose</code> - Show detailed output</li>
116
+ <li><code>-m, --model &lt;model&gt;</code> - Model to use (fallback when not set in config)</li>
117
+ <li><code>-o, --output &lt;path&gt;</code> - Write full run output to a JSONL file</li>
118
+ <li><code>--comment-on &lt;severity&gt;</code> - Only show findings at or above this severity in output</li>
119
+ <li><code>--parallel &lt;n&gt;</code> - Max concurrent trigger/skill executions (default: 4)</li>
120
+ <li><code>--quiet</code> - Errors and final summary only</li>
121
+ <li><code>-vv</code> - Show debug info (token counts, latencies)</li>
122
+ <li><code>--color / --no-color</code> - Override color detection</li>
123
+ <li><code>--offline</code> - Use cached remote skills only, skip network fetches</li>
124
+ <li><code>--help</code> - Show help message</li>
125
+ <li><code>--version</code> - Show version number</li>
126
+ </ul>
127
+
128
+ <h2 id="skill-references">Skill References</h2>
129
+
130
+ <p>The <code>--skill</code> option accepts multiple formats:</p>
131
+
132
+ <Terminal>
133
+ <Code
134
+ code={`# By name (resolved from .warden/skills/, .agents/skills/, .claude/skills/)
135
+ warden --skill security-review
136
+
137
+ # Relative path
138
+ warden --skill ./skills/custom-review
139
+
140
+ # Absolute path
141
+ warden --skill /shared/skills/company-review
142
+
143
+ # Home directory expansion
144
+ warden --skill ~/my-skills/security`}
145
+ lang="bash"
146
+ theme="vitesse-black"
147
+ />
148
+ </Terminal>
149
+
150
+ <p>Resolution order:</p>
151
+ <ol>
152
+ <li>Remote repository (if <code>remote</code> is specified in trigger config)</li>
153
+ <li>Direct path (if contains <code>/</code>, <code>\</code>, or starts with <code>.</code>)</li>
154
+ <li>Conventional directories: <code>.warden/skills/</code>, <code>.agents/skills/</code>, <code>.claude/skills/</code></li>
155
+ </ol>
156
+
157
+ <h2>Environment Variables</h2>
158
+
159
+ <dl>
160
+ <dt>WARDEN_ANTHROPIC_API_KEY</dt>
161
+ <dd>Anthropic API key. Required for CI/CD. For local use, Warden can use your Claude Code subscription instead (run <code>claude login</code>).</dd>
162
+ <dt>ANTHROPIC_API_KEY</dt>
163
+ <dd>Fallback if <code>WARDEN_ANTHROPIC_API_KEY</code> is not set</dd>
164
+ <dt>WARDEN_SKILL_CACHE_TTL</dt>
165
+ <dd>Cache duration for unpinned remote skills. Default: 24h</dd>
166
+ </dl>
167
+ </Base>