opencode-swarm-plugin 0.22.0 → 0.23.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 (128) hide show
  1. package/.turbo/turbo-build.log +9 -0
  2. package/CHANGELOG.md +12 -0
  3. package/README.md +109 -429
  4. package/dist/agent-mail.d.ts +480 -0
  5. package/dist/agent-mail.d.ts.map +1 -0
  6. package/dist/anti-patterns.d.ts +257 -0
  7. package/dist/anti-patterns.d.ts.map +1 -0
  8. package/dist/beads.d.ts +377 -0
  9. package/dist/beads.d.ts.map +1 -0
  10. package/dist/eval-capture.d.ts +206 -0
  11. package/dist/eval-capture.d.ts.map +1 -0
  12. package/dist/index.d.ts +1299 -0
  13. package/dist/index.d.ts.map +1 -0
  14. package/dist/index.js +498 -4246
  15. package/dist/learning.d.ts +670 -0
  16. package/dist/learning.d.ts.map +1 -0
  17. package/dist/mandate-promotion.d.ts +93 -0
  18. package/dist/mandate-promotion.d.ts.map +1 -0
  19. package/dist/mandate-storage.d.ts +209 -0
  20. package/dist/mandate-storage.d.ts.map +1 -0
  21. package/dist/mandates.d.ts +230 -0
  22. package/dist/mandates.d.ts.map +1 -0
  23. package/dist/output-guardrails.d.ts +125 -0
  24. package/dist/output-guardrails.d.ts.map +1 -0
  25. package/dist/pattern-maturity.d.ts +246 -0
  26. package/dist/pattern-maturity.d.ts.map +1 -0
  27. package/dist/plugin.d.ts +22 -0
  28. package/dist/plugin.d.ts.map +1 -0
  29. package/dist/plugin.js +493 -4241
  30. package/dist/rate-limiter.d.ts +218 -0
  31. package/dist/rate-limiter.d.ts.map +1 -0
  32. package/dist/repo-crawl.d.ts +146 -0
  33. package/dist/repo-crawl.d.ts.map +1 -0
  34. package/dist/schemas/bead.d.ts +255 -0
  35. package/dist/schemas/bead.d.ts.map +1 -0
  36. package/dist/schemas/evaluation.d.ts +161 -0
  37. package/dist/schemas/evaluation.d.ts.map +1 -0
  38. package/dist/schemas/index.d.ts +34 -0
  39. package/dist/schemas/index.d.ts.map +1 -0
  40. package/dist/schemas/mandate.d.ts +336 -0
  41. package/dist/schemas/mandate.d.ts.map +1 -0
  42. package/dist/schemas/swarm-context.d.ts +131 -0
  43. package/dist/schemas/swarm-context.d.ts.map +1 -0
  44. package/dist/schemas/task.d.ts +188 -0
  45. package/dist/schemas/task.d.ts.map +1 -0
  46. package/dist/skills.d.ts +471 -0
  47. package/dist/skills.d.ts.map +1 -0
  48. package/dist/storage.d.ts +260 -0
  49. package/dist/storage.d.ts.map +1 -0
  50. package/dist/structured.d.ts +196 -0
  51. package/dist/structured.d.ts.map +1 -0
  52. package/dist/swarm-decompose.d.ts +201 -0
  53. package/dist/swarm-decompose.d.ts.map +1 -0
  54. package/dist/swarm-mail.d.ts +240 -0
  55. package/dist/swarm-mail.d.ts.map +1 -0
  56. package/dist/swarm-orchestrate.d.ts +708 -0
  57. package/dist/swarm-orchestrate.d.ts.map +1 -0
  58. package/dist/swarm-prompts.d.ts +292 -0
  59. package/dist/swarm-prompts.d.ts.map +1 -0
  60. package/dist/swarm-strategies.d.ts +100 -0
  61. package/dist/swarm-strategies.d.ts.map +1 -0
  62. package/dist/swarm.d.ts +455 -0
  63. package/dist/swarm.d.ts.map +1 -0
  64. package/dist/tool-availability.d.ts +91 -0
  65. package/dist/tool-availability.d.ts.map +1 -0
  66. package/docs/planning/ADR-001-monorepo-structure.md +171 -0
  67. package/docs/planning/ADR-002-package-extraction.md +393 -0
  68. package/docs/planning/ADR-003-performance-improvements.md +451 -0
  69. package/docs/planning/ADR-004-message-queue-features.md +187 -0
  70. package/docs/planning/ADR-005-devtools-observability.md +202 -0
  71. package/docs/planning/ROADMAP.md +368 -0
  72. package/package.json +13 -24
  73. package/src/agent-mail.ts +1 -1
  74. package/src/beads.ts +1 -2
  75. package/src/index.ts +2 -2
  76. package/src/learning.integration.test.ts +66 -11
  77. package/src/mandate-storage.test.ts +3 -3
  78. package/src/storage.ts +78 -10
  79. package/src/swarm-mail.ts +3 -3
  80. package/src/swarm-orchestrate.ts +7 -7
  81. package/src/tool-availability.ts +1 -1
  82. package/tsconfig.json +1 -1
  83. package/.beads/.local_version +0 -1
  84. package/.beads/README.md +0 -81
  85. package/.beads/analysis/skill-architecture-meta-skills.md +0 -1562
  86. package/.beads/config.yaml +0 -62
  87. package/.beads/issues.jsonl +0 -2197
  88. package/.beads/metadata.json +0 -4
  89. package/.gitattributes +0 -3
  90. package/.github/workflows/ci.yml +0 -30
  91. package/.github/workflows/opencode.yml +0 -31
  92. package/.opencode/skills/tdd/SKILL.md +0 -182
  93. package/INTEGRATION_EXAMPLE.md +0 -66
  94. package/VERIFICATION_QUALITY_PATTERNS.md +0 -565
  95. package/bun.lock +0 -286
  96. package/dist/pglite.data +0 -0
  97. package/dist/pglite.wasm +0 -0
  98. package/src/streams/agent-mail.test.ts +0 -777
  99. package/src/streams/agent-mail.ts +0 -535
  100. package/src/streams/debug.test.ts +0 -500
  101. package/src/streams/debug.ts +0 -727
  102. package/src/streams/effect/ask.integration.test.ts +0 -314
  103. package/src/streams/effect/ask.ts +0 -202
  104. package/src/streams/effect/cursor.integration.test.ts +0 -418
  105. package/src/streams/effect/cursor.ts +0 -288
  106. package/src/streams/effect/deferred.test.ts +0 -357
  107. package/src/streams/effect/deferred.ts +0 -445
  108. package/src/streams/effect/index.ts +0 -17
  109. package/src/streams/effect/layers.ts +0 -73
  110. package/src/streams/effect/lock.test.ts +0 -385
  111. package/src/streams/effect/lock.ts +0 -399
  112. package/src/streams/effect/mailbox.test.ts +0 -260
  113. package/src/streams/effect/mailbox.ts +0 -318
  114. package/src/streams/events.test.ts +0 -924
  115. package/src/streams/events.ts +0 -329
  116. package/src/streams/index.test.ts +0 -229
  117. package/src/streams/index.ts +0 -578
  118. package/src/streams/migrations.test.ts +0 -359
  119. package/src/streams/migrations.ts +0 -362
  120. package/src/streams/projections.test.ts +0 -611
  121. package/src/streams/projections.ts +0 -504
  122. package/src/streams/store.integration.test.ts +0 -658
  123. package/src/streams/store.ts +0 -1075
  124. package/src/streams/swarm-mail.ts +0 -552
  125. package/test-bug-fixes.ts +0 -86
  126. package/vitest.integration.config.ts +0 -19
  127. package/vitest.integration.setup.ts +0 -48
  128. package/workflow-integration-analysis.md +0 -876
@@ -4,10 +4,46 @@
4
4
  * Tests for confidence decay, feedback scoring, outcome tracking,
5
5
  * anti-patterns, pattern maturity, and swarm tool integrations.
6
6
  *
7
- * These tests don't require external services - they test the learning
8
- * algorithms and their integration with swarm tools.
7
+ * ## Test Isolation Pattern
8
+ *
9
+ * This file uses TEST_SEMANTIC_MEMORY_COLLECTION to isolate test data from
10
+ * production semantic-memory collections. Each test run gets a unique suffix,
11
+ * preventing pollution of the default collections.
12
+ *
13
+ * **Cleanup**: Test collections are NOT automatically deleted after test runs.
14
+ * This is intentional - semantic-memory doesn't provide bulk delete APIs.
15
+ * To clean up test artifacts, use:
16
+ *
17
+ * ```bash
18
+ * # Manual cleanup (use scripts/cleanup-test-memories.ts for automation)
19
+ * semantic-memory list --collection swarm-feedback-test-* --json | jq -r '.[].id' | xargs -I {} semantic-memory remove {}
20
+ * ```
21
+ *
22
+ * The unique suffix prevents cross-test interference even without cleanup.
23
+ */
24
+ import {
25
+ describe,
26
+ it,
27
+ expect,
28
+ beforeEach,
29
+ afterEach,
30
+ beforeAll,
31
+ afterAll,
32
+ vi,
33
+ } from "vitest";
34
+ import { getTestCollectionName } from "./storage";
35
+
36
+ // ============================================================================
37
+ // Test Isolation Setup
38
+ // ============================================================================
39
+
40
+ /**
41
+ * Set unique collection suffix for this test run
42
+ *
43
+ * CRITICAL: This MUST be set before any storage instances are created.
44
+ * The env var is read during getCollectionNames() which happens at storage init.
9
45
  */
10
- import { describe, it, expect, beforeEach, afterEach, vi } from "vitest";
46
+ process.env.TEST_SEMANTIC_MEMORY_COLLECTION = getTestCollectionName();
11
47
 
12
48
  // Learning module
13
49
  import {
@@ -73,6 +109,30 @@ const mockContext = {
73
109
  abort: new AbortController().signal,
74
110
  };
75
111
 
112
+ /**
113
+ * Global test lifecycle hooks
114
+ *
115
+ * These document the test isolation pattern but don't actively clean up.
116
+ * Cleanup is manual via scripts/cleanup-test-memories.ts
117
+ */
118
+ beforeAll(() => {
119
+ console.log(
120
+ `[test] TEST_SEMANTIC_MEMORY_COLLECTION = ${process.env.TEST_SEMANTIC_MEMORY_COLLECTION}`,
121
+ );
122
+ console.log(
123
+ `[test] Test collections will be prefixed with: swarm-*-${process.env.TEST_SEMANTIC_MEMORY_COLLECTION}`,
124
+ );
125
+ });
126
+
127
+ afterAll(() => {
128
+ console.log(
129
+ `[test] Test complete. Collections NOT auto-deleted (use scripts/cleanup-test-memories.ts for cleanup)`,
130
+ );
131
+ console.log(
132
+ `[test] Test collection suffix was: ${process.env.TEST_SEMANTIC_MEMORY_COLLECTION}`,
133
+ );
134
+ });
135
+
76
136
  /**
77
137
  * Create a feedback event for testing
78
138
  */
@@ -1309,14 +1369,9 @@ describe("Storage Module", () => {
1309
1369
  beforeEach(async () => {
1310
1370
  isAvailable = await isSemanticMemoryAvailable();
1311
1371
  if (isAvailable) {
1312
- // Use unique collections per test run to ensure isolation
1313
- storage = new SemanticMemoryStorage({
1314
- collections: {
1315
- feedback: `test-feedback-learning-${Date.now()}`,
1316
- patterns: `test-patterns-learning-${Date.now()}`,
1317
- maturity: `test-maturity-learning-${Date.now()}`,
1318
- },
1319
- });
1372
+ // Use default collections (which include TEST_SEMANTIC_MEMORY_COLLECTION suffix)
1373
+ // This ensures all tests use the same isolated collections for this test run
1374
+ storage = new SemanticMemoryStorage();
1320
1375
  }
1321
1376
  });
1322
1377
 
@@ -177,7 +177,7 @@ describe("InMemoryMandateStorage", () => {
177
177
  it("should throw when updating non-existent mandate", async () => {
178
178
  await expect(
179
179
  storage.update("non-existent", { content: "Updated" }),
180
- ).rejects.toThrow("Mandate non-existent not found");
180
+ ).rejects.toThrow("Mandate 'non-existent' not found");
181
181
  });
182
182
  });
183
183
 
@@ -235,7 +235,7 @@ describe("InMemoryMandateStorage", () => {
235
235
  };
236
236
 
237
237
  await expect(storage.vote(vote2)).rejects.toThrow(
238
- "Agent GreenRiver has already voted on mandate mandate-1",
238
+ "Agent 'GreenRiver' has already voted on mandate 'mandate-1'",
239
239
  );
240
240
  });
241
241
 
@@ -572,7 +572,7 @@ describe("InMemoryMandateStorage", () => {
572
572
  createMandateStorage({
573
573
  backend: "unknown" as "semantic-memory" | "memory",
574
574
  }),
575
- ).toThrow("Unknown storage backend: unknown");
575
+ ).toThrow("Unknown storage backend: 'unknown'");
576
576
  });
577
577
  });
578
578
  });
package/src/storage.ts CHANGED
@@ -141,11 +141,51 @@ export interface StorageConfig {
141
141
  useSemanticSearch: boolean;
142
142
  }
143
143
 
144
+ /**
145
+ * Generate unique test collection name
146
+ *
147
+ * Creates a timestamp-based suffix for test collections to ensure complete isolation.
148
+ * Each test run gets its own collections that don't pollute production semantic-memory.
149
+ *
150
+ * @returns Unique suffix like "test-1734567890123"
151
+ *
152
+ * @example
153
+ * ```typescript
154
+ * // In test setup:
155
+ * process.env.TEST_SEMANTIC_MEMORY_COLLECTION = getTestCollectionName();
156
+ * // Results in collections like: swarm-feedback-test-1734567890123
157
+ * ```
158
+ */
159
+ export function getTestCollectionName(): string {
160
+ return `test-${Date.now()}`;
161
+ }
162
+
144
163
  /**
145
164
  * Get collection names with optional test suffix
146
165
  *
147
- * When TEST_MEMORY_COLLECTIONS=true, appends "-test" to all collection names
148
- * to isolate test data from production semantic-memory storage.
166
+ * Supports two test isolation modes:
167
+ * 1. TEST_MEMORY_COLLECTIONS=true - appends "-test" (shared across test run)
168
+ * 2. TEST_SEMANTIC_MEMORY_COLLECTION=<suffix> - appends custom suffix (unique per test run)
169
+ *
170
+ * Mode 2 is preferred for full isolation - prevents test pollution of production
171
+ * semantic-memory collections.
172
+ *
173
+ * @example
174
+ * ```typescript
175
+ * // Production
176
+ * getCollectionNames()
177
+ * // => { feedback: "swarm-feedback", patterns: "swarm-patterns", maturity: "swarm-maturity" }
178
+ *
179
+ * // Test mode 1 (legacy)
180
+ * process.env.TEST_MEMORY_COLLECTIONS = "true"
181
+ * getCollectionNames()
182
+ * // => { feedback: "swarm-feedback-test", patterns: "swarm-patterns-test", ... }
183
+ *
184
+ * // Test mode 2 (preferred - full isolation)
185
+ * process.env.TEST_SEMANTIC_MEMORY_COLLECTION = "test-1734567890123"
186
+ * getCollectionNames()
187
+ * // => { feedback: "swarm-feedback-test-1734567890123", patterns: "swarm-patterns-test-1734567890123", ... }
188
+ * ```
149
189
  */
150
190
  function getCollectionNames(): StorageCollections {
151
191
  const base = {
@@ -154,7 +194,17 @@ function getCollectionNames(): StorageCollections {
154
194
  maturity: "swarm-maturity",
155
195
  };
156
196
 
157
- // Test isolation: suffix collections with "-test" when in test mode
197
+ // Test isolation mode 2 (preferred): unique suffix per test run
198
+ const testSuffix = process.env.TEST_SEMANTIC_MEMORY_COLLECTION;
199
+ if (testSuffix) {
200
+ return {
201
+ feedback: `${base.feedback}-${testSuffix}`,
202
+ patterns: `${base.patterns}-${testSuffix}`,
203
+ maturity: `${base.maturity}-${testSuffix}`,
204
+ };
205
+ }
206
+
207
+ // Test isolation mode 1 (legacy): shared "-test" suffix
158
208
  if (process.env.TEST_MEMORY_COLLECTIONS === "true") {
159
209
  return {
160
210
  feedback: `${base.feedback}-test`,
@@ -166,11 +216,27 @@ function getCollectionNames(): StorageCollections {
166
216
  return base;
167
217
  }
168
218
 
169
- export const DEFAULT_STORAGE_CONFIG: StorageConfig = {
170
- backend: "semantic-memory",
171
- collections: getCollectionNames(),
172
- useSemanticSearch: true,
173
- };
219
+ /**
220
+ * Get default storage configuration
221
+ *
222
+ * Returns a fresh config object on each call to ensure env vars (like
223
+ * TEST_SEMANTIC_MEMORY_COLLECTION) are read at runtime, not module load time.
224
+ *
225
+ * @returns Default storage configuration
226
+ */
227
+ export function getDefaultStorageConfig(): StorageConfig {
228
+ return {
229
+ backend: "semantic-memory",
230
+ collections: getCollectionNames(),
231
+ useSemanticSearch: true,
232
+ };
233
+ }
234
+
235
+ /**
236
+ * @deprecated Use getDefaultStorageConfig() instead. This static export
237
+ * captures collections at module load time, breaking test isolation.
238
+ */
239
+ export const DEFAULT_STORAGE_CONFIG: StorageConfig = getDefaultStorageConfig();
174
240
 
175
241
  // ============================================================================
176
242
  // Unified Storage Interface
@@ -261,7 +327,8 @@ export class SemanticMemoryStorage implements LearningStorage {
261
327
  private config: StorageConfig;
262
328
 
263
329
  constructor(config: Partial<StorageConfig> = {}) {
264
- this.config = { ...DEFAULT_STORAGE_CONFIG, ...config };
330
+ // Use getDefaultStorageConfig() to ensure env vars are read at runtime
331
+ this.config = { ...getDefaultStorageConfig(), ...config };
265
332
  console.log(
266
333
  `[storage] SemanticMemoryStorage initialized with collections:`,
267
334
  this.config.collections,
@@ -723,7 +790,8 @@ export class InMemoryStorage implements LearningStorage {
723
790
  export function createStorage(
724
791
  config: Partial<StorageConfig> = {},
725
792
  ): LearningStorage {
726
- const fullConfig = { ...DEFAULT_STORAGE_CONFIG, ...config };
793
+ // Use getDefaultStorageConfig() to ensure env vars are read at runtime
794
+ const fullConfig = { ...getDefaultStorageConfig(), ...config };
727
795
 
728
796
  switch (fullConfig.backend) {
729
797
  case "semantic-memory":
package/src/swarm-mail.ts CHANGED
@@ -26,9 +26,9 @@ import {
26
26
  releaseSwarmFiles,
27
27
  acknowledgeSwarmMessage,
28
28
  checkSwarmHealth,
29
- } from "./streams/swarm-mail";
30
- import { getActiveReservations } from "./streams/projections";
31
- import type { MailSessionState } from "./streams/events";
29
+ getActiveReservations,
30
+ type MailSessionState,
31
+ } from "swarm-mail";
32
32
  import {
33
33
  existsSync,
34
34
  mkdirSync,
@@ -36,10 +36,10 @@ import {
36
36
  getSwarmInbox,
37
37
  releaseSwarmFiles,
38
38
  sendSwarmMessage,
39
- } from "./streams/swarm-mail";
40
- import { getAgent } from "./streams/projections";
41
- import { createEvent } from "./streams/events";
42
- import { appendEvent } from "./streams/store";
39
+ getAgent,
40
+ createEvent,
41
+ appendEvent,
42
+ } from "swarm-mail";
43
43
  import {
44
44
  addStrike,
45
45
  clearStrikes,
@@ -872,7 +872,7 @@ export const swarm_progress = tool({
872
872
  await appendEvent(event, args.project_key);
873
873
 
874
874
  // Update swarm_contexts table
875
- const { getDatabase } = await import("./streams/index");
875
+ const { getDatabase } = await import("swarm-mail");
876
876
  const db = await getDatabase(args.project_key);
877
877
  const now = Date.now();
878
878
  await db.query(
@@ -2062,7 +2062,7 @@ export const swarm_checkpoint = tool({
2062
2062
  await appendEvent(event, args.project_key);
2063
2063
 
2064
2064
  // Update swarm_contexts table for fast recovery
2065
- const { getDatabase } = await import("./streams/index");
2065
+ const { getDatabase } = await import("swarm-mail");
2066
2066
  const db = await getDatabase(args.project_key);
2067
2067
 
2068
2068
  const now = Date.now();
@@ -2138,7 +2138,7 @@ export const swarm_recover = tool({
2138
2138
  },
2139
2139
  async execute(args) {
2140
2140
  try {
2141
- const { getDatabase } = await import("./streams/index");
2141
+ const { getDatabase } = await import("swarm-mail");
2142
2142
  const db = await getDatabase(args.project_key);
2143
2143
 
2144
2144
  // Query most recent checkpoint for this epic
@@ -13,7 +13,7 @@
13
13
  * - agent-mail: DEPRECATED - Legacy MCP server (use swarm-mail instead)
14
14
  */
15
15
 
16
- import { checkSwarmHealth } from "./streams/swarm-mail";
16
+ import { checkSwarmHealth } from "swarm-mail";
17
17
 
18
18
  /** Default timeout for URL reachability checks in milliseconds */
19
19
  const DEFAULT_URL_TIMEOUT_MS = 2000;
package/tsconfig.json CHANGED
@@ -7,13 +7,13 @@
7
7
  "types": ["bun-types"],
8
8
  "strict": true,
9
9
  "skipLibCheck": true,
10
- "noEmit": true,
11
10
  "esModuleInterop": true,
12
11
  "allowSyntheticDefaultImports": true,
13
12
  "forceConsistentCasingInFileNames": true,
14
13
  "resolveJsonModule": true,
15
14
  "declaration": true,
16
15
  "declarationMap": true,
16
+ "emitDeclarationOnly": true,
17
17
  "sourceMap": true,
18
18
  "outDir": "./dist",
19
19
  "rootDir": "./src",
@@ -1 +0,0 @@
1
- 0.29.0
package/.beads/README.md DELETED
@@ -1,81 +0,0 @@
1
- # Beads - AI-Native Issue Tracking
2
-
3
- Welcome to Beads! This repository uses **Beads** for issue tracking - a modern, AI-native tool designed to live directly in your codebase alongside your code.
4
-
5
- ## What is Beads?
6
-
7
- Beads is issue tracking that lives in your repo, making it perfect for AI coding agents and developers who want their issues close to their code. No web UI required - everything works through the CLI and integrates seamlessly with git.
8
-
9
- **Learn more:** [github.com/steveyegge/beads](https://github.com/steveyegge/beads)
10
-
11
- ## Quick Start
12
-
13
- ### Essential Commands
14
-
15
- ```bash
16
- # Create new issues
17
- bd create "Add user authentication"
18
-
19
- # View all issues
20
- bd list
21
-
22
- # View issue details
23
- bd show <issue-id>
24
-
25
- # Update issue status
26
- bd update <issue-id> --status in_progress
27
- bd update <issue-id> --status done
28
-
29
- # Sync with git remote
30
- bd sync
31
- ```
32
-
33
- ### Working with Issues
34
-
35
- Issues in Beads are:
36
- - **Git-native**: Stored in `.beads/issues.jsonl` and synced like code
37
- - **AI-friendly**: CLI-first design works perfectly with AI coding agents
38
- - **Branch-aware**: Issues can follow your branch workflow
39
- - **Always in sync**: Auto-syncs with your commits
40
-
41
- ## Why Beads?
42
-
43
- ✨ **AI-Native Design**
44
- - Built specifically for AI-assisted development workflows
45
- - CLI-first interface works seamlessly with AI coding agents
46
- - No context switching to web UIs
47
-
48
- 🚀 **Developer Focused**
49
- - Issues live in your repo, right next to your code
50
- - Works offline, syncs when you push
51
- - Fast, lightweight, and stays out of your way
52
-
53
- 🔧 **Git Integration**
54
- - Automatic sync with git commits
55
- - Branch-aware issue tracking
56
- - Intelligent JSONL merge resolution
57
-
58
- ## Get Started with Beads
59
-
60
- Try Beads in your own projects:
61
-
62
- ```bash
63
- # Install Beads
64
- curl -sSL https://raw.githubusercontent.com/steveyegge/beads/main/scripts/install.sh | bash
65
-
66
- # Initialize in your repo
67
- bd init
68
-
69
- # Create your first issue
70
- bd create "Try out Beads"
71
- ```
72
-
73
- ## Learn More
74
-
75
- - **Documentation**: [github.com/steveyegge/beads/docs](https://github.com/steveyegge/beads/tree/main/docs)
76
- - **Quick Start Guide**: Run `bd quickstart`
77
- - **Examples**: [github.com/steveyegge/beads/examples](https://github.com/steveyegge/beads/tree/main/examples)
78
-
79
- ---
80
-
81
- *Beads: Issue tracking that moves at the speed of thought* ⚡