tink-harness 1.9.11 → 1.9.13
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/.claude-plugin/plugin.json +1 -1
- package/CHANGELOG.md +22 -0
- package/README.ko.md +2 -2
- package/README.md +3 -3
- package/VERSIONING.md +1 -1
- package/bin/install.js +2 -1
- package/commands/update.md +86 -86
- package/package.json +1 -1
- package/templates/claude/commands/tink/update.md +86 -86
- package/templates/tink/tools/render-harness-health-report.mjs +73 -63
package/CHANGELOG.md
CHANGED
|
@@ -6,6 +6,28 @@ All notable changes to Tink are tracked here.
|
|
|
6
6
|
|
|
7
7
|
No unreleased changes yet.
|
|
8
8
|
|
|
9
|
+
## [1.9.13] - 2026-06-11
|
|
10
|
+
|
|
11
|
+
### Fixed
|
|
12
|
+
|
|
13
|
+
- `npx tink-harness update` now always refreshes `.tink/tools/` (the lifecycle generator and health-report renderer). Previously stale tools were preserved as "user-modified", so updated installs kept rendering the old dashboard. Run `update` again on affected machines to pick up the current tools.
|
|
14
|
+
|
|
15
|
+
### Changed
|
|
16
|
+
|
|
17
|
+
- `/tink:update` docs and the update summary now list `.tink/tools/` in the always-updated category; added a regression test that a stale tool file is overwritten by `update`.
|
|
18
|
+
|
|
19
|
+
## [1.9.12] - 2026-06-11
|
|
20
|
+
|
|
21
|
+
### Changed
|
|
22
|
+
|
|
23
|
+
- Restyled the dashboard with a warm editorial palette (charcoal/ivory/amber) in place of the generic black-and-blue look, with softer semantic tones and larger radii.
|
|
24
|
+
- Improved harness-tab readability: bigger card titles, labels, detail text, and history entries with more breathing room.
|
|
25
|
+
|
|
26
|
+
### Added
|
|
27
|
+
|
|
28
|
+
- Next-action suggestions now provide copy-paste commands for both Claude Code (`/tink:...`) and Codex (`$tink:...`).
|
|
29
|
+
- README (EN/KO) refreshed: latest-package summary, release badge, and an up-to-date description of the tabbed dashboard, 3D harness map, and next-action panel.
|
|
30
|
+
|
|
9
31
|
## [1.9.11] - 2026-06-11
|
|
10
32
|
|
|
11
33
|
### Changed
|
package/README.ko.md
CHANGED
|
@@ -8,7 +8,7 @@ Claude Code와 Codex를 위한 작은 하네스 레이어입니다.
|
|
|
8
8
|
|
|
9
9
|
Tink는 지금 작업에 맞는 하네스를 고르고, 실행 상태를 보이게 만들고, 실제 사용 중 생긴 실패와 피드백으로 하네스 세트를 개선합니다.
|
|
10
10
|
|
|
11
|
-
**최신 패키지:** v1.9.
|
|
11
|
+
**최신 패키지:** v1.9.13 — 로컬 건강 리포트가 탭형 대시보드로 바뀌었습니다. 3D 하네스 지도, 쉬운 말 건강 요약, Claude Code와 Codex 양쪽 복사-붙여넣기 명령이 포함된 다음 행동 제안을 제공합니다. 전체 변경 이력은 [CHANGELOG](CHANGELOG.md)를 확인하세요.
|
|
12
12
|
|
|
13
13
|
[English](README.md) · **한국어** · [변경 이력](CHANGELOG.md)
|
|
14
14
|
|
|
@@ -131,7 +131,7 @@ node .tink/tools/generate-harness-lifecycle-summary.mjs
|
|
|
131
131
|
node .tink/tools/render-harness-health-report.mjs
|
|
132
132
|
```
|
|
133
133
|
|
|
134
|
-
리포트는
|
|
134
|
+
리포트는 정적인 탭형 로컬 페이지입니다. 홈 요약, 사용량 순 하네스 카드와 평가·생성 히스토리, 메모리 참조, run 활동 피드, 그리고 인터랙티브 3D 하네스 지도(드래그 이동, 우클릭 드래그 회전, 휠 확대 — three.js를 CDN에서 불러오며 오프라인이면 안내가 표시됩니다)를 제공합니다. 하네스나 건강 그룹을 선택하면 쉬운 말 요약과 함께 Claude Code(`/tink:...`)·Codex(`$tink:...`) 양쪽 복사용 명령이 포함된 다음 행동을 제안합니다. 여전히 서버를 시작하거나, 파일을 감시하거나, hidden cache를 만들거나, 새 public `tink index` 명령을 추가하지 않습니다 — 제안만 하며, 재사용 상태 변경은 기존 승인 절차를 그대로 따릅니다.
|
|
135
135
|
|
|
136
136
|
선택된 하네스에 따라 `.tink/current/goals.json`에는 현재 실행의 목표 체크포인트가, `.tink/current/delegation.md`에는 인수인계 패킷이 추가될 수 있습니다. Tink는 이런 브리프를 보이는 상태로 준비하지만, 별도 승인된 워크플로가 아니면 worker, tmux pane, worktree를 시작하지 않습니다.
|
|
137
137
|
|
package/README.md
CHANGED
|
@@ -17,14 +17,14 @@
|
|
|
17
17
|
</p>
|
|
18
18
|
|
|
19
19
|
<p>
|
|
20
|
-
<a href="https://github.com/dotoricode/tink-harness/releases/tag/v1.9.
|
|
20
|
+
<a href="https://github.com/dotoricode/tink-harness/releases/tag/v1.9.13"><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.9.
|
|
27
|
+
<p><strong>Latest package:</strong> v1.9.13 - The local health report is now a tabbed dashboard with a 3D harness map, plain-language health summaries, and next-action suggestions with copy-paste commands for both Claude Code and Codex. See <a href="CHANGELOG.md">CHANGELOG</a> for release history.</p>
|
|
28
28
|
|
|
29
29
|
**English** · [한국어](README.ko.md) · [Changelog](CHANGELOG.md)
|
|
30
30
|
|
|
@@ -210,7 +210,7 @@ node .tink/tools/generate-harness-lifecycle-summary.mjs
|
|
|
210
210
|
node .tink/tools/render-harness-health-report.mjs
|
|
211
211
|
```
|
|
212
212
|
|
|
213
|
-
The report is a static
|
|
213
|
+
The report is a static, tabbed local page: a home overview, usage-sorted harness cards with an evaluation/maintenance history, memory references, a run activity feed, and an interactive 3D harness map (drag to move, right-drag to rotate, wheel to zoom; rendered with three.js from a CDN, with an offline notice when unavailable). Selecting a harness or health group shows a plain-language summary plus a suggested next action with copy-paste commands for both Claude Code (`/tink:...`) and Codex (`$tink:...`). It still does not start a server, watch files, create a hidden cache, or add a public `tink index` command - suggestions only; reusable-state changes keep their approval gates.
|
|
214
214
|
|
|
215
215
|
When selected, current-run artifacts may also include `.tink/current/goals.json` for goal checkpoints or `.tink/current/delegation.md` for handoff packets. Tink prepares those briefs as visible state; it does not start workers, tmux panes, or worktrees unless a separate approved workflow does so.
|
|
216
216
|
|
package/VERSIONING.md
CHANGED
package/bin/install.js
CHANGED
|
@@ -388,7 +388,8 @@ function isAlwaysUpdatePath(src) {
|
|
|
388
388
|
return rel.startsWith('templates/claude/commands/') ||
|
|
389
389
|
rel.startsWith('templates/claude/skills/') ||
|
|
390
390
|
rel.startsWith('templates/codex/skills/') ||
|
|
391
|
-
rel.startsWith('templates/tink/maintenance/')
|
|
391
|
+
rel.startsWith('templates/tink/maintenance/') ||
|
|
392
|
+
rel.startsWith('templates/tink/tools/');
|
|
392
393
|
}
|
|
393
394
|
|
|
394
395
|
function isGeneratedLegacyRuleGraph(src, dest) {
|
package/commands/update.md
CHANGED
|
@@ -1,86 +1,86 @@
|
|
|
1
|
-
---
|
|
2
|
-
description: Detect install source, diagnose user-modified files, and show the safe update command.
|
|
3
|
-
---
|
|
4
|
-
|
|
5
|
-
# /tink:update
|
|
6
|
-
|
|
7
|
-
Tink를 최신 버전으로 안전하게 업데이트하는 방법을 안내합니다.
|
|
8
|
-
|
|
9
|
-
## What this command does
|
|
10
|
-
This command does not run the update itself. It detects how Tink was installed in this project, diagnoses whether any user-modified files are at risk, and shows the correct command to run.
|
|
11
|
-
|
|
12
|
-
## Procedure
|
|
13
|
-
1. **Source-repo guard (first):** If the project root contains all of `templates/tink/`, `bin/install.js`, and a `package.json` whose `name` is `"tink-harness"`, this is the tink-harness source repository itself — not a consumer install. Skip the rest of the procedure and emit the "source repo" output (see below). Do not show plugin or npx update commands in this case.
|
|
14
|
-
2. Detect install source:
|
|
15
|
-
- If the project root (or `cwd`) has `.claude-plugin/plugin.json` and a top-level `commands/` directory, Tink was installed via Claude Code plugin marketplace.
|
|
16
|
-
- Otherwise, treat it as an `npx tink-harness install` (standalone) installation.
|
|
17
|
-
3. Scan for files that have diverged from the latest installed templates (read-only inspection only):
|
|
18
|
-
- **Always updated**: `.claude/commands/tink/`, `.claude/skills/tink/`, `.tink/maintenance/` — template changes always propagate here.
|
|
19
|
-
- **Preserved if user-modified**: `.tink/harnesses/`, `.tink/hooks/`, `.tink/memory/`, `.tink/config.json` — respects `weave` customizations and local configuration.
|
|
20
|
-
4. Show the appropriate update path and a short list of files in the "preserved" category that have diverged.
|
|
21
|
-
|
|
22
|
-
## Update path: Claude Code plugin
|
|
23
|
-
```text
|
|
24
|
-
/plugin marketplace update tink-harness
|
|
25
|
-
/plugin update tink@tink-harness
|
|
26
|
-
/reload-plugins
|
|
27
|
-
```
|
|
28
|
-
If update is not detected, uninstall and reinstall:
|
|
29
|
-
```text
|
|
30
|
-
/plugin uninstall tink@tink-harness
|
|
31
|
-
/plugin install tink@tink-harness
|
|
32
|
-
```
|
|
33
|
-
The plugin path is handled by Claude Code and does not touch the local `.tink/` directory.
|
|
34
|
-
|
|
35
|
-
## Update path: npx (standalone)
|
|
36
|
-
```text
|
|
37
|
-
npx tink-harness@latest update
|
|
38
|
-
```
|
|
39
|
-
|
|
40
|
-
The `update` subcommand:
|
|
41
|
-
- **Always overwrites**: commands, skills, and
|
|
42
|
-
- **Preserves if modified**: harnesses, hooks, memory, and config (`.tink/harnesses/`, `.tink/hooks/`, `.tink/memory/`, `.tink/config.json`) — respects your `weave` customizations and local settings.
|
|
43
|
-
|
|
44
|
-
## Output format (source repo)
|
|
45
|
-
|
|
46
|
-
If the source-repo guard triggers, print only this and stop — do not present plugin or npx commands:
|
|
47
|
-
|
|
48
|
-
```text
|
|
49
|
-
### 🧶 Tink 업데이트 안내
|
|
50
|
-
|
|
51
|
-
이 디렉토리는 tink-harness **소스 리포지토리**입니다. 일반 사용자 업데이트 대상이 아니에요.
|
|
52
|
-
|
|
53
|
-
- 개발 변경 반영: `git pull` 후 일반적인 빌드/테스트 흐름을 사용하세요.
|
|
54
|
-
- 사용자 환경에서 업데이트 흐름을 검증하려면 별도의 프로젝트 디렉토리에서 이 명령을 실행하세요.
|
|
55
|
-
```
|
|
56
|
-
|
|
57
|
-
## Output format
|
|
58
|
-
|
|
59
|
-
```text
|
|
60
|
-
### 🧶 Tink 업데이트 안내
|
|
61
|
-
|
|
62
|
-
**설치 경로**: <plugin marketplace | npx standalone>
|
|
63
|
-
|
|
64
|
-
**항상 업데이트됨**: commands, skills, maintenance (최신 버전으로 자동 반영)
|
|
65
|
-
|
|
66
|
-
**사용자 수정 파일** (업데이트 시 보존):
|
|
67
|
-
- <path1>
|
|
68
|
-
- <path2>
|
|
69
|
-
- (보존할 파일 없음)
|
|
70
|
-
|
|
71
|
-
**업데이트 명령**:
|
|
72
|
-
<command lines>
|
|
73
|
-
|
|
74
|
-
? 어떻게 할까요?
|
|
75
|
-
1. 위 명령 복사해서 직접 실행
|
|
76
|
-
2. 변경 사항 미리 보기 (`npx tink-harness update --dry-run`) ← npx standalone에서만 표시
|
|
77
|
-
3. 취소
|
|
78
|
-
```
|
|
79
|
-
|
|
80
|
-
Use `AskUserQuestion`. Show option 2 (dry-run) **only on the npx standalone path** — Claude Code plugin updates have no dry-run equivalent. So: plugin path → 2 options (run / cancel); npx path → 3 options (run / dry-run / cancel).
|
|
81
|
-
|
|
82
|
-
## Do not
|
|
83
|
-
- Do not actually run the update command — show it for the user to run in their shell or Claude Code.
|
|
84
|
-
- Do not modify `.tink/` files during diagnosis.
|
|
85
|
-
- Do not bypass the user choice; always offer cancel.
|
|
86
|
-
- Do not present plugin or npx update commands when the source-repo guard triggers — the user is editing tink-harness itself and would get misleading instructions.
|
|
1
|
+
---
|
|
2
|
+
description: Detect install source, diagnose user-modified files, and show the safe update command.
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
# /tink:update
|
|
6
|
+
|
|
7
|
+
Tink를 최신 버전으로 안전하게 업데이트하는 방법을 안내합니다.
|
|
8
|
+
|
|
9
|
+
## What this command does
|
|
10
|
+
This command does not run the update itself. It detects how Tink was installed in this project, diagnoses whether any user-modified files are at risk, and shows the correct command to run.
|
|
11
|
+
|
|
12
|
+
## Procedure
|
|
13
|
+
1. **Source-repo guard (first):** If the project root contains all of `templates/tink/`, `bin/install.js`, and a `package.json` whose `name` is `"tink-harness"`, this is the tink-harness source repository itself — not a consumer install. Skip the rest of the procedure and emit the "source repo" output (see below). Do not show plugin or npx update commands in this case.
|
|
14
|
+
2. Detect install source:
|
|
15
|
+
- If the project root (or `cwd`) has `.claude-plugin/plugin.json` and a top-level `commands/` directory, Tink was installed via Claude Code plugin marketplace.
|
|
16
|
+
- Otherwise, treat it as an `npx tink-harness install` (standalone) installation.
|
|
17
|
+
3. Scan for files that have diverged from the latest installed templates (read-only inspection only):
|
|
18
|
+
- **Always updated**: `.claude/commands/tink/`, `.claude/skills/tink/`, `.tink/maintenance/`, `.tink/tools/` — template changes always propagate here.
|
|
19
|
+
- **Preserved if user-modified**: `.tink/harnesses/`, `.tink/hooks/`, `.tink/memory/`, `.tink/config.json` — respects `weave` customizations and local configuration.
|
|
20
|
+
4. Show the appropriate update path and a short list of files in the "preserved" category that have diverged.
|
|
21
|
+
|
|
22
|
+
## Update path: Claude Code plugin
|
|
23
|
+
```text
|
|
24
|
+
/plugin marketplace update tink-harness
|
|
25
|
+
/plugin update tink@tink-harness
|
|
26
|
+
/reload-plugins
|
|
27
|
+
```
|
|
28
|
+
If update is not detected, uninstall and reinstall:
|
|
29
|
+
```text
|
|
30
|
+
/plugin uninstall tink@tink-harness
|
|
31
|
+
/plugin install tink@tink-harness
|
|
32
|
+
```
|
|
33
|
+
The plugin path is handled by Claude Code and does not touch the local `.tink/` directory.
|
|
34
|
+
|
|
35
|
+
## Update path: npx (standalone)
|
|
36
|
+
```text
|
|
37
|
+
npx tink-harness@latest update
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
The `update` subcommand:
|
|
41
|
+
- **Always overwrites**: commands, skills, maintenance, and runtime tools (`.claude/commands/tink/`, `.claude/skills/tink/`, `.tink/maintenance/`, `.tink/tools/`) — so you get the latest harness runner, report tools, and command behavior automatically.
|
|
42
|
+
- **Preserves if modified**: harnesses, hooks, memory, and config (`.tink/harnesses/`, `.tink/hooks/`, `.tink/memory/`, `.tink/config.json`) — respects your `weave` customizations and local settings.
|
|
43
|
+
|
|
44
|
+
## Output format (source repo)
|
|
45
|
+
|
|
46
|
+
If the source-repo guard triggers, print only this and stop — do not present plugin or npx commands:
|
|
47
|
+
|
|
48
|
+
```text
|
|
49
|
+
### 🧶 Tink 업데이트 안내
|
|
50
|
+
|
|
51
|
+
이 디렉토리는 tink-harness **소스 리포지토리**입니다. 일반 사용자 업데이트 대상이 아니에요.
|
|
52
|
+
|
|
53
|
+
- 개발 변경 반영: `git pull` 후 일반적인 빌드/테스트 흐름을 사용하세요.
|
|
54
|
+
- 사용자 환경에서 업데이트 흐름을 검증하려면 별도의 프로젝트 디렉토리에서 이 명령을 실행하세요.
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
## Output format
|
|
58
|
+
|
|
59
|
+
```text
|
|
60
|
+
### 🧶 Tink 업데이트 안내
|
|
61
|
+
|
|
62
|
+
**설치 경로**: <plugin marketplace | npx standalone>
|
|
63
|
+
|
|
64
|
+
**항상 업데이트됨**: commands, skills, maintenance, tools (최신 버전으로 자동 반영)
|
|
65
|
+
|
|
66
|
+
**사용자 수정 파일** (업데이트 시 보존):
|
|
67
|
+
- <path1>
|
|
68
|
+
- <path2>
|
|
69
|
+
- (보존할 파일 없음)
|
|
70
|
+
|
|
71
|
+
**업데이트 명령**:
|
|
72
|
+
<command lines>
|
|
73
|
+
|
|
74
|
+
? 어떻게 할까요?
|
|
75
|
+
1. 위 명령 복사해서 직접 실행
|
|
76
|
+
2. 변경 사항 미리 보기 (`npx tink-harness update --dry-run`) ← npx standalone에서만 표시
|
|
77
|
+
3. 취소
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
Use `AskUserQuestion`. Show option 2 (dry-run) **only on the npx standalone path** — Claude Code plugin updates have no dry-run equivalent. So: plugin path → 2 options (run / cancel); npx path → 3 options (run / dry-run / cancel).
|
|
81
|
+
|
|
82
|
+
## Do not
|
|
83
|
+
- Do not actually run the update command — show it for the user to run in their shell or Claude Code.
|
|
84
|
+
- Do not modify `.tink/` files during diagnosis.
|
|
85
|
+
- Do not bypass the user choice; always offer cancel.
|
|
86
|
+
- Do not present plugin or npx update commands when the source-repo guard triggers — the user is editing tink-harness itself and would get misleading instructions.
|
package/package.json
CHANGED
|
@@ -1,86 +1,86 @@
|
|
|
1
|
-
---
|
|
2
|
-
description: Detect install source, diagnose user-modified files, and show the safe update command.
|
|
3
|
-
---
|
|
4
|
-
|
|
5
|
-
# /tink:update
|
|
6
|
-
|
|
7
|
-
Tink를 최신 버전으로 안전하게 업데이트하는 방법을 안내합니다.
|
|
8
|
-
|
|
9
|
-
## What this command does
|
|
10
|
-
This command does not run the update itself. It detects how Tink was installed in this project, diagnoses whether any user-modified files are at risk, and shows the correct command to run.
|
|
11
|
-
|
|
12
|
-
## Procedure
|
|
13
|
-
1. **Source-repo guard (first):** If the project root contains all of `templates/tink/`, `bin/install.js`, and a `package.json` whose `name` is `"tink-harness"`, this is the tink-harness source repository itself — not a consumer install. Skip the rest of the procedure and emit the "source repo" output (see below). Do not show plugin or npx update commands in this case.
|
|
14
|
-
2. Detect install source:
|
|
15
|
-
- If the project root (or `cwd`) has `.claude-plugin/plugin.json` and a top-level `commands/` directory, Tink was installed via Claude Code plugin marketplace.
|
|
16
|
-
- Otherwise, treat it as an `npx tink-harness install` (standalone) installation.
|
|
17
|
-
3. Scan for files that have diverged from the latest installed templates (read-only inspection only):
|
|
18
|
-
- **Always updated**: `.claude/commands/tink/`, `.claude/skills/tink/`, `.tink/maintenance/` — template changes always propagate here.
|
|
19
|
-
- **Preserved if user-modified**: `.tink/harnesses/`, `.tink/hooks/`, `.tink/memory/`, `.tink/config.json` — respects `weave` customizations and local configuration.
|
|
20
|
-
4. Show the appropriate update path and a short list of files in the "preserved" category that have diverged.
|
|
21
|
-
|
|
22
|
-
## Update path: Claude Code plugin
|
|
23
|
-
```text
|
|
24
|
-
/plugin marketplace update tink-harness
|
|
25
|
-
/plugin update tink@tink-harness
|
|
26
|
-
/reload-plugins
|
|
27
|
-
```
|
|
28
|
-
If update is not detected, uninstall and reinstall:
|
|
29
|
-
```text
|
|
30
|
-
/plugin uninstall tink@tink-harness
|
|
31
|
-
/plugin install tink@tink-harness
|
|
32
|
-
```
|
|
33
|
-
The plugin path is handled by Claude Code and does not touch the local `.tink/` directory.
|
|
34
|
-
|
|
35
|
-
## Update path: npx (standalone)
|
|
36
|
-
```text
|
|
37
|
-
npx tink-harness@latest update
|
|
38
|
-
```
|
|
39
|
-
|
|
40
|
-
The `update` subcommand:
|
|
41
|
-
- **Always overwrites**: commands, skills, and
|
|
42
|
-
- **Preserves if modified**: harnesses, hooks, memory, and config (`.tink/harnesses/`, `.tink/hooks/`, `.tink/memory/`, `.tink/config.json`) — respects your `weave` customizations and local settings.
|
|
43
|
-
|
|
44
|
-
## Output format (source repo)
|
|
45
|
-
|
|
46
|
-
If the source-repo guard triggers, print only this and stop — do not present plugin or npx commands:
|
|
47
|
-
|
|
48
|
-
```text
|
|
49
|
-
### 🧶 Tink 업데이트 안내
|
|
50
|
-
|
|
51
|
-
이 디렉토리는 tink-harness **소스 리포지토리**입니다. 일반 사용자 업데이트 대상이 아니에요.
|
|
52
|
-
|
|
53
|
-
- 개발 변경 반영: `git pull` 후 일반적인 빌드/테스트 흐름을 사용하세요.
|
|
54
|
-
- 사용자 환경에서 업데이트 흐름을 검증하려면 별도의 프로젝트 디렉토리에서 이 명령을 실행하세요.
|
|
55
|
-
```
|
|
56
|
-
|
|
57
|
-
## Output format
|
|
58
|
-
|
|
59
|
-
```text
|
|
60
|
-
### 🧶 Tink 업데이트 안내
|
|
61
|
-
|
|
62
|
-
**설치 경로**: <plugin marketplace | npx standalone>
|
|
63
|
-
|
|
64
|
-
**항상 업데이트됨**: commands, skills, maintenance (최신 버전으로 자동 반영)
|
|
65
|
-
|
|
66
|
-
**사용자 수정 파일** (업데이트 시 보존):
|
|
67
|
-
- <path1>
|
|
68
|
-
- <path2>
|
|
69
|
-
- (보존할 파일 없음)
|
|
70
|
-
|
|
71
|
-
**업데이트 명령**:
|
|
72
|
-
<command lines>
|
|
73
|
-
|
|
74
|
-
? 어떻게 할까요?
|
|
75
|
-
1. 위 명령 복사해서 직접 실행
|
|
76
|
-
2. 변경 사항 미리 보기 (`npx tink-harness update --dry-run`) ← npx standalone에서만 표시
|
|
77
|
-
3. 취소
|
|
78
|
-
```
|
|
79
|
-
|
|
80
|
-
Use `AskUserQuestion`. Show option 2 (dry-run) **only on the npx standalone path** — Claude Code plugin updates have no dry-run equivalent. So: plugin path → 2 options (run / cancel); npx path → 3 options (run / dry-run / cancel).
|
|
81
|
-
|
|
82
|
-
## Do not
|
|
83
|
-
- Do not actually run the update command — show it for the user to run in their shell or Claude Code.
|
|
84
|
-
- Do not modify `.tink/` files during diagnosis.
|
|
85
|
-
- Do not bypass the user choice; always offer cancel.
|
|
86
|
-
- Do not present plugin or npx update commands when the source-repo guard triggers — the user is editing tink-harness itself and would get misleading instructions.
|
|
1
|
+
---
|
|
2
|
+
description: Detect install source, diagnose user-modified files, and show the safe update command.
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
# /tink:update
|
|
6
|
+
|
|
7
|
+
Tink를 최신 버전으로 안전하게 업데이트하는 방법을 안내합니다.
|
|
8
|
+
|
|
9
|
+
## What this command does
|
|
10
|
+
This command does not run the update itself. It detects how Tink was installed in this project, diagnoses whether any user-modified files are at risk, and shows the correct command to run.
|
|
11
|
+
|
|
12
|
+
## Procedure
|
|
13
|
+
1. **Source-repo guard (first):** If the project root contains all of `templates/tink/`, `bin/install.js`, and a `package.json` whose `name` is `"tink-harness"`, this is the tink-harness source repository itself — not a consumer install. Skip the rest of the procedure and emit the "source repo" output (see below). Do not show plugin or npx update commands in this case.
|
|
14
|
+
2. Detect install source:
|
|
15
|
+
- If the project root (or `cwd`) has `.claude-plugin/plugin.json` and a top-level `commands/` directory, Tink was installed via Claude Code plugin marketplace.
|
|
16
|
+
- Otherwise, treat it as an `npx tink-harness install` (standalone) installation.
|
|
17
|
+
3. Scan for files that have diverged from the latest installed templates (read-only inspection only):
|
|
18
|
+
- **Always updated**: `.claude/commands/tink/`, `.claude/skills/tink/`, `.tink/maintenance/`, `.tink/tools/` — template changes always propagate here.
|
|
19
|
+
- **Preserved if user-modified**: `.tink/harnesses/`, `.tink/hooks/`, `.tink/memory/`, `.tink/config.json` — respects `weave` customizations and local configuration.
|
|
20
|
+
4. Show the appropriate update path and a short list of files in the "preserved" category that have diverged.
|
|
21
|
+
|
|
22
|
+
## Update path: Claude Code plugin
|
|
23
|
+
```text
|
|
24
|
+
/plugin marketplace update tink-harness
|
|
25
|
+
/plugin update tink@tink-harness
|
|
26
|
+
/reload-plugins
|
|
27
|
+
```
|
|
28
|
+
If update is not detected, uninstall and reinstall:
|
|
29
|
+
```text
|
|
30
|
+
/plugin uninstall tink@tink-harness
|
|
31
|
+
/plugin install tink@tink-harness
|
|
32
|
+
```
|
|
33
|
+
The plugin path is handled by Claude Code and does not touch the local `.tink/` directory.
|
|
34
|
+
|
|
35
|
+
## Update path: npx (standalone)
|
|
36
|
+
```text
|
|
37
|
+
npx tink-harness@latest update
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
The `update` subcommand:
|
|
41
|
+
- **Always overwrites**: commands, skills, maintenance, and runtime tools (`.claude/commands/tink/`, `.claude/skills/tink/`, `.tink/maintenance/`, `.tink/tools/`) — so you get the latest harness runner, report tools, and command behavior automatically.
|
|
42
|
+
- **Preserves if modified**: harnesses, hooks, memory, and config (`.tink/harnesses/`, `.tink/hooks/`, `.tink/memory/`, `.tink/config.json`) — respects your `weave` customizations and local settings.
|
|
43
|
+
|
|
44
|
+
## Output format (source repo)
|
|
45
|
+
|
|
46
|
+
If the source-repo guard triggers, print only this and stop — do not present plugin or npx commands:
|
|
47
|
+
|
|
48
|
+
```text
|
|
49
|
+
### 🧶 Tink 업데이트 안내
|
|
50
|
+
|
|
51
|
+
이 디렉토리는 tink-harness **소스 리포지토리**입니다. 일반 사용자 업데이트 대상이 아니에요.
|
|
52
|
+
|
|
53
|
+
- 개발 변경 반영: `git pull` 후 일반적인 빌드/테스트 흐름을 사용하세요.
|
|
54
|
+
- 사용자 환경에서 업데이트 흐름을 검증하려면 별도의 프로젝트 디렉토리에서 이 명령을 실행하세요.
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
## Output format
|
|
58
|
+
|
|
59
|
+
```text
|
|
60
|
+
### 🧶 Tink 업데이트 안내
|
|
61
|
+
|
|
62
|
+
**설치 경로**: <plugin marketplace | npx standalone>
|
|
63
|
+
|
|
64
|
+
**항상 업데이트됨**: commands, skills, maintenance, tools (최신 버전으로 자동 반영)
|
|
65
|
+
|
|
66
|
+
**사용자 수정 파일** (업데이트 시 보존):
|
|
67
|
+
- <path1>
|
|
68
|
+
- <path2>
|
|
69
|
+
- (보존할 파일 없음)
|
|
70
|
+
|
|
71
|
+
**업데이트 명령**:
|
|
72
|
+
<command lines>
|
|
73
|
+
|
|
74
|
+
? 어떻게 할까요?
|
|
75
|
+
1. 위 명령 복사해서 직접 실행
|
|
76
|
+
2. 변경 사항 미리 보기 (`npx tink-harness update --dry-run`) ← npx standalone에서만 표시
|
|
77
|
+
3. 취소
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
Use `AskUserQuestion`. Show option 2 (dry-run) **only on the npx standalone path** — Claude Code plugin updates have no dry-run equivalent. So: plugin path → 2 options (run / cancel); npx path → 3 options (run / dry-run / cancel).
|
|
81
|
+
|
|
82
|
+
## Do not
|
|
83
|
+
- Do not actually run the update command — show it for the user to run in their shell or Claude Code.
|
|
84
|
+
- Do not modify `.tink/` files during diagnosis.
|
|
85
|
+
- Do not bypass the user choice; always offer cancel.
|
|
86
|
+
- Do not present plugin or npx update commands when the source-repo guard triggers — the user is editing tink-harness itself and would get misleading instructions.
|
|
@@ -162,10 +162,10 @@ const COPY = {
|
|
|
162
162
|
},
|
|
163
163
|
actions: {
|
|
164
164
|
keep: { what: 'Healthy and proven by records.', next: 'No action needed - just keep using it.', command: '', expect: '' },
|
|
165
|
-
observe: { what: 'Not enough records to judge yet.', next: 'Keep working normally with /tink:cast so records accumulate.', command: '
|
|
166
|
-
weave: { what: 'Repeated friction shows up in the records.', next: 'Run /tink:weave to prepare a small improvement proposal.', command: '
|
|
167
|
-
merge_candidate: { what: 'Often used together with another harness.', next: 'Run /tink:weave to check the overlap and decide whether to combine them.', command: '
|
|
168
|
-
frog_candidate: { what: 'Repeated trouble plus high cost - cleanup candidates.', next: 'Run /tink:frog to review archive/delete with approval.', command: '
|
|
165
|
+
observe: { what: 'Not enough records to judge yet.', next: 'Keep working normally with /tink:cast so records accumulate.', command: 'tink:cast', expect: 'What happens: it picks the right harness for your task, plans the run, and the work gets recorded - improving future judgments.' },
|
|
166
|
+
weave: { what: 'Repeated friction shows up in the records.', next: 'Run /tink:weave to prepare a small improvement proposal.', command: 'tink:weave', expect: 'What happens: it drafts an improvement (e.g. updated instructions) from the recorded friction and shows it to you. Nothing changes until you approve.' },
|
|
167
|
+
merge_candidate: { what: 'Often used together with another harness.', next: 'Run /tink:weave to check the overlap and decide whether to combine them.', command: 'tink:weave', expect: 'What happens: it inspects the overlap evidence and proposes whether to combine or keep separate. Nothing changes until you approve.' },
|
|
168
|
+
frog_candidate: { what: 'Repeated trouble plus high cost - cleanup candidates.', next: 'Run /tink:frog to review archive/delete with approval.', command: 'tink:frog', expect: 'What happens: it lists cleanup candidates with their evidence. Archiving or deleting only happens after your explicit approval.' }
|
|
169
169
|
},
|
|
170
170
|
recPlain: {
|
|
171
171
|
keep: 'Working well - keep using it as is.',
|
|
@@ -300,10 +300,10 @@ COPY.ko = {
|
|
|
300
300
|
},
|
|
301
301
|
actions: {
|
|
302
302
|
keep: { what: '기록으로 잘 검증되어 있어요.', next: '별도 행동이 필요 없어요 — 계속 사용하면 됩니다.', command: '', expect: '' },
|
|
303
|
-
observe: { what: '아직 판단할 기록이 부족해요.', next: '/tink:cast로 평소처럼 작업하면 기록이 쌓여 판단이 정확해져요.', command: '
|
|
304
|
-
weave: { what: '반복되는 마찰이 기록되어 있어요.', next: '/tink:weave를 실행해 작은 개선 제안을 준비하세요.', command: '
|
|
305
|
-
merge_candidate: { what: '다른 하네스와 자주 함께 쓰여요.', next: '/tink:weave로 겹침을 확인하고 합칠지 검토하세요.', command: '
|
|
306
|
-
frog_candidate: { what: '반복 문제와 높은 비용이 기록됐어요 — 정리 후보예요.', next: '/tink:frog로 보관/삭제 검토를 승인 절차와 함께 진행하세요.', command: '
|
|
303
|
+
observe: { what: '아직 판단할 기록이 부족해요.', next: '/tink:cast로 평소처럼 작업하면 기록이 쌓여 판단이 정확해져요.', command: 'tink:cast', expect: '실행하면: 작업에 맞는 하네스를 골라 계획을 세우고, 끝나면 이번 작업이 기록으로 남아 다음 판단이 정확해져요.' },
|
|
304
|
+
weave: { what: '반복되는 마찰이 기록되어 있어요.', next: '/tink:weave를 실행해 작은 개선 제안을 준비하세요.', command: 'tink:weave', expect: '실행하면: 기록된 마찰을 바탕으로 개선안(지침 수정 등)을 만들어 보여줘요. 승인하기 전에는 아무것도 바뀌지 않아요.' },
|
|
305
|
+
merge_candidate: { what: '다른 하네스와 자주 함께 쓰여요.', next: '/tink:weave로 겹침을 확인하고 합칠지 검토하세요.', command: 'tink:weave', expect: '실행하면: 겹침 근거를 살펴보고 합칠지 따로 둘지 제안해 줘요. 승인 전에는 아무것도 바뀌지 않아요.' },
|
|
306
|
+
frog_candidate: { what: '반복 문제와 높은 비용이 기록됐어요 — 정리 후보예요.', next: '/tink:frog로 보관/삭제 검토를 승인 절차와 함께 진행하세요.', command: 'tink:frog', expect: '실행하면: 정리 후보와 근거를 정리해 보여줘요. 보관·삭제는 명시적으로 승인해야만 실제로 진행돼요.' }
|
|
307
307
|
},
|
|
308
308
|
recPlain: {
|
|
309
309
|
keep: '잘 쓰이고 있어요 — 그대로 유지하면 됩니다.',
|
|
@@ -1558,14 +1558,17 @@ function renderScript(harnesses, copy) {
|
|
|
1558
1558
|
actionPanel.innerHTML = head + '<p class="action-body">' + esc(copy.actionDefault || '') + '</p>';
|
|
1559
1559
|
return;
|
|
1560
1560
|
}
|
|
1561
|
-
const
|
|
1561
|
+
const suffix = harnessId ? ' ' + harnessId : '';
|
|
1562
|
+
const cmdRow = (label, value) =>
|
|
1563
|
+
'<div class="cmd-row"><span class="cmd-label">' + esc(label) + '</span><code>' + esc(value) + '</code>' +
|
|
1564
|
+
'<button class="copy-btn" type="button" data-copy-cmd="' + esc(value) + '">' + esc(copy.copyCmd || 'Copy') + '</button></div>';
|
|
1562
1565
|
actionPanel.innerHTML = head +
|
|
1563
1566
|
(harnessId ? '<p class="action-target">' + esc(copy.actionTarget || 'Target') + ': <strong>' + esc(harnessId) + '</strong></p>' : '') +
|
|
1564
1567
|
'<p class="action-body">' + esc(action.what || '') + '</p>' +
|
|
1565
1568
|
'<p class="action-next">' + esc(action.next || '') + '</p>' +
|
|
1566
|
-
(command
|
|
1567
|
-
? '
|
|
1568
|
-
'
|
|
1569
|
+
(action.command
|
|
1570
|
+
? cmdRow('Claude Code', '/' + action.command + suffix) +
|
|
1571
|
+
cmdRow('Codex', '$' + action.command + suffix) +
|
|
1569
1572
|
(action.expect ? '<p class="action-expect">' + esc(action.expect) + '</p>' : '') +
|
|
1570
1573
|
'<p class="action-caveat">' + esc(copy.actionCaveat || '') + '</p>'
|
|
1571
1574
|
: '');
|
|
@@ -2280,30 +2283,30 @@ function renderStyles() {
|
|
|
2280
2283
|
return `<style>
|
|
2281
2284
|
:root {
|
|
2282
2285
|
color-scheme: dark;
|
|
2283
|
-
--bg-page: #
|
|
2284
|
-
--bg-card: #
|
|
2285
|
-
--bg-hover: #
|
|
2286
|
-
--bg-selected: #
|
|
2287
|
-
--border-default: #
|
|
2288
|
-
--border-hover: #
|
|
2289
|
-
--border-strong: #
|
|
2290
|
-
--text-primary: #
|
|
2291
|
-
--text-secondary: #
|
|
2292
|
-
--text-muted: #
|
|
2293
|
-
--accent: #
|
|
2294
|
-
--accent-dim: #
|
|
2295
|
-
--accent-text: #
|
|
2296
|
-
--success: #
|
|
2297
|
-
--success-dim: #
|
|
2298
|
-
--warning: #
|
|
2299
|
-
--warning-dim: #
|
|
2300
|
-
--danger: #
|
|
2301
|
-
--danger-dim: #
|
|
2302
|
-
--font-ui: 'IBM Plex Sans', -apple-system, sans-serif;
|
|
2286
|
+
--bg-page: #171511;
|
|
2287
|
+
--bg-card: #1E1B16;
|
|
2288
|
+
--bg-hover: #25211A;
|
|
2289
|
+
--bg-selected: #2C2720;
|
|
2290
|
+
--border-default: #2D2820;
|
|
2291
|
+
--border-hover: #3B342A;
|
|
2292
|
+
--border-strong: #4C4336;
|
|
2293
|
+
--text-primary: #EBE4D6;
|
|
2294
|
+
--text-secondary: #A2988A;
|
|
2295
|
+
--text-muted: #645B4E;
|
|
2296
|
+
--accent: #C9913F;
|
|
2297
|
+
--accent-dim: #3A2F1B;
|
|
2298
|
+
--accent-text: #E2B873;
|
|
2299
|
+
--success: #8FAE76;
|
|
2300
|
+
--success-dim: #28301F;
|
|
2301
|
+
--warning: #D2A24A;
|
|
2302
|
+
--warning-dim: #342917;
|
|
2303
|
+
--danger: #C97862;
|
|
2304
|
+
--danger-dim: #34221C;
|
|
2305
|
+
--font-ui: 'Avenir Next', 'Pretendard', 'IBM Plex Sans', -apple-system, 'Segoe UI', sans-serif;
|
|
2303
2306
|
--font-mono: 'IBM Plex Mono', 'Fira Code', monospace;
|
|
2304
|
-
--radius-sm:
|
|
2305
|
-
--radius-md:
|
|
2306
|
-
--radius-lg:
|
|
2307
|
+
--radius-sm: 5px;
|
|
2308
|
+
--radius-md: 8px;
|
|
2309
|
+
--radius-lg: 12px;
|
|
2307
2310
|
--border-width: 1px;
|
|
2308
2311
|
--space-1: 4px;
|
|
2309
2312
|
--space-2: 8px;
|
|
@@ -2311,12 +2314,12 @@ function renderStyles() {
|
|
|
2311
2314
|
--space-4: 16px;
|
|
2312
2315
|
--space-6: 24px;
|
|
2313
2316
|
--space-8: 32px;
|
|
2314
|
-
--chart-line: #
|
|
2317
|
+
--chart-line: #C9913F;
|
|
2315
2318
|
--chart-line-w: 1.5px;
|
|
2316
|
-
--chart-area: rgba(
|
|
2317
|
-
--chart-grid: #
|
|
2318
|
-
--chart-dot-fill: #
|
|
2319
|
-
--chart-dot-stroke: #
|
|
2319
|
+
--chart-area: rgba(201, 145, 63, 0.07);
|
|
2320
|
+
--chart-grid: #2D2820;
|
|
2321
|
+
--chart-dot-fill: #1E1B16;
|
|
2322
|
+
--chart-dot-stroke: #C9913F;
|
|
2320
2323
|
}
|
|
2321
2324
|
|
|
2322
2325
|
* { box-sizing: border-box; }
|
|
@@ -3047,7 +3050,7 @@ function renderStyles() {
|
|
|
3047
3050
|
padding: 6px 12px;
|
|
3048
3051
|
border-radius: var(--radius-md);
|
|
3049
3052
|
border: 1px solid var(--border-default);
|
|
3050
|
-
background: rgba(
|
|
3053
|
+
background: rgba(23, 21, 17, 0.82);
|
|
3051
3054
|
color: var(--text-secondary);
|
|
3052
3055
|
font-size: 12px;
|
|
3053
3056
|
pointer-events: none;
|
|
@@ -3188,6 +3191,13 @@ function renderStyles() {
|
|
|
3188
3191
|
flex-wrap: wrap;
|
|
3189
3192
|
}
|
|
3190
3193
|
|
|
3194
|
+
.cmd-label {
|
|
3195
|
+
min-width: 78px;
|
|
3196
|
+
color: var(--text-muted);
|
|
3197
|
+
font-size: 11.5px;
|
|
3198
|
+
white-space: nowrap;
|
|
3199
|
+
}
|
|
3200
|
+
|
|
3191
3201
|
.cmd-row code {
|
|
3192
3202
|
background: var(--bg-hover);
|
|
3193
3203
|
border: 1px solid var(--border-default);
|
|
@@ -3485,13 +3495,14 @@ function renderStyles() {
|
|
|
3485
3495
|
|
|
3486
3496
|
.harness-summary:hover { background: var(--bg-hover); }
|
|
3487
3497
|
|
|
3488
|
-
.harness-summary .eyebrow { margin: 0 0
|
|
3498
|
+
.harness-summary .eyebrow { margin: 0 0 3px; font-size: 11.5px; letter-spacing: 0.03em; }
|
|
3489
3499
|
|
|
3490
3500
|
.harness-summary h3 {
|
|
3491
3501
|
margin: 0;
|
|
3492
|
-
font-size:
|
|
3493
|
-
line-height: 1.
|
|
3502
|
+
font-size: 15.5px;
|
|
3503
|
+
line-height: 1.3;
|
|
3494
3504
|
font-weight: 600;
|
|
3505
|
+
letter-spacing: -0.01em;
|
|
3495
3506
|
overflow-wrap: anywhere;
|
|
3496
3507
|
}
|
|
3497
3508
|
|
|
@@ -3503,12 +3514,12 @@ function renderStyles() {
|
|
|
3503
3514
|
|
|
3504
3515
|
.harness-mini span {
|
|
3505
3516
|
color: var(--text-secondary);
|
|
3506
|
-
font-size:
|
|
3517
|
+
font-size: 12.5px;
|
|
3507
3518
|
white-space: nowrap;
|
|
3508
3519
|
}
|
|
3509
3520
|
|
|
3510
3521
|
.harness-mini strong {
|
|
3511
|
-
font-size:
|
|
3522
|
+
font-size: 20px;
|
|
3512
3523
|
line-height: 1;
|
|
3513
3524
|
font-family: var(--font-mono);
|
|
3514
3525
|
font-weight: 600;
|
|
@@ -3552,16 +3563,15 @@ function renderStyles() {
|
|
|
3552
3563
|
.harness-reason {
|
|
3553
3564
|
margin: 0;
|
|
3554
3565
|
color: var(--text-secondary);
|
|
3555
|
-
font-size:
|
|
3556
|
-
line-height: 1.
|
|
3566
|
+
font-size: 13.5px;
|
|
3567
|
+
line-height: 1.6;
|
|
3557
3568
|
}
|
|
3558
3569
|
|
|
3559
3570
|
.detail-label {
|
|
3560
|
-
margin: var(--space-
|
|
3571
|
+
margin: var(--space-2) 0 0;
|
|
3561
3572
|
color: var(--text-secondary);
|
|
3562
|
-
font-size:
|
|
3563
|
-
|
|
3564
|
-
letter-spacing: 0.06em;
|
|
3573
|
+
font-size: 11.5px;
|
|
3574
|
+
letter-spacing: 0.04em;
|
|
3565
3575
|
}
|
|
3566
3576
|
|
|
3567
3577
|
.co-used-chips { display: flex; flex-wrap: wrap; gap: 6px; }
|
|
@@ -3588,7 +3598,7 @@ function renderStyles() {
|
|
|
3588
3598
|
display: flex;
|
|
3589
3599
|
justify-content: space-between;
|
|
3590
3600
|
gap: var(--space-2);
|
|
3591
|
-
font-size:
|
|
3601
|
+
font-size: 13px;
|
|
3592
3602
|
color: var(--text-secondary);
|
|
3593
3603
|
}
|
|
3594
3604
|
|
|
@@ -3597,17 +3607,17 @@ function renderStyles() {
|
|
|
3597
3607
|
.harness-next {
|
|
3598
3608
|
margin: 0;
|
|
3599
3609
|
color: var(--text-primary);
|
|
3600
|
-
font-size:
|
|
3601
|
-
line-height: 1.
|
|
3610
|
+
font-size: 13.5px;
|
|
3611
|
+
line-height: 1.6;
|
|
3602
3612
|
}
|
|
3603
3613
|
|
|
3604
3614
|
.evidence-list {
|
|
3605
3615
|
margin: 0;
|
|
3606
3616
|
padding-left: 16px;
|
|
3607
3617
|
color: var(--text-secondary);
|
|
3608
|
-
font-size:
|
|
3618
|
+
font-size: 12.5px;
|
|
3609
3619
|
display: grid;
|
|
3610
|
-
gap:
|
|
3620
|
+
gap: 4px;
|
|
3611
3621
|
}
|
|
3612
3622
|
|
|
3613
3623
|
.harness-card .link-button { margin-top: var(--space-1); justify-self: start; }
|
|
@@ -3628,19 +3638,19 @@ function renderStyles() {
|
|
|
3628
3638
|
|
|
3629
3639
|
.history-feed li {
|
|
3630
3640
|
display: grid;
|
|
3631
|
-
grid-template-columns:
|
|
3641
|
+
grid-template-columns: 120px 1fr;
|
|
3632
3642
|
gap: var(--space-3);
|
|
3633
3643
|
align-items: start;
|
|
3634
3644
|
border: 1px solid var(--border-default);
|
|
3635
3645
|
border-radius: var(--radius-md);
|
|
3636
3646
|
background: var(--bg-card);
|
|
3637
|
-
padding: var(--space-
|
|
3647
|
+
padding: var(--space-3) var(--space-4);
|
|
3638
3648
|
}
|
|
3639
3649
|
|
|
3640
3650
|
.history-type {
|
|
3641
3651
|
display: inline-block;
|
|
3642
3652
|
font-family: var(--font-mono);
|
|
3643
|
-
font-size:
|
|
3653
|
+
font-size: 11px;
|
|
3644
3654
|
text-transform: uppercase;
|
|
3645
3655
|
letter-spacing: 0.05em;
|
|
3646
3656
|
color: var(--text-secondary);
|
|
@@ -3657,12 +3667,12 @@ function renderStyles() {
|
|
|
3657
3667
|
.history-type.harness-create,
|
|
3658
3668
|
.history-type.harness-edit { color: var(--success); border-color: var(--success-dim); }
|
|
3659
3669
|
|
|
3660
|
-
.history-feed strong { font-size:
|
|
3670
|
+
.history-feed strong { font-size: 13.5px; font-weight: 500; }
|
|
3661
3671
|
|
|
3662
3672
|
.history-harnesses {
|
|
3663
|
-
margin:
|
|
3673
|
+
margin: 3px 0 0;
|
|
3664
3674
|
color: var(--text-secondary);
|
|
3665
|
-
font-size:
|
|
3675
|
+
font-size: 12.5px;
|
|
3666
3676
|
font-family: var(--font-mono);
|
|
3667
3677
|
}
|
|
3668
3678
|
|