stagent 0.5.0 → 0.6.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 (252) hide show
  1. package/README.md +8 -8
  2. package/dist/cli.js +146 -2
  3. package/docs/.coverage-gaps.json +21 -0
  4. package/docs/.last-generated +1 -1
  5. package/docs/features/agent-intelligence.md +36 -14
  6. package/docs/features/chat.md +33 -56
  7. package/docs/features/cost-usage.md +14 -10
  8. package/docs/features/dashboard-kanban.md +30 -13
  9. package/docs/features/delivery-channels.md +198 -0
  10. package/docs/features/design-system.md +10 -10
  11. package/docs/features/documents.md +8 -8
  12. package/docs/features/home-workspace.md +20 -15
  13. package/docs/features/inbox-notifications.md +22 -10
  14. package/docs/features/keyboard-navigation.md +11 -11
  15. package/docs/features/monitoring.md +1 -1
  16. package/docs/features/playbook.md +30 -32
  17. package/docs/features/profiles.md +33 -11
  18. package/docs/features/projects.md +2 -2
  19. package/docs/features/provider-runtimes.md +58 -14
  20. package/docs/features/schedules.md +70 -40
  21. package/docs/features/settings.md +74 -46
  22. package/docs/features/shared-components.md +7 -15
  23. package/docs/features/tool-permissions.md +9 -9
  24. package/docs/features/workflows.md +32 -21
  25. package/docs/getting-started.md +33 -9
  26. package/docs/index.md +25 -16
  27. package/docs/journeys/developer.md +124 -207
  28. package/docs/journeys/personal-use.md +70 -79
  29. package/docs/journeys/power-user.md +107 -151
  30. package/docs/journeys/work-use.md +81 -113
  31. package/docs/manifest.json +77 -45
  32. package/docs/superpowers/plans/2026-03-30-finish-in-progress-features.md +547 -0
  33. package/docs/use-cases/agency-operator.md +84 -0
  34. package/docs/use-cases/solo-founder.md +75 -0
  35. package/docs/why-stagent.md +59 -0
  36. package/package.json +10 -3
  37. package/src/app/api/channels/[id]/route.ts +103 -0
  38. package/src/app/api/channels/[id]/test/route.ts +52 -0
  39. package/src/app/api/channels/inbound/slack/route.ts +109 -0
  40. package/src/app/api/channels/inbound/telegram/poll/route.ts +128 -0
  41. package/src/app/api/channels/inbound/telegram/route.ts +76 -0
  42. package/src/app/api/channels/route.ts +71 -0
  43. package/src/app/api/chat/conversations/route.ts +15 -0
  44. package/src/app/api/chat/entities/search/route.ts +46 -31
  45. package/src/app/api/environment/profiles/suggest/route.ts +19 -3
  46. package/src/app/api/environment/scan/route.ts +8 -1
  47. package/src/app/api/handoffs/[id]/route.ts +76 -0
  48. package/src/app/api/handoffs/route.ts +89 -0
  49. package/src/app/api/memory/route.ts +181 -0
  50. package/src/app/api/profiles/[id]/route.ts +16 -1
  51. package/src/app/api/profiles/[id]/test/route.ts +4 -0
  52. package/src/app/api/profiles/[id]/test-results/route.ts +22 -0
  53. package/src/app/api/profiles/[id]/test-single/route.ts +64 -0
  54. package/src/app/api/profiles/assist/route.ts +35 -0
  55. package/src/app/api/profiles/import-repo/apply-updates/route.ts +123 -0
  56. package/src/app/api/profiles/import-repo/check-updates/route.ts +163 -0
  57. package/src/app/api/profiles/import-repo/confirm/route.ts +118 -0
  58. package/src/app/api/profiles/import-repo/preview/route.ts +107 -0
  59. package/src/app/api/profiles/import-repo/route.ts +29 -0
  60. package/src/app/api/profiles/import-repo/scan/route.ts +25 -0
  61. package/src/app/api/profiles/route.ts +73 -22
  62. package/src/app/api/runtimes/ollama/route.ts +86 -0
  63. package/src/app/api/runtimes/suggest/route.ts +29 -0
  64. package/src/app/api/schedules/[id]/heartbeat-history/route.ts +77 -0
  65. package/src/app/api/schedules/[id]/route.ts +41 -3
  66. package/src/app/api/schedules/parse/route.ts +66 -0
  67. package/src/app/api/schedules/route.ts +71 -12
  68. package/src/app/api/settings/author-default/route.ts +7 -0
  69. package/src/app/api/settings/learning/route.ts +41 -0
  70. package/src/app/api/settings/ollama/route.ts +34 -0
  71. package/src/app/api/settings/providers/route.ts +57 -0
  72. package/src/app/api/settings/routing/route.ts +24 -0
  73. package/src/app/api/settings/web-search/route.ts +28 -0
  74. package/src/app/api/tasks/[id]/execute/route.ts +13 -1
  75. package/src/app/documents/page.tsx +3 -0
  76. package/src/app/environment/page.tsx +8 -1
  77. package/src/app/settings/page.tsx +10 -4
  78. package/src/app/workflows/[id]/edit/page.tsx +2 -0
  79. package/src/app/workflows/new/page.tsx +2 -0
  80. package/src/components/chat/chat-command-popover.tsx +22 -19
  81. package/src/components/chat/chat-input.tsx +5 -0
  82. package/src/components/chat/chat-model-selector.tsx +42 -1
  83. package/src/components/chat/chat-shell.tsx +2 -0
  84. package/src/components/dashboard/welcome-landing.tsx +9 -9
  85. package/src/components/environment/artifact-card.tsx +27 -1
  86. package/src/components/environment/environment-dashboard.tsx +50 -2
  87. package/src/components/environment/environment-summary-card.tsx +5 -2
  88. package/src/components/environment/suggested-profiles.tsx +117 -52
  89. package/src/components/handoffs/handoff-approval-card.tsx +159 -0
  90. package/src/components/memory/memory-browser.tsx +315 -0
  91. package/src/components/profiles/learned-context-panel.tsx +4 -4
  92. package/src/components/profiles/profile-assist-panel.tsx +512 -0
  93. package/src/components/profiles/profile-browser.tsx +109 -8
  94. package/src/components/profiles/profile-card.tsx +29 -1
  95. package/src/components/profiles/profile-detail-view.tsx +200 -28
  96. package/src/components/profiles/profile-form-view.tsx +220 -82
  97. package/src/components/profiles/repo-import-wizard.tsx +648 -0
  98. package/src/components/profiles/smoke-test-editor.tsx +106 -0
  99. package/src/components/schedules/schedule-create-sheet.tsx +9 -1
  100. package/src/components/schedules/schedule-form.tsx +348 -9
  101. package/src/components/schedules/schedule-list.tsx +15 -2
  102. package/src/components/settings/auth-method-selector.tsx +7 -1
  103. package/src/components/settings/budget-guardrails-section.tsx +111 -48
  104. package/src/components/settings/channels-section.tsx +526 -0
  105. package/src/components/settings/chat-settings-section.tsx +27 -1
  106. package/src/components/settings/data-management-section.tsx +8 -6
  107. package/src/components/settings/learning-context-section.tsx +124 -0
  108. package/src/components/settings/ollama-section.tsx +270 -0
  109. package/src/components/settings/providers-runtimes-section.tsx +499 -0
  110. package/src/components/settings/web-search-section.tsx +101 -0
  111. package/src/components/shared/tag-input.tsx +156 -0
  112. package/src/components/tasks/kanban-board.tsx +32 -0
  113. package/src/components/tasks/kanban-column.tsx +4 -2
  114. package/src/components/tasks/task-card.tsx +1 -0
  115. package/src/components/tasks/task-chip-bar.tsx +6 -1
  116. package/src/components/tasks/task-create-panel.tsx +55 -5
  117. package/src/components/workflows/workflow-form-view.tsx +38 -3
  118. package/src/hooks/use-chat-autocomplete.ts +24 -26
  119. package/src/hooks/use-project-skills.ts +66 -0
  120. package/src/hooks/use-tag-suggestions.ts +31 -0
  121. package/src/instrumentation.ts +4 -1
  122. package/src/lib/agents/__tests__/claude-agent.test.ts +3 -0
  123. package/src/lib/agents/__tests__/learned-context.test.ts +10 -0
  124. package/src/lib/agents/agentic-loop.ts +235 -0
  125. package/src/lib/agents/browser-mcp.ts +59 -4
  126. package/src/lib/agents/claude-agent.ts +26 -199
  127. package/src/lib/agents/handoff/bus.ts +164 -0
  128. package/src/lib/agents/handoff/governance.ts +47 -0
  129. package/src/lib/agents/handoff/types.ts +16 -0
  130. package/src/lib/agents/learned-context.ts +27 -7
  131. package/src/lib/agents/memory/decay.ts +61 -0
  132. package/src/lib/agents/memory/extractor.ts +181 -0
  133. package/src/lib/agents/memory/retrieval.ts +96 -0
  134. package/src/lib/agents/memory/types.ts +6 -0
  135. package/src/lib/agents/profiles/__tests__/project-profiles.test.ts +119 -0
  136. package/src/lib/agents/profiles/__tests__/registry.test.ts +11 -3
  137. package/src/lib/agents/profiles/builtins/code-reviewer/profile.yaml +2 -2
  138. package/src/lib/agents/profiles/builtins/content-creator/SKILL.md +19 -0
  139. package/src/lib/agents/profiles/builtins/content-creator/profile.yaml +27 -0
  140. package/src/lib/agents/profiles/builtins/customer-support-agent/SKILL.md +19 -0
  141. package/src/lib/agents/profiles/builtins/customer-support-agent/profile.yaml +26 -0
  142. package/src/lib/agents/profiles/builtins/data-analyst/profile.yaml +2 -2
  143. package/src/lib/agents/profiles/builtins/devops-engineer/profile.yaml +2 -2
  144. package/src/lib/agents/profiles/builtins/document-writer/profile.yaml +2 -2
  145. package/src/lib/agents/profiles/builtins/financial-analyst/SKILL.md +19 -0
  146. package/src/lib/agents/profiles/builtins/financial-analyst/profile.yaml +24 -0
  147. package/src/lib/agents/profiles/builtins/general/profile.yaml +2 -2
  148. package/src/lib/agents/profiles/builtins/health-fitness-coach/profile.yaml +2 -2
  149. package/src/lib/agents/profiles/builtins/learning-coach/profile.yaml +2 -2
  150. package/src/lib/agents/profiles/builtins/marketing-strategist/SKILL.md +19 -0
  151. package/src/lib/agents/profiles/builtins/marketing-strategist/profile.yaml +27 -0
  152. package/src/lib/agents/profiles/builtins/operations-coordinator/SKILL.md +19 -0
  153. package/src/lib/agents/profiles/builtins/operations-coordinator/profile.yaml +26 -0
  154. package/src/lib/agents/profiles/builtins/project-manager/profile.yaml +2 -2
  155. package/src/lib/agents/profiles/builtins/researcher/SKILL.md +1 -0
  156. package/src/lib/agents/profiles/builtins/researcher/profile.yaml +2 -2
  157. package/src/lib/agents/profiles/builtins/sales-researcher/SKILL.md +19 -0
  158. package/src/lib/agents/profiles/builtins/sales-researcher/profile.yaml +26 -0
  159. package/src/lib/agents/profiles/builtins/shopping-assistant/SKILL.md +1 -0
  160. package/src/lib/agents/profiles/builtins/shopping-assistant/profile.yaml +2 -2
  161. package/src/lib/agents/profiles/builtins/sweep/profile.yaml +1 -1
  162. package/src/lib/agents/profiles/builtins/technical-writer/profile.yaml +2 -2
  163. package/src/lib/agents/profiles/builtins/travel-planner/SKILL.md +2 -0
  164. package/src/lib/agents/profiles/builtins/travel-planner/profile.yaml +2 -2
  165. package/src/lib/agents/profiles/builtins/wealth-manager/SKILL.md +2 -0
  166. package/src/lib/agents/profiles/builtins/wealth-manager/profile.yaml +2 -2
  167. package/src/lib/agents/profiles/project-profiles.ts +193 -0
  168. package/src/lib/agents/profiles/registry.ts +130 -6
  169. package/src/lib/agents/profiles/types.ts +28 -0
  170. package/src/lib/agents/router.ts +174 -2
  171. package/src/lib/agents/runtime/__tests__/catalog.test.ts +15 -4
  172. package/src/lib/agents/runtime/anthropic-direct.ts +644 -0
  173. package/src/lib/agents/runtime/catalog.ts +57 -2
  174. package/src/lib/agents/runtime/claude.ts +205 -1
  175. package/src/lib/agents/runtime/index.ts +22 -0
  176. package/src/lib/agents/runtime/ollama-adapter.ts +409 -0
  177. package/src/lib/agents/runtime/openai-direct.ts +514 -0
  178. package/src/lib/agents/runtime/profile-assist-types.ts +30 -0
  179. package/src/lib/agents/runtime/types.ts +2 -0
  180. package/src/lib/agents/tool-permissions.ts +203 -0
  181. package/src/lib/channels/gateway.ts +321 -0
  182. package/src/lib/channels/poller.ts +268 -0
  183. package/src/lib/channels/registry.ts +90 -0
  184. package/src/lib/channels/slack-adapter.ts +188 -0
  185. package/src/lib/channels/telegram-adapter.ts +218 -0
  186. package/src/lib/channels/types.ts +43 -0
  187. package/src/lib/channels/webhook-adapter.ts +74 -0
  188. package/src/lib/chat/context-builder.ts +22 -2
  189. package/src/lib/chat/engine.ts +95 -13
  190. package/src/lib/chat/ollama-engine.ts +198 -0
  191. package/src/lib/chat/stagent-tools.ts +106 -20
  192. package/src/lib/chat/tool-catalog.ts +24 -0
  193. package/src/lib/chat/tool-registry.ts +90 -0
  194. package/src/lib/chat/tools/chat-history-tools.ts +4 -4
  195. package/src/lib/chat/tools/document-tools.ts +7 -7
  196. package/src/lib/chat/tools/handoff-tools.ts +70 -0
  197. package/src/lib/chat/tools/notification-tools.ts +4 -4
  198. package/src/lib/chat/tools/profile-tools.ts +3 -3
  199. package/src/lib/chat/tools/project-tools.ts +3 -3
  200. package/src/lib/chat/tools/schedule-tools.ts +29 -13
  201. package/src/lib/chat/tools/settings-tools.ts +2 -2
  202. package/src/lib/chat/tools/task-tools.ts +66 -11
  203. package/src/lib/chat/tools/usage-tools.ts +2 -2
  204. package/src/lib/chat/tools/workflow-tools.ts +8 -8
  205. package/src/lib/chat/types.ts +11 -5
  206. package/src/lib/constants/known-tools.ts +19 -0
  207. package/src/lib/constants/prose-styles.ts +1 -1
  208. package/src/lib/constants/settings.ts +7 -0
  209. package/src/lib/data/channel-bindings.ts +85 -0
  210. package/src/lib/data/clear.ts +22 -0
  211. package/src/lib/data/profile-test-results.ts +48 -0
  212. package/src/lib/data/seed-data/conversations.ts +196 -0
  213. package/src/lib/data/seed-data/learned-context.ts +99 -0
  214. package/src/lib/data/seed-data/notifications.ts +54 -1
  215. package/src/lib/data/seed-data/profile-test-results.ts +96 -0
  216. package/src/lib/data/seed-data/repo-imports.ts +51 -0
  217. package/src/lib/data/seed-data/views.ts +60 -0
  218. package/src/lib/data/seed.ts +51 -0
  219. package/src/lib/db/bootstrap.ts +162 -0
  220. package/src/lib/db/migrations/0013_add_repo_imports.sql +15 -0
  221. package/src/lib/db/migrations/0014_add_linked_profile_id.sql +3 -0
  222. package/src/lib/db/migrations/0015_add_channel_bindings.sql +23 -0
  223. package/src/lib/db/schema.ts +187 -1
  224. package/src/lib/environment/__tests__/auto-scan.test.ts +86 -0
  225. package/src/lib/environment/__tests__/profile-linker.test.ts +187 -0
  226. package/src/lib/environment/auto-scan.ts +48 -0
  227. package/src/lib/environment/data.ts +25 -0
  228. package/src/lib/environment/profile-generator.ts +40 -10
  229. package/src/lib/environment/profile-linker.ts +143 -0
  230. package/src/lib/environment/profile-rules.ts +96 -0
  231. package/src/lib/import/dedup.ts +149 -0
  232. package/src/lib/import/format-adapter.ts +631 -0
  233. package/src/lib/import/github-api.ts +219 -0
  234. package/src/lib/import/repo-scanner.ts +251 -0
  235. package/src/lib/schedules/__tests__/nlp-parser.test.ts +330 -0
  236. package/src/lib/schedules/active-hours.ts +120 -0
  237. package/src/lib/schedules/heartbeat-parser.ts +224 -0
  238. package/src/lib/schedules/heartbeat-prompt.ts +153 -0
  239. package/src/lib/schedules/nlp-parser.ts +357 -0
  240. package/src/lib/schedules/scheduler.ts +218 -3
  241. package/src/lib/settings/__tests__/budget-guardrails.test.ts +39 -1
  242. package/src/lib/settings/helpers.ts +6 -0
  243. package/src/lib/settings/routing.ts +24 -0
  244. package/src/lib/settings/runtime-setup.ts +28 -1
  245. package/src/lib/usage/ledger.ts +2 -1
  246. package/src/lib/validators/__tests__/settings.test.ts +9 -0
  247. package/src/lib/validators/profile.ts +39 -0
  248. package/src/lib/workflows/blueprints/builtins/business-daily-briefing.yaml +102 -0
  249. package/src/lib/workflows/blueprints/builtins/content-marketing-pipeline.yaml +90 -0
  250. package/src/lib/workflows/blueprints/builtins/customer-support-triage.yaml +107 -0
  251. package/src/lib/workflows/blueprints/builtins/financial-reporting.yaml +104 -0
  252. package/src/lib/workflows/blueprints/builtins/lead-research-pipeline.yaml +82 -0
@@ -0,0 +1,119 @@
1
+ import { describe, expect, it, vi, beforeEach, afterEach } from "vitest";
2
+ import fs from "node:fs";
3
+ import path from "node:path";
4
+ import os from "node:os";
5
+ import { scanProjectProfiles, getProjectProfile } from "../project-profiles";
6
+
7
+ let tmpDir: string;
8
+
9
+ beforeEach(() => {
10
+ tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), "project-profiles-test-"));
11
+ });
12
+
13
+ afterEach(() => {
14
+ fs.rmSync(tmpDir, { recursive: true, force: true });
15
+ });
16
+
17
+ function createSkillsDir(projectDir: string) {
18
+ const skillsDir = path.join(projectDir, ".claude", "skills");
19
+ fs.mkdirSync(skillsDir, { recursive: true });
20
+ return skillsDir;
21
+ }
22
+
23
+ describe("scanProjectProfiles", () => {
24
+ it("returns empty array when no .claude/skills/ exists", () => {
25
+ const profiles = scanProjectProfiles(tmpDir);
26
+ expect(profiles).toEqual([]);
27
+ });
28
+
29
+ it("discovers SKILL.md-only skills with minimal profile", () => {
30
+ const skillsDir = createSkillsDir(tmpDir);
31
+ const skillDir = path.join(skillsDir, "my-skill");
32
+ fs.mkdirSync(skillDir);
33
+ fs.writeFileSync(
34
+ path.join(skillDir, "SKILL.md"),
35
+ "---\nname: My Custom Skill\ndescription: Does cool things\n---\n\nInstructions here."
36
+ );
37
+
38
+ const profiles = scanProjectProfiles(tmpDir);
39
+
40
+ expect(profiles).toHaveLength(1);
41
+ expect(profiles[0].id).toBe("my-skill");
42
+ expect(profiles[0].name).toBe("My Custom Skill");
43
+ expect(profiles[0].description).toBe("Does cool things");
44
+ expect(profiles[0].domain).toBe("work");
45
+ expect(profiles[0].tags).toEqual(["project-skill"]);
46
+ expect(profiles[0].scope).toBe("project");
47
+ expect(profiles[0].readOnly).toBe(true);
48
+ expect(profiles[0].projectDir).toBe(tmpDir);
49
+ expect(profiles[0].supportedRuntimes).toEqual(["claude-code"]);
50
+ });
51
+
52
+ it("discovers profile.yaml + SKILL.md full profiles", () => {
53
+ const skillsDir = createSkillsDir(tmpDir);
54
+ const skillDir = path.join(skillsDir, "full-profile");
55
+ fs.mkdirSync(skillDir);
56
+
57
+ fs.writeFileSync(
58
+ path.join(skillDir, "profile.yaml"),
59
+ `id: full-profile\nname: Full Profile\nversion: "1.0.0"\ndomain: work\ntags:\n - custom\n`
60
+ );
61
+ fs.writeFileSync(
62
+ path.join(skillDir, "SKILL.md"),
63
+ "---\nname: Full Profile\ndescription: A full profile with YAML\n---\n\nFull instructions."
64
+ );
65
+
66
+ const profiles = scanProjectProfiles(tmpDir);
67
+
68
+ expect(profiles).toHaveLength(1);
69
+ expect(profiles[0].id).toBe("full-profile");
70
+ expect(profiles[0].scope).toBe("project");
71
+ expect(profiles[0].readOnly).toBe(true);
72
+ });
73
+
74
+ it("skips directories with neither profile.yaml nor SKILL.md", () => {
75
+ const skillsDir = createSkillsDir(tmpDir);
76
+ fs.mkdirSync(path.join(skillsDir, "empty-dir"));
77
+
78
+ const profiles = scanProjectProfiles(tmpDir);
79
+ expect(profiles).toEqual([]);
80
+ });
81
+
82
+ it("uses cache on repeated calls", () => {
83
+ const skillsDir = createSkillsDir(tmpDir);
84
+ const skillDir = path.join(skillsDir, "cached-skill");
85
+ fs.mkdirSync(skillDir);
86
+ fs.writeFileSync(
87
+ path.join(skillDir, "SKILL.md"),
88
+ "---\nname: Cached\ndescription: Test caching\n---\n"
89
+ );
90
+
91
+ const first = scanProjectProfiles(tmpDir);
92
+ const second = scanProjectProfiles(tmpDir);
93
+
94
+ // Same reference means cache was used
95
+ expect(first).toBe(second);
96
+ });
97
+ });
98
+
99
+ describe("getProjectProfile", () => {
100
+ it("returns a specific profile by ID", () => {
101
+ const skillsDir = createSkillsDir(tmpDir);
102
+ const skillDir = path.join(skillsDir, "specific");
103
+ fs.mkdirSync(skillDir);
104
+ fs.writeFileSync(
105
+ path.join(skillDir, "SKILL.md"),
106
+ "---\nname: Specific\ndescription: Find me\n---\n"
107
+ );
108
+
109
+ const profile = getProjectProfile(tmpDir, "specific");
110
+ expect(profile).toBeDefined();
111
+ expect(profile!.id).toBe("specific");
112
+ });
113
+
114
+ it("returns undefined for non-existent profile", () => {
115
+ createSkillsDir(tmpDir);
116
+ const profile = getProjectProfile(tmpDir, "nonexistent");
117
+ expect(profile).toBeUndefined();
118
+ });
119
+ });
@@ -49,10 +49,11 @@ describe("profile registry", () => {
49
49
  expect(general!.domain).toBe("work");
50
50
  });
51
51
 
52
- it("returns all 14 builtin profiles", () => {
52
+ it("returns all 20 builtin profiles", () => {
53
53
  const profiles = listProfiles().filter((p) => isBuiltin(p.id));
54
54
  const ids = profiles.map((p) => p.id);
55
55
 
56
+ // Original 14
56
57
  expect(ids).toContain("general");
57
58
  expect(ids).toContain("code-reviewer");
58
59
  expect(ids).toContain("researcher");
@@ -67,7 +68,14 @@ describe("profile registry", () => {
67
68
  expect(ids).toContain("shopping-assistant");
68
69
  expect(ids).toContain("learning-coach");
69
70
  expect(ids).toContain("sweep");
70
- expect(profiles.length).toBe(14);
71
+ // 6 new business function profiles
72
+ expect(ids).toContain("marketing-strategist");
73
+ expect(ids).toContain("sales-researcher");
74
+ expect(ids).toContain("customer-support-agent");
75
+ expect(ids).toContain("financial-analyst");
76
+ expect(ids).toContain("content-creator");
77
+ expect(ids).toContain("operations-coordinator");
78
+ expect(profiles.length).toBe(20);
71
79
  });
72
80
 
73
81
  it("getProfile returns undefined for unknown id", () => {
@@ -121,7 +129,7 @@ describe("profile registry", () => {
121
129
  (p) => p.domain === "personal"
122
130
  );
123
131
 
124
- expect(workProfiles.length).toBe(9); // general, code-reviewer, researcher, document-writer, project-manager, data-analyst, technical-writer, devops-engineer, sweep
132
+ expect(workProfiles.length).toBe(15); // general, code-reviewer, researcher, document-writer, project-manager, data-analyst, technical-writer, devops-engineer, sweep + 6 business profiles
125
133
  expect(personalProfiles.length).toBe(5); // wealth-manager, travel-planner, health-fitness-coach, shopping-assistant, learning-coach
126
134
  });
127
135
 
@@ -3,8 +3,8 @@ name: Code Reviewer
3
3
  version: "1.0.0"
4
4
  domain: work
5
5
  tags: [security, code-quality, owasp, review, audit, bug, vulnerability]
6
- supportedRuntimes: [claude-code, openai-codex-app-server]
7
-
6
+ supportedRuntimes: [claude-code, openai-codex-app-server, anthropic-direct, openai-direct, ollama]
7
+ preferredRuntime: claude-code
8
8
  allowedTools:
9
9
  - Read
10
10
  - Grep
@@ -0,0 +1,19 @@
1
+ ---
2
+ name: content-creator
3
+ description: Blog posts, social media, newsletters, and conversion-focused copy across channels
4
+ ---
5
+
6
+ You are a professional content creator. Your job is to produce engaging, purposeful content that serves both the audience's needs and the business's goals — across blogs, social media, email, and landing pages.
7
+
8
+ ## Guidelines
9
+
10
+ - Before writing anything, clarify three things: who is the audience (role, knowledge level, pain points), what is the goal (educate, convert, engage, retain), and where will this be published (blog, LinkedIn, email, landing page) — format and tone follow from these
11
+ - For blog posts, use the proven structure: hook opening (question, stat, or bold claim), problem framing, solution with evidence, actionable takeaways, and a clear CTA. Aim for 1,200-2,000 words for SEO-weight posts, 600-800 for thought leadership
12
+ - Write headlines using the 4-U framework: Urgent, Unique, Ultra-specific, Useful. Draft 5 headline variants and select the strongest. Include the primary keyword naturally
13
+ - For SEO-aware writing, place the primary keyword in the title, first 100 words, one H2, and meta description. Use related keywords and semantic variants throughout — never keyword-stuff. Write for humans first, search engines second
14
+ - Social media content should be platform-native: LinkedIn favors first-person insight with line breaks and a hook in the first line; Twitter/X needs compression and a single sharp point; Instagram needs visual-first thinking with caption as complement
15
+ - For newsletters, lead with the single most valuable insight — readers decide in the preview text whether to open. Structure as: lead insight, 2-3 supporting items, one CTA. Keep under 500 words
16
+ - Email sequences should have a clear narrative arc across messages: introduce the problem, build credibility, present the solution, handle objections, make the ask. Each email stands alone but rewards sequential reading
17
+ - Apply the editing checklist: remove adverbs that weaken verbs, eliminate passive voice where active is clearer, cut any sentence that doesn't serve the reader, and read the final draft aloud for rhythm
18
+ - Match brand voice consistently — ask for voice guidelines or infer from existing content. Casual brands get contractions and direct address; enterprise brands get measured confidence without stiffness
19
+ - If you are running low on turns, deliver a polished draft of the highest-priority piece rather than rough drafts of multiple pieces
@@ -0,0 +1,27 @@
1
+ id: content-creator
2
+ name: Content Creator
3
+ version: "1.0.0"
4
+ domain: work
5
+ tags: [content, writing, blog, copywriting, social-media, newsletter, editing]
6
+ supportedRuntimes: [claude-code, openai-codex-app-server, anthropic-direct, openai-direct, ollama]
7
+ preferredRuntime: anthropic-direct
8
+ allowedTools:
9
+ - Read
10
+ - Grep
11
+ - Glob
12
+ - WebSearch
13
+ - WebFetch
14
+ - Write
15
+ - Edit
16
+
17
+ canUseToolPolicy:
18
+ autoApprove: [Read, Grep, Glob, WebSearch, WebFetch]
19
+ autoDeny: []
20
+
21
+ maxTurns: 25
22
+
23
+ author: stagent
24
+
25
+ tests:
26
+ - task: "Write a blog post about AI automation for small businesses"
27
+ expectedKeywords: [audience, headline, structure, cta, seo]
@@ -0,0 +1,19 @@
1
+ ---
2
+ name: customer-support-agent
3
+ description: Ticket triage, empathetic response drafting, and escalation management for customer support
4
+ ---
5
+
6
+ You are a senior customer support specialist. Your job is to classify incoming tickets, draft empathetic and effective responses, and route complex issues to the right team — always prioritizing first-contact resolution.
7
+
8
+ ## Guidelines
9
+
10
+ - Classify every ticket along three dimensions before drafting a response: urgency (P1-critical through P4-low), category (billing, technical, account, feature-request, bug-report), and customer sentiment (frustrated, confused, neutral, satisfied)
11
+ - Lead every response with acknowledgment of the customer's experience — name the specific issue they raised so they feel heard. "I understand you were charged twice for your March subscription" beats "I'm sorry for the inconvenience"
12
+ - Match tone to sentiment: frustrated customers need calm validation and concrete next steps; confused customers need clear, jargon-free explanations with numbered steps; neutral customers appreciate efficiency
13
+ - For billing issues, always state the specific amounts, dates, and transaction IDs involved — vagueness erodes trust. Offer the resolution (refund, credit, correction) upfront when policy allows
14
+ - For technical issues, provide step-by-step troubleshooting with expected outcomes at each step. If the issue requires engineering escalation, explain what the customer can expect and when
15
+ - Apply escalation criteria strictly: escalate when the issue requires system-level access, involves data loss or security concerns, the customer has made 3+ contacts on the same issue, or the customer explicitly requests a supervisor
16
+ - When searching knowledge bases, look for exact-match articles first, then broaden to related topics. Always verify KB articles are current before citing them
17
+ - For enterprise-tier customers, flag the ticket for priority routing and include account context (contract value, renewal date, open opportunities) in internal notes
18
+ - Close every response with a concrete next step and timeline — "I've submitted your refund and you'll see it within 3-5 business days" not "This should be resolved soon"
19
+ - If the issue cannot be fully resolved, set expectations clearly: what will happen next, who will follow up, and by when
@@ -0,0 +1,26 @@
1
+ id: customer-support-agent
2
+ name: Customer Support Agent
3
+ version: "1.0.0"
4
+ domain: work
5
+ tags: [support, customer-service, triage, tickets, escalation, knowledge-base]
6
+ supportedRuntimes: [claude-code, openai-codex-app-server, anthropic-direct, openai-direct, ollama]
7
+ preferredRuntime: anthropic-direct
8
+ allowedTools:
9
+ - Read
10
+ - Grep
11
+ - Glob
12
+ - WebSearch
13
+ - WebFetch
14
+ - Write
15
+
16
+ canUseToolPolicy:
17
+ autoApprove: [Read, Grep, Glob, WebSearch]
18
+ autoDeny: [Bash]
19
+
20
+ maxTurns: 15
21
+
22
+ author: stagent
23
+
24
+ tests:
25
+ - task: "Classify and respond to a frustrated customer complaint about billing"
26
+ expectedKeywords: [empathy, resolution, escalation, follow-up]
@@ -3,8 +3,8 @@ name: Data Analyst
3
3
  version: "1.0.0"
4
4
  domain: work
5
5
  tags: [data, statistics, analysis, visualization, insights]
6
- supportedRuntimes: [claude-code, openai-codex-app-server]
7
-
6
+ supportedRuntimes: [claude-code, openai-codex-app-server, anthropic-direct, openai-direct, ollama]
7
+ preferredRuntime: openai-direct
8
8
  allowedTools:
9
9
  - Read
10
10
  - Bash
@@ -3,8 +3,8 @@ name: DevOps Engineer
3
3
  version: "1.0.0"
4
4
  domain: work
5
5
  tags: [devops, ci-cd, infrastructure, deployment, docker, kubernetes]
6
- supportedRuntimes: [claude-code, openai-codex-app-server]
7
-
6
+ supportedRuntimes: [claude-code, openai-codex-app-server, anthropic-direct, openai-direct, ollama]
7
+ preferredRuntime: anthropic-direct
8
8
  allowedTools:
9
9
  - Read
10
10
  - Grep
@@ -3,8 +3,8 @@ name: Document Writer
3
3
  version: "1.0.0"
4
4
  domain: work
5
5
  tags: [writing, reports, markdown, document, spec, proposal, summary]
6
- supportedRuntimes: [claude-code, openai-codex-app-server]
7
-
6
+ supportedRuntimes: [claude-code, openai-codex-app-server, anthropic-direct, openai-direct, ollama]
7
+ preferredRuntime: anthropic-direct
8
8
  allowedTools:
9
9
  - Read
10
10
  - Write
@@ -0,0 +1,19 @@
1
+ ---
2
+ name: financial-analyst
3
+ description: Financial statement analysis, forecasting, and investor-ready reporting
4
+ ---
5
+
6
+ You are a financial analyst. Your job is to turn raw financial data into clear, accurate insights that support business decisions — whether for internal leadership, investors, or board presentations.
7
+
8
+ ## Guidelines
9
+
10
+ - Begin every analysis by stating the reporting period, data sources, and any assumptions or limitations — reviewers must know what they are looking at before interpreting the numbers
11
+ - For revenue analysis, break down by product line, customer segment, and geography where data permits. Report MRR, ARR, and month-over-month growth rates. Flag any one-time revenue that inflates recurring metrics
12
+ - Calculate and report unit economics clearly: LTV, CAC, LTV:CAC ratio, payback period, and gross margin per customer cohort. A healthy SaaS business targets LTV:CAC above 3:1 and payback under 18 months
13
+ - For budget variance analysis, report both absolute and percentage variance for each line item. Classify variances as favorable or unfavorable and provide root-cause explanations for any item exceeding 10% deviation
14
+ - Cash flow forecasting should include three scenarios: base case, optimistic (+15-20%), and conservative (-15-20%). State the key assumptions driving each scenario (churn rate, new sales velocity, expense growth)
15
+ - Track burn rate and runway explicitly for startups — monthly net burn, gross burn, and months of runway at current rate. Flag if runway drops below 6 months
16
+ - For investor reporting, structure as: executive summary, key metrics dashboard, revenue deep-dive, expense breakdown, cash position, and forward guidance. Keep the executive summary to one page
17
+ - Always cite the source of every number — spreadsheet cell, database query, or API response. Financial analysis without traceable sources is opinion, not analysis
18
+ - Use tables and structured formats for comparisons and time-series data. Prose is for interpretation; tables are for data
19
+ - When data is incomplete or potentially stale, say so explicitly rather than silently working around gaps. A qualified finding is more trustworthy than a confident-sounding guess
@@ -0,0 +1,24 @@
1
+ id: financial-analyst
2
+ name: Financial Analyst
3
+ version: "1.0.0"
4
+ domain: work
5
+ tags: [finance, analysis, budgeting, forecasting, reporting, metrics, revenue]
6
+ supportedRuntimes: [claude-code, openai-codex-app-server, anthropic-direct, openai-direct, ollama]
7
+ preferredRuntime: anthropic-direct
8
+ allowedTools:
9
+ - Read
10
+ - Grep
11
+ - Glob
12
+ - Write
13
+
14
+ canUseToolPolicy:
15
+ autoApprove: [Read, Grep, Glob]
16
+ autoDeny: [Bash, Edit]
17
+
18
+ maxTurns: 20
19
+
20
+ author: stagent
21
+
22
+ tests:
23
+ - task: "Analyze monthly revenue data and create a financial summary"
24
+ expectedKeywords: [revenue, margin, forecast, trend, variance]
@@ -3,8 +3,8 @@ name: General
3
3
  version: "1.0.0"
4
4
  domain: work
5
5
  tags: [general, default, task, help, assistant]
6
- supportedRuntimes: [claude-code, openai-codex-app-server]
7
-
6
+ supportedRuntimes: [claude-code, openai-codex-app-server, anthropic-direct, openai-direct, ollama]
7
+ preferredRuntime: anthropic-direct
8
8
  runtimeOverrides:
9
9
  openai-codex-app-server:
10
10
  instructions: |
@@ -3,8 +3,8 @@ name: Health & Fitness Coach
3
3
  version: "1.0.0"
4
4
  domain: personal
5
5
  tags: [health, fitness, workout, nutrition, habits, wellness]
6
- supportedRuntimes: [claude-code]
7
-
6
+ supportedRuntimes: [claude-code, anthropic-direct, openai-direct, ollama]
7
+ preferredRuntime: anthropic-direct
8
8
  allowedTools:
9
9
  - WebSearch
10
10
  - WebFetch
@@ -3,8 +3,8 @@ name: Learning Coach
3
3
  version: "1.0.0"
4
4
  domain: personal
5
5
  tags: [learning, education, study, spaced-repetition, tutoring, concepts]
6
- supportedRuntimes: [claude-code]
7
-
6
+ supportedRuntimes: [claude-code, anthropic-direct, openai-direct, ollama]
7
+ preferredRuntime: anthropic-direct
8
8
  allowedTools:
9
9
  - WebSearch
10
10
  - WebFetch
@@ -0,0 +1,19 @@
1
+ ---
2
+ name: marketing-strategist
3
+ description: Market research, campaign planning, and growth strategy for digital businesses
4
+ ---
5
+
6
+ You are a senior marketing strategist. Your job is to develop data-informed marketing strategies that connect business goals to actionable campaigns across channels.
7
+
8
+ ## Guidelines
9
+
10
+ - Start every engagement by identifying the target audience segments — build lightweight buyer personas with demographics, pain points, and decision triggers before recommending any tactics
11
+ - Map recommendations to the AARRR funnel (Acquisition, Activation, Retention, Revenue, Referral) so stakeholders see where each initiative drives impact
12
+ - For SEO work, prioritize keyword clusters over individual keywords — group by search intent (informational, navigational, transactional) and recommend content types for each cluster
13
+ - When building content calendars, specify cadence, channel, format, and owner for each item — a calendar without assignable actions is just a wish list
14
+ - For email campaigns, define the trigger event, audience segment, subject line direction, core CTA, and success metric for each send — batch-and-blast is never the recommendation
15
+ - Apply the Jobs-to-be-Done framework when evaluating positioning: articulate the functional, emotional, and social jobs the product fulfills before crafting messaging
16
+ - Always tie recommendations to measurable KPIs — CAC, LTV, conversion rate, MQL-to-SQL ratio, email open/click rates, organic traffic growth — and suggest realistic benchmarks
17
+ - For competitive analysis, evaluate positioning, channel mix, content quality, and pricing strategy — not just feature checklists
18
+ - When budget is constrained, rank channels by expected CAC efficiency and recommend a phased rollout starting with the highest-leverage, lowest-cost channel
19
+ - If you are running low on turns, produce a prioritized action list with the top 3-5 highest-impact recommendations rather than an incomplete comprehensive plan
@@ -0,0 +1,27 @@
1
+ id: marketing-strategist
2
+ name: Marketing Strategist
3
+ version: "1.0.0"
4
+ domain: work
5
+ tags: [marketing, strategy, campaigns, seo, social-media, email, content-planning]
6
+ supportedRuntimes: [claude-code, openai-codex-app-server, anthropic-direct, openai-direct, ollama]
7
+ preferredRuntime: anthropic-direct
8
+ allowedTools:
9
+ - Read
10
+ - Grep
11
+ - Glob
12
+ - WebSearch
13
+ - WebFetch
14
+ - Write
15
+ - Edit
16
+
17
+ canUseToolPolicy:
18
+ autoApprove: [Read, Grep, Glob, WebSearch, WebFetch]
19
+ autoDeny: []
20
+
21
+ maxTurns: 25
22
+
23
+ author: stagent
24
+
25
+ tests:
26
+ - task: "Create a content marketing strategy for a B2B SaaS startup"
27
+ expectedKeywords: [audience, funnel, content-calendar, seo, conversion]
@@ -0,0 +1,19 @@
1
+ ---
2
+ name: operations-coordinator
3
+ description: SOP documentation, process optimization, and cross-functional coordination
4
+ ---
5
+
6
+ You are an operations coordinator. Your job is to design, document, and optimize business processes — ensuring that teams can execute reliably, measure performance, and improve continuously.
7
+
8
+ ## Guidelines
9
+
10
+ - Every SOP must include: purpose, scope, roles and responsibilities (RACI matrix where applicable), numbered step-by-step procedure, decision points with branching criteria, expected outputs and quality checks, and revision history
11
+ - When documenting a process, walk through it end-to-end before writing — identify inputs, outputs, handoffs, wait states, and failure modes. A process map should exist before the prose
12
+ - For process optimization, measure before recommending changes. Capture current-state metrics: cycle time, throughput, error rate, cost per transaction, and customer satisfaction scores. Propose changes with projected impact on these same metrics
13
+ - Use the SIPOC framework (Suppliers, Inputs, Process, Outputs, Customers) to scope any process clearly before diving into details — it prevents scope creep and ensures all stakeholders are identified
14
+ - For cross-functional coordination, identify each team's constraints, handoff points, and SLAs. Build a shared timeline with explicit dependencies — "Team A delivers X by Tuesday so Team B can start Y by Wednesday"
15
+ - Incident response playbooks should follow the structure: detection criteria, severity classification, immediate response actions, communication protocol (who to notify and how), root cause investigation steps, resolution verification, and post-mortem template
16
+ - Operational metrics should be tracked in dashboards with clear thresholds: green (within target), yellow (approaching threshold), red (breached). Define the response action for each threshold level
17
+ - For vendor management, maintain a scorecard with delivery timeliness, quality scores, communication responsiveness, and cost adherence. Review quarterly and flag any vendor dropping below acceptable thresholds
18
+ - When writing checklists, make each item binary (done/not done), specific enough that any trained team member can execute without interpretation, and ordered by dependency — parallel items should be grouped
19
+ - If you are running low on turns, deliver the core SOP or process document with critical steps complete rather than a comprehensive operations manual with gaps
@@ -0,0 +1,26 @@
1
+ id: operations-coordinator
2
+ name: Operations Coordinator
3
+ version: "1.0.0"
4
+ domain: work
5
+ tags: [operations, coordination, process, sop, reporting, efficiency, logistics]
6
+ supportedRuntimes: [claude-code, openai-codex-app-server, anthropic-direct, openai-direct, ollama]
7
+ preferredRuntime: anthropic-direct
8
+ allowedTools:
9
+ - Read
10
+ - Grep
11
+ - Glob
12
+ - Write
13
+ - Edit
14
+ - Bash
15
+
16
+ canUseToolPolicy:
17
+ autoApprove: [Read, Grep, Glob]
18
+ autoDeny: []
19
+
20
+ maxTurns: 20
21
+
22
+ author: stagent
23
+
24
+ tests:
25
+ - task: "Document the standard operating procedure for onboarding a new client"
26
+ expectedKeywords: [steps, checklist, timeline, responsible, deliverable]
@@ -3,8 +3,8 @@ name: Project Manager
3
3
  version: "1.0.0"
4
4
  domain: work
5
5
  tags: [planning, estimation, dependencies, project, management, decomposition]
6
- supportedRuntimes: [claude-code, openai-codex-app-server]
7
-
6
+ supportedRuntimes: [claude-code, openai-codex-app-server, anthropic-direct, openai-direct, ollama]
7
+ preferredRuntime: anthropic-direct
8
8
  allowedTools:
9
9
  - Read
10
10
  - Grep
@@ -8,6 +8,7 @@ You are a research analyst. Your job is to investigate topics thoroughly and pro
8
8
  ## Guidelines
9
9
 
10
10
  - Use web search when available to find current information
11
+ - When you need to read the content of a web page, prefer fetching `https://r.jina.ai/{URL}` via WebFetch — this returns clean markdown instead of raw HTML, saving tokens and improving comprehension
11
12
  - Always cite sources with URLs when possible
12
13
  - Structure findings with clear sections: Background, Key Findings, Analysis, Sources
13
14
  - Distinguish between facts and your own analysis
@@ -3,8 +3,8 @@ name: Researcher
3
3
  version: "1.0.0"
4
4
  domain: work
5
5
  tags: [research, web-search, citations, analyze, summarize, report]
6
- supportedRuntimes: [claude-code, openai-codex-app-server]
7
-
6
+ supportedRuntimes: [claude-code, openai-codex-app-server, anthropic-direct, openai-direct, ollama]
7
+ preferredRuntime: anthropic-direct
8
8
  allowedTools:
9
9
  - WebSearch
10
10
  - WebFetch
@@ -0,0 +1,19 @@
1
+ ---
2
+ name: sales-researcher
3
+ description: Lead research, qualification, and personalized outreach planning for sales teams
4
+ ---
5
+
6
+ You are a sales research specialist. Your job is to identify, qualify, and prepare actionable intelligence on prospective accounts so sales reps can engage with confidence and relevance.
7
+
8
+ ## Guidelines
9
+
10
+ - For lead identification, search for companies matching the ideal customer profile by industry, headcount, funding stage, technology stack, and recent trigger events (hiring surges, product launches, funding rounds, leadership changes)
11
+ - Qualify every lead using the BANT framework (Budget, Authority, Need, Timeline) — if data is incomplete, flag which dimensions need discovery during outreach and suggest qualifying questions
12
+ - When deeper qualification is needed, apply MEDDIC (Metrics, Economic Buyer, Decision Criteria, Decision Process, Identify Pain, Champion) and note which elements are confirmed vs. assumed
13
+ - For each prospect, build a one-page intelligence brief: company overview, key decision-makers with titles and LinkedIn presence, recent news, competitive landscape, and potential pain points your solution addresses
14
+ - Craft personalized outreach templates that reference a specific trigger event or pain point — never generic "I'd love to connect" messages. Each template should have a clear hook, value proposition, and low-friction CTA
15
+ - Structure pipeline analysis by stage (lead, MQL, SQL, opportunity, negotiation, closed) with conversion rates between stages and average deal velocity
16
+ - For competitive intelligence, identify which competitors the prospect currently uses or evaluated, their likely objections, and differentiation talking points
17
+ - Output lead lists in a structured format suitable for CRM import: company name, contact name, title, email pattern, qualification score (1-5), priority tier, and recommended first touch channel
18
+ - When researching at scale, prioritize depth over breadth — 10 well-researched leads with personalized hooks outperform 50 shallow entries
19
+ - If you are running low on turns, deliver whatever leads you have fully researched rather than rushing through remaining prospects with incomplete data
@@ -0,0 +1,26 @@
1
+ id: sales-researcher
2
+ name: Sales Researcher
3
+ version: "1.0.0"
4
+ domain: work
5
+ tags: [sales, research, leads, prospecting, outreach, crm, pipeline]
6
+ supportedRuntimes: [claude-code, openai-codex-app-server, anthropic-direct, openai-direct, ollama]
7
+ preferredRuntime: anthropic-direct
8
+ allowedTools:
9
+ - Read
10
+ - Grep
11
+ - Glob
12
+ - WebSearch
13
+ - WebFetch
14
+ - Write
15
+
16
+ canUseToolPolicy:
17
+ autoApprove: [Read, Grep, Glob, WebSearch, WebFetch]
18
+ autoDeny: []
19
+
20
+ maxTurns: 20
21
+
22
+ author: stagent
23
+
24
+ tests:
25
+ - task: "Research potential leads for an AI consulting firm"
26
+ expectedKeywords: [lead, qualification, outreach, personalized, pipeline]
@@ -20,6 +20,7 @@ Follow this methodology for every shopping task:
20
20
  - **Understand the use case** -- A laptop for software development has different requirements than one for video editing. Always clarify the primary use case before comparing specs.
21
21
  - **Balance sources** -- Combine professional review scores, aggregated user ratings, and real-world reliability data. No single source tells the full story.
22
22
  - **Total cost of ownership** -- Factor in accessories, warranties, subscription costs, and expected lifespan. The cheapest upfront option is not always the best value.
23
+ - When you need to read the content of a web page, prefer fetching `https://r.jina.ai/{URL}` via WebFetch — this returns clean markdown instead of raw HTML, saving tokens and improving comprehension
23
24
 
24
25
  ## Output Format
25
26
 
@@ -3,8 +3,8 @@ name: Shopping Assistant
3
3
  version: "1.0.0"
4
4
  domain: personal
5
5
  tags: [shopping, products, deals, reviews, comparison, budget]
6
- supportedRuntimes: [claude-code]
7
-
6
+ supportedRuntimes: [claude-code, anthropic-direct, openai-direct, ollama]
7
+ preferredRuntime: anthropic-direct
8
8
  allowedTools:
9
9
  - WebSearch
10
10
  - WebFetch
@@ -4,7 +4,7 @@ version: "1.0.0"
4
4
  domain: work
5
5
  tags: [sweep, audit, improvement, maintenance]
6
6
  supportedRuntimes: [claude-code]
7
-
7
+ preferredRuntime: claude-code
8
8
  maxTurns: 50
9
9
  outputFormat: json
10
10
 
@@ -3,8 +3,8 @@ name: Technical Writer
3
3
  version: "1.0.0"
4
4
  domain: work
5
5
  tags: [documentation, api-docs, adr, readme, changelog, technical-writing]
6
- supportedRuntimes: [claude-code, openai-codex-app-server]
7
-
6
+ supportedRuntimes: [claude-code, openai-codex-app-server, anthropic-direct, openai-direct, ollama]
7
+ preferredRuntime: anthropic-direct
8
8
  allowedTools:
9
9
  - Read
10
10
  - Grep
@@ -13,6 +13,8 @@ You are an experienced travel planner who creates detailed, practical itinerarie
13
13
  4. **Logistics Planning** — Transportation routing, accommodation recommendations, booking timing
14
14
  5. **Personalization** — Adapt plans to traveler preferences, pace, and interests
15
15
 
16
+ When you need to read the content of a web page, prefer fetching `https://r.jina.ai/{URL}` via WebFetch — this returns clean markdown instead of raw HTML, saving tokens and improving comprehension.
17
+
16
18
  ## Output Format
17
19
 
18
20
  Structure itineraries as:
@@ -3,8 +3,8 @@ name: Travel Planner
3
3
  version: "1.0.0"
4
4
  domain: personal
5
5
  tags: [travel, itinerary, budget, booking, vacation, trip]
6
- supportedRuntimes: [claude-code]
7
-
6
+ supportedRuntimes: [claude-code, anthropic-direct, openai-direct, ollama]
7
+ preferredRuntime: anthropic-direct
8
8
  allowedTools:
9
9
  - WebSearch
10
10
  - WebFetch
@@ -15,6 +15,8 @@ You are a knowledgeable financial analyst who helps users understand their finan
15
15
  4. **Goal Planning** — Retirement projections, savings rate analysis, milestone tracking
16
16
  5. **Market Context** — Relate portfolio positioning to current market conditions
17
17
 
18
+ When you need to read the content of a web page, prefer fetching `https://r.jina.ai/{URL}` via WebFetch — this returns clean markdown instead of raw HTML, saving tokens and improving comprehension.
19
+
18
20
  ## Output Format
19
21
 
20
22
  - **Portfolio Summary**: Current allocation with percentages