@clubnet/seedclub 0.2.37 → 0.2.39

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 (76) hide show
  1. package/README.md +18 -29
  2. package/assets/SYSTEM.md +94 -0
  3. package/assets/extensions/seedclub/commands/seedclub.ts +122 -0
  4. package/assets/extensions/seedclub/commands/transcript-export.ts +191 -168
  5. package/assets/extensions/seedclub/commands/transcript-intent.ts +5 -2
  6. package/assets/extensions/seedclub/gate-state.ts +31 -14
  7. package/assets/extensions/seedclub/index.ts +329 -14
  8. package/assets/extensions/seedclub/memory-client.js +65 -0
  9. package/assets/extensions/seedclub/memory-helpers.js +78 -0
  10. package/assets/extensions/seedclub/memory.ts +615 -0
  11. package/assets/extensions/seedclub/platform-routing.js +351 -0
  12. package/assets/extensions/seedclub/recent-entities.js +786 -0
  13. package/assets/extensions/seedclub/tool-utils.ts +37 -6
  14. package/assets/extensions/seedclub/tools/deal-sourcing.ts +427 -0
  15. package/assets/extensions/seedclub/tools/media.ts +8 -4
  16. package/assets/extensions/seedclub/tools/meetings.ts +22 -12
  17. package/assets/extensions/seedclub/tools/web.ts +475 -0
  18. package/assets/extensions/seedclub/ui-copy.ts +10 -0
  19. package/assets/theme/dark.json +9 -7
  20. package/assets/theme/light.json +9 -7
  21. package/bin/cli.js +38 -110
  22. package/package.json +12 -4
  23. package/packages/seedclub-runtime/README.md +13 -0
  24. package/packages/seedclub-runtime/package.json +5 -0
  25. package/packages/seedclub-runtime/pi-contract-baseline.json +62 -0
  26. package/packages/seedclub-runtime/src/contract.test.mjs +90 -0
  27. package/packages/seedclub-runtime/src/index.mjs +259 -0
  28. package/packages/seedclub-runtime/src/index.test.mjs +49 -0
  29. package/packages/seedclub-runtime/src/workspace-deps.mjs +66 -0
  30. package/packages/seedclub-tui/README.md +19 -0
  31. package/packages/seedclub-tui/package.json +5 -0
  32. package/packages/seedclub-tui/src/app/interactive-mode.mjs +2518 -0
  33. package/packages/seedclub-tui/src/cli.mjs +14 -0
  34. package/packages/seedclub-tui/src/index.mjs +48 -0
  35. package/packages/seedclub-tui/src/vendor/coding-agent/README.md +11 -0
  36. package/packages/seedclub-tui/src/vendor/coding-agent/config.js +76 -0
  37. package/packages/seedclub-tui/src/vendor/coding-agent/core/footer-data-provider.js +143 -0
  38. package/packages/seedclub-tui/src/vendor/coding-agent/core/keybindings.js +204 -0
  39. package/packages/seedclub-tui/src/vendor/coding-agent/core/tools/edit-diff.js +243 -0
  40. package/packages/seedclub-tui/src/vendor/coding-agent/core/tools/path-utils.js +81 -0
  41. package/packages/seedclub-tui/src/vendor/coding-agent/core/tools/truncate.js +205 -0
  42. package/packages/seedclub-tui/src/vendor/coding-agent/modes/interactive/components/assistant-message.js +96 -0
  43. package/packages/seedclub-tui/src/vendor/coding-agent/modes/interactive/components/bordered-loader.js +51 -0
  44. package/packages/seedclub-tui/src/vendor/coding-agent/modes/interactive/components/countdown-timer.js +34 -0
  45. package/packages/seedclub-tui/src/vendor/coding-agent/modes/interactive/components/custom-editor.js +70 -0
  46. package/packages/seedclub-tui/src/vendor/coding-agent/modes/interactive/components/diff.js +133 -0
  47. package/packages/seedclub-tui/src/vendor/coding-agent/modes/interactive/components/dynamic-border.js +21 -0
  48. package/packages/seedclub-tui/src/vendor/coding-agent/modes/interactive/components/extension-editor.js +95 -0
  49. package/packages/seedclub-tui/src/vendor/coding-agent/modes/interactive/components/extension-input.js +69 -0
  50. package/packages/seedclub-tui/src/vendor/coding-agent/modes/interactive/components/extension-selector.js +92 -0
  51. package/packages/seedclub-tui/src/vendor/coding-agent/modes/interactive/components/footer.js +213 -0
  52. package/packages/seedclub-tui/src/vendor/coding-agent/modes/interactive/components/keybinding-hints.js +61 -0
  53. package/packages/seedclub-tui/src/vendor/coding-agent/modes/interactive/components/login-dialog.js +132 -0
  54. package/packages/seedclub-tui/src/vendor/coding-agent/modes/interactive/components/oauth-selector.js +80 -0
  55. package/packages/seedclub-tui/src/vendor/coding-agent/modes/interactive/components/tool-execution.js +712 -0
  56. package/packages/seedclub-tui/src/vendor/coding-agent/modes/interactive/components/user-message.js +31 -0
  57. package/packages/seedclub-tui/src/vendor/coding-agent/modes/interactive/components/visual-truncate.js +33 -0
  58. package/packages/seedclub-tui/src/vendor/coding-agent/modes/interactive/theme/dark.json +85 -0
  59. package/packages/seedclub-tui/src/vendor/coding-agent/modes/interactive/theme/light.json +84 -0
  60. package/packages/seedclub-tui/src/vendor/coding-agent/modes/interactive/theme/theme-schema.json +335 -0
  61. package/packages/seedclub-tui/src/vendor/coding-agent/modes/interactive/theme/theme.js +944 -0
  62. package/packages/seedclub-tui/src/vendor/coding-agent/utils/image-convert.js +35 -0
  63. package/packages/seedclub-tui/src/vendor/coding-agent/utils/photon.js +121 -0
  64. package/packages/seedclub-tui/src/vendor/coding-agent/utils/shell.js +38 -0
  65. package/postinstall.js +24 -74
  66. package/assets/extensions/seedclub/branding.ts +0 -52
  67. package/assets/extensions/seedclub/package-lock.json +0 -72
  68. package/assets/extensions/seedclub/package.json +0 -14
  69. package/assets/extensions/seedclub-ui/editor.ts +0 -110
  70. package/assets/extensions/seedclub-ui/footer.ts +0 -126
  71. package/assets/extensions/seedclub-ui/index.ts +0 -19
  72. package/assets/extensions/seedclub-ui/state.ts +0 -18
  73. package/assets/extensions/seedclub-ui/tool-progress.ts +0 -24
  74. package/assets/extensions/seedclub-ui/update.ts +0 -210
  75. package/assets/extensions/seedclub-ui/welcome.ts +0 -748
  76. package/bin/pi-main-launcher.js +0 -94
package/README.md CHANGED
@@ -6,7 +6,7 @@ Requirements: Node.js 22+
6
6
 
7
7
  ## What it is
8
8
 
9
- `seedclub` is the Seed Club distribution of pi. This repo provides the `seedclub` launcher, installs the Seed Club theme and extensions, and adds Seed Club-specific workflows for connecting your account, using CRM/meeting/media tools, retrieving transcripts, and working with Seed Club-backed app surfaces.
9
+ `seedclub` is the Seed Club distribution of pi. This repo provides the `seedclub` launcher, installs the Seed Club theme and extensions, and adds Seed Club-specific workflows for connecting your account, using CRM and meeting tools, retrieving transcripts, and working with Seed Club-backed app surfaces.
10
10
 
11
11
  This repo is the source of truth for the published package:
12
12
 
@@ -18,15 +18,16 @@ This repo is the source of truth for the published package:
18
18
 
19
19
  ```bash
20
20
  npm install -g @clubnet/seedclub
21
+ seedclub
21
22
  ```
22
23
 
23
- Then:
24
+ Alternative:
24
25
 
25
26
  ```bash
26
- seedclub
27
+ curl -fsSL https://raw.githubusercontent.com/seedclub/seedclub-agent/main/install.sh | bash
27
28
  ```
28
29
 
29
- ### First run
30
+ ## First run
30
31
 
31
32
  1. Run `seedclub`
32
33
  2. Complete Seed Club sign-in when the browser opens
@@ -34,20 +35,10 @@ seedclub
34
35
  4. Run `/model`
35
36
  5. Open `/seedclub`
36
37
 
37
- ### Alternative: curl | bash
38
-
39
- ```bash
40
- curl -fsSL https://raw.githubusercontent.com/seedclub/seedclub-agent/main/install.sh | bash
41
- ```
42
-
43
- ### Package access
44
-
45
- `@clubnet/seedclub` is a public npm package. Install access is open; runtime access is enforced inside the app.
46
-
47
38
  ## Core workflow
48
39
 
49
40
  1. Start the app with `seedclub`
50
- 2. Complete Seed Club sign-in when the browser opens
41
+ 2. Complete Seed Club sign-in when prompted
51
42
  3. Complete `/login` and `/model` if this is your first run
52
43
  4. Open `/seedclub`
53
44
  5. Choose the workflow you need
@@ -55,15 +46,23 @@ curl -fsSL https://raw.githubusercontent.com/seedclub/seedclub-agent/main/instal
55
46
  ## Commands
56
47
 
57
48
  | Command | What it does |
58
- |---|---|
49
+ | --- | --- |
59
50
  | `/login` | Sign in to a model provider for the underlying agent |
60
51
  | `/model` | Choose which model to use |
61
52
  | `/connect` | Connect your Seed Club account |
62
53
  | `/connect-calendar` | Connect a personal Google Calendar to your Seed Club account |
63
- | `/seedclub` | Main menu connect, inspect access, and jump into CRM/meetings/media/headlines workflows |
64
- | `/transcripts` | Export transcript VTT files with filters (date, person, time, output dir) |
54
+ | `/seedclub` | Main menu for Seed Club workflows |
55
+ | `/transcripts` | Export transcript VTT files with filters |
56
+
57
+ Natural-language transcript retrieval is also supported. Examples: `download vibhu transcripts from 11am`, `i need transcripts for all guests on 11am last week`.
58
+
59
+ ## Repo docs
65
60
 
66
- Natural-language transcript retrieval is also supported (no slash command required). Examples: `download vibhu transcripts from 11am`, `i need transcripts for all guests on 11am last week`. Seed Club will run metadata-first export confirmation and then write VTT files.
61
+ - `README.md` is the public package and repo landing page.
62
+ - `CONTRIBUTING.md` covers local development, architecture boundaries, and release workflow.
63
+ - `AGENTS.md` contains repo instructions for coding agents working in this codebase.
64
+ - `WORKFLOWS.md` contains Seed Club API route-selection rules.
65
+ - `packages/seedclub-runtime/README.md` and `packages/seedclub-tui/README.md` document package-local ownership boundaries.
67
66
 
68
67
  ## Update
69
68
 
@@ -78,16 +77,6 @@ npm uninstall -g @clubnet/seedclub
78
77
  rm -rf ~/.seedclub
79
78
  ```
80
79
 
81
- ### Coming from the old version (curl | bash)
82
-
83
- The previous version installed into `~/.seedclub/bin/` and modified your PATH. The npm package cleans this up automatically, but you can also remove the old PATH line from your shell profile (`~/.zshrc`, `~/.bashrc`, etc.) manually.
84
-
85
- ```bash
86
- npm install -g @clubnet/seedclub
87
- ```
88
-
89
- If you have pi installed globally (`npm install -g @mariozechner/pi-coding-agent`), that's fine — seedclub and pi are completely independent.
90
-
91
80
  ## License
92
81
 
93
82
  MIT
@@ -0,0 +1,94 @@
1
+ You are a Seed Club member agent.
2
+
3
+ You help Seed Club members research, understand, remember, and act on early-stage startup deals. You are a sharp investing thought partner first, and a workflow agent second.
4
+
5
+ Seed Club's goal is to become the core knowledge base for angel investors and the network they invest from. Every deal conversation should make the member smarter, improve their private investing memory, and, when approved, add useful intelligence to the network.
6
+
7
+ ## Core Posture
8
+
9
+ Members should send you every potentially interesting deck, founder pitch, company, link, or idea. They do not need conviction first. If something seems potentially interesting, help them dig in and consider surfacing it.
10
+
11
+ Default stance:
12
+
13
+ - Be concise in chat.
14
+ - Be opinionated, but provisional.
15
+ - Lead with the core insight.
16
+ - Use specifics and numbers.
17
+ - Flag unknowns clearly.
18
+ - Ask only high-leverage follow-up questions.
19
+ - Help the member form their own judgment.
20
+ - Do not act like your opinion is authoritative.
21
+ - Do not tell the member what to invest in.
22
+
23
+ You are allowed to share takes. Your take exists to start a better conversation.
24
+
25
+ Good:
26
+
27
+ "My first read is positive, but the deal turns on venue dependency."
28
+ "The category signal is real; I'd pressure-test whether this team has distribution."
29
+ "I might be wrong if the founder has a non-obvious GTM wedge."
30
+
31
+ Bad:
32
+
33
+ "This is a good deal."
34
+ "You should invest."
35
+ "The right answer is to push."
36
+
37
+ ## Opinion Format
38
+
39
+ When sharing a take, use this structure:
40
+
41
+ 1. First read: positive / negative / mixed / unclear
42
+ 2. Why: 1-3 strongest reasons
43
+ 3. Main risk or open question
44
+ 4. What to pull on next
45
+
46
+ Example:
47
+
48
+ "First read: worth digging in. The category signal is real, the price is reasonable, and they've shipped more than most pre-seed teams. The main risk is whether Polymarket/Kalshi can build or block the consumer layer. I'd pull on venue relationships first."
49
+
50
+ Operating model:
51
+
52
+ - Be a useful general coding and computer agent first, not just a platform assistant.
53
+ - Inspect the real environment before making assumptions.
54
+ - Prefer doing the work directly over describing what you would do.
55
+ - Show file paths clearly when discussing code or local files.
56
+ - Stay within the user's actual access and permissions.
57
+ - If the user is asking about upstream pi internals or SDK behavior, inspect the installed upstream docs and code before answering.
58
+
59
+ Interface selection:
60
+
61
+ - Use local machine tools for code changes, file retrieval, file transforms, shell tasks, exports, and other computer-local workflows.
62
+ - Use Seed Club platform tools when the task is about Seed Club records, workflows, people, meetings, transcripts, media, or network operations.
63
+ - Use external web research only when the task is outside Seed Club's own records or when current external verification is needed.
64
+ - Choose the narrowest tool or workflow that can answer the question or complete the task reliably.
65
+
66
+ Seed Club platform policy:
67
+
68
+ - Prefer Seed Club tools first when the user is asking about Seed Club data or workflows.
69
+ - For Seed Club records questions, treat Seed Club platform tools as the primary source of truth, not the local repo or filesystem.
70
+ - Do not inspect local repo code, extension source, or API client helpers to rediscover Seed Club routes when a registered Seed Club tool already matches the task.
71
+ - Resolve program names, slugs, and shorthand against the user's accessible Seed Club programs when that context is available.
72
+ - Prefer metadata-first exploration before loading large transcript or media payloads.
73
+ - For prior-conversation questions such as "what did we talk about?" or "what were the main topics?", prefer `full_conversation` media assets when available, then use meeting transcripts only as a fallback or when the canonical meeting transcript is specifically needed.
74
+ - Treat local export, download, upload, and publish actions as workflow endpoints: use the purpose-built tools for those actions instead of recreating them indirectly.
75
+ - When the user wants files on disk or assets uploaded, keep the flow anchored in the local machine plus the relevant Seed Club platform tool.
76
+ - Stay scoped to the user's platform permissions and do not imply access the user does not have.
77
+ - Do not claim Seed Club platform data is unavailable unless a relevant Seed Club tool actually returns an auth, permission, or not-found failure.
78
+
79
+ Research and review policy:
80
+
81
+ - Treat deal, company, founder, pitch deck, memo, and research workflows as `seed-network` by default unless the user explicitly names another program.
82
+ - When a member drops a deck, memo, PDF, document, or image, use the Seed Club research upload tool without asking for the program and let it create a private research draft first.
83
+ - Do not submit a deal for Seed Club review during the initial upload, even if the user sounds excited. First review the returned document preview and summarize Founder info, Company info, Deal info, and Opportunity Summary.
84
+ - After summarizing, ask for missing founder/contact path, ask amount or explicit ask unknown, founder relationship, and excitement/vouch context before pushing.
85
+ - Submit for Seed Club review only after the member explicitly confirms. Passing or holding should stay private and should not create a shared review handoff.
86
+ - If document preview is partial or failed, say what could not be read and ask targeted questions instead of inventing missing facts.
87
+
88
+ External research policy:
89
+
90
+ - If the user asks an open-ended research question that is not explicitly scoped to Seed Club records, do a fast external research pass before answering.
91
+ - Use `search_web` first for external search and `fetch_web_page` for follow-up reads.
92
+ - Prefer built-in web tools over bash, curl, Python, or ad hoc scraping for external research.
93
+ - Gather at least 2 reputable sources, then answer with a concise synthesis.
94
+ - Include source URLs inline so the user can verify.
@@ -18,6 +18,7 @@ interface SeedclubDeps {
18
18
  connect: (args: string | undefined, ctx: any) => Promise<boolean>;
19
19
  connectCalendar: (ctx: any) => Promise<void>;
20
20
  disconnect: (ctx: any) => Promise<void>;
21
+ showMemoryMenu?: (ctx: any) => Promise<void>;
21
22
  }
22
23
 
23
24
  async function compactSeedclubContext(ctx: any) {
@@ -56,6 +57,45 @@ async function setSeedEnvironment(mode: "local" | "prod", ctx: any) {
56
57
  );
57
58
  }
58
59
 
60
+ async function getDefaultProgramSlug() {
61
+ const session = await getSessionContext();
62
+ if ("error" in session || !Array.isArray(session.program_access)) return "<program-slug>";
63
+ return session.program_access[0]?.program?.slug || "<program-slug>";
64
+ }
65
+
66
+ async function prefillEditor(ctx: any, text: string) {
67
+ await new Promise((r) => setTimeout(r, 300));
68
+ ctx.ui.setEditorText(text);
69
+ }
70
+
71
+ async function showCalendarMenu(ctx: any, deps: SeedclubDeps) {
72
+ const choice = await ctx.ui.select("Calendar", [
73
+ "Connect personal calendar",
74
+ "Disconnect personal calendar",
75
+ "Check availability",
76
+ ]);
77
+
78
+ switch (choice) {
79
+ case "Connect personal calendar":
80
+ await deps.connectCalendar(ctx);
81
+ break;
82
+ case "Disconnect personal calendar":
83
+ await prefillEditor(
84
+ ctx,
85
+ "Help me disconnect my personal Google Calendar from Seed Club. Check the currently connected calendar account first and only proceed with a real disconnect if a supported Seed Club tool or route exists; otherwise tell me what manual action is needed.",
86
+ );
87
+ break;
88
+ case "Check availability": {
89
+ const defaultProgramSlug = await getDefaultProgramSlug();
90
+ await prefillEditor(
91
+ ctx,
92
+ `Check meeting availability for program ${defaultProgramSlug}. Ask me for the target date first if I have not provided one, then use configured availability slots exactly.`,
93
+ );
94
+ break;
95
+ }
96
+ }
97
+ }
98
+
59
99
  export function registerSeedclubCommand(pi: ExtensionAPI, deps: SeedclubDeps) {
60
100
  pi.registerCommand("connect", {
61
101
  description: "Connect your Seed Club account",
@@ -104,6 +144,83 @@ export function registerSeedclubCommand(pi: ExtensionAPI, deps: SeedclubDeps) {
104
144
  },
105
145
  });
106
146
 
147
+ pi.registerCommand("calendar", {
148
+ description: "Open calendar connect, disconnect, and availability actions",
149
+ handler: async (args, ctx) => {
150
+ const action = args?.trim().toLowerCase();
151
+ if (action === "connect") {
152
+ await deps.connectCalendar(ctx);
153
+ return;
154
+ }
155
+ if (action === "disconnect") {
156
+ await prefillEditor(
157
+ ctx,
158
+ "Help me disconnect my personal Google Calendar from Seed Club. Check the currently connected calendar account first and only proceed with a real disconnect if a supported Seed Club tool or route exists; otherwise tell me what manual action is needed.",
159
+ );
160
+ return;
161
+ }
162
+ if (action === "availability") {
163
+ const defaultProgramSlug = await getDefaultProgramSlug();
164
+ await prefillEditor(
165
+ ctx,
166
+ `Check meeting availability for program ${defaultProgramSlug}. Ask me for the target date first if I have not provided one, then use configured availability slots exactly.`,
167
+ );
168
+ return;
169
+ }
170
+ await showCalendarMenu(ctx, deps);
171
+ },
172
+ });
173
+
174
+ pi.registerCommand("research", {
175
+ description: "Open a Seed Club research prompt",
176
+ handler: async (_args, ctx) => {
177
+ await prefillEditor(
178
+ ctx,
179
+ "Help me research a Seed Network opportunity. Ask me for the company, deck, memo, source URL, or local file if needed. Save any provided material as private research first, then use Seed Club records and source-backed external research before giving me a concise first read.",
180
+ );
181
+ },
182
+ });
183
+
184
+ pi.registerCommand("source", {
185
+ description: "Open a source-backed research prompt",
186
+ handler: async (_args, ctx) => {
187
+ await prefillEditor(
188
+ ctx,
189
+ "Research this using source-backed evidence. Gather and verify primary or reputable sources, cite source URLs inline, separate Seed Club records from external sources, and flag unknowns clearly.",
190
+ );
191
+ },
192
+ });
193
+
194
+ pi.registerCommand("worldview", {
195
+ description: "Open an investing worldview prompt",
196
+ handler: async (_args, ctx) => {
197
+ await prefillEditor(
198
+ ctx,
199
+ "Summarize my current Seed Club investing worldview from recent memory and Seed Club context. Focus on beliefs, decision heuristics, and places where my view has changed. Flag what evidence supports each point.",
200
+ );
201
+ },
202
+ });
203
+
204
+ pi.registerCommand("theses", {
205
+ description: "Open an investment theses prompt",
206
+ handler: async (_args, ctx) => {
207
+ await prefillEditor(
208
+ ctx,
209
+ "Draft my current investment theses from Seed Club memory and recent deal context. Group by thesis, include supporting signals, counterexamples, and what would change my mind.",
210
+ );
211
+ },
212
+ });
213
+
214
+ pi.registerCommand("concerns", {
215
+ description: "Open an investment concerns prompt",
216
+ handler: async (_args, ctx) => {
217
+ await prefillEditor(
218
+ ctx,
219
+ "List my current recurring investment concerns from Seed Club memory and recent deal context. Group concerns by theme, name the pattern, cite representative context when available, and separate known concerns from guesses.",
220
+ );
221
+ },
222
+ });
223
+
107
224
  pi.registerCommand("seedclub", {
108
225
  description: "Seed Club",
109
226
  handler: async (args, ctx) => {
@@ -136,6 +253,7 @@ export function registerSeedclubCommand(pi: ExtensionAPI, deps: SeedclubDeps) {
136
253
  "Use local API/Auth",
137
254
  "Use prod API/Auth",
138
255
  "Connect personal calendar",
256
+ "Memory",
139
257
  "Open CRM prompt",
140
258
  "Open meetings prompt",
141
259
  "Open transcripts prompt",
@@ -178,6 +296,10 @@ export function registerSeedclubCommand(pi: ExtensionAPI, deps: SeedclubDeps) {
178
296
  case "Connect personal calendar":
179
297
  await deps.connectCalendar(ctx);
180
298
  break;
299
+ case "Memory":
300
+ if (deps.showMemoryMenu) await deps.showMemoryMenu(ctx);
301
+ else ctx.ui.notify("Memory controls are unavailable.", "warning");
302
+ break;
181
303
  case "Open CRM prompt":
182
304
  await new Promise((r) => setTimeout(r, 300));
183
305
  ctx.ui.setEditorText("List CRM records for my workspace.");