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.
- package/dist/cli/install-commands.js +7 -3
- package/dist/install.js +6 -0
- package/dist/skill-install.js +5 -2
- package/docs/releases/0.4.12.md +17 -0
- package/package.json +1 -1
|
@@ -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
|
-
|
|
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}'`;
|
package/dist/skill-install.js
CHANGED
|
@@ -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
|
+
```
|