cc-claw 0.20.1 → 0.20.2

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 (2) hide show
  1. package/dist/cli.js +71 -6
  2. package/package.json +1 -1
package/dist/cli.js CHANGED
@@ -33,7 +33,7 @@ var VERSION;
33
33
  var init_version = __esm({
34
34
  "src/version.ts"() {
35
35
  "use strict";
36
- VERSION = true ? "0.20.1" : (() => {
36
+ VERSION = true ? "0.20.2" : (() => {
37
37
  try {
38
38
  return JSON.parse(readFileSync(join(process.cwd(), "package.json"), "utf-8")).version ?? "unknown";
39
39
  } catch {
@@ -18567,6 +18567,13 @@ Use /skills <page> to navigate (e.g. /skills 2)` : "";
18567
18567
  if (safePage < totalPages) navRow.push({ label: `Page ${safePage + 1} \u2192`, data: `skills:page:${safePage + 1}` });
18568
18568
  buttons.push(navRow);
18569
18569
  }
18570
+ const { getSkillSuggestionsEnabled: getSkillSuggestionsEnabled2 } = await Promise.resolve().then(() => (init_store5(), store_exports5));
18571
+ const extractEnabled = getSkillSuggestionsEnabled2(chatId);
18572
+ buttons.push([{
18573
+ label: `${extractEnabled ? "\u2713" : "\u25CB"} Auto-Extract Skills`,
18574
+ data: "skills:toggle-extract",
18575
+ ...extractEnabled ? { style: "primary" } : {}
18576
+ }]);
18570
18577
  const header2 = totalPages > 1 ? `${skills2.length} skills (page ${safePage}/${totalPages}). Select one to invoke:` : `${skills2.length} skills available. Select one to invoke:`;
18571
18578
  await sendOrEditKeyboard(chatId, channel, messageId, header2, buttons);
18572
18579
  }
@@ -23690,6 +23697,12 @@ Salience: ${memory2.salience.toFixed(2)} | Created: ${memory2.created_at.slice(0
23690
23697
  Example: /limits ${bid} daily 500000`, { parseMode: "plain" });
23691
23698
  }
23692
23699
  return;
23700
+ } else if (data === "skills:toggle-extract") {
23701
+ const { getSkillSuggestionsEnabled: getSkillSuggestionsEnabled2, setSkillSuggestionsEnabled: setSkillSuggestionsEnabled2 } = await Promise.resolve().then(() => (init_store5(), store_exports5));
23702
+ const current = getSkillSuggestionsEnabled2(chatId);
23703
+ setSkillSuggestionsEnabled2(chatId, !current);
23704
+ const skills2 = await discoverAllSkills();
23705
+ await sendSkillsPage(chatId, channel, skills2, 1, messageId);
23693
23706
  } else if (data.startsWith("skills:page:")) {
23694
23707
  const page = parseInt(data.slice(12), 10);
23695
23708
  const skills2 = await discoverAllSkills();
@@ -23713,12 +23726,42 @@ Example: /limits ${bid} daily 500000`, { parseMode: "plain" });
23713
23726
  });
23714
23727
  const parsed = parseExtractedSkill2(extractionResponse.text);
23715
23728
  if (parsed) {
23716
- const { path } = await saveSkill2(parsed.name, parsed.content);
23717
- clearPendingDraft2(chatId);
23718
- await channel.sendText(chatId, `\u2705 Skill "${parsed.name}" saved.
23719
- Path: ${path}
23729
+ const { storePendingDraft: updateDraft } = await Promise.resolve().then(() => (init_auto_create(), auto_create_exports));
23730
+ updateDraft(chatId, { ...draft, name: parsed.name, content: parsed.content });
23731
+ const escaped = parsed.content.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
23732
+ const header2 = `\u{1F4CB} <b>Skill Preview: "${parsed.name}"</b>
23720
23733
 
23721
- Use /skills to see all available skills.`, { parseMode: "plain" });
23734
+ `;
23735
+ const MAX_PREVIEW = 3500 - header2.length;
23736
+ if (typeof channel.sendKeyboard === "function") {
23737
+ if (escaped.length > MAX_PREVIEW) {
23738
+ await channel.sendText(chatId, `${header2}<pre>${escaped.slice(0, 3500)}</pre>
23739
+
23740
+ \u2026(truncated \u2014 full skill will be saved)`, { parseMode: "html" });
23741
+ await channel.sendKeyboard(
23742
+ chatId,
23743
+ `Save "${parsed.name}" as a reusable skill?`,
23744
+ [[
23745
+ { label: "\u2705 Save Skill", data: "skill:confirm-save", style: "success" },
23746
+ { label: "\u2715 Discard", data: "skill:discard" }
23747
+ ]]
23748
+ );
23749
+ } else {
23750
+ await channel.sendKeyboard(
23751
+ chatId,
23752
+ `${header2}<pre>${escaped}</pre>`,
23753
+ [[
23754
+ { label: "\u2705 Save Skill", data: "skill:confirm-save", style: "success" },
23755
+ { label: "\u2715 Discard", data: "skill:discard" }
23756
+ ]]
23757
+ );
23758
+ }
23759
+ } else {
23760
+ const { path } = await saveSkill2(parsed.name, parsed.content);
23761
+ clearPendingDraft2(chatId);
23762
+ await channel.sendText(chatId, `\u2705 Skill "${parsed.name}" saved.
23763
+ Path: ${path}`, { parseMode: "plain" });
23764
+ }
23722
23765
  } else {
23723
23766
  clearPendingDraft2(chatId);
23724
23767
  await channel.sendText(chatId, "Could not extract a well-formed skill from this conversation. Try /remember to save key steps manually.", { parseMode: "plain" });
@@ -23728,6 +23771,28 @@ Use /skills to see all available skills.`, { parseMode: "plain" });
23728
23771
  await channel.sendText(chatId, `Skill extraction failed: ${e.message}`, { parseMode: "plain" });
23729
23772
  }
23730
23773
  return;
23774
+ } else if (data === "skill:confirm-save") {
23775
+ const { getPendingDraft: getPendingDraft2, clearPendingDraft: clearPendingDraft2, saveSkill: saveSkill2 } = await Promise.resolve().then(() => (init_auto_create(), auto_create_exports));
23776
+ const draft = getPendingDraft2(chatId);
23777
+ if (!draft || !draft.name || !draft.content) {
23778
+ await channel.sendText(chatId, "No pending skill to save.", { parseMode: "plain" });
23779
+ return;
23780
+ }
23781
+ try {
23782
+ const { path } = await saveSkill2(draft.name, draft.content);
23783
+ clearPendingDraft2(chatId);
23784
+ if (messageId) await replaceWithText(`\u2705 Skill "${draft.name}" saved.
23785
+ Path: ${path}
23786
+
23787
+ Use /skills to see all available skills.`);
23788
+ else await channel.sendText(chatId, `\u2705 Skill "${draft.name}" saved.
23789
+ Path: ${path}
23790
+
23791
+ Use /skills to see all available skills.`, { parseMode: "plain" });
23792
+ } catch (e) {
23793
+ await channel.sendText(chatId, `Failed to save skill: ${e.message}`, { parseMode: "plain" });
23794
+ }
23795
+ return;
23731
23796
  } else if (data === "skill:discard") {
23732
23797
  const { clearPendingDraft: clearPendingDraft2 } = await Promise.resolve().then(() => (init_auto_create(), auto_create_exports));
23733
23798
  clearPendingDraft2(chatId);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cc-claw",
3
- "version": "0.20.1",
3
+ "version": "0.20.2",
4
4
  "description": "CC-Claw: Personal AI assistant on Telegram — multi-backend (Claude, Gemini, Codex, Cursor), sub-agent orchestration, MCP management",
5
5
  "type": "module",
6
6
  "main": "dist/cli.js",