tink-harness 1.11.1 → 1.11.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.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "tink",
3
3
  "description": "A small harness layer for Claude Code and Codex.",
4
- "version": "1.11.1",
4
+ "version": "1.11.2",
5
5
  "author": {
6
6
  "name": "dotori"
7
7
  }
package/CHANGELOG.md CHANGED
@@ -2,6 +2,10 @@
2
2
 
3
3
  All notable changes to Tink are tracked here.
4
4
 
5
+ ## [1.11.2] - 2026-06-13
6
+
7
+ - Fixed: the 3D harness map showed no connections or signal pulses on fresh installs (or installs whose history was lost to the pre-1.11.0 record-wipe bug). The lifecycle summary's graph was built only from run/ledger evidence; it now also includes the static rule graph - every routing rule connects to its harness, and check/guard chains render - so the map is alive from the first open.
8
+
5
9
  ## [1.11.1] - 2026-06-12
6
10
 
7
11
  - Installer component labels clarified after user confusion: "Claude Code commands (/tink:*)" and "Claude Code skill (operating rules)" now state their role and install path in the label/hint (`.claude/commands/tink/` vs `.claude/skills/tink/`), and Codex skills explicitly say `~/.codex/skills/ (CODEX_HOME)` - the two Claude items no longer look like duplicates, and the Codex item can't be mistaken for a Claude one.
package/README.ko.md CHANGED
@@ -10,7 +10,7 @@ Tink는 사소하지 않은 모든 에이전트 작업을 눈에 보이는 파
10
10
 
11
11
  <sub>Claude Code와 Codex를 위한 작은 하네스 레이어</sub>
12
12
 
13
- **최신 패키지:** v1.11.1 대시보드: `npx tink-harness dashboard`로 하네스 건강 리포트를 만들고 브라우저로 바로 엽니다. update가 승인 이력·신호 기록을 지우던 심각한 버그를 고쳤고, 설치 항목 라벨(명령 vs skill, 설치 경로 표기)도 명확해졌습니다. 전체 변경 이력은 [CHANGELOG](CHANGELOG.md)를 확인하세요.
13
+ **최신 패키지:** v1.11.2하네스 지도가 설치 직후부터 살아 있습니다: run 기록이 없어도 라우팅 규칙과 check/guard 체인이 연결선·신호로 표시됩니다. 1.11.x의 대시보드 명령과 update 기록 보존 수정도 포함. 전체 변경 이력은 [CHANGELOG](CHANGELOG.md)를 확인하세요.
14
14
 
15
15
  [English](README.md) · **한국어** · [변경 이력](CHANGELOG.md)
16
16
 
package/README.md CHANGED
@@ -17,14 +17,14 @@
17
17
  <p><sub>A small harness layer for Claude Code and Codex</sub></p>
18
18
 
19
19
  <p>
20
- <a href="https://github.com/dotoricode/tink-harness/releases/tag/v1.11.1"><img src="https://img.shields.io/github/v/release/dotoricode/tink-harness?label=release&color=2ea44f" alt="GitHub release"></a>
20
+ <a href="https://github.com/dotoricode/tink-harness/releases/tag/v1.11.2"><img src="https://img.shields.io/github/v/release/dotoricode/tink-harness?label=release&color=2ea44f" alt="GitHub release"></a>
21
21
  <a href="https://www.npmjs.com/package/tink-harness"><img src="https://img.shields.io/npm/v/tink-harness?label=npm&color=cb3837" alt="npm version"></a>
22
22
  <a href="https://github.com/dotoricode/tink-harness/actions/workflows/ci.yml"><img src="https://img.shields.io/github/actions/workflow/status/dotoricode/tink-harness/ci.yml?branch=main&label=ci" alt="CI"></a>
23
23
  <a href="https://github.com/dotoricode/tink-harness/blob/main/LICENSE"><img src="https://img.shields.io/github/license/dotoricode/tink-harness" alt="License"></a>
24
24
  <a href="https://github.com/dotoricode/tink-harness/stargazers"><img src="https://img.shields.io/github/stars/dotoricode/tink-harness?style=social" alt="GitHub stars"></a>
25
25
  </p>
26
26
 
27
- <p><strong>Latest package:</strong> v1.11.1 - One-line dashboard: <code>npx tink-harness dashboard</code> generates the harness health report and opens it in your browser. Also fixes a serious update bug that wiped approval-ledger and signal history, and clarifies the installer component labels (commands vs skill, with install paths). See <a href="CHANGELOG.md">CHANGELOG</a> for release history.</p>
27
+ <p><strong>Latest package:</strong> v1.11.2 - The 3D harness map is now alive from the very first install: routing rules and their check/guard chains always render as connections with signal pulses, even before any run history exists. Plus the one-line dashboard command and the update history-preservation fixes from 1.11.x. See <a href="CHANGELOG.md">CHANGELOG</a> for release history.</p>
28
28
 
29
29
  **English** · [한국어](README.ko.md) · [Changelog](CHANGELOG.md)
30
30
 
package/VERSIONING.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Versioning
2
2
 
3
- Current version: `1.11.1`
3
+ Current version: `1.11.2`
4
4
 
5
5
  Tink follows semver from `1.0.0` onward.
6
6
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tink-harness",
3
- "version": "1.11.1",
3
+ "version": "1.11.2",
4
4
  "description": "Self-growing harnesses for Claude Code and Codex.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -192,7 +192,7 @@ function addGraphEdge(edges, edge) {
192
192
  if (!edges.has(key)) edges.set(key, edge);
193
193
  }
194
194
 
195
- function buildGraph(harnessSummaries) {
195
+ function buildGraph(harnessSummaries, ruleIndex) {
196
196
  const nodes = new Map();
197
197
  const edges = new Map();
198
198
 
@@ -268,6 +268,56 @@ function buildGraph(harnessSummaries) {
268
268
  }
269
269
  }
270
270
 
271
+ // Static structure from the rule graph: rules that route to a harness are
272
+ // always connected, so the map shows relationships (and signal pulses) even
273
+ // before any runs or ledger evidence exist.
274
+ const knownHarnesses = new Set(harnessSummaries.map((item) => item.id));
275
+ const ruleNodes = Array.isArray(ruleIndex?.nodes) ? ruleIndex.nodes : [];
276
+ for (const rule of ruleNodes) {
277
+ if (!rule || !rule.id) continue;
278
+ const targets = new Set();
279
+ if (Array.isArray(rule.select_harnesses)) {
280
+ for (const name of rule.select_harnesses) targets.add(name);
281
+ }
282
+ if (rule.type === 'harness' && rule.target) targets.add(rule.target);
283
+ const linked = [...targets].filter((name) => knownHarnesses.has(name));
284
+ if (!linked.length) continue;
285
+ const ruleNodeId = graphNodeId('rule', rule.id);
286
+ addGraphNode(nodes, {
287
+ id: ruleNodeId,
288
+ type: 'rule',
289
+ label: rule.id,
290
+ weight: 1
291
+ });
292
+ for (const name of linked) {
293
+ addGraphEdge(edges, {
294
+ source: graphNodeId('harness', name),
295
+ target: ruleNodeId,
296
+ type: 'uses_rule',
297
+ count: 1
298
+ });
299
+ }
300
+ }
301
+ const ruleEdges = Array.isArray(ruleIndex?.edges) ? ruleIndex.edges : [];
302
+ for (const edge of ruleEdges) {
303
+ if (!edge || !edge.from || !edge.to) continue;
304
+ const fromId = graphNodeId('rule', edge.from);
305
+ if (!nodes.has(fromId)) continue;
306
+ const toId = graphNodeId('rule', edge.to);
307
+ addGraphNode(nodes, {
308
+ id: toId,
309
+ type: 'rule',
310
+ label: edge.to,
311
+ weight: 1
312
+ });
313
+ addGraphEdge(edges, {
314
+ source: fromId,
315
+ target: toId,
316
+ type: edge.relation || 'rule_edge',
317
+ count: 1
318
+ });
319
+ }
320
+
271
321
  return {
272
322
  nodes: [...nodes.values()].sort((a, b) => a.id.localeCompare(b.id)),
273
323
  edges: [...edges.values()].sort((a, b) => (
@@ -559,7 +609,7 @@ function summarize(root) {
559
609
  '.tink/maintenance/ledger.jsonl'
560
610
  ],
561
611
  harnesses: harnessSummaries,
562
- graph: buildGraph(harnessSummaries),
612
+ graph: buildGraph(harnessSummaries, ruleIndex),
563
613
  timeline: buildTimeline(runs, root),
564
614
  maintenance_events: maintenanceEvents
565
615
  };