@wooojin/forgen 0.4.1 → 0.4.4
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 +5 -5
- package/CHANGELOG.md +267 -15
- package/CONTRIBUTING.md +2 -2
- package/README.ja.md +17 -9
- package/README.ko.md +34 -12
- package/README.md +65 -12
- package/README.zh.md +17 -9
- package/assets/README.md +86 -0
- package/assets/architecture.svg +100 -0
- package/assets/banner.png +0 -0
- package/assets/banner.svg +53 -0
- package/{commands → assets/claude/commands}/calibrate.md +4 -3
- package/{commands → assets/claude/commands}/retro.md +2 -2
- package/assets/demo/01-install.gif +0 -0
- package/assets/demo/01-install.tape +54 -0
- package/assets/demo/02-compound-learning.gif +0 -0
- package/assets/demo/02-compound-learning.tape +50 -0
- package/assets/demo/03-forge-personalization.gif +0 -0
- package/assets/demo/03-forge-personalization.tape +64 -0
- package/assets/demo/before-after.gif +0 -0
- package/assets/demo/before-after.tape +98 -0
- package/assets/demo-preview.svg +96 -0
- package/assets/icon.png +0 -0
- package/{hooks → assets/shared}/hook-registry.json +2 -1
- package/dist/checks/_shared/text-sanitizer.d.ts +21 -0
- package/dist/checks/_shared/text-sanitizer.js +60 -0
- package/dist/checks/dangerous-response-pattern.d.ts +32 -0
- package/dist/checks/dangerous-response-pattern.js +65 -0
- package/dist/checks/fact-vs-agreement.js +25 -1
- package/dist/cli.js +78 -6
- package/dist/core/auto-compound-runner.js +90 -39
- package/dist/core/behavior-classifier.d.ts +28 -0
- package/dist/core/behavior-classifier.js +46 -0
- package/dist/core/dashboard.d.ts +7 -0
- package/dist/core/dashboard.js +32 -0
- package/dist/core/doctor.js +92 -0
- package/dist/core/git-stats.d.ts +36 -0
- package/dist/core/git-stats.js +79 -0
- package/dist/core/harness.d.ts +1 -1
- package/dist/core/harness.js +27 -20
- package/dist/core/host-detect.d.ts +42 -0
- package/dist/core/host-detect.js +68 -0
- package/dist/core/installer.js +2 -2
- package/dist/core/migrate-cli.d.ts +1 -0
- package/dist/core/migrate-cli.js +19 -0
- package/dist/core/migrate-evidence-host.d.ts +36 -0
- package/dist/core/migrate-evidence-host.js +49 -0
- package/dist/core/settings-injector.js +4 -2
- package/dist/core/spawn.d.ts +1 -1
- package/dist/core/spawn.js +4 -11
- package/dist/core/stats-cli.js +12 -0
- package/dist/core/trust-layer-intent.d.ts +35 -0
- package/dist/core/trust-layer-intent.js +30 -0
- package/dist/core/types.d.ts +1 -1
- package/dist/engine/compound-extractor.js +7 -9
- package/dist/engine/learn-cli.js +4 -2
- package/dist/engine/lifecycle/bypass-detector.d.ts +6 -1
- package/dist/engine/lifecycle/bypass-detector.js +57 -5
- package/dist/fgx.js +2 -1
- package/dist/forge/evidence-processor.js +12 -0
- package/dist/forge/onboarding.d.ts +3 -2
- package/dist/forge/onboarding.js +3 -2
- package/dist/hooks/db-guard.js +3 -3
- package/dist/hooks/forge-loop-progress.d.ts +9 -0
- package/dist/hooks/forge-loop-progress.js +38 -0
- package/dist/hooks/hook-registry.js +1 -1
- package/dist/hooks/hooks-generator.d.ts +15 -1
- package/dist/hooks/hooks-generator.js +18 -16
- package/dist/hooks/keyword-detector.js +1 -1
- package/dist/hooks/post-tool-use.d.ts +1 -1
- package/dist/hooks/post-tool-use.js +13 -4
- package/dist/hooks/pre-compact.js +1 -1
- package/dist/hooks/pre-tool-use.js +4 -4
- package/dist/hooks/rate-limiter.js +2 -2
- package/dist/hooks/session-recovery.js +11 -0
- package/dist/hooks/shared/blocking-allowlist.d.ts +28 -0
- package/dist/hooks/shared/blocking-allowlist.js +38 -0
- package/dist/hooks/shared/forge-loop-state.d.ts +36 -0
- package/dist/hooks/shared/forge-loop-state.js +116 -0
- package/dist/hooks/shared/hook-response.d.ts +18 -0
- package/dist/hooks/shared/hook-response.js +31 -0
- package/dist/hooks/skill-injector.js +1 -1
- package/dist/hooks/stop-guard.js +57 -25
- package/dist/host/capabilities-claude.d.ts +8 -0
- package/dist/host/capabilities-claude.js +46 -0
- package/dist/host/capabilities-codex.d.ts +11 -0
- package/dist/host/capabilities-codex.js +50 -0
- package/dist/host/capabilities-registry.d.ts +11 -0
- package/dist/host/capabilities-registry.js +30 -0
- package/dist/host/codex-adapter.d.ts +8 -5
- package/dist/host/codex-adapter.js +10 -82
- package/dist/host/codex-output-parser.d.ts +39 -0
- package/dist/host/codex-output-parser.js +75 -0
- package/dist/host/exec-host.d.ts +54 -0
- package/dist/host/exec-host.js +92 -0
- package/dist/host/host-runtime.d.ts +37 -0
- package/dist/host/host-runtime.js +51 -0
- package/dist/host/install-claude.d.ts +35 -0
- package/dist/host/install-claude.js +238 -0
- package/dist/host/install-codex.d.ts +44 -0
- package/dist/host/install-codex.js +276 -0
- package/dist/host/install-orchestrator.d.ts +34 -0
- package/dist/host/install-orchestrator.js +126 -0
- package/dist/host/invoke-agent.d.ts +27 -0
- package/dist/host/invoke-agent.js +115 -0
- package/dist/host/parity-harness.d.ts +62 -0
- package/dist/host/parity-harness.js +283 -0
- package/dist/host/projection.d.ts +35 -0
- package/dist/host/projection.js +126 -0
- package/dist/mcp/server.js +11 -0
- package/dist/mcp/tools.js +51 -0
- package/dist/renderer/rule-renderer.d.ts +1 -1
- package/dist/renderer/rule-renderer.js +73 -1
- package/dist/services/session.d.ts +6 -3
- package/dist/services/session.js +33 -4
- package/dist/store/compound-usage-store.d.ts +28 -0
- package/dist/store/compound-usage-store.js +59 -0
- package/dist/store/evidence-store.d.ts +1 -0
- package/dist/store/evidence-store.js +34 -3
- package/dist/store/host-mismatch.d.ts +42 -0
- package/dist/store/host-mismatch.js +65 -0
- package/dist/store/profile-store.d.ts +29 -0
- package/dist/store/profile-store.js +53 -0
- package/dist/store/types.d.ts +13 -0
- package/hooks/hooks.json +6 -1
- package/package.json +6 -4
- package/plugin.json +4 -4
- package/scripts/postinstall.js +100 -25
- package/skills/calibrate/SKILL.md +4 -3
- package/skills/retro/SKILL.md +2 -2
- /package/{agents → assets/claude/agents}/analyst.md +0 -0
- /package/{agents → assets/claude/agents}/architect.md +0 -0
- /package/{agents → assets/claude/agents}/code-reviewer.md +0 -0
- /package/{agents → assets/claude/agents}/critic.md +0 -0
- /package/{agents → assets/claude/agents}/debugger.md +0 -0
- /package/{agents → assets/claude/agents}/designer.md +0 -0
- /package/{agents → assets/claude/agents}/executor.md +0 -0
- /package/{agents → assets/claude/agents}/explore.md +0 -0
- /package/{agents → assets/claude/agents}/git-master.md +0 -0
- /package/{agents → assets/claude/agents}/planner.md +0 -0
- /package/{agents → assets/claude/agents}/solution-evolver.md +0 -0
- /package/{agents → assets/claude/agents}/test-engineer.md +0 -0
- /package/{agents → assets/claude/agents}/verifier.md +0 -0
- /package/{commands → assets/claude/commands}/architecture-decision.md +0 -0
- /package/{commands → assets/claude/commands}/code-review.md +0 -0
- /package/{commands → assets/claude/commands}/compound.md +0 -0
- /package/{commands → assets/claude/commands}/deep-interview.md +0 -0
- /package/{commands → assets/claude/commands}/docker.md +0 -0
- /package/{commands → assets/claude/commands}/forge-loop.md +0 -0
- /package/{commands → assets/claude/commands}/learn.md +0 -0
- /package/{commands → assets/claude/commands}/ship.md +0 -0
package/README.zh.md
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
<p align="center">
|
|
2
|
-
<img src="https://raw.githubusercontent.com/
|
|
2
|
+
<img src="https://raw.githubusercontent.com/forgen-team/forgen/main/assets/banner.png" alt="Forgen" width="100%"/>
|
|
3
3
|
</p>
|
|
4
4
|
|
|
5
5
|
<p align="center">
|
|
@@ -182,22 +182,30 @@ Claude 调用 `correction-record` MCP 工具。纠正作为结构化证据存储
|
|
|
182
182
|
## 快速开始
|
|
183
183
|
|
|
184
184
|
```bash
|
|
185
|
-
# 1. 安装
|
|
185
|
+
# 1. 安装 (必须 -g — forgen 是全局 CLI)
|
|
186
186
|
npm install -g @wooojin/forgen
|
|
187
187
|
|
|
188
|
-
# 2.
|
|
189
|
-
forgen
|
|
188
|
+
# 2. 注册主机 — Claude Code / Codex / 两者
|
|
189
|
+
forgen install both # 三选交互: claude / codex / both
|
|
190
|
+
# 或非交互:
|
|
191
|
+
forgen install claude
|
|
192
|
+
forgen install codex
|
|
190
193
|
|
|
191
|
-
# 3.
|
|
192
|
-
forgen
|
|
194
|
+
# 3. 首次运行 — 4题引导问卷 (英语/韩语选择)
|
|
195
|
+
forgen # 默认: Claude
|
|
196
|
+
forgen --runtime codex # 使用 Codex
|
|
197
|
+
forgen config default-host codex # 设置持久默认主机
|
|
193
198
|
```
|
|
194
199
|
|
|
195
200
|
### 前提条件
|
|
196
201
|
|
|
197
|
-
- **Node.js** >= 20
|
|
198
|
-
-
|
|
202
|
+
- **Node.js** >= 20 (SQLite 会话搜索推荐 >= 22)
|
|
203
|
+
- **至少安装一个主机** 并认证:
|
|
204
|
+
- **Claude Code** — `npm i -g @anthropic-ai/claude-code`
|
|
205
|
+
- **Codex CLI** — 参考 [Codex docs](https://github.com/openai/codex)
|
|
206
|
+
- 也可同时使用 — `forgen install both` 对两者对称注册 hook/MCP
|
|
199
207
|
|
|
200
|
-
> **厂商依赖:** forgen
|
|
208
|
+
> **厂商依赖:** forgen 对称包装 Claude Code 与 Codex CLI (Claude 为行为基准, Codex 以等价性扩展)。上游 API/CLI 变更可能影响行为。已在 Claude Code 1.0.x / 2.1.x、Codex 0.x 下测试。
|
|
201
209
|
|
|
202
210
|
---
|
|
203
211
|
|
package/assets/README.md
ADDED
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
# assets/ — 자산 분리 매핑 (§7.2)
|
|
2
|
+
|
|
3
|
+
> 출처: `docs/superpowers/specs/2026-04-27-forgen-multi-host-core-design.md` §7.2
|
|
4
|
+
> 상태: 1차 매핑 문서 박제 (실 이동 미완료)
|
|
5
|
+
> 작성일: 2026-04-27
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 목표 디렉토리 구조
|
|
10
|
+
|
|
11
|
+
```
|
|
12
|
+
assets/
|
|
13
|
+
claude/ Claude 전용 자산 (manifest, agents, commands, hooks 등록 manifest)
|
|
14
|
+
codex/ Codex 전용 자산 (hooks.json 머지 템플릿, config 스니펫 등)
|
|
15
|
+
shared/ 호스트 무관 공통 자산 (hook 스크립트 본체, 이미지 등)
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
현재 `assets/` 루트에 있는 이미지/SVG/데모 파일은 **공통 자산**으로, 향후 `assets/shared/`로 이동합니다.
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## 자산 매핑 표
|
|
23
|
+
|
|
24
|
+
| 현재 위치 | 목표 위치 | 이동 단계 | 비고 |
|
|
25
|
+
|---|---|---|---|
|
|
26
|
+
| `agents/*.md` | `assets/claude/agents/` | **2차 PR** | Claude Code 전용 서브에이전트 정의. Codex는 `AGENTS.md` 모델이므로 codex/ 동치 미정 |
|
|
27
|
+
| `commands/*.md` | `assets/claude/commands/` | **2차 PR** | Claude Code slash-command 원본. skills/ 생성의 소스 역할 |
|
|
28
|
+
| `skills/{name}/SKILL.md` | `assets/claude/skills/` | **2차 PR** | copy-assets.js 가 commands/ 를 변환하여 생성. Claude Code plugin 표준 |
|
|
29
|
+
| `hooks/hooks.json` | `assets/claude/hooks/hooks.json` + `assets/codex/hooks.json` | **2차 PR** | hooks.json schema 가 Claude/Codex 동일 (§18.4 확인). Codex 등록 시 절대경로 pre-expand 필요 (§18.5) |
|
|
30
|
+
| `hooks/hook-registry.json` | `assets/shared/hook-registry.json` | **2차 PR** | 호스트 무관 메타데이터. 양쪽 어댑터가 동일 registry 참조 |
|
|
31
|
+
| `assets/banner.png` | `assets/shared/banner.png` | **2차 PR** | 호스트 무관 이미지 자산 |
|
|
32
|
+
| `assets/banner.svg` | `assets/shared/banner.svg` | **2차 PR** | 동상 |
|
|
33
|
+
| `assets/architecture.svg` | `assets/shared/architecture.svg` | **2차 PR** | 동상 |
|
|
34
|
+
| `assets/icon.png` | `assets/shared/icon.png` | **2차 PR** | 동상 |
|
|
35
|
+
| `assets/demo-preview.svg` | `assets/shared/demo-preview.svg` | **2차 PR** | 동상 |
|
|
36
|
+
| `assets/demo/*` | `assets/shared/demo/` | **2차 PR** | 동상 |
|
|
37
|
+
| `dist/hooks/*.js` (빌드 산출물) | 이동 없음 — InstallPlan에서 절대경로 inject | **해당 없음** | hook 스크립트 본체는 host 무관 node 스크립트. Claude/Codex 양쪽이 동일 경로를 가리킴 (§14.2) |
|
|
38
|
+
|
|
39
|
+
### Claude 전용 자산 (`assets/claude/`)
|
|
40
|
+
|
|
41
|
+
- Claude Code plugin manifest (`plugin.json`)
|
|
42
|
+
- `agents/*.md` — Claude Code 서브에이전트 정의
|
|
43
|
+
- `commands/*.md` — slash-command 원본
|
|
44
|
+
- `skills/` — Claude Code plugin 표준 (commands 에서 자동 생성)
|
|
45
|
+
- `hooks/hooks.json` — `${CLAUDE_PLUGIN_ROOT}` 환경변수 참조 버전 (Claude 전용)
|
|
46
|
+
|
|
47
|
+
### Codex 전용 자산 (`assets/codex/`)
|
|
48
|
+
|
|
49
|
+
- `hooks.json` — 절대경로 pre-expand 버전. `~/.codex/hooks.json` 에 머지할 템플릿
|
|
50
|
+
- `config-snippet.toml` — `~/.codex/config.toml` 의 `[mcp_servers]` 등록 스니펫
|
|
51
|
+
- (Phase 2) Codex `AGENTS.md` 템플릿 — `skills/commands/agents` 의 Codex 등치 (미확정)
|
|
52
|
+
|
|
53
|
+
### 공통 자산 (`assets/shared/`)
|
|
54
|
+
|
|
55
|
+
- `hook-registry.json` — 호스트 무관 hook 메타데이터 레지스트리
|
|
56
|
+
- `dist/hooks/*.js` — 런타임에 절대경로로 inject (실제 파일 이동 없음)
|
|
57
|
+
- 이미지/SVG/데모 파일 일체
|
|
58
|
+
|
|
59
|
+
---
|
|
60
|
+
|
|
61
|
+
## 마이그레이션 단계
|
|
62
|
+
|
|
63
|
+
### 1차 PR (현재 — 이동 없음)
|
|
64
|
+
- [x] 이 README 박제 — 매핑 의도 문서화
|
|
65
|
+
- [x] `agents/`, `commands/`, `skills/`, `hooks/` 에 이동 예정 주석 추가
|
|
66
|
+
- [ ] `scripts/copy-assets.js` 에 TODO 주석 추가 (다음 작업)
|
|
67
|
+
|
|
68
|
+
### 2차 PR (실 이동)
|
|
69
|
+
- `agents/`, `commands/`, `skills/` → `assets/claude/`
|
|
70
|
+
- `hooks/hooks.json` → `assets/claude/hooks/hooks.json` (Claude 버전)
|
|
71
|
+
- `hooks/hook-registry.json` → `assets/shared/hook-registry.json`
|
|
72
|
+
- 이미지/SVG/데모 → `assets/shared/`
|
|
73
|
+
- Codex hooks 템플릿 → `assets/codex/hooks.json`
|
|
74
|
+
|
|
75
|
+
### 3차 PR (어댑터 연동)
|
|
76
|
+
- `scripts/copy-assets.js` 의 소스 경로를 새 구조로 갱신
|
|
77
|
+
- Claude InstallPlan: `assets/claude/` → `~/.claude/plugins/cache/...`
|
|
78
|
+
- Codex InstallPlan: `assets/codex/hooks.json` → 절대경로 pre-expand → `~/.codex/hooks.json` 머지
|
|
79
|
+
|
|
80
|
+
---
|
|
81
|
+
|
|
82
|
+
## 호환성 메모
|
|
83
|
+
|
|
84
|
+
- **hooks.json schema 동일성 (§18.4)**: forgen의 현재 `hooks/hooks.json` 형식이 Codex `~/.codex/hooks.json` schema와 완전 동일. 단, `${CLAUDE_PLUGIN_ROOT}` 환경변수는 Codex에서 자동 주입되지 않으므로 절대경로 pre-expand 필수 (§18.5).
|
|
85
|
+
- **agents/commands/skills Codex 동치 미정**: Codex의 prompt 자산 모델은 `AGENTS.md` / `requirements.toml` 중심으로 forgen `skills/commands/agents` 의 직접 대응 표면이 없음. Phase 2 InstallPlan에서 결정.
|
|
86
|
+
- **실 패키지 분리는 3단계 이후**: 현재는 단일 패키지 유지. 구조만 분리 가능한 상태로 준비 (§7.3).
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 720 420" fill="none">
|
|
2
|
+
<defs>
|
|
3
|
+
<linearGradient id="bg2" x1="0%" y1="0%" x2="100%" y2="100%">
|
|
4
|
+
<stop offset="0%" style="stop-color:#0f0f23" />
|
|
5
|
+
<stop offset="100%" style="stop-color:#1a1a3e" />
|
|
6
|
+
</linearGradient>
|
|
7
|
+
</defs>
|
|
8
|
+
|
|
9
|
+
<rect width="720" height="420" rx="12" fill="url(#bg2)"/>
|
|
10
|
+
|
|
11
|
+
<!-- Title -->
|
|
12
|
+
<text x="360" y="35" text-anchor="middle" font-family="'SF Mono', monospace" font-size="14" fill="#ffffff" opacity="0.6" letter-spacing="4">3-LAYER ARCHITECTURE</text>
|
|
13
|
+
|
|
14
|
+
<!-- Layer 0: Philosophy -->
|
|
15
|
+
<rect x="40" y="55" width="640" height="95" rx="8" fill="#f59e0b" fill-opacity="0.08" stroke="#f59e0b" stroke-opacity="0.4" stroke-width="1.5"/>
|
|
16
|
+
<text x="60" y="80" font-family="'SF Mono', monospace" font-size="13" font-weight="700" fill="#fbbf24">Layer 0 — Philosophy (WHY)</text>
|
|
17
|
+
<text x="60" y="100" font-family="'Inter', sans-serif" font-size="12" fill="#fde68a" opacity="0.8">philosophy.yaml → Declare your principles</text>
|
|
18
|
+
|
|
19
|
+
<g transform="translate(60, 110)">
|
|
20
|
+
<rect width="145" height="28" rx="4" fill="#f59e0b" fill-opacity="0.12"/>
|
|
21
|
+
<text x="10" y="18" font-family="monospace" font-size="10" fill="#fbbf24">understand-before-act</text>
|
|
22
|
+
</g>
|
|
23
|
+
<g transform="translate(215, 110)">
|
|
24
|
+
<rect width="145" height="28" rx="4" fill="#f59e0b" fill-opacity="0.12"/>
|
|
25
|
+
<text x="10" y="18" font-family="monospace" font-size="10" fill="#fbbf24">decompose-to-control</text>
|
|
26
|
+
</g>
|
|
27
|
+
<g transform="translate(370, 110)">
|
|
28
|
+
<rect width="148" height="28" rx="4" fill="#f59e0b" fill-opacity="0.12"/>
|
|
29
|
+
<text x="10" y="18" font-family="monospace" font-size="10" fill="#fbbf24">capitalize-on-failure</text>
|
|
30
|
+
</g>
|
|
31
|
+
<g transform="translate(528, 110)">
|
|
32
|
+
<rect width="142" height="28" rx="4" fill="#f59e0b" fill-opacity="0.12"/>
|
|
33
|
+
<text x="10" y="18" font-family="monospace" font-size="10" fill="#fbbf24">focus-resources</text>
|
|
34
|
+
</g>
|
|
35
|
+
|
|
36
|
+
<!-- Arrow -->
|
|
37
|
+
<line x1="360" y1="155" x2="360" y2="170" stroke="#ffffff" stroke-width="1" opacity="0.3"/>
|
|
38
|
+
<polygon points="355,168 360,178 365,168" fill="#ffffff" opacity="0.3"/>
|
|
39
|
+
|
|
40
|
+
<!-- Layer 1: Workflow Engine -->
|
|
41
|
+
<rect x="40" y="180" width="640" height="105" rx="8" fill="#6366f1" fill-opacity="0.08" stroke="#6366f1" stroke-opacity="0.4" stroke-width="1.5"/>
|
|
42
|
+
<text x="60" y="205" font-family="'SF Mono', monospace" font-size="13" font-weight="700" fill="#a78bfa">Layer 1 — Workflow Engine (HOW)</text>
|
|
43
|
+
<text x="60" y="225" font-family="'Inter', sans-serif" font-size="12" fill="#c4b5fd" opacity="0.8">Auto-generated from principles: modes, routing, hooks, monitoring</text>
|
|
44
|
+
|
|
45
|
+
<g transform="translate(60, 238)">
|
|
46
|
+
<rect width="90" height="28" rx="4" fill="#6366f1" fill-opacity="0.15"/>
|
|
47
|
+
<text x="10" y="18" font-family="monospace" font-size="10" fill="#a78bfa">9 Modes</text>
|
|
48
|
+
</g>
|
|
49
|
+
<g transform="translate(160, 238)">
|
|
50
|
+
<rect width="100" height="28" rx="4" fill="#6366f1" fill-opacity="0.15"/>
|
|
51
|
+
<text x="10" y="18" font-family="monospace" font-size="10" fill="#a78bfa">3-Tier Route</text>
|
|
52
|
+
</g>
|
|
53
|
+
<g transform="translate(270, 238)">
|
|
54
|
+
<rect width="100" height="28" rx="4" fill="#6366f1" fill-opacity="0.15"/>
|
|
55
|
+
<text x="10" y="18" font-family="monospace" font-size="10" fill="#a78bfa">14 Hooks</text>
|
|
56
|
+
</g>
|
|
57
|
+
<g transform="translate(380, 238)">
|
|
58
|
+
<rect width="100" height="28" rx="4" fill="#6366f1" fill-opacity="0.15"/>
|
|
59
|
+
<text x="10" y="18" font-family="monospace" font-size="10" fill="#a78bfa">Monitoring</text>
|
|
60
|
+
</g>
|
|
61
|
+
<g transform="translate(490, 238)">
|
|
62
|
+
<rect width="120" height="28" rx="4" fill="#6366f1" fill-opacity="0.15"/>
|
|
63
|
+
<text x="10" y="18" font-family="monospace" font-size="10" fill="#a78bfa">Compound Loop</text>
|
|
64
|
+
</g>
|
|
65
|
+
|
|
66
|
+
<!-- Arrow -->
|
|
67
|
+
<line x1="360" y1="290" x2="360" y2="305" stroke="#ffffff" stroke-width="1" opacity="0.3"/>
|
|
68
|
+
<polygon points="355,303 360,313 365,303" fill="#ffffff" opacity="0.3"/>
|
|
69
|
+
|
|
70
|
+
<!-- Layer 2: Pack -->
|
|
71
|
+
<rect x="40" y="315" width="640" height="90" rx="8" fill="#10b981" fill-opacity="0.08" stroke="#10b981" stroke-opacity="0.4" stroke-width="1.5"/>
|
|
72
|
+
<text x="60" y="340" font-family="'SF Mono', monospace" font-size="13" font-weight="700" fill="#34d399">Layer 2 — Pack (KNOW + SHARE)</text>
|
|
73
|
+
<text x="60" y="360" font-family="'Inter', sans-serif" font-size="12" fill="#6ee7b7" opacity="0.8">Domain knowledge & sharing across scopes</text>
|
|
74
|
+
|
|
75
|
+
<g transform="translate(60, 370)">
|
|
76
|
+
<rect width="80" height="26" rx="4" fill="#10b981" fill-opacity="0.12"/>
|
|
77
|
+
<text x="14" y="17" font-family="monospace" font-size="11" fill="#34d399">Me</text>
|
|
78
|
+
</g>
|
|
79
|
+
<g transform="translate(150, 370)">
|
|
80
|
+
<rect width="80" height="26" rx="4" fill="#10b981" fill-opacity="0.12"/>
|
|
81
|
+
<text x="14" y="17" font-family="monospace" font-size="11" fill="#34d399">Team</text>
|
|
82
|
+
</g>
|
|
83
|
+
<g transform="translate(240, 370)">
|
|
84
|
+
<rect width="80" height="26" rx="4" fill="#10b981" fill-opacity="0.12"/>
|
|
85
|
+
<text x="14" y="17" font-family="monospace" font-size="11" fill="#34d399">Project</text>
|
|
86
|
+
</g>
|
|
87
|
+
|
|
88
|
+
<g transform="translate(380, 370)">
|
|
89
|
+
<rect width="80" height="26" rx="4" fill="#10b981" fill-opacity="0.12"/>
|
|
90
|
+
<text x="10" y="17" font-family="monospace" font-size="10" fill="#34d399">Solutions</text>
|
|
91
|
+
</g>
|
|
92
|
+
<g transform="translate(470, 370)">
|
|
93
|
+
<rect width="70" height="26" rx="4" fill="#10b981" fill-opacity="0.12"/>
|
|
94
|
+
<text x="10" y="17" font-family="monospace" font-size="10" fill="#34d399">Rules</text>
|
|
95
|
+
</g>
|
|
96
|
+
<g transform="translate(550, 370)">
|
|
97
|
+
<rect width="80" height="26" rx="4" fill="#10b981" fill-opacity="0.12"/>
|
|
98
|
+
<text x="10" y="17" font-family="monospace" font-size="10" fill="#34d399">Manuals</text>
|
|
99
|
+
</g>
|
|
100
|
+
</svg>
|
|
Binary file
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 800 200" fill="none">
|
|
2
|
+
<defs>
|
|
3
|
+
<linearGradient id="bg" x1="0%" y1="0%" x2="100%" y2="100%">
|
|
4
|
+
<stop offset="0%" style="stop-color:#0f0f23;stop-opacity:1" />
|
|
5
|
+
<stop offset="100%" style="stop-color:#1a1a3e;stop-opacity:1" />
|
|
6
|
+
</linearGradient>
|
|
7
|
+
<linearGradient id="accent" x1="0%" y1="0%" x2="100%" y2="0%">
|
|
8
|
+
<stop offset="0%" style="stop-color:#f97316" />
|
|
9
|
+
<stop offset="50%" style="stop-color:#ef4444" />
|
|
10
|
+
<stop offset="100%" style="stop-color:#f59e0b" />
|
|
11
|
+
</linearGradient>
|
|
12
|
+
<linearGradient id="glow" x1="0%" y1="0%" x2="0%" y2="100%">
|
|
13
|
+
<stop offset="0%" style="stop-color:#f97316;stop-opacity:0.3" />
|
|
14
|
+
<stop offset="100%" style="stop-color:#f97316;stop-opacity:0" />
|
|
15
|
+
</linearGradient>
|
|
16
|
+
</defs>
|
|
17
|
+
|
|
18
|
+
<rect width="800" height="200" rx="12" fill="url(#bg)"/>
|
|
19
|
+
|
|
20
|
+
<!-- Decorative line -->
|
|
21
|
+
<line x1="60" y1="160" x2="740" y2="160" stroke="url(#accent)" stroke-width="1" opacity="0.4"/>
|
|
22
|
+
|
|
23
|
+
<!-- Subtle grid -->
|
|
24
|
+
<pattern id="grid" width="40" height="40" patternUnits="userSpaceOnUse">
|
|
25
|
+
<path d="M 40 0 L 0 0 0 40" fill="none" stroke="#ffffff" stroke-width="0.3" opacity="0.05"/>
|
|
26
|
+
</pattern>
|
|
27
|
+
<rect width="800" height="200" fill="url(#grid)"/>
|
|
28
|
+
|
|
29
|
+
<!-- Symbol: Anvil + Flame -->
|
|
30
|
+
<g transform="translate(80, 50)">
|
|
31
|
+
<!-- Flame -->
|
|
32
|
+
<path d="M45,5 Q55,25 48,40 Q60,30 55,15 Q65,35 50,50 Q42,50 35,45 Q25,35 30,15 Q35,30 42,40 Q35,25 45,5Z" fill="url(#accent)" opacity="0.8"/>
|
|
33
|
+
<!-- Anvil -->
|
|
34
|
+
<path d="M20,60 L70,60 L75,70 Q45,75 15,70 Z" fill="#ffffff" opacity="0.9"/>
|
|
35
|
+
<rect x="30" y="52" width="30" height="10" rx="2" fill="#ffffff" opacity="0.7"/>
|
|
36
|
+
</g>
|
|
37
|
+
|
|
38
|
+
<!-- Title -->
|
|
39
|
+
<text x="200" y="95" font-family="'SF Mono', 'Fira Code', 'JetBrains Mono', monospace" font-size="52" font-weight="700" fill="#ffffff" letter-spacing="8">FORGEN</text>
|
|
40
|
+
|
|
41
|
+
<!-- Subtitle -->
|
|
42
|
+
<text x="200" y="125" font-family="'Inter', 'Helvetica Neue', sans-serif" font-size="15" fill="#f59e0b" letter-spacing="3" opacity="0.9">CODE, FORGED FOR YOU</text>
|
|
43
|
+
|
|
44
|
+
<!-- Tag -->
|
|
45
|
+
<rect x="200" y="138" width="160" height="22" rx="4" fill="#f97316" opacity="0.15"/>
|
|
46
|
+
<text x="210" y="153" font-family="'SF Mono', monospace" font-size="11" fill="#f59e0b" opacity="0.8">Personalize.</text>
|
|
47
|
+
|
|
48
|
+
<rect x="370" y="138" width="140" height="22" rx="4" fill="#f97316" opacity="0.15"/>
|
|
49
|
+
<text x="380" y="153" font-family="'SF Mono', monospace" font-size="11" fill="#f59e0b" opacity="0.8">Forge workflow.</text>
|
|
50
|
+
|
|
51
|
+
<rect x="520" y="138" width="150" height="22" rx="4" fill="#f97316" opacity="0.15"/>
|
|
52
|
+
<text x="530" y="153" font-family="'SF Mono', monospace" font-size="11" fill="#f59e0b" opacity="0.8">Compound growth.</text>
|
|
53
|
+
</svg>
|
|
@@ -39,7 +39,8 @@ triggers:
|
|
|
39
39
|
calibrate는 두 가지 데이터 소스를 사용합니다:
|
|
40
40
|
|
|
41
41
|
### 1차 소스: Evidence 파일
|
|
42
|
-
`~/.forgen/me/
|
|
42
|
+
`~/.forgen/me/behavior/` 디렉토리의 JSON 파일을 읽습니다.
|
|
43
|
+
(파일명: UUID.json — correction-record MCP 도구가 작성. 같은 디렉토리의 auto-*.md 는 auto-compound 산출이므로 calibrate 분석 대상 아님.)
|
|
43
44
|
각 파일의 구조:
|
|
44
45
|
```json
|
|
45
46
|
{
|
|
@@ -70,8 +71,8 @@ evidence 0건 + compound 교정 패턴 0건이면:
|
|
|
70
71
|
## Phase 1: Evidence 로드 및 검증
|
|
71
72
|
|
|
72
73
|
```bash
|
|
73
|
-
ls ~/.forgen/me/
|
|
74
|
-
cat ~/.forgen/me/
|
|
74
|
+
ls ~/.forgen/me/behavior/*.json 2>/dev/null || echo "EMPTY"
|
|
75
|
+
cat ~/.forgen/me/behavior/*.json 2>/dev/null || echo "NO_FILES"
|
|
75
76
|
```
|
|
76
77
|
|
|
77
78
|
로드한 JSON 파일마다 다음을 검증합니다:
|
|
@@ -69,8 +69,8 @@ compound-list
|
|
|
69
69
|
### 1-3: 교정 기록
|
|
70
70
|
|
|
71
71
|
```bash
|
|
72
|
-
ls -la ~/.forgen/me/
|
|
73
|
-
find ~/.forgen/me/
|
|
72
|
+
ls -la ~/.forgen/me/behavior/ 2>/dev/null || echo "교정 데이터 없음"
|
|
73
|
+
find ~/.forgen/me/behavior/ -name "*.json" -mtime -{period_days} 2>/dev/null | wc -l
|
|
74
74
|
```
|
|
75
75
|
|
|
76
76
|
## Phase 2: 코드 활동 분석
|
|
Binary file
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
# forgen — Install & First Run Demo
|
|
2
|
+
# Shows: npm install → forgen doctor → starter pack loaded
|
|
3
|
+
|
|
4
|
+
Output assets/demo/01-install.gif
|
|
5
|
+
|
|
6
|
+
Set Shell "zsh"
|
|
7
|
+
Set FontFamily "JetBrains Mono"
|
|
8
|
+
Set FontSize 16
|
|
9
|
+
Set Width 1200
|
|
10
|
+
Set Height 600
|
|
11
|
+
Set Padding 20
|
|
12
|
+
Set Theme "Catppuccin Mocha"
|
|
13
|
+
Set TypingSpeed 40ms
|
|
14
|
+
Set WindowBar Colorful
|
|
15
|
+
Set BorderRadius 10
|
|
16
|
+
Set Margin 20
|
|
17
|
+
Set MarginFill "#1e1e2e"
|
|
18
|
+
|
|
19
|
+
# Setup (hidden)
|
|
20
|
+
Hide
|
|
21
|
+
Type "cd /tmp && mkdir forgen-demo && cd forgen-demo && git init -q && npm init -y -q 2>/dev/null && clear"
|
|
22
|
+
Enter
|
|
23
|
+
Sleep 1s
|
|
24
|
+
Show
|
|
25
|
+
|
|
26
|
+
# Step 1: Install
|
|
27
|
+
Type "npm i -g forgen"
|
|
28
|
+
Sleep 500ms
|
|
29
|
+
Enter
|
|
30
|
+
Sleep 5s
|
|
31
|
+
|
|
32
|
+
# Step 2: Doctor check
|
|
33
|
+
Type "forgen doctor"
|
|
34
|
+
Sleep 500ms
|
|
35
|
+
Enter
|
|
36
|
+
Sleep 3s
|
|
37
|
+
|
|
38
|
+
# Step 3: Show starter pack
|
|
39
|
+
Type "ls ~/.compound/me/solutions/ | head -5"
|
|
40
|
+
Sleep 500ms
|
|
41
|
+
Enter
|
|
42
|
+
Sleep 2s
|
|
43
|
+
|
|
44
|
+
# Step 4: Show available skills
|
|
45
|
+
Type "ls ~/.claude/commands/forgen/ | head -10"
|
|
46
|
+
Sleep 500ms
|
|
47
|
+
Enter
|
|
48
|
+
Sleep 3s
|
|
49
|
+
|
|
50
|
+
# Done
|
|
51
|
+
Type "# Ready! 15 starter solutions + 19 skills loaded"
|
|
52
|
+
Sleep 500ms
|
|
53
|
+
Enter
|
|
54
|
+
Sleep 3s
|
|
Binary file
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
# forgen — Compound Learning Demo
|
|
2
|
+
# Shows: Claude using accumulated knowledge → auto-compound extracting patterns
|
|
3
|
+
|
|
4
|
+
Output assets/demo/02-compound-learning.gif
|
|
5
|
+
|
|
6
|
+
Set Shell "zsh"
|
|
7
|
+
Set FontFamily "JetBrains Mono"
|
|
8
|
+
Set FontSize 15
|
|
9
|
+
Set Width 1200
|
|
10
|
+
Set Height 700
|
|
11
|
+
Set Padding 20
|
|
12
|
+
Set Theme "Catppuccin Mocha"
|
|
13
|
+
Set TypingSpeed 35ms
|
|
14
|
+
Set WindowBar Colorful
|
|
15
|
+
Set BorderRadius 10
|
|
16
|
+
Set Margin 20
|
|
17
|
+
Set MarginFill "#1e1e2e"
|
|
18
|
+
|
|
19
|
+
Hide
|
|
20
|
+
Type "cd /tmp/forgen-demo && clear"
|
|
21
|
+
Enter
|
|
22
|
+
Sleep 1s
|
|
23
|
+
Show
|
|
24
|
+
|
|
25
|
+
# Step 1: Ask Claude about TDD — compound should inject knowledge
|
|
26
|
+
Type "claude -p 'tdd 방식으로 isPrime 함수 만들어줘' --allowedTools Bash,Write,Edit"
|
|
27
|
+
Sleep 500ms
|
|
28
|
+
Enter
|
|
29
|
+
Sleep 15s
|
|
30
|
+
|
|
31
|
+
# Step 2: Show compound solutions matched
|
|
32
|
+
Type "# Compound matched starter-tdd-red-green-refactor"
|
|
33
|
+
Enter
|
|
34
|
+
Sleep 2s
|
|
35
|
+
|
|
36
|
+
# Step 3: Search compound knowledge via MCP
|
|
37
|
+
Type "claude -p 'compound-search MCP 도구로 typescript를 검색해줘'"
|
|
38
|
+
Sleep 500ms
|
|
39
|
+
Enter
|
|
40
|
+
Sleep 10s
|
|
41
|
+
|
|
42
|
+
# Step 4: Show accumulated solutions
|
|
43
|
+
Type "ls ~/.compound/me/solutions/ | wc -l"
|
|
44
|
+
Sleep 500ms
|
|
45
|
+
Enter
|
|
46
|
+
Sleep 1s
|
|
47
|
+
|
|
48
|
+
Type "# Knowledge grows with every session"
|
|
49
|
+
Enter
|
|
50
|
+
Sleep 3s
|
|
Binary file
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
# forgen — Forge Personalization Demo
|
|
2
|
+
# Shows: forge interview → profile generated → personalized config
|
|
3
|
+
|
|
4
|
+
Output assets/demo/03-forge-personalization.gif
|
|
5
|
+
|
|
6
|
+
Set Shell "zsh"
|
|
7
|
+
Set FontFamily "JetBrains Mono"
|
|
8
|
+
Set FontSize 15
|
|
9
|
+
Set Width 1200
|
|
10
|
+
Set Height 700
|
|
11
|
+
Set Padding 20
|
|
12
|
+
Set Theme "Catppuccin Mocha"
|
|
13
|
+
Set TypingSpeed 35ms
|
|
14
|
+
Set WindowBar Colorful
|
|
15
|
+
Set BorderRadius 10
|
|
16
|
+
Set Margin 20
|
|
17
|
+
Set MarginFill "#1e1e2e"
|
|
18
|
+
|
|
19
|
+
Hide
|
|
20
|
+
Type "cd /tmp/forgen-demo && clear"
|
|
21
|
+
Enter
|
|
22
|
+
Sleep 1s
|
|
23
|
+
Show
|
|
24
|
+
|
|
25
|
+
# Step 1: Start forge
|
|
26
|
+
Type "forgen forge"
|
|
27
|
+
Sleep 500ms
|
|
28
|
+
Enter
|
|
29
|
+
Sleep 3s
|
|
30
|
+
|
|
31
|
+
# Answer questions (simulated — quality-focused developer)
|
|
32
|
+
Type "2"
|
|
33
|
+
Enter
|
|
34
|
+
Sleep 2s
|
|
35
|
+
|
|
36
|
+
Type "1"
|
|
37
|
+
Enter
|
|
38
|
+
Sleep 2s
|
|
39
|
+
|
|
40
|
+
Type "2"
|
|
41
|
+
Enter
|
|
42
|
+
Sleep 2s
|
|
43
|
+
|
|
44
|
+
Type "1"
|
|
45
|
+
Enter
|
|
46
|
+
Sleep 2s
|
|
47
|
+
|
|
48
|
+
Type "2"
|
|
49
|
+
Enter
|
|
50
|
+
Sleep 2s
|
|
51
|
+
|
|
52
|
+
# Wait for profile generation
|
|
53
|
+
Sleep 5s
|
|
54
|
+
|
|
55
|
+
# Step 2: Show generated rules
|
|
56
|
+
Type "cat .claude/rules/forge-quality.md | head -15"
|
|
57
|
+
Sleep 500ms
|
|
58
|
+
Enter
|
|
59
|
+
Sleep 3s
|
|
60
|
+
|
|
61
|
+
# Step 3: Show that Claude behavior is now personalized
|
|
62
|
+
Type "# Claude is now tuned to YOUR coding style"
|
|
63
|
+
Enter
|
|
64
|
+
Sleep 3s
|
|
Binary file
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
# forgen — Same Tool, Different Developer
|
|
2
|
+
# Shows how forge adapts Claude to YOUR coding style
|
|
3
|
+
|
|
4
|
+
Output assets/demo/before-after.gif
|
|
5
|
+
|
|
6
|
+
Set Shell "zsh"
|
|
7
|
+
Set FontFamily "JetBrains Mono"
|
|
8
|
+
Set FontSize 14
|
|
9
|
+
Set Width 1200
|
|
10
|
+
Set Height 750
|
|
11
|
+
Set Padding 20
|
|
12
|
+
Set Theme "Catppuccin Mocha"
|
|
13
|
+
Set TypingSpeed 25ms
|
|
14
|
+
Set WindowBar Colorful
|
|
15
|
+
Set BorderRadius 10
|
|
16
|
+
Set Margin 20
|
|
17
|
+
Set MarginFill "#1e1e2e"
|
|
18
|
+
|
|
19
|
+
# ═══════════════════════════════════════
|
|
20
|
+
# Developer A: Senior — wants terse, severity-only
|
|
21
|
+
# ═══════════════════════════════════════
|
|
22
|
+
|
|
23
|
+
Hide
|
|
24
|
+
Type `TMPDIR=$(mktemp -d) && cd "$TMPDIR" && git init -q && git config user.email "t@t" && git config user.name "T" && mkdir -p .claude/rules && cat > .claude/rules/forge-communication.md << 'EOF'`
|
|
25
|
+
Enter
|
|
26
|
+
Type "# Forgen Forge — Communication Style (terse profile)"
|
|
27
|
+
Enter
|
|
28
|
+
Type "- Keep responses under 3 sentences unless showing code"
|
|
29
|
+
Enter
|
|
30
|
+
Type "- No preamble or trailing summary"
|
|
31
|
+
Enter
|
|
32
|
+
Type "- For code review: use [SEVERITY] format only"
|
|
33
|
+
Enter
|
|
34
|
+
Type "EOF"
|
|
35
|
+
Enter
|
|
36
|
+
Type "clear"
|
|
37
|
+
Enter
|
|
38
|
+
Sleep 1s
|
|
39
|
+
Show
|
|
40
|
+
|
|
41
|
+
Type "echo ' Developer A: Senior engineer — prefers terse, severity-only'"
|
|
42
|
+
Enter
|
|
43
|
+
Sleep 2s
|
|
44
|
+
|
|
45
|
+
Type "cat .claude/rules/forge-communication.md"
|
|
46
|
+
Enter
|
|
47
|
+
Sleep 3s
|
|
48
|
+
|
|
49
|
+
Type@20ms `claude -p "이 코드를 리뷰해줘: function add(a, b) { let result = a + b; return result; } 파일은 만들지 마."`
|
|
50
|
+
Sleep 500ms
|
|
51
|
+
Enter
|
|
52
|
+
Sleep 20s
|
|
53
|
+
|
|
54
|
+
Sleep 5s
|
|
55
|
+
|
|
56
|
+
# ═══════════════════════════════════════
|
|
57
|
+
# Developer B: Junior — wants explanations & examples
|
|
58
|
+
# ═══════════════════════════════════════
|
|
59
|
+
|
|
60
|
+
Hide
|
|
61
|
+
Type `TMPDIR2=$(mktemp -d) && cd "$TMPDIR2" && git init -q && git config user.email "t@t" && git config user.name "T" && mkdir -p .claude/rules && cat > .claude/rules/forge-communication.md << 'EOF'`
|
|
62
|
+
Enter
|
|
63
|
+
Type "# Forgen Forge — Communication Style (educational profile)"
|
|
64
|
+
Enter
|
|
65
|
+
Type "- Explain reasoning and trade-offs for every suggestion"
|
|
66
|
+
Enter
|
|
67
|
+
Type "- Include examples showing what could go wrong"
|
|
68
|
+
Enter
|
|
69
|
+
Type "- Teach concepts — explain the why not just the what"
|
|
70
|
+
Enter
|
|
71
|
+
Type "EOF"
|
|
72
|
+
Enter
|
|
73
|
+
Type "clear"
|
|
74
|
+
Enter
|
|
75
|
+
Sleep 1s
|
|
76
|
+
Show
|
|
77
|
+
|
|
78
|
+
Type ""
|
|
79
|
+
Enter
|
|
80
|
+
Type "echo ' Developer B: Junior engineer — wants explanations & examples'"
|
|
81
|
+
Enter
|
|
82
|
+
Sleep 2s
|
|
83
|
+
|
|
84
|
+
Type "cat .claude/rules/forge-communication.md"
|
|
85
|
+
Enter
|
|
86
|
+
Sleep 3s
|
|
87
|
+
|
|
88
|
+
Type@20ms `claude -p "이 코드를 리뷰해줘: function add(a, b) { let result = a + b; return result; } 파일은 만들지 마."`
|
|
89
|
+
Sleep 500ms
|
|
90
|
+
Enter
|
|
91
|
+
Sleep 25s
|
|
92
|
+
|
|
93
|
+
Sleep 3s
|
|
94
|
+
Type ""
|
|
95
|
+
Enter
|
|
96
|
+
Type "echo ' Same question. Same tool. Different developer. ⚡'"
|
|
97
|
+
Enter
|
|
98
|
+
Sleep 5s
|