talking-stick 0.4.11 → 0.4.12

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.
@@ -238,15 +238,19 @@ function reportInstallResults(results, mode) {
238
238
  throw new Error(`${mode} completed with failures.`);
239
239
  }
240
240
  }
241
- function printInstructionHint(results) {
242
- if (!results.some((result) => result.ok && !result.skipped)) {
241
+ export function printInstructionHint(results) {
242
+ const changed = new Set(["added", "updated", "ok"]);
243
+ if (!results.some((result) => result.ok && changed.has(result.status))) {
243
244
  return;
244
245
  }
245
246
  process.stdout.write("Customize collaboration instructions with: tt instructions edit\n");
246
247
  }
247
- function reportCleanupResults(results, mode) {
248
+ export function reportCleanupResults(results, mode) {
248
249
  let anyFailed = false;
249
250
  for (const result of results) {
251
+ if (result.action === "absent" || result.action === "skipped") {
252
+ continue;
253
+ }
250
254
  process.stdout.write(`[${result.harness}] mcp-cleanup ${result.action}: ${result.message}\n`);
251
255
  if (result.action === "failed")
252
256
  anyFailed = true;
package/dist/install.js CHANGED
@@ -225,6 +225,7 @@ export function planGrokSessionHookInstall(options = {}) {
225
225
  harness: "grok",
226
226
  filePath,
227
227
  description: `write Grok session hook ${filePath}`,
228
+ operation: "install",
228
229
  inspect: () => inspectGrokSessionHook(filePath, resolved),
229
230
  apply: () => writeGrokSessionHook(filePath, resolved)
230
231
  };
@@ -569,6 +570,8 @@ export async function runAction(action, options = {}) {
569
570
  }
570
571
  }
571
572
  async function inspectExecAction(action, resolved) {
573
+ if (action.inspect)
574
+ return action.inspect();
572
575
  if (!action.operation || !action.serverName)
573
576
  return "unknown";
574
577
  if (action.harness === "gemini") {
@@ -615,6 +618,9 @@ function formatMcpActionMessage(action, status, fallback) {
615
618
  break;
616
619
  }
617
620
  }
621
+ if (action.kind === "exec" && status === "already_present") {
622
+ return "skill is already installed.";
623
+ }
618
624
  return fallback ?? "ok";
619
625
  }
620
626
  const target = `MCP server '${action.serverName}'`;
@@ -29,6 +29,7 @@ export function planSkillInstall(harness, options = {}) {
29
29
  const shouldLink = options.link ?? true;
30
30
  ensureSkillSourceExists(sourcePath);
31
31
  if (harness === "gemini") {
32
+ const geminiTargetPath = path.join(resolveHarnessConfigDir("gemini", options), "skills", skillName);
32
33
  return shouldLink
33
34
  ? {
34
35
  kind: "exec",
@@ -36,7 +37,8 @@ export function planSkillInstall(harness, options = {}) {
36
37
  command: "gemini",
37
38
  args: ["skills", "link", sourcePath, "--scope", "user", "--consent"],
38
39
  description: `gemini skills link ${sourcePath} --scope user --consent`,
39
- operation: "install"
40
+ operation: "install",
41
+ inspect: () => inspectInstalledSkill(sourcePath, geminiTargetPath, true)
40
42
  }
41
43
  : {
42
44
  kind: "exec",
@@ -44,7 +46,8 @@ export function planSkillInstall(harness, options = {}) {
44
46
  command: "gemini",
45
47
  args: ["skills", "install", sourcePath, "--scope", "user", "--consent"],
46
48
  description: `gemini skills install ${sourcePath} --scope user --consent`,
47
- operation: "install"
49
+ operation: "install",
50
+ inspect: () => inspectInstalledSkill(sourcePath, geminiTargetPath, false)
48
51
  };
49
52
  }
50
53
  const targetPath = resolveSkillTargetPath(harness, options);
@@ -0,0 +1,17 @@
1
+ # Talking Stick 0.4.12
2
+
3
+ Date: 2026-06-09
4
+
5
+ ## Fixed
6
+ - **No-op `tt install` runs are quiet.** Legacy MCP cleanup lines are only printed when an entry was actually removed, preserved, or failed — `absent`/`skipped` no-ops stay silent. The Grok session hook and Gemini skill installs now inspect their targets and report `already_present` instead of rewriting (`ok: Updated ...`) or re-linking (`added: ok`) on every run, and the `tt instructions edit` hint only prints when an install actually changed something.
7
+
8
+ ## Verification
9
+
10
+ ```bash
11
+ npm run typecheck
12
+ npm test
13
+ npm run build
14
+ node dist/cli.js --help
15
+ git diff --check
16
+ npm pack --dry-run
17
+ ```
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "talking-stick",
3
- "version": "0.4.11",
3
+ "version": "0.4.12",
4
4
  "description": "CLI coordination tool for path-scoped agent handoffs.",
5
5
  "type": "module",
6
6
  "bin": {