fix: export-cc で facets/ のディレクトリ構造を保持するよう修正
ファセットを ~/.claude/skills/takt/personas/ 等に展開していたが、 ビルトインのピースYAMLで ../facets/personas/ という相対パスを 使用しているため、facets/ ディレクトリを維持する必要があった。 deploySkill.ts、SKILL.md、engine.md のパス例も合わせて修正。
This commit is contained in:
parent
8aa79d909c
commit
8dcb23b147
@ -91,8 +91,8 @@ YAMLから以下を抽出する(→ references/yaml-schema.md 参照):
|
|||||||
ピースYAMLのセクションマップ(`personas:`, `policies:`, `instructions:`, `output_contracts:`, `knowledge:`)から全ファイルパスを収集する。
|
ピースYAMLのセクションマップ(`personas:`, `policies:`, `instructions:`, `output_contracts:`, `knowledge:`)から全ファイルパスを収集する。
|
||||||
パスは **ピースYAMLファイルのディレクトリからの相対パス** で解決する。
|
パスは **ピースYAMLファイルのディレクトリからの相対パス** で解決する。
|
||||||
|
|
||||||
例: ピースが `~/.claude/skills/takt/pieces/default.yaml` にあり、`personas:` に `coder: ../personas/coder.md` がある場合
|
例: ピースが `~/.claude/skills/takt/pieces/default.yaml` にあり、`personas:` に `coder: ../facets/personas/coder.md` がある場合
|
||||||
→ 絶対パスは `~/.claude/skills/takt/personas/coder.md`
|
→ 絶対パスは `~/.claude/skills/takt/facets/personas/coder.md`
|
||||||
|
|
||||||
重複を除いて Read で全て読み込む。読み込んだ内容はチームメイトへのプロンプト構築に使う。
|
重複を除いて Read で全て読み込む。読み込んだ内容はチームメイトへのプロンプト構築に使う。
|
||||||
|
|
||||||
|
|||||||
@ -67,9 +67,9 @@ Task tool:
|
|||||||
3. movement の `persona: coder` → `personas:` セクションの `coder` キー → ファイルパス → Read で内容を取得
|
3. movement の `persona: coder` → `personas:` セクションの `coder` キー → ファイルパス → Read で内容を取得
|
||||||
|
|
||||||
例: ピースが `~/.claude/skills/takt/pieces/default.yaml` の場合
|
例: ピースが `~/.claude/skills/takt/pieces/default.yaml` の場合
|
||||||
- `personas.coder: ../personas/coder.md` → `~/.claude/skills/takt/personas/coder.md`
|
- `personas.coder: ../facets/personas/coder.md` → `~/.claude/skills/takt/facets/personas/coder.md`
|
||||||
- `policies.coding: ../policies/coding.md` → `~/.claude/skills/takt/policies/coding.md`
|
- `policies.coding: ../facets/policies/coding.md` → `~/.claude/skills/takt/facets/policies/coding.md`
|
||||||
- `instructions.plan: ../instructions/plan.md` → `~/.claude/skills/takt/instructions/plan.md`
|
- `instructions.plan: ../facets/instructions/plan.md` → `~/.claude/skills/takt/facets/instructions/plan.md`
|
||||||
|
|
||||||
## プロンプト構築
|
## プロンプト構築
|
||||||
|
|
||||||
|
|||||||
@ -132,11 +132,11 @@ describe('deploySkill', () => {
|
|||||||
|
|
||||||
// Verify each resource directory is copied
|
// Verify each resource directory is copied
|
||||||
expect(existsSync(join(skillDir, 'pieces', 'default.yaml'))).toBe(true);
|
expect(existsSync(join(skillDir, 'pieces', 'default.yaml'))).toBe(true);
|
||||||
expect(existsSync(join(skillDir, 'personas', 'coder.md'))).toBe(true);
|
expect(existsSync(join(skillDir, 'facets', 'personas', 'coder.md'))).toBe(true);
|
||||||
expect(existsSync(join(skillDir, 'policies', 'coding.md'))).toBe(true);
|
expect(existsSync(join(skillDir, 'facets', 'policies', 'coding.md'))).toBe(true);
|
||||||
expect(existsSync(join(skillDir, 'instructions', 'init.md'))).toBe(true);
|
expect(existsSync(join(skillDir, 'facets', 'instructions', 'init.md'))).toBe(true);
|
||||||
expect(existsSync(join(skillDir, 'knowledge', 'patterns.md'))).toBe(true);
|
expect(existsSync(join(skillDir, 'facets', 'knowledge', 'patterns.md'))).toBe(true);
|
||||||
expect(existsSync(join(skillDir, 'output-contracts', 'summary.md'))).toBe(true);
|
expect(existsSync(join(skillDir, 'facets', 'output-contracts', 'summary.md'))).toBe(true);
|
||||||
expect(existsSync(join(skillDir, 'templates', 'task.md'))).toBe(true);
|
expect(existsSync(join(skillDir, 'templates', 'task.md'))).toBe(true);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@ -39,8 +39,6 @@ const DIRECT_DIRS = ['pieces', 'templates'] as const;
|
|||||||
/** Facet directories under builtins/{lang}/facets/ */
|
/** Facet directories under builtins/{lang}/facets/ */
|
||||||
const FACET_DIRS = ['personas', 'policies', 'instructions', 'knowledge', 'output-contracts'] as const;
|
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/).
|
* Deploy takt skill to Claude Code (~/.claude/).
|
||||||
@ -95,11 +93,12 @@ export async function deploySkill(): Promise<void> {
|
|||||||
copyDirRecursive(srcDir, destDir, copiedFiles);
|
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) {
|
for (const dir of FACET_DIRS) {
|
||||||
const srcDir = join(langResourcesDir, 'facets', dir);
|
const srcDir = join(langResourcesDir, 'facets', dir);
|
||||||
const destDir = join(skillDir, dir);
|
const destDir = join(facetsDestDir, dir);
|
||||||
cleanDir(destDir);
|
|
||||||
copyDirRecursive(srcDir, destDir, copiedFiles);
|
copyDirRecursive(srcDir, destDir, copiedFiles);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -114,14 +113,17 @@ export async function deploySkill(): Promise<void> {
|
|||||||
const skillFiles = copiedFiles.filter(
|
const skillFiles = copiedFiles.filter(
|
||||||
(f) =>
|
(f) =>
|
||||||
f.startsWith(skillDir) &&
|
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 pieceFiles = copiedFiles.filter((f) => f.includes('/pieces/'));
|
||||||
const personaFiles = copiedFiles.filter((f) => f.includes('/personas/'));
|
const personaFiles = copiedFiles.filter((f) => f.includes('/facets/personas/'));
|
||||||
const policyFiles = copiedFiles.filter((f) => f.includes('/policies/'));
|
const policyFiles = copiedFiles.filter((f) => f.includes('/facets/policies/'));
|
||||||
const instructionFiles = copiedFiles.filter((f) => f.includes('/instructions/'));
|
const instructionFiles = copiedFiles.filter((f) => f.includes('/facets/instructions/'));
|
||||||
const knowledgeFiles = copiedFiles.filter((f) => f.includes('/knowledge/'));
|
const knowledgeFiles = copiedFiles.filter((f) => f.includes('/facets/knowledge/'));
|
||||||
const outputContractFiles = copiedFiles.filter((f) => f.includes('/output-contracts/'));
|
const outputContractFiles = copiedFiles.filter((f) => f.includes('/facets/output-contracts/'));
|
||||||
const templateFiles = copiedFiles.filter((f) => f.includes('/templates/'));
|
const templateFiles = copiedFiles.filter((f) => f.includes('/templates/'));
|
||||||
|
|
||||||
if (skillFiles.length > 0) {
|
if (skillFiles.length > 0) {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user