@synap-core/cli 1.6.1 → 1.8.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/dist/commands/agent-run.d.ts +47 -0
- package/dist/commands/agent-run.js +302 -0
- package/dist/commands/agent-run.js.map +1 -0
- package/dist/commands/artifact.d.ts +26 -0
- package/dist/commands/artifact.js +76 -0
- package/dist/commands/artifact.js.map +1 -0
- package/dist/commands/automation.d.ts +47 -0
- package/dist/commands/automation.js +600 -0
- package/dist/commands/automation.js.map +1 -0
- package/dist/commands/cell.d.ts +55 -0
- package/dist/commands/cell.js +277 -0
- package/dist/commands/cell.js.map +1 -0
- package/dist/commands/connect.js +41 -7
- package/dist/commands/connect.js.map +1 -1
- package/dist/commands/connections.js +0 -16
- package/dist/commands/connections.js.map +1 -1
- package/dist/commands/connectors.d.ts +31 -0
- package/dist/commands/connectors.js +276 -0
- package/dist/commands/connectors.js.map +1 -0
- package/dist/commands/context.d.ts +22 -0
- package/dist/commands/context.js +151 -0
- package/dist/commands/context.js.map +1 -0
- package/dist/commands/data-extra.d.ts +13 -0
- package/dist/commands/data-extra.js +161 -0
- package/dist/commands/data-extra.js.map +1 -0
- package/dist/commands/data.d.ts +13 -9
- package/dist/commands/data.js +220 -109
- package/dist/commands/data.js.map +1 -1
- package/dist/commands/discover.d.ts +18 -0
- package/dist/commands/discover.js +71 -0
- package/dist/commands/discover.js.map +1 -0
- package/dist/commands/doc.d.ts +39 -0
- package/dist/commands/doc.js +130 -0
- package/dist/commands/doc.js.map +1 -0
- package/dist/commands/events.d.ts +26 -0
- package/dist/commands/events.js +68 -0
- package/dist/commands/events.js.map +1 -0
- package/dist/commands/explain.d.ts +21 -0
- package/dist/commands/explain.js +248 -0
- package/dist/commands/explain.js.map +1 -0
- package/dist/commands/graph.d.ts +18 -0
- package/dist/commands/graph.js +73 -0
- package/dist/commands/graph.js.map +1 -0
- package/dist/commands/home.d.ts +12 -0
- package/dist/commands/home.js +54 -0
- package/dist/commands/home.js.map +1 -0
- package/dist/commands/init.d.ts +0 -2
- package/dist/commands/init.js +62 -102
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/keys.d.ts +9 -0
- package/dist/commands/keys.js +79 -0
- package/dist/commands/keys.js.map +1 -0
- package/dist/commands/knowledge.d.ts +32 -18
- package/dist/commands/knowledge.js +303 -53
- package/dist/commands/knowledge.js.map +1 -1
- package/dist/commands/observe.d.ts +9 -0
- package/dist/commands/observe.js +90 -0
- package/dist/commands/observe.js.map +1 -0
- package/dist/commands/open.d.ts +15 -0
- package/dist/commands/open.js +44 -0
- package/dist/commands/open.js.map +1 -0
- package/dist/commands/pods.d.ts +5 -0
- package/dist/commands/pods.js +85 -37
- package/dist/commands/pods.js.map +1 -1
- package/dist/commands/proposals-actions.d.ts +7 -0
- package/dist/commands/proposals-actions.js +40 -0
- package/dist/commands/proposals-actions.js.map +1 -0
- package/dist/commands/providers.d.ts +38 -0
- package/dist/commands/providers.js +170 -0
- package/dist/commands/providers.js.map +1 -0
- package/dist/commands/sessions.d.ts +31 -0
- package/dist/commands/sessions.js +224 -0
- package/dist/commands/sessions.js.map +1 -0
- package/dist/commands/skills-commands.d.ts +26 -0
- package/dist/commands/skills-commands.js +186 -0
- package/dist/commands/skills-commands.js.map +1 -0
- package/dist/commands/skills.d.ts +26 -0
- package/dist/commands/skills.js +195 -0
- package/dist/commands/skills.js.map +1 -0
- package/dist/commands/status.js +68 -30
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/subscribe.d.ts +19 -0
- package/dist/commands/subscribe.js +91 -0
- package/dist/commands/subscribe.js.map +1 -0
- package/dist/commands/view.d.ts +57 -0
- package/dist/commands/view.js +194 -0
- package/dist/commands/view.js.map +1 -0
- package/dist/index.d.ts +3 -4
- package/dist/index.js +823 -206
- package/dist/index.js.map +1 -1
- package/dist/lib/agent-templates.d.ts +25 -0
- package/dist/lib/agent-templates.js +148 -0
- package/dist/lib/agent-templates.js.map +1 -0
- package/dist/lib/agents-config.d.ts +4 -1
- package/dist/lib/agents-config.js +19 -2
- package/dist/lib/agents-config.js.map +1 -1
- package/dist/lib/capture-lane.d.ts +49 -0
- package/dist/lib/capture-lane.js +79 -0
- package/dist/lib/capture-lane.js.map +1 -0
- package/dist/lib/hub-client.d.ts +14 -0
- package/dist/lib/hub-client.js +45 -3
- package/dist/lib/hub-client.js.map +1 -1
- package/dist/lib/pod.d.ts +22 -1
- package/dist/lib/pod.js +32 -2
- package/dist/lib/pod.js.map +1 -1
- package/dist/lib/skills-installer.d.ts +1 -1
- package/dist/lib/skills-installer.js +1 -1
- package/dist/lib/skills-installer.js.map +1 -1
- package/dist/lib/targets.d.ts +17 -1
- package/dist/lib/targets.js +744 -70
- package/dist/lib/targets.js.map +1 -1
- package/node_modules/@synap/hub-rest-client/dist/index.cjs +881 -0
- package/node_modules/@synap/hub-rest-client/dist/index.d.cts +907 -0
- package/node_modules/@synap/hub-rest-client/dist/index.d.ts +907 -0
- package/node_modules/@synap/hub-rest-client/dist/index.js +851 -0
- package/node_modules/@synap/hub-rest-client/package.json +45 -0
- package/node_modules/@synap/hub-rest-client/src/client.ts +1143 -0
- package/node_modules/@synap/hub-rest-client/src/errors.ts +30 -0
- package/node_modules/@synap/hub-rest-client/src/index.ts +111 -0
- package/node_modules/@synap/hub-rest-client/src/setup.ts +77 -0
- package/node_modules/@synap/hub-rest-client/src/types.ts +639 -0
- package/package.json +9 -2
- package/skills/synap/SKILL.md +374 -100
- package/skills/synap-ui/SKILL.md +12 -9
- package/dist/lib/templates.d.ts +0 -11
- package/dist/lib/templates.js +0 -13
- package/dist/lib/templates.js.map +0 -1
- package/dist/templates/agent-os.json +0 -3090
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
import { log } from "../utils/logger.js";
|
|
3
|
+
import { resolveHubConfig, hubGet, hubPatch, hubPost, writeActiveSessionId, clearActiveSessionId, readActiveSessionId, } from "../lib/hub-client.js";
|
|
4
|
+
// ─── startSession ─────────────────────────────────────────────────────────────
|
|
5
|
+
export async function startSession(opts) {
|
|
6
|
+
try {
|
|
7
|
+
const cfg = await resolveHubConfig(opts);
|
|
8
|
+
const workspaceId = opts.workspace || cfg.workspaceId;
|
|
9
|
+
if (!workspaceId) {
|
|
10
|
+
console.error(chalk.red("Error: --workspace <id> is required (or set active workspace with 'synap use')"));
|
|
11
|
+
process.exit(1);
|
|
12
|
+
}
|
|
13
|
+
// Resolve caller userId from the hub key
|
|
14
|
+
const me = (await hubGet("/users/me", {}, cfg));
|
|
15
|
+
const userId = me?.id;
|
|
16
|
+
if (!userId) {
|
|
17
|
+
console.error(chalk.red("Error: could not resolve userId from /users/me"));
|
|
18
|
+
process.exit(1);
|
|
19
|
+
}
|
|
20
|
+
const body = {
|
|
21
|
+
workspaceId,
|
|
22
|
+
userId,
|
|
23
|
+
goal: opts.goal,
|
|
24
|
+
};
|
|
25
|
+
if (opts.taskId)
|
|
26
|
+
body.correlationId = `task:${opts.taskId}`;
|
|
27
|
+
const session = (await hubPost("/focus-sessions", body, cfg));
|
|
28
|
+
if (opts.json) {
|
|
29
|
+
console.log(JSON.stringify(session, null, 2));
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
const id = String(session.id ?? "");
|
|
33
|
+
// Auto-attach: make this session active for the current terminal
|
|
34
|
+
writeActiveSessionId(id);
|
|
35
|
+
log.success(`Session started and attached`);
|
|
36
|
+
console.log(` ID: ${chalk.bold(id)}`);
|
|
37
|
+
console.log(` Goal: ${chalk.white(opts.goal)}`);
|
|
38
|
+
if (opts.taskId)
|
|
39
|
+
console.log(` Task: ${chalk.dim(opts.taskId)}`);
|
|
40
|
+
log.dim(` Active in this terminal (.synap-session)`);
|
|
41
|
+
console.log();
|
|
42
|
+
// Print the ID alone on a final line so scripts can grab it easily
|
|
43
|
+
console.log(id);
|
|
44
|
+
}
|
|
45
|
+
catch (e) {
|
|
46
|
+
console.error(chalk.red("Error: " + e.message));
|
|
47
|
+
process.exit(1);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
// ─── listSessions ─────────────────────────────────────────────────────────────
|
|
51
|
+
export async function listSessions(opts) {
|
|
52
|
+
try {
|
|
53
|
+
const cfg = await resolveHubConfig(opts);
|
|
54
|
+
const params = {};
|
|
55
|
+
if (opts.workspace)
|
|
56
|
+
params.workspaceId = opts.workspace;
|
|
57
|
+
if (opts.status)
|
|
58
|
+
params.status = opts.status;
|
|
59
|
+
if (opts.limit)
|
|
60
|
+
params.limit = parseInt(opts.limit, 10);
|
|
61
|
+
const res = (await hubGet("/focus-sessions", params, cfg));
|
|
62
|
+
const sessions = res?.sessions ?? [];
|
|
63
|
+
if (opts.json) {
|
|
64
|
+
console.log(JSON.stringify(res, null, 2));
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
if (!sessions.length) {
|
|
68
|
+
log.dim("No sessions found");
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
for (const s of sessions) {
|
|
72
|
+
const status = String(s.status ?? "");
|
|
73
|
+
const statusColor = status === "active"
|
|
74
|
+
? chalk.green(status)
|
|
75
|
+
: status === "paused"
|
|
76
|
+
? chalk.yellow(status)
|
|
77
|
+
: chalk.dim(status);
|
|
78
|
+
const progress = typeof s.progress === "number" ? ` ${chalk.dim(`[${s.progress}%]`)}` : "";
|
|
79
|
+
console.log(` ${chalk.bold(String(s.id ?? "").slice(0, 8))} ${statusColor}${progress} ${chalk.white(String(s.goal ?? ""))}`);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
catch (e) {
|
|
83
|
+
console.error(chalk.red("Error: " + e.message));
|
|
84
|
+
process.exit(1);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
// ─── getSession ───────────────────────────────────────────────────────────────
|
|
88
|
+
export async function getSession(id, opts) {
|
|
89
|
+
try {
|
|
90
|
+
const cfg = await resolveHubConfig(opts);
|
|
91
|
+
const params = {};
|
|
92
|
+
if (opts.workspace)
|
|
93
|
+
params.workspaceId = opts.workspace;
|
|
94
|
+
const res = await hubGet(`/focus-sessions/${id}`, params, cfg);
|
|
95
|
+
if (opts.json) {
|
|
96
|
+
console.log(JSON.stringify(res, null, 2));
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
const s = res;
|
|
100
|
+
log.info(`Session ${chalk.bold(String(s.id ?? ""))}`);
|
|
101
|
+
console.log(` Goal: ${chalk.white(String(s.goal ?? ""))}`);
|
|
102
|
+
console.log(` Status: ${chalk.cyan(String(s.status ?? ""))}`);
|
|
103
|
+
if (typeof s.progress === "number")
|
|
104
|
+
console.log(` Progress: ${s.progress}%`);
|
|
105
|
+
if (s.templateId)
|
|
106
|
+
console.log(` Template: ${chalk.dim(String(s.templateId))}`);
|
|
107
|
+
if (Array.isArray(s.agentIds) && s.agentIds.length)
|
|
108
|
+
console.log(` Agents: ${s.agentIds.join(", ")}`);
|
|
109
|
+
if (Array.isArray(s.expectedOutputs) && s.expectedOutputs.length)
|
|
110
|
+
console.log(` Outputs: ${s.expectedOutputs.map((o) => o.label).join(", ")}`);
|
|
111
|
+
if (s.correlationId)
|
|
112
|
+
console.log(` CorrelationId: ${chalk.dim(String(s.correlationId))}`);
|
|
113
|
+
}
|
|
114
|
+
catch (e) {
|
|
115
|
+
console.error(chalk.red("Error: " + e.message));
|
|
116
|
+
process.exit(1);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
// ─── updateSession ────────────────────────────────────────────────────────────
|
|
120
|
+
export async function updateSession(id, opts) {
|
|
121
|
+
try {
|
|
122
|
+
const cfg = await resolveHubConfig(opts);
|
|
123
|
+
if (!opts.workspace) {
|
|
124
|
+
console.error(chalk.red("Error: --workspace <id> is required"));
|
|
125
|
+
process.exit(1);
|
|
126
|
+
}
|
|
127
|
+
const body = { workspaceId: opts.workspace };
|
|
128
|
+
if (opts.progress !== undefined)
|
|
129
|
+
body.progress = parseInt(opts.progress, 10);
|
|
130
|
+
if (opts.status)
|
|
131
|
+
body.status = opts.status;
|
|
132
|
+
if (opts.goal)
|
|
133
|
+
body.goal = opts.goal;
|
|
134
|
+
const res = await hubPatch(`/focus-sessions/${id}`, body, cfg);
|
|
135
|
+
if (opts.json) {
|
|
136
|
+
console.log(JSON.stringify(res, null, 2));
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
log.success(`Session updated ${chalk.dim(id.slice(0, 8))}`);
|
|
140
|
+
if (opts.progress !== undefined)
|
|
141
|
+
log.dim(` progress → ${opts.progress}%`);
|
|
142
|
+
if (opts.status)
|
|
143
|
+
log.dim(` status → ${opts.status}`);
|
|
144
|
+
}
|
|
145
|
+
catch (e) {
|
|
146
|
+
console.error(chalk.red("Error: " + e.message));
|
|
147
|
+
process.exit(1);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
// ─── attachSession ────────────────────────────────────────────────────────────
|
|
151
|
+
export async function attachSession(id, opts) {
|
|
152
|
+
// Validate the session exists before attaching
|
|
153
|
+
try {
|
|
154
|
+
const cfg = await resolveHubConfig(opts);
|
|
155
|
+
await hubGet(`/focus-sessions/${id}`, {}, cfg);
|
|
156
|
+
}
|
|
157
|
+
catch (e) {
|
|
158
|
+
console.error(chalk.red("Error: session not found — " + e.message));
|
|
159
|
+
process.exit(1);
|
|
160
|
+
}
|
|
161
|
+
writeActiveSessionId(id);
|
|
162
|
+
if (opts.json) {
|
|
163
|
+
console.log(JSON.stringify({ ok: true, sessionId: id }));
|
|
164
|
+
return;
|
|
165
|
+
}
|
|
166
|
+
log.success(`Session attached ${chalk.dim(id.slice(0, 8))}`);
|
|
167
|
+
log.dim(` All hub calls in this terminal will tag X-Session-Id: ${id.slice(0, 8)}…`);
|
|
168
|
+
}
|
|
169
|
+
// ─── detachSession ────────────────────────────────────────────────────────────
|
|
170
|
+
export function detachSession(opts) {
|
|
171
|
+
const current = readActiveSessionId();
|
|
172
|
+
clearActiveSessionId();
|
|
173
|
+
if (opts.json) {
|
|
174
|
+
console.log(JSON.stringify({ ok: true }));
|
|
175
|
+
return;
|
|
176
|
+
}
|
|
177
|
+
if (current) {
|
|
178
|
+
log.success(`Session detached ${chalk.dim(current.slice(0, 8))}`);
|
|
179
|
+
}
|
|
180
|
+
else {
|
|
181
|
+
log.dim("No active session to detach");
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
// ─── sessionStatus ────────────────────────────────────────────────────────────
|
|
185
|
+
export function sessionStatus(opts) {
|
|
186
|
+
const id = readActiveSessionId();
|
|
187
|
+
if (opts.json) {
|
|
188
|
+
console.log(JSON.stringify({ sessionId: id ?? null }));
|
|
189
|
+
return;
|
|
190
|
+
}
|
|
191
|
+
if (id) {
|
|
192
|
+
log.info(`Active session: ${chalk.bold(id.slice(0, 8))}… ${chalk.dim("(from .synap-session or SYNAP_SESSION_ID)")}`);
|
|
193
|
+
}
|
|
194
|
+
else {
|
|
195
|
+
log.dim("No active session — run `synap session start` or `synap session attach <id>`");
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
// ─── closeSession ─────────────────────────────────────────────────────────────
|
|
199
|
+
export async function closeSession(id, opts) {
|
|
200
|
+
try {
|
|
201
|
+
const cfg = await resolveHubConfig(opts);
|
|
202
|
+
if (!opts.workspace) {
|
|
203
|
+
console.error(chalk.red("Error: --workspace <id> is required"));
|
|
204
|
+
process.exit(1);
|
|
205
|
+
}
|
|
206
|
+
// Close via PATCH — the /focus-sessions/:id endpoint sets closedAt automatically
|
|
207
|
+
// when status transitions to "closed"
|
|
208
|
+
const body = { workspaceId: opts.workspace, status: "closed" };
|
|
209
|
+
await hubPatch(`/focus-sessions/${id}`, body, cfg);
|
|
210
|
+
// Detach if this was the active terminal session
|
|
211
|
+
if (readActiveSessionId() === id)
|
|
212
|
+
clearActiveSessionId();
|
|
213
|
+
if (opts.json) {
|
|
214
|
+
console.log(JSON.stringify({ ok: true }));
|
|
215
|
+
return;
|
|
216
|
+
}
|
|
217
|
+
log.success(`Session closed ${chalk.dim(id.slice(0, 8))}`);
|
|
218
|
+
}
|
|
219
|
+
catch (e) {
|
|
220
|
+
console.error(chalk.red("Error: " + e.message));
|
|
221
|
+
process.exit(1);
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
//# sourceMappingURL=sessions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sessions.js","sourceRoot":"","sources":["../../src/commands/sessions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* synap skill — skill knowledge base commands
|
|
3
|
+
*
|
|
4
|
+
* Manage agent skills stored in the pod's agent_skills table.
|
|
5
|
+
* Skills are structured knowledge packages shared across all agents.
|
|
6
|
+
*
|
|
7
|
+
* Commands:
|
|
8
|
+
* synap skill suggest <topic> Search skills by topic/query
|
|
9
|
+
* synap skill get <slug> Fetch a single skill by slug
|
|
10
|
+
* synap skill sync [--from] Bulk import skills from local disk
|
|
11
|
+
*/
|
|
12
|
+
interface SkillOpts {
|
|
13
|
+
podUrl?: string;
|
|
14
|
+
apiKey?: string;
|
|
15
|
+
}
|
|
16
|
+
export declare function suggestSkills(topic: string, opts: SkillOpts): Promise<void>;
|
|
17
|
+
export declare function getSkill(slug: string, opts: SkillOpts): Promise<void>;
|
|
18
|
+
/**
|
|
19
|
+
* Sync skill files from local disk into the pod's agent_skills table.
|
|
20
|
+
* Default source: ~/.claude/skills/ — each subdirectory with a SKILL.md
|
|
21
|
+
* becomes one agent_skill row. Slug = directory name.
|
|
22
|
+
*/
|
|
23
|
+
export declare function syncSkills(opts: SkillOpts & {
|
|
24
|
+
from?: string;
|
|
25
|
+
}): Promise<void>;
|
|
26
|
+
export {};
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* synap skill — skill knowledge base commands
|
|
3
|
+
*
|
|
4
|
+
* Manage agent skills stored in the pod's agent_skills table.
|
|
5
|
+
* Skills are structured knowledge packages shared across all agents.
|
|
6
|
+
*
|
|
7
|
+
* Commands:
|
|
8
|
+
* synap skill suggest <topic> Search skills by topic/query
|
|
9
|
+
* synap skill get <slug> Fetch a single skill by slug
|
|
10
|
+
* synap skill sync [--from] Bulk import skills from local disk
|
|
11
|
+
*/
|
|
12
|
+
import chalk from "chalk";
|
|
13
|
+
import fs from "node:fs";
|
|
14
|
+
import path from "node:path";
|
|
15
|
+
import os from "node:os";
|
|
16
|
+
import { readFile } from "node:fs/promises";
|
|
17
|
+
import { log } from "../utils/logger.js";
|
|
18
|
+
import { resolveHubConfig, hubGet, hubPost } from "../lib/hub-client.js";
|
|
19
|
+
import ora from "ora";
|
|
20
|
+
// ─── suggest ───────────────────────────────────────────────────────────────
|
|
21
|
+
export async function suggestSkills(topic, opts) {
|
|
22
|
+
try {
|
|
23
|
+
const cfg = await resolveHubConfig(opts);
|
|
24
|
+
const result = await hubGet("/agent-skills", { topic, limit: 20 }, cfg);
|
|
25
|
+
const skills = result.skills ?? [];
|
|
26
|
+
if (skills.length === 0) {
|
|
27
|
+
log.info(`No skills found for topic "${topic}".`);
|
|
28
|
+
log.dim("Try: synap skill sync — to import skills from ~/.claude/skills/");
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
log.heading(`Skills matching "${topic}" (${result.total} total)`);
|
|
32
|
+
log.blank();
|
|
33
|
+
for (const s of skills) {
|
|
34
|
+
const tagStr = s.tags.length > 0 ? chalk.dim(` [${s.tags.slice(0, 3).join(", ")}${s.tags.length > 3 ? ", …" : ""}]`) : "";
|
|
35
|
+
const desc = s.description ? chalk.dim(` ${s.description}`) : "";
|
|
36
|
+
console.log(` ${chalk.bold(s.slug)}${tagStr}`);
|
|
37
|
+
console.log(` ${chalk.cyan(s.name)}${desc}`);
|
|
38
|
+
const topicsStr = s.topics.length > 0 ? chalk.dim(` topics: ${s.topics.join(", ")}`) : "";
|
|
39
|
+
if (topicsStr)
|
|
40
|
+
console.log(topicsStr);
|
|
41
|
+
console.log();
|
|
42
|
+
}
|
|
43
|
+
log.dim("To view a skill body: synap skill get <slug>");
|
|
44
|
+
}
|
|
45
|
+
catch (e) {
|
|
46
|
+
log.error("Error: " + e.message);
|
|
47
|
+
process.exit(1);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
// ─── get ───────────────────────────────────────────────────────────────────
|
|
51
|
+
export async function getSkill(slug, opts) {
|
|
52
|
+
try {
|
|
53
|
+
const cfg = await resolveHubConfig(opts);
|
|
54
|
+
const skill = await hubGet(`/agent-skills/by-slug/${encodeURIComponent(slug)}`, {}, cfg);
|
|
55
|
+
if (!skill || !skill.slug) {
|
|
56
|
+
log.error(`Skill "${slug}" not found.`);
|
|
57
|
+
log.dim("Try: synap skill suggest <topic> — to find available skills");
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
log.heading(`${skill.name} ${chalk.dim(`(${skill.slug})`)}`);
|
|
61
|
+
log.blank();
|
|
62
|
+
if (skill.description) {
|
|
63
|
+
console.log(` ${skill.description}`);
|
|
64
|
+
log.blank();
|
|
65
|
+
}
|
|
66
|
+
if (skill.topics.length > 0) {
|
|
67
|
+
console.log(` ${chalk.dim("topics:")} ${skill.topics.join(", ")}`);
|
|
68
|
+
}
|
|
69
|
+
if (skill.tags.length > 0) {
|
|
70
|
+
console.log(` ${chalk.dim("tags:")} ${skill.tags.join(", ")}`);
|
|
71
|
+
}
|
|
72
|
+
if (skill.version) {
|
|
73
|
+
console.log(` ${chalk.dim("version:")} ${skill.version}`);
|
|
74
|
+
}
|
|
75
|
+
if (skill.author) {
|
|
76
|
+
console.log(` ${chalk.dim("author:")} ${skill.author}`);
|
|
77
|
+
}
|
|
78
|
+
log.blank();
|
|
79
|
+
// Print the skill body
|
|
80
|
+
console.log(skill.body);
|
|
81
|
+
log.blank();
|
|
82
|
+
}
|
|
83
|
+
catch (e) {
|
|
84
|
+
log.error("Error: " + e.message);
|
|
85
|
+
process.exit(1);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
// ─── sync ──────────────────────────────────────────────────────────────────
|
|
89
|
+
/**
|
|
90
|
+
* Sync skill files from local disk into the pod's agent_skills table.
|
|
91
|
+
* Default source: ~/.claude/skills/ — each subdirectory with a SKILL.md
|
|
92
|
+
* becomes one agent_skill row. Slug = directory name.
|
|
93
|
+
*/
|
|
94
|
+
export async function syncSkills(opts) {
|
|
95
|
+
const skillsDir = opts.from ?? path.join(os.homedir(), ".claude", "skills");
|
|
96
|
+
if (!fs.existsSync(skillsDir)) {
|
|
97
|
+
log.error(`Skills directory not found: ${skillsDir}`);
|
|
98
|
+
log.dim("Create skill files at ~/.claude/skills/<name>/SKILL.md");
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
const spinner = ora("Scanning skills directory...").start();
|
|
102
|
+
const entries = fs.readdirSync(skillsDir, { withFileTypes: true });
|
|
103
|
+
const skillDirs = entries.filter((e) => e.isDirectory() || (e.isSymbolicLink() && fs.statSync(path.join(skillsDir, e.name)).isDirectory()));
|
|
104
|
+
if (skillDirs.length === 0) {
|
|
105
|
+
spinner.fail("No skill directories found");
|
|
106
|
+
log.dim(`Each skill needs: ${skillsDir}/<slug>/SKILL.md`);
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
spinner.text = `Found ${skillDirs.length} skill(s)`;
|
|
110
|
+
const cfg = await resolveHubConfig(opts);
|
|
111
|
+
let imported = 0;
|
|
112
|
+
let skipped = 0;
|
|
113
|
+
let errors = 0;
|
|
114
|
+
for (const dir of skillDirs) {
|
|
115
|
+
const slug = dir.name;
|
|
116
|
+
const skillPath = path.join(skillsDir, slug, "SKILL.md");
|
|
117
|
+
const metaPath = path.join(skillsDir, slug, "meta.json");
|
|
118
|
+
if (!fs.existsSync(skillPath)) {
|
|
119
|
+
skipped++;
|
|
120
|
+
continue;
|
|
121
|
+
}
|
|
122
|
+
try {
|
|
123
|
+
const body = await readFile(skillPath, "utf-8");
|
|
124
|
+
let name = slug;
|
|
125
|
+
let description = "";
|
|
126
|
+
let topics = [];
|
|
127
|
+
let tags = [];
|
|
128
|
+
let version = "";
|
|
129
|
+
let author = "";
|
|
130
|
+
// Read optional meta.json
|
|
131
|
+
if (fs.existsSync(metaPath)) {
|
|
132
|
+
try {
|
|
133
|
+
const meta = JSON.parse(await readFile(metaPath, "utf-8"));
|
|
134
|
+
name = meta.name ?? slug;
|
|
135
|
+
description = meta.description ?? "";
|
|
136
|
+
topics = meta.topics ?? [];
|
|
137
|
+
tags = meta.tags ?? [];
|
|
138
|
+
version = meta.version ?? "";
|
|
139
|
+
author = meta.author ?? "";
|
|
140
|
+
}
|
|
141
|
+
catch {
|
|
142
|
+
// non-fatal
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
// Extract name from first heading if not from meta
|
|
146
|
+
if (name === slug) {
|
|
147
|
+
const firstLine = body.split("\n").find((l) => l.startsWith("# "));
|
|
148
|
+
if (firstLine)
|
|
149
|
+
name = firstLine.replace(/^#\s+/, "").trim();
|
|
150
|
+
}
|
|
151
|
+
await hubPost("/agent-skills", {
|
|
152
|
+
slug,
|
|
153
|
+
name,
|
|
154
|
+
description: description || null,
|
|
155
|
+
topics,
|
|
156
|
+
body,
|
|
157
|
+
source: `file://${skillPath}`,
|
|
158
|
+
author: author || os.userInfo().username,
|
|
159
|
+
version: version || null,
|
|
160
|
+
tags,
|
|
161
|
+
}, cfg);
|
|
162
|
+
imported++;
|
|
163
|
+
spinner.text = `Imported: ${slug}`;
|
|
164
|
+
}
|
|
165
|
+
catch (e) {
|
|
166
|
+
const err = e;
|
|
167
|
+
// 409 = slug exists — skip
|
|
168
|
+
if (err.message.includes("409")) {
|
|
169
|
+
skipped++;
|
|
170
|
+
continue;
|
|
171
|
+
}
|
|
172
|
+
errors++;
|
|
173
|
+
spinner.text = `Error: ${slug} — ${err.message.slice(0, 80)}`;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
if (errors > 0) {
|
|
177
|
+
spinner.warn(`Done: ${imported} imported, ${skipped} skipped, ${errors} errors`);
|
|
178
|
+
}
|
|
179
|
+
else {
|
|
180
|
+
spinner.succeed(`Done: ${imported} imported, ${skipped} skipped`);
|
|
181
|
+
}
|
|
182
|
+
log.blank();
|
|
183
|
+
log.dim("Try: synap skill suggest <topic> — to search skills");
|
|
184
|
+
log.dim(" synap skill get <slug> — to view a skill");
|
|
185
|
+
}
|
|
186
|
+
//# sourceMappingURL=skills-commands.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skills-commands.js","sourceRoot":"","sources":["../../src/commands/skills-commands.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { type BaseOpts } from "./data.js";
|
|
2
|
+
export interface SkillOpts extends BaseOpts {
|
|
3
|
+
session?: string;
|
|
4
|
+
workspace?: string;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Gather context for a session:
|
|
8
|
+
* 1. Query /entities/recall from the pod (semantic search in pod KG)
|
|
9
|
+
* 2. Read local CLAUDE.md if it exists
|
|
10
|
+
* 3. Read .claude/kg-verify if it exists
|
|
11
|
+
* Returns a markdown context report and updates the session with it.
|
|
12
|
+
*/
|
|
13
|
+
export declare function gatherContext(opts: SkillOpts & {
|
|
14
|
+
session: string;
|
|
15
|
+
}): Promise<void>;
|
|
16
|
+
/**
|
|
17
|
+
* Run the project's type-check + test gate and store the result on the session.
|
|
18
|
+
* The AI reads CLAUDE.md to find the right commands; this function accepts them
|
|
19
|
+
* explicitly so the AI can pass exactly what to run.
|
|
20
|
+
*
|
|
21
|
+
* Usage: synap skill verify-code --session <id> --workspace <id> --cmd "pnpm type-check"
|
|
22
|
+
*/
|
|
23
|
+
export declare function verifyCode(opts: SkillOpts & {
|
|
24
|
+
session: string;
|
|
25
|
+
cmd?: string;
|
|
26
|
+
}): Promise<void>;
|