oh-my-customcode 1.1.45 → 1.1.47
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/dist/cli/index.js +56 -13
- package/dist/index.js +1 -1
- package/package.json +1 -1
- package/templates/.claude/rules/MAY-optimization.md +6 -0
- package/templates/.claude/rules/MUST-agent-design.md +4 -0
- package/templates/.claude/rules/MUST-agent-teams.md +27 -3
- package/templates/.claude/rules/MUST-completion-verification.md +12 -4
- package/templates/.claude/rules/MUST-orchestrator-coordination.md +29 -3
- package/templates/.claude/rules/MUST-parallel-execution.md +4 -0
- package/templates/.claude/rules/MUST-permissions.md +34 -2
- package/templates/.claude/rules/MUST-safety.md +2 -0
- package/templates/.claude/rules/MUST-sync-verification.md +21 -0
- package/templates/.claude/rules/SHOULD-memory-integration.md +4 -0
- package/templates/.claude/rules/SHOULD-verification-ladder.md +2 -0
- package/templates/.claude/skills/de-lead-routing/SKILL.md +3 -1
- package/templates/.claude/skills/dev-lead-routing/SKILL.md +3 -1
- package/templates/.claude/skills/multi-model-verification/SKILL.md +2 -2
- package/templates/CLAUDE.md +3 -3
- package/templates/CLAUDE.md.en +3 -3
- package/templates/CLAUDE.md.ko +3 -3
- package/templates/manifest.json +1 -1
package/dist/cli/index.js
CHANGED
|
@@ -241,7 +241,7 @@ var init_package = __esm(() => {
|
|
|
241
241
|
workspaces: [
|
|
242
242
|
"packages/*"
|
|
243
243
|
],
|
|
244
|
-
version: "1.1.
|
|
244
|
+
version: "1.1.47",
|
|
245
245
|
description: "Batteries-included agent harness for Claude Code",
|
|
246
246
|
type: "module",
|
|
247
247
|
bin: {
|
|
@@ -25737,6 +25737,7 @@ var i18n = {
|
|
|
25737
25737
|
var DEFAULT_PACKAGE_NAME = "oh-my-customcode";
|
|
25738
25738
|
var DEFAULT_CACHE_TTL_MS = 24 * 60 * 60 * 1000;
|
|
25739
25739
|
var DEFAULT_CACHE_PATH = join2(homedir2(), ".oh-my-customcode", "self-update-cache.json");
|
|
25740
|
+
var MS_EPOCH_THRESHOLD = 1000000000000;
|
|
25740
25741
|
function normalizeVersion(version) {
|
|
25741
25742
|
return version.trim().replace(/^v/i, "").split("-")[0] || "";
|
|
25742
25743
|
}
|
|
@@ -25779,22 +25780,57 @@ function isNpxInvocation(argv = process.argv, env = process.env) {
|
|
|
25779
25780
|
const npmCommand = env.npm_command || "";
|
|
25780
25781
|
return argv1.includes("/_npx/") || argv1.includes("\\_npx\\") || npmExecPath.includes("npx") || npmCommand === "exec" || env.npm_lifecycle_event === "npx";
|
|
25781
25782
|
}
|
|
25782
|
-
function
|
|
25783
|
+
function isJsonRecord(value) {
|
|
25784
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
25785
|
+
}
|
|
25786
|
+
function readNonEmptyString(value) {
|
|
25787
|
+
if (typeof value !== "string") {
|
|
25788
|
+
return null;
|
|
25789
|
+
}
|
|
25790
|
+
const trimmed = value.trim();
|
|
25791
|
+
return trimmed === "" ? null : trimmed;
|
|
25792
|
+
}
|
|
25793
|
+
function epochToIsoString(value) {
|
|
25794
|
+
let numeric = Number.NaN;
|
|
25795
|
+
if (typeof value === "number") {
|
|
25796
|
+
numeric = value;
|
|
25797
|
+
} else if (typeof value === "string") {
|
|
25798
|
+
numeric = Number(value.trim());
|
|
25799
|
+
}
|
|
25800
|
+
if (!Number.isFinite(numeric) || numeric <= 0) {
|
|
25801
|
+
return null;
|
|
25802
|
+
}
|
|
25803
|
+
const milliseconds = numeric >= MS_EPOCH_THRESHOLD ? numeric : numeric * 1000;
|
|
25804
|
+
const date = new Date(milliseconds);
|
|
25805
|
+
if (Number.isNaN(date.getTime())) {
|
|
25806
|
+
return null;
|
|
25807
|
+
}
|
|
25808
|
+
return date.toISOString();
|
|
25809
|
+
}
|
|
25810
|
+
function readSelfUpdateCache(cachePath) {
|
|
25783
25811
|
if (!existsSync(cachePath)) {
|
|
25784
25812
|
return null;
|
|
25785
25813
|
}
|
|
25814
|
+
let parsed;
|
|
25786
25815
|
try {
|
|
25787
|
-
|
|
25788
|
-
if (!parsed.checkedAt || !parsed.latestVersion) {
|
|
25789
|
-
return null;
|
|
25790
|
-
}
|
|
25791
|
-
return {
|
|
25792
|
-
checkedAt: parsed.checkedAt,
|
|
25793
|
-
latestVersion: parsed.latestVersion
|
|
25794
|
-
};
|
|
25816
|
+
parsed = JSON.parse(readFileSync(cachePath, "utf-8"));
|
|
25795
25817
|
} catch {
|
|
25796
25818
|
return null;
|
|
25797
25819
|
}
|
|
25820
|
+
if (!isJsonRecord(parsed)) {
|
|
25821
|
+
return null;
|
|
25822
|
+
}
|
|
25823
|
+
const cliVersion = readNonEmptyString(parsed.latestVersion);
|
|
25824
|
+
const cliCheckedAt = readNonEmptyString(parsed.checkedAt);
|
|
25825
|
+
if (cliVersion && cliCheckedAt) {
|
|
25826
|
+
return { checkedAt: cliCheckedAt, latestVersion: cliVersion, schema: "cli" };
|
|
25827
|
+
}
|
|
25828
|
+
const hookVersion = readNonEmptyString(parsed.version);
|
|
25829
|
+
const hookCheckedAt = epochToIsoString(parsed.timestamp);
|
|
25830
|
+
if (hookVersion && hookCheckedAt) {
|
|
25831
|
+
return { checkedAt: hookCheckedAt, latestVersion: hookVersion, schema: "hook" };
|
|
25832
|
+
}
|
|
25833
|
+
return null;
|
|
25798
25834
|
}
|
|
25799
25835
|
function writeCache(cachePath, latestVersion, now) {
|
|
25800
25836
|
const dir2 = dirname(cachePath);
|
|
@@ -25803,7 +25839,10 @@ function writeCache(cachePath, latestVersion, now) {
|
|
|
25803
25839
|
}
|
|
25804
25840
|
const payload = {
|
|
25805
25841
|
checkedAt: new Date(now).toISOString(),
|
|
25806
|
-
latestVersion
|
|
25842
|
+
latestVersion,
|
|
25843
|
+
version: latestVersion,
|
|
25844
|
+
timestamp: Math.floor(now / 1000),
|
|
25845
|
+
source: "omcustom-cli"
|
|
25807
25846
|
};
|
|
25808
25847
|
writeFileSync(cachePath, `${JSON.stringify(payload, null, 2)}
|
|
25809
25848
|
`, "utf-8");
|
|
@@ -25813,7 +25852,11 @@ function isCacheFresh(cache, now, cacheTtlMs) {
|
|
|
25813
25852
|
if (Number.isNaN(checkedAt)) {
|
|
25814
25853
|
return false;
|
|
25815
25854
|
}
|
|
25816
|
-
|
|
25855
|
+
const age = now - checkedAt;
|
|
25856
|
+
if (age < -cacheTtlMs) {
|
|
25857
|
+
return false;
|
|
25858
|
+
}
|
|
25859
|
+
return age < cacheTtlMs;
|
|
25817
25860
|
}
|
|
25818
25861
|
function fetchLatestVersionFromNpm(packageName = DEFAULT_PACKAGE_NAME) {
|
|
25819
25862
|
try {
|
|
@@ -25958,7 +26001,7 @@ function checkSelfUpdate(options) {
|
|
|
25958
26001
|
}
|
|
25959
26002
|
let latestVersion = null;
|
|
25960
26003
|
let usedCache = false;
|
|
25961
|
-
const cache =
|
|
26004
|
+
const cache = readSelfUpdateCache(cachePath);
|
|
25962
26005
|
if (cache && isCacheFresh(cache, now, cacheTtlMs)) {
|
|
25963
26006
|
const cachedVersion = normalizeVersion(cache.latestVersion);
|
|
25964
26007
|
if (isVersionPlausible(currentVersion, cachedVersion)) {
|
package/dist/index.js
CHANGED
package/package.json
CHANGED
|
@@ -38,8 +38,14 @@
|
|
|
38
38
|
|
|
39
39
|
> **v2.1.212+**: MCP 도구 호출이 2분(기본값, `CLAUDE_CODE_MCP_AUTO_BACKGROUND_MS`로 임계값 조정·비활성) 초과 시 자동으로 백그라운드로 이동해 세션이 계속 사용 가능해집니다 — 위 v2.1.210 Bash/PowerShell auto-background의 MCP 도구 확장. 느린 MCP 호출(ontology-rag `rebuild_ontology`, code-review-graph 인덱싱 등)을 hang으로 오판하지 말고, 2분 초과 시 백그라운드 전환을 전제로 후속 작업을 진행합니다.
|
|
40
40
|
|
|
41
|
+
> **v2.1.233+**: `WebFetch`의 세션 URL 캐시 TTL이 `CLAUDE_CODE_WEBFETCH_CACHE_TTL_MS`로 조정 가능해졌습니다(기본 15분 불변). **재확인 함정**: 같은 URL을 TTL 내 재조회하면 캐시가 반환되므로 **독립적인 2차 확인이 아닙니다** — R020 Degraded-Output Re-Verification Gate가 요구하는 "결정론적 2차 소스"로 동일 URL의 WebFetch 재호출을 쓰지 말고, 다른 소스나 CLI 실측(`npm view`, `gh`)을 사용합니다.
|
|
42
|
+
|
|
41
43
|
> **v2.1.224+**: mid-turn에 연결된 MCP 도구가 **이름 고지 없이** tool search로 deferred되던 결함이 수정되었습니다. 구버전에서는 세션 도중 붙은 MCP 서버의 도구가 이름조차 노출되지 않아 "그런 도구 없음"으로 오판할 수 있었으므로, 위 tool-availability 주의(`command -v` 사전 확인과 동류)를 MCP 도구에도 적용합니다 — 도구 부재 결론 전에 `ToolSearch`로 실측합니다.
|
|
42
44
|
|
|
45
|
+
> **v2.1.228+**: Write 도구가 **이번 세션에 읽지 않은 기존 파일도 newer model에서는 덮어쓸 수 있도록** 변경되어 Edit 도구 규칙과 일치합니다(구모델은 여전히 read 선행 필요). 도구가 강제하던 read-before-write 가드가 모델에 따라 사라지므로, "Write가 실패했다 = 파일을 안 읽었다"는 진단이 더 이상 보편적으로 성립하지 않고, **읽지 않은 파일을 Write하면 기존 내용이 경고 없이 소실**됩니다 — 전체 교체가 아닌 변경에는 Edit을 쓰는 원칙을 도구 강제가 아니라 절차로 유지합니다. 또한 deferred-tools reminder가 skill 호출 후 모델에 두 번 전달되던 문제가 수정되었습니다(중복 컨텍스트 소모).
|
|
46
|
+
|
|
47
|
+
> **v2.1.229+**: 도구 호출의 `glob`/`file_path`/`command` 값이 **비문자열일 때 에러 화면으로 크래시**하던 문제가 수정되었습니다(해당 세션의 `--resume`에서도 재발). 구버전에서 이 크래시는 세션을 복구 불가 상태로 만들면서 **원인이 도구 인자 타입이라는 단서를 남기지 않았으므로**, 스크립트로 도구 인자를 조립할 때 문자열 타입을 보장합니다(cross-ref R023 Workflow Script Sanity Check). 좁은 터미널에서 progress bar·마크다운 표 렌더링 시 발생하던 RangeError 크래시(`claude --continue`/`--resume` 시작 시에도 발생)도 함께 수정되었습니다.
|
|
48
|
+
|
|
43
49
|
### Capability-Aware Tool Scheduling
|
|
44
50
|
|
|
45
51
|
When dispatching parallel tool calls, consider per-tool capabilities to optimize scheduling:
|
|
@@ -492,6 +492,10 @@ Key optional fields: `scope`, `context`, `version`, `effort`, `model`, `agent`,
|
|
|
492
492
|
|
|
493
493
|
> **v2.1.222+**: 스킬 frontmatter의 `disable-model-invocation: true`(모델이 스스로 그 스킬을 호출하지 못하게 막고 사용자/파이프라인의 명시적 호출만 허용하는 필드)가 설정된 스킬을 모델이 호출하려 할 때의 refusal 문구가 개선되어, 모델에게 **워크플로우를 스스로 복제하지 말고 사용자에게 실행을 요청하라**고 지시합니다. 무인 루프(`/fsd` 등)가 이런 스킬을 모델 호출 경로에 두면 실행 대신 refusal이 반환되므로, 해당 스킬은 **사용자/파이프라인 명시 호출**로 설계합니다.
|
|
494
494
|
|
|
495
|
+
> **v2.1.233+**: 스킬/커맨드의 인자 치환이 **인자 값을 다시 템플릿 마커로 재확장하던** 문제가 수정되었습니다 — 인자에 `$ARGUMENTS`·`$1` 같은 문자열이 들어오면 2차 확장돼 프롬프트가 변형될 수 있었습니다. 즉 구버전에서 **인자 값은 신뢰 입력이 아니었으므로**, 인자를 지시문에 그대로 끼워 넣는 스킬은 샘플 값으로 조립 결과를 실제 확인해 검증합니다(R023 Sample-Value Assembly — 문법 검증만으로는 드러나지 않는 계열).
|
|
496
|
+
|
|
497
|
+
> **v2.1.228+**: claude.ai에서 동기화된 스킬이 하드닝되었습니다 — 로컬 커맨드·MCP prompt를 **shadow하지 않고**, description이 sanitize·labeling되며, 로컬 머신에서 그 본문이 `!` 명령을 실행하거나 `@` 파일 참조를 확장하지 **않습니다**. 즉 외부 출처 스킬은 로컬 `.claude/skills/` 스킬과 **동일한 실행 능력을 갖지 않으므로**, 동기화 스킬에 `!`/`@` 동작을 전제한 본문을 작성하면 무음 미실행이 됩니다. 구버전에서는 동기화 스킬이 로컬 커맨드를 가릴 수 있어 같은 이름 호출이 어느 정의로 해소되는지 결정론적이지 않았습니다.
|
|
498
|
+
|
|
495
499
|
<!-- DETAIL: Skill Optional Fields (full yaml block)
|
|
496
500
|
```yaml
|
|
497
501
|
scope: core # core | harness | package (default: core)
|
|
@@ -1,12 +1,22 @@
|
|
|
1
1
|
# [MUST] Agent Teams Rules (Conditional)
|
|
2
2
|
|
|
3
3
|
> **Priority**: MUST | **ID**: R018
|
|
4
|
-
> **Condition**: Agent Teams enabled
|
|
4
|
+
> **Condition**: Agent Teams enabled — `CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1` **AND** `TeamCreate` present in the tool list (see Detection)
|
|
5
5
|
> **Fallback**: When disabled, R009/R010 apply
|
|
6
6
|
|
|
7
7
|
## Detection
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
Agent Teams is active only when the **team-creation path actually exists** — `TeamCreate` present in the tool list. The environment variable alone is NOT sufficient: it expresses intent to enable the feature, not the feature's availability.
|
|
10
|
+
|
|
11
|
+
| Observed state | Teams active? |
|
|
12
|
+
|----------------|---------------|
|
|
13
|
+
| `CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1` **and** `TeamCreate` present | Yes |
|
|
14
|
+
| env var set, `TeamCreate` **absent** | **No** — a team cannot be created, so no member can be spawned |
|
|
15
|
+
| `SendMessage` present, `TeamCreate` absent | **No** — peer/cross-session messaging is a separate capability (see Scope below), not evidence of Teams |
|
|
16
|
+
|
|
17
|
+
Rationale: since v2.1.233, `TeamCreate`/`TeamDelete` are absent from the tool list in this runtime (measured — R002 "Todo/Task 도구 기본 제거"), so a set env var cannot make teams creatable. Detection therefore rests on the tools actually being present, not on the env var alone — "the tool exists" is itself a claim requiring measurement (R020).
|
|
18
|
+
|
|
19
|
+
When Detection resolves to **No**, this entire rule is dormant and R009/R010 govern.
|
|
10
20
|
|
|
11
21
|
## Decision Matrix
|
|
12
22
|
|
|
@@ -42,6 +52,8 @@ These are distinct mechanisms. Agent Teams `SendMessage` requires `TeamCreate` a
|
|
|
42
52
|
|
|
43
53
|
> **v2.1.224/225+**: CC 네이티브 `SendMessage`가 **cross-session으로 확장**되었습니다(다른 머신 포함, macOS/Linux) — `ListAgents`로 대상을 열거하고 `crossSessionInbound` / `dialogExpiry` 설정으로 수신·만료를 제어합니다. 위 표의 "Cross-session = claude-peers-mcp 전용" 구분은 이제 **유일한 수단이 아니며**, 브로커 없이 네이티브 경로를 쓸 수 있습니다. 다만 위 Cross-Session Relay Authority Hardening(v2.1.166)의 권한 비전파 원칙은 네이티브 경로에도 동일하게 적용됩니다 — cross-session 메시지는 조율 신호이지 승인 채널이 아닙니다. (225) cross-session 메시지가 headless 세션·기동 중에 **고지도 만료도 없이 대기**하던 결함이 수정되었으므로, 구버전에서 "응답 없음"은 미수신이 아니라 무기한 대기였을 수 있습니다.
|
|
44
54
|
|
|
55
|
+
> **v2.1.229/232+**: 네이티브 cross-session 경로의 대상 지정이 쉬워졌습니다 — (229) `ListAgents`가 끊긴 Remote Control 세션을 `offline`, 클라우드 세션을 `cloud`로 표시하므로 **열거 결과에 있다는 사실만으로 도달 가능하다고 가정하지 않습니다**(구버전에서는 살아있는 세션과 끊긴 세션이 구분 없이 나열되어 무응답 원인을 판별할 수 없었습니다). (232) 프롬프트에 `@`로 다른 세션을 이름으로 멘션하면 `SendMessage`가 그 세션에 직접 도달하고, bare name이 **살아있는 세션 1개와 정확히 일치하면 ref 확인 없이 전달**됩니다 — 같은 머신의 세션 이름은 중복 시 `name-word-word` 변형으로 유일성이 보장되므로 이름 기반 전달이 결정론적입니다. 전달 성공은 여전히 조율 신호일 뿐이며, 아래 Member Completion Verification의 ground-truth 원칙과 v2.1.166 권한 비전파 원칙은 그대로 적용됩니다. 또한 (232) interactive session의 background 기본 실행은 **non-teammate 스폰에 한정**되므로 Teams member에는 적용되지 않습니다 — 아래 stall handling의 2분 휴리스틱을 background 지연과 혼동하지 않습니다(cross-ref R010).
|
|
56
|
+
|
|
45
57
|
### Cross-Session Relay Authority Hardening (CC v2.1.166+)
|
|
46
58
|
|
|
47
59
|
<!-- ARCHIVED CC version note (historical):
|
|
@@ -117,7 +129,7 @@ Origin: #1293 (Session 110 retrospective, Low).
|
|
|
117
129
|
|
|
118
130
|
> Origin: #1341 찐빠 #2 (low-confidence) — 4+ 병렬 Agent Tool 스폰 시 `[N]` prefix는 표기했으나 "R018 게이트: … → Agent Tool 폴백" announce를 생략한 것을 자가 위반으로 의심. 그러나 R018은 조건부 규칙이라 Agent Teams 비활성 환경에서는 게이트 투명성 자체가 미적용이다.
|
|
119
131
|
|
|
120
|
-
R018 전체(게이트 투명성 포함)는 Agent Teams 활성 시에만 적용되는 조건부 규칙이다
|
|
132
|
+
R018 전체(게이트 투명성 포함)는 Agent Teams 활성 시에만 적용되는 조건부 규칙이다 — 활성 조건은 `CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1` **AND** `TeamCreate` 도구 존재이며, `SendMessage` 단독 존재는 활성 근거가 아니다(상세는 위 `## Detection`). Agent Teams **비활성** 환경에서는:
|
|
121
133
|
|
|
122
134
|
- 게이트 투명성 announce 의무가 없다 — R009 `[N]` prefix 만으로 충분하다.
|
|
123
135
|
- 3+ 병렬 Agent Tool 스폰을 "게이트 announce 누락"으로 자가 플래그하지 않는다 (false-positive 방지).
|
|
@@ -352,6 +364,8 @@ Do NOT avoid Agent Teams solely for cost reasons when criteria are met.
|
|
|
352
364
|
|
|
353
365
|
Agent Teams 멤버는 long-running 작업 중 진행 상태를 TaskUpdate 로 명시적으로 알려야 한다. 침묵은 코디네이터가 죽었거나 멤버가 막혔다고 오인하게 만든다.
|
|
354
366
|
|
|
367
|
+
> **도구 가용성 선확인 (v2.1.233+)**: `TaskCreate/Get/Update/List`는 현행 모델(Opus 4.8 / Sonnet 5 / Fable 5 / Mythos 5 이상)에서 기본 제거되어 이 저장소 실행 환경에 **존재하지 않는다** — 실측은 R002 「Todo/Task 도구 기본 제거」. 아래 표는 Task 도구가 가용할 때(구모델 또는 `CLAUDE_CODE_ENABLE_TODO_TOOLS=1`)의 규정이며, **부재 시 아래 대체 규약을 따른다**. 없는 도구의 호출을 의무로 남겨두면 실행 불가능한 규정이 된다.
|
|
368
|
+
|
|
355
369
|
| 시점 | 호출 |
|
|
356
370
|
|------|------|
|
|
357
371
|
| 작업 시작 | TaskUpdate(taskId, status: "in_progress") |
|
|
@@ -367,6 +381,16 @@ Agent Teams 멤버는 long-running 작업 중 진행 상태를 TaskUpdate 로
|
|
|
367
381
|
|
|
368
382
|
Reference issue: #1087.
|
|
369
383
|
|
|
384
|
+
### Task 도구 부재 시 대체 규약 (Origin: #1582)
|
|
385
|
+
|
|
386
|
+
| 시점 | 대체 수단 |
|
|
387
|
+
|------|-----------|
|
|
388
|
+
| 시작 / 완료 / 차단 | `SendMessage` 1줄 보고 (`summary`에 상태 단어 포함) |
|
|
389
|
+
| 장문 진행 보고 | 아티팩트 파일 경로만 전달 (R006 Artifact Channel Protocol) — SendMessage 본문은 v2.1.222+ 조용히 절단된다 |
|
|
390
|
+
| 코디네이터의 완료 판정 | SendMessage 보고가 아니라 **결정론적 ground-truth** (아래 Member Completion Verification) |
|
|
391
|
+
|
|
392
|
+
`TaskList` 부재로 **공유 작업 목록이라는 조율 기반 자체가 사라지므로**, 아래 Member Completion Verification의 "보고는 신호일 뿐, 판정은 실측"이 보조 원칙이 아니라 **유일한 방어선**이 된다.
|
|
393
|
+
|
|
370
394
|
## Member Completion Verification (deterministic ground-truth)
|
|
371
395
|
|
|
372
396
|
Agent Teams member completion MUST be verified by deterministic ground-truth — NOT by SendMessage reports or TaskList status alone. Members may edit files without updating task status (task stays `pending`) or go idle without executing at all.
|
|
@@ -10,7 +10,7 @@ Before declaring any task `[Done]`, verify completion against task-type-specific
|
|
|
10
10
|
|
|
11
11
|
| Task Type | REQUIRED Verification Before [Done] |
|
|
12
12
|
|-----------|-------------------------------------|
|
|
13
|
-
| Release | All issues closed, version bumped, PR merged
|
|
13
|
+
| Release | All issues closed, version bumped, PR merged; **대기 조건은 AND** — `release.yml` completed **AND** GitHub Release `isDraft=false` (npm 도달은 충분조건이 아님, 아래 참조); **External automation verified**: `.github/workflows/` listed AND `gh run list --limit 10` checked for auto-publish workflows |
|
|
14
14
|
| Implementation | Code compiles/passes lint, tests pass (if exist), no TODO markers left |
|
|
15
15
|
| Documentation | Links valid, counts accurate, cross-references updated |
|
|
16
16
|
| Git Operations | Operation succeeded (check exit code), working tree clean |
|
|
@@ -18,6 +18,10 @@ Before declaring any task `[Done]`, verify completion against task-type-specific
|
|
|
18
18
|
| Agent/Skill Creation | Frontmatter valid, referenced skills exist, routing updated |
|
|
19
19
|
| UI/Frontend | Browser render verified (dev server running + page loaded), no console errors, visual output matches intent; **CSS/style changes**: capture before/after visual diff or screenshot; type-check passing alone is NOT sufficient |
|
|
20
20
|
|
|
21
|
+
> **비동기 연쇄의 대기 조건 = 가장 늦게 완료되는 산출물 (Origin: #1584 #2)**: 릴리즈 체인처럼 산출물이 순차 생성되는 비동기 연쇄에서, 중간 산출물 도달을 완료로 읽으면 뒤따르는 산출물이 미완인 채 남는다. npm publish는 `release.yml` **안에서** GitHub Release 생성보다 먼저 끝나므로, npm 도달 시점에 검증을 끝내면 Release가 `draft=true`로 남을 수 있다. `gh run view <id> --json status`(completed) **AND** `gh release view <tag> --json isDraft`(false)를 둘 다 확인한다.
|
|
22
|
+
>
|
|
23
|
+
> v1.1.44는 타이밍이 맞아 드러나지 않고 v1.1.45에서 노출된 **간헐적 결함**이다 — 한 번 통과한 검증 순서가 경합을 배제하지 않는다.
|
|
24
|
+
|
|
21
25
|
## Optional: Quantitative Evidence (advisory, added v0.114.0, #1034)
|
|
22
26
|
|
|
23
27
|
For complex agent invocations or multi-step workflows, attach 4-metric evidence to [Done] declarations as supplementary evidence (NOT a binary gate):
|
|
@@ -273,14 +277,18 @@ Origin: #1266 ④.
|
|
|
273
277
|
|
|
274
278
|
#### 자율 루프 세션의 턴 경계 정의 (계수 전 확정 필수)
|
|
275
279
|
|
|
276
|
-
위 파싱 레시피는 **"사용자 프롬프트 = 턴 경계"**를 암묵 전제한다. `/fsd` 같은 자율 루프는 사용자 프롬프트가 거의 없어(실측: 사용자 프롬프트 4개 대 assistant 응답 30여 회) 이 전제로는 경계 재구성이 실패하고, 계수 자체가 성립하지 않는다. 자율 루프 transcript를 셀 때는
|
|
280
|
+
위 파싱 레시피는 **"사용자 프롬프트 = 턴 경계"**를 암묵 전제한다. `/fsd` 같은 자율 루프는 사용자 프롬프트가 거의 없어(실측: 사용자 프롬프트 4개 대 assistant 응답 30여 회) 이 전제로는 경계 재구성이 실패하고, 계수 자체가 성립하지 않는다. 자율 루프 transcript를 셀 때는 **두 단계를 순서대로** 수행하고, 완료 전에는 **위반 횟수를 단정하지 않는다**.
|
|
281
|
+
|
|
282
|
+
1. **전처리 — `.message.role`이 존재하는 라인만 필터링**한다. 트랜스크립트에는 role 없는 라인(메타·이벤트·요약)이 assistant/user 사이에 대량으로 끼어 있어, 필터 없이는 **인접성 판정 자체가 깨진다**. 2단계의 어떤 경계 정의도 이 필터 없이는 성립하지 않는다.
|
|
283
|
+
2. **대안 경계 정의 확정** — 예: `tool_result` 직후 첫 text 블록을 응답 시작으로 간주.
|
|
277
284
|
|
|
278
285
|
| Anti-pattern | Required |
|
|
279
286
|
|--------------|----------|
|
|
280
|
-
| 자율 루프 transcript를 사용자 프롬프트 경계로 파싱해 위반 N회로 단정 |
|
|
287
|
+
| 자율 루프 transcript를 사용자 프롬프트 경계로 파싱해 위반 N회로 단정 | 1단계 필터 + 2단계 경계 정의를 먼저 확정; 확정 전에는 횟수 단정 금지 |
|
|
288
|
+
| 필터 없이 원본 라인 순서로 인접성을 판정 → 계수 실패를 경계 정의 탓으로 오진 | `.message.role` 필터를 먼저 적용한 뒤 경계 정의를 평가 |
|
|
281
289
|
| 경계 재구성 실패를 "위반 없음"으로 해석 | 경계 무관 지표로 대체 보고 — `┌─ Agent:` 헤더 총량, tool_use 대 announce 라인 비율 |
|
|
282
290
|
|
|
283
|
-
Origin: #1574 (v1.1.44 세션 — 자율 루프에서 R007 헤더 누락 계수를 시도했으나 사용자 프롬프트 4개로 턴 경계 재구성 불가). Cross-ref: R005(계수/매칭 방법 확인 — 도구 기본 동작 미확인 시 결과 오해석).
|
|
291
|
+
Origin: #1574 (v1.1.44 세션 — 자율 루프에서 R007 헤더 누락 계수를 시도했으나 사용자 프롬프트 4개로 턴 경계 재구성 불가); 1단계 필터는 #1584 #3 (v1.1.45 세션 — 위 조항을 신설했음에도 계수가 재실패. 실제 장애물은 경계 정의가 아니라 **`role=null` 라인 661개 / 전체 1215줄의 54%**였고, 필터 추가 즉시 성립(응답 시작 50, R007 위반 0) — 조항이 원인을 절반만 짚어 재발한 사례). Cross-ref: R005(계수/매칭 방법 확인 — 도구 기본 동작 미확인 시 결과 오해석).
|
|
284
292
|
|
|
285
293
|
### Proxy Signal vs Canonical Ground-Truth (#1336 ①②)
|
|
286
294
|
|
|
@@ -282,6 +282,18 @@ The Subagent Scope-Creep STOP Protocol (above) is REACTIVE — it halts an agent
|
|
|
282
282
|
|
|
283
283
|
Cross-reference: the Subagent Scope-Creep STOP Protocol (reactive halt after trips) and R001 (credential/privileged-scope guardrails, re-confirm scope before irreversible shared-infra actions).
|
|
284
284
|
|
|
285
|
+
#### 우회 플래그는 우회 대상과 근거를 명시 (Origin: #1584 #6)
|
|
286
|
+
|
|
287
|
+
보호장치를 우회하는 플래그(`--admin`, `--force`, `--no-verify` 등)를 위임 프롬프트에 지시할 때는 **무엇을 우회하는지와 그것이 정당한 근거**를 함께 적는다. 플래그만 적으면 하니스·에이전트가 무권한 우회로 판정해 플래그하거나 거부한다.
|
|
288
|
+
|
|
289
|
+
| Anti-pattern | Required |
|
|
290
|
+
|--------------|----------|
|
|
291
|
+
| `gh pr merge --admin`만 지시 | 우회 대상·근거 명시 — 예: "required status check 10종 전부 pass 확인함. `--admin`이 우회하는 것은 **리뷰어 승인 요건**뿐이며, 1인 메인테이너라 셀프 리뷰 불가" |
|
|
292
|
+
|
|
293
|
+
목적은 권한 확보가 아니라 **감사 추적**이다. 승인의 인용이 아니라 우회 범위의 사실 서술이므로 아래 「Delegation Prompt Framing — 승인 인용 금지」와 충돌하지 않는다.
|
|
294
|
+
|
|
295
|
+
Origin: #1584 #6 — v1.1.45·v1.1.46 릴리즈 PR 머지에서 하니스가 "no visible user authorization naming that bypass"로 플래그했다.
|
|
296
|
+
|
|
285
297
|
<!-- ARCHIVED CC version note (historical):
|
|
286
298
|
> **v2.1.178+**: Auto mode now evaluates subagent spawns with the safety classifier BEFORE launch, closing a gap where a spawned subagent could request a blocked action without prior review. This is the PLATFORM-level complement to the (advisory) Pre-Delegation Privileged-Scope Boundary above: the orchestrator still states the approved/forbidden scope in the delegation prompt (proactive, model-level), and CC now also gates the spawn itself (platform-level). The two are defense-in-depth — the prompt-stated boundary remains required because the classifier gates ACTIONS, not task SCOPE.
|
|
287
299
|
-->
|
|
@@ -311,6 +323,16 @@ Cross-reference: the Subagent Scope-Creep STOP Protocol (reactive halt after tri
|
|
|
311
323
|
|
|
312
324
|
Origin: #1563 찐빠 #3 — `gh issue edit --assignee`가 gh 2.86.0에 없는 플래그였고(정답 `--add-assignee`) 에이전트가 실행 중 자체 복구했다. Cross-reference: R005(도구 플래그·기본 동작 실측 함정 사례집), 아래 Agent Capability Pre-Check(위임 전 존재성 확인의 도구·경로 각도).
|
|
313
325
|
|
|
326
|
+
#### 저장소 상태 기재도 같은 규율 (Origin: #1584 #5)
|
|
327
|
+
|
|
328
|
+
위임 프롬프트에 저장소 상태(HEAD SHA, 브랜치, 작업트리 청결도)를 기재할 때도 **직전 실측**이 필요하다 — `git rev-parse --short HEAD` 한 줄이면 충분하다. 세션 중 머지·pull로 HEAD는 수시로 바뀌므로, 앞선 턴에서 본 값을 그대로 옮기면 서브에이전트가 **틀린 베이스를 전제로** 작업한다.
|
|
329
|
+
|
|
330
|
+
| Anti-pattern | Required |
|
|
331
|
+
|--------------|----------|
|
|
332
|
+
| 이전 턴에서 본 HEAD SHA를 위임서에 그대로 기재 | 위임 직전 `git rev-parse --short HEAD` 실측값 기재 |
|
|
333
|
+
|
|
334
|
+
Origin: #1584 #5 (v1.1.45 세션 — 커밋 위임서에 `develop @ 96ef8f85`로 적었으나 실측은 `f6d3f518`; #1572 머지 후 pull 미반영). R017 「메모리 TODO를 위임 전제로 쓸 때」의 **세션 내 축소판** — 스냅샷의 수명이 세션 간이 아니라 **턴 간**이라는 차이만 있다.
|
|
335
|
+
|
|
314
336
|
### Parallel Delegation — Sibling-Agent Disclosure
|
|
315
337
|
|
|
316
338
|
2개 이상의 서브에이전트를 같은 메시지에서 병렬 스폰할 때, 각 위임 프롬프트는 **형제 에이전트의 존재와 각자의 담당 범위**를 고지해야 한다. 서브에이전트는 격리된 컨텍스트에서 실행되어 형제를 인지할 수 없으므로, 고지가 없으면 `git status` 같은 **저장소 전역 공유 뷰**의 출력을 자기 변경분으로 오독하거나 경합 원인을 "외부 세션/프로세스"로 오귀속한다.
|
|
@@ -421,6 +443,8 @@ Before spawning any agent:
|
|
|
421
443
|
|
|
422
444
|
> **v2.1.221+**: background session이 작업 보존을 위해 commit·push를 수행하고, draft PR은 작업이 요구할 때만 열며, 사용자의 CLAUDE.md git 지침을 따르고, 항상 작업 위치를 보고하며 종료하도록 변경되었습니다. 이 저장소의 R010은 모든 git 작업을 mgr-gitnerd 위임으로 요구하므로 background session은 그 지침을 읽고 동작하지만, **R020 기준 ground-truth(`git log` / `gh pr view`) 실측 없이 background session의 커밋/푸시 완료 보고를 신뢰하지 않습니다**. 또한 v2.1.221에서 `/status`가 세션 종류(interactive / background attached / background unattended)를 표시하므로 무인 실행 여부를 결정론적으로 확인할 수 있습니다.
|
|
423
445
|
|
|
446
|
+
> **v2.1.232+**: interactive session의 **non-teammate 에이전트 스폰이 기본 background 실행**으로 바뀌었습니다(subagent forking 기본 활성화의 일부). 즉 Agent 도구 호출의 반환은 "작업 완료"가 아니라 **"백그라운드 착수"일 수 있으므로**, 오케스트레이터는 스폰 반환이나 완료 통지를 완료 근거로 삼지 않고 R020 ground-truth(`git status` / `grep` / 검증 스크립트)로 확인합니다 — 구버전에서는 동기 반환이 기본이라 "반환 = 완료"라는 암묵 전제가 대체로 성립했고, 그 전제가 이 버전부터 무너집니다. 위 v2.1.221 `/status` 표시와 v2.1.211(실행 중 agent 결과를 지어내지 않음)이 진단 보조 수단입니다. cross-ref R009(fork의 컨텍스트 상속), R018(Teams member는 non-teammate가 아니므로 이 변경 대상 밖).
|
|
447
|
+
|
|
424
448
|
## Agent Capability Pre-Check
|
|
425
449
|
|
|
426
450
|
Before delegating a task to a subagent, MUST verify the target agent's tool capabilities against the task requirements. Failure to pre-check causes round-trip waste (delegation → failure → re-delegation).
|
|
@@ -631,6 +655,8 @@ git 위임 에이전트는 pre-commit/pre-push 훅 차단을 **자체 판단으
|
|
|
631
655
|
|
|
632
656
|
> Origin: #1574 (v1.1.44 세션 — mgr-gitnerd가 `bun test` 11 fail로 인한 pre-commit 차단을 `--no-verify`로 자체 우회; 결과는 무해했으나 승인 없는 품질 게이트 우회는 절차 이탈). Cross-ref: R020 (Test-Skip Is Not Completion — 그린 빌드 회피 금지), R017 (커밋 전 검증 게이트).
|
|
633
657
|
|
|
658
|
+
> **v2.1.229+**: `/commit-push-pr`가 위험 플래그(`--force`, `--amend`, `--no-verify` 등)를 가진 git/gh 명령을 **더 이상 auto-approve하지 않습니다**. 플랫폼이 이 저장소의 위 조항(v1.1.45 신설)과 **독립적으로 같은 결론**에 도달한 사례입니다 — 즉 `--no-verify` 상시 금지는 이 저장소만의 보수적 관행이 아니라 플랫폼이 기본값으로 채택한 경계입니다. **구버전에서는 이 플래그들이 프롬프트 없이 통과했으므로, 과거 세션에서 `--no-verify` 커밋이 프롬프트 없이 성사된 사실은 승인의 증거가 아닙니다**(R020 "실행됨 ≠ 승인됨"). 플랫폼 프롬프트는 방어심층일 뿐 위 조항의 오케스트레이터 사전 승인 요구를 대체하지 않습니다.
|
|
659
|
+
|
|
634
660
|
<!-- ARCHIVED CC version note (historical):
|
|
635
661
|
> **v2.1.206+**: `/commit-push-pr`가 origin 외에 `remote.pushDefault`(또는 단일 remote)로의 git push도 auto-allow합니다. mgr-gitnerd git 위임 흐름 관련. `mode: "bypassPermissions"`는 모든 Agent tool 호출에 여전히 필수입니다.
|
|
636
662
|
-->
|
|
@@ -669,11 +695,11 @@ The skill's WORKFLOW is followed, but git EXECUTION is delegated to mgr-gitnerd
|
|
|
669
695
|
|
|
670
696
|
## Agent Teams (required when enabled)
|
|
671
697
|
|
|
672
|
-
|
|
698
|
+
Agent Teams is active only when `CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1` **AND** `TeamCreate` is present in the tool list (the env var alone is NOT sufficient; `SendMessage` alone is not evidence). When active, Agent Teams is required for qualifying tasks; when not, R009/R010 govern.
|
|
673
699
|
|
|
674
|
-
See **R018 (MUST-agent-teams.md)** for the complete decision matrix, self-check, team patterns, and lifecycle.
|
|
700
|
+
See **R018 (MUST-agent-teams.md)** for the Detection table, complete decision matrix, self-check, team patterns, and lifecycle.
|
|
675
701
|
|
|
676
|
-
**Quick rule
|
|
702
|
+
**Quick rule** (applies only when active): 3+ agents OR review cycle OR 2+ issues in same batch → use Agent Teams.
|
|
677
703
|
Using Agent tool when Agent Teams criteria are met needs correction per R018.
|
|
678
704
|
|
|
679
705
|
<!-- DETAIL: Announcement Format
|
|
@@ -108,6 +108,10 @@ Reference: #1320 (fix), #1321 (session 113 retrospective 찐빠 #1), `feedback_l
|
|
|
108
108
|
|
|
109
109
|
> **v2.1.224+**: **세션당 200 subagent spawn cap이 제거**되어 장기 세션이 신규 에이전트를 거부하지 않습니다(동시성 제한과 depth 제한은 유지). 위 표의 "Max instances 5 concurrent"는 **동시성** 제한이므로 그대로 유효합니다 — 제거된 것은 세션 누적 총량 cap입니다. `/fsd` 등 장기 무인 루프에서 후반 반복의 스폰 실패를 더 이상 누적 cap으로 진단하지 않습니다.
|
|
110
110
|
|
|
111
|
+
> **v2.1.232+**: subagent forking이 **기본 활성화**되어 `subagent_type: "fork"` 서브에이전트가 전체 대화와 prompt cache를 상속합니다. 위 표의 "Instance independence — Isolated context, no shared state"는 **fork에는 성립하지 않습니다** — fork는 격리된 병렬 인스턴스가 아니라 컨텍스트 사본이므로, 위 Detection Criteria의 독립성 전제로 병렬 배치를 설계할 때 fork를 일반 subagent와 동일하게 취급하지 않습니다(오케스트레이터 컨텍스트가 그대로 전달되므로 위임 프롬프트의 범위 서술이 유일한 경계가 아님). 구버전에서는 fork가 opt-in이라 이 상속이 예외 경로였습니다. 또한 interactive session의 **non-teammate 에이전트 스폰이 기본 background 실행**이므로 스폰 반환은 완료 신호가 아닙니다(R010/R020).
|
|
112
|
+
|
|
113
|
+
> **v2.1.229+**: workflow fan-out이 같은 prefix를 공유하는 sibling agent를 **stagger**해 후속 에이전트가 prompt prefix 캐시를 재사용합니다(`CLAUDE_CODE_WORKFLOW_PREFIX_STAGGER_MS=0`으로 비활성). 즉 동일 접두사 병렬 배치는 동시 발사가 아니라 **의도적 시차 실행**이며, 스폰 직후 일부 에이전트의 시작 지연을 아래 Adaptive Parallel Splitting의 stall 신호로 오판하지 않습니다 — 구버전에서는 각 형제가 접두사 비용을 중복 지불했습니다. 또한 CPU 제한 컨테이너에서 dynamic workflow가 호스트 코어 수를 쓰던 문제가 수정되어, 컨테이너 실행 시 실효 동시성이 위 표의 cap보다 낮을 수 있습니다.
|
|
114
|
+
|
|
111
115
|
> **Fable 5 long-lived subagent reuse (Origin: #1435)**: Fable 5는 long-lived subagent 재사용(단일 subagent가 여러 단계를 이어서 수행)에 강함 — 현행 R009 병렬 실행 원칙과 상충하지 않으며, Fable 5 실행 시 short-lived 병렬 다수 대신 long-lived 재사용도 유효한 선택지. 상세는 `guides/claude-code/16-fable5-prompting.md`.
|
|
112
116
|
|
|
113
117
|
## Adaptive Parallel Splitting
|
|
@@ -8,11 +8,13 @@
|
|
|
8
8
|
|------|-------|--------|
|
|
9
9
|
| 1: Always | Read, Glob, Grep, ToolSearch | Free use, read-only |
|
|
10
10
|
| 2: Default | Write, Edit, NotebookEdit | State changes explicitly, notify before modifying important files |
|
|
11
|
-
| 3: Context | Agent, Skill, EnterPlanMode, ExitPlanMode, EnterWorktree, ExitWorktree, LSP, Monitor, TodoWrite
|
|
11
|
+
| 3: Context | Agent, Skill, EnterPlanMode, ExitPlanMode, EnterWorktree, ExitWorktree, LSP, Monitor, TodoWrite†, AskUserQuestion, PushNotification | Context-dependent, no user approval needed |
|
|
12
12
|
| 4: Approval | Bash, PowerShell, WebFetch, WebSearch | Request user approval on first use |
|
|
13
|
-
| 5: Conditional | TeamCreate
|
|
13
|
+
| 5: Conditional | TeamCreate†, TeamDelete†, SendMessage, TaskCreate†, TaskGet†, TaskList†, TaskUpdate†, TaskStop, TaskOutput | Available when Agent Teams enabled |
|
|
14
14
|
| 6: MCP | ListMcpResourcesTool, ReadMcpResourceTool, CronCreate, CronDelete, CronList, RemoteTrigger | MCP/extension tools, available when servers configured |
|
|
15
15
|
|
|
16
|
+
> **†** 현행 모델의 기본 실행 환경에 **존재하지 않는다** — 아래 v2.1.233 노트 참조. 이 표는 **도구 카탈로그**이지 가용성 보증이 아니므로, 규칙이 특정 도구 호출을 의무화하기 전에 실측(도구 목록 / `ToolSearch`)으로 존재를 확인한다.
|
|
17
|
+
|
|
16
18
|
## File Access
|
|
17
19
|
|
|
18
20
|
| Operation | Allowed | Prohibited |
|
|
@@ -82,6 +84,36 @@ Use a `"*"` deny rule in `settings.json` to enforce a deny-by-default posture, t
|
|
|
82
84
|
|
|
83
85
|
> **v2.1.223/225+**: 두 건이 Tier-4 Bash 권한 검사와 세션 인증에 영향을 줍니다. (223) 조작된 명령이 **자기 일부를 권한 검사에서 숨기던** 결함이 수정되었습니다 — v2.1.221 zsh `[[ ]]` 우회 수정의 연장선이며, 검사 대상 문자열과 실행 문자열이 다를 수 있었다는 뜻입니다(표시 측 결함은 R001). (225) 일시적 401이 장수명 `CLAUDE_CODE_OAUTH_TOKEN`을 저장된 단수명 토큰으로 교체해 headless 세션을 재시작 전까지 망가뜨리던 결함이 수정되었습니다 — 구버전 무인 실행에서 401 이후의 연쇄 인증 실패는 토큰 설정 오류가 아니라 이 교체 버그일 수 있으므로 진단 시 구분합니다. agent definition의 `bypassPermissions`가 org 정책을 무시하던 공백(223)은 R010 "Universal bypassPermissions"가 canonical.
|
|
84
86
|
|
|
87
|
+
> **v2.1.232/233+**: 232가 권한 검사 우회 3건을 수정했으나 **233이 그중 2건을 롤백**했습니다. 어느 것이 현행인지 버전별로 구분합니다.
|
|
88
|
+
>
|
|
89
|
+
> 1. **233 현재 유효 (232 수정 유지)** — (a) PowerShell에서 변수 기록 파라미터가 `$PSDefaultParameterValues`를 조용히 덮어써 이후 명령의 파일 접근을 리다이렉트할 수 있던 우회가 수정되었습니다. 또한 중첩 git 저장소가 부모 디렉토리의 trust를 상속하던 문제가 수정되어 저장소마다 별도 trust 확인이 필요하고, `sandbox.ripgrep`은 user/managed/`--settings`에서만 적용되며 **project settings로는 override 불가**입니다(위 v2.1.214 allow/deny 스코프 비대칭과 같은 계열의 축소 — repo-local 설정으로 켤 수 없는 항목이 늘었습니다). 233은 추가로 **Windows NT `\??\` device prefix 경로가 UNC 경로 검증을 우회**해 NTLM 자격증명 유출 벡터가 되던 결함을 수정했습니다 — 같은 경로를 여러 표기로 쓸 수 있다는 v2.1.221/223 "검사 대상 문자열 ≠ 실행 문자열" 계열의 **경로 표기** 각도입니다.
|
|
90
|
+
> 2. **233에서 롤백됨 — 현재 권한 검사되지 않음** — (b) Windows Git Bash가 경로 검증에는 일반 파일로 보이는 Cygwin-style symlink를 따라가던 우회 수정, (c) Bash 입력 리다이렉션(`< file`)을 인자 표기와 동일하게 권한 검사하던 변경. 두 건 모두 232에서 도입됐다가 233에서 되돌려졌습니다(CHANGELOG v2.1.233: "Reverted the 2.1.232 Bash permission changes for Cygwin-style symlinks on Windows and for input redirections (`< file`); a narrower version will return in a later release"). **이 두 경로는 현행 233에서 권한 검사를 거치지 않으므로, 검사된다고 가정하고 경로 스코프 규칙을 설계하면 우회됩니다.**
|
|
91
|
+
> 3. **재도입 예정** — "a narrower version will return in a later release"이므로 좁힌 형태로 돌아옵니다. 재도입 시 적용 범위가 232 원본과 다를 수 있으므로 그때 다시 확인합니다.
|
|
92
|
+
>
|
|
93
|
+
> **`< file` 회고적 함의(버전 무관 유지)**: `< file`은 232 한 릴리즈를 제외하면 경로 스코프 규칙을 우회해 왔고 233에서 다시 그 상태이므로, **프롬프트 없이 읽힌 사실을 allow 규칙의 증거로 삼지 않습니다**. 위 v2.1.221/223 "검사 대상 문자열 ≠ 실행 문자열" 계열의 연장선입니다.
|
|
94
|
+
>
|
|
95
|
+
> **일반 교훈**: 단일 릴리즈의 플랫폼 권한 개선은 롤백될 수 있으므로 **항구적 보호막으로 간주하지 않습니다**. 스코프 규칙은 개선 이전 상태를 기준으로 설계하고 플랫폼 개선은 defense-in-depth로만 취급합니다(`feedback_platform_claim_staleness` 계열 — 플랫폼 주장의 시효성).
|
|
96
|
+
|
|
97
|
+
### Todo/Task 도구 기본 제거 (v2.1.233+) — 위 표의 †
|
|
98
|
+
|
|
99
|
+
CHANGELOG v2.1.233 원문: *"Todo/task-tracking tools (TaskCreate/Get/Update/List, TodoWrite) are no longer available on Opus 4.8, Sonnet 5, Fable 5, Mythos 5, and newer models; set `CLAUDE_CODE_ENABLE_TODO_TOOLS=1` to bring them back"*. 이 저장소 에이전트 **49개 중 46개**(`claude-sonnet-5` 41 + `claude-opus-5` 5)가 대상 모델이므로 실행 환경의 기본값은 **부재**다(잔여 3개는 `haiku`).
|
|
100
|
+
|
|
101
|
+
**실측 (2026-08-15 — `claude -p --output-format stream-json` init 이벤트의 `tools` 배열, `claude-opus-5[1m]`/`claude-sonnet-5` 3회 동일 결과)**:
|
|
102
|
+
|
|
103
|
+
| 상태 | 도구 |
|
|
104
|
+
|------|------|
|
|
105
|
+
| 미등록 (CHANGELOG 명시) | `TodoWrite`, `TaskCreate`, `TaskGet`, `TaskList`, `TaskUpdate` |
|
|
106
|
+
| 미등록 (CHANGELOG 미명시 — 별도 게이팅) | `TeamCreate`, `TeamDelete` |
|
|
107
|
+
| 잔존 | `TaskStop`, `TaskOutput`, `SendMessage` |
|
|
108
|
+
|
|
109
|
+
바이너리(`2.1.233`) 게이트 함수 실측도 이를 뒷받침한다 — 게이트 대상 도구 배열은 **정확히 5개**(CHANGELOG 명시 5종)이며 `TaskOutput`은 포함되지 않는다.
|
|
110
|
+
|
|
111
|
+
`TeamCreate` 부재는 CHANGELOG가 설명하지 않는 별개 사실이며, **Agent Teams 생성 경로 자체가 없다**는 뜻이다 — 환경변수 `CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1`이 설정돼 있어도 R018은 이 환경에서 비활성이다(R018 Detection). 규칙은 **존재하지 않는 도구의 호출을 의무화하지 않는다** — 도구 의존 의무를 쓸 때는 부재 시 대체 규약을 함께 규정한다(R018 Member TaskUpdate Discipline이 그 예).
|
|
112
|
+
|
|
113
|
+
`CLAUDE_CODE_ENABLE_TODO_TOOLS=1`은 복구 수단이나 **환경 설정 사안**이므로 규칙이 그 설정을 전제하지 않는다. 공식 settings 문서(`code.claude.com/docs/en/settings`)에는 2026-08-15 기준 미수록 — 현재 근거는 CHANGELOG 원문 + 위 실측이다.
|
|
114
|
+
|
|
115
|
+
Origin: #1582. Cross-ref: R018(Member TaskUpdate Discipline 대체 규약), R020("도구가 있다"는 가정도 실측 대상).
|
|
116
|
+
|
|
85
117
|
## Agent Tool Permission Mode
|
|
86
118
|
|
|
87
119
|
> Canonical source: R010 (MUST-orchestrator-coordination.md) "Universal bypassPermissions" owns the full requirement, rationale, self-check, and version history. Core rule: always pass `mode: "bypassPermissions"` explicitly on every Agent tool call — the Agent tool's default `mode` (`acceptEdits`) overrides agent frontmatter `permissionMode` and causes prompts during unattended execution. Skills that spawn agents MUST include this in their Agent tool call instructions. See R010 for details.
|
|
@@ -123,6 +123,8 @@ Cross-reference: R010 Subagent Scope-Creep STOP Protocol, R002 (permission tiers
|
|
|
123
123
|
> **v2.1.205+**: auto mode가 session transcript 파일 변조(tampering)를 차단하는 규칙이 추가되었습니다 — transcript 의존 스킬(homework/episodic-memory) 무결성 보호. 또한 Windows worktree 제거가 NTFS junction/symlink 존재 시 worktree 밖 파일을 삭제하던 문제가 수정되었습니다.
|
|
124
124
|
-->
|
|
125
125
|
|
|
126
|
+
> **v2.1.232+**: 시크릿·격리 보호가 확장되었습니다 — GitLab 토큰 계열(`glrt-`/`gloas-`/`glptt-`/`glagent-`/`glimt-`/`glsoat-`/`glcbt-`/`glft-`/`glffct-`) redaction 추가와 routable `glpat-`/`gldt-` 전체 redaction, `glab` CLI config가 `gh`와 동일한 샌드박스·자격증명 경로 보호를 받습니다. 또한 공유 `/tmp`의 cross-session messaging 소켓 디렉토리가 사전에 심어진 symlink나 타 사용자 소유 디렉토리를 **사용 대신 거부**하도록, Linux 파일시스템 샌드박스가 protected-path 우회에 대해 하드닝되었습니다. **구버전에서 GitLab 토큰은 redaction 대상이 아니었으므로 트랜스크립트·에이전트 출력에 원문 노출이 가능했습니다** — 과거 세션 로그를 공유하기 전 이 점을 전제합니다. 위 표의 "자격증명 저장소 덤프 금지"는 플랫폼 redaction과 무관하게 유지합니다(redaction은 최후 방어선이지 1차 방어선이 아님).
|
|
127
|
+
|
|
126
128
|
## Required Before Destructive Operations
|
|
127
129
|
|
|
128
130
|
Verify target, assess impact scope, check recoverability, get user approval.
|
|
@@ -176,10 +176,31 @@ Origin: #1457 (Session 128 회고 찐빠 #1) — 오케스트레이터가 stale
|
|
|
176
176
|
|
|
177
177
|
Origin: #1574 (v1.1.44 세션 — mgr-sauron 브리핑의 "선재 항목" 4건 중 3건이 부정확: 이미 해소된 항목, 의도적 차이를 결함으로 오인, 규모 과대). **완화 요인**: 프롬프트에 "그대로 믿지 말고 직접 확인하라"를 명시해 3건 전부 에이전트가 정정 — #1443의 "실측값 기준으로 동기화하라" 방어선과 동일 효과. Cross-ref: R011(메모리 신뢰도·Temporal Decay), R020(Diagnostic Hypothesis Verification).
|
|
178
178
|
|
|
179
|
+
## CC 버전 노트 반영 전 — 스코프 상한 이후 릴리즈 확인 (Origin: #1584 #1)
|
|
180
|
+
|
|
181
|
+
CC 버전 노트를 룰에 반영하기 **전**, `npm view @anthropic-ai/claude-code version` + `claude --version`을 실측해 **스코프 상한 버전 이후의 릴리즈 존재 여부**를 확인한다. 있으면 그 CHANGELOG를 먼저 읽어 **롤백·후속 변경**을 파악한 뒤 반영한다. 이슈 생성과 작업 사이의 간극 동안 플랫폼이 스스로 뒤집을 수 있으므로 — **이슈 번호는 최신 릴리즈를 의미하지 않는다**.
|
|
182
|
+
|
|
183
|
+
| Anti-pattern | Required |
|
|
184
|
+
|--------------|----------|
|
|
185
|
+
| 이슈에 적힌 버전(스코프 상한)까지만 조사해 버전 노트를 반영 | 반영 전 `npm view`+`claude --version` 실측 → 상한 이후 릴리즈 CHANGELOG에서 롤백·후속 변경 확인 |
|
|
186
|
+
| 롤백된 개선을 현행 보호막으로 기재 | 롤백 여부를 확인하고, 롤백된 항목은 "현재 미적용"으로 명시 |
|
|
187
|
+
|
|
188
|
+
Origin: #1584 #1 (v1.1.46 세션) — 이슈 생성(8/11~14)과 작업(8/15) 사이 5일 간극 동안 v2.1.233이 v2.1.232 Bash 권한 변경 2건을 롤백했으나 이를 모른 채 배치해 mgr-sauron이 **FAIL로 차단**(당시 저장소 전역 `2.1.233` 언급 0건). Cross-ref: 위 Pre-Release Target Version Ground-Truth Gate(동일 "스냅샷 ≠ ground-truth" 원리의 버전 각도), R020(Diagnostic Hypothesis Verification), R016(버전노트 보존정책 — *어느* 노트를 남길지는 R016, *반영 전 실측*은 이 게이트).
|
|
189
|
+
|
|
179
190
|
## Post-Gate Scope-Expansion Re-Run (Origin: #1433 #2)
|
|
180
191
|
|
|
181
192
|
R017 게이트(mgr-sauron) 통과 선언 후 신규 결함 발견 등으로 스코프가 확장되면(추가 파일 편집), 커밋 전 게이트를 **최종 상태에서 재실행**한다. 게이트 통과 시점 이후의 변경은 형식적으로 미검증이므로, 확장분 미검증 커밋은 R017이 최종 산출물을 커버하지 못하게 만든다.
|
|
182
193
|
|
|
194
|
+
### Advisory 제시 시점 — "같은 커밋 포함 권고"는 판정과 함께 (Origin: #1584 #4)
|
|
195
|
+
|
|
196
|
+
위 재실행 비용을 줄이는 방법은 권고를 **판정 시점에** 받는 것이다. mgr-sauron 위임 프롬프트에 "같은 커밋에 포함 권고" 성격의 advisory는 **PASS/FAIL 판정과 같은 응답에 제시**하도록 명시한다(또는 게이트 실행 전 예비 조회로 미리 수집). 판정 후 도착한 권고를 반영하면 그 자체가 스코프 확장이 되어 게이트 전량 재실행 + 위키 재동기화가 강제된다.
|
|
197
|
+
|
|
198
|
+
| Anti-pattern | Required |
|
|
199
|
+
|--------------|----------|
|
|
200
|
+
| 게이트 PASS 후 도착한 포함 권고를 반영해 스코프 확장 | 위임 프롬프트에 "포함 권고 advisory는 판정과 함께 제시" 명시; 판정 후 도착분은 다음 릴리즈 이월을 우선 검토 |
|
|
201
|
+
|
|
202
|
+
Origin: #1584 #4 (v1.1.45 세션) — R021 자기 서술 staleness 반영을 R017 통과 **후** 수행해 위키 재동기화 1회 + 게이트 전량 재실행 발생. 포함 판단 자체는 옳았고 **시점**이 결함이었다.
|
|
203
|
+
|
|
183
204
|
## Quick Verification Commands — agent/skill/guide/wiki counts via ls/find/wc. See commands via Read tool.
|
|
184
205
|
|
|
185
206
|
<!-- DETAIL: Quick Verification Commands
|
|
@@ -482,4 +482,8 @@ References: #1226 (item 3), #1227.
|
|
|
482
482
|
- Memory write failure is **non-blocking**: MUST NOT prevent session from ending
|
|
483
483
|
- If sys-memory-keeper fails to write MEMORY.md: log warning, confirm to user anyway
|
|
484
484
|
|
|
485
|
+
> **v2.1.228+**: **session cleanup이 프로젝트 memory 폴더 내부 내용을 삭제하던 결함**이 수정되었습니다. 구버전에서는 MEMORY.md·archive 파일이 세션 정리 단계에서 소실될 수 있었으므로, 메모리 누락을 위 Failure Policy의 쓰기 실패로만 진단하지 않습니다 — 쓰기는 성공했으나 정리에 삭제된 경우일 수 있습니다. 위 Memory Scopes 표대로 `project` 스코프(`.claude/agent-memory/`)는 git tracked라 복구 가능하지만 `user`/`local` 스코프는 복구 수단이 없습니다.
|
|
486
|
+
|
|
487
|
+
> **v2.1.232+**: Cowork 세션이 **user-scope 메모리 파일의 외부 @-import를 인라인하지 않습니다**. 즉 `~/.claude/agent-memory/`의 MEMORY.md가 @-import로 외부 파일을 끌어오는 구조라면 세션 종류에 따라 그 내용이 컨텍스트에 없을 수 있으므로, 항상 로드되어야 하는 내용은 import 참조가 아니라 **MEMORY.md 본문**에 둡니다(위 200줄 예산 내 Hot/Warm 배치 원칙과 정합).
|
|
488
|
+
|
|
485
489
|
<!-- RETIRED (은퇴 릴리즈 v1.1.45, 보존 기준 v2.1.212 미만): > **v2.1.210+**: MEMORY.md 인덱스가 read limit을 초과하게 만드는 memory write는 이제 silent truncation 대신 명시적 오류를 반환합니다. write 실패는 여전히 non-blocking이지만, 오류 수신 시 log-warning으로 끝내지 말고 예산 초과 처리(Attention-Weight Tiering — Cold 항목 archive 이동)로 축소 후 재시도합니다 — 이전의 silent truncation을 가정하고 oversize write를 던지면 업데이트가 반영되지 않습니다. -->
|
|
@@ -15,6 +15,8 @@
|
|
|
15
15
|
| **3: Expensive LLM** | sonnet/opus skills (`deep-verify`, `adversarial-review`, `multi-model-verification`, `evaluator-optimizer`) | $$$ | 1-5분 | Pre-commit, PR review |
|
|
16
16
|
| **4: Human** | maintainer review | time | hours-days | Final gate, contested decisions |
|
|
17
17
|
|
|
18
|
+
> **v2.1.232+**: `/code-review`가 high·xhigh·max effort에서도 **background agent로 실행**됩니다(다른 레벨과 동일). 즉 Tier 3 검증 호출의 반환은 착수 신호이지 검증 결과가 아니므로, 다음 tier 진행이나 통과 판정 전에 background agent의 실제 완료와 결과를 실측합니다 — 구버전에서는 고effort 레벨만 전경 실행이라 "반환 = 결과"가 성립했고, 그 전제로 ladder를 진행하면 미완료 검증을 통과로 오판합니다(R020 "attempt ≠ outcome", cross-ref R010 non-teammate background 기본 실행).
|
|
19
|
+
|
|
18
20
|
## Shift-left 원칙
|
|
19
21
|
|
|
20
22
|
결정론적 단계가 잡을 수 있는 문제는 LLM에 보내지 않는다. LLM 검증은 ambiguous/semantic 문제에 집중한다.
|
|
@@ -61,7 +61,7 @@ Routes data engineering tasks to appropriate DE expert agents. This skill contai
|
|
|
61
61
|
Before routing via Agent tool, evaluate in this order:
|
|
62
62
|
|
|
63
63
|
### Step 1: Agent Teams Eligibility (R018)
|
|
64
|
-
Check if Agent Teams is available
|
|
64
|
+
Check if Agent Teams is available — `CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1` **AND** `TeamCreate` present in the tool list. The env var alone is NOT sufficient, and `SendMessage` presence is not evidence of Teams (see R018 Detection).
|
|
65
65
|
|
|
66
66
|
| Scenario | Preferred |
|
|
67
67
|
|----------|-----------|
|
|
@@ -70,6 +70,8 @@ Check if Agent Teams is available (`CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1` or T
|
|
|
70
70
|
| Cross-tool data quality analysis | Agent Teams |
|
|
71
71
|
| Quick DAG/model validation | Agent Tool |
|
|
72
72
|
|
|
73
|
+
When Detection resolves to **No**, skip this step — route via the Agent tool under R009/R010.
|
|
74
|
+
|
|
73
75
|
### Step 2: Expert Selection
|
|
74
76
|
Route to appropriate DE expert based on tool/framework detection.
|
|
75
77
|
|
|
@@ -99,7 +99,7 @@ This directive is preserved inline because Agent-tool prompt synthesis can drop
|
|
|
99
99
|
Before selecting an expert agent, evaluate in this order:
|
|
100
100
|
|
|
101
101
|
### Step 1: Agent Teams Eligibility (R018)
|
|
102
|
-
Check if Agent Teams is available
|
|
102
|
+
Check if Agent Teams is available — `CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1` **AND** `TeamCreate` present in the tool list. The env var alone is NOT sufficient, and `SendMessage` presence is not evidence of Teams (see R018 Detection).
|
|
103
103
|
|
|
104
104
|
| Scenario | Preferred |
|
|
105
105
|
|----------|-----------|
|
|
@@ -109,6 +109,8 @@ Check if Agent Teams is available (`CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1` or T
|
|
|
109
109
|
| Cross-layer debugging (FE + BE + DB) | Agent Teams |
|
|
110
110
|
| Simple file search/validation | Task Tool |
|
|
111
111
|
|
|
112
|
+
When Detection resolves to **No**, skip this step — route via the Agent tool under R009/R010.
|
|
113
|
+
|
|
112
114
|
### Step 2: Expert Agent Selection
|
|
113
115
|
Route to appropriate language/framework expert based on file extension and keyword mapping.
|
|
114
116
|
|
|
@@ -33,8 +33,8 @@ Inspired by Pi Coding Agent Workflow Extension's multi-model verification patter
|
|
|
33
33
|
## Workflow
|
|
34
34
|
|
|
35
35
|
### Prerequisites
|
|
36
|
-
- Agent Teams
|
|
37
|
-
-
|
|
36
|
+
- None. This skill runs fully without Agent Teams — the three reviewers spawn as parallel Agent tool calls (see "Agent Tool Fallback" below).
|
|
37
|
+
- Agent Teams mode is used only when available: `CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1` **AND** `TeamCreate` present in the tool list. The env var alone is NOT sufficient, and `SendMessage` presence is not evidence of Teams (see R018 Detection).
|
|
38
38
|
|
|
39
39
|
### Execution Flow
|
|
40
40
|
|
package/templates/CLAUDE.md
CHANGED
|
@@ -184,7 +184,7 @@ oh-my-customcode는 소프트웨어 컴파일과 동일한 구조를 따릅니
|
|
|
184
184
|
|
|
185
185
|
## Agent Teams (MUST when enabled)
|
|
186
186
|
|
|
187
|
-
|
|
187
|
+
Agent Teams는 `CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1` **그리고** `TeamCreate` 도구가 도구 목록에 존재할 때만 활성입니다. env 변수는 의도의 표현일 뿐 기능의 가용성이 아닙니다 — 현행 환경(CC v2.1.233+)에서 `TeamCreate`는 도구 목록에 **미등록**(실측)이므로 R018은 비활성(dormant)이며 R009/R010이 지배합니다.
|
|
188
188
|
|
|
189
189
|
| 기능 | 서브에이전트 (기본) | Agent Teams |
|
|
190
190
|
|------|---------------------|-------------|
|
|
@@ -193,8 +193,8 @@ Claude Code의 Agent Teams 기능이 활성화되어 있으면 (`CLAUDE_CODE_EXP
|
|
|
193
193
|
| 적합한 작업 | 집중된 작업 | 리서치, 리뷰, 디버깅 |
|
|
194
194
|
| 토큰 비용 | 낮음 | 높음 |
|
|
195
195
|
|
|
196
|
-
|
|
197
|
-
결정 매트릭스는 R018 (MUST-agent-teams.md)
|
|
196
|
+
**활성 판정이 Yes일 때, 적격한 협업 작업에 Agent Teams를 반드시 사용해야 합니다 (R018 MUST).**
|
|
197
|
+
판정표와 결정 매트릭스는 R018 (MUST-agent-teams.md) `## Detection`을 참조하세요.
|
|
198
198
|
하이브리드 패턴 (Claude + Codex, 동적 생성 + Teams)이 지원됩니다.
|
|
199
199
|
단순/비용 민감 작업에는 Task tool + 라우팅 스킬이 폴백으로 유지됩니다.
|
|
200
200
|
|
package/templates/CLAUDE.md.en
CHANGED
|
@@ -178,7 +178,7 @@ This is the core oh-my-customcode philosophy: **"No expert? CREATE one, connect
|
|
|
178
178
|
|
|
179
179
|
## Agent Teams (MUST when enabled)
|
|
180
180
|
|
|
181
|
-
|
|
181
|
+
Agent Teams is active only when `CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1` **AND** `TeamCreate` is present in the tool list. The env var expresses intent, not availability — in the current runtime (CC v2.1.233+) `TeamCreate` is **absent** from the tool list (measured), so R018 is dormant and R009/R010 govern.
|
|
182
182
|
|
|
183
183
|
| Feature | Subagents (Default) | Agent Teams |
|
|
184
184
|
|---------|---------------------|-------------|
|
|
@@ -187,8 +187,8 @@ When Claude Code's Agent Teams feature is enabled (`CLAUDE_CODE_EXPERIMENTAL_AGE
|
|
|
187
187
|
| Best for | Focused tasks | Research, review, debugging |
|
|
188
188
|
| Token cost | Lower | Higher |
|
|
189
189
|
|
|
190
|
-
**When
|
|
191
|
-
See R018 (MUST-agent-teams.md) for the decision matrix.
|
|
190
|
+
**When Detection resolves to Yes, Agent Teams is MANDATORY for qualifying collaborative tasks (R018 MUST).**
|
|
191
|
+
See R018 (MUST-agent-teams.md) `## Detection` for the detection table and decision matrix.
|
|
192
192
|
Hybrid patterns (Claude + Codex, Dynamic Creation + Teams) are supported.
|
|
193
193
|
Task tool + routing skills remain the fallback for simple/cost-sensitive tasks.
|
|
194
194
|
|
package/templates/CLAUDE.md.ko
CHANGED
|
@@ -178,7 +178,7 @@ project/
|
|
|
178
178
|
|
|
179
179
|
## Agent Teams (MUST when enabled)
|
|
180
180
|
|
|
181
|
-
|
|
181
|
+
Agent Teams는 `CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1` **그리고** `TeamCreate` 도구가 도구 목록에 존재할 때만 활성입니다. env 변수는 의도의 표현일 뿐 기능의 가용성이 아닙니다 — 현행 환경(CC v2.1.233+)에서 `TeamCreate`는 도구 목록에 **미등록**(실측)이므로 R018은 비활성(dormant)이며 R009/R010이 지배합니다.
|
|
182
182
|
|
|
183
183
|
| 기능 | 서브에이전트 (기본) | Agent Teams |
|
|
184
184
|
|------|---------------------|-------------|
|
|
@@ -187,8 +187,8 @@ Claude Code의 Agent Teams 기능이 활성화되어 있으면 (`CLAUDE_CODE_EXP
|
|
|
187
187
|
| 적합한 작업 | 집중된 작업 | 리서치, 리뷰, 디버깅 |
|
|
188
188
|
| 토큰 비용 | 낮음 | 높음 |
|
|
189
189
|
|
|
190
|
-
|
|
191
|
-
결정 매트릭스는 R018 (MUST-agent-teams.md)
|
|
190
|
+
**활성 판정이 Yes일 때, 적격한 협업 작업에 Agent Teams를 반드시 사용해야 합니다 (R018 MUST).**
|
|
191
|
+
판정표와 결정 매트릭스는 R018 (MUST-agent-teams.md) `## Detection`을 참조하세요.
|
|
192
192
|
하이브리드 패턴 (Claude + Codex, 동적 생성 + Teams)이 지원됩니다.
|
|
193
193
|
단순/비용 민감 작업에는 Task tool + 라우팅 스킬이 폴백으로 유지됩니다.
|
|
194
194
|
|
package/templates/manifest.json
CHANGED