@soleri/forge 5.11.0 → 5.12.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/facades/forge.facade.js +3 -3
- package/dist/facades/forge.facade.js.map +1 -1
- package/dist/lib.d.ts +2 -2
- package/dist/lib.js +1 -1
- package/dist/lib.js.map +1 -1
- package/dist/scaffolder.js +137 -20
- package/dist/scaffolder.js.map +1 -1
- package/dist/templates/agents-md.d.ts +5 -0
- package/dist/templates/agents-md.js +33 -0
- package/dist/templates/agents-md.js.map +1 -0
- package/dist/templates/entry-point.js +15 -2
- package/dist/templates/entry-point.js.map +1 -1
- package/dist/templates/package-json.js +7 -0
- package/dist/templates/package-json.js.map +1 -1
- package/dist/templates/readme.js +80 -27
- package/dist/templates/readme.js.map +1 -1
- package/dist/templates/setup-script.d.ts +1 -1
- package/dist/templates/setup-script.js +135 -53
- package/dist/templates/setup-script.js.map +1 -1
- package/dist/templates/skills.d.ts +0 -7
- package/dist/templates/skills.js +0 -21
- package/dist/templates/skills.js.map +1 -1
- package/dist/templates/telegram-agent.d.ts +6 -0
- package/dist/templates/telegram-agent.js +212 -0
- package/dist/templates/telegram-agent.js.map +1 -0
- package/dist/templates/telegram-bot.d.ts +6 -0
- package/dist/templates/telegram-bot.js +450 -0
- package/dist/templates/telegram-bot.js.map +1 -0
- package/dist/templates/telegram-config.d.ts +6 -0
- package/dist/templates/telegram-config.js +81 -0
- package/dist/templates/telegram-config.js.map +1 -0
- package/dist/templates/telegram-supervisor.d.ts +6 -0
- package/dist/templates/telegram-supervisor.js +148 -0
- package/dist/templates/telegram-supervisor.js.map +1 -0
- package/dist/types.d.ts +13 -5
- package/dist/types.js +7 -1
- package/dist/types.js.map +1 -1
- package/package.json +1 -1
- package/src/__tests__/scaffolder.test.ts +62 -0
- package/src/facades/forge.facade.ts +3 -3
- package/src/lib.ts +2 -1
- package/src/scaffolder.ts +170 -28
- package/src/templates/agents-md.ts +35 -0
- package/src/templates/entry-point.ts +15 -2
- package/src/templates/package-json.ts +7 -0
- package/src/templates/readme.ts +89 -27
- package/src/templates/setup-script.ts +141 -54
- package/src/templates/skills.ts +0 -23
- package/src/templates/telegram-agent.ts +214 -0
- package/src/templates/telegram-bot.ts +452 -0
- package/src/templates/telegram-config.ts +83 -0
- package/src/templates/telegram-supervisor.ts +150 -0
- package/src/types.ts +9 -2
package/dist/templates/readme.js
CHANGED
|
@@ -2,10 +2,81 @@
|
|
|
2
2
|
* Generate a README.md for the scaffolded agent.
|
|
3
3
|
*/
|
|
4
4
|
export function generateReadme(config) {
|
|
5
|
+
const setupTarget = config.setupTarget ?? 'claude';
|
|
6
|
+
const claudeSetup = setupTarget === 'claude' || setupTarget === 'both';
|
|
7
|
+
const codexSetup = setupTarget === 'codex' || setupTarget === 'both';
|
|
5
8
|
const domainRows = config.domains
|
|
6
9
|
.map((d) => `| ${d} | *Ready for knowledge capture* |`)
|
|
7
10
|
.join('\n');
|
|
8
11
|
const principleLines = config.principles.map((p) => `- ${p}`).join('\n');
|
|
12
|
+
const quickStartSession = claudeSetup && codexSetup
|
|
13
|
+
? 'Start a new Claude Code or Codex session, then say:'
|
|
14
|
+
: claudeSetup
|
|
15
|
+
? 'Start a new Claude Code session, then say:'
|
|
16
|
+
: 'Start a new Codex session, then say:';
|
|
17
|
+
const prerequisites = [
|
|
18
|
+
'- **Node.js 18+** — `node --version` to check',
|
|
19
|
+
...(claudeSetup ? ['- **Claude Code** — Anthropic CLI (`claude` command)'] : []),
|
|
20
|
+
...(codexSetup ? ['- **Codex** — desktop/CLI with `~/.codex/config.toml`'] : []),
|
|
21
|
+
].join('\n');
|
|
22
|
+
const helloFlow = [
|
|
23
|
+
`- ${config.name} returns its persona, principles, and tool recommendations`,
|
|
24
|
+
...(claudeSetup ? [`- Claude can adopt the ${config.name} persona for the session`] : []),
|
|
25
|
+
...(claudeSetup
|
|
26
|
+
? [`- ${config.name} can inject/check CLAUDE.md integration when requested`]
|
|
27
|
+
: []),
|
|
28
|
+
...(codexSetup
|
|
29
|
+
? ['- Codex uses project-level AGENTS.md guidance and local skills for routing']
|
|
30
|
+
: []),
|
|
31
|
+
].join('\n');
|
|
32
|
+
const manualSetupBlocks = [
|
|
33
|
+
...(claudeSetup
|
|
34
|
+
? [
|
|
35
|
+
[
|
|
36
|
+
'### Claude Code',
|
|
37
|
+
'',
|
|
38
|
+
'Add this to `~/.claude/settings.json` under `mcpServers`:',
|
|
39
|
+
'',
|
|
40
|
+
'```json',
|
|
41
|
+
'{',
|
|
42
|
+
' "mcpServers": {',
|
|
43
|
+
` "${config.id}": {`,
|
|
44
|
+
' "command": "node",',
|
|
45
|
+
' "args": ["dist/index.js"],',
|
|
46
|
+
` "cwd": "/absolute/path/to/${config.id}"`,
|
|
47
|
+
' }',
|
|
48
|
+
' }',
|
|
49
|
+
'}',
|
|
50
|
+
'```',
|
|
51
|
+
].join('\n'),
|
|
52
|
+
]
|
|
53
|
+
: []),
|
|
54
|
+
...(codexSetup
|
|
55
|
+
? [
|
|
56
|
+
[
|
|
57
|
+
'### Codex',
|
|
58
|
+
'',
|
|
59
|
+
'Add this to `~/.codex/config.toml`:',
|
|
60
|
+
'',
|
|
61
|
+
'```toml',
|
|
62
|
+
`[mcp_servers.${config.id}]`,
|
|
63
|
+
'command = "node"',
|
|
64
|
+
`args = ["/absolute/path/to/${config.id}/dist/index.js"]`,
|
|
65
|
+
'```',
|
|
66
|
+
].join('\n'),
|
|
67
|
+
]
|
|
68
|
+
: []),
|
|
69
|
+
].join('\n\n');
|
|
70
|
+
const skillsLead = claudeSetup && codexSetup
|
|
71
|
+
? `${config.name} ships with 17 structured workflow skills. In Claude Code they are invocable via \`/<skill-name>\`; in Codex they are available via generated AGENTS.md + local skill files.`
|
|
72
|
+
: claudeSetup
|
|
73
|
+
? `${config.name} ships with 17 structured workflow skills, invocable via \`/<skill-name>\` in Claude Code:`
|
|
74
|
+
: `${config.name} ships with 17 structured workflow skills, available via generated AGENTS.md + local skill files in Codex:`;
|
|
75
|
+
const skillsInstallNote = claudeSetup && codexSetup
|
|
76
|
+
? 'Skills are installed to `~/.claude/commands/` and `~/.codex/skills/` during setup. Run `./scripts/setup.sh` to install or reinstall.'
|
|
77
|
+
: claudeSetup
|
|
78
|
+
? 'Skills are installed to `~/.claude/commands/` during setup. Run `./scripts/setup.sh` to install or reinstall.'
|
|
79
|
+
: 'Skills are installed to `~/.codex/skills/` during setup. Run `./scripts/setup.sh` to install or reinstall.';
|
|
9
80
|
return `# ${config.name} — ${config.role}
|
|
10
81
|
|
|
11
82
|
${config.description}
|
|
@@ -31,10 +102,10 @@ cd ${config.id}
|
|
|
31
102
|
npm install
|
|
32
103
|
npm run build
|
|
33
104
|
|
|
34
|
-
# 2.
|
|
105
|
+
# 2. Run setup
|
|
35
106
|
./scripts/setup.sh
|
|
36
107
|
|
|
37
|
-
# 3.
|
|
108
|
+
# 3. ${quickStartSession}
|
|
38
109
|
# "Hello, ${config.name}!"
|
|
39
110
|
\`\`\`
|
|
40
111
|
|
|
@@ -42,33 +113,15 @@ That's it. ${config.name} will activate, check your setup, and offer to configur
|
|
|
42
113
|
|
|
43
114
|
## Prerequisites
|
|
44
115
|
|
|
45
|
-
|
|
46
|
-
- **Claude Code** — Anthropic's CLI for Claude (\`claude\` command)
|
|
116
|
+
${prerequisites}
|
|
47
117
|
|
|
48
118
|
## What Happens When You Say "Hello, ${config.name}!"
|
|
49
119
|
|
|
50
|
-
|
|
51
|
-
2. Claude adopts the ${config.name} persona for the rest of the session
|
|
52
|
-
3. ${config.name} checks if your project has CLAUDE.md integration
|
|
53
|
-
4. If not, it offers to inject its configuration (facades table, intent detection, knowledge protocol)
|
|
120
|
+
${helloFlow}
|
|
54
121
|
|
|
55
122
|
## Manual Setup (if setup.sh doesn't work)
|
|
56
123
|
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
\`\`\`json
|
|
60
|
-
{
|
|
61
|
-
"mcpServers": {
|
|
62
|
-
"${config.id}": {
|
|
63
|
-
"command": "node",
|
|
64
|
-
"args": ["dist/index.js"],
|
|
65
|
-
"cwd": "/absolute/path/to/${config.id}"
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
\`\`\`
|
|
70
|
-
|
|
71
|
-
Then restart Claude Code.
|
|
124
|
+
${manualSetupBlocks}
|
|
72
125
|
|
|
73
126
|
## Domains
|
|
74
127
|
|
|
@@ -82,7 +135,7 @@ ${principleLines}
|
|
|
82
135
|
|
|
83
136
|
## Built-in Skills
|
|
84
137
|
|
|
85
|
-
${
|
|
138
|
+
${skillsLead}
|
|
86
139
|
|
|
87
140
|
**Development Workflows:**
|
|
88
141
|
|
|
@@ -116,7 +169,7 @@ ${config.name} ships with 17 structured workflow skills, invocable via \`/<skill
|
|
|
116
169
|
| \`/onboard-me\` | Instant project knowledge tour for newcomers |
|
|
117
170
|
| \`/health-check\` | Vault maintenance — duplicates, contradictions, stale entries |
|
|
118
171
|
|
|
119
|
-
|
|
172
|
+
${skillsInstallNote}
|
|
120
173
|
|
|
121
174
|
## Features
|
|
122
175
|
|
|
@@ -172,8 +225,8 @@ Use \`llm_status\` to check provider availability and key pool health.
|
|
|
172
225
|
|
|
173
226
|
### Activating and Deactivating
|
|
174
227
|
|
|
175
|
-
- **"Hello, ${config.name}!"** — Activate the persona.
|
|
176
|
-
- **"Goodbye, ${config.name}!"** — Deactivate
|
|
228
|
+
- **"Hello, ${config.name}!"** — Activate the persona. Your active client session adopts ${config.name}'s identity, principles, and tool access.
|
|
229
|
+
- **"Goodbye, ${config.name}!"** — Deactivate and return to default assistant behavior.
|
|
177
230
|
|
|
178
231
|
### Daily Workflow
|
|
179
232
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"readme.js","sourceRoot":"","sources":["../../src/templates/readme.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,MAAmB;IAChD,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO;SAC9B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,oCAAoC,CAAC;SACtD,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,MAAM,cAAc,GAAG,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEzE,
|
|
1
|
+
{"version":3,"file":"readme.js","sourceRoot":"","sources":["../../src/templates/readme.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { AgentConfig } from '../types.js';
|
|
2
2
|
/**
|
|
3
3
|
* Generate a scripts/setup.sh for the scaffolded agent.
|
|
4
|
-
* Handles: Node.js check, build,
|
|
4
|
+
* Handles: Node.js check, build, and host-specific MCP registration.
|
|
5
5
|
*/
|
|
6
6
|
export declare function generateSetupScript(config: AgentConfig): string;
|
|
@@ -1,50 +1,21 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Generate a scripts/setup.sh for the scaffolded agent.
|
|
3
|
-
* Handles: Node.js check, build,
|
|
3
|
+
* Handles: Node.js check, build, and host-specific MCP registration.
|
|
4
4
|
*/
|
|
5
5
|
export function generateSetupScript(config) {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
echo "=== ${config.name} Setup ==="
|
|
13
|
-
echo ""
|
|
14
|
-
|
|
15
|
-
# Check Node.js
|
|
16
|
-
if ! command -v node &>/dev/null; then
|
|
17
|
-
echo "Error: Node.js is not installed. Install Node.js 18+ first."
|
|
18
|
-
exit 1
|
|
19
|
-
fi
|
|
20
|
-
|
|
21
|
-
NODE_VERSION=$(node -v | sed 's/v//' | cut -d. -f1)
|
|
22
|
-
if [ "$NODE_VERSION" -lt 18 ]; then
|
|
23
|
-
echo "Error: Node.js 18+ required (found v$(node -v))."
|
|
24
|
-
exit 1
|
|
25
|
-
fi
|
|
26
|
-
echo "[ok] Node.js $(node -v)"
|
|
27
|
-
|
|
28
|
-
# Check if built
|
|
29
|
-
if [ ! -f "$AGENT_DIR/dist/index.js" ]; then
|
|
30
|
-
echo ""
|
|
31
|
-
echo "Building ${config.name}..."
|
|
32
|
-
cd "$AGENT_DIR"
|
|
33
|
-
npm install
|
|
34
|
-
npm run build
|
|
35
|
-
echo "[ok] Built successfully"
|
|
36
|
-
else
|
|
37
|
-
echo "[ok] Already built"
|
|
38
|
-
fi
|
|
39
|
-
|
|
6
|
+
const setupTarget = config.setupTarget ?? 'claude';
|
|
7
|
+
const claudeSetup = setupTarget === 'claude' || setupTarget === 'both';
|
|
8
|
+
const codexSetup = setupTarget === 'codex' || setupTarget === 'both';
|
|
9
|
+
const hostLabel = claudeSetup && codexSetup ? 'Claude Code + Codex' : claudeSetup ? 'Claude Code' : 'Codex';
|
|
10
|
+
const claudeSection = claudeSetup
|
|
11
|
+
? `
|
|
40
12
|
# Check Claude Code
|
|
41
13
|
if ! command -v claude &>/dev/null; then
|
|
42
14
|
echo ""
|
|
43
15
|
echo "Warning: 'claude' command not found."
|
|
44
16
|
echo "Install Claude Code first: https://docs.anthropic.com/en/docs/claude-code"
|
|
45
17
|
echo ""
|
|
46
|
-
echo "After installing,
|
|
47
|
-
echo "(see README.md for the JSON config)"
|
|
18
|
+
echo "After installing, re-run this setup script."
|
|
48
19
|
exit 1
|
|
49
20
|
fi
|
|
50
21
|
echo "[ok] Claude Code found"
|
|
@@ -52,14 +23,13 @@ echo "[ok] Claude Code found"
|
|
|
52
23
|
# Register MCP server with Claude Code
|
|
53
24
|
echo ""
|
|
54
25
|
echo "Registering ${config.name} with Claude Code..."
|
|
55
|
-
|
|
56
26
|
claude mcp add --scope user "$AGENT_NAME" -- node "$AGENT_DIR/dist/index.js"
|
|
57
|
-
echo "[ok] Registered ${config.name} as MCP server"
|
|
27
|
+
echo "[ok] Registered ${config.name} as MCP server (Claude Code)"
|
|
58
28
|
|
|
59
29
|
# Configure PreCompact hook for session capture
|
|
60
30
|
SETTINGS_FILE="$HOME/.claude/settings.json"
|
|
61
31
|
echo ""
|
|
62
|
-
echo "Configuring session capture hook..."
|
|
32
|
+
echo "Configuring Claude session capture hook..."
|
|
63
33
|
|
|
64
34
|
if [ ! -d "$HOME/.claude" ]; then
|
|
65
35
|
mkdir -p "$HOME/.claude"
|
|
@@ -83,7 +53,6 @@ else
|
|
|
83
53
|
if grep -q "PreCompact" "$SETTINGS_FILE" 2>/dev/null; then
|
|
84
54
|
echo "[ok] PreCompact hook already configured — skipping"
|
|
85
55
|
else
|
|
86
|
-
# Use node to safely merge hook into existing settings
|
|
87
56
|
node -e "
|
|
88
57
|
const fs = require('fs');
|
|
89
58
|
const settings = JSON.parse(fs.readFileSync('$SETTINGS_FILE', 'utf-8'));
|
|
@@ -105,7 +74,7 @@ COMMANDS_DIR="$HOME/.claude/commands"
|
|
|
105
74
|
|
|
106
75
|
if [ -d "$SKILLS_DIR" ]; then
|
|
107
76
|
echo ""
|
|
108
|
-
echo "Installing skills..."
|
|
77
|
+
echo "Installing skills for Claude Code..."
|
|
109
78
|
mkdir -p "$COMMANDS_DIR"
|
|
110
79
|
skill_installed=0
|
|
111
80
|
skill_skipped=0
|
|
@@ -122,11 +91,13 @@ if [ -d "$SKILLS_DIR" ]; then
|
|
|
122
91
|
skill_installed=$((skill_installed + 1))
|
|
123
92
|
fi
|
|
124
93
|
done
|
|
125
|
-
echo "[ok]
|
|
94
|
+
echo "[ok] Claude skills: $skill_installed installed, $skill_skipped already present"
|
|
126
95
|
fi
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
96
|
+
`
|
|
97
|
+
: '';
|
|
98
|
+
const hookPackSection = claudeSetup && config.hookPacks?.length
|
|
99
|
+
? `
|
|
100
|
+
# Install hook packs to global ~/.claude/
|
|
130
101
|
AGENT_CLAUDE_DIR="$AGENT_DIR/.claude"
|
|
131
102
|
GLOBAL_CLAUDE_DIR="$HOME/.claude"
|
|
132
103
|
|
|
@@ -148,16 +119,127 @@ if [ -d "$AGENT_CLAUDE_DIR" ]; then
|
|
|
148
119
|
done
|
|
149
120
|
echo "[ok] Hooks: $installed installed, $skipped already present"
|
|
150
121
|
fi
|
|
151
|
-
|
|
152
122
|
`
|
|
153
|
-
: ''
|
|
154
|
-
|
|
123
|
+
: '';
|
|
124
|
+
const codexSection = codexSetup
|
|
125
|
+
? `
|
|
126
|
+
# Register MCP server with Codex
|
|
155
127
|
echo ""
|
|
156
|
-
echo "
|
|
157
|
-
|
|
158
|
-
|
|
128
|
+
echo "Registering ${config.name} with Codex..."
|
|
129
|
+
mkdir -p "$HOME/.codex"
|
|
130
|
+
CODEX_CONFIG="$HOME/.codex/config.toml"
|
|
131
|
+
AGENT_DIST="$AGENT_DIR/dist/index.js"
|
|
132
|
+
|
|
133
|
+
CODEX_CONFIG="$CODEX_CONFIG" AGENT_NAME="$AGENT_NAME" AGENT_DIST="$AGENT_DIST" node <<'NODE'
|
|
134
|
+
const fs = require('node:fs');
|
|
135
|
+
const path = process.env.CODEX_CONFIG;
|
|
136
|
+
const agentName = process.env.AGENT_NAME;
|
|
137
|
+
const distPath = process.env.AGENT_DIST;
|
|
138
|
+
|
|
139
|
+
let content = '';
|
|
140
|
+
if (fs.existsSync(path)) {
|
|
141
|
+
content = fs.readFileSync(path, 'utf-8');
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
const header = '[mcp_servers.' + agentName + ']';
|
|
145
|
+
const block = header + '\\ncommand = "node"\\nargs = ["' + distPath + '"]\\n';
|
|
146
|
+
const start = content.indexOf(header);
|
|
147
|
+
|
|
148
|
+
if (start === -1) {
|
|
149
|
+
const trimmed = content.trimEnd();
|
|
150
|
+
content = trimmed.length === 0 ? block + '\\n' : trimmed + '\\n\\n' + block + '\\n';
|
|
151
|
+
} else {
|
|
152
|
+
const afterHeader = start + header.length;
|
|
153
|
+
const tail = content.slice(afterHeader);
|
|
154
|
+
const nextSectionOffset = tail.search(/\\n\\[[^\\]]+\\]/);
|
|
155
|
+
const end = nextSectionOffset === -1 ? content.length : afterHeader + nextSectionOffset;
|
|
156
|
+
content = content.slice(0, start).trimEnd() + '\\n\\n' + block + '\\n' + content.slice(end).trimStart();
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
content = content.replace(/\\n{3,}/g, '\\n\\n');
|
|
160
|
+
fs.writeFileSync(path, content, 'utf-8');
|
|
161
|
+
NODE
|
|
162
|
+
echo "[ok] Registered ${config.name} as MCP server (Codex)"
|
|
163
|
+
|
|
164
|
+
# Install skills to ~/.codex/skills/
|
|
165
|
+
SKILLS_DIR="$AGENT_DIR/skills"
|
|
166
|
+
CODEX_SKILLS_DIR="$HOME/.codex/skills"
|
|
167
|
+
|
|
168
|
+
if [ -d "$SKILLS_DIR" ]; then
|
|
169
|
+
echo ""
|
|
170
|
+
echo "Installing skills for Codex..."
|
|
171
|
+
mkdir -p "$CODEX_SKILLS_DIR"
|
|
172
|
+
skill_installed=0
|
|
173
|
+
skill_skipped=0
|
|
174
|
+
for skill_dir in "$SKILLS_DIR"/*/; do
|
|
175
|
+
[ -d "$skill_dir" ] || continue
|
|
176
|
+
skill_file="$skill_dir/SKILL.md"
|
|
177
|
+
[ -f "$skill_file" ] || continue
|
|
178
|
+
skill_name="$(basename "$skill_dir")"
|
|
179
|
+
dest_dir="$CODEX_SKILLS_DIR/$AGENT_NAME-$skill_name"
|
|
180
|
+
dest_file="$dest_dir/SKILL.md"
|
|
181
|
+
if [ -f "$dest_file" ]; then
|
|
182
|
+
skill_skipped=$((skill_skipped + 1))
|
|
183
|
+
else
|
|
184
|
+
mkdir -p "$dest_dir"
|
|
185
|
+
cp "$skill_file" "$dest_file"
|
|
186
|
+
skill_installed=$((skill_installed + 1))
|
|
187
|
+
fi
|
|
188
|
+
done
|
|
189
|
+
echo "[ok] Codex skills: $skill_installed installed, $skill_skipped already present"
|
|
190
|
+
fi
|
|
191
|
+
`
|
|
192
|
+
: '';
|
|
193
|
+
const nextSteps = [
|
|
194
|
+
'echo ""',
|
|
195
|
+
'echo "=== Setup Complete ==="',
|
|
196
|
+
'echo ""',
|
|
197
|
+
'echo "Next:"',
|
|
198
|
+
...(claudeSetup
|
|
199
|
+
? ['echo " - Start a new Claude Code session (or restart if one is open)"']
|
|
200
|
+
: []),
|
|
201
|
+
...(codexSetup ? ['echo " - Start a new Codex session (or restart if one is open)"'] : []),
|
|
202
|
+
`echo " - Say: \\"Hello, ${config.name}!\\""`,
|
|
203
|
+
'echo ""',
|
|
204
|
+
`echo "${config.name} is ready."`,
|
|
205
|
+
].join('\n');
|
|
206
|
+
return `#!/usr/bin/env bash
|
|
207
|
+
set -euo pipefail
|
|
208
|
+
|
|
209
|
+
AGENT_DIR="$(cd "$(dirname "$0")/.." && pwd)"
|
|
210
|
+
AGENT_NAME="${config.id}"
|
|
211
|
+
|
|
212
|
+
echo "=== ${config.name} Setup (${hostLabel}) ==="
|
|
159
213
|
echo ""
|
|
160
|
-
|
|
214
|
+
|
|
215
|
+
# Check Node.js
|
|
216
|
+
if ! command -v node &>/dev/null; then
|
|
217
|
+
echo "Error: Node.js is not installed. Install Node.js 18+ first."
|
|
218
|
+
exit 1
|
|
219
|
+
fi
|
|
220
|
+
|
|
221
|
+
NODE_VERSION=$(node -v | sed 's/v//' | cut -d. -f1)
|
|
222
|
+
if [ "$NODE_VERSION" -lt 18 ]; then
|
|
223
|
+
echo "Error: Node.js 18+ required (found v$(node -v))."
|
|
224
|
+
exit 1
|
|
225
|
+
fi
|
|
226
|
+
echo "[ok] Node.js $(node -v)"
|
|
227
|
+
|
|
228
|
+
# Check if built
|
|
229
|
+
if [ ! -f "$AGENT_DIR/dist/index.js" ]; then
|
|
230
|
+
echo ""
|
|
231
|
+
echo "Building ${config.name}..."
|
|
232
|
+
cd "$AGENT_DIR"
|
|
233
|
+
npm install
|
|
234
|
+
npm run build
|
|
235
|
+
echo "[ok] Built successfully"
|
|
236
|
+
else
|
|
237
|
+
echo "[ok] Already built"
|
|
238
|
+
fi
|
|
239
|
+
${claudeSection}
|
|
240
|
+
${hookPackSection}
|
|
241
|
+
${codexSection}
|
|
242
|
+
${nextSteps}
|
|
161
243
|
`;
|
|
162
244
|
}
|
|
163
245
|
//# sourceMappingURL=setup-script.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup-script.js","sourceRoot":"","sources":["../../src/templates/setup-script.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,MAAmB;IACrD,
|
|
1
|
+
{"version":3,"file":"setup-script.js","sourceRoot":"","sources":["../../src/templates/setup-script.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,MAAmB;IACrD,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,IAAI,QAAQ,CAAC;IACnD,MAAM,WAAW,GAAG,WAAW,KAAK,QAAQ,IAAI,WAAW,KAAK,MAAM,CAAC;IACvE,MAAM,UAAU,GAAG,WAAW,KAAK,OAAO,IAAI,WAAW,KAAK,MAAM,CAAC;IACrE,MAAM,SAAS,GACb,WAAW,IAAI,UAAU,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC;IAE5F,MAAM,aAAa,GAAG,WAAW;QAC/B,CAAC,CAAC;;;;;;;;;;;;;;oBAcc,MAAM,CAAC,IAAI;;wBAEP,MAAM,CAAC,IAAI;;;;;;;;;;;;;;;;;;uFAkBoD,MAAM,CAAC,EAAE;;;;;;;;;;;;;;;;;;qFAkBX,MAAM,CAAC,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiC7F;QACG,CAAC,CAAC,EAAE,CAAC;IAEP,MAAM,eAAe,GACnB,WAAW,IAAI,MAAM,CAAC,SAAS,EAAE,MAAM;QACrC,CAAC,CAAC;;;;;;;;;;;;;;;;;;;;;;;CAuBP;QACK,CAAC,CAAC,EAAE,CAAC;IAET,MAAM,YAAY,GAAG,UAAU;QAC7B,CAAC,CAAC;;;oBAGc,MAAM,CAAC,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;wBAkCP,MAAM,CAAC,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6BlC;QACG,CAAC,CAAC,EAAE,CAAC;IAEP,MAAM,SAAS,GAAG;QAChB,SAAS;QACT,+BAA+B;QAC/B,SAAS;QACT,cAAc;QACd,GAAG,CAAC,WAAW;YACb,CAAC,CAAC,CAAC,wEAAwE,CAAC;YAC5E,CAAC,CAAC,EAAE,CAAC;QACP,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,kEAAkE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3F,4BAA4B,MAAM,CAAC,IAAI,OAAO;QAC9C,SAAS;QACT,SAAS,MAAM,CAAC,IAAI,aAAa;KAClC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEb,OAAO;;;;cAIK,MAAM,CAAC,EAAE;;YAEX,MAAM,CAAC,IAAI,WAAW,SAAS;;;;;;;;;;;;;;;;;;;mBAmBxB,MAAM,CAAC,IAAI;;;;;;;;EAQ5B,aAAa;EACb,eAAe;EACf,YAAY;EACZ,SAAS;CACV,CAAC;AACF,CAAC"}
|
|
@@ -9,10 +9,3 @@ import type { AgentConfig } from '../types.js';
|
|
|
9
9
|
* - Engine-adapted skills: YOUR_AGENT_core → {config.id}_core
|
|
10
10
|
*/
|
|
11
11
|
export declare function generateSkills(config: AgentConfig): Array<[string, string]>;
|
|
12
|
-
/**
|
|
13
|
-
* List all bundled skill names with their descriptions (from YAML frontmatter).
|
|
14
|
-
*/
|
|
15
|
-
export declare function listSkillDescriptions(): Array<{
|
|
16
|
-
name: string;
|
|
17
|
-
description: string;
|
|
18
|
-
}>;
|
package/dist/templates/skills.js
CHANGED
|
@@ -57,25 +57,4 @@ export function generateSkills(config) {
|
|
|
57
57
|
}
|
|
58
58
|
return files;
|
|
59
59
|
}
|
|
60
|
-
/**
|
|
61
|
-
* List all bundled skill names with their descriptions (from YAML frontmatter).
|
|
62
|
-
*/
|
|
63
|
-
export function listSkillDescriptions() {
|
|
64
|
-
let skillFiles;
|
|
65
|
-
try {
|
|
66
|
-
skillFiles = readdirSync(SKILLS_DIR).filter((f) => f.endsWith('.md'));
|
|
67
|
-
}
|
|
68
|
-
catch {
|
|
69
|
-
return [];
|
|
70
|
-
}
|
|
71
|
-
return skillFiles.map((file) => {
|
|
72
|
-
const content = readFileSync(join(SKILLS_DIR, file), 'utf-8');
|
|
73
|
-
const nameMatch = content.match(/^name:\s*(.+)$/m);
|
|
74
|
-
const descMatch = content.match(/^description:\s*"?(.+?)"?\s*$/m);
|
|
75
|
-
return {
|
|
76
|
-
name: nameMatch?.[1]?.trim() ?? file.replace('.md', ''),
|
|
77
|
-
description: descMatch?.[1]?.trim() ?? '',
|
|
78
|
-
};
|
|
79
|
-
});
|
|
80
|
-
}
|
|
81
60
|
//# sourceMappingURL=skills.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skills.js","sourceRoot":"","sources":["../../src/templates/skills.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACpD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAGzC,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC1D,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;AAEnD,wFAAwF;AACxF,MAAM,qBAAqB,GAAG,IAAI,GAAG,CAAC;IACpC,eAAe;IACf,eAAe;IACf,aAAa;IACb,gBAAgB;IAChB,iBAAiB;IACjB,eAAe;IACf,cAAc;IACd,mBAAmB;IACnB,YAAY;IACZ,eAAe;IACf,gBAAgB;IAChB,sBAAsB;IACtB,yBAAyB;IACzB,eAAe;IACf,iBAAiB;IACjB,gCAAgC;IAChC,eAAe;CAChB,CAAC,CAAC;AAEH;;;;;;;;GAQG;AACH,MAAM,UAAU,cAAc,CAAC,MAAmB;IAChD,MAAM,KAAK,GAA4B,EAAE,CAAC;IAC1C,IAAI,UAAoB,CAAC;IAEzB,IAAI,CAAC;QACH,UAAU,GAAG,WAAW,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;IACxE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;IAED,2DAA2D;IAC3D,gEAAgE;IAChE,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,uCAAuC;IAE5G,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;QAC9B,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAE1C,IAAI,aAAa,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;YACnD,SAAS;QACX,CAAC;QAED,IAAI,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;QAE5D,IAAI,qBAAqB,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;YACzC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,kBAAkB,EAAE,GAAG,MAAM,CAAC,EAAE,OAAO,CAAC,CAAC;QACrE,CAAC;QAED,KAAK,CAAC,IAAI,CAAC,CAAC,UAAU,SAAS,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC;IACxD,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC
|
|
1
|
+
{"version":3,"file":"skills.js","sourceRoot":"","sources":["../../src/templates/skills.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACpD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAGzC,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC1D,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;AAEnD,wFAAwF;AACxF,MAAM,qBAAqB,GAAG,IAAI,GAAG,CAAC;IACpC,eAAe;IACf,eAAe;IACf,aAAa;IACb,gBAAgB;IAChB,iBAAiB;IACjB,eAAe;IACf,cAAc;IACd,mBAAmB;IACnB,YAAY;IACZ,eAAe;IACf,gBAAgB;IAChB,sBAAsB;IACtB,yBAAyB;IACzB,eAAe;IACf,iBAAiB;IACjB,gCAAgC;IAChC,eAAe;CAChB,CAAC,CAAC;AAEH;;;;;;;;GAQG;AACH,MAAM,UAAU,cAAc,CAAC,MAAmB;IAChD,MAAM,KAAK,GAA4B,EAAE,CAAC;IAC1C,IAAI,UAAoB,CAAC;IAEzB,IAAI,CAAC;QACH,UAAU,GAAG,WAAW,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;IACxE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;IAED,2DAA2D;IAC3D,gEAAgE;IAChE,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,uCAAuC;IAE5G,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;QAC9B,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAE1C,IAAI,aAAa,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;YACnD,SAAS;QACX,CAAC;QAED,IAAI,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;QAE5D,IAAI,qBAAqB,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;YACzC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,kBAAkB,EAAE,GAAG,MAAM,CAAC,EAAE,OAAO,CAAC,CAAC;QACrE,CAAC;QAED,KAAK,CAAC,IAAI,CAAC,CAAC,UAAU,SAAS,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC;IACxD,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Template: Telegram agent loop — wires @soleri/core agent loop to MCP tools.
|
|
3
|
+
* Generated by @soleri/forge for agents with Telegram transport.
|
|
4
|
+
*/
|
|
5
|
+
import type { AgentConfig } from '../types.js';
|
|
6
|
+
export declare function generateTelegramAgent(config: AgentConfig): string;
|