tink-harness 1.6.0 → 1.6.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.
- package/.claude-plugin/plugin.json +1 -1
- package/CHANGELOG.md +28 -0
- package/README.ko.md +17 -1
- package/README.md +17 -1
- package/VERSIONING.md +1 -1
- package/bin/install.js +121 -11
- package/docs/pr/2026-06-09-v1.6.1.ko.md +27 -0
- package/docs/pr/2026-06-09-v1.6.2.ko.md +29 -0
- package/package.json +1 -1
- package/templates/codex/skills/tink-cast/SKILL.md +1 -1
- package/templates/codex/skills/tink-frog/SKILL.md +13 -13
- package/templates/codex/skills/tink-list/SKILL.md +13 -13
- package/templates/codex/skills/tink-setup/SKILL.md +13 -13
- package/templates/codex/skills/tink-update/SKILL.md +13 -13
- package/templates/codex/skills/tink-verify/SKILL.md +13 -13
- package/templates/codex/skills/tink-weave/SKILL.md +13 -13
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,34 @@ All notable changes to Tink are tracked here.
|
|
|
7
7
|
No unreleased changes yet.
|
|
8
8
|
|
|
9
9
|
|
|
10
|
+
## [1.6.2] - 2026-06-09
|
|
11
|
+
|
|
12
|
+
### Changed
|
|
13
|
+
|
|
14
|
+
- Codex action skill templates now install with names like `Tink: Cast`, `Tink: Verify`, and `Tink: Update` so the Codex picker shows the Tink namespace clearly.
|
|
15
|
+
- The installer now separates `Claude Code Tink skill` and `Codex Tink skills` when both Claude Code and Codex surfaces are selected.
|
|
16
|
+
- Install/update output now includes repo, shared `.tink`, Claude Code, Codex, and Codex picker cleanup target paths.
|
|
17
|
+
|
|
18
|
+
### Added
|
|
19
|
+
|
|
20
|
+
- `--clean-codex-picker` and `TINK_CLEAN_CODEX_PICKER=1` for removing repo-local Claude Tink command/skill surfaces that make Codex show noisy `Source Command Tink ...` entries.
|
|
21
|
+
- Regression coverage for mixed-surface component choices, Codex skill display names, and Codex picker cleanup.
|
|
22
|
+
- Korean PR history draft for the v1.6.2 patch in `docs/pr/2026-06-09-v1.6.2.ko.md`.
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
## [1.6.1] - 2026-06-09
|
|
26
|
+
|
|
27
|
+
### Fixed
|
|
28
|
+
|
|
29
|
+
- Existing installs from v1.5.x now refresh the generated legacy `.tink/rules/index.json` during `tink-harness update`, so users receive the v1.6.0 graph-rule seed rules through `npx tink-harness@latest update`.
|
|
30
|
+
- User-modified rule graphs with custom rules or rule evidence are still preserved during update.
|
|
31
|
+
|
|
32
|
+
### Added
|
|
33
|
+
|
|
34
|
+
- Regression coverage for generated legacy rule graph refresh and custom rule graph preservation.
|
|
35
|
+
- Korean PR history draft for the v1.6.1 patch in `docs/pr/2026-06-09-v1.6.1.ko.md`.
|
|
36
|
+
|
|
37
|
+
|
|
10
38
|
## [1.6.0] - 2026-06-09
|
|
11
39
|
|
|
12
40
|
### Added
|
package/README.ko.md
CHANGED
|
@@ -8,7 +8,7 @@ Claude Code와 Codex를 위한 작은 하네스 레이어입니다.
|
|
|
8
8
|
|
|
9
9
|
Tink는 지금 작업에 맞는 하네스를 고르고, 실행 상태를 보이게 만들고, 실제 사용 중 생긴 실패와 피드백으로 하네스 세트를 개선합니다.
|
|
10
10
|
|
|
11
|
-
**최신
|
|
11
|
+
**최신 패키지:** v1.6.2 — Codex 설치가 `Tink: Cast` 같은 action skill을 보여주고, Claude/Codex skill 선택지를 분리하며, 오래된 Codex picker 항목을 정리할 수 있습니다. 최신 마이너 릴리스 노트: [v1.6.0](https://github.com/dotoricode/tink-harness/releases/tag/v1.6.0).
|
|
12
12
|
|
|
13
13
|
[English](README.md) · **한국어**
|
|
14
14
|
|
|
@@ -59,6 +59,22 @@ npx tink-harness@latest update
|
|
|
59
59
|
|
|
60
60
|
업데이트 후 Codex skill, schema, Windows 경고가 이상해 보이면 `docs/update-troubleshooting.ko.md` 또는 `docs/update-troubleshooting.md`를 확인하세요.
|
|
61
61
|
|
|
62
|
+
## 1.6.2에서 달라진 점
|
|
63
|
+
|
|
64
|
+
이번 패치는 Claude Code와 Codex를 함께 쓰는 설치 흐름을 더 명확하게 만듭니다.
|
|
65
|
+
|
|
66
|
+
- Codex action skill이 이제 `Cast`/`Verify` 같은 일반 이름 대신 `Tink: Cast`, `Tink: Verify`, `Tink: Update`처럼 설치됩니다.
|
|
67
|
+
- Claude Code와 Codex를 함께 선택했을 때 컴포넌트 선택지에서 `Claude Code Tink skill`과 `Codex Tink skills`가 분리되어 보입니다.
|
|
68
|
+
- install/update 출력에 repo, shared `.tink`, Claude Code, Codex target 경로를 표시해서 선택한 항목이 어디에 설치되는지 바로 볼 수 있습니다.
|
|
69
|
+
- `--clean-codex-picker` 또는 `TINK_CLEAN_CODEX_PICKER=1`로 Codex에 `Source Command Tink ...` 항목을 만들던 repo-local Claude Tink command/skill surface를 정리할 수 있습니다.
|
|
70
|
+
|
|
71
|
+
## 1.6.1에서 달라진 점
|
|
72
|
+
|
|
73
|
+
이번 패치는 기존 설치의 update 경로를 고칩니다.
|
|
74
|
+
|
|
75
|
+
- `tink-harness update`가 v1.5.x에서 생성된 기본 `.tink/rules/index.json`을 새 v1.6.x rule graph seed로 갱신합니다.
|
|
76
|
+
- custom rule이나 rule evidence가 들어간 사용자 수정 rule graph는 계속 보존합니다.
|
|
77
|
+
|
|
62
78
|
## 1.6.0에서 달라진 점
|
|
63
79
|
|
|
64
80
|
이번 릴리스는 Tink의 작은 rule graph를 실제 작업에서 더 쓸모 있게 만듭니다.
|
package/README.md
CHANGED
|
@@ -24,7 +24,7 @@
|
|
|
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
|
|
27
|
+
<p><strong>Latest package:</strong> v1.6.2 - Codex installs now show focused <code>Tink: Cast</code> action skills, split Claude/Codex skill choices, and can clean stale Codex picker entries. Latest minor release notes: <a href="https://github.com/dotoricode/tink-harness/releases/tag/v1.6.0">v1.6.0</a>.</p>
|
|
28
28
|
|
|
29
29
|
**English** · [한국어](README.ko.md)
|
|
30
30
|
|
|
@@ -124,6 +124,22 @@ To quickly verify the updated install, see `docs/update-verification-recipe.md`
|
|
|
124
124
|
|
|
125
125
|
If an update looks stale or incomplete, see `docs/update-troubleshooting.md` or `docs/update-troubleshooting.ko.md`.
|
|
126
126
|
|
|
127
|
+
## What's new in 1.6.2
|
|
128
|
+
|
|
129
|
+
This patch makes the installer clearer for mixed Claude Code + Codex setups.
|
|
130
|
+
|
|
131
|
+
- Codex action skills now install with names like `Tink: Cast`, `Tink: Verify`, and `Tink: Update` instead of generic `Cast`/`Verify` labels.
|
|
132
|
+
- The component picker now separates `Claude Code Tink skill` from `Codex Tink skills` when both surfaces are selected.
|
|
133
|
+
- Install/update output now prints the repo, shared `.tink`, Claude Code, and Codex target paths so you can see where the selected choices will land.
|
|
134
|
+
- `--clean-codex-picker` and `TINK_CLEAN_CODEX_PICKER=1` can remove repo-local Claude Tink command/skill surfaces that make Codex show noisy `Source Command Tink ...` entries.
|
|
135
|
+
|
|
136
|
+
## What's new in 1.6.1
|
|
137
|
+
|
|
138
|
+
This patch fixes the update path for existing installs.
|
|
139
|
+
|
|
140
|
+
- `tink-harness update` now refreshes the generated legacy `.tink/rules/index.json` from v1.5.x so existing users receive the v1.6.0 graph-rule seed rules.
|
|
141
|
+
- User-modified rule graphs are still preserved when they contain custom rules or rule evidence.
|
|
142
|
+
|
|
127
143
|
## What's new in 1.6.0
|
|
128
144
|
|
|
129
145
|
This release makes Tink's small rule graph more useful during real work.
|
package/VERSIONING.md
CHANGED
package/bin/install.js
CHANGED
|
@@ -14,6 +14,7 @@ const command = args[0] || 'install';
|
|
|
14
14
|
const isUpdate = command === 'update';
|
|
15
15
|
const dryRun = args.includes('--dry-run');
|
|
16
16
|
const force = args.includes('--force');
|
|
17
|
+
const cleanCodexPicker = args.includes('--clean-codex-picker') || process.env.TINK_CLEAN_CODEX_PICKER === '1';
|
|
17
18
|
const yes = args.includes('--yes') || args.includes('-y');
|
|
18
19
|
const interactive = process.stdin.isTTY && process.stdout.isTTY && !yes && !dryRun;
|
|
19
20
|
const source = 'https://github.com/dotoricode/tink-harness.git';
|
|
@@ -120,7 +121,7 @@ function argValue(name) {
|
|
|
120
121
|
}
|
|
121
122
|
|
|
122
123
|
function usage() {
|
|
123
|
-
console.log(`Tink installer for Claude Code and Codex\n\nUsage:\n npx tink-harness@latest [install] [--scope=repo|global] [--global] [--lang=en|ko|zh] [--yes] [--with-hook] [--dry-run] [--force]\n npx tink-harness@latest update [--scope=repo|global] [--global] [--lang=en|ko|zh] [--yes] [--dry-run] [--force]\n\nCommands:\n install Install Tink.\n update Update Tink to the latest templates. Keeps user-modified files.\n\nDefault interactive flow:\n 1. Select language\n 2. Show TINK wizard\n 3. Select Claude Code, Codex, or both\n 4. Select components\n 5. Select repo/global installation scope\n 6. Select git tracking policy for project state\n\nScopes:\n repo Install shared .tink files into the current project.\n global Install shared .tink files into your home directory.\n`);
|
|
124
|
+
console.log(`Tink installer for Claude Code and Codex\n\nUsage:\n npx tink-harness@latest [install] [--scope=repo|global] [--global] [--lang=en|ko|zh] [--yes] [--with-hook] [--clean-codex-picker] [--dry-run] [--force]\n npx tink-harness@latest update [--scope=repo|global] [--global] [--lang=en|ko|zh] [--yes] [--clean-codex-picker] [--dry-run] [--force]\n\nCommands:\n install Install Tink.\n update Update Tink to the latest templates. Keeps user-modified files.\n\nDefault interactive flow:\n 1. Select language\n 2. Show TINK wizard\n 3. Select Claude Code, Codex, or both\n 4. Select components\n 5. Select repo/global installation scope\n 6. Select git tracking policy for project state\n\nOptions:\n --clean-codex-picker Remove repo-local Claude Tink command/skill surfaces from the current repo so Codex shows focused Tink skills instead of Source Command Tink entries.\n\nEnvironment:\n TINK_INSTALL_SURFACES=claude|codex|all\n TINK_CLEAN_CODEX_PICKER=1\n\nScopes:\n repo Install shared .tink files into the current project.\n global Install shared .tink files into your home directory.\n`);
|
|
124
125
|
}
|
|
125
126
|
|
|
126
127
|
function normalizeSurfaces(surfaces) {
|
|
@@ -159,7 +160,7 @@ function codexHome() {
|
|
|
159
160
|
return process.env.CODEX_HOME || path.join(os.homedir(), '.codex');
|
|
160
161
|
}
|
|
161
162
|
|
|
162
|
-
function
|
|
163
|
+
function legacyComponentOptionsFor(agent, language) {
|
|
163
164
|
const options = COMPONENTS[language].filter((item) => {
|
|
164
165
|
if (item.value === 'commands') return includesClaude(agent);
|
|
165
166
|
if (item.value === 'hook') return includesClaude(agent);
|
|
@@ -193,6 +194,76 @@ function componentOptionsFor(agent, language) {
|
|
|
193
194
|
});
|
|
194
195
|
}
|
|
195
196
|
|
|
197
|
+
function componentOptionsFor(agent, language) {
|
|
198
|
+
const options = COMPONENTS[language].flatMap((item) => {
|
|
199
|
+
if (item.value === 'commands') return includesClaude(agent) ? [item] : [];
|
|
200
|
+
if (item.value === 'hook') return includesClaude(agent) ? [item] : [];
|
|
201
|
+
if (item.value !== 'skill') return [item];
|
|
202
|
+
|
|
203
|
+
const claudeSkill = {
|
|
204
|
+
value: 'claude-skill',
|
|
205
|
+
label: 'Claude Code Tink skill',
|
|
206
|
+
hint: language === 'ko'
|
|
207
|
+
? 'Claude Code가 읽는 Tink 작업 원칙'
|
|
208
|
+
: 'Tink operating rules for Claude Code'
|
|
209
|
+
};
|
|
210
|
+
const codexSkills = {
|
|
211
|
+
value: 'codex-skills',
|
|
212
|
+
label: 'Codex Tink skills',
|
|
213
|
+
hint: language === 'ko'
|
|
214
|
+
? 'Codex가 $tink:*로 읽는 Tink action skills'
|
|
215
|
+
: 'Tink action skills for Codex through $tink:*'
|
|
216
|
+
};
|
|
217
|
+
|
|
218
|
+
if (agent === 'claude') return [claudeSkill];
|
|
219
|
+
if (agent === 'codex') return [codexSkills];
|
|
220
|
+
return [claudeSkill, codexSkills];
|
|
221
|
+
});
|
|
222
|
+
|
|
223
|
+
if (includesCodex(agent)) {
|
|
224
|
+
options.push({
|
|
225
|
+
value: 'codex-picker-cleanup',
|
|
226
|
+
label: 'Codex picker cleanup',
|
|
227
|
+
hint: language === 'ko'
|
|
228
|
+
? '현재 repo의 repo-local Claude Tink surface를 정리해 Codex의 Source Command Tink 항목을 줄입니다.'
|
|
229
|
+
: 'Remove repo-local Claude Tink surfaces so Codex shows focused Tink skills.'
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
return options;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
function wantsClaudeSkill(components) {
|
|
237
|
+
return components.includes('skill') || components.includes('claude-skill');
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
function wantsCodexSkills(components) {
|
|
241
|
+
return components.includes('skill') || components.includes('codex-skills');
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
function wantsCodexPickerCleanup(components, agent) {
|
|
245
|
+
return cleanCodexPicker || components.includes('codex-picker-cleanup') || agent === 'codex';
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
function locationSummary(agent, scope) {
|
|
249
|
+
const repoTarget = process.cwd();
|
|
250
|
+
const installTarget = scope === 'global' ? os.homedir() : repoTarget;
|
|
251
|
+
return [
|
|
252
|
+
`Repo target: ${repoTarget}`,
|
|
253
|
+
`Shared .tink target: ${path.join(installTarget, '.tink')}`,
|
|
254
|
+
includesClaude(agent) ? `Claude Code command target: ${path.join(installTarget, '.claude/commands/tink')}` : null,
|
|
255
|
+
includesClaude(agent) ? `Claude Code skill target: ${path.join(installTarget, '.claude/skills/tink')}` : null,
|
|
256
|
+
includesCodex(agent) ? `Codex skills target: ${path.join(codexHome(), 'skills')}` : null,
|
|
257
|
+
includesCodex(agent) ? `Codex picker cleanup target: ${path.join(repoTarget, '.claude')}` : null
|
|
258
|
+
].filter(Boolean).join('\n');
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
function defaultComponentValues(agent, language) {
|
|
262
|
+
return componentOptionsFor(agent, language)
|
|
263
|
+
.map((item) => item.value)
|
|
264
|
+
.filter((value) => value !== 'hook' && value !== 'codex-picker-cleanup');
|
|
265
|
+
}
|
|
266
|
+
|
|
196
267
|
function colorLine(line, color) {
|
|
197
268
|
if (!process.stdout.isTTY && !interactive) return line;
|
|
198
269
|
const [r, g, b] = color;
|
|
@@ -261,6 +332,39 @@ function isAlwaysUpdatePath(src) {
|
|
|
261
332
|
rel.startsWith('templates/tink/maintenance/');
|
|
262
333
|
}
|
|
263
334
|
|
|
335
|
+
function isGeneratedLegacyRuleGraph(src, dest) {
|
|
336
|
+
const rel = path.relative(root, src).replace(/\\/g, '/');
|
|
337
|
+
if (rel !== 'templates/tink/rules/index.json') return false;
|
|
338
|
+
try {
|
|
339
|
+
const rules = JSON.parse(fs.readFileSync(dest, 'utf8'));
|
|
340
|
+
if (rules.node_shape) return false;
|
|
341
|
+
const legacyIds = [
|
|
342
|
+
'harness:code-change',
|
|
343
|
+
'harness:bug-fix',
|
|
344
|
+
'harness:ship',
|
|
345
|
+
'harness:pre-publish-multi-agent-verify',
|
|
346
|
+
'check:package-dry-run',
|
|
347
|
+
'check:readme-cli-match',
|
|
348
|
+
'guard:release-verification-stop',
|
|
349
|
+
'guard:forbidden-path-write'
|
|
350
|
+
];
|
|
351
|
+
const nodes = Array.isArray(rules.nodes) ? rules.nodes : [];
|
|
352
|
+
if (nodes.length !== legacyIds.length) return false;
|
|
353
|
+
const ids = nodes.map((node) => node && node.id);
|
|
354
|
+
if (!legacyIds.every((id) => ids.includes(id))) return false;
|
|
355
|
+
return nodes.every((node) =>
|
|
356
|
+
node &&
|
|
357
|
+
!Object.prototype.hasOwnProperty.call(node, 'reason') &&
|
|
358
|
+
!Object.prototype.hasOwnProperty.call(node, 'risk') &&
|
|
359
|
+
!Object.prototype.hasOwnProperty.call(node, 'checks') &&
|
|
360
|
+
!Object.prototype.hasOwnProperty.call(node, 'include_paths') &&
|
|
361
|
+
!Object.prototype.hasOwnProperty.call(node, 'select_harnesses')
|
|
362
|
+
);
|
|
363
|
+
} catch {
|
|
364
|
+
return false;
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
|
|
264
368
|
function writeFileFromTemplate(src, dest, base) {
|
|
265
369
|
const exists = fs.existsSync(dest);
|
|
266
370
|
if (exists && !force) {
|
|
@@ -270,12 +374,12 @@ function writeFileFromTemplate(src, dest, base) {
|
|
|
270
374
|
if (Buffer.compare(srcContent, destContent) === 0) {
|
|
271
375
|
return;
|
|
272
376
|
}
|
|
273
|
-
if (!isAlwaysUpdatePath(src)) {
|
|
377
|
+
if (!isAlwaysUpdatePath(src) && !isGeneratedLegacyRuleGraph(src, dest)) {
|
|
274
378
|
log.message(`keep user-modified ${displayPath(base, dest)}`);
|
|
275
379
|
recordOperation('preserved', base, dest);
|
|
276
380
|
return;
|
|
277
381
|
}
|
|
278
|
-
// commands/skills/maintenance:
|
|
382
|
+
// commands/skills/maintenance and generated legacy rule graph: update to new version
|
|
279
383
|
} else {
|
|
280
384
|
log.message(`skip existing ${displayPath(base, dest)}`);
|
|
281
385
|
return;
|
|
@@ -477,17 +581,20 @@ function copySelected(scope, components, agent) {
|
|
|
477
581
|
const codexTarget = codexHome();
|
|
478
582
|
const target = scope === 'global' ? globalTarget : repoTarget;
|
|
479
583
|
const templateRoot = path.join(root, 'templates');
|
|
584
|
+
const cleanupCodexPicker = wantsCodexPickerCleanup(components, agent);
|
|
480
585
|
|
|
481
|
-
if (includesClaude(agent) && components.includes('commands')) {
|
|
586
|
+
if (includesClaude(agent) && components.includes('commands') && !cleanupCodexPicker) {
|
|
482
587
|
copyTinkCommands(templateRoot, target);
|
|
483
588
|
}
|
|
484
|
-
if (
|
|
485
|
-
removeRepoLocalClaudeTinkSurface(
|
|
589
|
+
if (cleanupCodexPicker) {
|
|
590
|
+
removeRepoLocalClaudeTinkSurface(repoTarget);
|
|
486
591
|
}
|
|
487
|
-
if (components
|
|
488
|
-
if (includesClaude(agent)) {
|
|
592
|
+
if (wantsClaudeSkill(components)) {
|
|
593
|
+
if (includesClaude(agent) && !cleanupCodexPicker) {
|
|
489
594
|
copyDir(path.join(templateRoot, 'claude/skills'), path.join(target, '.claude/skills'), target);
|
|
490
595
|
}
|
|
596
|
+
}
|
|
597
|
+
if (wantsCodexSkills(components)) {
|
|
491
598
|
if (includesCodex(agent)) {
|
|
492
599
|
removeLegacyCodexSkill(codexTarget);
|
|
493
600
|
copyDir(path.join(templateRoot, 'codex/skills'), path.join(codexTarget, 'skills'), codexTarget);
|
|
@@ -611,7 +718,7 @@ async function resolveChoices() {
|
|
|
611
718
|
}
|
|
612
719
|
if (!['en', 'ko', 'zh'].includes(language)) language = 'en';
|
|
613
720
|
|
|
614
|
-
let components =
|
|
721
|
+
let components = defaultComponentValues(agent, language);
|
|
615
722
|
if (includesClaude(agent) && args.includes('--with-hook')) components.push('hook');
|
|
616
723
|
let gitPolicy = 'harnesses';
|
|
617
724
|
let hookScope = 'off';
|
|
@@ -659,7 +766,7 @@ async function resolveChoices() {
|
|
|
659
766
|
initialValues: agent === 'all' ? ['claude', 'codex'] : [agent],
|
|
660
767
|
required: true
|
|
661
768
|
})));
|
|
662
|
-
components =
|
|
769
|
+
components = defaultComponentValues(agent, language);
|
|
663
770
|
if (includesClaude(agent) && args.includes('--with-hook')) components.push('hook');
|
|
664
771
|
|
|
665
772
|
components = handleCancel(await multiselect({
|
|
@@ -694,6 +801,8 @@ async function resolveChoices() {
|
|
|
694
801
|
initialValue: scope || 'repo'
|
|
695
802
|
}));
|
|
696
803
|
|
|
804
|
+
note(locationSummary(agent, scope), language === 'ko' ? '설치 위치' : 'Install locations');
|
|
805
|
+
|
|
697
806
|
if (scope === 'repo' && components.some((item) => ['harnesses', 'memory', 'hook'].includes(item))) {
|
|
698
807
|
note(copy.gitNote, copy.gitNoteTitle);
|
|
699
808
|
gitPolicy = handleCancel(await select({
|
|
@@ -755,6 +864,7 @@ async function main() {
|
|
|
755
864
|
console.log(`language ${language}`);
|
|
756
865
|
console.log(`scope ${scope}`);
|
|
757
866
|
console.log(`components ${components.join(', ')}`);
|
|
867
|
+
console.log(locationSummary(agent, scope));
|
|
758
868
|
}
|
|
759
869
|
|
|
760
870
|
const targets = copySelected(scope, components, agent);
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# v1.6.1 패치 이력 초안
|
|
2
|
+
|
|
3
|
+
## 문제
|
|
4
|
+
|
|
5
|
+
- v1.6.0 publish 후 published `@latest` smoke에서 `1.5.0 -> latest update` 경로를 확인했음.
|
|
6
|
+
- Claude Code command와 Codex skill은 새 안내로 갱신됐지만, `.tink/rules/index.json`은 기존 파일이 user-modified로 판단되어 보존됐음.
|
|
7
|
+
- 그 결과 기존 사용자는 `npx tink-harness@latest update`를 실행해도 v1.6.0의 graph-rule seed rules를 받지 못할 수 있었음.
|
|
8
|
+
|
|
9
|
+
## 해결
|
|
10
|
+
|
|
11
|
+
- installer가 v1.5.x 기본 생성 rule graph를 안전하게 식별하도록 했음.
|
|
12
|
+
- 기본 생성본으로 보이는 `.tink/rules/index.json`은 update 때 새 템플릿으로 갱신함.
|
|
13
|
+
- custom rule이나 rule evidence가 들어간 파일은 계속 사용자 수정본으로 보고 보존함.
|
|
14
|
+
- README, README.ko.md, CHANGELOG, VERSIONING, 테스트 버전을 `1.6.1`로 맞췄음.
|
|
15
|
+
|
|
16
|
+
## 검증
|
|
17
|
+
|
|
18
|
+
- update 회귀 테스트에 generated legacy rule graph refresh 케이스를 추가했음.
|
|
19
|
+
- custom rule graph preservation 테스트를 추가했음.
|
|
20
|
+
- `npm test`, `git diff --check`, `npm pack --dry-run --json`으로 확인할 예정임.
|
|
21
|
+
- publish 후 `1.5.0 install -> latest update` smoke를 다시 실행해 `.tink/rules/index.json` 갱신 여부를 확인할 예정임.
|
|
22
|
+
|
|
23
|
+
## 참고
|
|
24
|
+
|
|
25
|
+
- patch 릴리스이므로 GitHub Release는 새로 만들지 않음.
|
|
26
|
+
- 최신 마이너 릴리스 노트는 v1.6.0에 유지함.
|
|
27
|
+
- public `tink index`, watcher, generated cache, database, 외부 서비스는 추가하지 않음.
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# v1.6.2 패치 이력 초안
|
|
2
|
+
|
|
3
|
+
## 문제
|
|
4
|
+
|
|
5
|
+
- 다른 레포에서 update 후 Codex picker에 repo-local Claude Code command가 `Source Command Tink ...`로 많이 보였음.
|
|
6
|
+
- Codex action skill은 `Cast`처럼 일반 이름으로 보여서 사용자가 기대한 `Tink: Cast` 항목을 찾기 어려웠음.
|
|
7
|
+
- Claude Code와 Codex를 함께 설치할 때 컴포넌트 선택지에서 Codex 전용 skill 선택지가 분리되어 보이지 않았음.
|
|
8
|
+
- 설치 또는 업데이트 중 선택한 surface가 실제 어느 경로에 설치되는지 중간에 확인하기 어려웠음.
|
|
9
|
+
|
|
10
|
+
## 해결
|
|
11
|
+
|
|
12
|
+
- Codex action skill 템플릿 이름을 `Tink: Cast`, `Tink: Verify`, `Tink: Update`처럼 Tink prefix가 보이도록 바꿨음.
|
|
13
|
+
- installer의 컴포넌트 선택지를 `Claude Code Tink skill`과 `Codex Tink skills`로 분리했음.
|
|
14
|
+
- install/update 출력에 repo target, shared `.tink` target, Claude Code target, Codex skills target, Codex picker cleanup target을 표시함.
|
|
15
|
+
- `--clean-codex-picker`와 `TINK_CLEAN_CODEX_PICKER=1`을 추가해서 repo-local Claude Tink command/skill surface를 명시적으로 정리할 수 있게 했음.
|
|
16
|
+
- Codex-only update는 기존처럼 repo-local Claude Tink surface를 자동 정리함.
|
|
17
|
+
|
|
18
|
+
## 검증
|
|
19
|
+
|
|
20
|
+
- `python tests/test_templates.py` 통과했음.
|
|
21
|
+
- `node --check bin/install.js` 통과했음.
|
|
22
|
+
- mixed Claude Code + Codex dry-run에서 `claude-skill`, `codex-skills`, 설치 위치 출력 확인했음.
|
|
23
|
+
- cleanup smoke에서 `.claude/commands/tink/cast.md`와 `.claude/skills/tink/SKILL.md`가 제거되고 `Tink: Cast` Codex skill이 설치되는 것 확인했음.
|
|
24
|
+
|
|
25
|
+
## 참고
|
|
26
|
+
|
|
27
|
+
- patch 릴리스이므로 GitHub Release는 새로 만들지 않음.
|
|
28
|
+
- 최신 마이너 릴리스 노트는 v1.6.0에 유지함.
|
|
29
|
+
- Claude Code와 Codex를 같은 repo에서 동시에 쓰되 Codex picker를 깔끔하게 유지하려면 `--clean-codex-picker`를 사용하면 됨.
|
package/package.json
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
---
|
|
2
|
-
name:
|
|
3
|
-
description: Propose safe cleanup for unused or redundant Tink harnesses.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Tink Frog
|
|
7
|
-
|
|
8
|
-
This is the Codex alias for `$tink:frog`.
|
|
9
|
-
|
|
10
|
-
1. Read `../tink-core/RULES.md` first.
|
|
11
|
-
2. Treat this invocation as `$tink:frog`.
|
|
12
|
-
3. Follow the canonical Tink frog behavior and never delete without approval.
|
|
13
|
-
4. Accept legacy `$tink frog` wording as the same action, but present `$tink:frog` in guidance.
|
|
1
|
+
---
|
|
2
|
+
name: "Tink: Frog"
|
|
3
|
+
description: Propose safe cleanup for unused or redundant Tink harnesses.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Tink Frog
|
|
7
|
+
|
|
8
|
+
This is the Codex alias for `$tink:frog`.
|
|
9
|
+
|
|
10
|
+
1. Read `../tink-core/RULES.md` first.
|
|
11
|
+
2. Treat this invocation as `$tink:frog`.
|
|
12
|
+
3. Follow the canonical Tink frog behavior and never delete without approval.
|
|
13
|
+
4. Accept legacy `$tink frog` wording as the same action, but present `$tink:frog` in guidance.
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
---
|
|
2
|
-
name:
|
|
3
|
-
description: Inspect available Tink harnesses and usage signals.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Tink List
|
|
7
|
-
|
|
8
|
-
This is the Codex alias for `$tink:list`.
|
|
9
|
-
|
|
10
|
-
1. Read `../tink-core/RULES.md` first.
|
|
11
|
-
2. Treat this invocation as `$tink:list`.
|
|
12
|
-
3. Follow the canonical Tink list behavior.
|
|
13
|
-
4. Accept legacy `$tink list` wording as the same action, but present `$tink:list` in guidance.
|
|
1
|
+
---
|
|
2
|
+
name: "Tink: List"
|
|
3
|
+
description: Inspect available Tink harnesses and usage signals.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Tink List
|
|
7
|
+
|
|
8
|
+
This is the Codex alias for `$tink:list`.
|
|
9
|
+
|
|
10
|
+
1. Read `../tink-core/RULES.md` first.
|
|
11
|
+
2. Treat this invocation as `$tink:list`.
|
|
12
|
+
3. Follow the canonical Tink list behavior.
|
|
13
|
+
4. Accept legacy `$tink list` wording as the same action, but present `$tink:list` in guidance.
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
---
|
|
2
|
-
name:
|
|
3
|
-
description: Configure Tink language, scope, git tracking, and policy.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Tink Setup
|
|
7
|
-
|
|
8
|
-
This is the Codex alias for `$tink:setup`.
|
|
9
|
-
|
|
10
|
-
1. Read `../tink-core/RULES.md` first.
|
|
11
|
-
2. Treat this invocation as `$tink:setup`.
|
|
12
|
-
3. Follow the canonical Tink setup behavior.
|
|
13
|
-
4. Accept legacy `$tink setup` wording as the same action, but present `$tink:setup` in guidance.
|
|
1
|
+
---
|
|
2
|
+
name: "Tink: Setup"
|
|
3
|
+
description: Configure Tink language, scope, git tracking, and policy.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Tink Setup
|
|
7
|
+
|
|
8
|
+
This is the Codex alias for `$tink:setup`.
|
|
9
|
+
|
|
10
|
+
1. Read `../tink-core/RULES.md` first.
|
|
11
|
+
2. Treat this invocation as `$tink:setup`.
|
|
12
|
+
3. Follow the canonical Tink setup behavior.
|
|
13
|
+
4. Accept legacy `$tink setup` wording as the same action, but present `$tink:setup` in guidance.
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
---
|
|
2
|
-
name:
|
|
3
|
-
description: Detect the Tink install source and show the safe update path.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Tink Update
|
|
7
|
-
|
|
8
|
-
This is the Codex alias for `$tink:update`.
|
|
9
|
-
|
|
10
|
-
1. Read `../tink-core/RULES.md` first.
|
|
11
|
-
2. Treat this invocation as `$tink:update`.
|
|
12
|
-
3. Follow the canonical Tink update behavior.
|
|
13
|
-
4. Accept legacy `$tink update` wording as the same action, but present `$tink:update` in guidance.
|
|
1
|
+
---
|
|
2
|
+
name: "Tink: Update"
|
|
3
|
+
description: Detect the Tink install source and show the safe update path.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Tink Update
|
|
7
|
+
|
|
8
|
+
This is the Codex alias for `$tink:update`.
|
|
9
|
+
|
|
10
|
+
1. Read `../tink-core/RULES.md` first.
|
|
11
|
+
2. Treat this invocation as `$tink:update`.
|
|
12
|
+
3. Follow the canonical Tink update behavior.
|
|
13
|
+
4. Accept legacy `$tink update` wording as the same action, but present `$tink:update` in guidance.
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
---
|
|
2
|
-
name:
|
|
3
|
-
description: Run or report the checks promised in the Tink contract.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Tink Verify
|
|
7
|
-
|
|
8
|
-
This is the Codex alias for `$tink:verify`.
|
|
9
|
-
|
|
10
|
-
1. Read `../tink-core/RULES.md` first.
|
|
11
|
-
2. Treat this invocation as `$tink:verify`.
|
|
12
|
-
3. Plan checks from `.tink/current/contract.json`, then record evidence in `.tink/current/verification.json`.
|
|
13
|
-
4. Accept legacy `$tink verify` wording as the same action, but present `$tink:verify` in guidance.
|
|
1
|
+
---
|
|
2
|
+
name: "Tink: Verify"
|
|
3
|
+
description: Run or report the checks promised in the Tink contract.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Tink Verify
|
|
7
|
+
|
|
8
|
+
This is the Codex alias for `$tink:verify`.
|
|
9
|
+
|
|
10
|
+
1. Read `../tink-core/RULES.md` first.
|
|
11
|
+
2. Treat this invocation as `$tink:verify`.
|
|
12
|
+
3. Plan checks from `.tink/current/contract.json`, then record evidence in `.tink/current/verification.json`.
|
|
13
|
+
4. Accept legacy `$tink verify` wording as the same action, but present `$tink:verify` in guidance.
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
---
|
|
2
|
-
name:
|
|
3
|
-
description: Improve Tink harnesses from real use, failures, and corrections.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Tink Weave
|
|
7
|
-
|
|
8
|
-
This is the Codex alias for `$tink:weave`.
|
|
9
|
-
|
|
10
|
-
1. Read `../tink-core/RULES.md` first.
|
|
11
|
-
2. Treat this invocation as `$tink:weave`.
|
|
12
|
-
3. Follow the canonical Tink weave behavior and save reusable changes only after separate approval.
|
|
13
|
-
4. Accept legacy `$tink weave` wording as the same action, but present `$tink:weave` in guidance.
|
|
1
|
+
---
|
|
2
|
+
name: "Tink: Weave"
|
|
3
|
+
description: Improve Tink harnesses from real use, failures, and corrections.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Tink Weave
|
|
7
|
+
|
|
8
|
+
This is the Codex alias for `$tink:weave`.
|
|
9
|
+
|
|
10
|
+
1. Read `../tink-core/RULES.md` first.
|
|
11
|
+
2. Treat this invocation as `$tink:weave`.
|
|
12
|
+
3. Follow the canonical Tink weave behavior and save reusable changes only after separate approval.
|
|
13
|
+
4. Accept legacy `$tink weave` wording as the same action, but present `$tink:weave` in guidance.
|