@agentled/cli 0.6.7 → 0.7.1
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/onboarding.d.ts +18 -4
- package/dist/commands/onboarding.js +233 -49
- package/dist/commands/onboarding.js.map +1 -1
- package/dist/utils/agentled-home-content.d.ts +30 -0
- package/dist/utils/agentled-home-content.js +414 -0
- package/dist/utils/agentled-home-content.js.map +1 -0
- package/dist/utils/home-bootstrap.d.ts +44 -0
- package/dist/utils/home-bootstrap.js +133 -0
- package/dist/utils/home-bootstrap.js.map +1 -0
- package/dist/utils/knowledge-probe.d.ts +23 -0
- package/dist/utils/knowledge-probe.js +57 -0
- package/dist/utils/knowledge-probe.js.map +1 -0
- package/dist/utils/mcp-config.d.ts +27 -0
- package/dist/utils/mcp-config.js +190 -0
- package/dist/utils/mcp-config.js.map +1 -0
- package/dist/utils/skills.d.ts +16 -8
- package/dist/utils/skills.js +14 -28
- package/dist/utils/skills.js.map +1 -1
- package/dist/utils/version-check.d.ts +24 -0
- package/dist/utils/version-check.js +77 -0
- package/dist/utils/version-check.js.map +1 -0
- package/llms.txt +12 -1
- package/package.json +3 -3
- package/skills/agentled/SKILL.md +16 -1
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Read `knowledge.company.profile` (and `.products`) from the workspace KG.
|
|
3
|
+
*
|
|
4
|
+
* Used by `agentled setup` to decide whether to prompt the user for company
|
|
5
|
+
* information or skip straight to "workspace already configured". We probe
|
|
6
|
+
* only the new keys; legacy `.company` / `company.offering` are not checked
|
|
7
|
+
* — we focus on new clients and keep this clean.
|
|
8
|
+
*
|
|
9
|
+
* Uses the typed `AgentledApiClient.getKnowledgeText` surface. Failures are
|
|
10
|
+
* non-fatal: setup must not break on a network blip or a missing endpoint.
|
|
11
|
+
*/
|
|
12
|
+
async function fetchKnowledgeText(client, key) {
|
|
13
|
+
try {
|
|
14
|
+
const res = (await client.getKnowledgeText(key));
|
|
15
|
+
if (!res)
|
|
16
|
+
return null;
|
|
17
|
+
// The API returns `content` for upsert/get parity, but tolerate `text`
|
|
18
|
+
// as a defensive fallback for older response shapes.
|
|
19
|
+
const value = res.content ?? res.text ?? null;
|
|
20
|
+
return typeof value === 'string' ? value : null;
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
export async function probeCompanyKnowledge(client) {
|
|
27
|
+
try {
|
|
28
|
+
const [profile, products] = await Promise.all([
|
|
29
|
+
fetchKnowledgeText(client, 'knowledge.company.profile'),
|
|
30
|
+
fetchKnowledgeText(client, 'knowledge.company.products'),
|
|
31
|
+
]);
|
|
32
|
+
const profilePresent = typeof profile === 'string' && profile.trim().length > 0;
|
|
33
|
+
const productsPresent = typeof products === 'string' && products.trim().length > 0;
|
|
34
|
+
return {
|
|
35
|
+
profilePresent,
|
|
36
|
+
productsPresent,
|
|
37
|
+
profilePreview: profilePresent && profile ? profile.trim().slice(0, 120) : undefined,
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
catch (err) {
|
|
41
|
+
return {
|
|
42
|
+
profilePresent: false,
|
|
43
|
+
productsPresent: false,
|
|
44
|
+
error: err?.message ?? String(err),
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
export function summarizeKnowledgeProbe(r) {
|
|
49
|
+
if (r.error)
|
|
50
|
+
return `Could not read workspace knowledge (${r.error}). You can run \`agentled workspace company-profile\` later.`;
|
|
51
|
+
if (r.profilePresent) {
|
|
52
|
+
const preview = r.profilePreview ? ` — "${r.profilePreview}${r.profilePreview.length >= 120 ? '…' : ''}"` : '';
|
|
53
|
+
return `Workspace already configured (knowledge.company.profile is set${preview}).`;
|
|
54
|
+
}
|
|
55
|
+
return 'Workspace knowledge is empty — collecting company profile now.';
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=knowledge-probe.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"knowledge-probe.js","sourceRoot":"","sources":["../../src/utils/knowledge-probe.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAcH,KAAK,UAAU,kBAAkB,CAAC,MAAyB,EAAE,GAAW;IACpE,IAAI,CAAC;QACD,MAAM,GAAG,GAAG,CAAC,MAAM,MAAM,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAA6D,CAAC;QAC7G,IAAI,CAAC,GAAG;YAAE,OAAO,IAAI,CAAC;QACtB,uEAAuE;QACvE,qDAAqD;QACrD,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC;QAC9C,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;IACpD,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,IAAI,CAAC;IAChB,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,MAAyB;IACjE,IAAI,CAAC;QACD,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YAC1C,kBAAkB,CAAC,MAAM,EAAE,2BAA2B,CAAC;YACvD,kBAAkB,CAAC,MAAM,EAAE,4BAA4B,CAAC;SAC3D,CAAC,CAAC;QAEH,MAAM,cAAc,GAAG,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;QAChF,MAAM,eAAe,GAAG,OAAO,QAAQ,KAAK,QAAQ,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;QAEnF,OAAO;YACH,cAAc;YACd,eAAe;YACf,cAAc,EAAE,cAAc,IAAI,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS;SACvF,CAAC;IACN,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAChB,OAAO;YACH,cAAc,EAAE,KAAK;YACrB,eAAe,EAAE,KAAK;YACtB,KAAK,EAAE,GAAG,EAAE,OAAO,IAAI,MAAM,CAAC,GAAG,CAAC;SACrC,CAAC;IACN,CAAC;AACL,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,CAAuB;IAC3D,IAAI,CAAC,CAAC,KAAK;QAAE,OAAO,uCAAuC,CAAC,CAAC,KAAK,8DAA8D,CAAC;IACjI,IAAI,CAAC,CAAC,cAAc,EAAE,CAAC;QACnB,MAAM,OAAO,GAAG,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,cAAc,GAAG,CAAC,CAAC,cAAc,CAAC,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/G,OAAO,iEAAiE,OAAO,IAAI,CAAC;IACxF,CAAC;IACD,OAAO,gEAAgE,CAAC;AAC5E,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP client detection and config writing for `agentled setup`.
|
|
3
|
+
*
|
|
4
|
+
* Lifted from agentled-mcp-server/src/setup.ts so the CLI orchestrates the
|
|
5
|
+
* full onboarding without depending on the mcp-server's setup flag (which
|
|
6
|
+
* is being deprecated in favor of `agentled setup`).
|
|
7
|
+
*
|
|
8
|
+
* Detects Claude Code, Codex, Claude Desktop, Cursor, Windsurf and writes
|
|
9
|
+
* the AgentLed MCP server entry into the appropriate config location.
|
|
10
|
+
*/
|
|
11
|
+
export type McpClient = 'claude-code' | 'claude-desktop' | 'codex' | 'cursor' | 'windsurf' | 'unknown';
|
|
12
|
+
export interface McpConfigureResult {
|
|
13
|
+
client: McpClient;
|
|
14
|
+
success: boolean;
|
|
15
|
+
/** Where the config was written (or attempted) */
|
|
16
|
+
configPath: string | null;
|
|
17
|
+
/** Manual instructions to print if auto-config failed */
|
|
18
|
+
fallbackHint?: string;
|
|
19
|
+
}
|
|
20
|
+
export declare function getClientLabel(client: McpClient): string;
|
|
21
|
+
export declare function detectMcpClient(): McpClient;
|
|
22
|
+
/**
|
|
23
|
+
* Auto-detect the user's MCP client and register the AgentLed MCP server.
|
|
24
|
+
* Returns a result describing what happened, including a fallback hint when
|
|
25
|
+
* the client is unknown or the config write failed.
|
|
26
|
+
*/
|
|
27
|
+
export declare function configureMcp(apiKey: string, baseUrl: string): Promise<McpConfigureResult>;
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP client detection and config writing for `agentled setup`.
|
|
3
|
+
*
|
|
4
|
+
* Lifted from agentled-mcp-server/src/setup.ts so the CLI orchestrates the
|
|
5
|
+
* full onboarding without depending on the mcp-server's setup flag (which
|
|
6
|
+
* is being deprecated in favor of `agentled setup`).
|
|
7
|
+
*
|
|
8
|
+
* Detects Claude Code, Codex, Claude Desktop, Cursor, Windsurf and writes
|
|
9
|
+
* the AgentLed MCP server entry into the appropriate config location.
|
|
10
|
+
*/
|
|
11
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
12
|
+
import { join, dirname } from 'node:path';
|
|
13
|
+
import { homedir } from 'node:os';
|
|
14
|
+
import { spawn } from 'node:child_process';
|
|
15
|
+
export function getClientLabel(client) {
|
|
16
|
+
switch (client) {
|
|
17
|
+
case 'claude-code': return 'Claude Code';
|
|
18
|
+
case 'claude-desktop': return 'Claude Desktop';
|
|
19
|
+
case 'codex': return 'Codex';
|
|
20
|
+
case 'cursor': return 'Cursor';
|
|
21
|
+
case 'windsurf': return 'Windsurf';
|
|
22
|
+
default: return 'Unknown';
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
export function detectMcpClient() {
|
|
26
|
+
if (existsSync(join(homedir(), '.claude')))
|
|
27
|
+
return 'claude-code';
|
|
28
|
+
if (existsSync(join(homedir(), '.codex')))
|
|
29
|
+
return 'codex';
|
|
30
|
+
const desktop = getClaudeDesktopConfigPath();
|
|
31
|
+
if (desktop && existsSync(dirname(desktop)))
|
|
32
|
+
return 'claude-desktop';
|
|
33
|
+
if (existsSync(join(homedir(), '.cursor')))
|
|
34
|
+
return 'cursor';
|
|
35
|
+
if (existsSync(join(homedir(), '.windsurf')))
|
|
36
|
+
return 'windsurf';
|
|
37
|
+
return 'unknown';
|
|
38
|
+
}
|
|
39
|
+
function getClaudeDesktopConfigPath() {
|
|
40
|
+
if (process.platform === 'darwin') {
|
|
41
|
+
return join(homedir(), 'Library', 'Application Support', 'Claude', 'claude_desktop_config.json');
|
|
42
|
+
}
|
|
43
|
+
if (process.platform === 'win32') {
|
|
44
|
+
return join(process.env.APPDATA || '', 'Claude', 'claude_desktop_config.json');
|
|
45
|
+
}
|
|
46
|
+
return join(homedir(), '.config', 'Claude', 'claude_desktop_config.json');
|
|
47
|
+
}
|
|
48
|
+
function getMcpJsonPath(client) {
|
|
49
|
+
if (client === 'cursor')
|
|
50
|
+
return join(homedir(), '.cursor', 'mcp.json');
|
|
51
|
+
if (client === 'windsurf')
|
|
52
|
+
return join(homedir(), '.windsurf', 'mcp.json');
|
|
53
|
+
return null;
|
|
54
|
+
}
|
|
55
|
+
function configureClaudeCode(apiKey, baseUrl) {
|
|
56
|
+
return new Promise(resolve => {
|
|
57
|
+
try {
|
|
58
|
+
// Server name must precede -e/--env (Claude Code 2.1+ parser quirk).
|
|
59
|
+
const child = spawn('claude', [
|
|
60
|
+
'mcp', 'add',
|
|
61
|
+
'--transport', 'stdio',
|
|
62
|
+
'--scope', 'user',
|
|
63
|
+
'agentled',
|
|
64
|
+
'-e', `AGENTLED_API_KEY=${apiKey}`,
|
|
65
|
+
...(baseUrl !== 'https://www.agentled.app' ? ['-e', `AGENTLED_URL=${baseUrl}`] : []),
|
|
66
|
+
'--', 'npx', '-y', '@agentled/mcp-server',
|
|
67
|
+
], { stdio: 'inherit' });
|
|
68
|
+
child.on('close', code => resolve(code === 0));
|
|
69
|
+
child.on('error', () => resolve(false));
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
resolve(false);
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
function configureCodex(apiKey, baseUrl) {
|
|
77
|
+
return new Promise(resolve => {
|
|
78
|
+
try {
|
|
79
|
+
const child = spawn('codex', [
|
|
80
|
+
'mcp', 'add', 'agentled',
|
|
81
|
+
'--env', `AGENTLED_API_KEY=${apiKey}`,
|
|
82
|
+
...(baseUrl !== 'https://www.agentled.app' ? ['--env', `AGENTLED_URL=${baseUrl}`] : []),
|
|
83
|
+
'--', 'npx', '-y', '@agentled/mcp-server',
|
|
84
|
+
], { stdio: 'inherit' });
|
|
85
|
+
child.on('close', code => resolve(code === 0));
|
|
86
|
+
child.on('error', () => resolve(false));
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
resolve(false);
|
|
90
|
+
}
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
function writeMcpJsonConfig(configPath, apiKey, baseUrl) {
|
|
94
|
+
try {
|
|
95
|
+
let config = {};
|
|
96
|
+
if (existsSync(configPath)) {
|
|
97
|
+
config = JSON.parse(readFileSync(configPath, 'utf-8'));
|
|
98
|
+
}
|
|
99
|
+
if (!config.mcpServers)
|
|
100
|
+
config.mcpServers = {};
|
|
101
|
+
const env = { AGENTLED_API_KEY: apiKey };
|
|
102
|
+
if (baseUrl !== 'https://www.agentled.app')
|
|
103
|
+
env.AGENTLED_URL = baseUrl;
|
|
104
|
+
config.mcpServers.agentled = {
|
|
105
|
+
command: 'npx',
|
|
106
|
+
args: ['-y', '@agentled/mcp-server'],
|
|
107
|
+
env,
|
|
108
|
+
};
|
|
109
|
+
mkdirSync(dirname(configPath), { recursive: true });
|
|
110
|
+
writeFileSync(configPath, JSON.stringify(config, null, 2) + '\n');
|
|
111
|
+
return true;
|
|
112
|
+
}
|
|
113
|
+
catch {
|
|
114
|
+
return false;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
function manualSnippet(apiKey, baseUrl) {
|
|
118
|
+
const envArgs = baseUrl !== 'https://www.agentled.app'
|
|
119
|
+
? `-e AGENTLED_API_KEY=${apiKey} -e AGENTLED_URL=${baseUrl}`
|
|
120
|
+
: `-e AGENTLED_API_KEY=${apiKey}`;
|
|
121
|
+
const lines = [
|
|
122
|
+
'Could not auto-detect your MCP client. Add manually:',
|
|
123
|
+
'',
|
|
124
|
+
'Claude Code:',
|
|
125
|
+
` claude mcp add --transport stdio --scope user agentled ${envArgs} -- npx -y @agentled/mcp-server`,
|
|
126
|
+
'',
|
|
127
|
+
'Codex / Cursor / Windsurf — add to your MCP config JSON:',
|
|
128
|
+
' {',
|
|
129
|
+
' "agentled": {',
|
|
130
|
+
' "command": "npx",',
|
|
131
|
+
' "args": ["-y", "@agentled/mcp-server"],',
|
|
132
|
+
` "env": { "AGENTLED_API_KEY": "${apiKey}"${baseUrl !== 'https://www.agentled.app' ? `, "AGENTLED_URL": "${baseUrl}"` : ''} }`,
|
|
133
|
+
' }',
|
|
134
|
+
' }',
|
|
135
|
+
];
|
|
136
|
+
return lines.join('\n');
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Auto-detect the user's MCP client and register the AgentLed MCP server.
|
|
140
|
+
* Returns a result describing what happened, including a fallback hint when
|
|
141
|
+
* the client is unknown or the config write failed.
|
|
142
|
+
*/
|
|
143
|
+
export async function configureMcp(apiKey, baseUrl) {
|
|
144
|
+
const client = detectMcpClient();
|
|
145
|
+
if (client === 'claude-code') {
|
|
146
|
+
const ok = await configureClaudeCode(apiKey, baseUrl);
|
|
147
|
+
return {
|
|
148
|
+
client,
|
|
149
|
+
success: ok,
|
|
150
|
+
configPath: ok ? '~/.claude.json (via `claude mcp add`)' : null,
|
|
151
|
+
fallbackHint: ok ? undefined : manualSnippet(apiKey, baseUrl),
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
if (client === 'codex') {
|
|
155
|
+
const ok = await configureCodex(apiKey, baseUrl);
|
|
156
|
+
return {
|
|
157
|
+
client,
|
|
158
|
+
success: ok,
|
|
159
|
+
configPath: ok ? '~/.codex/config (via `codex mcp add`)' : null,
|
|
160
|
+
fallbackHint: ok ? undefined : manualSnippet(apiKey, baseUrl),
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
if (client === 'claude-desktop') {
|
|
164
|
+
const path = getClaudeDesktopConfigPath();
|
|
165
|
+
const ok = path ? writeMcpJsonConfig(path, apiKey, baseUrl) : false;
|
|
166
|
+
return {
|
|
167
|
+
client,
|
|
168
|
+
success: ok,
|
|
169
|
+
configPath: path,
|
|
170
|
+
fallbackHint: ok ? undefined : manualSnippet(apiKey, baseUrl),
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
if (client === 'cursor' || client === 'windsurf') {
|
|
174
|
+
const path = getMcpJsonPath(client);
|
|
175
|
+
const ok = path ? writeMcpJsonConfig(path, apiKey, baseUrl) : false;
|
|
176
|
+
return {
|
|
177
|
+
client,
|
|
178
|
+
success: ok,
|
|
179
|
+
configPath: path,
|
|
180
|
+
fallbackHint: ok ? undefined : manualSnippet(apiKey, baseUrl),
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
return {
|
|
184
|
+
client: 'unknown',
|
|
185
|
+
success: false,
|
|
186
|
+
configPath: null,
|
|
187
|
+
fallbackHint: manualSnippet(apiKey, baseUrl),
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
//# sourceMappingURL=mcp-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-config.js","sourceRoot":"","sources":["../../src/utils/mcp-config.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/skills.d.ts
CHANGED
|
@@ -12,6 +12,14 @@
|
|
|
12
12
|
* - Reads a `version:` frontmatter field from each `SKILL.md`
|
|
13
13
|
* - Leaves newer or hand-edited skills alone (unless --force)
|
|
14
14
|
* - Reports status so we can print a one-line summary after `auth login`
|
|
15
|
+
*
|
|
16
|
+
* Targets:
|
|
17
|
+
* - Claude Code / Claude Desktop → `~/.claude/skills/` (global) or
|
|
18
|
+
* `./.claude/skills/` (project) via the `global` option.
|
|
19
|
+
* - Codex → `~/.codex/instructions/` via `targetDir` override (set by the
|
|
20
|
+
* `agentled setup` orchestrator after detecting a Codex install).
|
|
21
|
+
* - Cursor / Windsurf → not auto-installed (no native skills surface);
|
|
22
|
+
* the orchestrator skips this step and prints a hint.
|
|
15
23
|
*/
|
|
16
24
|
export type SkillInstallOutcome = 'installed' | 'updated' | 'up-to-date' | 'newer-local' | 'hand-edited' | 'forced';
|
|
17
25
|
export interface SkillInstallResult {
|
|
@@ -26,17 +34,17 @@ export interface InstallSkillsOptions {
|
|
|
26
34
|
global?: boolean;
|
|
27
35
|
/** overwrite regardless of version comparison or local edits */
|
|
28
36
|
force?: boolean;
|
|
37
|
+
/**
|
|
38
|
+
* Override the target directory entirely. Used by the orchestrator to
|
|
39
|
+
* route Codex installs to `~/.codex/instructions/` and (in future) any
|
|
40
|
+
* other client-specific skill location.
|
|
41
|
+
*/
|
|
42
|
+
targetDir?: string;
|
|
29
43
|
}
|
|
30
|
-
/**
|
|
31
|
-
* Locate the `skills/` directory that ships with @agentled/cli.
|
|
32
|
-
*
|
|
33
|
-
* When running from source (`node dist/index.js`) the layout is:
|
|
34
|
-
* packages/cli/dist/utils/skills.js → packages/cli/skills/…
|
|
35
|
-
* When installed globally via npm, the package layout is the same relative
|
|
36
|
-
* structure (`dist/utils/skills.js` → `skills/`).
|
|
37
|
-
*/
|
|
38
44
|
export declare function resolveBundledSkillsDir(): string;
|
|
39
45
|
export declare function getSkillsTargetDir(global: boolean): string;
|
|
46
|
+
/** Codex's skill/instruction directory — separate from Claude's. */
|
|
47
|
+
export declare function getCodexInstructionsDir(): string;
|
|
40
48
|
export declare function installSkills(options?: InstallSkillsOptions): SkillInstallResult[];
|
|
41
49
|
export declare function describeSkillsInstall(results: SkillInstallResult[], targetDir: string): string;
|
|
42
50
|
/**
|
package/dist/utils/skills.js
CHANGED
|
@@ -12,22 +12,21 @@
|
|
|
12
12
|
* - Reads a `version:` frontmatter field from each `SKILL.md`
|
|
13
13
|
* - Leaves newer or hand-edited skills alone (unless --force)
|
|
14
14
|
* - Reports status so we can print a one-line summary after `auth login`
|
|
15
|
+
*
|
|
16
|
+
* Targets:
|
|
17
|
+
* - Claude Code / Claude Desktop → `~/.claude/skills/` (global) or
|
|
18
|
+
* `./.claude/skills/` (project) via the `global` option.
|
|
19
|
+
* - Codex → `~/.codex/instructions/` via `targetDir` override (set by the
|
|
20
|
+
* `agentled setup` orchestrator after detecting a Codex install).
|
|
21
|
+
* - Cursor / Windsurf → not auto-installed (no native skills surface);
|
|
22
|
+
* the orchestrator skips this step and prints a hint.
|
|
15
23
|
*/
|
|
16
24
|
import { existsSync, readFileSync, mkdirSync, readdirSync, statSync, cpSync } from 'node:fs';
|
|
17
25
|
import { join, dirname, resolve } from 'node:path';
|
|
18
26
|
import { fileURLToPath } from 'node:url';
|
|
19
27
|
import { homedir } from 'node:os';
|
|
20
|
-
/**
|
|
21
|
-
* Locate the `skills/` directory that ships with @agentled/cli.
|
|
22
|
-
*
|
|
23
|
-
* When running from source (`node dist/index.js`) the layout is:
|
|
24
|
-
* packages/cli/dist/utils/skills.js → packages/cli/skills/…
|
|
25
|
-
* When installed globally via npm, the package layout is the same relative
|
|
26
|
-
* structure (`dist/utils/skills.js` → `skills/`).
|
|
27
|
-
*/
|
|
28
28
|
export function resolveBundledSkillsDir() {
|
|
29
29
|
const here = fileURLToPath(import.meta.url);
|
|
30
|
-
// dist/utils/skills.js → package root is two levels up
|
|
31
30
|
const pkgRoot = resolve(dirname(here), '..', '..');
|
|
32
31
|
return join(pkgRoot, 'skills');
|
|
33
32
|
}
|
|
@@ -36,14 +35,13 @@ export function getSkillsTargetDir(global) {
|
|
|
36
35
|
? join(homedir(), '.claude', 'skills')
|
|
37
36
|
: join(process.cwd(), '.claude', 'skills');
|
|
38
37
|
}
|
|
39
|
-
/**
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
38
|
+
/** Codex's skill/instruction directory — separate from Claude's. */
|
|
39
|
+
export function getCodexInstructionsDir() {
|
|
40
|
+
return join(homedir(), '.codex', 'instructions');
|
|
41
|
+
}
|
|
43
42
|
function parseSkillVersion(skillMdPath) {
|
|
44
43
|
try {
|
|
45
44
|
const content = readFileSync(skillMdPath, 'utf-8');
|
|
46
|
-
// Only inspect frontmatter (between the first two --- delimiters)
|
|
47
45
|
const fmMatch = content.match(/^---\n([\s\S]*?)\n---/);
|
|
48
46
|
if (!fmMatch)
|
|
49
47
|
return null;
|
|
@@ -54,10 +52,6 @@ function parseSkillVersion(skillMdPath) {
|
|
|
54
52
|
return null;
|
|
55
53
|
}
|
|
56
54
|
}
|
|
57
|
-
/**
|
|
58
|
-
* Compare two semver-ish version strings. Returns -1, 0, or 1.
|
|
59
|
-
* Handles missing prereleases by treating undefined segments as 0.
|
|
60
|
-
*/
|
|
61
55
|
function compareVersions(a, b) {
|
|
62
56
|
const parse = (v) => v.replace(/^v/, '').split('.').map(n => parseInt(n, 10) || 0);
|
|
63
57
|
const [a1, a2 = 0, a3 = 0] = parse(a);
|
|
@@ -70,14 +64,6 @@ function compareVersions(a, b) {
|
|
|
70
64
|
return a3 < b3 ? -1 : 1;
|
|
71
65
|
return 0;
|
|
72
66
|
}
|
|
73
|
-
/**
|
|
74
|
-
* Recursively hash-compare two directories by content. Returns true if the
|
|
75
|
-
* byte contents of every file match (directory structure + file bytes).
|
|
76
|
-
*
|
|
77
|
-
* Used to detect hand-edited installs: if the installed version matches the
|
|
78
|
-
* bundled version but the bytes differ, the user (or a prior agent session)
|
|
79
|
-
* has customised the skill and we should not overwrite without --force.
|
|
80
|
-
*/
|
|
81
67
|
function directoriesIdentical(a, b) {
|
|
82
68
|
try {
|
|
83
69
|
const aEntries = readdirSync(a).sort();
|
|
@@ -115,7 +101,7 @@ export function installSkills(options = {}) {
|
|
|
115
101
|
if (!existsSync(sourceDir)) {
|
|
116
102
|
throw new Error(`Bundled skills directory not found at ${sourceDir}`);
|
|
117
103
|
}
|
|
118
|
-
const targetBase = getSkillsTargetDir(options.global ?? false);
|
|
104
|
+
const targetBase = options.targetDir ?? getSkillsTargetDir(options.global ?? false);
|
|
119
105
|
const results = [];
|
|
120
106
|
const skills = readdirSync(sourceDir, { withFileTypes: true })
|
|
121
107
|
.filter(d => d.isDirectory())
|
|
@@ -199,7 +185,7 @@ export function summarizeForLoginBanner(results, targetDir) {
|
|
|
199
185
|
const updatable = results.filter(r => r.outcome === 'up-to-date' && r.installedVersion && r.bundledVersion && compareVersions(r.installedVersion, r.bundledVersion) < 0);
|
|
200
186
|
if (fresh.length > 0) {
|
|
201
187
|
const names = fresh.map(r => `${r.skill} v${r.bundledVersion}`).join(', ');
|
|
202
|
-
return `Installed
|
|
188
|
+
return `Installed Agentled skill: ${names} → ${targetDir}`;
|
|
203
189
|
}
|
|
204
190
|
if (stale.length > 0) {
|
|
205
191
|
const r = stale[0];
|
package/dist/utils/skills.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skills.js","sourceRoot":"","sources":["../../src/utils/skills.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"skills.js","sourceRoot":"","sources":["../../src/utils/skills.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Best-effort "new version available" check against the npm registry.
|
|
3
|
+
*
|
|
4
|
+
* Compares the locally-installed @agentled/cli version (from package.json)
|
|
5
|
+
* against the latest published on npm and prints a one-line warning if the
|
|
6
|
+
* user is behind. Never blocks setup on failure — a flaky network or
|
|
7
|
+
* registry should not prevent first-time onboarding.
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Read the version field from this package's own package.json. Returns
|
|
11
|
+
* '0.0.0-dev' as a fallback so a missing/unreadable file doesn't crash setup.
|
|
12
|
+
*/
|
|
13
|
+
export declare function getInstalledCliVersion(): string;
|
|
14
|
+
export interface VersionCheckResult {
|
|
15
|
+
installed: string;
|
|
16
|
+
latest: string | null;
|
|
17
|
+
/** True if the registry returned a version newer than installed. */
|
|
18
|
+
outdated: boolean;
|
|
19
|
+
/** Set when the registry could not be reached or parsed. */
|
|
20
|
+
error?: string;
|
|
21
|
+
}
|
|
22
|
+
export declare function checkCliVersion(): Promise<VersionCheckResult>;
|
|
23
|
+
/** One-line summary suitable for the setup banner. Returns null if there is nothing to say. */
|
|
24
|
+
export declare function summarizeVersionCheck(r: VersionCheckResult): string | null;
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Best-effort "new version available" check against the npm registry.
|
|
3
|
+
*
|
|
4
|
+
* Compares the locally-installed @agentled/cli version (from package.json)
|
|
5
|
+
* against the latest published on npm and prints a one-line warning if the
|
|
6
|
+
* user is behind. Never blocks setup on failure — a flaky network or
|
|
7
|
+
* registry should not prevent first-time onboarding.
|
|
8
|
+
*/
|
|
9
|
+
import { readFileSync } from 'node:fs';
|
|
10
|
+
import { dirname, resolve } from 'node:path';
|
|
11
|
+
import { fileURLToPath } from 'node:url';
|
|
12
|
+
const REGISTRY_URL = 'https://registry.npmjs.org/@agentled/cli/latest';
|
|
13
|
+
const TIMEOUT_MS = 3000;
|
|
14
|
+
/**
|
|
15
|
+
* Read the version field from this package's own package.json. Returns
|
|
16
|
+
* '0.0.0-dev' as a fallback so a missing/unreadable file doesn't crash setup.
|
|
17
|
+
*/
|
|
18
|
+
export function getInstalledCliVersion() {
|
|
19
|
+
try {
|
|
20
|
+
const here = fileURLToPath(import.meta.url);
|
|
21
|
+
// dist/utils/version-check.js → package root is two levels up
|
|
22
|
+
const pkgRoot = resolve(dirname(here), '..', '..');
|
|
23
|
+
const pkg = JSON.parse(readFileSync(resolve(pkgRoot, 'package.json'), 'utf-8'));
|
|
24
|
+
return typeof pkg.version === 'string' ? pkg.version : '0.0.0-dev';
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
return '0.0.0-dev';
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
/** Compare two semver-ish strings: -1, 0, 1. Prerelease suffixes are ignored. */
|
|
31
|
+
function compareVersions(a, b) {
|
|
32
|
+
const parse = (v) => v.replace(/^v/, '').split('-')[0].split('.').map(n => parseInt(n, 10) || 0);
|
|
33
|
+
const [a1, a2 = 0, a3 = 0] = parse(a);
|
|
34
|
+
const [b1, b2 = 0, b3 = 0] = parse(b);
|
|
35
|
+
if (a1 !== b1)
|
|
36
|
+
return a1 < b1 ? -1 : 1;
|
|
37
|
+
if (a2 !== b2)
|
|
38
|
+
return a2 < b2 ? -1 : 1;
|
|
39
|
+
if (a3 !== b3)
|
|
40
|
+
return a3 < b3 ? -1 : 1;
|
|
41
|
+
return 0;
|
|
42
|
+
}
|
|
43
|
+
export async function checkCliVersion() {
|
|
44
|
+
const installed = getInstalledCliVersion();
|
|
45
|
+
const ac = new AbortController();
|
|
46
|
+
const timer = setTimeout(() => ac.abort(), TIMEOUT_MS);
|
|
47
|
+
try {
|
|
48
|
+
const res = await fetch(REGISTRY_URL, { signal: ac.signal });
|
|
49
|
+
if (!res.ok) {
|
|
50
|
+
return { installed, latest: null, outdated: false, error: `HTTP ${res.status}` };
|
|
51
|
+
}
|
|
52
|
+
const data = (await res.json());
|
|
53
|
+
const latest = typeof data.version === 'string' ? data.version : null;
|
|
54
|
+
if (!latest) {
|
|
55
|
+
return { installed, latest: null, outdated: false, error: 'No version field in registry response' };
|
|
56
|
+
}
|
|
57
|
+
return {
|
|
58
|
+
installed,
|
|
59
|
+
latest,
|
|
60
|
+
outdated: compareVersions(installed, latest) < 0,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
catch (err) {
|
|
64
|
+
return { installed, latest: null, outdated: false, error: err?.message ?? String(err) };
|
|
65
|
+
}
|
|
66
|
+
finally {
|
|
67
|
+
clearTimeout(timer);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
/** One-line summary suitable for the setup banner. Returns null if there is nothing to say. */
|
|
71
|
+
export function summarizeVersionCheck(r) {
|
|
72
|
+
if (r.outdated && r.latest) {
|
|
73
|
+
return `New @agentled/cli version available: v${r.installed} → v${r.latest}. Update with: npm install -g @agentled/cli@latest`;
|
|
74
|
+
}
|
|
75
|
+
return null;
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=version-check.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version-check.js","sourceRoot":"","sources":["../../src/utils/version-check.ts"],"names":[],"mappings":"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"}
|
package/llms.txt
CHANGED
|
@@ -4,9 +4,20 @@
|
|
|
4
4
|
|
|
5
5
|
## Quick Start
|
|
6
6
|
|
|
7
|
+
One command: browser sign-in → workspace folder → MCP auto-config → skill install → knowledge probe.
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
npx @agentled/cli setup
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
Global home is `~/.agentled/` (config + on-demand examples). Per-workspace artifacts live in `agentled_<slug>/` in the current directory. Best-practice patterns: https://github.com/Agentled/agentic-ops.
|
|
14
|
+
|
|
15
|
+
## Components (à-la-carte)
|
|
16
|
+
|
|
7
17
|
```bash
|
|
8
18
|
npm i -g @agentled/cli
|
|
9
|
-
agentled auth login
|
|
19
|
+
agentled auth login # browser auth + workspace selection + skill install
|
|
20
|
+
agentled init # scaffold agentled_<slug>/
|
|
10
21
|
agentled auth current
|
|
11
22
|
agentled workflows list
|
|
12
23
|
```
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agentled/cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.7.1",
|
|
4
4
|
"description": "CLI for Agentled — manage workflows, apps, and knowledge from the command line. Zero context-window cost for AI agents.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -47,10 +47,10 @@
|
|
|
47
47
|
"homepage": "https://www.agentled.app",
|
|
48
48
|
"repository": {
|
|
49
49
|
"type": "git",
|
|
50
|
-
"url": "https://github.com/agentled/
|
|
50
|
+
"url": "https://github.com/agentled/mcp-server"
|
|
51
51
|
},
|
|
52
52
|
"bugs": {
|
|
53
|
-
"url": "https://
|
|
53
|
+
"url": "https://www.agentled.ai/en/contact-us"
|
|
54
54
|
},
|
|
55
55
|
"license": "MIT"
|
|
56
56
|
}
|
package/skills/agentled/SKILL.md
CHANGED
|
@@ -114,6 +114,21 @@ agentled best-practices # summary + link to agentic-
|
|
|
114
114
|
|
|
115
115
|
Full patterns are maintained publicly at https://github.com/agentled/agentic-ops — the CLI ships a mirrored copy, see `agentled examples`. Scaffolds are preflight-clean pipeline JSON skeletons; start from one instead of writing from scratch.
|
|
116
116
|
|
|
117
|
+
## Business metrics vs ROI (must not be conflated)
|
|
118
|
+
|
|
119
|
+
Treat these as **two separate surfaces**:
|
|
120
|
+
|
|
121
|
+
- **Business metrics (`pipeline.analyticsConfig`)** = customer/workflow outcome stats extracted from step outputs (volume, conversions, approvals, rates, SLA-ish KPIs), aggregated into dashboard business-metric snapshots.
|
|
122
|
+
- **ROI (`pipeline.metadata.roi`)** = economic assumptions + rollups (minutes saved per unit, hourly rate, benchmark units/week, measured vs benchmark mode) used for ROI/time-saved reporting.
|
|
123
|
+
|
|
124
|
+
### Required wording for agent outputs
|
|
125
|
+
|
|
126
|
+
- If only `analyticsConfig` changes: say **"business metrics configured"**.
|
|
127
|
+
- If only `metadata.roi` changes: say **"ROI assumptions configured"**.
|
|
128
|
+
- If both change: report each section separately; never label analytics metrics as ROI metrics.
|
|
129
|
+
|
|
130
|
+
This distinction applies to MCP and CLI users equally because both surfaces call the same external workflow API and return the same pipeline shape.
|
|
131
|
+
|
|
117
132
|
## Common invalid patterns to avoid
|
|
118
133
|
|
|
119
134
|
Agents routinely invent step types that sound plausible. The API **silently strips unknown top-level fields** and stores the step, so you get a 201 Created on a workflow that will never execute. Watch for these:
|
|
@@ -453,7 +468,7 @@ AI steps can optionally specify a model and provider via the `agent` field:
|
|
|
453
468
|
| `minimax` | `minimax-m2.5` |
|
|
454
469
|
| `bytedance` | `doubao-seed-1.6-flash`, `seed-2.0-mini`, `doubao-seed-1.8-beta` |
|
|
455
470
|
| `perplexity` | `sonar-pro`, `sonar`, `sonar-reasoning-pro`, `sonar-reasoning` |
|
|
456
|
-
| `xai` | `grok-4
|
|
471
|
+
| `xai` | `grok-4.3`, `grok-3-mini` |
|
|
457
472
|
|
|
458
473
|
> **Tip:** Use `list_models` to get the full up-to-date list of supported model IDs. Use the internal model IDs (e.g., `claude-4-6-sonnet`), NOT the raw API model IDs (e.g., `claude-sonnet-4-6`). Using unsupported model IDs will result in a validation error.
|
|
459
474
|
|