tink-harness 1.6.1 → 1.6.3

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.6.1",
4
+ "version": "1.6.3",
5
5
  "author": {
6
6
  "name": "dotori"
7
7
  }
package/CHANGELOG.md CHANGED
@@ -7,6 +7,35 @@ All notable changes to Tink are tracked here.
7
7
  No unreleased changes yet.
8
8
 
9
9
 
10
+ ## [1.6.3] - 2026-06-09
11
+
12
+ ### Changed
13
+
14
+ - Interactive install/update now includes an `Advanced options` step so `--dry-run`, `--force`, and `--clean-codex-picker` are available as visible choices instead of CLI-only flags.
15
+ - Install/update output now prints selected option state for preview, force overwrite, and Codex picker cleanup.
16
+ - Non-interactive CLI flags still work and seed the same option state used by the interactive wizard.
17
+
18
+ ### Added
19
+
20
+ - Regression coverage for visible advanced option labels and selected option output.
21
+ - Korean PR history draft for the v1.6.3 patch in `docs/pr/2026-06-09-v1.6.3.ko.md`.
22
+
23
+
24
+ ## [1.6.2] - 2026-06-09
25
+
26
+ ### Changed
27
+
28
+ - 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.
29
+ - The installer now separates `Claude Code Tink skill` and `Codex Tink skills` when both Claude Code and Codex surfaces are selected.
30
+ - Install/update output now includes repo, shared `.tink`, Claude Code, Codex, and Codex picker cleanup target paths.
31
+
32
+ ### Added
33
+
34
+ - `--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.
35
+ - Regression coverage for mixed-surface component choices, Codex skill display names, and Codex picker cleanup.
36
+ - Korean PR history draft for the v1.6.2 patch in `docs/pr/2026-06-09-v1.6.2.ko.md`.
37
+
38
+
10
39
  ## [1.6.1] - 2026-06-09
11
40
 
12
41
  ### Fixed
package/README.ko.md CHANGED
@@ -8,7 +8,7 @@ Claude Code와 Codex를 위한 작은 하네스 레이어입니다.
8
8
 
9
9
  Tink는 지금 작업에 맞는 하네스를 고르고, 실행 상태를 보이게 만들고, 실제 사용 중 생긴 실패와 피드백으로 하네스 세트를 개선합니다.
10
10
 
11
- **최신 패키지:** v1.6.1기존 설치에서 `tink-harness update`를 실행할 generated legacy rule graph도 seed rules로 갱신합니다. 최신 마이너 릴리스 노트: [v1.6.0](https://github.com/dotoricode/tink-harness/releases/tag/v1.6.0).
11
+ **최신 패키지:** v1.6.3interactive install/update에서 preview, force overwrite, Codex picker cleanup 같은 고급 옵션을 실제 선택지로 제공합니다. 최신 마이너 릴리스 노트: [v1.6.0](https://github.com/dotoricode/tink-harness/releases/tag/v1.6.0).
12
12
 
13
13
  [English](README.md) · **한국어**
14
14
 
@@ -59,12 +59,29 @@ 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.3에서 달라진 점
63
+
64
+ 이번 패치는 CLI 옵션을 interactive installer 안에서 직접 고를 수 있게 만듭니다.
65
+
66
+ - wizard에 `Advanced options` 단계가 추가되어 `Preview only (--dry-run)`, `Overwrite user-modified files (--force)`, `Clean Codex picker (--clean-codex-picker)`를 선택할 수 있습니다.
67
+ - install/update 출력에 선택된 옵션 상태를 표시해서 preview, force overwrite, Codex picker cleanup이 켜졌는지 바로 볼 수 있습니다.
68
+ - 기존 CLI flag는 그대로 동작하며, interactive wizard에서는 같은 옵션의 초기 선택값으로 반영됩니다.
69
+ ## 1.6.2에서 달라진 점
70
+
71
+ 이번 패치는 Claude Code와 Codex를 함께 쓰는 설치 흐름을 더 명확하게 만듭니다.
72
+
73
+ - Codex action skill이 이제 `Cast`/`Verify` 같은 일반 이름 대신 `Tink: Cast`, `Tink: Verify`, `Tink: Update`처럼 설치됩니다.
74
+ - Claude Code와 Codex를 함께 선택했을 때 컴포넌트 선택지에서 `Claude Code Tink skill`과 `Codex Tink skills`가 분리되어 보입니다.
75
+ - install/update 출력에 repo, shared `.tink`, Claude Code, Codex target 경로를 표시해서 선택한 항목이 어디에 설치되는지 바로 볼 수 있습니다.
76
+ - `--clean-codex-picker` 또는 `TINK_CLEAN_CODEX_PICKER=1`로 Codex에 `Source Command Tink ...` 항목을 만들던 repo-local Claude Tink command/skill surface를 정리할 수 있습니다.
77
+
62
78
  ## 1.6.1에서 달라진 점
63
79
 
64
80
  이번 패치는 기존 설치의 update 경로를 고칩니다.
65
81
 
66
82
  - `tink-harness update`가 v1.5.x에서 생성된 기본 `.tink/rules/index.json`을 새 v1.6.x rule graph seed로 갱신합니다.
67
83
  - custom rule이나 rule evidence가 들어간 사용자 수정 rule graph는 계속 보존합니다.
84
+
68
85
  ## 1.6.0에서 달라진 점
69
86
 
70
87
  이번 릴리스는 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 package:</strong> v1.6.1 - Existing installs now refresh generated legacy rule graphs during <code>tink-harness update</code>. Latest minor release notes: <a href="https://github.com/dotoricode/tink-harness/releases/tag/v1.6.0">v1.6.0</a>.</p>
27
+ <p><strong>Latest package:</strong> v1.6.3 - Interactive install/update now offers advanced options such as preview, force overwrite, and Codex picker cleanup as real choices. 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,23 @@ 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.3
128
+
129
+ This patch makes CLI options visible in the interactive installer.
130
+
131
+ - The wizard now has an `Advanced options` step with `Preview only (--dry-run)`, `Overwrite user-modified files (--force)`, and `Clean Codex picker (--clean-codex-picker)` when Codex is selected.
132
+ - Install/update output now prints the selected option state, so you can see whether preview, force overwrite, or Codex picker cleanup is active.
133
+ - CLI flags still work for non-interactive runs and seed the same visible choices when the wizard is used.
134
+
135
+ ## What's new in 1.6.2
136
+
137
+ This patch makes the installer clearer for mixed Claude Code + Codex setups.
138
+
139
+ - Codex action skills now install with names like `Tink: Cast`, `Tink: Verify`, and `Tink: Update` instead of generic `Cast`/`Verify` labels.
140
+ - The component picker now separates `Claude Code Tink skill` from `Codex Tink skills` when both surfaces are selected.
141
+ - 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.
142
+ - `--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.
143
+
127
144
  ## What's new in 1.6.1
128
145
 
129
146
  This patch fixes the update path for existing installs.
package/VERSIONING.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Versioning
2
2
 
3
- Current version: `1.6.1`
3
+ Current version: `1.6.3`
4
4
 
5
5
  Tink follows semver from `1.0.0` onward.
6
6
 
package/bin/install.js CHANGED
@@ -12,8 +12,9 @@ const root = path.resolve(__dirname, '..');
12
12
  const args = process.argv.slice(2);
13
13
  const command = args[0] || 'install';
14
14
  const isUpdate = command === 'update';
15
- const dryRun = args.includes('--dry-run');
16
- const force = args.includes('--force');
15
+ let dryRun = args.includes('--dry-run');
16
+ let force = args.includes('--force');
17
+ let 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 componentOptionsFor(agent, language) {
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,116 @@ 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
+ return options;
224
+ }
225
+
226
+ function wantsClaudeSkill(components) {
227
+ return components.includes('skill') || components.includes('claude-skill');
228
+ }
229
+
230
+ function wantsCodexSkills(components) {
231
+ return components.includes('skill') || components.includes('codex-skills');
232
+ }
233
+
234
+ function wantsCodexPickerCleanup(components, agent) {
235
+ return cleanCodexPicker || components.includes('codex-picker-cleanup') || agent === 'codex';
236
+ }
237
+
238
+ function advancedOptionChoices(agent, language) {
239
+ const choices = [
240
+ {
241
+ value: 'dry-run',
242
+ label: 'Preview only (--dry-run)',
243
+ hint: language === 'ko'
244
+ ? '파일을 쓰거나 지우지 않고 어떤 작업을 할지만 보여줍니다.'
245
+ : 'Show planned writes/removals without changing files.'
246
+ },
247
+ {
248
+ value: 'force',
249
+ label: 'Overwrite user-modified files (--force)',
250
+ hint: language === 'ko'
251
+ ? '사용자가 수정한 파일도 덮어쓸 수 있는 위험 옵션입니다.'
252
+ : 'Risky. Allows overwriting user-modified files.'
253
+ }
254
+ ];
255
+ if (includesCodex(agent)) {
256
+ choices.push({
257
+ value: 'clean-codex-picker',
258
+ label: 'Clean Codex picker (--clean-codex-picker)',
259
+ hint: language === 'ko'
260
+ ? '현재 repo의 repo-local Claude Tink surface를 정리해 Source Command Tink 항목을 줄입니다.'
261
+ : 'Remove repo-local Claude Tink surfaces that show as Source Command Tink entries.'
262
+ });
263
+ }
264
+ return choices;
265
+ }
266
+
267
+ function defaultAdvancedValues(agent) {
268
+ return [
269
+ dryRun ? 'dry-run' : null,
270
+ force ? 'force' : null,
271
+ includesCodex(agent) && cleanCodexPicker ? 'clean-codex-picker' : null
272
+ ].filter(Boolean);
273
+ }
274
+
275
+ function applyAdvancedOptions(values) {
276
+ dryRun = values.includes('dry-run');
277
+ force = values.includes('force');
278
+ cleanCodexPicker = values.includes('clean-codex-picker');
279
+ }
280
+
281
+ function optionsSummary(agent) {
282
+ return [
283
+ `Preview only (--dry-run): ${dryRun ? 'yes' : 'no'}`,
284
+ `Overwrite user-modified files (--force): ${force ? 'yes' : 'no'}`,
285
+ includesCodex(agent) ? `Clean Codex picker (--clean-codex-picker): ${cleanCodexPicker ? 'yes' : 'no'}` : null
286
+ ].filter(Boolean).join('\n');
287
+ }
288
+
289
+ function locationSummary(agent, scope) {
290
+ const repoTarget = process.cwd();
291
+ const installTarget = scope === 'global' ? os.homedir() : repoTarget;
292
+ return [
293
+ `Repo target: ${repoTarget}`,
294
+ `Shared .tink target: ${path.join(installTarget, '.tink')}`,
295
+ includesClaude(agent) ? `Claude Code command target: ${path.join(installTarget, '.claude/commands/tink')}` : null,
296
+ includesClaude(agent) ? `Claude Code skill target: ${path.join(installTarget, '.claude/skills/tink')}` : null,
297
+ includesCodex(agent) ? `Codex skills target: ${path.join(codexHome(), 'skills')}` : null,
298
+ includesCodex(agent) ? `Codex picker cleanup target: ${path.join(process.cwd(), '.claude')}` : null
299
+ ].filter(Boolean).join('\n');
300
+ }
301
+
302
+ function defaultComponentValues(agent, language) {
303
+ return componentOptionsFor(agent, language)
304
+ .map((item) => item.value)
305
+ .filter((value) => value !== 'hook');
306
+ }
196
307
  function colorLine(line, color) {
197
308
  if (!process.stdout.isTTY && !interactive) return line;
198
309
  const [r, g, b] = color;
@@ -510,17 +621,20 @@ function copySelected(scope, components, agent) {
510
621
  const codexTarget = codexHome();
511
622
  const target = scope === 'global' ? globalTarget : repoTarget;
512
623
  const templateRoot = path.join(root, 'templates');
624
+ const cleanupCodexPicker = wantsCodexPickerCleanup(components, agent);
513
625
 
514
- if (includesClaude(agent) && components.includes('commands')) {
626
+ if (includesClaude(agent) && components.includes('commands') && !cleanupCodexPicker) {
515
627
  copyTinkCommands(templateRoot, target);
516
628
  }
517
- if (agent === 'codex') {
518
- removeRepoLocalClaudeTinkSurface(target);
629
+ if (cleanupCodexPicker) {
630
+ removeRepoLocalClaudeTinkSurface(repoTarget);
519
631
  }
520
- if (components.includes('skill')) {
521
- if (includesClaude(agent)) {
632
+ if (wantsClaudeSkill(components)) {
633
+ if (includesClaude(agent) && !cleanupCodexPicker) {
522
634
  copyDir(path.join(templateRoot, 'claude/skills'), path.join(target, '.claude/skills'), target);
523
635
  }
636
+ }
637
+ if (wantsCodexSkills(components)) {
524
638
  if (includesCodex(agent)) {
525
639
  removeLegacyCodexSkill(codexTarget);
526
640
  copyDir(path.join(templateRoot, 'codex/skills'), path.join(codexTarget, 'skills'), codexTarget);
@@ -644,8 +758,9 @@ async function resolveChoices() {
644
758
  }
645
759
  if (!['en', 'ko', 'zh'].includes(language)) language = 'en';
646
760
 
647
- let components = componentOptionsFor(agent, language).map((item) => item.value).filter((value) => value !== 'hook');
761
+ let components = defaultComponentValues(agent, language);
648
762
  if (includesClaude(agent) && args.includes('--with-hook')) components.push('hook');
763
+ let advancedOptions = defaultAdvancedValues(agent);
649
764
  let gitPolicy = 'harnesses';
650
765
  let hookScope = 'off';
651
766
 
@@ -692,8 +807,9 @@ async function resolveChoices() {
692
807
  initialValues: agent === 'all' ? ['claude', 'codex'] : [agent],
693
808
  required: true
694
809
  })));
695
- components = componentOptionsFor(agent, language).map((item) => item.value).filter((value) => value !== 'hook');
810
+ components = defaultComponentValues(agent, language);
696
811
  if (includesClaude(agent) && args.includes('--with-hook')) components.push('hook');
812
+ advancedOptions = defaultAdvancedValues(agent);
697
813
 
698
814
  components = handleCancel(await multiselect({
699
815
  message: copy.components,
@@ -727,6 +843,17 @@ async function resolveChoices() {
727
843
  initialValue: scope || 'repo'
728
844
  }));
729
845
 
846
+ advancedOptions = handleCancel(await multiselect({
847
+ message: language === 'ko' ? '실행 옵션을 선택하세요 (space로 토글)' : 'Select run options (space to toggle)',
848
+ options: advancedOptionChoices(agent, language),
849
+ initialValues: advancedOptions,
850
+ required: false
851
+ }));
852
+ applyAdvancedOptions(advancedOptions);
853
+ note(optionsSummary(agent), language === 'ko' ? '선택된 옵션' : 'Selected options');
854
+
855
+ note(locationSummary(agent, scope), language === 'ko' ? '설치 위치' : 'Install locations');
856
+
730
857
  if (scope === 'repo' && components.some((item) => ['harnesses', 'memory', 'hook'].includes(item))) {
731
858
  note(copy.gitNote, copy.gitNoteTitle);
732
859
  gitPolicy = handleCancel(await select({
@@ -788,6 +915,8 @@ async function main() {
788
915
  console.log(`language ${language}`);
789
916
  console.log(`scope ${scope}`);
790
917
  console.log(`components ${components.join(', ')}`);
918
+ console.log(optionsSummary(agent));
919
+ console.log(locationSummary(agent, scope));
791
920
  }
792
921
 
793
922
  const targets = copySelected(scope, components, agent);
@@ -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`를 사용하면 됨.
@@ -0,0 +1,27 @@
1
+ # v1.6.3 패치 이력 초안
2
+
3
+ ## 문제
4
+
5
+ - `--clean-codex-picker`처럼 사용자가 알아야 하는 옵션이 CLI flag로는 있었지만, interactive install/update 흐름에서는 별도 선택지로 충분히 드러나지 않았음.
6
+ - 사용자는 설치 중 “지금 어떤 옵션이 켜져 있는지”를 출력으로 확인하기 어려웠음.
7
+ - `--dry-run`, `--force`, `--clean-codex-picker`가 모두 실행 방식에 영향을 주는데, 일부는 선택 화면이 아니라 명령어를 알아야만 쓸 수 있었음.
8
+
9
+ ## 해결
10
+
11
+ - interactive wizard에 `Advanced options` 단계를 추가했음.
12
+ - `Preview only (--dry-run)`, `Overwrite user-modified files (--force)`, `Clean Codex picker (--clean-codex-picker)`를 실제 선택지로 제공함.
13
+ - 선택된 옵션 상태를 install/update 출력에 표시함.
14
+ - 기존 CLI flag는 그대로 유지하고, interactive wizard에서는 같은 옵션의 초기 선택값으로 반영되도록 했음.
15
+
16
+ ## 검증
17
+
18
+ - `npm test`로 installer 문구, 선택 상태 출력, package metadata 회귀 테스트를 확인할 예정임.
19
+ - `git diff --check`로 공백 문제를 확인할 예정임.
20
+ - `npm pack --dry-run --json`으로 패키지 포함 파일을 확인할 예정임.
21
+ - publish 후 `@latest` smoke에서 option state 출력과 `--clean-codex-picker` 동작을 확인할 예정임.
22
+
23
+ ## 참고
24
+
25
+ - patch 릴리스이므로 GitHub Release는 새로 만들지 않음.
26
+ - 최신 마이너 릴리스 노트는 v1.6.0에 유지함.
27
+ - 이 변경은 새 명령을 추가하지 않고 기존 installer/update wizard의 선택 흐름만 명확하게 만듦.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tink-harness",
3
- "version": "1.6.1",
3
+ "version": "1.6.3",
4
4
  "description": "Self-growing harnesses for Claude Code and Codex.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -1,5 +1,5 @@
1
1
  ---
2
- name: cast
2
+ name: "Tink: Cast"
3
3
  description: Start a Tink run for a non-trivial task.
4
4
  ---
5
5
 
@@ -1,13 +1,13 @@
1
- ---
2
- name: 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
+ ---
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: 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
+ ---
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: 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
+ ---
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: 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
+ ---
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: 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
+ ---
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: 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.
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.