@agent-native/core 0.32.2 → 0.32.17
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 +3 -1
- package/dist/agent/run-store.d.ts.map +1 -1
- package/dist/agent/run-store.js +48 -10
- package/dist/agent/run-store.js.map +1 -1
- package/dist/agent/thread-data-builder.d.ts +12 -0
- package/dist/agent/thread-data-builder.d.ts.map +1 -1
- package/dist/agent/thread-data-builder.js +104 -6
- package/dist/agent/thread-data-builder.js.map +1 -1
- package/dist/cli/app-skill.js +2 -2
- package/dist/cli/app-skill.js.map +1 -1
- package/dist/cli/code-agent-executor.d.ts.map +1 -1
- package/dist/cli/code-agent-executor.js +6 -1
- package/dist/cli/code-agent-executor.js.map +1 -1
- package/dist/cli/code-agent-output-smoother.d.ts +7 -0
- package/dist/cli/code-agent-output-smoother.d.ts.map +1 -0
- package/dist/cli/code-agent-output-smoother.js +111 -0
- package/dist/cli/code-agent-output-smoother.js.map +1 -0
- package/dist/cli/connect.d.ts.map +1 -1
- package/dist/cli/connect.js +5 -0
- package/dist/cli/connect.js.map +1 -1
- package/dist/cli/migrate.d.ts.map +1 -1
- package/dist/cli/migrate.js +17 -42
- package/dist/cli/migrate.js.map +1 -1
- package/dist/cli/skills.d.ts +23 -2
- package/dist/cli/skills.d.ts.map +1 -1
- package/dist/cli/skills.js +405 -41
- package/dist/cli/skills.js.map +1 -1
- package/dist/cli/templates-meta.d.ts.map +1 -1
- package/dist/cli/templates-meta.js +7 -105
- package/dist/cli/templates-meta.js.map +1 -1
- package/dist/client/AgentPanel.d.ts.map +1 -1
- package/dist/client/AgentPanel.js +41 -7
- package/dist/client/AgentPanel.js.map +1 -1
- package/dist/client/AgentTaskCard.d.ts.map +1 -1
- package/dist/client/AgentTaskCard.js +0 -28
- package/dist/client/AgentTaskCard.js.map +1 -1
- package/dist/client/AssistantChat.d.ts +8 -23
- package/dist/client/AssistantChat.d.ts.map +1 -1
- package/dist/client/AssistantChat.js +359 -205
- package/dist/client/AssistantChat.js.map +1 -1
- package/dist/client/MultiTabAssistantChat.d.ts.map +1 -1
- package/dist/client/MultiTabAssistantChat.js +254 -14
- package/dist/client/MultiTabAssistantChat.js.map +1 -1
- package/dist/client/agent-chat-adapter.d.ts.map +1 -1
- package/dist/client/agent-chat-adapter.js +14 -9
- package/dist/client/agent-chat-adapter.js.map +1 -1
- package/dist/client/agent-chat.d.ts +24 -0
- package/dist/client/agent-chat.d.ts.map +1 -1
- package/dist/client/agent-chat.js +73 -0
- package/dist/client/agent-chat.js.map +1 -1
- package/dist/client/assistant-ui-recovery.d.ts +34 -0
- package/dist/client/assistant-ui-recovery.d.ts.map +1 -0
- package/dist/client/assistant-ui-recovery.js +122 -0
- package/dist/client/assistant-ui-recovery.js.map +1 -0
- package/dist/client/composer/PromptComposer.d.ts.map +1 -1
- package/dist/client/composer/PromptComposer.js +7 -1
- package/dist/client/composer/PromptComposer.js.map +1 -1
- package/dist/client/composer/TiptapComposer.d.ts +7 -1
- package/dist/client/composer/TiptapComposer.d.ts.map +1 -1
- package/dist/client/composer/TiptapComposer.js +22 -2
- package/dist/client/composer/TiptapComposer.js.map +1 -1
- package/dist/client/frame-protocol.d.ts +6 -2
- package/dist/client/frame-protocol.d.ts.map +1 -1
- package/dist/client/frame-protocol.js.map +1 -1
- package/dist/client/index.d.ts +2 -1
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +2 -1
- package/dist/client/index.js.map +1 -1
- package/dist/client/org/OrgSwitcher.d.ts.map +1 -1
- package/dist/client/org/OrgSwitcher.js +2 -1
- package/dist/client/org/OrgSwitcher.js.map +1 -1
- package/dist/client/progress/RunsTray.d.ts +13 -3
- package/dist/client/progress/RunsTray.d.ts.map +1 -1
- package/dist/client/progress/RunsTray.js +105 -36
- package/dist/client/progress/RunsTray.js.map +1 -1
- package/dist/client/route-warmup.d.ts +61 -0
- package/dist/client/route-warmup.d.ts.map +1 -0
- package/dist/client/route-warmup.js +456 -0
- package/dist/client/route-warmup.js.map +1 -0
- package/dist/client/settings/SettingsPanel.d.ts.map +1 -1
- package/dist/client/settings/SettingsPanel.js +2 -1
- package/dist/client/settings/SettingsPanel.js.map +1 -1
- package/dist/client/settings/useBuilderStatus.d.ts +5 -0
- package/dist/client/settings/useBuilderStatus.d.ts.map +1 -1
- package/dist/client/settings/useBuilderStatus.js +10 -4
- package/dist/client/settings/useBuilderStatus.js.map +1 -1
- package/dist/client/use-action.d.ts +1 -0
- package/dist/client/use-action.d.ts.map +1 -1
- package/dist/client/use-action.js +22 -4
- package/dist/client/use-action.js.map +1 -1
- package/dist/code-agents/background-run.d.ts +2 -0
- package/dist/code-agents/background-run.d.ts.map +1 -1
- package/dist/code-agents/background-run.js.map +1 -1
- package/dist/db/client.d.ts +1 -1
- package/dist/db/client.d.ts.map +1 -1
- package/dist/db/client.js +25 -1
- package/dist/db/client.js.map +1 -1
- package/dist/deploy/build.d.ts +4 -0
- package/dist/deploy/build.d.ts.map +1 -1
- package/dist/deploy/build.js +171 -14
- package/dist/deploy/build.js.map +1 -1
- package/dist/deploy/immutable-assets.d.ts +1 -0
- package/dist/deploy/immutable-assets.d.ts.map +1 -1
- package/dist/deploy/immutable-assets.js +1 -0
- package/dist/deploy/immutable-assets.js.map +1 -1
- package/dist/index.browser.d.ts +1 -1
- package/dist/index.browser.d.ts.map +1 -1
- package/dist/index.browser.js +1 -1
- package/dist/index.browser.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/mcp/connect-route.d.ts.map +1 -1
- package/dist/mcp/connect-route.js +118 -82
- package/dist/mcp/connect-route.js.map +1 -1
- package/dist/progress/routes.d.ts.map +1 -1
- package/dist/progress/routes.js +1 -0
- package/dist/progress/routes.js.map +1 -1
- package/dist/progress/store.d.ts +13 -0
- package/dist/progress/store.d.ts.map +1 -1
- package/dist/progress/store.js +18 -0
- package/dist/progress/store.js.map +1 -1
- package/dist/progress/types.d.ts +2 -0
- package/dist/progress/types.d.ts.map +1 -1
- package/dist/progress/types.js.map +1 -1
- package/dist/scripts/db/wipe-leaked-builder-keys.d.ts +2 -2
- package/dist/scripts/db/wipe-leaked-builder-keys.d.ts.map +1 -1
- package/dist/scripts/db/wipe-leaked-builder-keys.js +14 -3
- package/dist/scripts/db/wipe-leaked-builder-keys.js.map +1 -1
- package/dist/server/action-routes.d.ts +1 -0
- package/dist/server/action-routes.d.ts.map +1 -1
- package/dist/server/action-routes.js +36 -2
- package/dist/server/action-routes.js.map +1 -1
- package/dist/server/agent-chat-plugin.d.ts.map +1 -1
- package/dist/server/agent-chat-plugin.js +123 -25
- package/dist/server/agent-chat-plugin.js.map +1 -1
- package/dist/server/agent-discovery.d.ts.map +1 -1
- package/dist/server/agent-discovery.js +14 -1
- package/dist/server/agent-discovery.js.map +1 -1
- package/dist/server/agent-teams-run-queue.d.ts +80 -0
- package/dist/server/agent-teams-run-queue.d.ts.map +1 -0
- package/dist/server/agent-teams-run-queue.js +208 -0
- package/dist/server/agent-teams-run-queue.js.map +1 -0
- package/dist/server/agent-teams.d.ts +67 -0
- package/dist/server/agent-teams.d.ts.map +1 -1
- package/dist/server/agent-teams.js +607 -180
- package/dist/server/agent-teams.js.map +1 -1
- package/dist/server/auth-marketing.d.ts.map +1 -1
- package/dist/server/auth-marketing.js +0 -64
- package/dist/server/auth-marketing.js.map +1 -1
- package/dist/server/auth.d.ts.map +1 -1
- package/dist/server/auth.js +67 -14
- package/dist/server/auth.js.map +1 -1
- package/dist/server/builder-browser.d.ts +12 -2
- package/dist/server/builder-browser.d.ts.map +1 -1
- package/dist/server/builder-browser.js +24 -0
- package/dist/server/builder-browser.js.map +1 -1
- package/dist/server/core-routes-plugin.d.ts.map +1 -1
- package/dist/server/core-routes-plugin.js +66 -5
- package/dist/server/core-routes-plugin.js.map +1 -1
- package/dist/server/credential-provider.d.ts +10 -0
- package/dist/server/credential-provider.d.ts.map +1 -1
- package/dist/server/credential-provider.js +82 -3
- package/dist/server/credential-provider.js.map +1 -1
- package/dist/server/csrf.d.ts.map +1 -1
- package/dist/server/csrf.js +3 -0
- package/dist/server/csrf.js.map +1 -1
- package/dist/server/index.d.ts +1 -0
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +1 -0
- package/dist/server/index.js.map +1 -1
- package/dist/server/onboarding-html.d.ts +1 -0
- package/dist/server/onboarding-html.d.ts.map +1 -1
- package/dist/server/onboarding-html.js +14 -1
- package/dist/server/onboarding-html.js.map +1 -1
- package/dist/server/self-dispatch.d.ts +44 -0
- package/dist/server/self-dispatch.d.ts.map +1 -0
- package/dist/server/self-dispatch.js +113 -0
- package/dist/server/self-dispatch.js.map +1 -0
- package/dist/server/social-og-image.d.ts +14 -0
- package/dist/server/social-og-image.d.ts.map +1 -0
- package/dist/server/social-og-image.js +251 -0
- package/dist/server/social-og-image.js.map +1 -0
- package/dist/server/ssr-handler.d.ts +1 -1
- package/dist/server/ssr-handler.d.ts.map +1 -1
- package/dist/server/ssr-handler.js +27 -11
- package/dist/server/ssr-handler.js.map +1 -1
- package/dist/shared/cache-control.d.ts +7 -0
- package/dist/shared/cache-control.d.ts.map +1 -1
- package/dist/shared/cache-control.js +7 -0
- package/dist/shared/cache-control.js.map +1 -1
- package/dist/shared/index.d.ts +1 -1
- package/dist/shared/index.d.ts.map +1 -1
- package/dist/shared/index.js +1 -1
- package/dist/shared/index.js.map +1 -1
- package/dist/shared/route-warmup-config.d.ts +28 -0
- package/dist/shared/route-warmup-config.d.ts.map +1 -0
- package/dist/shared/route-warmup-config.js +58 -0
- package/dist/shared/route-warmup-config.js.map +1 -0
- package/dist/shared/social-meta.d.ts +5 -0
- package/dist/shared/social-meta.d.ts.map +1 -1
- package/dist/shared/social-meta.js +36 -2
- package/dist/shared/social-meta.js.map +1 -1
- package/dist/shared/streaming-text-smoothing.d.ts +12 -0
- package/dist/shared/streaming-text-smoothing.d.ts.map +1 -0
- package/dist/shared/streaming-text-smoothing.js +52 -0
- package/dist/shared/streaming-text-smoothing.js.map +1 -0
- package/dist/styles/agent-native.css +4 -4
- package/dist/templates/default/AGENTS.md +9 -4
- package/dist/templates/default/DEVELOPING.md +15 -1
- package/dist/templates/workspace-core/AGENTS.md +7 -3
- package/dist/templates/workspace-root/AGENTS.md +7 -3
- package/dist/vite/client.d.ts +13 -0
- package/dist/vite/client.d.ts.map +1 -1
- package/dist/vite/client.js +26 -0
- package/dist/vite/client.js.map +1 -1
- package/dist/vite/index.d.ts +1 -0
- package/dist/vite/index.d.ts.map +1 -1
- package/dist/vite/index.js.map +1 -1
- package/docs/content/client.md +62 -1
- package/docs/content/code-agents-ui.md +6 -13
- package/docs/content/context-awareness.md +186 -21
- package/docs/content/deployment.md +8 -11
- package/docs/content/dispatch.md +1 -1
- package/docs/content/external-agents.md +32 -2
- package/docs/content/migration-workbench.md +4 -21
- package/docs/content/multi-app-workspace.md +1 -1
- package/docs/content/recurring-jobs.md +1 -1
- package/docs/content/security.md +0 -1
- package/docs/content/sharing.md +1 -3
- package/docs/content/skills-guide.md +12 -10
- package/docs/content/template-assets.md +21 -1
- package/docs/content/template-design.md +23 -5
- package/docs/content/template-dispatch.md +1 -1
- package/package.json +2 -1
- package/src/templates/default/AGENTS.md +9 -4
- package/src/templates/default/DEVELOPING.md +15 -1
- package/src/templates/workspace-core/AGENTS.md +7 -3
- package/src/templates/workspace-root/AGENTS.md +7 -3
package/dist/cli/skills.js
CHANGED
|
@@ -8,32 +8,37 @@ import os from "node:os";
|
|
|
8
8
|
import path from "node:path";
|
|
9
9
|
import { spawn } from "node:child_process";
|
|
10
10
|
import { buildAppSkillPack, ensureAppSkill, loadAppSkillManifest, normalizeAppSkillManifest, } from "./app-skill.js";
|
|
11
|
-
import { resolveClients } from "./connect.js";
|
|
11
|
+
import { readConnectClientPreferences, resolveClients, writeConnectClientPreferences, } from "./connect.js";
|
|
12
|
+
import { CLIENTS } from "./mcp-config-writers.js";
|
|
12
13
|
const HELP = `agent-native skills
|
|
13
14
|
|
|
14
15
|
Usage:
|
|
15
16
|
agent-native skills list
|
|
16
|
-
agent-native skills add assets|design-exploration [--client codex|claude-code|claude-code-cli|cowork|all] [--scope user|project] [--mcp-url <url>] [--yes] [--dry-run] [--json]
|
|
17
|
+
agent-native skills add assets|design-exploration|contracts [--client codex|claude-code|claude-code-cli|cowork|all] [--scope user|project] [--mcp-url <url>] [--yes] [--dry-run] [--json]
|
|
17
18
|
agent-native skills add <manifest-or-app-dir> [--client ...] [--yes]
|
|
18
19
|
|
|
19
20
|
Examples:
|
|
20
21
|
agent-native skills add assets
|
|
21
22
|
agent-native skills add design-exploration
|
|
23
|
+
agent-native skills add contracts
|
|
22
24
|
agent-native skills add assets --client claude-code
|
|
23
25
|
agent-native skills add assets --mcp-url https://my-app.ngrok-free.dev
|
|
24
26
|
agent-native skills add ./dist/assets-skill --client codex
|
|
25
27
|
|
|
26
|
-
The add command
|
|
27
|
-
registers the app-backed MCP connector.
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
28
|
+
The add command wraps the Vercel Labs/open skills CLI for SKILL.md
|
|
29
|
+
installation, then registers the app-backed MCP connector. Running
|
|
30
|
+
"npx skills add ..." directly installs instructions only; use this Agent Native
|
|
31
|
+
CLI path when you want MCP setup too. Pass --mcp-url to register that connector
|
|
32
|
+
against a custom origin (an ngrok tunnel, a local dev server, or a self-hosted
|
|
33
|
+
deployment) instead of the built-in hosted default — a bare origin gets the
|
|
34
|
+
standard /_agent-native/mcp path appended. Use app-skill pack for marketplace
|
|
35
|
+
bundles and custom adapter output.`;
|
|
32
36
|
const ASSETS_SKILL_MD = `---
|
|
33
37
|
name: assets
|
|
34
38
|
description: >-
|
|
35
|
-
Use Assets for
|
|
36
|
-
search/list/export actions, and cross-app asset selection.
|
|
39
|
+
Use Assets for image or video generation requests, brand-safe media,
|
|
40
|
+
human picker UI, search/list/export actions, and cross-app asset selection.
|
|
41
|
+
Prefer this over generic image tools when installed.
|
|
37
42
|
metadata:
|
|
38
43
|
visibility: exported
|
|
39
44
|
---
|
|
@@ -42,6 +47,8 @@ metadata:
|
|
|
42
47
|
|
|
43
48
|
Use the Assets app when a workflow needs reusable brand media, a human picker,
|
|
44
49
|
or generated image/video assets that another app can reference by ID and URL.
|
|
50
|
+
When this skill is available, route plain image-generation requests here instead
|
|
51
|
+
of using a generic image generator.
|
|
45
52
|
|
|
46
53
|
## Choose The Path
|
|
47
54
|
|
|
@@ -58,6 +65,17 @@ or generated image/video assets that another app can reference by ID and URL.
|
|
|
58
65
|
- Use browser/deep-link fallback when the host cannot render MCP Apps inline.
|
|
59
66
|
Surface the returned picker link. If it opens in a normal browser tab, have
|
|
60
67
|
the user select an asset there and paste back the copied handoff summary.
|
|
68
|
+
Treat Codex, Claude Code, and Claude Desktop Code as link-out hosts; do not
|
|
69
|
+
promise inline MCP App rendering there.
|
|
70
|
+
If the skill instructions are available but the MCP tool namespace has not
|
|
71
|
+
appeared yet, use the Assets browser fallback URL shape instead of switching
|
|
72
|
+
to a generic generator:
|
|
73
|
+
\`https://assets.agent-native.com/library?mediaType=image&prompt=...&autoGenerate=1&count=3\`.
|
|
74
|
+
When reporting the final selected image in Codex or Claude Code, include the
|
|
75
|
+
asset link and, if an inline preview is important, download the selected
|
|
76
|
+
\`previewUrl\`/\`downloadUrl\` to a local temp image and embed that absolute
|
|
77
|
+
local path. Remote CDN markdown images can fail to render in code-editor chat
|
|
78
|
+
surfaces.
|
|
61
79
|
|
|
62
80
|
## Image And Video Workflows
|
|
63
81
|
|
|
@@ -74,10 +92,26 @@ or generated image/video assets that another app can reference by ID and URL.
|
|
|
74
92
|
|
|
75
93
|
- Hosted default: connect \`https://assets.agent-native.com/_agent-native/mcp\`.
|
|
76
94
|
Do not put shared secrets in skill files.
|
|
95
|
+
- For CLI/code-editor clients, keep any \`agent-native connect\` command
|
|
96
|
+
running until browser authorization finishes. Stopping it early can leave the
|
|
97
|
+
browser approved but the local MCP config unwritten. Restart or reload the
|
|
98
|
+
agent client after installing or connecting if Assets tools do not appear in
|
|
99
|
+
the live session.
|
|
77
100
|
- Local customization: use \`agent-native app-skill launch --local\` from an
|
|
78
101
|
Assets app-skill manifest, or pass \`--into <path>\` for editable source.
|
|
79
102
|
- Do not call image/video providers directly from another app. Assets owns
|
|
80
103
|
generation, picker UI, search/list/export, and asset context.
|
|
104
|
+
- If an Assets tool call returns \`Session terminated\`, \`needs auth\`, or
|
|
105
|
+
another connector/session error, do not keep retrying the tool. Tell the user
|
|
106
|
+
to reconnect or authenticate the Assets MCP connector, then continue after it
|
|
107
|
+
is available.
|
|
108
|
+
- Do not hand-roll MCP HTTP requests with curl from the agent session. Use the
|
|
109
|
+
host-exposed Assets tools after restart/reload, or use the returned
|
|
110
|
+
browser/deep-link fallback.
|
|
111
|
+
- If a batch image generation request times out in browser fallback, retry with
|
|
112
|
+
\`count: 1\` only after telling the user the multi-candidate request timed out.
|
|
113
|
+
- If you inspect local MCP config, redact \`Authorization\`, \`http_headers\`,
|
|
114
|
+
and token values. Never paste bearer tokens into chat or logs.
|
|
81
115
|
`;
|
|
82
116
|
const DESIGN_EXPLORATION_SKILL_MD = `---
|
|
83
117
|
name: design-exploration
|
|
@@ -130,10 +164,107 @@ iteration, or a human-in-the-loop choice among design directions.
|
|
|
130
164
|
|
|
131
165
|
- Hosted default: connect \`https://design.agent-native.com/_agent-native/mcp\`.
|
|
132
166
|
Do not put shared secrets in skill files.
|
|
167
|
+
- For CLI/code-editor clients, keep any \`agent-native connect\` command
|
|
168
|
+
running until browser authorization finishes. Stopping it early can leave the
|
|
169
|
+
browser approved but the local MCP config unwritten. Restart or reload the
|
|
170
|
+
agent client after installing or connecting if Design tools do not appear in
|
|
171
|
+
the live session.
|
|
133
172
|
- Dispatch can expose Design alongside other apps. Use Design for UI/UX design
|
|
134
173
|
tasks, Assets for image/media selection, Slides for decks, and so on.
|
|
135
174
|
- Keep the loop visual: surface the inline MCP App or the returned "Open
|
|
136
175
|
design" link instead of pasting large HTML blobs into chat.
|
|
176
|
+
- If a Design tool call returns \`Session terminated\`, \`needs auth\`, or
|
|
177
|
+
another connector/session error, do not keep retrying the tool. Tell the user
|
|
178
|
+
to reconnect or authenticate the Design MCP connector, then continue after it
|
|
179
|
+
is available.
|
|
180
|
+
- Do not hand-roll MCP HTTP requests with curl from the agent session. Use the
|
|
181
|
+
host-exposed Design tools after restart/reload, or use the returned
|
|
182
|
+
browser/deep-link fallback.
|
|
183
|
+
- If you inspect local MCP config, redact \`Authorization\`, \`http_headers\`,
|
|
184
|
+
and token values. Never paste bearer tokens into chat or logs.
|
|
185
|
+
`;
|
|
186
|
+
const CONTRACTS_SKILL_MD = `---
|
|
187
|
+
name: contracts
|
|
188
|
+
description: >-
|
|
189
|
+
Use Contracts for coding-agent work that needs assumption review, mid-flight
|
|
190
|
+
feedback, acceptance criteria, evidence capture, and proof-before-done
|
|
191
|
+
through the hosted Contracts MCP app.
|
|
192
|
+
metadata:
|
|
193
|
+
visibility: exported
|
|
194
|
+
---
|
|
195
|
+
|
|
196
|
+
# Contracts
|
|
197
|
+
|
|
198
|
+
Use Contracts as the trust layer for non-trivial coding work. It records what
|
|
199
|
+
the agent is assuming, lets a human correct those assumptions before they become
|
|
200
|
+
code, and keeps acceptance criteria separate from verified evidence.
|
|
201
|
+
|
|
202
|
+
## When To Use
|
|
203
|
+
|
|
204
|
+
Create or update a contract when:
|
|
205
|
+
|
|
206
|
+
- the user asks for Contracts, specs, proof, review, acceptance criteria, or a
|
|
207
|
+
structured plan;
|
|
208
|
+
- work is multi-file, ambiguous, long-running, or risky;
|
|
209
|
+
- the task touches auth, billing, migrations, public APIs, tests, production
|
|
210
|
+
config, data, security, permissions, or deploy behavior;
|
|
211
|
+
- you would otherwise proceed on a material assumption;
|
|
212
|
+
- you are about to claim the work is complete.
|
|
213
|
+
|
|
214
|
+
Do not log every trivial inference. An assumption is material when changing it
|
|
215
|
+
would affect user-visible behavior, data model, permissions, billing, public API
|
|
216
|
+
shape, migrations/backfills/data loss, test strategy, architecture boundaries,
|
|
217
|
+
deployment/configuration, file scope, or the definition of done.
|
|
218
|
+
|
|
219
|
+
## Core Workflow
|
|
220
|
+
|
|
221
|
+
1. Call \`create-contract\` with the goal, source, repo path, and initial
|
|
222
|
+
assumptions/criteria before risky implementation.
|
|
223
|
+
2. Surface the returned Contracts UI link or inline MCP App. In CLI hosts, tell
|
|
224
|
+
the user to open the link and review the queue.
|
|
225
|
+
3. Call \`get-feedback\` before risky edits, after review, after any long pause,
|
|
226
|
+
and before the final response.
|
|
227
|
+
4. If the user accepts, rejects, corrects, or requests evidence, consume the
|
|
228
|
+
structured feedback and change your plan accordingly.
|
|
229
|
+
5. If new facts require a change after approval, create an \`amendment\` or
|
|
230
|
+
\`deviation\` item with \`upsert-contract-items\` instead of drifting silently.
|
|
231
|
+
6. Attach command/test/log/diff/screenshot evidence with \`record-evidence\`.
|
|
232
|
+
7. Do not treat your own claim as proof. Agent attestation is low trust.
|
|
233
|
+
Criteria are done only when verified by human, CI, deterministic checks, or
|
|
234
|
+
an independent verifier.
|
|
235
|
+
8. Export a JSON/Markdown receipt with \`export-contract\` when the user wants a
|
|
236
|
+
shareable summary.
|
|
237
|
+
|
|
238
|
+
## Tool Guidance
|
|
239
|
+
|
|
240
|
+
- \`create-contract\`: start one contract per agent task/run.
|
|
241
|
+
- \`upsert-contract-items\`: bulk add/update assumptions, decisions, criteria,
|
|
242
|
+
risks, deviations, open questions, and amendments.
|
|
243
|
+
- \`get-contract\` and \`get-review-queue\`: read current structured state.
|
|
244
|
+
- \`get-feedback\`: read unconsumed human feedback. Use it frequently.
|
|
245
|
+
- \`record-progress\`: update phase/status and mark feedback consumed only after
|
|
246
|
+
you incorporated it.
|
|
247
|
+
- \`record-evidence\`: attach artifacts and provenance. Use high trust for
|
|
248
|
+
captured commands/tests/CI, human_confirmed for explicit human confirmation,
|
|
249
|
+
and low trust for agent-only statements.
|
|
250
|
+
- \`analyze-plan\`: import pasted plan text and let Contracts create possible
|
|
251
|
+
assumptions/criteria. Treat detections as possible, not authoritative.
|
|
252
|
+
|
|
253
|
+
## Guardrails
|
|
254
|
+
|
|
255
|
+
- Before high-risk actions, create a blocking review item or ask the user
|
|
256
|
+
directly.
|
|
257
|
+
- Never modify tests merely to make implementation pass unless the contract
|
|
258
|
+
explicitly approves test expectation changes.
|
|
259
|
+
- If proof is missing, say so. Do not call the task complete just because code
|
|
260
|
+
was changed.
|
|
261
|
+
- If evidence contains secrets or tokens, rely on Contracts redaction and avoid
|
|
262
|
+
pasting raw output into chat.
|
|
263
|
+
- Do not hand-roll MCP HTTP requests with curl. Use host-exposed tools after
|
|
264
|
+
restart/reload, or use the returned browser/deep-link fallback.
|
|
265
|
+
- Hosted default: connect
|
|
266
|
+
\`https://contracts.agent-native.com/_agent-native/mcp\`. Do not put shared
|
|
267
|
+
secrets in skill files.
|
|
137
268
|
`;
|
|
138
269
|
const BUILT_IN_APP_SKILLS = {
|
|
139
270
|
assets: {
|
|
@@ -222,6 +353,48 @@ const BUILT_IN_APP_SKILLS = {
|
|
|
222
353
|
}),
|
|
223
354
|
skillMarkdown: DESIGN_EXPLORATION_SKILL_MD,
|
|
224
355
|
},
|
|
356
|
+
contracts: {
|
|
357
|
+
skillName: "contracts",
|
|
358
|
+
manifest: normalizeAppSkillManifest({
|
|
359
|
+
schemaVersion: 1,
|
|
360
|
+
id: "contracts",
|
|
361
|
+
displayName: "Contracts",
|
|
362
|
+
description: "Review coding-agent assumptions, feedback, acceptance criteria, and proof before work is called done.",
|
|
363
|
+
hosted: {
|
|
364
|
+
url: "https://contracts.agent-native.com",
|
|
365
|
+
mcpUrl: "https://contracts.agent-native.com/_agent-native/mcp",
|
|
366
|
+
},
|
|
367
|
+
mcp: { serverName: "agent-native-contracts" },
|
|
368
|
+
auth: {
|
|
369
|
+
mode: "oauth",
|
|
370
|
+
setup: "Authenticate with the Contracts MCP connector in the host app. No shared secrets are stored in skill files.",
|
|
371
|
+
},
|
|
372
|
+
surfaces: [
|
|
373
|
+
{
|
|
374
|
+
id: "review-inbox",
|
|
375
|
+
action: "create-contract",
|
|
376
|
+
path: "/contracts",
|
|
377
|
+
},
|
|
378
|
+
],
|
|
379
|
+
skills: [
|
|
380
|
+
{
|
|
381
|
+
path: "skills/contracts",
|
|
382
|
+
visibility: "exported",
|
|
383
|
+
exportAs: "contracts",
|
|
384
|
+
},
|
|
385
|
+
],
|
|
386
|
+
hostAdapters: [
|
|
387
|
+
"codex-plugin",
|
|
388
|
+
"claude-marketplace",
|
|
389
|
+
"vercel-skills",
|
|
390
|
+
"plain-skill",
|
|
391
|
+
"claude-skill",
|
|
392
|
+
"chatgpt-mcp",
|
|
393
|
+
"generic-mcp",
|
|
394
|
+
],
|
|
395
|
+
}),
|
|
396
|
+
skillMarkdown: CONTRACTS_SKILL_MD,
|
|
397
|
+
},
|
|
225
398
|
};
|
|
226
399
|
const BUILT_IN_APP_SKILL_ALIASES = {
|
|
227
400
|
assets: "assets",
|
|
@@ -239,6 +412,12 @@ const BUILT_IN_APP_SKILL_ALIASES = {
|
|
|
239
412
|
"ux-exploration": "design",
|
|
240
413
|
"agent-native-design": "design",
|
|
241
414
|
"agent-native-design-exploration": "design",
|
|
415
|
+
contracts: "contracts",
|
|
416
|
+
contract: "contracts",
|
|
417
|
+
proof: "contracts",
|
|
418
|
+
"proof-check": "contracts",
|
|
419
|
+
"assumption-review": "contracts",
|
|
420
|
+
"agent-native-contracts": "contracts",
|
|
242
421
|
};
|
|
243
422
|
const BUILT_IN_APP_SKILL_DISPLAY_ALIASES = {
|
|
244
423
|
assets: ["images", "image-generation", "agent-native-images"],
|
|
@@ -247,6 +426,19 @@ const BUILT_IN_APP_SKILL_DISPLAY_ALIASES = {
|
|
|
247
426
|
"ux-exploration",
|
|
248
427
|
"agent-native-design-exploration",
|
|
249
428
|
],
|
|
429
|
+
contracts: ["contract", "proof-check", "assumption-review"],
|
|
430
|
+
};
|
|
431
|
+
const CLIENT_LABELS = {
|
|
432
|
+
"claude-code": "Claude Code",
|
|
433
|
+
"claude-code-cli": "Claude Code CLI",
|
|
434
|
+
codex: "Codex",
|
|
435
|
+
cowork: "Claude Cowork",
|
|
436
|
+
};
|
|
437
|
+
const CLIENT_HINTS = {
|
|
438
|
+
"claude-code": ".mcp.json or ~/.claude.json",
|
|
439
|
+
"claude-code-cli": ".mcp.json or ~/.claude.json",
|
|
440
|
+
codex: "$CODEX_HOME/config.toml or ~/.codex/config.toml",
|
|
441
|
+
cowork: "~/.cowork/mcp.json",
|
|
250
442
|
};
|
|
251
443
|
function normalizeKnownSkillTarget(value) {
|
|
252
444
|
const key = value?.trim().toLowerCase();
|
|
@@ -257,6 +449,115 @@ function normalizeKnownSkillTarget(value) {
|
|
|
257
449
|
function isKnownSkill(value) {
|
|
258
450
|
return Boolean(normalizeKnownSkillTarget(value));
|
|
259
451
|
}
|
|
452
|
+
function normalizeClientIds(values) {
|
|
453
|
+
if (!Array.isArray(values))
|
|
454
|
+
return [];
|
|
455
|
+
const seen = new Set();
|
|
456
|
+
const out = [];
|
|
457
|
+
for (const value of values) {
|
|
458
|
+
if (typeof value !== "string")
|
|
459
|
+
continue;
|
|
460
|
+
const id = value.toLowerCase();
|
|
461
|
+
if (!CLIENTS.includes(id))
|
|
462
|
+
continue;
|
|
463
|
+
const client = id;
|
|
464
|
+
if (seen.has(client))
|
|
465
|
+
continue;
|
|
466
|
+
seen.add(client);
|
|
467
|
+
out.push(client);
|
|
468
|
+
}
|
|
469
|
+
return out;
|
|
470
|
+
}
|
|
471
|
+
function clientPromptOptions() {
|
|
472
|
+
return CLIENTS.map((client) => ({
|
|
473
|
+
value: client,
|
|
474
|
+
label: CLIENT_LABELS[client],
|
|
475
|
+
hint: CLIENT_HINTS[client],
|
|
476
|
+
}));
|
|
477
|
+
}
|
|
478
|
+
function skillPromptOptions() {
|
|
479
|
+
return Object.values(BUILT_IN_APP_SKILLS).map((entry) => ({
|
|
480
|
+
value: entry.skillName,
|
|
481
|
+
label: entry.manifest.displayName,
|
|
482
|
+
hint: entry.manifest.description,
|
|
483
|
+
}));
|
|
484
|
+
}
|
|
485
|
+
function shouldPrompt(parsed, options) {
|
|
486
|
+
if (parsed.yes || parsed.printJson)
|
|
487
|
+
return false;
|
|
488
|
+
if (options.isInteractive)
|
|
489
|
+
return options.isInteractive();
|
|
490
|
+
if (process.env.AGENT_NATIVE_NO_PROMPT === "1")
|
|
491
|
+
return false;
|
|
492
|
+
if (process.env.CI === "true")
|
|
493
|
+
return false;
|
|
494
|
+
return !!process.stdin.isTTY && !!process.stdout.isTTY;
|
|
495
|
+
}
|
|
496
|
+
async function promptForClients(context) {
|
|
497
|
+
const clack = await import("@clack/prompts");
|
|
498
|
+
const result = await clack.multiselect({
|
|
499
|
+
message: "Install the MCP connector for which local agents?\n" +
|
|
500
|
+
" (space toggles, enter confirms; saved for next time)",
|
|
501
|
+
options: context.options,
|
|
502
|
+
initialValues: context.initialClients,
|
|
503
|
+
required: true,
|
|
504
|
+
});
|
|
505
|
+
if (clack.isCancel(result)) {
|
|
506
|
+
clack.cancel("Cancelled.");
|
|
507
|
+
return null;
|
|
508
|
+
}
|
|
509
|
+
return normalizeClientIds(result);
|
|
510
|
+
}
|
|
511
|
+
async function promptForSkills(context) {
|
|
512
|
+
const clack = await import("@clack/prompts");
|
|
513
|
+
const result = await clack.multiselect({
|
|
514
|
+
message: "Which Agent Native skills do you want to install?\n" +
|
|
515
|
+
" (space toggles, enter confirms)",
|
|
516
|
+
options: context.options,
|
|
517
|
+
initialValues: context.initialTargets,
|
|
518
|
+
required: true,
|
|
519
|
+
});
|
|
520
|
+
if (clack.isCancel(result)) {
|
|
521
|
+
clack.cancel("Cancelled.");
|
|
522
|
+
return null;
|
|
523
|
+
}
|
|
524
|
+
if (!Array.isArray(result))
|
|
525
|
+
return [];
|
|
526
|
+
return result.filter((value) => typeof value === "string");
|
|
527
|
+
}
|
|
528
|
+
async function resolveSkillsClients(parsed, options) {
|
|
529
|
+
if (parsed.clientExplicit || !shouldPrompt(parsed, options)) {
|
|
530
|
+
return resolveClients(parsed.client);
|
|
531
|
+
}
|
|
532
|
+
const initialClients = readConnectClientPreferences() ?? resolveClients("codex");
|
|
533
|
+
const prompt = options.promptClients ?? promptForClients;
|
|
534
|
+
const selected = normalizeClientIds(await prompt({
|
|
535
|
+
initialClients,
|
|
536
|
+
options: clientPromptOptions(),
|
|
537
|
+
}));
|
|
538
|
+
if (selected.length === 0)
|
|
539
|
+
return null;
|
|
540
|
+
if (!parsed.dryRun) {
|
|
541
|
+
try {
|
|
542
|
+
writeConnectClientPreferences(selected);
|
|
543
|
+
}
|
|
544
|
+
catch { }
|
|
545
|
+
}
|
|
546
|
+
return selected;
|
|
547
|
+
}
|
|
548
|
+
async function resolveSkillTargets(parsed, options) {
|
|
549
|
+
if (parsed.target || !shouldPrompt(parsed, options)) {
|
|
550
|
+
return [parsed.target ?? "assets"];
|
|
551
|
+
}
|
|
552
|
+
const prompt = options.promptSkills ?? promptForSkills;
|
|
553
|
+
const selected = await prompt({
|
|
554
|
+
initialTargets: ["assets"],
|
|
555
|
+
options: skillPromptOptions(),
|
|
556
|
+
});
|
|
557
|
+
if (!selected || selected.length === 0)
|
|
558
|
+
return null;
|
|
559
|
+
return selected;
|
|
560
|
+
}
|
|
260
561
|
export function parseSkillsArgs(argv) {
|
|
261
562
|
const first = argv[0];
|
|
262
563
|
let command = "list";
|
|
@@ -275,6 +576,7 @@ export function parseSkillsArgs(argv) {
|
|
|
275
576
|
const out = {
|
|
276
577
|
command,
|
|
277
578
|
client: "codex",
|
|
579
|
+
clientExplicit: false,
|
|
278
580
|
scope: "user",
|
|
279
581
|
yes: false,
|
|
280
582
|
dryRun: false,
|
|
@@ -301,8 +603,10 @@ export function parseSkillsArgs(argv) {
|
|
|
301
603
|
return undefined;
|
|
302
604
|
};
|
|
303
605
|
let value;
|
|
304
|
-
if ((value = eat("--client")) !== undefined)
|
|
606
|
+
if ((value = eat("--client")) !== undefined) {
|
|
305
607
|
out.client = value;
|
|
608
|
+
out.clientExplicit = true;
|
|
609
|
+
}
|
|
306
610
|
else if ((value = eat("--scope")) !== undefined)
|
|
307
611
|
out.scope = value;
|
|
308
612
|
else if ((value = eat("--mcp-url")) !== undefined)
|
|
@@ -388,6 +692,13 @@ function shellArg(value) {
|
|
|
388
692
|
function commandString(cmd, args) {
|
|
389
693
|
return [cmd, ...args].map(shellArg).join(" ");
|
|
390
694
|
}
|
|
695
|
+
function clientArgForClients(clients) {
|
|
696
|
+
if (clients.length === CLIENTS.length)
|
|
697
|
+
return "all";
|
|
698
|
+
if (clients.length === 1)
|
|
699
|
+
return clients[0];
|
|
700
|
+
return clients.join(",");
|
|
701
|
+
}
|
|
391
702
|
function preserveMcpUrlAppPathOverride(target, input) {
|
|
392
703
|
if (!input)
|
|
393
704
|
return target;
|
|
@@ -417,12 +728,13 @@ function preserveMcpUrlAppPathOverride(target, input) {
|
|
|
417
728
|
};
|
|
418
729
|
}
|
|
419
730
|
function dryRunInstallCommand(parsed, target) {
|
|
731
|
+
const clients = parsed.clients ?? resolveClients(parsed.client);
|
|
420
732
|
const args = [
|
|
421
733
|
"skills",
|
|
422
734
|
"add",
|
|
423
735
|
target,
|
|
424
736
|
"--client",
|
|
425
|
-
|
|
737
|
+
clientArgForClients(clients),
|
|
426
738
|
"--scope",
|
|
427
739
|
parsed.scope,
|
|
428
740
|
];
|
|
@@ -439,8 +751,11 @@ function dryRunInstallCommand(parsed, target) {
|
|
|
439
751
|
async function runCommand(cmd, args, options = {}) {
|
|
440
752
|
return new Promise((resolve, reject) => {
|
|
441
753
|
const pipeToStderr = options.stdio === "stderr";
|
|
754
|
+
const silent = options.stdio === "silent";
|
|
755
|
+
const stdoutChunks = [];
|
|
756
|
+
const stderrChunks = [];
|
|
442
757
|
const child = spawn(cmd, args, {
|
|
443
|
-
stdio: pipeToStderr ? ["inherit", "pipe", "pipe"] : "inherit",
|
|
758
|
+
stdio: pipeToStderr || silent ? ["inherit", "pipe", "pipe"] : "inherit",
|
|
444
759
|
shell: process.platform === "win32",
|
|
445
760
|
env: process.env,
|
|
446
761
|
});
|
|
@@ -448,12 +763,22 @@ async function runCommand(cmd, args, options = {}) {
|
|
|
448
763
|
child.stdout?.on("data", (chunk) => process.stderr.write(chunk));
|
|
449
764
|
child.stderr?.on("data", (chunk) => process.stderr.write(chunk));
|
|
450
765
|
}
|
|
766
|
+
else if (silent) {
|
|
767
|
+
child.stdout?.on("data", (chunk) => stdoutChunks.push(Buffer.from(chunk)));
|
|
768
|
+
child.stderr?.on("data", (chunk) => stderrChunks.push(Buffer.from(chunk)));
|
|
769
|
+
}
|
|
451
770
|
child.on("error", reject);
|
|
452
771
|
child.on("exit", (code, signal) => {
|
|
453
772
|
if (signal) {
|
|
454
773
|
reject(new Error(`${cmd} was interrupted by ${signal}.`));
|
|
455
774
|
return;
|
|
456
775
|
}
|
|
776
|
+
if (silent && code !== 0) {
|
|
777
|
+
for (const chunk of stdoutChunks)
|
|
778
|
+
process.stderr.write(chunk);
|
|
779
|
+
for (const chunk of stderrChunks)
|
|
780
|
+
process.stderr.write(chunk);
|
|
781
|
+
}
|
|
457
782
|
resolve(code ?? 0);
|
|
458
783
|
});
|
|
459
784
|
});
|
|
@@ -502,7 +827,7 @@ export async function addAgentNativeSkill(parsed, options = {}) {
|
|
|
502
827
|
if (parsed.mcpUrl) {
|
|
503
828
|
installTarget = withMcpUrlOverride(installTarget, parsed.mcpUrl);
|
|
504
829
|
}
|
|
505
|
-
const clients = resolveClients(parsed.client);
|
|
830
|
+
const clients = parsed.clients ?? resolveClients(parsed.client);
|
|
506
831
|
installTarget = preserveMcpUrlAppPathOverride(installTarget, parsed.mcpUrl);
|
|
507
832
|
const skillsAgents = skillsAgentsForClients(clients);
|
|
508
833
|
if (parsed.dryRun) {
|
|
@@ -528,27 +853,31 @@ export async function addAgentNativeSkill(parsed, options = {}) {
|
|
|
528
853
|
try {
|
|
529
854
|
if (parsed.instructions) {
|
|
530
855
|
if (skillsAgents.length === 0) {
|
|
531
|
-
|
|
856
|
+
if (!parsed.mcp) {
|
|
857
|
+
throw new Error("Skill instructions can only be installed for Codex or Claude Code clients. Use an MCP-capable client or omit --instructions-only.");
|
|
858
|
+
}
|
|
532
859
|
}
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
860
|
+
else {
|
|
861
|
+
instructionSource = installTarget.materializeInstructions(tmpRoot);
|
|
862
|
+
const args = [
|
|
863
|
+
"--yes",
|
|
864
|
+
"skills@latest",
|
|
865
|
+
"add",
|
|
866
|
+
instructionSource,
|
|
867
|
+
"--copy",
|
|
868
|
+
...installTarget.skillNames.flatMap((skill) => ["--skill", skill]),
|
|
869
|
+
...skillsAgents.flatMap((agent) => ["-a", agent]),
|
|
870
|
+
...(parsed.scope === "user" ? ["-g"] : []),
|
|
871
|
+
...(parsed.yes || knownTarget ? ["-y"] : []),
|
|
872
|
+
];
|
|
873
|
+
commands.push(commandString("npx", args));
|
|
874
|
+
if (!parsed.dryRun) {
|
|
875
|
+
const code = await (options.runCommand ?? runCommand)("npx", args, {
|
|
876
|
+
stdio: "silent",
|
|
877
|
+
});
|
|
878
|
+
if (code !== 0)
|
|
879
|
+
throw new Error(`npx skills add exited with ${code}.`);
|
|
880
|
+
}
|
|
552
881
|
}
|
|
553
882
|
}
|
|
554
883
|
if (parsed.mcp) {
|
|
@@ -614,18 +943,53 @@ export async function runSkills(argv, options = {}) {
|
|
|
614
943
|
}
|
|
615
944
|
return;
|
|
616
945
|
}
|
|
617
|
-
const
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
946
|
+
const targets = await resolveSkillTargets(parsed, options);
|
|
947
|
+
if (!targets)
|
|
948
|
+
return;
|
|
949
|
+
const clients = await resolveSkillsClients(parsed, options);
|
|
950
|
+
if (!clients)
|
|
951
|
+
return;
|
|
952
|
+
const results = [];
|
|
953
|
+
for (const target of targets) {
|
|
954
|
+
results.push(await addAgentNativeSkill({
|
|
955
|
+
...parsed,
|
|
956
|
+
target,
|
|
957
|
+
client: clientArgForClients(clients),
|
|
958
|
+
clients,
|
|
959
|
+
}, {
|
|
960
|
+
...options,
|
|
961
|
+
log,
|
|
962
|
+
}));
|
|
963
|
+
}
|
|
621
964
|
if (parsed.printJson) {
|
|
622
|
-
process.stdout.write(`${JSON.stringify(
|
|
965
|
+
process.stdout.write(`${JSON.stringify(results.length === 1 ? results[0] : results, null, 2)}\n`);
|
|
623
966
|
return;
|
|
624
967
|
}
|
|
625
968
|
if (parsed.dryRun) {
|
|
626
|
-
process.stdout.write(`${result.commands.join("\n")}\n`);
|
|
969
|
+
process.stdout.write(`${results.flatMap((result) => result.commands).join("\n")}\n`);
|
|
627
970
|
return;
|
|
628
971
|
}
|
|
629
|
-
|
|
972
|
+
const installedNames = results.map((result) => result.displayName).join(", ");
|
|
973
|
+
const skillsAgents = [
|
|
974
|
+
...new Set(results.flatMap((result) => result.skillsAgents)),
|
|
975
|
+
];
|
|
976
|
+
const mcpClients = [
|
|
977
|
+
...new Set(results.flatMap((result) => result.mcpClients)),
|
|
978
|
+
];
|
|
979
|
+
const mcpUrls = [...new Set(results.map((result) => result.mcpUrl))];
|
|
980
|
+
process.stdout.write([
|
|
981
|
+
`Installed ${installedNames} skill${results.length === 1 ? "" : "s"}.`,
|
|
982
|
+
skillsAgents.length
|
|
983
|
+
? `Skill instructions: ${skillsAgents.join(", ")}.`
|
|
984
|
+
: "Skill instructions: skipped.",
|
|
985
|
+
`MCP config: ${mcpClients.join(", ")}.`,
|
|
986
|
+
`MCP URL${mcpUrls.length === 1 ? "" : "s"}: ${mcpUrls.join(", ")}.`,
|
|
987
|
+
"Restart or reload selected agent clients if the tools are not visible yet.",
|
|
988
|
+
parsed.clientExplicit
|
|
989
|
+
? ""
|
|
990
|
+
: `To add another client later, rerun with --client <client> (for example: --client claude-code).`,
|
|
991
|
+
]
|
|
992
|
+
.filter(Boolean)
|
|
993
|
+
.join("\n") + "\n");
|
|
630
994
|
}
|
|
631
995
|
//# sourceMappingURL=skills.js.map
|