fix: export-cc で facets/ のディレクトリ構造を保持するよう修正

ファセットを ~/.claude/skills/takt/personas/ 等に展開していたが、
ビルトインのピースYAMLで ../facets/personas/ という相対パスを
使用しているため、facets/ ディレクトリを維持する必要があった。
deploySkill.ts、SKILL.md、engine.md のパス例も合わせて修正。
This commit is contained in:
nrslib 2026-03-04 01:30:11 +09:00
parent 8aa79d909c
commit 8dcb23b147
4 changed files with 23 additions and 21 deletions

View File

@ -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 で全て読み込む。読み込んだ内容はチームメイトへのプロンプト構築に使う。

View File

@ -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`
## プロンプト構築

View File

@ -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);
});
});

View File

@ -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<void> {
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<void> {
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) {