takomi 2.1.43 → 2.1.45
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/.pi/README.md +4 -3
- package/.pi/extensions/oauth-router/README.md +3 -3
- package/.pi/extensions/oauth-router/commands.ts +66 -39
- package/.pi/extensions/oauth-router/config.ts +34 -34
- package/.pi/extensions/oauth-router/index.ts +51 -10
- package/.pi/extensions/oauth-router/report-ui.ts +205 -0
- package/.pi/extensions/oauth-router/scripts/vibe-verify.py +5 -5
- package/.pi/extensions/takomi-context-manager/diagnostics-tools.ts +41 -3
- package/.pi/extensions/takomi-context-manager/diagnostics.ts +26 -0
- package/.pi/extensions/takomi-context-manager/index.ts +20 -9
- package/.pi/extensions/takomi-context-manager/model-policy-gate.ts +36 -15
- package/.pi/extensions/takomi-context-manager/policy-tools.ts +93 -42
- package/.pi/extensions/takomi-context-manager/skill-categories.d.ts +11 -0
- package/.pi/extensions/takomi-context-manager/skill-categories.js +212 -0
- package/.pi/extensions/takomi-context-manager/skill-registry.ts +179 -8
- package/.pi/extensions/takomi-context-manager/skill-tools.ts +208 -103
- package/.pi/extensions/takomi-context-manager/tool-renderers.ts +112 -0
- package/.pi/extensions/takomi-context-manager/types.ts +6 -0
- package/.pi/extensions/takomi-runtime/commands.ts +45 -12
- package/.pi/extensions/takomi-runtime/gate-provenance.ts +24 -0
- package/.pi/extensions/takomi-runtime/index.ts +133 -56
- package/.pi/extensions/takomi-runtime/routing-policy.ts +14 -2
- package/.pi/extensions/takomi-runtime/takomi-stats.js +46 -26
- package/.pi/extensions/takomi-runtime/tool-renderers.ts +234 -0
- package/.pi/extensions/takomi-runtime/workflow-catalog.ts +54 -0
- package/.pi/extensions/takomi-subagents/agents.ts +4 -0
- package/.pi/extensions/takomi-subagents/async-lifecycle.ts +401 -0
- package/.pi/extensions/takomi-subagents/detached-results.ts +940 -0
- package/.pi/extensions/takomi-subagents/index.ts +46 -1
- package/.pi/extensions/takomi-subagents/native-render.ts +250 -188
- package/.pi/extensions/takomi-subagents/pi-subagents-engine.ts +55 -46
- package/.pi/extensions/takomi-subagents/pi-subagents-internal.ts +11 -5
- package/.pi/extensions/takomi-subagents/result-heartbeat.ts +55 -0
- package/.pi/extensions/takomi-subagents/subagent-ux.ts +162 -0
- package/.pi/extensions/takomi-subagents/tool-runner.ts +158 -28
- package/.pi/takomi/model-routing.md +282 -3
- package/assets/.agent/skills/shared-resend-portfolio/SKILL.md +124 -0
- package/package.json +4 -3
- package/src/pi-harness.js +41 -1
- package/src/pi-takomi-core/types.ts +10 -0
- package/src/pi-takomi-core/workflows.ts +86 -45
- package/src/skills-catalog.js +2 -202
- package/src/skills-installer.js +4 -1
- package/src/takomi-stats.js +5 -5
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: shared-resend-portfolio
|
|
3
|
+
description: Reuse one Resend account and one verified sender domain across multiple branded products, especially for solo developers and free-tier portfolios. Use when adding transactional email to another app without creating a separate Resend account or verified domain, while preserving per-product identity, recipients, Reply-To routing, templates, security boundaries, delivery reliability, and awareness of a shared sending quota.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Shared Resend Portfolio
|
|
7
|
+
|
|
8
|
+
Implement email for multiple products through one Resend account and verified domain. Optimize for a solo developer or small portfolio using the free tier without making every app look like the same product.
|
|
9
|
+
|
|
10
|
+
## Core model
|
|
11
|
+
|
|
12
|
+
Share infrastructure, not product identity:
|
|
13
|
+
|
|
14
|
+
```text
|
|
15
|
+
One Resend account
|
|
16
|
+
└── Existing verified sender domain
|
|
17
|
+
├── Product A sender identity
|
|
18
|
+
├── Product B sender identity
|
|
19
|
+
└── Product C sender identity
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
Each app keeps its own:
|
|
23
|
+
|
|
24
|
+
- sender display name
|
|
25
|
+
- destination inbox
|
|
26
|
+
- Reply-To routing
|
|
27
|
+
- subject conventions
|
|
28
|
+
- branded HTML and plain-text templates
|
|
29
|
+
- deployment environment variables
|
|
30
|
+
- delivery logs and failure behavior
|
|
31
|
+
|
|
32
|
+
All apps share the account-level free-tier quota and verified-domain reputation.
|
|
33
|
+
|
|
34
|
+
## Portfolio discovery
|
|
35
|
+
|
|
36
|
+
Before implementation:
|
|
37
|
+
|
|
38
|
+
1. Inspect the target app and any sibling app with a working Resend setup.
|
|
39
|
+
2. Identify the canonical Resend account and already verified domain.
|
|
40
|
+
3. Confirm the product display name, shared sender mailbox, internal recipient, support Reply-To inbox, and expected email types.
|
|
41
|
+
4. Confirm whether the target deployment already has a Resend API key.
|
|
42
|
+
5. Do not ask the user to create another account, verify another domain, or buy a plan unless the existing account cannot meet a stated requirement.
|
|
43
|
+
|
|
44
|
+
## Account and key strategy
|
|
45
|
+
|
|
46
|
+
Reuse the same Resend account and verified domain. Prefer a separate API key per deployed app when the account permits it; this limits the impact of a leaked or rotated key while remaining on one account and quota. Reuse the same key only when separate keys are unavailable or the user explicitly prefers that trade-off.
|
|
47
|
+
|
|
48
|
+
Never copy secrets from another repository into source control. Add the selected key directly to each deployment’s secret environment.
|
|
49
|
+
|
|
50
|
+
## Per-product configuration
|
|
51
|
+
|
|
52
|
+
Use server-only variables and product-specific names where practical. Resolve their values from the user's existing Resend account, verified sender configuration, and intended product inbox—never copy example identities into an implementation.
|
|
53
|
+
|
|
54
|
+
| Variable role | Purpose |
|
|
55
|
+
|---|---|
|
|
56
|
+
| Resend API key | Authenticates the server-side provider call |
|
|
57
|
+
| Product sender identity | Combines the current product's display name with an address on the existing verified domain |
|
|
58
|
+
| Product contact recipient | Receives this product's internal notifications |
|
|
59
|
+
| Product reply address | Receives replies to user-facing messages when different from the contact recipient |
|
|
60
|
+
|
|
61
|
+
The visible display name supplies product identity; the existing verified address supplies deliverability. Never use a `NEXT_PUBLIC_` or equivalent client-exposed variable for an API key.
|
|
62
|
+
|
|
63
|
+
## Contact-form routing
|
|
64
|
+
|
|
65
|
+
Send two separate messages:
|
|
66
|
+
|
|
67
|
+
```text
|
|
68
|
+
Internal notification
|
|
69
|
+
From: configured product sender identity
|
|
70
|
+
To: configured internal product inbox
|
|
71
|
+
Reply-To: validated address submitted by the visitor
|
|
72
|
+
|
|
73
|
+
Visitor confirmation
|
|
74
|
+
From: configured product sender identity
|
|
75
|
+
To: validated address submitted by the visitor
|
|
76
|
+
Reply-To: configured internal product inbox
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
Do not put the visitor and internal inbox in one recipient list. Separate messages prevent address exposure and allow different content.
|
|
80
|
+
|
|
81
|
+
Treat the internal notification as primary delivery. Return form success only after Resend accepts it and returns a message ID. Attempt visitor confirmation afterward; log its failure without claiming the primary enquiry was lost.
|
|
82
|
+
|
|
83
|
+
## Brand isolation
|
|
84
|
+
|
|
85
|
+
Create a distinct template shell for each product while keeping the provider module pattern reusable. Customize:
|
|
86
|
+
|
|
87
|
+
- product name and descriptor
|
|
88
|
+
- colors, typography, and header treatment
|
|
89
|
+
- email preview text
|
|
90
|
+
- subjects and tone
|
|
91
|
+
- footer ownership, support address, and response expectations
|
|
92
|
+
|
|
93
|
+
Use table layouts, inline CSS, a 600–640px content width, escaped user values, and a plain-text version. Do not reuse another product’s visual identity merely because the sender infrastructure is shared.
|
|
94
|
+
|
|
95
|
+
## Shared free-tier safeguards
|
|
96
|
+
|
|
97
|
+
- Check the current Resend free-tier limits rather than relying on remembered numbers.
|
|
98
|
+
- Remember that every app consumes the same account quota.
|
|
99
|
+
- Send only necessary transactional messages; avoid duplicate notifications.
|
|
100
|
+
- Keep anti-spam controls on public forms: validation, length limits, honeypot, and rate limiting where appropriate.
|
|
101
|
+
- Avoid retry loops that can send duplicates. Persist or use idempotency where the workflow has meaningful retry risk.
|
|
102
|
+
- Monitor provider rejections and quota errors without logging secrets or unnecessary personal data.
|
|
103
|
+
- Escalate to another account or paid plan only when measured volume, isolation, compliance, or reputation requirements justify it.
|
|
104
|
+
|
|
105
|
+
## Reliable implementation
|
|
106
|
+
|
|
107
|
+
1. Install the official `resend` package in the correct workspace.
|
|
108
|
+
2. Keep provider calls in a server-only module.
|
|
109
|
+
3. Validate `result.data?.id` and ensure `result.error` is absent.
|
|
110
|
+
4. Catch SDK and network exceptions.
|
|
111
|
+
5. Set `replyTo` explicitly.
|
|
112
|
+
6. Return `503` when email is not configured and `502` when primary delivery fails.
|
|
113
|
+
7. Preserve direct email, phone, or messaging fallbacks in the UI.
|
|
114
|
+
8. Never report log-only handling as successful delivery.
|
|
115
|
+
|
|
116
|
+
## Verification
|
|
117
|
+
|
|
118
|
+
- Confirm the shared domain is verified in the reused Resend account.
|
|
119
|
+
- Confirm the product-specific From, To, and Reply-To values.
|
|
120
|
+
- Test internal delivery, then visitor confirmation, then replying in both directions.
|
|
121
|
+
- Test validation, honeypot, missing-key, provider-rejection, and fallback paths.
|
|
122
|
+
- Run repository-native typecheck, lint, test, and build commands.
|
|
123
|
+
- Confirm the deployment contains its API key and product variables.
|
|
124
|
+
- Perform one real submission before claiming live delivery works.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "takomi",
|
|
3
|
-
"version": "2.1.
|
|
3
|
+
"version": "2.1.45",
|
|
4
4
|
"description": "🎯 Stop wrestling with AI. Start building with purpose. The artisan's toolkit for agent workflows, Codex skills, and original Takomi capabilities like 21st.dev integration.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -37,9 +37,10 @@
|
|
|
37
37
|
],
|
|
38
38
|
"scripts": {
|
|
39
39
|
"postinstall": "node src/postinstall.js",
|
|
40
|
-
"test": "npm run test:typecheck && npm run test:regressions && npm run test:skills",
|
|
40
|
+
"test": "npm run test:typecheck && npm run test:regressions && npm run test:context-manager && npm run test:skills",
|
|
41
41
|
"test:typecheck": "tsc --noEmit",
|
|
42
|
-
"test:regressions": "node scripts/test-regressions.js",
|
|
42
|
+
"test:regressions": "node scripts/test-regressions.js && node scripts/test-subagent-renderers.js && node scripts/test-subagent-heartbeat.js && node scripts/test-subagent-production-lifecycle.js && node scripts/test-subagent-acceptance.js && node scripts/test-takomi-runtime-renderers.js && node scripts/test-workflow-catalog.js && node scripts/test-oauth-router-report-ui.js && node --experimental-specifier-resolution=node scripts/test-takomi-board-errors.js && node scripts/test-takomi-gate-provenance.js && node scripts/test-subagent-project-trust.js",
|
|
43
|
+
"test:context-manager": "node --experimental-specifier-resolution=node scripts/test-context-manager-renderers.js",
|
|
43
44
|
"test:skills": "node scripts/test-skill-selection.js",
|
|
44
45
|
"takomi-flow:doctor": "node plugins/takomi-flow/scripts/takomi-flow.mjs doctor",
|
|
45
46
|
"takomi-flow:selftest": "node plugins/takomi-flow/scripts/takomi-flow.mjs selftest",
|
package/src/pi-harness.js
CHANGED
|
@@ -575,6 +575,45 @@ function printFirstRunGuidance(reason) {
|
|
|
575
575
|
console.log(pc.dim(' takomi --help Show all commands\n'));
|
|
576
576
|
}
|
|
577
577
|
|
|
578
|
+
export function getSourceCheckoutLaunchArgs(cwd) {
|
|
579
|
+
const packageJson = path.join(cwd, 'package.json');
|
|
580
|
+
const extensionsRoot = path.join(cwd, '.pi', 'extensions');
|
|
581
|
+
const required = [
|
|
582
|
+
path.join(extensionsRoot, 'oauth-router', 'index.ts'),
|
|
583
|
+
path.join(extensionsRoot, 'takomi-runtime', 'index.ts'),
|
|
584
|
+
path.join(extensionsRoot, 'takomi-subagents', 'index.ts'),
|
|
585
|
+
path.join(extensionsRoot, 'takomi-context-manager', 'index.ts'),
|
|
586
|
+
path.join(extensionsRoot, 'notify-sound', 'index.ts'),
|
|
587
|
+
];
|
|
588
|
+
const promptsRoot = path.join(cwd, '.pi', 'prompts');
|
|
589
|
+
const theme = path.join(cwd, '.pi', 'themes', 'takomi-noir.json');
|
|
590
|
+
|
|
591
|
+
let isTakomiSourceCheckout = false;
|
|
592
|
+
try {
|
|
593
|
+
const pkg = fs.readJsonSync(packageJson);
|
|
594
|
+
isTakomiSourceCheckout = pkg?.name === 'takomi'
|
|
595
|
+
&& required.every((entry) => fs.existsSync(entry))
|
|
596
|
+
&& fs.existsSync(promptsRoot)
|
|
597
|
+
&& fs.existsSync(theme);
|
|
598
|
+
} catch {}
|
|
599
|
+
|
|
600
|
+
if (!isTakomiSourceCheckout) return [];
|
|
601
|
+
|
|
602
|
+
// Normal Pi auto-discovery would load both the globally installed Takomi
|
|
603
|
+
// extensions and this checkout's project copies. Besides tool conflicts,
|
|
604
|
+
// both runtime instances register lifecycle/UI handlers, which causes slow
|
|
605
|
+
// startup and duplicated headers/widgets/footers. Match scripts/pi-dev.ps1:
|
|
606
|
+
// disable discovery and load exactly one local development set.
|
|
607
|
+
return [
|
|
608
|
+
'--no-extensions',
|
|
609
|
+
...required.flatMap((entry) => ['--extension', entry]),
|
|
610
|
+
'--no-prompt-templates',
|
|
611
|
+
'--prompt-template', promptsRoot,
|
|
612
|
+
'--no-themes',
|
|
613
|
+
'--theme', theme,
|
|
614
|
+
];
|
|
615
|
+
}
|
|
616
|
+
|
|
578
617
|
export async function launchTakomiHarness(cwd = process.cwd()) {
|
|
579
618
|
// Keep the common `takomi` path lean. A full environment inspection shells out
|
|
580
619
|
// to `pi --version`, which costs multiple seconds on Windows before Pi even
|
|
@@ -606,7 +645,8 @@ export async function launchTakomiHarness(cwd = process.cwd()) {
|
|
|
606
645
|
};
|
|
607
646
|
|
|
608
647
|
return await new Promise((resolve) => {
|
|
609
|
-
const
|
|
648
|
+
const launchArgs = getSourceCheckoutLaunchArgs(cwd);
|
|
649
|
+
const resolved = resolveCommandForSpawn(pi.path || 'pi', launchArgs);
|
|
610
650
|
const child = spawn(resolved.command, resolved.args, {
|
|
611
651
|
cwd,
|
|
612
652
|
stdio: 'inherit',
|
|
@@ -96,6 +96,16 @@ export type TakomiSubagentRunGroup = {
|
|
|
96
96
|
sessionId?: string;
|
|
97
97
|
};
|
|
98
98
|
|
|
99
|
+
export type WorkflowAvailability = "embedded";
|
|
100
|
+
|
|
101
|
+
export type WorkflowCatalogEntry = {
|
|
102
|
+
id: TakomiWorkflowId;
|
|
103
|
+
stage: VibeLifecycleStage;
|
|
104
|
+
name: string;
|
|
105
|
+
description: string;
|
|
106
|
+
availability: WorkflowAvailability;
|
|
107
|
+
};
|
|
108
|
+
|
|
99
109
|
export type WorkflowDefinition = {
|
|
100
110
|
id: TakomiWorkflowId;
|
|
101
111
|
stage: VibeLifecycleStage;
|
|
@@ -1,45 +1,86 @@
|
|
|
1
|
-
import type { TakomiWorkflowId, WorkflowDefinition } from "./types";
|
|
2
|
-
|
|
3
|
-
const VIBE_GENESIS_PLAYBOOK = `Genesis fallback summary: author the project foundation in markdown, with PRD, FR issues, coding guidelines, architecture decisions, data models, API contracts, implementation strategy, and a clean handoff. For broad projects, Genesis may also create the orchestration session that carries the work into UI/UX Design and Build. The runtime should prefer .pi/prompts/genesis-prompt.md; this string exists only as a compatibility fallback.`;
|
|
4
|
-
const VIBE_DESIGN_PLAYBOOK = `Design fallback summary: define UI/UX only: visual system, user journeys, interaction flows, mockups, accessibility expectations, and frontend builder constraints in markdown. Technical architecture, data models, and API contracts belong in Genesis or Architect planning. The runtime should prefer .pi/prompts/design-prompt.md; this string exists only as a compatibility fallback.`;
|
|
5
|
-
const VIBE_BUILD_PLAYBOOK = `Build fallback summary: implement the approved plan with FR-driven work, strict verification, mockup adherence, and explicit handoff reporting. The runtime should prefer .pi/prompts/build-prompt.md; this string exists only as a compatibility fallback.`;
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
1
|
+
import type { TakomiWorkflowId, WorkflowCatalogEntry, WorkflowDefinition } from "./types";
|
|
2
|
+
|
|
3
|
+
const VIBE_GENESIS_PLAYBOOK = `Genesis fallback summary: author the project foundation in markdown, with PRD, FR issues, coding guidelines, architecture decisions, data models, API contracts, implementation strategy, and a clean handoff. For broad projects, Genesis may also create the orchestration session that carries the work into UI/UX Design and Build. The runtime should prefer .pi/prompts/genesis-prompt.md; this string exists only as a compatibility fallback.`;
|
|
4
|
+
const VIBE_DESIGN_PLAYBOOK = `Design fallback summary: define UI/UX only: visual system, user journeys, interaction flows, mockups, accessibility expectations, and frontend builder constraints in markdown. Technical architecture, data models, and API contracts belong in Genesis or Architect planning. The runtime should prefer .pi/prompts/design-prompt.md; this string exists only as a compatibility fallback.`;
|
|
5
|
+
const VIBE_BUILD_PLAYBOOK = `Build fallback summary: implement the approved plan with FR-driven work, strict verification, mockup adherence, and explicit handoff reporting. The runtime should prefer .pi/prompts/build-prompt.md; this string exists only as a compatibility fallback.`;
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Canonical model-facing lifecycle metadata. Runtime tools may frame this
|
|
9
|
+
* catalog differently, but must not maintain their own workflow wording.
|
|
10
|
+
*/
|
|
11
|
+
export const WORKFLOW_CATALOG: readonly WorkflowCatalogEntry[] = [
|
|
12
|
+
{
|
|
13
|
+
id: "vibe-genesis",
|
|
14
|
+
stage: "genesis",
|
|
15
|
+
name: "Vibe Genesis",
|
|
16
|
+
description: "Initialize a project with markdown blueprints, technical planning, and a clean handoff into UI/UX Design or Build. See .pi/prompts/genesis-prompt.md for the canonical behavior.",
|
|
17
|
+
availability: "embedded",
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
id: "vibe-design",
|
|
21
|
+
stage: "design",
|
|
22
|
+
name: "Vibe Design",
|
|
23
|
+
description: "Define UI/UX only: visual system, user journeys, interaction flows, mockups, accessibility expectations, and frontend builder constraints before implementation begins. See .pi/prompts/design-prompt.md for the canonical behavior.",
|
|
24
|
+
availability: "embedded",
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
id: "vibe-build",
|
|
28
|
+
stage: "build",
|
|
29
|
+
name: "Vibe Build",
|
|
30
|
+
description: "Execute the approved plan with FR-based implementation, strict verification, mockup adherence, and explicit handoff reporting. See .pi/prompts/build-prompt.md for the canonical behavior.",
|
|
31
|
+
availability: "embedded",
|
|
32
|
+
},
|
|
33
|
+
] as const;
|
|
34
|
+
|
|
35
|
+
const WORKFLOW_IMPLEMENTATIONS: Record<TakomiWorkflowId, Omit<WorkflowDefinition, "id" | "stage" | "title" | "purpose">> = {
|
|
36
|
+
"vibe-genesis": {
|
|
37
|
+
preferredRole: "architect",
|
|
38
|
+
preferredAgent: "architect",
|
|
39
|
+
nextStage: "design",
|
|
40
|
+
playbook: VIBE_GENESIS_PLAYBOOK,
|
|
41
|
+
},
|
|
42
|
+
"vibe-design": {
|
|
43
|
+
preferredRole: "design",
|
|
44
|
+
preferredAgent: "designer",
|
|
45
|
+
preferredModelHint: "Prefer Gemini 3.1 Pro Preview or another strong design-capable model actually available in Pi.",
|
|
46
|
+
nextStage: "build",
|
|
47
|
+
playbook: VIBE_DESIGN_PLAYBOOK,
|
|
48
|
+
},
|
|
49
|
+
"vibe-build": {
|
|
50
|
+
preferredRole: "orchestrator",
|
|
51
|
+
preferredAgent: "orchestrator",
|
|
52
|
+
playbook: VIBE_BUILD_PLAYBOOK,
|
|
53
|
+
},
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
export const WORKFLOWS: Record<TakomiWorkflowId, WorkflowDefinition> = Object.fromEntries(
|
|
57
|
+
WORKFLOW_CATALOG.map((workflow) => [
|
|
58
|
+
workflow.id,
|
|
59
|
+
{
|
|
60
|
+
...WORKFLOW_IMPLEMENTATIONS[workflow.id],
|
|
61
|
+
id: workflow.id,
|
|
62
|
+
stage: workflow.stage,
|
|
63
|
+
title: workflow.name,
|
|
64
|
+
purpose: workflow.description,
|
|
65
|
+
},
|
|
66
|
+
]),
|
|
67
|
+
) as Record<TakomiWorkflowId, WorkflowDefinition>;
|
|
68
|
+
|
|
69
|
+
export function listWorkflowCatalog(): readonly WorkflowCatalogEntry[] {
|
|
70
|
+
return WORKFLOW_CATALOG;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
export function listWorkflowDefinitions(): WorkflowDefinition[] {
|
|
74
|
+
return Object.values(WORKFLOWS);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
export function getWorkflowCatalogEntry(id: TakomiWorkflowId): WorkflowCatalogEntry {
|
|
78
|
+
const workflow = WORKFLOW_CATALOG.find((entry) => entry.id === id);
|
|
79
|
+
if (!workflow) throw new Error(`Unknown Takomi workflow: ${id}`);
|
|
80
|
+
return workflow;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/** Loads the direct-playbook payload for takomi_workflow without board framing. */
|
|
84
|
+
export function getWorkflowDefinition(id: TakomiWorkflowId): WorkflowDefinition {
|
|
85
|
+
return WORKFLOWS[id];
|
|
86
|
+
}
|
package/src/skills-catalog.js
CHANGED
|
@@ -2,209 +2,9 @@ import fs from 'fs-extra';
|
|
|
2
2
|
import path from 'path';
|
|
3
3
|
import pc from 'picocolors';
|
|
4
4
|
import { PATHS } from './utils.js';
|
|
5
|
+
import { CORE_SKILLS, SKILL_CATEGORIES } from '../.pi/extensions/takomi-context-manager/skill-categories.js';
|
|
5
6
|
|
|
6
|
-
export
|
|
7
|
-
'takomi',
|
|
8
|
-
'sync-docs',
|
|
9
|
-
'code-review',
|
|
10
|
-
'security-audit',
|
|
11
|
-
'optimize-agent-context',
|
|
12
|
-
'agent-recovery',
|
|
13
|
-
'avoid-feature-creep',
|
|
14
|
-
'ai-sdk',
|
|
15
|
-
'git-commit-generation',
|
|
16
|
-
];
|
|
17
|
-
|
|
18
|
-
export const SKILL_CATEGORIES = [
|
|
19
|
-
{
|
|
20
|
-
id: 'core',
|
|
21
|
-
title: 'Core / Recommended',
|
|
22
|
-
color: 'cyan',
|
|
23
|
-
description: 'Essential skills for efficient Takomi usage.',
|
|
24
|
-
skills: CORE_SKILLS,
|
|
25
|
-
},
|
|
26
|
-
{
|
|
27
|
-
id: 'developer',
|
|
28
|
-
title: 'Developer / Frameworks',
|
|
29
|
-
color: 'blue',
|
|
30
|
-
description: 'Framework, repo, and developer workflow helpers.',
|
|
31
|
-
skills: [
|
|
32
|
-
'ai-sdk',
|
|
33
|
-
'nextjs-standards',
|
|
34
|
-
'context7',
|
|
35
|
-
'monorepo-management',
|
|
36
|
-
'upgrading-expo',
|
|
37
|
-
'github-ops',
|
|
38
|
-
'git-worktree',
|
|
39
|
-
'git-commit-generation',
|
|
40
|
-
'pr-comment-fix',
|
|
41
|
-
'jules',
|
|
42
|
-
'gemini',
|
|
43
|
-
'anti-gravity',
|
|
44
|
-
],
|
|
45
|
-
},
|
|
46
|
-
{
|
|
47
|
-
id: 'security',
|
|
48
|
-
title: 'Security / Review',
|
|
49
|
-
color: 'red',
|
|
50
|
-
description: 'Security, audit, and review workflows.',
|
|
51
|
-
skills: [
|
|
52
|
-
'security-audit',
|
|
53
|
-
'audit-website',
|
|
54
|
-
'code-review',
|
|
55
|
-
'jstar-reviewer',
|
|
56
|
-
'convex-security-audit',
|
|
57
|
-
'convex-security-check',
|
|
58
|
-
],
|
|
59
|
-
},
|
|
60
|
-
{
|
|
61
|
-
id: 'convex',
|
|
62
|
-
title: 'Convex',
|
|
63
|
-
color: 'green',
|
|
64
|
-
description: 'Convex framework skills and best practices.',
|
|
65
|
-
skills: [
|
|
66
|
-
'convex',
|
|
67
|
-
'convex-agents',
|
|
68
|
-
'convex-best-practices',
|
|
69
|
-
'convex-component-authoring',
|
|
70
|
-
'convex-cron-jobs',
|
|
71
|
-
'convex-file-storage',
|
|
72
|
-
'convex-functions',
|
|
73
|
-
'convex-http-actions',
|
|
74
|
-
'convex-migrations',
|
|
75
|
-
'convex-realtime',
|
|
76
|
-
'convex-schema-validator',
|
|
77
|
-
'convex-security-audit',
|
|
78
|
-
'convex-security-check',
|
|
79
|
-
],
|
|
80
|
-
},
|
|
81
|
-
{
|
|
82
|
-
id: 'frontend',
|
|
83
|
-
title: 'Frontend / UI',
|
|
84
|
-
color: 'magenta',
|
|
85
|
-
description: 'Frontend implementation, UI/UX, components, and testing.',
|
|
86
|
-
skills: [
|
|
87
|
-
'frontend-design',
|
|
88
|
-
'web-design-guidelines',
|
|
89
|
-
'building-native-ui',
|
|
90
|
-
'ui-ux-pro-max',
|
|
91
|
-
'component-analysis',
|
|
92
|
-
'21st-dev-components',
|
|
93
|
-
'stitch',
|
|
94
|
-
'webapp-testing',
|
|
95
|
-
'figma',
|
|
96
|
-
],
|
|
97
|
-
},
|
|
98
|
-
{
|
|
99
|
-
id: 'docs-office',
|
|
100
|
-
title: 'Docs / Office / Extraction',
|
|
101
|
-
color: 'yellow',
|
|
102
|
-
description: 'Document formats, extraction, and README support.',
|
|
103
|
-
skills: [
|
|
104
|
-
'pdf',
|
|
105
|
-
'docx',
|
|
106
|
-
'pptx',
|
|
107
|
-
'xlsx',
|
|
108
|
-
'high-fidelity-extraction',
|
|
109
|
-
'crafting-effective-readmes',
|
|
110
|
-
'exam-creator-skill',
|
|
111
|
-
],
|
|
112
|
-
},
|
|
113
|
-
{
|
|
114
|
-
id: 'marketing',
|
|
115
|
-
title: 'Marketing / SEO / Copy',
|
|
116
|
-
color: 'green',
|
|
117
|
-
description: 'Marketing, SEO, naming, pricing, and social strategy.',
|
|
118
|
-
skills: [
|
|
119
|
-
'copywriting',
|
|
120
|
-
'marketing-ideas',
|
|
121
|
-
'pricing-strategy',
|
|
122
|
-
'programmatic-seo',
|
|
123
|
-
'seo-ready',
|
|
124
|
-
'social-content',
|
|
125
|
-
'twitter-automation',
|
|
126
|
-
'google-trends',
|
|
127
|
-
'domain-name-brainstormer',
|
|
128
|
-
'global-brand-namer',
|
|
129
|
-
'youtube-pipeline',
|
|
130
|
-
],
|
|
131
|
-
},
|
|
132
|
-
{
|
|
133
|
-
id: 'ai-media',
|
|
134
|
-
title: 'AI Media / Content Creation',
|
|
135
|
-
color: 'magenta',
|
|
136
|
-
description: 'Optional AI media/content skills. Not installed by default.',
|
|
137
|
-
skills: [
|
|
138
|
-
'ai-avatar-video',
|
|
139
|
-
'ai-marketing-videos',
|
|
140
|
-
'ai-podcast-creation',
|
|
141
|
-
'ai-product-photography',
|
|
142
|
-
'ai-social-media-content',
|
|
143
|
-
'ai-voice-cloning',
|
|
144
|
-
'takomi-flow',
|
|
145
|
-
],
|
|
146
|
-
},
|
|
147
|
-
{
|
|
148
|
-
id: 'creative-video',
|
|
149
|
-
title: 'Creative / Video / Art',
|
|
150
|
-
color: 'blue',
|
|
151
|
-
description: 'Creative visuals, video, animation, and art workflows.',
|
|
152
|
-
skills: [
|
|
153
|
-
'algorithmic-art',
|
|
154
|
-
'blender-mcp-scene-director',
|
|
155
|
-
'takomi-flow',
|
|
156
|
-
'remotion',
|
|
157
|
-
'remotion-real-ui-video',
|
|
158
|
-
'youtube-pipeline',
|
|
159
|
-
'ai-avatar-video',
|
|
160
|
-
'ai-marketing-videos',
|
|
161
|
-
'photo-book-builder',
|
|
162
|
-
'hyperframes',
|
|
163
|
-
'general-video',
|
|
164
|
-
'motion-graphics',
|
|
165
|
-
],
|
|
166
|
-
},
|
|
167
|
-
{
|
|
168
|
-
id: 'hyperframes',
|
|
169
|
-
title: 'HyperFrames',
|
|
170
|
-
color: 'magenta',
|
|
171
|
-
description: 'HTML-native video creation and animation framework.',
|
|
172
|
-
skills: [
|
|
173
|
-
'hyperframes',
|
|
174
|
-
'hyperframes-core',
|
|
175
|
-
'hyperframes-keyframes',
|
|
176
|
-
'hyperframes-animation',
|
|
177
|
-
'hyperframes-creative',
|
|
178
|
-
'hyperframes-media',
|
|
179
|
-
'hyperframes-registry',
|
|
180
|
-
'hyperframes-cli',
|
|
181
|
-
'remotion-to-hyperframes',
|
|
182
|
-
'media-use',
|
|
183
|
-
'embedded-captions',
|
|
184
|
-
'faceless-explainer',
|
|
185
|
-
'general-video',
|
|
186
|
-
'motion-graphics',
|
|
187
|
-
'music-to-video',
|
|
188
|
-
'pr-to-video',
|
|
189
|
-
'product-launch-video',
|
|
190
|
-
'slideshow',
|
|
191
|
-
'talking-head-recut',
|
|
192
|
-
'website-to-video',
|
|
193
|
-
],
|
|
194
|
-
},
|
|
195
|
-
{
|
|
196
|
-
id: 'skill-building',
|
|
197
|
-
title: 'Skill Building / Prompting / Orchestration',
|
|
198
|
-
color: 'cyan',
|
|
199
|
-
description: 'Skill authoring, prompt engineering, and optional orchestration helpers.',
|
|
200
|
-
skills: [
|
|
201
|
-
'skill-creator',
|
|
202
|
-
'prompt-engineering',
|
|
203
|
-
'subagent-driven-development',
|
|
204
|
-
'spawn-task',
|
|
205
|
-
],
|
|
206
|
-
},
|
|
207
|
-
];
|
|
7
|
+
export { CORE_SKILLS, SKILL_CATEGORIES, getSkillCategory } from '../.pi/extensions/takomi-context-manager/skill-categories.js';
|
|
208
8
|
|
|
209
9
|
const colorFns = {
|
|
210
10
|
cyan: pc.cyan,
|
package/src/skills-installer.js
CHANGED
|
@@ -4,7 +4,7 @@ import path from 'path';
|
|
|
4
4
|
import crypto from 'crypto';
|
|
5
5
|
import pc from 'picocolors';
|
|
6
6
|
import { PATHS } from './utils.js';
|
|
7
|
-
import { getValidCoreSkills, listBundledSkillNames } from './skills-catalog.js';
|
|
7
|
+
import { getSkillCategory, getValidCoreSkills, listBundledSkillNames } from './skills-catalog.js';
|
|
8
8
|
|
|
9
9
|
const HOME = os.homedir();
|
|
10
10
|
const TAKOMI_HOME = process.env.TAKOMI_HOME_DIR || path.join(HOME, '.takomi');
|
|
@@ -45,6 +45,7 @@ function normalizeOwnedEntry(name, entry) {
|
|
|
45
45
|
targetPath: path.join(SKILLS_ROOT, name),
|
|
46
46
|
installedAt: undefined,
|
|
47
47
|
takomiVersion: undefined,
|
|
48
|
+
category: getSkillCategory(name),
|
|
48
49
|
};
|
|
49
50
|
}
|
|
50
51
|
return {
|
|
@@ -53,6 +54,7 @@ function normalizeOwnedEntry(name, entry) {
|
|
|
53
54
|
targetPath: entry.targetPath || path.join(SKILLS_ROOT, name),
|
|
54
55
|
installedAt: entry.installedAt,
|
|
55
56
|
takomiVersion: entry.takomiVersion,
|
|
57
|
+
category: entry.category || getSkillCategory(name),
|
|
56
58
|
};
|
|
57
59
|
}
|
|
58
60
|
|
|
@@ -163,6 +165,7 @@ export async function installBundledSkills(version = 'unknown', options = {}) {
|
|
|
163
165
|
targetPath: dest,
|
|
164
166
|
installedAt: new Date().toISOString(),
|
|
165
167
|
takomiVersion: version,
|
|
168
|
+
category: getSkillCategory(name),
|
|
166
169
|
};
|
|
167
170
|
installed.push(name);
|
|
168
171
|
}
|
package/src/takomi-stats.js
CHANGED
|
@@ -16,11 +16,11 @@ const pc = {
|
|
|
16
16
|
magenta: ansi(35, 39),
|
|
17
17
|
};
|
|
18
18
|
|
|
19
|
-
const PRICES = {
|
|
20
|
-
'gpt-5.6-luna': [1.00, 0.10, 6.00],
|
|
21
|
-
'gpt-5.6-sol': [5.00, 0.50, 30.00],
|
|
22
|
-
'gpt-5.6-terra': [2.50, 0.25, 15.00],
|
|
23
|
-
'gpt-5.5': [5.00, 0.50, 30.00],
|
|
19
|
+
const PRICES = {
|
|
20
|
+
'gpt-5.6-luna': [1.00, 0.10, 6.00],
|
|
21
|
+
'gpt-5.6-sol': [5.00, 0.50, 30.00],
|
|
22
|
+
'gpt-5.6-terra': [2.50, 0.25, 15.00],
|
|
23
|
+
'gpt-5.5': [5.00, 0.50, 30.00],
|
|
24
24
|
'gpt-5.4': [2.50, 0.25, 15.00],
|
|
25
25
|
'gpt-5.4-mini': [0.75, 0.075, 4.50],
|
|
26
26
|
'gpt-5.4-nano': [0.20, 0.02, 1.25],
|