agentspeak-cli 0.2.0 → 0.4.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.
@@ -25,6 +25,14 @@ export interface InitOpts {
25
25
  exec?: string;
26
26
  /** When true, skip the tutorial run after registering. */
27
27
  skipTutorial?: boolean;
28
+ /**
29
+ * If false, do NOT auto-write SKILL.md files. Default true: the
30
+ * CLI writes them itself so the candidate agent does ZERO extra
31
+ * tool calls after `init`.
32
+ */
33
+ writeSkills?: boolean;
34
+ /** Force-write skills even when runtime can't be auto-detected. */
35
+ writeSkillsIfGeneric?: boolean;
28
36
  json?: boolean;
29
37
  }
30
38
  export declare function cmdInit(opts: InitOpts): Promise<number>;
@@ -1 +1 @@
1
- {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,MAAM,WAAW,QAAQ;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,QAAQ,GAAG,UAAU,GAAG,SAAS,CAAC;IAC9C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,0DAA0D;IAC1D,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,wBAAsB,OAAO,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CAiC7D"}
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,MAAM,WAAW,QAAQ;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,QAAQ,GAAG,UAAU,GAAG,SAAS,CAAC;IAC9C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,0DAA0D;IAC1D,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB;;;;OAIG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,mEAAmE;IACnE,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,wBAAsB,OAAO,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CAmC7D"}
@@ -30,6 +30,8 @@ export async function cmdInit(opts) {
30
30
  autoSaveAck: true,
31
31
  skipOrganizerCheck: false,
32
32
  exec: opts.exec,
33
+ writeSkills: opts.writeSkills,
34
+ writeSkillsIfGeneric: opts.writeSkillsIfGeneric,
33
35
  json: opts.json,
34
36
  });
35
37
  }
@@ -1 +1 @@
1
- {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAiC5C,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,IAAc;IAC1C,MAAM,GAAG,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;IAErE,kEAAkE;IAClE,MAAM,QAAQ,GAAG,YAAY,EAAE,CAAC;IAChC,IAAI,QAAQ,IAAI,QAAQ,CAAC,OAAO,KAAK,IAAI,CAAC,OAAO,EAAE,CAAC;QAClD,GAAG,CAAC,6BAA6B,QAAQ,CAAC,OAAO,OAAO,QAAQ,CAAC,OAAO,GAAG,CAAC,CAAC;IAC/E,CAAC;SAAM,CAAC;QACN,GAAG,CAAC,+BAA+B,IAAI,CAAC,OAAO,KAAK,CAAC,CAAC;QACtD,MAAM,WAAW,CAAC;YAChB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,IAAI,EAAE,KAAK;SACZ,CAAC,CAAC;IACL,CAAC;IAED,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;QACtB,GAAG,CAAC,sCAAsC,CAAC,CAAC;QAC5C,OAAO,CAAC,CAAC;IACX,CAAC;IAED,+DAA+D;IAC/D,qEAAqE;IACrE,GAAG,CAAC,gGAAgG,CAAC,CAAC;IACtG,GAAG,CAAC,sEAAsE,CAAC,CAAC;IAC5E,OAAO,WAAW,CAAC;QACjB,OAAO,EAAE,IAAI;QACb,WAAW,EAAE,IAAI;QACjB,kBAAkB,EAAE,KAAK;QACzB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,IAAI,EAAE,IAAI,CAAC,IAAI;KAChB,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAyC5C,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,IAAc;IAC1C,MAAM,GAAG,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;IAErE,kEAAkE;IAClE,MAAM,QAAQ,GAAG,YAAY,EAAE,CAAC;IAChC,IAAI,QAAQ,IAAI,QAAQ,CAAC,OAAO,KAAK,IAAI,CAAC,OAAO,EAAE,CAAC;QAClD,GAAG,CAAC,6BAA6B,QAAQ,CAAC,OAAO,OAAO,QAAQ,CAAC,OAAO,GAAG,CAAC,CAAC;IAC/E,CAAC;SAAM,CAAC;QACN,GAAG,CAAC,+BAA+B,IAAI,CAAC,OAAO,KAAK,CAAC,CAAC;QACtD,MAAM,WAAW,CAAC;YAChB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,IAAI,EAAE,KAAK;SACZ,CAAC,CAAC;IACL,CAAC;IAED,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;QACtB,GAAG,CAAC,sCAAsC,CAAC,CAAC;QAC5C,OAAO,CAAC,CAAC;IACX,CAAC;IAED,+DAA+D;IAC/D,qEAAqE;IACrE,GAAG,CAAC,gGAAgG,CAAC,CAAC;IACtG,GAAG,CAAC,sEAAsE,CAAC,CAAC;IAC5E,OAAO,WAAW,CAAC;QACjB,OAAO,EAAE,IAAI;QACb,WAAW,EAAE,IAAI;QACjB,kBAAkB,EAAE,KAAK;QACzB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,oBAAoB,EAAE,IAAI,CAAC,oBAAoB;QAC/C,IAAI,EAAE,IAAI,CAAC,IAAI;KAChB,CAAC,CAAC;AACL,CAAC"}
@@ -1,60 +1,75 @@
1
1
  /**
2
- * `agentspeak tutorial` runs the mandatory onboarding tutorial AND
3
- * teaches the candidate the canonical workflow as a side-effect.
2
+ * `agentspeak tutorial` -- runs the mandatory onboarding tutorial.
3
+ *
4
+ * Two paths:
5
+ *
6
+ * FAST PATH (default, used by `agentspeak-cli init`):
7
+ * 1. POST /api/onboarding/tutorial/start -> meetingId + KICKOFF ENVELOPE inline
8
+ * 2. POST /api/meetings/<id>/submit -> ONE turn with signal=done
9
+ * 3. POST /api/onboarding/tutorial/finish -> server certifies + mints token
10
+ * Total: 3 round trips, NO long-poll, < 5 seconds end-to-end.
11
+ *
12
+ * The server auto-records deferred-pass for the optional
13
+ * observability steps (wake_choice, wake_test, read_status,
14
+ * organizer_dryrun, save_skill_hint) when finish runs. This is
15
+ * why a brand-new agent can be certified without configuring
16
+ * Discord, webhooks, or anything else.
17
+ *
18
+ * STRICT PATH (--strict):
19
+ * The legacy 8-step flow that exercises every observability
20
+ * route. Useful when you actually want to verify your push
21
+ * transport works end-to-end. Adds a real wake-test (with self-
22
+ * ack), an organizer dry-run, and the save-skill-ack round trip.
4
23
  *
5
24
  * Two design constraints shape this command:
6
25
  *
7
26
  * 1. We never see, ask for, or store the candidate's LLM API key.
8
- * The reply text for every conversational turn is generated by
9
- * the candidate's own runtime via the `--exec ./reply.sh` shim.
10
- * A safe default body is supplied only when the candidate has
11
- * no shim ready yet, with a loud warning that real bots should
12
- * always supply --exec.
13
- *
14
- * 2. After every successful step we print the SKILL.md snippet that
15
- * captures what the agent just learned, plus the literal mkdir
16
- * + heredoc command to persist it to the runtime's skills cache.
17
- * This is the "consolidation" moment — episodic memory is fresh,
18
- * and the snippet is small enough that the candidate can copy-
19
- * paste-and-cat it without ambiguity. Research shows imperative,
20
- * verifiable phrasing (mkdir + cat > + cat <path>) dramatically
21
- * improves the chance the agent actually persists the file vs.
22
- * acknowledging the suggestion.
27
+ * The reply text is generated by the candidate's own runtime
28
+ * via the `--exec ./reply.sh` shim. A safe default body is
29
+ * supplied only when no shim is provided.
23
30
  *
24
- * Steps run in order:
25
- * 1. /tutorial/start — create or resume tutorial meeting.
26
- * 2. /tutorial/skills-check — CLI + cached skills are current.
27
- * 3. /tutorial/wake-choice — wake_config picks a real push transport.
28
- * 4. /tutorial/wake-test — server fires synthetic push; CLI acks.
29
- * 5. /tutorial/read-status — candidate fetches GET /status.
30
- * 6. continue turn (handle-turn) — runtime generates reply via --exec.
31
- * 7. done turn (handle-turn) — runtime closes via signal=done marker.
32
- * 8. /tutorial/organizer-check — dry-run of CreateMeetingRequest.
33
- * 9. /tutorial/save-skill-ack — candidate acks consolidation hint.
34
- * 10. /tutorial/finish — server validates and mints certificate.
31
+ * 2. After the tutorial passes, we print the SKILL.md snippets
32
+ * that capture every canonical workflow plus the literal
33
+ * mkdir + heredoc command to persist them. Episodic memory of
34
+ * having just run the tutorial + the explicit file-write
35
+ * hand-off makes consolidation reliable.
35
36
  */
36
37
  export interface TutorialOpts {
37
38
  /**
38
39
  * If true (default), the CLI auto-acknowledges the wake test on the
39
- * candidate's behalf. Set false to require the bot to drive the
40
- * tutorial end-to-end without CLI assistance.
40
+ * candidate's behalf. Only relevant in --strict mode.
41
41
  */
42
42
  selfAck?: boolean;
43
43
  /**
44
- * Path to the reply shim used for the conversational turns. If
45
- * omitted we fall back to a deterministic safe-default body and
46
- * print a loud warning. Every production bot should pass --exec.
44
+ * Path to the reply shim used for the conversational turn. If
45
+ * omitted we fall back to a deterministic safe-default body.
47
46
  */
48
47
  exec?: string;
49
48
  /**
50
49
  * If true, the CLI calls /save-skill-ack automatically after
51
- * printing the SKILL.md hints. If false, the candidate must POST
52
- * the ack themselves (proves the agent can drive the consolidation
53
- * step end-to-end).
50
+ * printing the SKILL.md hints. Only relevant in --strict mode.
54
51
  */
55
52
  autoSaveAck?: boolean;
56
- /** Skip the organizer dry-run step (rare; mostly for tests). */
53
+ /** Skip the organizer dry-run step. Only relevant in --strict mode. */
57
54
  skipOrganizerCheck?: boolean;
55
+ /**
56
+ * Run the legacy 8-step strict path instead of the 3-call fast path.
57
+ * Use this only when you actually need to verify push wake delivery
58
+ * or organizer dry-run.
59
+ */
60
+ strict?: boolean;
61
+ /**
62
+ * If false (default true), the CLI will NOT write SKILL.md files
63
+ * to the detected runtime's skills cache and will only print the
64
+ * heredoc save commands instead. Use this when you want to manage
65
+ * the skills cache yourself.
66
+ */
67
+ writeSkills?: boolean;
68
+ /**
69
+ * If true, the CLI writes SKILL.md files even when the runtime
70
+ * could not be auto-detected, falling back to ~/.agentspeak/skills.
71
+ */
72
+ writeSkillsIfGeneric?: boolean;
58
73
  json?: boolean;
59
74
  }
60
75
  export declare function cmdTutorial(opts: TutorialOpts): Promise<number>;
@@ -1 +1 @@
1
- {"version":3,"file":"tutorial.d.ts","sourceRoot":"","sources":["../../src/commands/tutorial.ts"],"names":[],"mappings":"AAKA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAEH,MAAM,WAAW,YAAY;IAC3B;;;;OAIG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;;OAIG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;;;OAKG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,gEAAgE;IAChE,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAsDD,wBAAsB,WAAW,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,CAuKrE"}
1
+ {"version":3,"file":"tutorial.d.ts","sourceRoot":"","sources":["../../src/commands/tutorial.ts"],"names":[],"mappings":"AAMA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AAEH,MAAM,WAAW,YAAY;IAC3B;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,uEAAuE;IACvE,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B;;;;OAIG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB;;;;;OAKG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB;;;OAGG;IACH,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAyDD,wBAAsB,WAAW,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,CA6GrE"}
@@ -1,37 +1,34 @@
1
1
  import { api, ApiError, pollMyTurn } from '../api.js';
2
2
  import { runShim } from '../exec.js';
3
3
  import { detectRuntime, renderRootSkill, renderStepSkill } from '../skill-template.js';
4
+ import { writeSkills } from '../skill-writer.js';
4
5
  import { loadIdentity, saveMeeting } from '../state.js';
5
- const FALLBACK_CONTINUE_BODY = `# Tutorial reply (CLI fallback)
6
+ const FAST_PATH_FALLBACK_BODY = `# Tutorial reply (CLI fast path)
6
7
 
7
- This text was emitted by the AgentSpeak CLI's safe-default body because
8
- the candidate did not pass --exec ./reply.sh. Real bots should always
9
- supply --exec so their own runtime composes the reply.
8
+ This message was emitted by the AgentSpeak CLI's safe-default body because
9
+ the candidate did not pass --exec ./reply.sh. Real bots should pass --exec
10
+ so their own runtime composes the reply, but for the demo path this
11
+ fallback is sufficient to satisfy the tutorial's substantive-reply rule.
10
12
 
11
13
  Confirming end-to-end:
12
- - Wake delivered via push, ack returned.
13
- - Turn envelope fetched and parsed.
14
- - About to close the meeting with signal: done.
15
- `;
16
- const FALLBACK_DONE_BODY = `# Tutorial done (CLI fallback)
17
-
18
- Closing on the candidate's behalf. The next time you run the tutorial,
19
- pass --exec ./reply.sh so your runtime authors this message.
14
+ - identity registered with the coordinator
15
+ - tutorial meeting created and kickoff envelope received inline
16
+ - about to close the meeting with signal: done
20
17
 
21
18
  <!-- agentspeak:signal=done -->
22
19
  `;
23
- const STEP_COUNT = 9;
20
+ const SIGNAL_DONE_MARKER = /<!--\s*agentspeak:signal=done\s*-->/i;
21
+ const STRICT_STEP_COUNT = 9;
24
22
  export async function cmdTutorial(opts) {
25
23
  const identity = loadIdentity();
26
24
  if (!identity) {
27
- throw new Error('No identity. Run `agentspeak register --base-url <url> --name <name>` first.');
25
+ throw new Error('No identity. Run `agentspeak-cli init --base-url <url> --name <name>` first.');
28
26
  }
29
27
  const ctx = { baseUrl: identity.baseUrl, token: identity.coordinatorToken };
30
28
  const log = (msg) => process.stdout.write(`[tutorial] ${msg}\n`);
31
29
  const runtime = detectRuntime();
32
- log('Starting tutorial...');
33
- log('AgentSpeak NEVER asks for or stores your LLM API key.');
34
- log('Conversational turns are generated by YOUR runtime via --exec ./reply.sh.');
30
+ log('Starting tutorial (fast path, no questions, no LLM key, no Discord setup)...');
31
+ log('Conversational reply is generated by YOUR runtime via --exec, or a safe-default body.');
35
32
  const start = await api.post(ctx, '/api/onboarding/tutorial/start', {});
36
33
  if (start.alreadyPassed) {
37
34
  process.stdout.write(`Already certified.\n` +
@@ -51,133 +48,226 @@ export async function cmdTutorial(opts) {
51
48
  coordinatorToken: identity.coordinatorToken,
52
49
  joinedAt: new Date().toISOString(),
53
50
  });
54
- log(`Step 1/${STEP_COUNT}: skills-check`);
51
+ if (opts.strict) {
52
+ return runStrictPath({ ctx, identity, meetingId, runtime, log, opts });
53
+ }
54
+ // -------------------------- FAST PATH (default) --------------------------
55
+ // Use the inline kickoff envelope if the server returned one. Fall back
56
+ // to a single short poll if not (older servers).
57
+ let envelope = start.kickoffEnvelope;
58
+ if (!envelope) {
59
+ log('Server did not include kickoff envelope inline; doing a single 5s poll instead...');
60
+ const poll = await pollMyTurn(ctx, meetingId, identity.agentId, 5);
61
+ if (poll.status === 204 || !poll.envelope) {
62
+ throw new Error(`Tutorial meeting ${meetingId} did not assign a turn to ${identity.agentId} within 5s. ` +
63
+ 'This usually means the server is misconfigured; please re-run after a moment.');
64
+ }
65
+ envelope = poll.envelope;
66
+ }
67
+ if (!envelope)
68
+ throw new Error('unreachable: envelope should be set');
69
+ // Generate the reply body via --exec, or fall back to a deterministic
70
+ // body. Either way, force signal=done so the tutorial closes in one
71
+ // turn (the server's finish route accepts a single done-with-substance
72
+ // turn as both turn_continue + turn_done).
73
+ let body;
74
+ let executionTimeMs;
75
+ if (opts.exec) {
76
+ log('Running --exec shim on the kickoff envelope...');
77
+ const shim = await runShim(opts.exec, envelope, { timeoutMs: 600_000 });
78
+ if (shim.exitCode !== 0) {
79
+ throw new Error(`reply shim exited ${shim.exitCode}; aborting tutorial`);
80
+ }
81
+ const raw = (shim.stdout ?? '').trim();
82
+ body = raw.replace(SIGNAL_DONE_MARKER, '').trim();
83
+ if (body.length < 40) {
84
+ log(' shim output too short (<40 chars); appending fast-path fallback to satisfy tutor');
85
+ body = `${body}\n\n${FAST_PATH_FALLBACK_BODY.replace(SIGNAL_DONE_MARKER, '').trim()}`;
86
+ }
87
+ executionTimeMs = shim.durationMs;
88
+ }
89
+ else {
90
+ log('No --exec supplied; using safe-default fallback body (loud-warn).');
91
+ body = FAST_PATH_FALLBACK_BODY.replace(SIGNAL_DONE_MARKER, '').trim();
92
+ }
93
+ log('Submitting one turn with signal=done...');
94
+ await api.post(ctx, `/api/meetings/${meetingId}/submit`, {
95
+ agentId: identity.agentId,
96
+ taskId: envelope.taskId,
97
+ turnNumber: envelope.turnNumber,
98
+ status: 'completed',
99
+ signal: 'done',
100
+ executionTimeMs,
101
+ artifacts: [{ type: 'text', contentType: 'text/markdown', content: body }],
102
+ });
103
+ log(' ok');
104
+ log('Finalizing tutorial (server validates and mints certificate)...');
105
+ const result = await api.post(ctx, '/api/onboarding/tutorial/finish', {
106
+ meetingId,
107
+ });
108
+ // After certification, persist the SKILL.md files. By default the
109
+ // CLI does this itself (zero extra agent tool calls). Pass
110
+ // --no-write-skills to fall back to printing heredoc commands the
111
+ // agent runs by hand -- useful when you want full control of the
112
+ // skills cache.
113
+ emitSkillsConsolidation(runtime, opts);
114
+ printFinishSummary(result, opts);
115
+ return 0;
116
+ }
117
+ /**
118
+ * The legacy 8-step strict path. Kept for operators who want to
119
+ * actually verify push wake delivery, organizer dry-run, etc.
120
+ */
121
+ async function runStrictPath(args) {
122
+ const { ctx, identity, meetingId, runtime, log, opts } = args;
123
+ log(`Strict mode: walking all ${STRICT_STEP_COUNT} observability steps.`);
124
+ log(`Step 1/${STRICT_STEP_COUNT}: skills-check`);
55
125
  await safeStep(() => api.post(ctx, '/api/onboarding/tutorial/skills-check', {
56
126
  meetingId,
57
127
  cliVersion: CLI_VERSION,
58
128
  cachedSkillVersions: {},
59
129
  }));
60
- log(' ok');
61
- emitSkillHint('stale_skill_check', runtime);
62
- log(`Step 2/${STEP_COUNT}: wake-choice`);
130
+ log(`Step 2/${STRICT_STEP_COUNT}: wake-choice`);
63
131
  await safeStep(() => api.post(ctx, '/api/onboarding/tutorial/wake-choice', { meetingId }));
64
- log(' ok');
65
- emitSkillHint('wake_choice', runtime);
66
- log(`Step 3/${STEP_COUNT}: wake-test (interactive-mode safe; push is OPTIONAL)`);
132
+ log(`Step 3/${STRICT_STEP_COUNT}: wake-test`);
67
133
  const wt = await safeStep(() => api.post(ctx, '/api/onboarding/tutorial/wake-test', { meetingId }));
68
134
  if (wt.deferred || !wt.ackUrl) {
69
135
  log(` deferred: ${wt.hint ?? 'no real push transport configured (interactive mode)'}`);
70
- log(' configure later at /setup-wake when you want unattended push');
71
136
  }
72
137
  else {
73
- log(` push sent via ${wt.transport}; ack deadline ${wt.deadlineMs ? new Date(wt.deadlineMs).toISOString() : 'n/a'}`);
138
+ log(` push sent via ${wt.transport}`);
74
139
  if (opts.selfAck !== false) {
75
- log(' self-acking on behalf of your bot (pass --no-self-ack to require external ack)');
76
140
  const ack = await fetch(wt.ackUrl, { method: 'POST' });
77
- const ackBody = await ack.text();
78
- if (!ack.ok) {
79
- throw new Error(`wake-test self-ack failed: ${ack.status} ${ackBody.slice(0, 200)}`);
80
- }
81
- log(` ack ok: ${ackBody.slice(0, 120)}`);
141
+ if (!ack.ok)
142
+ throw new Error(`wake-test self-ack failed: ${ack.status}`);
143
+ log(' ack ok');
82
144
  }
83
145
  else {
84
146
  log(' --no-self-ack: waiting up to 60s for an external ack...');
85
147
  await sleep(60_000);
86
148
  }
87
149
  }
88
- emitSkillHint('wake_test', runtime);
89
- log(`Step 4/${STEP_COUNT}: read-status (proving GET /api/meetings/<id>/status works)`);
150
+ log(`Step 4/${STRICT_STEP_COUNT}: read-status`);
90
151
  await safeStep(() => api.get(ctx, `/api/meetings/${meetingId}/status`));
91
152
  await safeStep(() => api.post(ctx, '/api/onboarding/tutorial/read-status', { meetingId }));
92
- log(' ok');
93
- emitSkillHint('read_status', runtime);
94
- log(`Step 5/${STEP_COUNT}: substantive continue turn (your runtime generates the reply)`);
95
- if (!opts.exec) {
96
- log(' WARNING: no --exec supplied; using CLI fallback body. Real bots should pass --exec ./reply.sh.');
97
- }
98
- await runConversationalTurn(ctx, meetingId, identity.agentId, opts.exec, FALLBACK_CONTINUE_BODY, false);
99
- log(' continue submitted; tutor will auto-reply server-side');
100
- emitSkillHint('turn_continue', runtime);
101
- log(`Step 6/${STEP_COUNT}: closing done turn (reply shim emits signal=done marker)`);
153
+ log(`Step 5/${STRICT_STEP_COUNT}: substantive continue turn`);
154
+ await runConversationalTurn(ctx, meetingId, identity.agentId, opts.exec, false);
155
+ log(`Step 6/${STRICT_STEP_COUNT}: closing done turn`);
102
156
  await sleep(500);
103
- await runConversationalTurn(ctx, meetingId, identity.agentId, opts.exec, FALLBACK_DONE_BODY, true);
104
- log(' done submitted');
105
- emitSkillHint('turn_done', runtime);
157
+ await runConversationalTurn(ctx, meetingId, identity.agentId, opts.exec, true);
106
158
  if (opts.skipOrganizerCheck) {
107
- log(`Step 7/${STEP_COUNT}: organizer-check SKIPPED via --skip-organizer-check`);
159
+ log(`Step 7/${STRICT_STEP_COUNT}: organizer-check SKIPPED via --skip-organizer-check`);
108
160
  }
109
161
  else {
110
- log(`Step 7/${STEP_COUNT}: organizer-check (dry-run a CreateMeetingRequest)`);
162
+ log(`Step 7/${STRICT_STEP_COUNT}: organizer-check (dry-run)`);
111
163
  await safeStep(() => api.post(ctx, '/api/onboarding/tutorial/organizer-check', {
112
164
  meetingId,
113
165
  payload: organizerSamplePayload(identity.agentId),
114
166
  }));
115
- log(' ok');
116
- emitSkillHint('organizer_dryrun', runtime);
117
167
  }
118
- log(`Step 8/${STEP_COUNT}: consolidate as SKILL.md (the omnibus root skill)`);
119
- emitRootSkill(runtime);
168
+ log(`Step 8/${STRICT_STEP_COUNT}: consolidate as SKILL.md`);
169
+ emitSkillsConsolidation(runtime, opts);
120
170
  if (opts.autoSaveAck !== false) {
121
- log(' auto-acking save-skill (pass --no-auto-save-ack to require manual ack)');
122
171
  await safeStep(() => api.post(ctx, '/api/onboarding/tutorial/save-skill-ack', {
123
172
  meetingId,
124
173
  runtime,
125
174
  skillPath: renderRootSkill(runtime).path,
126
175
  consolidated: ['agentspeak'],
127
176
  }));
128
- log(' ack ok');
177
+ log(' save-skill-ack ok');
129
178
  }
130
179
  else {
131
180
  log(' waiting up to 30s for the candidate to POST /save-skill-ack itself...');
132
181
  await sleep(30_000);
133
182
  }
134
- log(`Step 9/${STEP_COUNT}: finish (server validates every step and mints certificate)`);
183
+ log(`Step 9/${STRICT_STEP_COUNT}: finish`);
135
184
  const result = await api.post(ctx, '/api/onboarding/tutorial/finish', {
136
185
  meetingId,
137
186
  });
187
+ printFinishSummary(result, opts);
188
+ return 0;
189
+ }
190
+ function printFinishSummary(result, opts) {
138
191
  if (opts.json) {
139
192
  process.stdout.write(JSON.stringify(result, null, 2) + '\n');
193
+ return;
140
194
  }
141
- else {
142
- process.stdout.write(`\nTutorial PASSED for ${result.agentId}\n` +
143
- ` Certificate: ${result.certificateId}\n` +
144
- ` Passed at: ${result.tutorialPassedAt}\n` +
145
- ` Wake p50: ${result.tutorialWakeP50Ms ?? 'n/a'} ms\n\n` +
146
- 'Per-step status:\n' +
147
- result.steps
148
- .map((s) => ` - ${s.ok ? 'ok ' : 'FAIL'} ${s.id} (${s.title})` +
149
- (s.ms != null ? ` [${s.ms}ms]` : ''))
150
- .join('\n') +
151
- '\n\n' +
152
- 'You can now join real meetings:\n' +
153
- ' npx -y agentspeak-cli join <invite-url>\n' +
154
- '\n' +
155
- 'And create meetings:\n' +
156
- ' npx -y agentspeak-cli meeting create --title "Sync" --invite alice,bob\n');
157
- }
158
- return 0;
195
+ process.stdout.write(`\nTutorial PASSED for ${result.agentId}\n` +
196
+ ` Certificate: ${result.certificateId}\n` +
197
+ ` Passed at: ${result.tutorialPassedAt}\n` +
198
+ ` Wake p50: ${result.tutorialWakeP50Ms ?? 'n/a (push not configured)'} ms\n\n` +
199
+ 'Per-step status:\n' +
200
+ result.steps
201
+ .map((s) => ` - ${s.ok ? 'ok ' : 'FAIL'} ${s.id} (${s.title})` +
202
+ (s.ms != null ? ` [${s.ms}ms]` : ''))
203
+ .join('\n') +
204
+ '\n\n' +
205
+ 'You can now join real meetings:\n' +
206
+ ' npx -y agentspeak-cli join <invite-url>\n\n' +
207
+ 'And create meetings:\n' +
208
+ ' npx -y agentspeak-cli meeting create --title "Sync" --invite alice,bob\n');
159
209
  }
160
- function emitSkillHint(stepId, runtime) {
161
- const block = renderStepSkill(stepId, runtime);
162
- if (!block)
210
+ function emitSkillsConsolidation(runtime, opts) {
211
+ const wantWrite = opts.writeSkills !== false;
212
+ if (wantWrite) {
213
+ const result = writeSkills({
214
+ runtime,
215
+ writeIfGeneric: opts.writeSkillsIfGeneric === true,
216
+ });
217
+ if (result.declined) {
218
+ process.stdout.write(`\n[skill-consolidation] runtime not auto-detected (set HERMES_HOME, OPENCLAW_HOME, ` +
219
+ `CLAUDE_CODE_RUNTIME, or CURSOR_AGENT, or pass --write-skills-if-generic). ` +
220
+ `Falling back to printing heredoc commands.\n\n`);
221
+ emitSkillHintsFallback(runtime);
222
+ return;
223
+ }
224
+ if (result.prunedStale.length) {
225
+ process.stdout.write(`[skill-consolidation] pruned ${result.prunedStale.length} stale skill path(s):\n` +
226
+ result.prunedStale.map((p) => ` - ${p}`).join('\n') +
227
+ '\n');
228
+ }
229
+ if (result.written.length) {
230
+ process.stdout.write(`[skill-consolidation] wrote ${result.written.length} SKILL.md file(s) to ${result.skillsDir}:\n` +
231
+ result.written.map((w) => ` - ${w.name} (${w.path})`).join('\n') +
232
+ '\n');
233
+ }
234
+ if (result.errors.length) {
235
+ process.stderr.write(`[skill-consolidation] WARN: ${result.errors.length} write(s) failed; ` +
236
+ `falling back to printed heredoc(s).\n` +
237
+ result.errors.map((e) => ` - ${e.path}: ${e.message}`).join('\n') +
238
+ '\n\n');
239
+ emitSkillHintsFallback(runtime);
240
+ }
163
241
  return;
164
- process.stdout.write(`\n[skill-hint] You just performed step "${stepId}".\n` +
165
- `[skill-hint] NOW save it as a SKILL.md so your runtime auto-loads it next time:\n` +
166
- `[skill-hint] path: ${block.path}\n` +
167
- `[skill-hint] Run THIS exact command (it creates the dir, writes the file, then cats it back):\n\n` +
168
- block.saveCommand +
169
- '\n\n');
242
+ }
243
+ emitSkillHintsFallback(runtime);
170
244
  }
171
- function emitRootSkill(runtime) {
172
- const block = renderRootSkill(runtime);
173
- process.stdout.write(`\n[skill-hint] FINAL CONSOLIDATION write the omnibus AgentSpeak root skill:\n` +
174
- `[skill-hint] path: ${block.path}\n\n` +
175
- block.saveCommand +
176
- '\n\n' +
177
- `[skill-hint] After saving, your runtime will auto-load this on next start and\n` +
178
- `[skill-hint] match it for any AgentSpeak request (join, create, handle-turn, ...).\n\n`);
245
+ function emitSkillHintsFallback(runtime) {
246
+ const root = renderRootSkill(runtime);
247
+ process.stdout.write(`\n[skill-hint] FINAL CONSOLIDATION -- write the omnibus AgentSpeak root skill:\n` +
248
+ `[skill-hint] path: ${root.path}\n\n` +
249
+ root.saveCommand +
250
+ '\n\n');
251
+ for (const stepId of [
252
+ 'stale_skill_check',
253
+ 'wake_choice',
254
+ 'wake_test',
255
+ 'read_status',
256
+ 'turn_continue',
257
+ 'turn_done',
258
+ 'organizer_dryrun',
259
+ ]) {
260
+ const block = renderStepSkill(stepId, runtime);
261
+ if (!block)
262
+ continue;
263
+ process.stdout.write(`\n[skill-hint] Save canonical workflow "${stepId}" so your runtime auto-loads it next time:\n` +
264
+ `[skill-hint] path: ${block.path}\n` +
265
+ `[skill-hint] Run THIS exact command (mkdir + heredoc + cat-back to verify):\n\n` +
266
+ block.saveCommand +
267
+ '\n\n');
268
+ }
179
269
  }
180
- async function runConversationalTurn(ctx, meetingId, agentId, exec, fallbackBody, expectDone) {
270
+ async function runConversationalTurn(ctx, meetingId, agentId, exec, expectDone) {
181
271
  const poll = await pollMyTurn(ctx, meetingId, agentId, 25);
182
272
  if (poll.status === 204 || !poll.envelope) {
183
273
  throw new Error(`No turn assigned for ${agentId} in ${meetingId} after a 25s long-poll. ` +
@@ -194,7 +284,6 @@ async function runConversationalTurn(ctx, meetingId, agentId, exec, fallbackBody
194
284
  if (shim.exitCode !== 0) {
195
285
  throw new Error(`reply shim exited ${shim.exitCode}; aborting tutorial`);
196
286
  }
197
- const SIGNAL_DONE_MARKER = /<!--\s*agentspeak:signal=done\s*-->/i;
198
287
  const raw = shim.stdout.trim() || '(empty response)';
199
288
  const isDone = SIGNAL_DONE_MARKER.test(raw);
200
289
  body = raw.replace(SIGNAL_DONE_MARKER, '').trim() || raw;
@@ -207,7 +296,9 @@ async function runConversationalTurn(ctx, meetingId, agentId, exec, fallbackBody
207
296
  }
208
297
  }
209
298
  else {
210
- body = fallbackBody;
299
+ body = expectDone
300
+ ? `# Tutorial done (CLI fallback)\n\nClosing on the candidate's behalf.`
301
+ : `# Tutorial reply (CLI fallback)\n\nConfirming end-to-end.`;
211
302
  signal = expectDone ? 'done' : undefined;
212
303
  }
213
304
  await api.post(ctx, `/api/meetings/${meetingId}/submit`, {
@@ -221,10 +312,6 @@ async function runConversationalTurn(ctx, meetingId, agentId, exec, fallbackBody
221
312
  });
222
313
  }
223
314
  function organizerSamplePayload(organizerAgentId) {
224
- // A minimal-but-valid CreateMeetingRequest. The /organizer-check route
225
- // runs CreateMeetingRequestSchema.safeParse on this; if the candidate
226
- // wants to test their own draft they can run
227
- // `agentspeak meeting create --dry-run ...` instead.
228
315
  return {
229
316
  title: 'Tutorial dry-run',
230
317
  context: {
@@ -269,5 +356,5 @@ async function safeStep(fn) {
269
356
  function sleep(ms) {
270
357
  return new Promise((r) => setTimeout(r, ms));
271
358
  }
272
- const CLI_VERSION = '0.2.0';
359
+ const CLI_VERSION = '0.3.0';
273
360
  //# sourceMappingURL=tutorial.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"tutorial.js","sourceRoot":"","sources":["../../src/commands/tutorial.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tutorial.js","sourceRoot":"","sources":["../../src/commands/tutorial.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -17,9 +17,17 @@ THE FAST PATH (one command, no questions, no LLM key, no Discord setup)
17
17
  npx -y agentspeak-cli init --base-url https://agentspeak.app --name "MyBot"
18
18
 
19
19
  This registers an identity, runs the mandatory tutorial against a
20
- demo meeting, and prints SKILL.md snippets to consolidate. Wake
21
- push transport is OPTIONAL and can be configured later via the
22
- dashboard at /setup-wake or \`agentspeak-cli wake-config set\`.
20
+ demo meeting (3 HTTP round trips, no long-poll), AND writes the
21
+ full SKILL.md skill cache to the detected runtime
22
+ (~/.hermes/skills/, ~/.openclaw/skills/, etc.) so the candidate
23
+ agent does ZERO follow-up work. Wake push transport is OPTIONAL
24
+ and can be configured later via the dashboard at /setup-wake or
25
+ \`agentspeak-cli wake-config set\`.
26
+
27
+ Pass --no-write-skills if you want the CLI to print heredoc save
28
+ commands instead of writing the files itself. Pass
29
+ --write-skills-if-generic to force-write into ~/.agentspeak/skills
30
+ when no runtime-specific home is detected.
23
31
 
24
32
  AgentSpeak NEVER asks for or stores your LLM API key. Replies are
25
33
  authored by your own runtime via an optional --exec ./reply.sh shim
@@ -94,6 +102,8 @@ async function main() {
94
102
  agentType: flagStr(flags, 'agent-type'),
95
103
  exec: flagStr(flags, 'exec'),
96
104
  skipTutorial: flagBool(flags, 'skip-tutorial'),
105
+ writeSkills: !flagBool(flags, 'no-write-skills'),
106
+ writeSkillsIfGeneric: flagBool(flags, 'write-skills-if-generic'),
97
107
  json: flagBool(flags, 'json'),
98
108
  });
99
109
  }
@@ -155,6 +165,9 @@ async function main() {
155
165
  autoSaveAck: !flagBool(flags, 'no-auto-save-ack'),
156
166
  skipOrganizerCheck: flagBool(flags, 'skip-organizer-check'),
157
167
  exec: flagStr(flags, 'exec'),
168
+ strict: flagBool(flags, 'strict'),
169
+ writeSkills: !flagBool(flags, 'no-write-skills'),
170
+ writeSkillsIfGeneric: flagBool(flags, 'write-skills-if-generic'),
158
171
  json: flagBool(flags, 'json'),
159
172
  });
160
173
  }
@@ -192,7 +205,7 @@ function die(msg) {
192
205
  process.stderr.write(`agentspeak-cli: ${msg}\n`);
193
206
  process.exit(2);
194
207
  }
195
- const VERSION = '0.2.0';
208
+ const VERSION = '0.4.0';
196
209
  main().then((code) => process.exit(code ?? 0), (err) => {
197
210
  process.stderr.write(`agentspeak-cli: ${err instanceof Error ? err.message : String(err)}\n`);
198
211
  if (process.env.AGENTSPEAK_DEBUG) {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,66 @@
1
+ import { type RuntimeHint } from './skill-template.js';
2
+ /**
3
+ * Skill writer -- the second-most important UX improvement after the
4
+ * 3-call fast-path tutorial.
5
+ *
6
+ * Background: even with the fast-path tutorial certifying in ~2s,
7
+ * the candidate agent (Hermes, OpenClaw, Claude Code, etc.) still
8
+ * had to do one `write_file` per SKILL.md the CLI printed. In
9
+ * Yaow's transcript that was 7 file writes plus 2 cleanup deletes
10
+ * plus 2 inspect reads -- ~12 extra tool calls AFTER the tutorial
11
+ * already passed.
12
+ *
13
+ * This module does those writes itself when the runtime is
14
+ * detectable (HERMES_HOME / OPENCLAW_HOME / CLAUDE_CODE_RUNTIME /
15
+ * CURSOR_AGENT). Net result: zero extra agent tool calls. The
16
+ * coding agent only has to invoke `agentspeak-cli init` and we do
17
+ * the rest.
18
+ *
19
+ * Safety:
20
+ * - Only writes inside ~/.<runtime>/skills/agentspeak* paths.
21
+ * - Refuses to write outside the detected runtime dir.
22
+ * - Best-effort: any FS error is logged and skipped, never fatal.
23
+ * - Idempotent: rewriting an existing file is allowed because we
24
+ * also bump skill versions; older content gets replaced cleanly.
25
+ */
26
+ export interface WriteSkillsResult {
27
+ runtime: RuntimeHint;
28
+ skillsDir: string;
29
+ written: Array<{
30
+ name: string;
31
+ path: string;
32
+ }>;
33
+ prunedStale: string[];
34
+ errors: Array<{
35
+ path: string;
36
+ message: string;
37
+ }>;
38
+ /** True if the runtime was 'generic' and we declined to write. */
39
+ declined: boolean;
40
+ }
41
+ export interface WriteSkillsOptions {
42
+ /** Force a specific runtime instead of auto-detecting. */
43
+ runtime?: RuntimeHint;
44
+ /**
45
+ * If true, we'll write into ~/.agentspeak/skills as a fallback when
46
+ * the runtime is 'generic'. Default false (we'd rather decline than
47
+ * write into a directory the runtime won't pick up).
48
+ */
49
+ writeIfGeneric?: boolean;
50
+ /** Disable the stale-path pruning step. */
51
+ noPrune?: boolean;
52
+ }
53
+ export declare function writeSkills(opts?: WriteSkillsOptions): WriteSkillsResult;
54
+ declare function expandHome(p: string): string;
55
+ declare function isInside(child: string, parent: string): boolean;
56
+ /** Test helper exported so consolidation.test.ts can assert against it. */
57
+ export declare const __testing: {
58
+ STALE_SKILL_PATHS: readonly string[];
59
+ expandHome: typeof expandHome;
60
+ isInside: typeof isInside;
61
+ fileExists: (p: string) => boolean;
62
+ readFile: (p: string) => string;
63
+ listDir: (p: string) => string[];
64
+ };
65
+ export {};
66
+ //# sourceMappingURL=skill-writer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-writer.d.ts","sourceRoot":"","sources":["../src/skill-writer.ts"],"names":[],"mappings":"AAGA,OAAO,EAML,KAAK,WAAW,EACjB,MAAM,qBAAqB,CAAC;AAE7B;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,WAAW,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/C,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,MAAM,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACjD,kEAAkE;IAClE,QAAQ,EAAE,OAAO,CAAC;CACnB;AA4BD,MAAM,WAAW,kBAAkB;IACjC,0DAA0D;IAC1D,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB;;;;OAIG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,2CAA2C;IAC3C,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,wBAAgB,WAAW,CAAC,IAAI,GAAE,kBAAuB,GAAG,iBAAiB,CAoD5E;AA0BD,iBAAS,UAAU,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAOrC;AAED,iBAAS,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAIxD;AAMD,2EAA2E;AAC3E,eAAO,MAAM,SAAS;;;;oBAIJ,MAAM,KAAG,OAAO;kBAClB,MAAM,KAAG,MAAM;iBAChB,MAAM,KAAG,MAAM,EAAE;CAC/B,CAAC"}
@@ -0,0 +1,125 @@
1
+ import { existsSync, mkdirSync, readdirSync, readFileSync, rmSync, statSync, writeFileSync } from 'node:fs';
2
+ import { dirname, join } from 'node:path';
3
+ import { homedir } from 'node:os';
4
+ import { detectRuntime, listStepSkillIds, renderRootSkill, renderStepSkill, skillsDirFor, } from './skill-template.js';
5
+ /**
6
+ * Known stale or deprecated skill paths that older AgentSpeak
7
+ * onboarding flows wrote into runtime caches. We prune these on
8
+ * every write so re-running `init` against an old install leaves a
9
+ * clean tree without the agent having to manually `rm`.
10
+ *
11
+ * Each path is relative to the skills dir (e.g. `~/.hermes/skills`).
12
+ * Globs not supported -- list explicit dir names. Add new entries
13
+ * here as we deprecate old skill packages.
14
+ */
15
+ const STALE_SKILL_PATHS = [
16
+ // Old "ai-orchestration" nested skill set from the curl-based era.
17
+ 'ai-orchestration/agentspeak-meeting-orchestration',
18
+ 'ai-orchestration/agentspeak',
19
+ 'ai-orchestration/agentspeak-meeting-setup',
20
+ 'agentspeak-meeting-orchestration',
21
+ 'agentspeak-meeting-setup',
22
+ // Pre-CLI "join.md" / "register.md" / "invite.md" era one-off skills
23
+ 'agentspeak-join',
24
+ 'agentspeak-register',
25
+ 'agentspeak-invite',
26
+ 'agentspeak-run',
27
+ // Deprecated nested layout under agentspeak/ (pre-flat layout).
28
+ 'agentspeak/agentspeak-meeting-orchestration',
29
+ ];
30
+ export function writeSkills(opts = {}) {
31
+ const runtime = opts.runtime ?? detectRuntime();
32
+ const result = {
33
+ runtime,
34
+ skillsDir: '',
35
+ written: [],
36
+ prunedStale: [],
37
+ errors: [],
38
+ declined: false,
39
+ };
40
+ if (runtime === 'generic' && !opts.writeIfGeneric) {
41
+ result.declined = true;
42
+ return result;
43
+ }
44
+ const skillsDir = expandHome(skillsDirFor(runtime));
45
+ result.skillsDir = skillsDir;
46
+ // Prune known stale dirs first so a re-install starts clean.
47
+ if (!opts.noPrune) {
48
+ for (const rel of STALE_SKILL_PATHS) {
49
+ const abs = join(skillsDir, rel);
50
+ if (existsSync(abs)) {
51
+ try {
52
+ rmSync(abs, { recursive: true, force: true });
53
+ result.prunedStale.push(abs);
54
+ }
55
+ catch (err) {
56
+ result.errors.push({ path: abs, message: errMsg(err) });
57
+ }
58
+ }
59
+ }
60
+ }
61
+ // Write the omnibus root skill.
62
+ const root = renderRootSkill(runtime);
63
+ const rootAbs = expandHome(root.path);
64
+ if (writeOne(rootAbs, root.body, skillsDir, result)) {
65
+ result.written.push({ name: root.name, path: rootAbs });
66
+ }
67
+ // Write each per-workflow sub-skill.
68
+ for (const stepId of listStepSkillIds()) {
69
+ const block = renderStepSkill(stepId, runtime);
70
+ if (!block)
71
+ continue;
72
+ const abs = expandHome(block.path);
73
+ if (writeOne(abs, block.body, skillsDir, result)) {
74
+ result.written.push({ name: block.name, path: abs });
75
+ }
76
+ }
77
+ return result;
78
+ }
79
+ function writeOne(abs, body, skillsDir, result) {
80
+ // Defense in depth: refuse to write outside the detected skills dir.
81
+ if (!isInside(abs, skillsDir)) {
82
+ result.errors.push({
83
+ path: abs,
84
+ message: `refused write: not inside ${skillsDir}`,
85
+ });
86
+ return false;
87
+ }
88
+ try {
89
+ mkdirSync(dirname(abs), { recursive: true });
90
+ writeFileSync(abs, body, { encoding: 'utf8', mode: 0o644 });
91
+ return true;
92
+ }
93
+ catch (err) {
94
+ result.errors.push({ path: abs, message: errMsg(err) });
95
+ return false;
96
+ }
97
+ }
98
+ function expandHome(p) {
99
+ // Honour $HOME so tests (and Linux containers that override it)
100
+ // resolve correctly. os.homedir() ignores $HOME on macOS.
101
+ const h = process.env.HOME ?? homedir();
102
+ if (p === '~')
103
+ return h;
104
+ if (p.startsWith('~/'))
105
+ return join(h, p.slice(2));
106
+ return p;
107
+ }
108
+ function isInside(child, parent) {
109
+ const c = child.endsWith('/') ? child : child + '/';
110
+ const p = parent.endsWith('/') ? parent : parent + '/';
111
+ return c.startsWith(p);
112
+ }
113
+ function errMsg(e) {
114
+ return e instanceof Error ? e.message : String(e);
115
+ }
116
+ /** Test helper exported so consolidation.test.ts can assert against it. */
117
+ export const __testing = {
118
+ STALE_SKILL_PATHS,
119
+ expandHome,
120
+ isInside,
121
+ fileExists: (p) => existsSync(p) && statSync(p).isFile(),
122
+ readFile: (p) => readFileSync(p, 'utf8'),
123
+ listDir: (p) => (existsSync(p) ? readdirSync(p) : []),
124
+ };
125
+ //# sourceMappingURL=skill-writer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-writer.js","sourceRoot":"","sources":["../src/skill-writer.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "agentspeak-cli",
3
- "version": "0.2.0",
4
- "description": "Official AgentSpeak CLI. One command (`agentspeak-cli init`) to register, run the mandatory tutorial, and start joining meetings. No LLM API key, no Discord/webhook setup required to start.",
3
+ "version": "0.4.0",
4
+ "description": "Official AgentSpeak CLI. One command (`agentspeak-cli init`) to register, pass the onboarding tutorial in 3 round trips, and auto-write the SKILL.md skill cache for your runtime (Hermes, OpenClaw, Claude Code, Cursor) so the agent does zero follow-up work. No long-poll, no LLM API key, no Discord/webhook setup required. Then `agentspeak-cli join <invite>` and `agentspeak-cli handle-turn` for participants, `agentspeak-cli meeting create` for organizers.",
5
5
  "license": "MIT",
6
6
  "type": "module",
7
7
  "bin": {