From 8dcb23b1479f124f2b857fca45bc1a9cfcbd2865 Mon Sep 17 00:00:00 2001 From: nrslib <38722970+nrslib@users.noreply.github.com> Date: Wed, 4 Mar 2026 01:30:11 +0900 Subject: [PATCH] =?UTF-8?q?fix:=20export-cc=20=E3=81=A7=20facets/=20?= =?UTF-8?q?=E3=81=AE=E3=83=87=E3=82=A3=E3=83=AC=E3=82=AF=E3=83=88=E3=83=AA?= =?UTF-8?q?=E6=A7=8B=E9=80=A0=E3=82=92=E4=BF=9D=E6=8C=81=E3=81=99=E3=82=8B?= =?UTF-8?q?=E3=82=88=E3=81=86=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ファセットを ~/.claude/skills/takt/personas/ 等に展開していたが、 ビルトインのピースYAMLで ../facets/personas/ という相対パスを 使用しているため、facets/ ディレクトリを維持する必要があった。 deploySkill.ts、SKILL.md、engine.md のパス例も合わせて修正。 --- builtins/skill/SKILL.md | 4 ++-- builtins/skill/references/engine.md | 6 +++--- src/__tests__/deploySkill.test.ts | 10 +++++----- src/features/config/deploySkill.ts | 24 +++++++++++++----------- 4 files changed, 23 insertions(+), 21 deletions(-) diff --git a/builtins/skill/SKILL.md b/builtins/skill/SKILL.md index 0072aad..d7317cb 100644 --- a/builtins/skill/SKILL.md +++ b/builtins/skill/SKILL.md @@ -91,8 +91,8 @@ YAMLから以下を抽出する(→ references/yaml-schema.md 参照): ピースYAMLのセクションマップ(`personas:`, `policies:`, `instructions:`, `output_contracts:`, `knowledge:`)から全ファイルパスを収集する。 パスは **ピースYAMLファイルのディレクトリからの相対パス** で解決する。 -例: ピースが `~/.claude/skills/takt/pieces/default.yaml` にあり、`personas:` に `coder: ../personas/coder.md` がある場合 -→ 絶対パスは `~/.claude/skills/takt/personas/coder.md` +例: ピースが `~/.claude/skills/takt/pieces/default.yaml` にあり、`personas:` に `coder: ../facets/personas/coder.md` がある場合 +→ 絶対パスは `~/.claude/skills/takt/facets/personas/coder.md` 重複を除いて Read で全て読み込む。読み込んだ内容はチームメイトへのプロンプト構築に使う。 diff --git a/builtins/skill/references/engine.md b/builtins/skill/references/engine.md index 1782aa1..ca1a8ae 100644 --- a/builtins/skill/references/engine.md +++ b/builtins/skill/references/engine.md @@ -67,9 +67,9 @@ Task tool: 3. movement の `persona: coder` → `personas:` セクションの `coder` キー → ファイルパス → Read で内容を取得 例: ピースが `~/.claude/skills/takt/pieces/default.yaml` の場合 -- `personas.coder: ../personas/coder.md` → `~/.claude/skills/takt/personas/coder.md` -- `policies.coding: ../policies/coding.md` → `~/.claude/skills/takt/policies/coding.md` -- `instructions.plan: ../instructions/plan.md` → `~/.claude/skills/takt/instructions/plan.md` +- `personas.coder: ../facets/personas/coder.md` → `~/.claude/skills/takt/facets/personas/coder.md` +- `policies.coding: ../facets/policies/coding.md` → `~/.claude/skills/takt/facets/policies/coding.md` +- `instructions.plan: ../facets/instructions/plan.md` → `~/.claude/skills/takt/facets/instructions/plan.md` ## プロンプト構築 diff --git a/src/__tests__/deploySkill.test.ts b/src/__tests__/deploySkill.test.ts index 2b7354a..c69a484 100644 --- a/src/__tests__/deploySkill.test.ts +++ b/src/__tests__/deploySkill.test.ts @@ -132,11 +132,11 @@ describe('deploySkill', () => { // Verify each resource directory is copied expect(existsSync(join(skillDir, 'pieces', 'default.yaml'))).toBe(true); - expect(existsSync(join(skillDir, 'personas', 'coder.md'))).toBe(true); - expect(existsSync(join(skillDir, 'policies', 'coding.md'))).toBe(true); - expect(existsSync(join(skillDir, 'instructions', 'init.md'))).toBe(true); - expect(existsSync(join(skillDir, 'knowledge', 'patterns.md'))).toBe(true); - expect(existsSync(join(skillDir, 'output-contracts', 'summary.md'))).toBe(true); + expect(existsSync(join(skillDir, 'facets', 'personas', 'coder.md'))).toBe(true); + expect(existsSync(join(skillDir, 'facets', 'policies', 'coding.md'))).toBe(true); + expect(existsSync(join(skillDir, 'facets', 'instructions', 'init.md'))).toBe(true); + expect(existsSync(join(skillDir, 'facets', 'knowledge', 'patterns.md'))).toBe(true); + expect(existsSync(join(skillDir, 'facets', 'output-contracts', 'summary.md'))).toBe(true); expect(existsSync(join(skillDir, 'templates', 'task.md'))).toBe(true); }); }); diff --git a/src/features/config/deploySkill.ts b/src/features/config/deploySkill.ts index 4096751..f52bc97 100644 --- a/src/features/config/deploySkill.ts +++ b/src/features/config/deploySkill.ts @@ -39,8 +39,6 @@ const DIRECT_DIRS = ['pieces', 'templates'] as const; /** Facet directories under builtins/{lang}/facets/ */ const FACET_DIRS = ['personas', 'policies', 'instructions', 'knowledge', 'output-contracts'] as const; -/** All resource directory names (used for summary filtering) */ -const RESOURCE_DIRS = [...DIRECT_DIRS, ...FACET_DIRS] as const; /** * Deploy takt skill to Claude Code (~/.claude/). @@ -95,11 +93,12 @@ export async function deploySkill(): Promise { copyDirRecursive(srcDir, destDir, copiedFiles); } - // 4. Deploy facet directories from builtins/{lang}/facets/ + // 4. Deploy facet directories from builtins/{lang}/facets/ (preserving facets/ structure) + const facetsDestDir = join(skillDir, 'facets'); + cleanDir(facetsDestDir); for (const dir of FACET_DIRS) { const srcDir = join(langResourcesDir, 'facets', dir); - const destDir = join(skillDir, dir); - cleanDir(destDir); + const destDir = join(facetsDestDir, dir); copyDirRecursive(srcDir, destDir, copiedFiles); } @@ -114,14 +113,17 @@ export async function deploySkill(): Promise { const skillFiles = copiedFiles.filter( (f) => f.startsWith(skillDir) && - !RESOURCE_DIRS.some((dir) => f.includes(`/${dir}/`)), + !f.includes('/pieces/') && + !f.includes('/facets/') && + !f.includes('/templates/') && + !f.includes('/references/'), ); const pieceFiles = copiedFiles.filter((f) => f.includes('/pieces/')); - const personaFiles = copiedFiles.filter((f) => f.includes('/personas/')); - const policyFiles = copiedFiles.filter((f) => f.includes('/policies/')); - const instructionFiles = copiedFiles.filter((f) => f.includes('/instructions/')); - const knowledgeFiles = copiedFiles.filter((f) => f.includes('/knowledge/')); - const outputContractFiles = copiedFiles.filter((f) => f.includes('/output-contracts/')); + const personaFiles = copiedFiles.filter((f) => f.includes('/facets/personas/')); + const policyFiles = copiedFiles.filter((f) => f.includes('/facets/policies/')); + const instructionFiles = copiedFiles.filter((f) => f.includes('/facets/instructions/')); + const knowledgeFiles = copiedFiles.filter((f) => f.includes('/facets/knowledge/')); + const outputContractFiles = copiedFiles.filter((f) => f.includes('/facets/output-contracts/')); const templateFiles = copiedFiles.filter((f) => f.includes('/templates/')); if (skillFiles.length > 0) {