@neikyun/ciel 6.11.2 → 6.13.0
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/assets/.claude/agents/ciel-critic.md +71 -12
- package/assets/.claude/agents/ciel-explorer.md +59 -18
- package/assets/.claude/agents/ciel-improver.md +6 -3
- package/assets/.claude/agents/ciel-researcher.md +85 -25
- package/assets/.claude/hooks/block-destructive.sh +2 -2
- package/assets/.claude/hooks/check-test-first.sh +2 -2
- package/assets/.claude/hooks/memory-bootstrap.sh +0 -0
- package/assets/.claude/hooks/memory-engine.py +82 -15
- package/assets/.claude/hooks/post-tool-write.sh +32 -0
- package/assets/.claude/hooks/pre-agent-gate.sh +11 -6
- package/assets/.claude/hooks/pre-compact.sh +18 -0
- package/assets/.claude/hooks/pre-tool-write.sh +56 -31
- package/assets/.claude/hooks/session-start.sh +22 -1
- package/assets/.claude/hooks/session-version-check.sh +1 -1
- package/assets/.claude/hooks/stop.sh +104 -0
- package/assets/.claude/hooks/subagent-stop.sh +54 -0
- package/assets/.claude/hooks/track-file.sh +2 -2
- package/assets/.claude/hooks/user-prompt-submit.sh +11 -15
- package/assets/.claude/settings.json +18 -4
- package/assets/AGENTS.md +1 -1
- package/assets/CLAUDE.md +103 -175
- package/assets/commands/ciel-audit.md +58 -399
- package/assets/commands/ciel-create-skill.md +24 -38
- package/assets/commands/ciel-eval.md +25 -37
- package/assets/commands/ciel-init.md +36 -126
- package/assets/commands/ciel-status.md +22 -19
- package/assets/commands/ciel-update.md +20 -39
- package/assets/platforms/opencode/.opencode/agents/ciel-researcher.md +71 -895
- package/assets/platforms/opencode/.opencode/commands/ciel-audit.md +58 -296
- package/assets/platforms/opencode/.opencode/commands/ciel-create-skill.md +24 -46
- package/assets/platforms/opencode/.opencode/commands/ciel-eval.md +25 -45
- package/assets/platforms/opencode/.opencode/commands/ciel-init.md +36 -131
- package/assets/platforms/opencode/.opencode/commands/ciel-status.md +22 -24
- package/assets/platforms/opencode/.opencode/commands/ciel-update.md +20 -40
- package/assets/platforms/opencode/AGENTS.md +4 -4
- package/assets/rules/security.md +30 -0
- package/assets/rules/testing.md +23 -0
- package/assets/skills/agile/SKILL.md +42 -0
- package/assets/skills/alerting/SKILL.md +55 -0
- package/assets/skills/api-design/SKILL.md +46 -0
- package/assets/skills/appsec/SKILL.md +43 -0
- package/assets/skills/architecture/SKILL.md +74 -0
- package/assets/skills/backend/SKILL.md +41 -0
- package/assets/skills/backup-recovery/SKILL.md +42 -0
- package/assets/skills/caching/SKILL.md +44 -0
- package/assets/skills/cdn/SKILL.md +42 -0
- package/assets/skills/chaos/SKILL.md +41 -0
- package/assets/skills/cicd-pipeline/SKILL.md +56 -0
- package/assets/skills/cloud/SKILL.md +42 -0
- package/assets/skills/code-quality/SKILL.md +42 -0
- package/assets/skills/code-review/SKILL.md +41 -0
- package/assets/skills/communication/SKILL.md +42 -0
- package/assets/skills/containers/SKILL.md +42 -0
- package/assets/skills/cqrs/SKILL.md +41 -0
- package/assets/skills/crypto/SKILL.md +46 -0
- package/assets/skills/data-engineering/SKILL.md +42 -0
- package/assets/skills/database-design/SKILL.md +46 -0
- package/assets/skills/ddd/SKILL.md +45 -0
- package/assets/skills/deployment-strategies/SKILL.md +51 -0
- package/assets/skills/desktop/SKILL.md +42 -0
- package/assets/skills/devsecops/SKILL.md +43 -0
- package/assets/skills/event-driven/SKILL.md +46 -0
- package/assets/skills/frontend/SKILL.md +41 -0
- package/assets/skills/functional/SKILL.md +42 -0
- package/assets/skills/high-availability/SKILL.md +42 -0
- package/assets/skills/iac/SKILL.md +46 -0
- package/assets/skills/logging/SKILL.md +46 -0
- package/assets/skills/meta/ciel-improve/SKILL.md +127 -0
- package/assets/skills/meta/learnings-capture/SKILL.md +105 -0
- package/assets/skills/meta/patch-spec/patch-spec.md +50 -0
- package/assets/skills/meta/skill-creator/SKILL.md +115 -0
- package/assets/skills/meta/skill-freshness-auditor/SKILL.md +164 -0
- package/assets/skills/meta/skill-variant-evaluator/SKILL.md +100 -0
- package/assets/skills/meta/skills-first-design-auditor/SKILL.md +192 -0
- package/assets/skills/ml-engineering/SKILL.md +42 -0
- package/assets/skills/mobile/SKILL.md +42 -0
- package/assets/skills/monitoring/SKILL.md +54 -0
- package/assets/skills/networking/SKILL.md +42 -0
- package/assets/skills/nosql/SKILL.md +41 -0
- package/assets/skills/oop-solid/SKILL.md +42 -0
- package/assets/skills/performance/SKILL.md +41 -0
- package/assets/skills/reactive/SKILL.md +42 -0
- package/assets/skills/release-management/SKILL.md +51 -0
- package/assets/skills/research/fact-check-claims/SKILL.md +98 -0
- package/assets/skills/research/research-forums/SKILL.md +103 -0
- package/assets/skills/research/research-github-issues/SKILL.md +103 -0
- package/assets/skills/research/research-web-sources/SKILL.md +108 -0
- package/assets/skills/research/synthesize-findings/SKILL.md +112 -0
- package/assets/skills/research/validate-source-credibility/SKILL.md +103 -0
- package/assets/skills/resilience/SKILL.md +41 -0
- package/assets/skills/serverless/SKILL.md +42 -0
- package/assets/skills/servers/SKILL.md +41 -0
- package/assets/skills/sql/SKILL.md +45 -0
- package/assets/skills/supply-chain/SKILL.md +41 -0
- package/assets/skills/system-design/SKILL.md +91 -0
- package/assets/skills/tech-leadership/SKILL.md +46 -0
- package/assets/skills/testing/SKILL.md +41 -0
- package/assets/skills/tracing/SKILL.md +36 -0
- package/assets/skills/utility/branch-cleaner/SKILL.md +195 -0
- package/assets/skills/utility/branch-setup/SKILL.md +144 -0
- package/assets/skills/utility/changelog-updater/SKILL.md +125 -0
- package/assets/skills/utility/commit-writer/SKILL.md +154 -0
- package/assets/skills/utility/issue-closer/SKILL.md +106 -0
- package/assets/skills/utility/issue-creator/SKILL.md +200 -0
- package/assets/skills/utility/pr-merger/SKILL.md +189 -0
- package/assets/skills/utility/pr-opener/SKILL.md +180 -0
- package/assets/skills/utility/release-publisher/SKILL.md +224 -0
- package/assets/skills/workflow/ciel-dev-process/SKILL.md +94 -0
- package/assets/skills/workflow/faire-gatekeeper/SKILL.md +3 -1
- package/assets/skills/workflow/prouver-verifier/SKILL.md +11 -2
- package/dist/cli/check.d.ts.map +1 -1
- package/dist/cli/check.js +11 -2
- package/dist/cli/check.js.map +1 -1
- package/dist/cli/claude.d.ts.map +1 -1
- package/dist/cli/claude.js +0 -2
- package/dist/cli/claude.js.map +1 -1
- package/dist/cli/init.d.ts.map +1 -1
- package/dist/cli/init.js +11 -2
- package/dist/cli/init.js.map +1 -1
- package/dist/cli/opencode.d.ts.map +1 -1
- package/dist/cli/opencode.js +2 -1
- package/dist/cli/opencode.js.map +1 -1
- package/package.json +1 -1
- package/assets/commands/ciel-migrate.md +0 -35
- package/assets/commands/ciel-refresh.md +0 -91
|
@@ -1,27 +1,20 @@
|
|
|
1
1
|
---
|
|
2
|
-
description:
|
|
3
|
-
subtask: false
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
---
|
|
7
|
-
description: Bootstrap or repair Ciel wiring. Auto-detects platform (Claude Code, OpenCode, Cursor, etc.) and configures hooks. Preserves existing config, creates backups.
|
|
2
|
+
description: Bootstrap or repair Ciel v7 wiring. Auto-detects platform (Claude Code or OpenCode) and configures hooks, agents, and commands. Preserves existing config, creates backups.
|
|
8
3
|
---
|
|
9
4
|
|
|
10
5
|
# /ciel-init — Wire Ciel into Current Project
|
|
11
6
|
|
|
12
|
-
**Purpose:** Fix the #1
|
|
7
|
+
**Purpose:** Fix the #1 failure mode — hooks not firing because config is missing or has wrong paths.
|
|
13
8
|
|
|
14
|
-
**Usage:** `/ciel-init [--check] [--user] [--platform=
|
|
9
|
+
**Usage:** `/ciel-init [--check] [--user] [--platform=claude|opencode]`
|
|
15
10
|
|
|
16
11
|
- `--check` — Dry-run: show what would change without writing
|
|
17
12
|
- `--user` — Install to user scope (~/.claude/settings.json) instead of project
|
|
18
|
-
- `--platform=NAME` — Force platform (
|
|
19
|
-
|
|
20
|
-
---
|
|
13
|
+
- `--platform=NAME` — Force platform (default: auto-detect)
|
|
21
14
|
|
|
22
15
|
## Instructions
|
|
23
16
|
|
|
24
|
-
|
|
17
|
+
This is deterministic — NO agent dispatch, NO research, NO pipeline.
|
|
25
18
|
|
|
26
19
|
### Step 1: Detect Platform
|
|
27
20
|
|
|
@@ -30,144 +23,56 @@ Run detection in order (pick FIRST match):
|
|
|
30
23
|
1. **Project files:**
|
|
31
24
|
- `./opencode.json` or `./.opencode/` → **opencode**
|
|
32
25
|
- `./.claude/settings.json` or `./.claude/` → **claude**
|
|
33
|
-
- `./.cursor/` → **cursor**
|
|
34
|
-
- `./.windsurf/` → **windsurf**
|
|
35
|
-
- `./.codex/` → **codex**
|
|
36
|
-
- `./.kilocode/` or `./.kilo/` → **kilocode**
|
|
37
26
|
|
|
38
27
|
2. **CLI availability:**
|
|
39
28
|
- `command -v claude` → **claude**
|
|
40
29
|
- `command -v opencode` → **opencode**
|
|
41
|
-
- `command -v ollama` → **ollama**
|
|
42
30
|
|
|
43
31
|
3. **If ambiguous:** Ask user to specify with `--platform=NAME`
|
|
44
32
|
|
|
45
|
-
### Step 2: Find Ciel
|
|
33
|
+
### Step 2: Find Ciel Source
|
|
46
34
|
|
|
47
35
|
Check in order:
|
|
48
|
-
1. `$
|
|
49
|
-
2. `$HOME/.
|
|
50
|
-
3.
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
If missing → Copy from nearest Ciel source or tell user to reinstall.
|
|
67
|
-
|
|
68
|
-
### Step 4: Configure Platform
|
|
69
|
-
|
|
70
|
-
#### Claude Code Branch
|
|
71
|
-
|
|
72
|
-
**Config file:** `./.claude/settings.json` (project) or `$HOME/.claude/settings.json` (user)
|
|
73
|
-
|
|
74
|
-
**Before writing:**
|
|
75
|
-
1. Check CWD sanity — warn if running Claude from different directory
|
|
76
|
-
2. Backup existing config: `cp file.json file.json.bak-TIMESTAMP`
|
|
77
|
-
|
|
78
|
-
**Write config:**
|
|
79
|
-
```json
|
|
80
|
-
{
|
|
81
|
-
"hooks": {
|
|
82
|
-
"SessionStart": { "command": "$CIEL_DIR/hooks/session-start.sh", "stdin": true },
|
|
83
|
-
"UserPromptSubmit": { "command": "$CIEL_DIR/hooks/user-prompt-submit.sh", "stdin": true },
|
|
84
|
-
"PreToolUse": { "command": "$CIEL_DIR/hooks/pre-tool-write.sh", "stdin": true, "matcher": "Write|Edit" },
|
|
85
|
-
"PostToolUse": { "command": "$CIEL_DIR/hooks/post-tool-write.sh", "stdin": true, "matcher": "Write|Edit" },
|
|
86
|
-
"PreCompact": { "command": "$CIEL_DIR/hooks/pre-compact.sh", "stdin": true },
|
|
87
|
-
"Stop": { "command": "$CIEL_DIR/hooks/stop.sh", "stdin": true }
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
```
|
|
91
|
-
|
|
92
|
-
#### OpenCode Branch
|
|
93
|
-
|
|
94
|
-
**Config file:** `./opencode.json`
|
|
95
|
-
|
|
96
|
-
**Before writing:**
|
|
97
|
-
1. Backup: `cp opencode.json opencode.json.bak-TIMESTAMP`
|
|
98
|
-
2. Merge existing config (preserve model, provider, mcp, keybinds)
|
|
99
|
-
|
|
100
|
-
**Ensure:**
|
|
36
|
+
1. `$CLAUDE_PROJECT_DIR/.claude/hooks/` — project-scoped install (v7 default)
|
|
37
|
+
2. `$HOME/.ciel/` — user-level sentinel
|
|
38
|
+
3. If not found → tell user to install:
|
|
39
|
+
```bash
|
|
40
|
+
bash <(curl -fsSL https://raw.githubusercontent.com/KaosKyun/Ciel/main/scripts/install.sh)
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
### Step 3: Configure Platform
|
|
44
|
+
|
|
45
|
+
**Claude Code** — Backup then write `.claude/settings.json` with hooks registered:
|
|
46
|
+
- SessionStart, UserPromptSubmit, PreToolUse (Edit|Write + Bash rm + Agent), PostToolUse (Edit|Write), SubagentStart (ciel-*), Stop, SubagentStop, PreCompact
|
|
47
|
+
- Copy agents from source to `.claude/agents/`
|
|
48
|
+
- Copy commands from source to `.claude/commands/`
|
|
49
|
+
- Copy skills from source to `.claude/skills/`
|
|
50
|
+
- Ensure `CLAUDE.md` references Ciel pipeline
|
|
51
|
+
|
|
52
|
+
**OpenCode** — Backup then ensure `opencode.json`:
|
|
101
53
|
- `plugin` array contains `"./.opencode/plugins/ciel.ts"`
|
|
102
54
|
- `instructions` array contains `"AGENTS.md"`
|
|
55
|
+
- Copy plugin, agents, commands to `.opencode/`
|
|
103
56
|
|
|
104
|
-
|
|
105
|
-
- `.opencode/plugins/ciel.ts`
|
|
106
|
-
- `.opencode/agents/ciel-*.md` (6 files)
|
|
107
|
-
- `.opencode/commands/ciel-*.md` (9 files)
|
|
108
|
-
|
|
109
|
-
#### Other Platforms Branch
|
|
110
|
-
|
|
111
|
-
Install platform-specific artifacts:
|
|
112
|
-
- **Cursor:** `.cursor/rules/ciel.mdc`
|
|
113
|
-
- **Windsurf:** `.windsurf/rules/*.md`
|
|
114
|
-
- **Codex:** `AGENTS.md`, `.codex/hooks.json`
|
|
115
|
-
- **Kilocode:** `.kilocode/rules/ciel.md`, `.kilo/agents/*`
|
|
116
|
-
- **Ollama:** `Modelfile` (user runs `ollama create`)
|
|
117
|
-
- **LM Studio:** `ciel.preset.json`, `system-prompt.md`
|
|
118
|
-
|
|
119
|
-
### Step 5: Verification
|
|
120
|
-
|
|
121
|
-
After configuration, verify:
|
|
57
|
+
### Step 4: Verify
|
|
122
58
|
|
|
123
|
-
1.
|
|
124
|
-
2.
|
|
125
|
-
3.
|
|
59
|
+
1. Config file exists at expected path
|
|
60
|
+
2. Hooks are executable: `chmod +x .claude/hooks/*.sh`
|
|
61
|
+
3. Agent definitions present (4 files)
|
|
62
|
+
4. Report summary: platform, config path, hooks count, next steps
|
|
126
63
|
|
|
127
|
-
|
|
64
|
+
## What's preserved
|
|
128
65
|
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
Platform: Claude Code
|
|
135
|
-
Config: /path/to/settings.json
|
|
136
|
-
CIEL_DIR: /path/to/ciel
|
|
137
|
-
Hooks: 8/8 present
|
|
138
|
-
|
|
139
|
-
Next steps:
|
|
140
|
-
1. Restart Claude Code
|
|
141
|
-
2. Run a test prompt — should see depth hint
|
|
142
|
-
3. Make code changes — should see RELIRE reminder
|
|
143
|
-
```
|
|
144
|
-
|
|
145
|
-
---
|
|
66
|
+
- `ciel-overlay.md` — project-specific rules
|
|
67
|
+
- `.ciel/` — state directory (map.json, memory.json, parking.md)
|
|
68
|
+
- Existing `settings.json` — merged non-destructively
|
|
69
|
+
- Existing `opencode.json` — merged non-destructively
|
|
146
70
|
|
|
147
71
|
## Error Handling
|
|
148
72
|
|
|
149
73
|
| Error | Action |
|
|
150
74
|
|-------|--------|
|
|
151
|
-
| Ciel
|
|
152
|
-
| Hooks missing | Try to copy from source, else reinstall |
|
|
75
|
+
| Ciel source not found | Tell user to run install script |
|
|
153
76
|
| Config write fails | Show manual instructions |
|
|
154
77
|
| Platform ambiguous | Ask user to specify with --platform |
|
|
155
|
-
| Permission denied |
|
|
156
|
-
|
|
157
|
-
---
|
|
158
|
-
|
|
159
|
-
## Examples
|
|
160
|
-
|
|
161
|
-
```bash
|
|
162
|
-
# Auto-detect and install to project
|
|
163
|
-
/ciel-init
|
|
164
|
-
|
|
165
|
-
# Force Claude Code, user scope
|
|
166
|
-
/ciel-init --platform=claude --user
|
|
167
|
-
|
|
168
|
-
# Check what would change (dry-run)
|
|
169
|
-
/ciel-init --check
|
|
170
|
-
|
|
171
|
-
# Force OpenCode
|
|
172
|
-
/ciel-init --platform=opencode
|
|
173
|
-
```
|
|
78
|
+
| Permission denied | Check file permissions |
|
|
@@ -1,45 +1,43 @@
|
|
|
1
1
|
---
|
|
2
|
-
description:
|
|
3
|
-
subtask: false
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
---
|
|
7
|
-
description: Displays the current Ciel environment status — active version, loaded skills, registered hooks, last session state, and configuration health. A diagnostic entry point for "is Ciel working?" questions.
|
|
2
|
+
description: Displays current Ciel environment status — version, platform, hooks, skills, agents, commands, memory health. Diagnostic entry point for "is Ciel working?" questions.
|
|
8
3
|
---
|
|
9
4
|
|
|
10
5
|
# /ciel-status — Ciel Environment Health Check
|
|
11
6
|
|
|
12
|
-
|
|
7
|
+
Displays the current Ciel environment status: version, platform, hooks, skills, agents, and config health.
|
|
13
8
|
|
|
14
9
|
Usage: `/ciel-status [--check]`
|
|
15
10
|
|
|
16
|
-
-
|
|
11
|
+
- No flag — summary view
|
|
12
|
+
- `--check` — run full diagnostics (verify hooks fire, skills load, config valid)
|
|
17
13
|
|
|
18
|
-
##
|
|
14
|
+
## Summary output
|
|
19
15
|
|
|
20
16
|
```
|
|
21
17
|
## CIEL STATUS
|
|
22
18
|
|
|
23
|
-
Version:
|
|
19
|
+
Version: v4.0.1
|
|
24
20
|
Platform: Claude Code
|
|
25
|
-
Config: .claude/settings.json — OK
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
21
|
+
Config: .claude/settings.json — OK
|
|
22
|
+
Hooks: 12 registered
|
|
23
|
+
Skills: 48 domain skills in .claude/skills/
|
|
24
|
+
Agents: 4 sub-agents (researcher, explorer, critic, improver)
|
|
25
|
+
Commands: 7 available
|
|
26
|
+
Memory: .ciel/memory/ — N episodes
|
|
29
27
|
```
|
|
30
28
|
|
|
31
29
|
## Diagnostics (--check)
|
|
32
30
|
|
|
33
|
-
-
|
|
34
|
-
-
|
|
35
|
-
-
|
|
36
|
-
-
|
|
37
|
-
-
|
|
38
|
-
-
|
|
39
|
-
-
|
|
31
|
+
- CLAUDE.md readable and includes Ciel pipeline
|
|
32
|
+
- .claude/settings.json valid JSON, all hooks registered
|
|
33
|
+
- .ciel/map.json parseable
|
|
34
|
+
- .ciel/memory/index.json present
|
|
35
|
+
- Shell hooks executable and firing
|
|
36
|
+
- Skills directory non-empty
|
|
37
|
+
- Agent definitions present (4 files)
|
|
40
38
|
|
|
41
|
-
## When
|
|
39
|
+
## When to use
|
|
42
40
|
|
|
43
|
-
-
|
|
44
|
-
-
|
|
41
|
+
- After `/ciel-init` to verify installation
|
|
42
|
+
- When "is Ciel working?" is asked
|
|
45
43
|
- Debugging hook failures or missing depth classification
|
|
@@ -1,63 +1,43 @@
|
|
|
1
1
|
---
|
|
2
|
-
description:
|
|
3
|
-
subtask: false
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
---
|
|
7
|
-
description: Check GitHub for newer Ciel release and re-install. Runs `scripts/install.sh --check-update` then `--update`.
|
|
2
|
+
description: Check GitHub for newer Ciel release and re-install. Preserves project config — ciel-overlay.md, .ciel/, settings.json.
|
|
8
3
|
---
|
|
9
4
|
|
|
10
5
|
# /ciel-update — Update Ciel to the latest version
|
|
11
6
|
|
|
12
7
|
Checks GitHub for a newer release and re-installs if available.
|
|
13
8
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
1. **Check version**: `bash scripts/install.sh --check-update`
|
|
17
|
-
- Fetches `VERSION` from GitHub, compares with local
|
|
18
|
-
- Prints "up to date" or "update available"
|
|
19
|
-
|
|
20
|
-
2. **Apply update**: `bash scripts/install.sh --update -y`
|
|
21
|
-
- Re-installs all Ciel files (plugins, agents, commands, hooks)
|
|
22
|
-
- Preserves: `ciel-overlay.md`, `.ciel/`, existing configs
|
|
23
|
-
- Non-destructive merge on `opencode.json`
|
|
9
|
+
Usage: `/ciel-update [--check]`
|
|
24
10
|
|
|
25
|
-
|
|
11
|
+
- No flag — full update (check + apply)
|
|
12
|
+
- `--check` — only check remote version, report, don't install
|
|
26
13
|
|
|
27
|
-
|
|
28
|
-
|------|---------|
|
|
29
|
-
| `--check-update` | Check remote version, don't install |
|
|
30
|
-
| `--update` / `-u` | Force reinstall all files |
|
|
31
|
-
| `-y` | Skip confirmation (non-interactive) |
|
|
32
|
-
| `-q` | Quiet mode (summary only) |
|
|
33
|
-
|
|
34
|
-
## One-liner
|
|
14
|
+
## Steps
|
|
35
15
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
```
|
|
16
|
+
1. **Check version**: fetch `VERSION` from GitHub, compare with `.ciel/version` or `VERSION`
|
|
17
|
+
2. **Apply update**: re-install all Ciel files (hooks, agents, commands, skills, plugin)
|
|
18
|
+
3. **Verify**: confirm hooks executable, agents present, config valid
|
|
40
19
|
|
|
41
20
|
## What's preserved
|
|
42
21
|
|
|
43
22
|
- `ciel-overlay.md` — project-specific rules
|
|
44
|
-
- `.ciel
|
|
45
|
-
-
|
|
46
|
-
- `.
|
|
23
|
+
- `.ciel/` — state directory (map.json, memory/, parking.md)
|
|
24
|
+
- `.claude/settings.json` — merged non-destructively
|
|
25
|
+
- `.opencode/opencode.json` — merged non-destructively
|
|
47
26
|
|
|
48
27
|
## What's replaced
|
|
49
28
|
|
|
50
|
-
- `.opencode/plugins/ciel.ts` — fresh plugin
|
|
51
|
-
- `.opencode/agents/ciel-*.md` — agent definitions
|
|
52
|
-
- `.opencode/commands/ciel-*.md` — command files
|
|
53
|
-
- `.claude/agents/ciel-*.md` — Claude Code agents
|
|
54
29
|
- `.claude/hooks/*.sh` — shell hooks
|
|
55
|
-
-
|
|
30
|
+
- `.claude/agents/ciel-*.md` — agent definitions
|
|
31
|
+
- `.claude/commands/ciel-*.md` — command files
|
|
32
|
+
- `.claude/skills/` — domain skills
|
|
33
|
+
- `.opencode/plugins/ciel.ts` — plugin
|
|
34
|
+
- `.opencode/agents/ciel-*.md` — OpenCode agents
|
|
35
|
+
- `.opencode/commands/ciel*.md` — OpenCode commands
|
|
56
36
|
|
|
57
37
|
## Troubleshooting
|
|
58
38
|
|
|
59
39
|
| Symptom | Fix |
|
|
60
40
|
|---------|-----|
|
|
61
|
-
|
|
|
62
|
-
| Plugin not loaded after update | Restart
|
|
63
|
-
|
|
|
41
|
+
| Could not fetch remote version | Check internet or proxy: `https_proxy=...` |
|
|
42
|
+
| Plugin not loaded after update | Restart editor (plugin loaded at session start) |
|
|
43
|
+
| Hook permissions after update | `chmod +x .claude/hooks/*.sh` |
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# AGENTS.md — Ciel deep-reasoning workflow (OpenCode,
|
|
1
|
+
# AGENTS.md — Ciel deep-reasoning workflow (OpenCode, v3.3.0)
|
|
2
2
|
|
|
3
3
|
Source: https://github.com/KaosKyun/Ciel
|
|
4
4
|
|
|
@@ -8,7 +8,7 @@ Ciel is installed as OpenCode-native primitives:
|
|
|
8
8
|
|
|
9
9
|
- **Plugin** (`.opencode/plugins/ciel.ts`) — pre/post-write hooks + depth classification on user prompts.
|
|
10
10
|
- **Subagents** (`.opencode/agents/ciel-*.md`) — dispatch with `@ciel-researcher`, `@ciel-explorer`, `@ciel-critic`, `@ciel-improver`.
|
|
11
|
-
- **Commands** (`.opencode/commands/ciel*.md`) — run with `/ciel`, `/ciel-improve`, `/ciel-refresh`, `/ciel-audit`, `/ciel-init`, `/ciel-eval`, `/ciel-create-skill`, `/ciel-
|
|
11
|
+
- **Commands** (`.opencode/commands/ciel*.md`) — run with `/ciel`, `/ciel-improve`, `/ciel-refresh`, `/ciel-audit`, `/ciel-init`, `/ciel-eval`, `/ciel-create-skill`, `/ciel-status`, `/ciel-migrate`, `/ciel-update`.
|
|
12
12
|
|
|
13
13
|
---
|
|
14
14
|
|
|
@@ -16,7 +16,7 @@ Ciel is installed as OpenCode-native primitives:
|
|
|
16
16
|
|
|
17
17
|
| Level | Example | Pipeline |
|
|
18
18
|
|-------|---------|----------|
|
|
19
|
-
| **Trivial** | rename, typo, 1-line fix | `
|
|
19
|
+
| **Trivial** | rename, typo, 1-line fix | `quoi-framer` → `pattern-fitness-check` → `faire-gatekeeper` → inline review → push |
|
|
20
20
|
| **Standard** | hook, route, component, service | Full pipeline, dispatch `@ciel-researcher` + `@ciel-explorer` in parallel before coding |
|
|
21
21
|
| **Critical** | auth, DB schema, security, payment | Full pipeline + STRIDE threat model + `@ciel-critic` mandatory |
|
|
22
22
|
|
|
@@ -78,7 +78,7 @@ The `ciel.ts` plugin injects depth classification on every user prompt and RELIR
|
|
|
78
78
|
Ciel ships a `.mcp.json` template at the repo root with two opt-in servers: `playwright` (visual critique) and `context7` (live official docs). Register them via:
|
|
79
79
|
|
|
80
80
|
```bash
|
|
81
|
-
bash
|
|
81
|
+
bash <(curl -fsSL https://raw.githubusercontent.com/KaosKyun/Ciel/main/scripts/install.sh) --with-mcp=playwright,context7
|
|
82
82
|
```
|
|
83
83
|
|
|
84
84
|
**Important** — OpenCode issue #2319: plugin hooks (`tool.execute.before/after`) do NOT fire for MCP tool calls. The `playwright-visual-critic` skill orchestrates the flow explicitly (navigate → snapshot → dispatch `@ciel-critic`) rather than relying on auto-triggered hooks. When you use a visual-critique workflow, dispatch the critic agent yourself after capture.
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
---
|
|
2
|
+
paths:
|
|
3
|
+
- "**/auth/**"
|
|
4
|
+
- "**/security/**"
|
|
5
|
+
- "**/*Token*"
|
|
6
|
+
- "**/*Password*"
|
|
7
|
+
- "**/*Secret*"
|
|
8
|
+
- "**/*Session*"
|
|
9
|
+
- "**/*Crypto*"
|
|
10
|
+
- "**/*Credential*"
|
|
11
|
+
- "**/encrypt*"
|
|
12
|
+
- "**/cipher*"
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## Dispatch
|
|
16
|
+
- Charge `appsec` AVANT d'ecrire du code d'auth ou de crypto.
|
|
17
|
+
- Si tu touches des tokens/sessions → charge aussi `crypto`.
|
|
18
|
+
- Si le fichier est dans `.github/workflows/` → charge aussi `devsecops` + `supply-chain`.
|
|
19
|
+
|
|
20
|
+
## Regles dures (zero tolerance)
|
|
21
|
+
- **Jamais** de secret, token, cle API, mot de passe dans le code. Env vars ou secret manager.
|
|
22
|
+
- **Jamais** de `import { random }` pour la crypto. Toujours `crypto.randomBytes` ou equivalent.
|
|
23
|
+
- **Jamais** de `bcrypt.compare` sans `await`. Un `== true` oublie = tous les comptes ouverts.
|
|
24
|
+
|
|
25
|
+
## Conventions du projet
|
|
26
|
+
- Hachage mots de passe : bcrypt ou argon2. Jamais MD5/SHA1.
|
|
27
|
+
- Chiffrement : AES-256-GCM ou ChaCha20-Poly1305. Jamais ECB.
|
|
28
|
+
- JWT : RS256 ou ES256. Pas de `secret: "mon-super-secret"`.
|
|
29
|
+
- Les cles tournent automatiquement (max 90 jours).
|
|
30
|
+
- Log scrubbing : jamais de PII/token/secret dans les logs.
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
---
|
|
2
|
+
paths:
|
|
3
|
+
- "**/*.test.*"
|
|
4
|
+
- "**/*.spec.*"
|
|
5
|
+
- "**/__tests__/**"
|
|
6
|
+
- "**/test/**"
|
|
7
|
+
- "**/tests/**"
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## Dispatch
|
|
11
|
+
- Charge `testing` AVANT d'ecrire du code source.
|
|
12
|
+
- Si c'est un test d'integration avec DB → charge aussi `database-design`.
|
|
13
|
+
- Si c'est un test E2E → charge aussi `cicd-pipeline` (le test doit passer en CI).
|
|
14
|
+
|
|
15
|
+
## Regle dure (zero tolerance)
|
|
16
|
+
- **RED FIRST** : ecris le test et vois-le echouer avant d'ecrire le code source. Jamais l'inverse.
|
|
17
|
+
- **Flaky test** : si un test echoue sans changement de code > 2% du temps → quarantaine. Jamais "relance le job".
|
|
18
|
+
- **Pas de mock systematique** : vraie DB en integration (testcontainers, pg_tmp). Mock seulement les frontieres lentes (HTTP externe, email).
|
|
19
|
+
|
|
20
|
+
## Conventions du projet
|
|
21
|
+
- Test pyramid : 70% unitaires, 20% integration, 10% E2E.
|
|
22
|
+
- Tester le comportement observable, pas l'implementation. Input → output.
|
|
23
|
+
- Arrange-Act-Assert. DAMP > DRY dans les tests (lisibilite avant factorisation).
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: agile
|
|
3
|
+
description: "Agile — Scrum, Kanban, Shape Up, sprints, estimation, retros, amelioration continue. A charger quand on travaille en mode agile."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Agile
|
|
7
|
+
|
|
8
|
+
**Principe premier :** L'agilite n'est pas un framework (Scrum n'est pas l'agilite) — c'est un principe : livrer de la valeur en petits increments, inspecter le resultat, et adapter le plan. Le manifeste agile a 4 valeurs, et la premiere est "les individus et leurs interactions plus que les processus et les outils". Si ton processus agile est plus important que les personnes qui l'utilisent, tu as echoue l'agilite. Le but du process n'est pas d'etre suivi — c'est de rendre l'equipe plus efficace. Un processus qui ralentit l'equipe n'est pas agile, meme s'il suit Scrum a la lettre. Le meilleur indicateur d'agilite : combien de temps entre "j'ai une idee" et "c'est en production" ?
|
|
9
|
+
|
|
10
|
+
## Checklist
|
|
11
|
+
- [ ] Les ceremonies sont cadrees : standup 15min, retro 1h, planning 1-2h — si plus long, le processus est casse
|
|
12
|
+
- [ ] Les tickets sont INVEST : Independent, Negotiable, Valuable, Estimable, Small, Testable
|
|
13
|
+
- [ ] Le WIP est limite (Kanban/Scrum avec capacite explicite) — pas plus de travail en cours que de capacite
|
|
14
|
+
- [ ] Les retros produisent des actions concretes (pas "on communiquera mieux") — max 2-3 actions par retro
|
|
15
|
+
- [ ] La velocite est utilisee pour le planning, pas pour le jugement de performance
|
|
16
|
+
- [ ] Le backlog est priorise par valeur business, pas par "c'est facile" ou "c'est urgent depuis 6 mois"
|
|
17
|
+
- [ ] Le cycle time (temps ticket ouvert → ferme) est mesure et s'ameliore — c'est le vrai KPI agile
|
|
18
|
+
|
|
19
|
+
## Anti-patterns
|
|
20
|
+
### Agile = Scrum = standups + sprints
|
|
21
|
+
**Ce qu'on voit :** l'equipe fait des standups, des sprints de 2 semaines, et un retro. "On est agile." Les stories sont estimees en story points. Les sprints sont bookes a 110%. Rien n'est livre en production a la fin du sprint.
|
|
22
|
+
**Pourquoi c'est dangereux :** c'est du theatre agile. Les ceremonies sont suivies mais l'objectif (livrer de la valeur rapidement) est manque. Le processus devient le produit. L'equipe est frustree ("l'agile c'est des reunions qui servent a rien") sans comprendre que le probleme n'est pas l'agilite, c'est l'imitation vide de l'agilite.
|
|
23
|
+
**Faire plutot :** se demander POURQUOI on fait chaque ceremonie. Si le standup est un compte-rendu au manager, c'est foutu — le standup est pour que l'equipe se synchronise. Si la retro ne produit jamais d'actions, l'arreter. Moins de processus, plus de livraison. Commencer par Kanban (pas de sprint, flux continu) et ajouter des ceremonies seulement si le besoin emerge.
|
|
24
|
+
|
|
25
|
+
### Story points = mesure de performance
|
|
26
|
+
**Ce qu'on voit :** "tu as fait 8 points ce sprint, l'objectif est 13." Les story points deviennent un KPI individuel.
|
|
27
|
+
**Pourquoi c'est dangereux :** les story points mesurent la complexite relative, pas la productivite. Les utiliser comme KPI = l'equipe gonfle les estimations. 1 point devient 3. La velocite augmente mais rien n'est livre plus vite. Culture de la peur et du gaming du systeme.
|
|
28
|
+
**Faire plutot :** les story points servent UNIQUEMENT a la planification de sprint (combien de travail l'equipe peut absorber). La vraie metrique est le cycle time (combien de temps pour livrer) et le throughput (combien de tickets livres par semaine). Ces metriques ne sont pas gameables.
|
|
29
|
+
|
|
30
|
+
### Retro = rituel vide
|
|
31
|
+
**Ce qu'on voit :** "Qu'est-ce qui s'est bien passe ? Qu'est-ce qui s'est mal passe ?" Memes reponses depuis 6 mois : "la communication" et "les specs pas claires". Zero action concrete.
|
|
32
|
+
**Pourquoi c'est dangereux :** une retro sans action est un signal que l'equipe est apprise a l'impuissance. Les problemes sont identifies mais jamais resolus. La retro devient une soupape ou on se plaint sans consequence — c'est pire que pas de retro car ca cree du cynisme.
|
|
33
|
+
**Faire plutot :** chaque retro produit 1-2 actions concretes, assignees, avec deadline. La retro suivante commence par "est-ce que les actions de la derniere retro sont faites ?" Si non, pourquoi ? Si une action n'est jamais faite, le probleme n'est pas l'equipe — c'est que le systeme empeche l'amelioration.
|
|
34
|
+
|
|
35
|
+
## Patterns
|
|
36
|
+
### Kanban pour commencer
|
|
37
|
+
**Quand :** equipe qui decouvre l'agilite ou qui a ete brulee par Scrum.
|
|
38
|
+
**Comment :** visualiser le flux (colonnes To Do / In Progress / Done), limiter le WIP (max 2 taches par personne en In Progress), mesurer le cycle time. Pas de sprint, pas d'estimation obligatoire, pas de ceremonies forcees. Ajouter un standup uniquement si la synchro est necessaire. Iterer sur le processus a partir de la.
|
|
39
|
+
|
|
40
|
+
### Cycle time comme North Star
|
|
41
|
+
**Quand :** mesurer l'amelioration continue.
|
|
42
|
+
**Comment :** cycle time = temps entre "le ticket est pret a developper" et "en production". Mesurer le P50 et P85 (pas la moyenne — les outliers faussent). Objectif : reduire le cycle time sans sacrifier la qualite. Un cycle time qui diminue = l'equipe s'ameliore VRAIMENT.
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: alerting
|
|
3
|
+
description: "Alerting — SLO-based alerting, alert fatigue prevention, on-call, post-mortems, runbooks. A charger quand on configure des alertes."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Alerting
|
|
7
|
+
|
|
8
|
+
**Principe premier :** Une alerte qui ne declenche pas d'action n'est pas une alerte — c'est du bruit qui tue les vraies alertes. Chaque alerte doit etre : actionable (tu sais quoi faire), symptom-based (pas cause-based), et avoir un runbook. Si tu ne peux pas ecrire le runbook en < 5 etapes, ne cree pas l'alerte. Le but n'est pas d'etre notifie de tout — c'est d'etre notifie assez tot pour agir avant que les utilisateurs ne remarquent.
|
|
9
|
+
|
|
10
|
+
## Checklist
|
|
11
|
+
- [ ] Les alertes sont sur les symptomes (P95 > 1s, error rate > 1%), pas sur les causes (CPU > 70%)
|
|
12
|
+
- [ ] Chaque alerte a un runbook — pas "on verra quand ca sonnera"
|
|
13
|
+
- [ ] Les regles d'alerte et la config AlertManager sont dans le repo (alerting as code) — pas creees a la main
|
|
14
|
+
- [ ] SLA de reponse defini : critical (page, < 5 min), high (page jour, < 30 min), medium (ticket, < 4h)
|
|
15
|
+
- [ ] Alertes groupees et de-dupliquees — pas 50 pages pour la meme cause racine
|
|
16
|
+
- [ ] On-call rotation documentee avec escalation — personne n'est on-call seul sans backup
|
|
17
|
+
- [ ] Post-mortem blameless apres chaque incident majeur + 5 Whys jusqu'a la cause racine
|
|
18
|
+
|
|
19
|
+
## Anti-patterns
|
|
20
|
+
### Alerter sur tout
|
|
21
|
+
**Ce qu'on voit :** "CPU > 70%", "memoire > 60%", "disque > 70%" — 200 alertes configurees. 15 pages par nuit. L'equipe a mute le canal.
|
|
22
|
+
**Pourquoi c'est dangereux :** alert fatigue. Chaque fausse alerte entraine la suivante vers l'ignore. Quand la vraie alerte critique arrive, personne ne la voit. Le canal d'alerte est devenu un flux de bruit ignore.
|
|
23
|
+
**Faire plutot :** alerter sur les symptomes utilisateur. "P95 latency > 1s pendant 5 min" (l'utilisateur ressent la lenteur). "Error rate > 1% pendant 5 min" (l'utilisateur voit des erreurs). Le CPU est une cause possible parmi 10, pas un symptome.
|
|
24
|
+
|
|
25
|
+
### Alerte sans runbook
|
|
26
|
+
**Ce qu'on voit :** alerte "PaymentService is down". Pas de runbook. L'on-call Googlise "comment restart payment service" a 3h du matin.
|
|
27
|
+
**Pourquoi c'est dangereux :** MTTR explose. L'on-call stresse fait des erreurs. Le runbook est la difference entre "redemarrer en 2 minutes" et "aggraver l'incident en 30 minutes de debugging panique".
|
|
28
|
+
**Faire plutot :** runbook attache a chaque alerte. Etapes concretes. "1. Verifier les logs dans Loki avec {service=payment, level=error}. 2. Si OOM -> restart le pod. 3. Si DB timeout -> verifier les connexions pool. 4. Si rien -> escalader a l'equipe backend. 5. Post-mortem avec 5 Whys dans les 48h."
|
|
29
|
+
|
|
30
|
+
### Aucun post-mortem
|
|
31
|
+
**Ce qu'on voit :** incident resolu -> "ouf, on passe a autre chose". Pas d'analyse. Le meme incident se reproduit 3 mois plus tard.
|
|
32
|
+
**Pourquoi c'est dangereux :** sans post-mortem, l'organisation n'apprend pas. Les memes erreurs se repetent. Le but du post-mortem n'est pas de trouver un coupable — c'est d'identifier les failles du SYSTEME qui ont permis l'incident.
|
|
33
|
+
**Faire plutot :** post-mortem blameless dans les 48h. Format : timeline, impact, 5 Whys jusqu'a la cause racine, what went well, what went wrong, action items. Les action items ont des owners et des deadlines.
|
|
34
|
+
|
|
35
|
+
### Corriger le symptome, pas la cause racine
|
|
36
|
+
**Ce qu'on voit :** le disque est plein -> on supprime des logs. Le disque se remplit 3 jours plus tard. Meme incident, meme reponse. 5 iterations avant de se demander POURQUOI.
|
|
37
|
+
**Pourquoi c'est dangereux :** corriger le symptome sans trouver la cause racine garantit la recidive. Chaque recurrence erode la confiance. Le MTTR apparent est bas, le MTTR reel est infini (l'incident n'est jamais vraiment resolu).
|
|
38
|
+
**Faire plutot :** methode des 5 Whys. "Le disque est plein" -> Pourquoi ? "Les logs font 50 Go/jour" -> Pourquoi ? "Level DEBUG active en prod" -> Pourquoi ? "Le deploiement a ecrase la config" -> Pourquoi ? "La config n'est pas versionnee" -> Action racine : versionner la config + alerter si disque > 80%. Le bug est le niveau DEBUG. La cause racine est l'absence d'IaC pour la config. On corrige la cause, pas le symptome.
|
|
39
|
+
|
|
40
|
+
## Patterns
|
|
41
|
+
### AlertManager (routing + dedup + silence)
|
|
42
|
+
**Quand :** toute stack Prometheus en production.
|
|
43
|
+
**Comment :** Prometheus evalue les rules -> alertes -> AlertManager. AlertManager groupe les alertes (`group_by: [service, severity]`), deduplique (meme alerte = une notification), silencie la maintenance (`matchers: [env=staging]`). Routes par severite : critical -> PagerDuty/Opsgenie, warning -> Slack. Config dans `monitoring/alertmanager.yml`, versionne dans le repo.
|
|
44
|
+
|
|
45
|
+
### Alerting as Code (regles dans le repo)
|
|
46
|
+
**Quand :** toute equipe de plus d'une personne.
|
|
47
|
+
**Comment :** regles Prometheus (`monitoring/rules.yml`), config AlertManager (`monitoring/alertmanager.yml`), dashboards Grafana (`monitoring/dashboards/`) — tout dans le repo, versionne, deploye via CI/CD. Pas de regle creee a la main dans l'UI Grafana. Une PR pour chaque changement d'alerte — le seuil, le runbook_url, la severite sont revus comme du code.
|
|
48
|
+
|
|
49
|
+
### Runbook integre a l'alerte
|
|
50
|
+
**Quand :** chaque alerte creee.
|
|
51
|
+
**Comment :** `annotations: { runbook_url: "https://wiki.corp/runbooks/payment-latency" }`. Le runbook contient : (1) ce que signifie l'alerte, (2) comment verifier dans Grafana/Loki/Tempo, (3) actions de mitigation, (4) qui escalader, (5) comment faire un 5 Whys si la mitigation ne suffit pas.
|
|
52
|
+
|
|
53
|
+
### Post-mortem blameless + 5 Whys
|
|
54
|
+
**Quand :** tout incident qui a declenche une alerte on-call.
|
|
55
|
+
**Comment :** document blameless dans les 48h. Sections : timeline, impact, 5 Whys jusqu'a la cause racine systemique, what went well, what went wrong, action items avec owners et deadlines. L'objectif est d'ameliorer le SYSTEME — pas de trouver un responsable. Action items prioritaires sur le prochain sprint.
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: api-design
|
|
3
|
+
description: "API Design — l'API comme contrat, REST/GraphQL/gRPC, pagination cursor-based, idempotency, structured errors, rate limiting. À charger quand on crée ou modifie des endpoints."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# API Design
|
|
7
|
+
|
|
8
|
+
**Principe premier :** Une API est un contrat entre un client et un serveur qui évoluent à des rythmes différents. Le client peut être une app mobile qui se met à jour une fois par mois, le serveur peut être déployé 10× par jour. Le design d'API est l'art de faire évoluer le contrat sans le casser. Chaque champ que tu ajoutes est un engagement, chaque champ que tu changes est une rupture. La question n'est pas "est-ce que c'est RESTful ?" mais "est-ce que le client peut survivre à 6 mois de changements serveur sans mise à jour ?"
|
|
9
|
+
|
|
10
|
+
## Checklist
|
|
11
|
+
- [ ] L'API est versionnée — dans l'URL (/v1/) ou le header (Accept-Version)
|
|
12
|
+
- [ ] Pagination cursor-based — stable, index-friendly, pas de doublon entre pages
|
|
13
|
+
- [ ] Les erreurs sont structurées : `{error: {code, message, details}}` — pas de `200 OK {success: false}`
|
|
14
|
+
- [ ] Les mutations POST/PUT/DELETE supportent l'idempotency key
|
|
15
|
+
- [ ] Rate limiting en place avec headers standards : `Retry-After`, `X-RateLimit-*`
|
|
16
|
+
- [ ] Le schéma est documenté (OpenAPI/GraphQL schema/gRPC proto) et la doc est le contrat, pas une suggestion
|
|
17
|
+
- [ ] Pas de breaking change sans nouvelle version ou deprecation window explicite
|
|
18
|
+
|
|
19
|
+
## Anti-patterns
|
|
20
|
+
### Breaking change silencieux
|
|
21
|
+
**Ce qu'on voit :** `{price: 10}` devient `{price: {amount: 10, currency: "EUR"}}` sur la même version d'API. Les clients mobiles qui n'ont pas été mis à jour crashent.
|
|
22
|
+
**Pourquoi c'est dangereux :** le client n'a aucun moyen de savoir que le contrat a changé. Il parse ce qu'il reçoit, ça casse. Le pire : ça peut arriver à 20% des utilisateurs seulement (ceux qui n'ont pas la dernière version de l'app). Le bug est invisible côté serveur.
|
|
23
|
+
**Faire plutôt :** nouvelle version (/v2/) avec le nouveau format. L'ancienne version (/v1/) est maintenue pendant une deprecation window (6-12 mois) avec un header `Deprecation: true` et `Sunset: <date>`. Les clients ont le temps de migrer.
|
|
24
|
+
|
|
25
|
+
### `200 OK` avec erreur dedans
|
|
26
|
+
**Ce qu'on voit :** toutes les réponses sont HTTP 200. Le corps contient `{success: false, error: "quelque chose"}`. Même pour une erreur 500.
|
|
27
|
+
**Pourquoi c'est dangereux :** HTTP a un système de codes d'erreur pour une raison. Les CDN cachent les 200. Les load balancers comptent les 5xx. Les outils de monitoring alertent sur les taux d'erreur HTTP. En faisant tout en 200, tu rends ton API invisible à toute la chaîne d'infrastructure.
|
|
28
|
+
**Faire plutôt :** utiliser les codes HTTP comme prévu. 201 Created, 400 Bad Request, 401 Unauthorized, 403 Forbidden, 404 Not Found, 409 Conflict, 422 Unprocessable, 429 Too Many Requests, 500 Internal. Le code HTTP est un signal machine-readable.
|
|
29
|
+
|
|
30
|
+
### Offset pagination
|
|
31
|
+
**Ce qu'on voit :** `GET /orders?page=3&limit=50` → `LIMIT 50 OFFSET 100`. À la page 100, la DB scanne 5000 rows pour en retourner 50.
|
|
32
|
+
**Pourquoi c'est dangereux :** deux problèmes. Performance : OFFSET N oblige la DB à scanner N rows. Cohérence : si une row est insérée entre deux pages, toutes les rows suivantes sont décalées et l'utilisateur voit des doublons ou manque des entrées.
|
|
33
|
+
**Faire plutôt :** cursor-based : `GET /orders?cursor=xyz&limit=50` → `WHERE id > 'xyz' ORDER BY id LIMIT 50`. Index-friendly. Stable. Pas de doublon. Le cursor est opaque pour le client.
|
|
34
|
+
|
|
35
|
+
## Patterns
|
|
36
|
+
### Structured errors
|
|
37
|
+
**Quand :** toute API.
|
|
38
|
+
**Comment :** `{error: {code: "INSUFFICIENT_FUNDS", message: "Solde insuffisant", details: [{field: "amount", reason: "minimum 10 EUR"}]}}`. `code` : machine-readable (switch côté client). `message` : human-readable (debug). `details` : actionable (form validation).
|
|
39
|
+
|
|
40
|
+
### Idempotency key
|
|
41
|
+
**Quand :** toute mutation où le double-submit est dangereux (paiements, créations).
|
|
42
|
+
**Comment :** header `Idempotency-Key: <uuid>`. Le serveur stocke la clé + le résultat. Même clé = même réponse, l'opération n'est exécutée qu'une fois. Stripe utilise ce pattern pour 100% de leurs mutations.
|
|
43
|
+
|
|
44
|
+
### Rate limiting avec headers
|
|
45
|
+
**Quand :** tout endpoint public.
|
|
46
|
+
**Comment :** `429 Too Many Requests` + `Retry-After: 30` + `X-RateLimit-Limit: 100` + `X-RateLimit-Remaining: 0` + `X-RateLimit-Reset: 1716000000`. Le client sait exactement quand réessayer. Pas de backoff deviné.
|