@soleri/forge 5.10.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.
Files changed (53) hide show
  1. package/dist/facades/forge.facade.js +3 -3
  2. package/dist/facades/forge.facade.js.map +1 -1
  3. package/dist/lib.d.ts +2 -2
  4. package/dist/lib.js +1 -1
  5. package/dist/lib.js.map +1 -1
  6. package/dist/scaffolder.js +137 -20
  7. package/dist/scaffolder.js.map +1 -1
  8. package/dist/templates/agents-md.d.ts +5 -0
  9. package/dist/templates/agents-md.js +33 -0
  10. package/dist/templates/agents-md.js.map +1 -0
  11. package/dist/templates/entry-point.js +15 -2
  12. package/dist/templates/entry-point.js.map +1 -1
  13. package/dist/templates/package-json.js +7 -0
  14. package/dist/templates/package-json.js.map +1 -1
  15. package/dist/templates/readme.js +80 -27
  16. package/dist/templates/readme.js.map +1 -1
  17. package/dist/templates/setup-script.d.ts +1 -1
  18. package/dist/templates/setup-script.js +135 -53
  19. package/dist/templates/setup-script.js.map +1 -1
  20. package/dist/templates/skills.d.ts +0 -7
  21. package/dist/templates/skills.js +1 -24
  22. package/dist/templates/skills.js.map +1 -1
  23. package/dist/templates/telegram-agent.d.ts +6 -0
  24. package/dist/templates/telegram-agent.js +212 -0
  25. package/dist/templates/telegram-agent.js.map +1 -0
  26. package/dist/templates/telegram-bot.d.ts +6 -0
  27. package/dist/templates/telegram-bot.js +450 -0
  28. package/dist/templates/telegram-bot.js.map +1 -0
  29. package/dist/templates/telegram-config.d.ts +6 -0
  30. package/dist/templates/telegram-config.js +81 -0
  31. package/dist/templates/telegram-config.js.map +1 -0
  32. package/dist/templates/telegram-supervisor.d.ts +6 -0
  33. package/dist/templates/telegram-supervisor.js +148 -0
  34. package/dist/templates/telegram-supervisor.js.map +1 -0
  35. package/dist/types.d.ts +13 -5
  36. package/dist/types.js +7 -1
  37. package/dist/types.js.map +1 -1
  38. package/package.json +1 -1
  39. package/src/__tests__/scaffolder.test.ts +62 -0
  40. package/src/facades/forge.facade.ts +3 -3
  41. package/src/lib.ts +2 -1
  42. package/src/scaffolder.ts +170 -28
  43. package/src/templates/agents-md.ts +35 -0
  44. package/src/templates/entry-point.ts +15 -2
  45. package/src/templates/package-json.ts +7 -0
  46. package/src/templates/readme.ts +89 -27
  47. package/src/templates/setup-script.ts +141 -54
  48. package/src/templates/skills.ts +0 -23
  49. package/src/templates/telegram-agent.ts +214 -0
  50. package/src/templates/telegram-bot.ts +452 -0
  51. package/src/templates/telegram-config.ts +83 -0
  52. package/src/templates/telegram-supervisor.ts +150 -0
  53. package/src/types.ts +9 -2
@@ -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. Add to Claude Code
105
+ # 2. Run setup
35
106
  ./scripts/setup.sh
36
107
 
37
- # 3. Start a new Claude Code session, then say:
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
- - **Node.js 18+** — \`node --version\` to check
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
- 1. ${config.name} returns its persona, principles, and tool recommendations
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
- Add this to \`~/.claude/settings.json\` under \`mcpServers\`:
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
- ${config.name} ships with 17 structured workflow skills, invocable via \`/<skill-name>\` in Claude Code:
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
- Skills are installed to \`~/.claude/commands/\` during setup. Run \`./scripts/setup.sh\` to install or reinstall.
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. Claude adopts ${config.name}'s identity, principles, and tool access for the session.
176
- - **"Goodbye, ${config.name}!"** — Deactivate. Claude returns to its default behavior.
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,OAAO,KAAK,MAAM,CAAC,IAAI,MAAM,MAAM,CAAC,IAAI;;EAExC,MAAM,CAAC,WAAW;;SAEX,MAAM,CAAC,IAAI;;;;EAIlB,MAAM,CAAC,IAAI;;;;;;;6EAOgE,MAAM,CAAC,IAAI;;;;;;KAMnF,MAAM,CAAC,EAAE;;;;;;;;eAQC,MAAM,CAAC,IAAI;;;aAGb,MAAM,CAAC,IAAI;;;;;;;uCAOe,MAAM,CAAC,IAAI;;KAE7C,MAAM,CAAC,IAAI;uBACO,MAAM,CAAC,IAAI;KAC7B,MAAM,CAAC,IAAI;;;;;;;;;;OAUT,MAAM,CAAC,EAAE;;;kCAGkB,MAAM,CAAC,EAAE;;;;;;;;;;;;EAYzC,UAAU;;;;EAIV,cAAc;;;;EAId,MAAM,CAAC,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAiEC,MAAM,CAAC,EAAE;;;;;;;;;;sCAUe,MAAM,CAAC,EAAE;;;;;;;;;;;;;;;cAejC,MAAM,CAAC,IAAI,8CAA8C,MAAM,CAAC,IAAI;gBAClE,MAAM,CAAC,IAAI;;;;eAIZ,MAAM,CAAC,IAAI;;yBAED,MAAM,CAAC,IAAI;;;EAGlC,MAAM,CAAC,IAAI;;;8EAGiE,MAAM,CAAC,IAAI;;;EAGvF,MAAM,CAAC,IAAI;;;+CAGkC,MAAM,CAAC,IAAI;;;EAGxD,MAAM,CAAC,IAAI;;;;;;;;2BAQc,MAAM,CAAC,IAAI;;;EAGpC,MAAM,CAAC,IAAI;;;;;;EAMX,MAAM,CAAC,IAAI;;;;;;;;;;;;;;;;EAgBX,MAAM,CAAC,IAAI;;;;0BAIa,MAAM,CAAC,IAAI;;;;;;EAMnC,MAAM,CAAC,IAAI;;;;;;;mJAOsI,MAAM,CAAC,IAAI;;;;;;;EAO5J,MAAM,CAAC,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA6CX,MAAM,CAAC,IAAI;;;;;sCAKyB,MAAM,CAAC,IAAI;;;2CAGN,MAAM,CAAC,IAAI;;;;EAIpD,MAAM,CAAC,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyCZ,CAAC;AACF,CAAC"}
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, Claude Code MCP server registration.
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, Claude Code MCP server registration.
3
+ * Handles: Node.js check, build, and host-specific MCP registration.
4
4
  */
5
5
  export function generateSetupScript(config) {
6
- return `#!/usr/bin/env bash
7
- set -euo pipefail
8
-
9
- AGENT_DIR="$(cd "$(dirname "$0")/.." && pwd)"
10
- AGENT_NAME="${config.id}"
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, add ${config.name} manually to ~/.claude/settings.json"
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] Skills: $skill_installed installed, $skill_skipped already present"
94
+ echo "[ok] Claude skills: $skill_installed installed, $skill_skipped already present"
126
95
  fi
127
-
128
- ${config.hookPacks?.length
129
- ? `# Install hook packs to global ~/.claude/
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
- : ''}echo ""
154
- echo "=== Setup Complete ==="
123
+ : '';
124
+ const codexSection = codexSetup
125
+ ? `
126
+ # Register MCP server with Codex
155
127
  echo ""
156
- echo "Next:"
157
- echo " 1. Start a new Claude Code session (or restart if one is open)"
158
- echo " 2. Say: \\"Hello, ${config.name}!\\""
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
- echo "${config.name} will activate and guide you from there."
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,OAAO;;;;cAIK,MAAM,CAAC,EAAE;;YAEX,MAAM,CAAC,IAAI;;;;;;;;;;;;;;;;;;;mBAmBJ,MAAM,CAAC,IAAI;;;;;;;;;;;;;;;gCAeE,MAAM,CAAC,IAAI;;;;;;;;oBAQvB,MAAM,CAAC,IAAI;;;wBAGP,MAAM,CAAC,IAAI;;;;;;;;;;;;;;;;;;uFAkBoD,MAAM,CAAC,EAAE;;;;;;;;;;;;;;;;;;;qFAmBX,MAAM,CAAC,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAmC5F,MAAM,CAAC,SAAS,EAAE,MAAM;QACtB,CAAC,CAAC;;;;;;;;;;;;;;;;;;;;;;;CAuBL;QACG,CAAC,CAAC,EACN;;;;;4BAK4B,MAAM,CAAC,IAAI;;QAE/B,MAAM,CAAC,IAAI;CAClB,CAAC;AACF,CAAC"}
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
- }>;
@@ -43,9 +43,7 @@ export function generateSkills(config) {
43
43
  }
44
44
  // If skills array is present, filter to only those skills.
45
45
  // undefined = include all (backward compat), [] = include none.
46
- const allowedSkills = config.skills
47
- ? new Set(config.skills)
48
- : null; // null = include all (backward compat)
46
+ const allowedSkills = config.skills ? new Set(config.skills) : null; // null = include all (backward compat)
49
47
  for (const file of skillFiles) {
50
48
  const skillName = file.replace('.md', '');
51
49
  if (allowedSkills && !allowedSkills.has(skillName)) {
@@ -59,25 +57,4 @@ export function generateSkills(config) {
59
57
  }
60
58
  return files;
61
59
  }
62
- /**
63
- * List all bundled skill names with their descriptions (from YAML frontmatter).
64
- */
65
- export function listSkillDescriptions() {
66
- let skillFiles;
67
- try {
68
- skillFiles = readdirSync(SKILLS_DIR).filter((f) => f.endsWith('.md'));
69
- }
70
- catch {
71
- return [];
72
- }
73
- return skillFiles.map((file) => {
74
- const content = readFileSync(join(SKILLS_DIR, file), 'utf-8');
75
- const nameMatch = content.match(/^name:\s*(.+)$/m);
76
- const descMatch = content.match(/^description:\s*"?(.+?)"?\s*$/m);
77
- return {
78
- name: nameMatch?.[1]?.trim() ?? file.replace('.md', ''),
79
- description: descMatch?.[1]?.trim() ?? '',
80
- };
81
- });
82
- }
83
60
  //# sourceMappingURL=skills.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"skills.js","sourceRoot":"","sources":["../../src/templates/skills.ts"],"names":[],"mappings":"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"}
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;