@wooojin/forgen 0.5.0 → 0.5.5
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 +167 -0
- package/README.ja.md +12 -8
- package/README.ko.md +12 -8
- package/README.md +1 -0
- package/README.zh.md +12 -8
- package/assets/shared/hook-registry.json +210 -22
- package/dist/core/auto-compound-runner.js +73 -14
- package/dist/core/changelog-cli.d.ts +4 -1
- package/dist/core/changelog-cli.js +8 -7
- package/dist/core/compound-sweep-cli.d.ts +4 -1
- package/dist/core/compound-sweep-cli.js +25 -5
- package/dist/core/doctor.js +29 -0
- package/dist/core/spawn.d.ts +26 -0
- package/dist/core/spawn.js +38 -3
- package/dist/engine/compound-loop.js +20 -1
- package/dist/hooks/context-guard.js +7 -3
- package/dist/hooks/hook-config.js +5 -0
- package/dist/hooks/hook-registry.d.ts +6 -1
- package/dist/hooks/hooks-generator.js +3 -0
- package/dist/hooks/session-end.d.ts +34 -0
- package/dist/hooks/session-end.js +100 -0
- package/dist/hooks/session-recovery.js +18 -1
- package/dist/hooks/shared/hook-timing.js +6 -1
- package/dist/host/codex-rules-context.d.ts +25 -0
- package/dist/host/codex-rules-context.js +62 -0
- package/dist/host/exec-host.d.ts +10 -0
- package/dist/host/exec-host.js +13 -2
- package/dist/host/install-codex.d.ts +58 -0
- package/dist/host/install-codex.js +291 -23
- package/dist/host/install-orchestrator.js +10 -0
- package/dist/host/invoke-agent.js +1 -0
- package/dist/host/parity-harness.js +7 -3
- package/dist/host/projection.d.ts +37 -3
- package/dist/host/projection.js +93 -42
- package/dist/store/evidence-store.js +121 -57
- package/dist/store/rule-store.d.ts +41 -0
- package/dist/store/rule-store.js +77 -2
- package/hooks/hooks.json +13 -1
- package/package.json +1 -1
- package/plugin.json +1 -1
- package/skills/architecture-decision/SKILL.md +18 -0
- package/skills/calibrate/SKILL.md +18 -0
- package/skills/code-review/SKILL.md +17 -0
- package/skills/compound/SKILL.md +17 -0
- package/skills/deep-interview/SKILL.md +7 -0
- package/skills/docker/SKILL.md +18 -0
- package/skills/forge-loop/SKILL.md +23 -0
- package/skills/learn/SKILL.md +15 -0
- package/skills/retro/SKILL.md +16 -0
- package/skills/ship/SKILL.md +18 -0
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,173 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.5.5] — 2026-10-01 — Codex Stop 분기 복구 (Stop 트리거 auto-compound·finalizeSession)
|
|
11
|
+
|
|
12
|
+
### Fixed
|
|
13
|
+
- `context-guard` 가 Stop 이벤트를 Claude 전용 `stop_hook_type` 필드로만 판별해, Codex 의 Stop 입력
|
|
14
|
+
(`hook_event_name:"Stop"` 만 있고 `stop_hook_type` 없음) 에서는 Stop 분기 전체가 건너뛰어졌다 →
|
|
15
|
+
Codex 세션은 `finalizeSession`, Stop 트리거 auto-compound(≥10 프롬프트), rate-limit 감지, 세션 종료
|
|
16
|
+
안내가 전혀 돌지 않고 컴팩션 때만 학습 추출됐다. `hook_event_name === "Stop"` 을 `end_turn` 과 동치로
|
|
17
|
+
인정. (0.5.4 실환경 검증 중 hook-timing 의 context-guard 가 Stop 시점에 `UserPromptSubmit` 로 기록되는
|
|
18
|
+
것을 보고 발견.)
|
|
19
|
+
|
|
20
|
+
### Verified
|
|
21
|
+
- vitest: Codex 형 Stop 입력으로 20-프롬프트 세션 종료 안내가 나오는 테스트 추가.
|
|
22
|
+
- 격리 Codex 세션: hook-timing 에 `context-guard … event:"Stop", rt:"codex"` 기록, Stop 훅 Completed.
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
## [0.5.4] — 2026-10-01 — Codex 훅 출력 스키마 준수 (0.5.3 의 Stop 훅 Failed 회귀 수정)
|
|
26
|
+
|
|
27
|
+
### Fixed — Codex 가 forgen Stop 훅 출력을 매 턴 "Failed" 로 버리던 회귀
|
|
28
|
+
- 0.5.3 의 사영(`projectCodexToClaude`)이 모든 출력에 `hookSpecificOutput.hookEventName` 을 붙였는데,
|
|
29
|
+
Codex 0.153.4 의 Stop/SubagentStop 출력 스키마는 `additionalProperties:false` 이고 `hookSpecificOutput`
|
|
30
|
+
을 허용하지 않는다 → `parse_stop` 실패 → "hook returned invalid stop hook JSON output" → **Failed**
|
|
31
|
+
(실환경 `codex exec` 에서 `hook: Stop Failed` ×2 재현; 훅 자체는 exit 0 + 정상 JSON). 0.5.3 격리 검증은
|
|
32
|
+
당시 사영이 stdin 의 `hook_event_name` 을 못 읽어 우연히 키를 안 붙인 상태라 통과했었다.
|
|
33
|
+
- 사영을 **이벤트별 allowlist** 로 재작성 (`CODEX_OUTPUT_SCHEMA`): universal 키 / `decision`·`reason` 허용
|
|
34
|
+
이벤트 / `hookSpecificOutput` 허용 이벤트와 하위 키를 Codex 스키마 그대로 따르고, 절대 새 키를 만들지
|
|
35
|
+
않는다. PostToolUse 에 PreToolUse 형 deny 가 오면 Codex 의 PostToolUse block 형으로 번역.
|
|
36
|
+
- 회귀 방지: `tests/fixtures/codex-hook-schemas/` 에 rust-v0.153.4 출력 스키마 11종을 vendoring 하고,
|
|
37
|
+
`tests/host/codex-output-schema.test.ts` 가 forgen 의 모든 응답 helper × 이벤트 조합을 사영 후 스키마로
|
|
38
|
+
검증한다.
|
|
39
|
+
|
|
40
|
+
### Verified
|
|
41
|
+
- 격리 Codex 세션: Stop 훅 3종(forgen 2 + 서드파티 1) 전부 `Completed`; `rm -rf` 응답 → `Stop Blocked` +
|
|
42
|
+
continuation 유지. 실환경 재설치 후 동일 확인 (아래 Install 절).
|
|
43
|
+
- vitest 전체, self-gate static/runtime/release.
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
## [0.5.3] — 2026-10-01 — Codex 동등화 2차 (룰 주입·에이전트·훅 신뢰) + Stop block 사영 결함 수정 + 최신 호스트 갭 1차
|
|
47
|
+
|
|
48
|
+
오너가 Codex 를 일상 호스트로 전환하면서 "Claude 와 동일한 forgen 경험" 을 코드·실세션 대조로
|
|
49
|
+
감사. 훅/MCP/스킬은 동등했으나 **개인화 룰과 서브에이전트가 Codex 에 전달되지 않는** 구조적
|
|
50
|
+
갭을 발견·수정. 결정 문서: docs/adr/ADR-014-codex-parity-rules-agents.md.
|
|
51
|
+
|
|
52
|
+
### Added — ADR-014
|
|
53
|
+
- **D1 개인화 룰 주입 (Codex)**: `session-recovery` 가 `FORGEN_RUNTIME=codex` 일 때
|
|
54
|
+
`generateClaudeRuleFiles()` 산출(v1-rules / project-context / forge-behavioral / user-profile)을
|
|
55
|
+
Claude 와 동일 캡(`RULE_FILE_CAPS`)으로 `<forgen-rules host="codex">` 블록에 담아 SessionStart
|
|
56
|
+
additionalContext 로 주입. 컴팩션 후에는 두 호스트 모두 SessionStart 가 `source="compact"` 로 재발화
|
|
57
|
+
하므로 같은 경로가 재주입 (별도 플래그 경로 없음). 새 모듈 `src/host/codex-rules-context.ts`.
|
|
58
|
+
- 설계 이유: hooks.json 을 바이트 동일하게 유지해야 Codex 의 훅 신뢰 기록이 유효 → 새 훅이
|
|
59
|
+
아니라 기존 훅 내부 분기. AGENTS.md 파일 주입은 사용자 저장소에 개인 룰이 커밋될 위험.
|
|
60
|
+
- **D2 Codex 커스텀 에이전트**: `forgen install codex` 가 `assets/claude/agents/*.md` 14종을
|
|
61
|
+
`~/.codex/agents/ch-<name>.toml` 로 생성 (공식 스키마 name/description/developer_instructions +
|
|
62
|
+
model_reasoning_effort/sandbox_mode 만 사용; `tools`/`disallowedTools` 양쪽에서 읽기전용 판정).
|
|
63
|
+
config.toml 에 `[features] multi_agent = true` 가 없으면 install 출력에 ⚠ 안내. Claude 설치명(ch-*)과 동일해 스킬 본문의
|
|
64
|
+
`ch-planner → ch-executor → ch-verifier` 참조가 Codex 에서도 해석됨. `# forgen-managed` 마커로
|
|
65
|
+
idempotent, 사용자 toml 보존.
|
|
66
|
+
- **D3 스킬 Codex 적응**: 설치 시 `$ARGUMENTS`(Codex 미지원 변수) 자연어 치환 + "Codex host note"
|
|
67
|
+
(ch-* 에이전트 위치, spawn 불가 시 `invoke-agent` MCP 대체) 부착.
|
|
68
|
+
- **D4 훅 신뢰 감사**: `auditCodexHookTrust()` 가 hooks.json forgen 엔트리 vs config.toml
|
|
69
|
+
`[hooks.state."<hooks.json>:<event>:<i>:<j>"]` 를 대조 (Codex 미지원 이벤트 PostToolUseFailure 는
|
|
70
|
+
`ignoredByCodex` 로 분리). `forgen install codex` 출력과 `forgen doctor` 의 새 `[Codex Hooks]`
|
|
71
|
+
섹션에 "N/M trusted, 미승인 시 codex 안에서 `/hooks`" 안내. trusted_hash 를
|
|
72
|
+
forgen 이 쓰지 않음(신뢰 모델 우회 금지).
|
|
73
|
+
- **D5 측정**: `hook-timing.jsonl` 엔트리에 `rt: claude|codex` 필드.
|
|
74
|
+
|
|
75
|
+
### Fixed — ADR-015 X-G1 (결함): Codex 에 Stop block 이 전달되지 않음
|
|
76
|
+
- `codex-adapter` 의 사영(`projectCodexToClaude`)이 `decision:"block"` 을 `continue:false +
|
|
77
|
+
permissionDecision:"block"` 으로 변조해 내보냈다. Codex 는 top-level `decision`/`reason` 을 읽고
|
|
78
|
+
`continue:false` 를 "처리 중단" 으로 해석하므로 **stop-guard 의 자기검증 차단이 Codex 에서 한 번도
|
|
79
|
+
continuation 을 만들지 못했다**. 사영을 host 스키마 보존(pass-through) 으로 재설계. fable 갭 분석에서
|
|
80
|
+
발견, dist 실행으로 재현, 격리 `codex exec` 에서 `hook: Stop Blocked` → 자기 교정 턴 관측.
|
|
81
|
+
- PreToolUse deny 의 `continue:false` 는 Codex 가 "unsupported" 로 로그하던 것을 제거 (차단은
|
|
82
|
+
`permissionDecision` 이 표현).
|
|
83
|
+
|
|
84
|
+
### Added — ADR-015 (최신 Claude Code 2.1.286 대비 갭, 0.5.3 반영분)
|
|
85
|
+
- **`SessionEnd` 훅 (Claude 전용)**: 세션 종료 시 user 메시지 ≥10 이면 auto-compound 러너를 detached
|
|
86
|
+
spawn — Stop 이 안 오는 종료(Ctrl+C 등)·긴 컴팩션 세션의 후반 학습 유실 보강. registry 에
|
|
87
|
+
`hosts` 필드 도입; **Codex hooks.json 은 22개 바이트 동일 유지** (훅 신뢰 보존).
|
|
88
|
+
- **중첩 실행 가드**: forgen 이 띄우는 추출용 `claude -p` 에 `FORGEN_NESTED_RUN=1` +
|
|
89
|
+
`--no-session-persistence`. 추출 run 안에서 22개 훅이 재귀 발화해 hook-timing/sessions 를 오염하고
|
|
90
|
+
다음 SessionStart 의 auto-compound 후보가 되던 문제 차단. (`--bare` 는 OAuth 를 끊어 채택 불가.)
|
|
91
|
+
- **플러그인 스킬 frontmatter 보존**: `skills/<name>/SKILL.md` 가 `disable-model-invocation`(ship),
|
|
92
|
+
`allowed-tools`, `argument-hint`, `model` 을 잃던 빌드 결함 수정.
|
|
93
|
+
- 백로그(설계/재승인 필요)는 docs/adr/ADR-015 표 참조 — Codex async/SessionEnd/PostCompact 등록,
|
|
94
|
+
`notify`, `--output-schema`, `.codex/rules`, `verify` 스킬 규약, `InstructionsLoaded`, plugin eval 등.
|
|
95
|
+
|
|
96
|
+
### Verified
|
|
97
|
+
- vitest 전체 pass (신규: codex-rules-context, install-codex ADR-014 9, hook-timing rt, projection
|
|
98
|
+
재작성, hooks-generator-hosts, session-end).
|
|
99
|
+
- fresh-context critic (fable) 1라운드 → MAJOR 3 + MINOR 6 반영 (상세: ADR-014 Verification).
|
|
100
|
+
`tests/extraction-session.test.ts` 2건은 타이밍 flaky(단독 재실행 pass, 본 변경과 무관).
|
|
101
|
+
- self-gate static ✓, self-gate-runtime 9/9 ✓.
|
|
102
|
+
- **격리 라이브 (CODEX_HOME/FORGEN_HOME 임시, Codex 0.153.4)**:
|
|
103
|
+
- 훅 미승인 `codex exec` → forgen 훅 0건 발화 (공식 문서의 "skipped until trusted" 실증).
|
|
104
|
+
- `--dangerously-bypass-hook-trust` → rollout 에 `<forgen-rules host="codex">` 4KB 주입 확인
|
|
105
|
+
(v1-rules `## Must Not` 포함), Codex 가 ch-* 에이전트 14종 전부 열거, 생성 TOML 14/14 tomllib 파싱 OK.
|
|
106
|
+
|
|
107
|
+
### Known gaps (정직 표기)
|
|
108
|
+
- Codex 전용 이벤트(SessionEnd/PostCompact/Interrupt) 미사용, `PostToolUseFailure` 는 Codex 에 없어
|
|
109
|
+
dead 엔트리로 유지 — 둘 다 hooks.json 변경이 필요해 신뢰 재승인 비용 때문에 보류.
|
|
110
|
+
- Codex 가 `.claude/rules` 처럼 매 턴 재로드하지는 않음 — 세션 시작 1회 + 컴팩션 시 SessionStart 재발화 1회.
|
|
111
|
+
- 서브에이전트 `model` 은 Codex 기본 subagent 모델 사용 (Claude 의 opus/sonnet 지정은 effort 로만 매핑).
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
## [0.5.2] — 2026-08-18 — 학습 파이프라인 무결성: 실운영 데이터 진단으로 3대 결함 수정
|
|
115
|
+
|
|
116
|
+
설치 후 실제 축적 데이터를 감사한 결과, 학습 파이프라인이 "우리 생각대로" 돌지
|
|
117
|
+
않는 지점 3개를 발견·근본원인 규명·수정. npm publish 는 규칙대로 보류.
|
|
118
|
+
|
|
119
|
+
### Fixed — 결함1: advisory 룰 폭주 (retire→재생성 churn)
|
|
120
|
+
- `compound sweep` 가 behavior_inference advisory 룰을 매 실행마다 새 UUID 로
|
|
121
|
+
재생성해 6,701 파일(distinct render_key 172, 97% 중복)까지 폭증(1,046/일). 원인:
|
|
122
|
+
`render_key` 가 영구 upsert 정체성이 아닌 "현재 active" 임시 dedup 키로만 쓰이고,
|
|
123
|
+
채굴된 Evidence 가 consumed 표시되지 않아 retire 로 풀린 render_key 를 stale
|
|
124
|
+
evidence 가 즉시 재승격(시계만 리셋).
|
|
125
|
+
- 수정: `findRuleByRenderKey()`(모든 status, scope 필터) 로 기존 룰 제자리 재활성
|
|
126
|
+
(`created_at`/`rule_id` 보존, TTL=첫 채굴 이후 총수명 캡), `Evidence.candidate_rule_refs`
|
|
127
|
+
재사용한 consumed 마킹(동일 evidence replay 억제, 진짜 cross-session 반복은 Laplace
|
|
128
|
+
강화 유지), 하드닝된 `withFileLockSync` 로 retire→lookup→create 크로스-프로세스 락,
|
|
129
|
+
`forgen compound sweep --prune-removed [--apply] [--retention-days N]`(dry-run 기본).
|
|
130
|
+
|
|
131
|
+
### Fixed — 결함2: solution 추출 무음 실패 (생애 최초 산출 0건) — 라이브 확증 후 재설계
|
|
132
|
+
- opt-in(`autoCompoundHaiku`) 켜짐에도 `me/solutions/` 신규 산출이 forgen 생애 통틀어 0건.
|
|
133
|
+
- **라이브 확증으로 초기 진단을 정정**: 처음엔 "sparse env 권한 hedge"로 보고 `--permission-mode
|
|
134
|
+
dontAsk` 를 넣었으나, 실제 A/B 결과 dontAsk 는 산출을 전혀 바꾸지 못했다(有/無 모두 0).
|
|
135
|
+
진짜 원인은 (1) 프롬프트가 "형식: forgen compound ..."(format:)이라 headless haiku 가
|
|
136
|
+
명령을 텍스트로 프린트만 하고 Bash 도구를 호출 안 함, (2) 애초에 headless haiku 의 Bash
|
|
137
|
+
도구 호출이 근본적으로 불안정(동일 조건 1↔0), (3) cron sparse PATH 에 `forgen` 부재,
|
|
138
|
+
(4) 러너가 `stdio:'ignore'` 라 이 모든 실패가 무음.
|
|
139
|
+
- **재설계(결정론적)**: 모델에 Bash 도구를 아예 주지 않는다. 모델은 재사용 솔루션을
|
|
140
|
+
텍스트로만 출력하고, 러너가 `--solution "제목" "설명"` 을 파싱해 `forgen` 을 직접 실행한다
|
|
141
|
+
(behavior 경로와 동일 패턴). 부수효과로 **P1-S1 injection 표면 제거** — 모델 출력은
|
|
142
|
+
파싱·필터(`containsPromptInjection`/`filterSolutionContent`) 후 `execFileSync` 의 *인자*로만
|
|
143
|
+
쓰이고 셸을 거치지 않는다. `forgen` 은 러너 node 의 형제 바이너리를 절대경로로 호출해
|
|
144
|
+
PATH 의존을 없애고, `spawn.ts` 는 러너를 `process.execPath` 로 띄워 실 cron(nvm node)에서
|
|
145
|
+
forgen 형제경로가 성립하게 한다. 러너 stdout/stderr 는 세션별 로그로 캡처(무음 실패 제거).
|
|
146
|
+
- **라이브 검증**: cron-faithful sparse env(격리 FORGEN_HOME, 절대 nvm node)에서 실제 러너
|
|
147
|
+
실행 → solution **0→1** 확인.
|
|
148
|
+
- **보안 defense-in-depth**: (1) 러너에서 대시-선두 title/content 스킵(arg confusion 1차 차단),
|
|
149
|
+
(2) `handleCompound` 인자 파서 리팩터 — manual-add(`--solution`/`--rule`/…)를 서브커맨드
|
|
150
|
+
dispatch 보다 먼저 처리해, 위치인자(title/content)의 `--remove`/`clean-stale` 등이
|
|
151
|
+
`args.includes(...)` 스캔에 걸려 삭제·정리 분기를 탈취하던 경로를 CLI 레벨에서 원천 차단.
|
|
152
|
+
|
|
153
|
+
### Fixed — 결함3: 전역 CLI 버전 드리프트
|
|
154
|
+
- 대화형 `forgen`/`fgx` 가 0.4.12(설치 후 미갱신)로 러닝 파이프라인(dist 0.5.x)과 불일치.
|
|
155
|
+
전역 CLI 를 npm latest 로 최신화.
|
|
156
|
+
|
|
157
|
+
## [0.5.1] — 2026-08-18 — docs 정직화 i18n 동기화 + consent-sync CI 가드
|
|
158
|
+
|
|
159
|
+
문서/CI 전용 패치. 사용자 노출 코드·런타임 동작 변경 없음. npm publish 는 규칙대로
|
|
160
|
+
보류(품질 우선 — sellable/paper grade 도달 시).
|
|
161
|
+
|
|
162
|
+
### Docs
|
|
163
|
+
- **ko/ja/zh README 학습-루프 정직화 동기화**: EN(0.5.0)이 "session ends → auto-compound
|
|
164
|
+
extracts" 무조건-추출 프레이밍을 opt-in consent 모델(ADR-012)로 고쳤으나 세 번역본이
|
|
165
|
+
미반영이던 갭 해소(ko 는 v0.4.4 기준까지 뒤처짐). always-on(egress 0) vs
|
|
166
|
+
opt-in(`forgen compound consent on`, 기본 off, redaction, `forgen doctor`) 이분,
|
|
167
|
+
advisory-only 채굴(ADR-013), `compound sweep` backstop(ADR-011), ASCII 다이어그램·각주까지
|
|
168
|
+
EN 과 일치화. fresh-context critic 으로 21개 검증점(7 claim × 3 언어) 전수 확인.
|
|
169
|
+
|
|
170
|
+
### CI
|
|
171
|
+
- **4 로케일 README consent 동기화 invariant** (`tests/readme-i18n-consent-sync.test.ts`):
|
|
172
|
+
4 로케일 모두 consent load-bearing 토큰 포함(POSITIVE: `forgen compound consent on` /
|
|
173
|
+
`opt-in` / `egress 0` / `advisory-only` / `compound sweep` / `<private>`) + 무조건-추출
|
|
174
|
+
프레이밍(`auto-compound`) 미포함(NEGATIVE) 강제. EN 정직화가 번역에 다시 누락되거나 옛
|
|
175
|
+
프레이밍이 부활하면 PR 에서 RED. vitest.config include('tests/**') → ci.yml 자동 실행.
|
|
176
|
+
|
|
10
177
|
## [0.5.0] — 2026-08-05 — cross-session δ 실증 · 학습 아키텍처 완성 (ADR-010~013)
|
|
11
178
|
|
|
12
179
|
forgen 의 첫 npm 릴리스(이전 발행은 0.4.x). 헤드라인: **forgen 효과(δ)를 프론티어
|
package/README.ja.md
CHANGED
|
@@ -162,16 +162,17 @@ forgen # `claude` の代わりに使用
|
|
|
162
162
|
|
|
163
163
|
あなたが言います: 「頼んでいないファイルをリファクタリングしないで。」
|
|
164
164
|
|
|
165
|
-
Claude が `correction-record` MCP ツールを呼び出します。修正は、軸分類(`judgment_philosophy`)、種類(`avoid-this
|
|
165
|
+
Claude が `correction-record` MCP ツールを呼び出します。修正は、軸分類(`judgment_philosophy`)、種類(`avoid-this`)、信頼度スコアを含む構造化されたエビデンスとして保存されます。現在のセッションに即座に効果を持つ一時ルールが作成されます。セッション終了時、このルールは**恒久ルール**に昇格します — この決定論的な corrections → rules 経路は**ネットワーク egress 0** で動作し、私たちが測定した cross-session δ はまさにこの経路に乗っています。
|
|
166
|
+
|
|
167
|
+
あなたが明示的に指摘しない柔らかい修正(「うーん…これだけ最小限に書いたら後で全部やり直しになるんじゃない?」)はリアルタイムでは捉えにくいものです。transcript 抽出(下記)に opt-in すると、forgen は会話からそうした修正も**遡って(retroactive に)マイニング**します — ただしこうして自動マイニングされたルールは **advisory-only**(コンテキストとして提示されるだけで、決してブロック・強制しない)であり、あなたが反応しなければ時間とともに age-out します。
|
|
166
168
|
|
|
167
169
|
### セッション間(自動)
|
|
168
170
|
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
-
|
|
172
|
-
- セッション学習サマリー
|
|
171
|
+
**Always on(決定論的、egress 0):** 明示的な修正は恒久ルールに昇格し、ほぼ重複する修正はクラスタリングされて強化され、蓄積されたエビデンスからファセットが微調整されます。時間ベースの `compound sweep` バックストップ(オプションで cron)が、長いセッションや中断されたセッションでもその学習が失われないようにします。
|
|
172
|
+
|
|
173
|
+
**Opt-in(`forgen compound consent on`):** バックグラウンドの Haiku パスがセッション transcript の*redaction 済みサマリー*を読み、再利用可能なソリューション、行動観察、そして上記の柔らかい修正を抽出します。これは**デフォルト off** です — あなたがオンにしない限り、forgen はあなたの会話をどこにも送信せず、送信前に secret / `<private>` 範囲は除去されます。`forgen doctor` が常に現在の状態を表示します。
|
|
173
174
|
|
|
174
|
-
|
|
175
|
+
修正が継続的に現在のパックと異なる方向を指している場合、3セッション後にミスマッチ検出がトリガーされ、パック変更を提案します。
|
|
175
176
|
|
|
176
177
|
### 次のセッション
|
|
177
178
|
|
|
@@ -190,6 +191,7 @@ forgen install both # 3択インタラクティブ: claude / codex / bo
|
|
|
190
191
|
# または非対話:
|
|
191
192
|
forgen install claude
|
|
192
193
|
forgen install codex
|
|
194
|
+
# Codex のみ: codex 内で `/hooks` から forgen フックを一度承認 — Codex は未承認フックをスキップ (forgen doctor の [Codex Hooks] で確認)
|
|
193
195
|
|
|
194
196
|
# 3. 初回実行 — 4問オンボーディング (英語/韓国語選択)
|
|
195
197
|
forgen # デフォルト: Claude
|
|
@@ -300,8 +302,8 @@ env を使ってください。ホスト環境 (macOS/Linux ワークステー
|
|
|
300
302
|
| |
|
|
301
303
|
v |
|
|
302
304
|
+------------------+ |
|
|
303
|
-
| セッション終了 |
|
|
304
|
-
| |
|
|
305
|
+
| セッション終了 | corrections -> rules (常時, egress 0) |
|
|
306
|
+
| | transcript 抽出: opt-in (Haiku) |
|
|
305
307
|
+--------+---------+ |
|
|
306
308
|
| |
|
|
307
309
|
v |
|
|
@@ -331,6 +333,8 @@ experiment (0.30) → candidate (0.55) → verified (0.75) → mature (0.90)
|
|
|
331
333
|
| **行動パターン** | 3回以上の観察で自動検出 | `forge-behavioral.md` に適用 |
|
|
332
334
|
| **エビデンス** | 修正 + 観察 | ファセット調整 + ルール作成を促進 |
|
|
333
335
|
|
|
336
|
+
*ソリューションと行動パターンは **opt-in** の transcript 抽出パス(`forgen compound consent on`、デフォルト off)から得られます。corrections → rules とファセット調整は always-on で、あなたのマシンから決して出ません。*
|
|
337
|
+
|
|
334
338
|
### ソリューション自動注入
|
|
335
339
|
|
|
336
340
|
入力したプロンプトはすべて、蓄積されたソリューションと照合されます。関連するものはClaudeのコンテキストに自動注入されます — 手動検索は不要です。
|
package/README.ko.md
CHANGED
|
@@ -122,16 +122,17 @@ forgen # `claude` 대신 사용
|
|
|
122
122
|
|
|
123
123
|
당신이 말합니다: "내가 요청하지 않은 파일은 리팩토링하지 마."
|
|
124
124
|
|
|
125
|
-
Claude가 `correction-record` MCP 도구를 호출합니다. 교정은 축 분류(`judgment_philosophy`), 종류(`avoid-this`), 신뢰도 점수가 포함된 구조화된 evidence로 저장됩니다. 현재 세션에 즉시 효과를 주는 임시 규칙이 생성됩니다.
|
|
125
|
+
Claude가 `correction-record` MCP 도구를 호출합니다. 교정은 축 분류(`judgment_philosophy`), 종류(`avoid-this`), 신뢰도 점수가 포함된 구조화된 evidence로 저장됩니다. 현재 세션에 즉시 효과를 주는 임시 규칙이 생성됩니다. 세션이 끝나면 이 규칙은 **영구 규칙**으로 승급됩니다 — 이 결정론적 corrections → rules 경로는 **네트워크 egress 0** 으로 동작하며, 우리가 측정한 cross-session δ가 바로 이 경로에 실립니다.
|
|
126
|
+
|
|
127
|
+
당신이 명시적으로 짚지 않은 완곡한 교정("음… 이렇게 최소로만 짜면 나중에 다 다시 해야 하는 거 아니야?")은 실시간으로 잡기 어렵습니다. transcript 추출(아래)에 opt-in 하면 forgen이 대화에서 그런 교정도 **retroactive하게 채굴**합니다 — 단, 이렇게 자동 채굴된 규칙은 **advisory-only**(컨텍스트로 표시될 뿐 절대 차단·강제하지 않음)이며, 당신이 반응하지 않으면 시간이 지나 age-out 됩니다.
|
|
126
128
|
|
|
127
129
|
### 세션 사이 (자동)
|
|
128
130
|
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
- 행동
|
|
132
|
-
- 세션 학습 요약
|
|
131
|
+
**Always on (결정론적, egress 0):** 명시적 교정은 영구 규칙으로 승급되고, 거의 중복인 교정은 클러스터링되어 강화되며, 축적된 evidence로 facet이 미세 조정됩니다. 시간 기반 `compound sweep` backstop(선택적으로 cron)이 길거나 중단된 세션에서도 그 학습이 유실되지 않게 보장합니다.
|
|
132
|
+
|
|
133
|
+
**Opt-in (`forgen compound consent on`):** 백그라운드 Haiku 패스가 세션 transcript의 *redaction된 요약*을 읽어 재사용 가능한 솔루션, 행동 관찰, 그리고 위의 완곡한 교정을 추출합니다. 이것은 **기본 off** 입니다 — 당신이 켜지 않는 한 forgen은 당신의 대화를 어디로도 보내지 않으며, 전송 전에 secret / `<private>` 범위는 제거됩니다. `forgen doctor` 가 항상 현재 상태를 보여줍니다.
|
|
133
134
|
|
|
134
|
-
|
|
135
|
+
교정이 지속적으로 현재 팩과 다른 방향을 가리키면, 3세션 후 mismatch 감지가 트리거되어 팩 변경을 추천합니다.
|
|
135
136
|
|
|
136
137
|
### 다음 세션
|
|
137
138
|
|
|
@@ -150,6 +151,7 @@ forgen install both # 3지선다 인터랙티브: claude / codex / both
|
|
|
150
151
|
# 또는 비대화형:
|
|
151
152
|
forgen install claude
|
|
152
153
|
forgen install codex
|
|
154
|
+
# Codex 만: codex 안에서 `/hooks` 로 forgen 훅을 한 번 승인 — Codex 는 미승인 훅을 skip (forgen doctor 의 [Codex Hooks] 로 확인)
|
|
153
155
|
|
|
154
156
|
# 3. 첫 실행 — 4문항 온보딩 (영어/한국어 선택)
|
|
155
157
|
forgen # 기본: Claude
|
|
@@ -260,8 +262,8 @@ Linux 컨테이너에서 `~/.claude.json` 만 마운트하면 refresh 토큰이
|
|
|
260
262
|
| |
|
|
261
263
|
v |
|
|
262
264
|
+------------------+ |
|
|
263
|
-
| 세션 종료 |
|
|
264
|
-
| |
|
|
265
|
+
| 세션 종료 | corrections -> rules (항상, egress 0) |
|
|
266
|
+
| | transcript 추출: opt-in (Haiku) |
|
|
265
267
|
+--------+---------+ |
|
|
266
268
|
| |
|
|
267
269
|
v |
|
|
@@ -305,6 +307,8 @@ experiment (0.30) → candidate (0.55) → verified (0.75) → mature (0.90)
|
|
|
305
307
|
| **행동 패턴** | 3회 이상 관찰 시 자동 감지 | `forge-behavioral.md`에 적용 |
|
|
306
308
|
| **Evidence** | 교정 + 관찰 | facet 조정 및 규칙 생성의 근거 |
|
|
307
309
|
|
|
310
|
+
*솔루션과 행동 패턴은 **opt-in** transcript 추출 패스(`forgen compound consent on`, 기본 off)에서 나옵니다. corrections → rules 와 facet 조정은 always-on 이며 절대 당신의 머신을 떠나지 않습니다.*
|
|
311
|
+
|
|
308
312
|
### Solution 자동 주입
|
|
309
313
|
|
|
310
314
|
입력하는 모든 프롬프트가 축적된 솔루션과 매칭됩니다. 관련 솔루션은 Claude의 컨텍스트에 자동 주입됩니다 — 직접 찾아볼 필요가 없습니다.
|
package/README.md
CHANGED
|
@@ -244,6 +244,7 @@ forgen install both # 3-choice interactive: claude / codex / both
|
|
|
244
244
|
# or non-interactive:
|
|
245
245
|
forgen install claude
|
|
246
246
|
forgen install codex
|
|
247
|
+
# Codex only: trust the forgen hooks once with `/hooks` inside codex — Codex skips untrusted hooks (forgen doctor shows [Codex Hooks])
|
|
247
248
|
|
|
248
249
|
# 3. First run — 4-question onboarding (English or Korean)
|
|
249
250
|
forgen # default: Claude
|
package/README.zh.md
CHANGED
|
@@ -162,16 +162,17 @@ forgen # 用它代替 `claude`
|
|
|
162
162
|
|
|
163
163
|
你说: "不要重构我没要求你动的文件。"
|
|
164
164
|
|
|
165
|
-
Claude 调用 `correction-record` MCP 工具。纠正作为结构化证据存储,包含轴分类(`judgment_philosophy`)、种类(`avoid-this
|
|
165
|
+
Claude 调用 `correction-record` MCP 工具。纠正作为结构化证据存储,包含轴分类(`judgment_philosophy`)、种类(`avoid-this`)和置信度分数。为当前会话创建一条临时规则以立即生效。会话结束时,该规则会晋升为**永久规则** —— 这条确定性的 corrections → rules 路径以**零网络 egress** 运行,我们测得的 cross-session δ 正是建立在这条路径上。
|
|
166
|
+
|
|
167
|
+
那些你从未明确指出的柔性纠正("嗯…只写这么点最小实现,以后不会全部返工吗?")在实时中更难捕捉。如果你 opt-in 启用 transcript 提取(见下文),forgen 还会从对话中**回溯挖掘(retroactively mine)**这类纠正 —— 但这样自动挖掘出的规则是 **advisory-only**(仅作为上下文呈现,绝不阻断或强制),若你始终不采纳,它们会随时间 age-out。
|
|
166
168
|
|
|
167
169
|
### 会话之间(自动)
|
|
168
170
|
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
-
|
|
172
|
-
- 会话学习摘要
|
|
171
|
+
**Always on(确定性,egress 0):** 你的明确纠正晋升为永久规则; 近乎重复的纠正被聚类并强化; facet 基于累积证据微调; 一个基于时间的 `compound sweep` 兜底机制(可选择挂到 cron)确保漫长或被中断的会话不会丢失这些学习。
|
|
172
|
+
|
|
173
|
+
**Opt-in(`forgen compound consent on`):** 后台的 Haiku 通道读取会话 transcript 的*脱敏(redacted)摘要*,提取可复用的解决方案、行为观察,以及上述柔性纠正。它**默认关闭** —— 除非你开启,否则 forgen 不会把你的对话发送到任何地方,且在发送前会剥离 secret / `<private>` 区间。`forgen doctor` 始终显示当前状态。
|
|
173
174
|
|
|
174
|
-
|
|
175
|
+
如果你的纠正持续指向与当前 pack 不同的方向,3个会话后触发不匹配检测,推荐更换 pack。
|
|
175
176
|
|
|
176
177
|
### 下一个会话
|
|
177
178
|
|
|
@@ -190,6 +191,7 @@ forgen install both # 三选交互: claude / codex / both
|
|
|
190
191
|
# 或非交互:
|
|
191
192
|
forgen install claude
|
|
192
193
|
forgen install codex
|
|
194
|
+
# 仅 Codex: 在 codex 内用 `/hooks` 信任一次 forgen 钩子 — Codex 会跳过未信任的钩子 (用 forgen doctor 的 [Codex Hooks] 查看)
|
|
193
195
|
|
|
194
196
|
# 3. 首次运行 — 4题引导问卷 (英语/韩语选择)
|
|
195
197
|
forgen # 默认: Claude
|
|
@@ -269,8 +271,8 @@ forgen config default-host codex # 设置持久默认主机
|
|
|
269
271
|
| |
|
|
270
272
|
v |
|
|
271
273
|
+------------------+ |
|
|
272
|
-
| 会话结束 |
|
|
273
|
-
| |
|
|
274
|
+
| 会话结束 | corrections -> rules (始终, egress 0) |
|
|
275
|
+
| | transcript 提取: opt-in (Haiku) |
|
|
274
276
|
+--------+---------+ |
|
|
275
277
|
| |
|
|
276
278
|
v |
|
|
@@ -300,6 +302,8 @@ experiment (0.30) → candidate (0.55) → verified (0.75) → mature (0.90)
|
|
|
300
302
|
| **行为模式** | 3次以上观察时自动检测 | 应用到 `forge-behavioral.md` |
|
|
301
303
|
| **证据** | 纠正 + 观察 | 驱动 facet 调整 + 规则创建 |
|
|
302
304
|
|
|
305
|
+
*解决方案与行为模式来自 **opt-in** 的 transcript 提取通道(`forgen compound consent on`,默认关闭)。corrections → rules 与 facet 调整则始终在线(always-on),绝不离开你的机器。*
|
|
306
|
+
|
|
303
307
|
### 解决方案自动注入
|
|
304
308
|
|
|
305
309
|
你输入的每个提示都会与你积累的解决方案进行匹配。相关的解决方案会自动注入 Claude 的上下文 — 无需手动查找。
|
|
@@ -1,24 +1,212 @@
|
|
|
1
1
|
[
|
|
2
|
-
{
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
{
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
{
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
2
|
+
{
|
|
3
|
+
"name": "notepad-injector",
|
|
4
|
+
"tier": "compound-core",
|
|
5
|
+
"event": "UserPromptSubmit",
|
|
6
|
+
"matcher": "*",
|
|
7
|
+
"script": "hooks/notepad-injector.js",
|
|
8
|
+
"timeout": 3,
|
|
9
|
+
"compoundCritical": false
|
|
10
|
+
},
|
|
11
|
+
{
|
|
12
|
+
"name": "context-guard",
|
|
13
|
+
"tier": "compound-core",
|
|
14
|
+
"event": "UserPromptSubmit",
|
|
15
|
+
"matcher": "*",
|
|
16
|
+
"script": "hooks/context-guard.js",
|
|
17
|
+
"timeout": 2,
|
|
18
|
+
"compoundCritical": false
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
"name": "session-recovery",
|
|
22
|
+
"tier": "compound-core",
|
|
23
|
+
"event": "SessionStart",
|
|
24
|
+
"matcher": "*",
|
|
25
|
+
"script": "hooks/session-recovery.js",
|
|
26
|
+
"timeout": 3,
|
|
27
|
+
"compoundCritical": true
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
"name": "post-tool-use",
|
|
31
|
+
"tier": "compound-core",
|
|
32
|
+
"event": "PostToolUse",
|
|
33
|
+
"matcher": "*",
|
|
34
|
+
"script": "hooks/post-tool-use.js",
|
|
35
|
+
"timeout": 3,
|
|
36
|
+
"compoundCritical": true
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
"name": "pre-compact",
|
|
40
|
+
"tier": "compound-core",
|
|
41
|
+
"event": "PreCompact",
|
|
42
|
+
"matcher": "*",
|
|
43
|
+
"script": "hooks/pre-compact.js",
|
|
44
|
+
"timeout": 3,
|
|
45
|
+
"compoundCritical": false
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
"name": "context-guard-stop",
|
|
49
|
+
"tier": "compound-core",
|
|
50
|
+
"event": "Stop",
|
|
51
|
+
"matcher": "*",
|
|
52
|
+
"script": "hooks/context-guard.js",
|
|
53
|
+
"timeout": 5,
|
|
54
|
+
"compoundCritical": false
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
"name": "stop-guard",
|
|
58
|
+
"tier": "compound-core",
|
|
59
|
+
"event": "Stop",
|
|
60
|
+
"matcher": "*",
|
|
61
|
+
"script": "hooks/stop-guard.js",
|
|
62
|
+
"timeout": 10,
|
|
63
|
+
"compoundCritical": true
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
"name": "pre-tool-use",
|
|
67
|
+
"tier": "compound-core",
|
|
68
|
+
"event": "PreToolUse",
|
|
69
|
+
"matcher": "*",
|
|
70
|
+
"script": "hooks/pre-tool-use.js",
|
|
71
|
+
"timeout": 3,
|
|
72
|
+
"compoundCritical": true
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
"name": "secret-filter",
|
|
76
|
+
"tier": "safety",
|
|
77
|
+
"event": "PostToolUse",
|
|
78
|
+
"matcher": "Write|Edit|Bash",
|
|
79
|
+
"script": "hooks/secret-filter.js",
|
|
80
|
+
"timeout": 3,
|
|
81
|
+
"compoundCritical": false
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
"name": "slop-detector",
|
|
85
|
+
"tier": "safety",
|
|
86
|
+
"event": "PostToolUse",
|
|
87
|
+
"matcher": "Write|Edit",
|
|
88
|
+
"script": "hooks/slop-detector.js",
|
|
89
|
+
"timeout": 3,
|
|
90
|
+
"compoundCritical": false
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
"name": "db-guard",
|
|
94
|
+
"tier": "safety",
|
|
95
|
+
"event": "PreToolUse",
|
|
96
|
+
"matcher": "Bash",
|
|
97
|
+
"script": "hooks/db-guard.js",
|
|
98
|
+
"timeout": 3,
|
|
99
|
+
"compoundCritical": false
|
|
100
|
+
},
|
|
101
|
+
{
|
|
102
|
+
"name": "rate-limiter",
|
|
103
|
+
"tier": "safety",
|
|
104
|
+
"event": "PreToolUse",
|
|
105
|
+
"matcher": "*",
|
|
106
|
+
"script": "hooks/rate-limiter.js",
|
|
107
|
+
"timeout": 2,
|
|
108
|
+
"compoundCritical": false
|
|
109
|
+
},
|
|
110
|
+
{
|
|
111
|
+
"name": "intent-classifier",
|
|
112
|
+
"tier": "workflow",
|
|
113
|
+
"event": "UserPromptSubmit",
|
|
114
|
+
"matcher": "*",
|
|
115
|
+
"script": "hooks/intent-classifier.js",
|
|
116
|
+
"timeout": 3,
|
|
117
|
+
"compoundCritical": false
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
"name": "keyword-detector",
|
|
121
|
+
"tier": "workflow",
|
|
122
|
+
"event": "UserPromptSubmit",
|
|
123
|
+
"matcher": "*",
|
|
124
|
+
"script": "hooks/keyword-detector.js",
|
|
125
|
+
"timeout": 5,
|
|
126
|
+
"compoundCritical": false
|
|
127
|
+
},
|
|
128
|
+
{
|
|
129
|
+
"name": "permission-handler",
|
|
130
|
+
"tier": "workflow",
|
|
131
|
+
"event": "PermissionRequest",
|
|
132
|
+
"matcher": "*",
|
|
133
|
+
"script": "hooks/permission-handler.js",
|
|
134
|
+
"timeout": 2,
|
|
135
|
+
"compoundCritical": false
|
|
136
|
+
},
|
|
137
|
+
{
|
|
138
|
+
"name": "subagent-tracker-start",
|
|
139
|
+
"tier": "workflow",
|
|
140
|
+
"event": "SubagentStart",
|
|
141
|
+
"matcher": "*",
|
|
142
|
+
"script": "hooks/subagent-tracker.js start",
|
|
143
|
+
"timeout": 2,
|
|
144
|
+
"compoundCritical": false
|
|
145
|
+
},
|
|
146
|
+
{
|
|
147
|
+
"name": "subagent-tracker-stop",
|
|
148
|
+
"tier": "workflow",
|
|
149
|
+
"event": "SubagentStop",
|
|
150
|
+
"matcher": "*",
|
|
151
|
+
"script": "hooks/subagent-tracker.js stop",
|
|
152
|
+
"timeout": 2,
|
|
153
|
+
"compoundCritical": false
|
|
154
|
+
},
|
|
155
|
+
{
|
|
156
|
+
"name": "subagent-stop-guard",
|
|
157
|
+
"tier": "workflow",
|
|
158
|
+
"event": "SubagentStop",
|
|
159
|
+
"matcher": "*",
|
|
160
|
+
"script": "hooks/subagent-stop-guard.js",
|
|
161
|
+
"timeout": 10,
|
|
162
|
+
"compoundCritical": false
|
|
163
|
+
},
|
|
164
|
+
{
|
|
165
|
+
"name": "post-tool-failure",
|
|
166
|
+
"tier": "workflow",
|
|
167
|
+
"event": "PostToolUseFailure",
|
|
168
|
+
"matcher": "*",
|
|
169
|
+
"script": "hooks/post-tool-failure.js",
|
|
170
|
+
"timeout": 3,
|
|
171
|
+
"compoundCritical": false
|
|
172
|
+
},
|
|
173
|
+
{
|
|
174
|
+
"name": "solution-injector",
|
|
175
|
+
"tier": "compound-core",
|
|
176
|
+
"event": "UserPromptSubmit",
|
|
177
|
+
"matcher": "*",
|
|
178
|
+
"script": "hooks/solution-injector.js",
|
|
179
|
+
"timeout": 5,
|
|
180
|
+
"compoundCritical": true
|
|
181
|
+
},
|
|
182
|
+
{
|
|
183
|
+
"name": "skill-injector",
|
|
184
|
+
"tier": "compound-core",
|
|
185
|
+
"event": "UserPromptSubmit",
|
|
186
|
+
"matcher": "*",
|
|
187
|
+
"script": "hooks/skill-injector.js",
|
|
188
|
+
"timeout": 5,
|
|
189
|
+
"compoundCritical": true
|
|
190
|
+
},
|
|
191
|
+
{
|
|
192
|
+
"name": "forge-loop-progress",
|
|
193
|
+
"tier": "compound-core",
|
|
194
|
+
"event": "UserPromptSubmit",
|
|
195
|
+
"matcher": "*",
|
|
196
|
+
"script": "hooks/forge-loop-progress.js",
|
|
197
|
+
"timeout": 2,
|
|
198
|
+
"compoundCritical": false
|
|
199
|
+
},
|
|
200
|
+
{
|
|
201
|
+
"name": "session-end",
|
|
202
|
+
"tier": "compound-core",
|
|
203
|
+
"event": "SessionEnd",
|
|
204
|
+
"matcher": "*",
|
|
205
|
+
"script": "hooks/session-end.js",
|
|
206
|
+
"timeout": 3,
|
|
207
|
+
"compoundCritical": true,
|
|
208
|
+
"hosts": [
|
|
209
|
+
"claude"
|
|
210
|
+
]
|
|
211
|
+
}
|
|
24
212
|
]
|