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.
- package/README.md +8 -8
- package/dist/cli.js +146 -2
- package/docs/.coverage-gaps.json +21 -0
- package/docs/.last-generated +1 -1
- package/docs/features/agent-intelligence.md +36 -14
- package/docs/features/chat.md +33 -56
- package/docs/features/cost-usage.md +14 -10
- package/docs/features/dashboard-kanban.md +30 -13
- package/docs/features/delivery-channels.md +198 -0
- package/docs/features/design-system.md +10 -10
- package/docs/features/documents.md +8 -8
- package/docs/features/home-workspace.md +20 -15
- package/docs/features/inbox-notifications.md +22 -10
- package/docs/features/keyboard-navigation.md +11 -11
- package/docs/features/monitoring.md +1 -1
- package/docs/features/playbook.md +30 -32
- package/docs/features/profiles.md +33 -11
- package/docs/features/projects.md +2 -2
- package/docs/features/provider-runtimes.md +58 -14
- package/docs/features/schedules.md +70 -40
- package/docs/features/settings.md +74 -46
- package/docs/features/shared-components.md +7 -15
- package/docs/features/tool-permissions.md +9 -9
- package/docs/features/workflows.md +32 -21
- package/docs/getting-started.md +33 -9
- package/docs/index.md +25 -16
- package/docs/journeys/developer.md +124 -207
- package/docs/journeys/personal-use.md +70 -79
- package/docs/journeys/power-user.md +107 -151
- package/docs/journeys/work-use.md +81 -113
- package/docs/manifest.json +77 -45
- package/docs/superpowers/plans/2026-03-30-finish-in-progress-features.md +547 -0
- package/docs/use-cases/agency-operator.md +84 -0
- package/docs/use-cases/solo-founder.md +75 -0
- package/docs/why-stagent.md +59 -0
- package/package.json +10 -3
- package/src/app/api/channels/[id]/route.ts +103 -0
- package/src/app/api/channels/[id]/test/route.ts +52 -0
- package/src/app/api/channels/inbound/slack/route.ts +109 -0
- package/src/app/api/channels/inbound/telegram/poll/route.ts +128 -0
- package/src/app/api/channels/inbound/telegram/route.ts +76 -0
- package/src/app/api/channels/route.ts +71 -0
- package/src/app/api/chat/conversations/route.ts +15 -0
- package/src/app/api/chat/entities/search/route.ts +46 -31
- package/src/app/api/environment/profiles/suggest/route.ts +19 -3
- package/src/app/api/environment/scan/route.ts +8 -1
- package/src/app/api/handoffs/[id]/route.ts +76 -0
- package/src/app/api/handoffs/route.ts +89 -0
- package/src/app/api/memory/route.ts +181 -0
- package/src/app/api/profiles/[id]/route.ts +16 -1
- package/src/app/api/profiles/[id]/test/route.ts +4 -0
- package/src/app/api/profiles/[id]/test-results/route.ts +22 -0
- package/src/app/api/profiles/[id]/test-single/route.ts +64 -0
- package/src/app/api/profiles/assist/route.ts +35 -0
- package/src/app/api/profiles/import-repo/apply-updates/route.ts +123 -0
- package/src/app/api/profiles/import-repo/check-updates/route.ts +163 -0
- package/src/app/api/profiles/import-repo/confirm/route.ts +118 -0
- package/src/app/api/profiles/import-repo/preview/route.ts +107 -0
- package/src/app/api/profiles/import-repo/route.ts +29 -0
- package/src/app/api/profiles/import-repo/scan/route.ts +25 -0
- package/src/app/api/profiles/route.ts +73 -22
- package/src/app/api/runtimes/ollama/route.ts +86 -0
- package/src/app/api/runtimes/suggest/route.ts +29 -0
- package/src/app/api/schedules/[id]/heartbeat-history/route.ts +77 -0
- package/src/app/api/schedules/[id]/route.ts +41 -3
- package/src/app/api/schedules/parse/route.ts +66 -0
- package/src/app/api/schedules/route.ts +71 -12
- package/src/app/api/settings/author-default/route.ts +7 -0
- package/src/app/api/settings/learning/route.ts +41 -0
- package/src/app/api/settings/ollama/route.ts +34 -0
- package/src/app/api/settings/providers/route.ts +57 -0
- package/src/app/api/settings/routing/route.ts +24 -0
- package/src/app/api/settings/web-search/route.ts +28 -0
- package/src/app/api/tasks/[id]/execute/route.ts +13 -1
- package/src/app/documents/page.tsx +3 -0
- package/src/app/environment/page.tsx +8 -1
- package/src/app/settings/page.tsx +10 -4
- package/src/app/workflows/[id]/edit/page.tsx +2 -0
- package/src/app/workflows/new/page.tsx +2 -0
- package/src/components/chat/chat-command-popover.tsx +22 -19
- package/src/components/chat/chat-input.tsx +5 -0
- package/src/components/chat/chat-model-selector.tsx +42 -1
- package/src/components/chat/chat-shell.tsx +2 -0
- package/src/components/dashboard/welcome-landing.tsx +9 -9
- package/src/components/environment/artifact-card.tsx +27 -1
- package/src/components/environment/environment-dashboard.tsx +50 -2
- package/src/components/environment/environment-summary-card.tsx +5 -2
- package/src/components/environment/suggested-profiles.tsx +117 -52
- package/src/components/handoffs/handoff-approval-card.tsx +159 -0
- package/src/components/memory/memory-browser.tsx +315 -0
- package/src/components/profiles/learned-context-panel.tsx +4 -4
- package/src/components/profiles/profile-assist-panel.tsx +512 -0
- package/src/components/profiles/profile-browser.tsx +109 -8
- package/src/components/profiles/profile-card.tsx +29 -1
- package/src/components/profiles/profile-detail-view.tsx +200 -28
- package/src/components/profiles/profile-form-view.tsx +220 -82
- package/src/components/profiles/repo-import-wizard.tsx +648 -0
- package/src/components/profiles/smoke-test-editor.tsx +106 -0
- package/src/components/schedules/schedule-create-sheet.tsx +9 -1
- package/src/components/schedules/schedule-form.tsx +348 -9
- package/src/components/schedules/schedule-list.tsx +15 -2
- package/src/components/settings/auth-method-selector.tsx +7 -1
- package/src/components/settings/budget-guardrails-section.tsx +111 -48
- package/src/components/settings/channels-section.tsx +526 -0
- package/src/components/settings/chat-settings-section.tsx +27 -1
- package/src/components/settings/data-management-section.tsx +8 -6
- package/src/components/settings/learning-context-section.tsx +124 -0
- package/src/components/settings/ollama-section.tsx +270 -0
- package/src/components/settings/providers-runtimes-section.tsx +499 -0
- package/src/components/settings/web-search-section.tsx +101 -0
- package/src/components/shared/tag-input.tsx +156 -0
- package/src/components/tasks/kanban-board.tsx +32 -0
- package/src/components/tasks/kanban-column.tsx +4 -2
- package/src/components/tasks/task-card.tsx +1 -0
- package/src/components/tasks/task-chip-bar.tsx +6 -1
- package/src/components/tasks/task-create-panel.tsx +55 -5
- package/src/components/workflows/workflow-form-view.tsx +38 -3
- package/src/hooks/use-chat-autocomplete.ts +24 -26
- package/src/hooks/use-project-skills.ts +66 -0
- package/src/hooks/use-tag-suggestions.ts +31 -0
- package/src/instrumentation.ts +4 -1
- package/src/lib/agents/__tests__/claude-agent.test.ts +3 -0
- package/src/lib/agents/__tests__/learned-context.test.ts +10 -0
- package/src/lib/agents/agentic-loop.ts +235 -0
- package/src/lib/agents/browser-mcp.ts +59 -4
- package/src/lib/agents/claude-agent.ts +26 -199
- package/src/lib/agents/handoff/bus.ts +164 -0
- package/src/lib/agents/handoff/governance.ts +47 -0
- package/src/lib/agents/handoff/types.ts +16 -0
- package/src/lib/agents/learned-context.ts +27 -7
- package/src/lib/agents/memory/decay.ts +61 -0
- package/src/lib/agents/memory/extractor.ts +181 -0
- package/src/lib/agents/memory/retrieval.ts +96 -0
- package/src/lib/agents/memory/types.ts +6 -0
- package/src/lib/agents/profiles/__tests__/project-profiles.test.ts +119 -0
- package/src/lib/agents/profiles/__tests__/registry.test.ts +11 -3
- package/src/lib/agents/profiles/builtins/code-reviewer/profile.yaml +2 -2
- package/src/lib/agents/profiles/builtins/content-creator/SKILL.md +19 -0
- package/src/lib/agents/profiles/builtins/content-creator/profile.yaml +27 -0
- package/src/lib/agents/profiles/builtins/customer-support-agent/SKILL.md +19 -0
- package/src/lib/agents/profiles/builtins/customer-support-agent/profile.yaml +26 -0
- package/src/lib/agents/profiles/builtins/data-analyst/profile.yaml +2 -2
- package/src/lib/agents/profiles/builtins/devops-engineer/profile.yaml +2 -2
- package/src/lib/agents/profiles/builtins/document-writer/profile.yaml +2 -2
- package/src/lib/agents/profiles/builtins/financial-analyst/SKILL.md +19 -0
- package/src/lib/agents/profiles/builtins/financial-analyst/profile.yaml +24 -0
- package/src/lib/agents/profiles/builtins/general/profile.yaml +2 -2
- package/src/lib/agents/profiles/builtins/health-fitness-coach/profile.yaml +2 -2
- package/src/lib/agents/profiles/builtins/learning-coach/profile.yaml +2 -2
- package/src/lib/agents/profiles/builtins/marketing-strategist/SKILL.md +19 -0
- package/src/lib/agents/profiles/builtins/marketing-strategist/profile.yaml +27 -0
- package/src/lib/agents/profiles/builtins/operations-coordinator/SKILL.md +19 -0
- package/src/lib/agents/profiles/builtins/operations-coordinator/profile.yaml +26 -0
- package/src/lib/agents/profiles/builtins/project-manager/profile.yaml +2 -2
- package/src/lib/agents/profiles/builtins/researcher/SKILL.md +1 -0
- package/src/lib/agents/profiles/builtins/researcher/profile.yaml +2 -2
- package/src/lib/agents/profiles/builtins/sales-researcher/SKILL.md +19 -0
- package/src/lib/agents/profiles/builtins/sales-researcher/profile.yaml +26 -0
- package/src/lib/agents/profiles/builtins/shopping-assistant/SKILL.md +1 -0
- package/src/lib/agents/profiles/builtins/shopping-assistant/profile.yaml +2 -2
- package/src/lib/agents/profiles/builtins/sweep/profile.yaml +1 -1
- package/src/lib/agents/profiles/builtins/technical-writer/profile.yaml +2 -2
- package/src/lib/agents/profiles/builtins/travel-planner/SKILL.md +2 -0
- package/src/lib/agents/profiles/builtins/travel-planner/profile.yaml +2 -2
- package/src/lib/agents/profiles/builtins/wealth-manager/SKILL.md +2 -0
- package/src/lib/agents/profiles/builtins/wealth-manager/profile.yaml +2 -2
- package/src/lib/agents/profiles/project-profiles.ts +193 -0
- package/src/lib/agents/profiles/registry.ts +130 -6
- package/src/lib/agents/profiles/types.ts +28 -0
- package/src/lib/agents/router.ts +174 -2
- package/src/lib/agents/runtime/__tests__/catalog.test.ts +15 -4
- package/src/lib/agents/runtime/anthropic-direct.ts +644 -0
- package/src/lib/agents/runtime/catalog.ts +57 -2
- package/src/lib/agents/runtime/claude.ts +205 -1
- package/src/lib/agents/runtime/index.ts +22 -0
- package/src/lib/agents/runtime/ollama-adapter.ts +409 -0
- package/src/lib/agents/runtime/openai-direct.ts +514 -0
- package/src/lib/agents/runtime/profile-assist-types.ts +30 -0
- package/src/lib/agents/runtime/types.ts +2 -0
- package/src/lib/agents/tool-permissions.ts +203 -0
- package/src/lib/channels/gateway.ts +321 -0
- package/src/lib/channels/poller.ts +268 -0
- package/src/lib/channels/registry.ts +90 -0
- package/src/lib/channels/slack-adapter.ts +188 -0
- package/src/lib/channels/telegram-adapter.ts +218 -0
- package/src/lib/channels/types.ts +43 -0
- package/src/lib/channels/webhook-adapter.ts +74 -0
- package/src/lib/chat/context-builder.ts +22 -2
- package/src/lib/chat/engine.ts +95 -13
- package/src/lib/chat/ollama-engine.ts +198 -0
- package/src/lib/chat/stagent-tools.ts +106 -20
- package/src/lib/chat/tool-catalog.ts +24 -0
- package/src/lib/chat/tool-registry.ts +90 -0
- package/src/lib/chat/tools/chat-history-tools.ts +4 -4
- package/src/lib/chat/tools/document-tools.ts +7 -7
- package/src/lib/chat/tools/handoff-tools.ts +70 -0
- package/src/lib/chat/tools/notification-tools.ts +4 -4
- package/src/lib/chat/tools/profile-tools.ts +3 -3
- package/src/lib/chat/tools/project-tools.ts +3 -3
- package/src/lib/chat/tools/schedule-tools.ts +29 -13
- package/src/lib/chat/tools/settings-tools.ts +2 -2
- package/src/lib/chat/tools/task-tools.ts +66 -11
- package/src/lib/chat/tools/usage-tools.ts +2 -2
- package/src/lib/chat/tools/workflow-tools.ts +8 -8
- package/src/lib/chat/types.ts +11 -5
- package/src/lib/constants/known-tools.ts +19 -0
- package/src/lib/constants/prose-styles.ts +1 -1
- package/src/lib/constants/settings.ts +7 -0
- package/src/lib/data/channel-bindings.ts +85 -0
- package/src/lib/data/clear.ts +22 -0
- package/src/lib/data/profile-test-results.ts +48 -0
- package/src/lib/data/seed-data/conversations.ts +196 -0
- package/src/lib/data/seed-data/learned-context.ts +99 -0
- package/src/lib/data/seed-data/notifications.ts +54 -1
- package/src/lib/data/seed-data/profile-test-results.ts +96 -0
- package/src/lib/data/seed-data/repo-imports.ts +51 -0
- package/src/lib/data/seed-data/views.ts +60 -0
- package/src/lib/data/seed.ts +51 -0
- package/src/lib/db/bootstrap.ts +162 -0
- package/src/lib/db/migrations/0013_add_repo_imports.sql +15 -0
- package/src/lib/db/migrations/0014_add_linked_profile_id.sql +3 -0
- package/src/lib/db/migrations/0015_add_channel_bindings.sql +23 -0
- package/src/lib/db/schema.ts +187 -1
- package/src/lib/environment/__tests__/auto-scan.test.ts +86 -0
- package/src/lib/environment/__tests__/profile-linker.test.ts +187 -0
- package/src/lib/environment/auto-scan.ts +48 -0
- package/src/lib/environment/data.ts +25 -0
- package/src/lib/environment/profile-generator.ts +40 -10
- package/src/lib/environment/profile-linker.ts +143 -0
- package/src/lib/environment/profile-rules.ts +96 -0
- package/src/lib/import/dedup.ts +149 -0
- package/src/lib/import/format-adapter.ts +631 -0
- package/src/lib/import/github-api.ts +219 -0
- package/src/lib/import/repo-scanner.ts +251 -0
- package/src/lib/schedules/__tests__/nlp-parser.test.ts +330 -0
- package/src/lib/schedules/active-hours.ts +120 -0
- package/src/lib/schedules/heartbeat-parser.ts +224 -0
- package/src/lib/schedules/heartbeat-prompt.ts +153 -0
- package/src/lib/schedules/nlp-parser.ts +357 -0
- package/src/lib/schedules/scheduler.ts +218 -3
- package/src/lib/settings/__tests__/budget-guardrails.test.ts +39 -1
- package/src/lib/settings/helpers.ts +6 -0
- package/src/lib/settings/routing.ts +24 -0
- package/src/lib/settings/runtime-setup.ts +28 -1
- package/src/lib/usage/ledger.ts +2 -1
- package/src/lib/validators/__tests__/settings.test.ts +9 -0
- package/src/lib/validators/profile.ts +39 -0
- package/src/lib/workflows/blueprints/builtins/business-daily-briefing.yaml +102 -0
- package/src/lib/workflows/blueprints/builtins/content-marketing-pipeline.yaml +90 -0
- package/src/lib/workflows/blueprints/builtins/customer-support-triage.yaml +107 -0
- package/src/lib/workflows/blueprints/builtins/financial-reporting.yaml +104 -0
- 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
|
|
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
|
-
|
|
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(
|
|
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
|
|
@@ -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
|