From 102f31447a6e4c761380b6176da6cc3bd13bf8b7 Mon Sep 17 00:00:00 2001 From: nrslib <38722970+nrslib@users.noreply.github.com> Date: Sun, 22 Feb 2026 02:40:33 +0900 Subject: [PATCH] refactor: rename faceted to facets across package layout --- .../instructions/ai-fix.md | 0 .../instructions/ai-review.md | 0 .../instructions/arbitrate.md | 0 .../instructions/architect.md | 0 .../instructions/fix-supervisor.md | 0 .../{faceted => facets}/instructions/fix.md | 0 .../instructions/implement-e2e-test.md | 0 .../instructions/implement-test.md | 0 .../instructions/implement.md | 0 .../instructions/loop-monitor-ai-fix.md | 0 .../instructions/plan-e2e-test.md | 0 .../instructions/plan-investigate.md | 0 .../instructions/plan-test.md | 0 .../{faceted => facets}/instructions/plan.md | 0 .../instructions/research-analyze.md | 0 .../instructions/research-dig.md | 0 .../instructions/research-plan.md | 0 .../instructions/research-supervise.md | 0 .../instructions/review-ai.md | 0 .../instructions/review-arch.md | 0 .../instructions/review-cqrs-es.md | 0 .../instructions/review-frontend.md | 0 .../instructions/review-qa.md | 0 .../instructions/review-security.md | 0 .../instructions/review-test.md | 0 .../instructions/supervise.md | 0 .../knowledge/architecture.md | 0 .../{faceted => facets}/knowledge/backend.md | 0 .../{faceted => facets}/knowledge/cqrs-es.md | 0 .../{faceted => facets}/knowledge/frontend.md | 0 .../knowledge/research-comparative.md | 0 .../{faceted => facets}/knowledge/research.md | 0 .../{faceted => facets}/knowledge/security.md | 0 .../output-contracts/ai-review.md | 0 .../output-contracts/architecture-design.md | 0 .../output-contracts/architecture-review.md | 0 .../output-contracts/coder-decisions.md | 0 .../output-contracts/coder-scope.md | 0 .../output-contracts/cqrs-es-review.md | 0 .../output-contracts/frontend-review.md | 0 .../output-contracts/plan.md | 0 .../output-contracts/qa-review.md | 0 .../output-contracts/security-review.md | 0 .../output-contracts/summary.md | 0 .../output-contracts/supervisor-validation.md | 0 .../output-contracts/test-plan.md | 0 .../output-contracts/validation.md | 0 .../personas/ai-antipattern-reviewer.md | 0 .../personas/architect-planner.md | 0 .../personas/architecture-reviewer.md | 0 .../{faceted => facets}/personas/balthasar.md | 0 .../en/{faceted => facets}/personas/casper.md | 0 .../en/{faceted => facets}/personas/coder.md | 0 .../{faceted => facets}/personas/conductor.md | 0 .../personas/cqrs-es-reviewer.md | 0 .../personas/expert-supervisor.md | 0 .../personas/frontend-reviewer.md | 0 .../{faceted => facets}/personas/melchior.md | 0 .../{faceted => facets}/personas/planner.md | 0 .../personas/pr-commenter.md | 0 .../personas/qa-reviewer.md | 0 .../personas/research-analyzer.md | 0 .../personas/research-digger.md | 0 .../personas/research-planner.md | 0 .../personas/research-supervisor.md | 0 .../personas/security-reviewer.md | 0 .../personas/supervisor.md | 0 .../personas/test-planner.md | 0 .../policies/ai-antipattern.md | 0 .../en/{faceted => facets}/policies/coding.md | 0 .../en/{faceted => facets}/policies/qa.md | 0 .../{faceted => facets}/policies/research.md | 0 .../en/{faceted => facets}/policies/review.md | 0 .../{faceted => facets}/policies/testing.md | 0 .../instructions/ai-fix.md | 0 .../instructions/ai-review.md | 0 .../instructions/arbitrate.md | 0 .../instructions/architect.md | 0 .../instructions/fix-supervisor.md | 0 .../{faceted => facets}/instructions/fix.md | 0 .../instructions/implement-e2e-test.md | 0 .../instructions/implement-test.md | 0 .../instructions/implement.md | 0 .../instructions/loop-monitor-ai-fix.md | 0 .../instructions/plan-e2e-test.md | 0 .../instructions/plan-investigate.md | 0 .../instructions/plan-test.md | 0 .../{faceted => facets}/instructions/plan.md | 0 .../instructions/research-analyze.md | 0 .../instructions/research-dig.md | 0 .../instructions/research-plan.md | 0 .../instructions/research-supervise.md | 0 .../instructions/review-ai.md | 0 .../instructions/review-arch.md | 0 .../instructions/review-cqrs-es.md | 0 .../instructions/review-frontend.md | 0 .../instructions/review-qa.md | 0 .../instructions/review-security.md | 0 .../instructions/review-test.md | 0 .../instructions/supervise.md | 0 .../knowledge/architecture.md | 0 .../{faceted => facets}/knowledge/backend.md | 0 .../{faceted => facets}/knowledge/cqrs-es.md | 0 .../{faceted => facets}/knowledge/frontend.md | 0 .../knowledge/research-comparative.md | 0 .../{faceted => facets}/knowledge/research.md | 0 .../{faceted => facets}/knowledge/security.md | 0 .../output-contracts/ai-review.md | 0 .../output-contracts/architecture-design.md | 0 .../output-contracts/architecture-review.md | 0 .../output-contracts/coder-decisions.md | 0 .../output-contracts/coder-scope.md | 0 .../output-contracts/cqrs-es-review.md | 0 .../output-contracts/frontend-review.md | 0 .../output-contracts/plan.md | 0 .../output-contracts/qa-review.md | 0 .../output-contracts/security-review.md | 0 .../output-contracts/summary.md | 0 .../output-contracts/supervisor-validation.md | 0 .../output-contracts/test-plan.md | 0 .../output-contracts/validation.md | 0 .../personas/ai-antipattern-reviewer.md | 0 .../personas/architect-planner.md | 0 .../personas/architecture-reviewer.md | 0 .../{faceted => facets}/personas/balthasar.md | 0 .../ja/{faceted => facets}/personas/casper.md | 0 .../ja/{faceted => facets}/personas/coder.md | 0 .../{faceted => facets}/personas/conductor.md | 0 .../personas/cqrs-es-reviewer.md | 0 .../personas/expert-supervisor.md | 0 .../personas/frontend-reviewer.md | 0 .../{faceted => facets}/personas/melchior.md | 0 .../{faceted => facets}/personas/planner.md | 0 .../personas/pr-commenter.md | 0 .../personas/qa-reviewer.md | 0 .../personas/research-analyzer.md | 0 .../personas/research-digger.md | 0 .../personas/research-planner.md | 0 .../personas/research-supervisor.md | 0 .../personas/security-reviewer.md | 0 .../personas/supervisor.md | 0 .../personas/test-planner.md | 0 .../policies/ai-antipattern.md | 0 .../ja/{faceted => facets}/policies/coding.md | 0 .../ja/{faceted => facets}/policies/qa.md | 0 .../{faceted => facets}/policies/research.md | 0 .../ja/{faceted => facets}/policies/review.md | 0 .../{faceted => facets}/policies/testing.md | 0 docs/takt-pack-spec.md | 126 +++++++++--------- e2e/specs/ensemble.e2e.ts | 12 +- src/__tests__/catalog.test.ts | 26 ++-- src/__tests__/ensemble-scope-resolver.test.ts | 28 ++-- src/__tests__/ensemble/ensemble-paths.test.ts | 62 ++++----- src/__tests__/ensemble/file-filter.test.ts | 48 +++---- src/__tests__/ensemble/pack-summary.test.ts | 20 +-- .../ensemble/package-facet-resolution.test.ts | 6 +- src/__tests__/ensemble/tar-parser.test.ts | 32 ++--- src/__tests__/facet-resolution.test.ts | 24 ++-- .../faceted-prompting/scope-ref.test.ts | 32 ++--- src/__tests__/review-only-piece.test.ts | 8 +- src/app/cli/index.ts | 4 +- src/faceted-prompting/scope.ts | 4 +- src/features/ensemble/file-filter.ts | 8 +- src/features/ensemble/pack-summary.ts | 2 +- src/infra/config/loaders/resource-resolver.ts | 8 +- src/infra/config/paths.ts | 18 +-- 166 files changed, 235 insertions(+), 233 deletions(-) rename builtins/en/{faceted => facets}/instructions/ai-fix.md (100%) rename builtins/en/{faceted => facets}/instructions/ai-review.md (100%) rename builtins/en/{faceted => facets}/instructions/arbitrate.md (100%) rename builtins/en/{faceted => facets}/instructions/architect.md (100%) rename builtins/en/{faceted => facets}/instructions/fix-supervisor.md (100%) rename builtins/en/{faceted => facets}/instructions/fix.md (100%) rename builtins/en/{faceted => facets}/instructions/implement-e2e-test.md (100%) rename builtins/en/{faceted => facets}/instructions/implement-test.md (100%) rename builtins/en/{faceted => facets}/instructions/implement.md (100%) rename builtins/en/{faceted => facets}/instructions/loop-monitor-ai-fix.md (100%) rename builtins/en/{faceted => facets}/instructions/plan-e2e-test.md (100%) rename builtins/en/{faceted => facets}/instructions/plan-investigate.md (100%) rename builtins/en/{faceted => facets}/instructions/plan-test.md (100%) rename builtins/en/{faceted => facets}/instructions/plan.md (100%) rename builtins/en/{faceted => facets}/instructions/research-analyze.md (100%) rename builtins/en/{faceted => facets}/instructions/research-dig.md (100%) rename builtins/en/{faceted => facets}/instructions/research-plan.md (100%) rename builtins/en/{faceted => facets}/instructions/research-supervise.md (100%) rename builtins/en/{faceted => facets}/instructions/review-ai.md (100%) rename builtins/en/{faceted => facets}/instructions/review-arch.md (100%) rename builtins/en/{faceted => facets}/instructions/review-cqrs-es.md (100%) rename builtins/en/{faceted => facets}/instructions/review-frontend.md (100%) rename builtins/en/{faceted => facets}/instructions/review-qa.md (100%) rename builtins/en/{faceted => facets}/instructions/review-security.md (100%) rename builtins/en/{faceted => facets}/instructions/review-test.md (100%) rename builtins/en/{faceted => facets}/instructions/supervise.md (100%) rename builtins/en/{faceted => facets}/knowledge/architecture.md (100%) rename builtins/en/{faceted => facets}/knowledge/backend.md (100%) rename builtins/en/{faceted => facets}/knowledge/cqrs-es.md (100%) rename builtins/en/{faceted => facets}/knowledge/frontend.md (100%) rename builtins/en/{faceted => facets}/knowledge/research-comparative.md (100%) rename builtins/en/{faceted => facets}/knowledge/research.md (100%) rename builtins/en/{faceted => facets}/knowledge/security.md (100%) rename builtins/en/{faceted => facets}/output-contracts/ai-review.md (100%) rename builtins/en/{faceted => facets}/output-contracts/architecture-design.md (100%) rename builtins/en/{faceted => facets}/output-contracts/architecture-review.md (100%) rename builtins/en/{faceted => facets}/output-contracts/coder-decisions.md (100%) rename builtins/en/{faceted => facets}/output-contracts/coder-scope.md (100%) rename builtins/en/{faceted => facets}/output-contracts/cqrs-es-review.md (100%) rename builtins/en/{faceted => facets}/output-contracts/frontend-review.md (100%) rename builtins/en/{faceted => facets}/output-contracts/plan.md (100%) rename builtins/en/{faceted => facets}/output-contracts/qa-review.md (100%) rename builtins/en/{faceted => facets}/output-contracts/security-review.md (100%) rename builtins/en/{faceted => facets}/output-contracts/summary.md (100%) rename builtins/en/{faceted => facets}/output-contracts/supervisor-validation.md (100%) rename builtins/en/{faceted => facets}/output-contracts/test-plan.md (100%) rename builtins/en/{faceted => facets}/output-contracts/validation.md (100%) rename builtins/en/{faceted => facets}/personas/ai-antipattern-reviewer.md (100%) rename builtins/en/{faceted => facets}/personas/architect-planner.md (100%) rename builtins/en/{faceted => facets}/personas/architecture-reviewer.md (100%) rename builtins/en/{faceted => facets}/personas/balthasar.md (100%) rename builtins/en/{faceted => facets}/personas/casper.md (100%) rename builtins/en/{faceted => facets}/personas/coder.md (100%) rename builtins/en/{faceted => facets}/personas/conductor.md (100%) rename builtins/en/{faceted => facets}/personas/cqrs-es-reviewer.md (100%) rename builtins/en/{faceted => facets}/personas/expert-supervisor.md (100%) rename builtins/en/{faceted => facets}/personas/frontend-reviewer.md (100%) rename builtins/en/{faceted => facets}/personas/melchior.md (100%) rename builtins/en/{faceted => facets}/personas/planner.md (100%) rename builtins/en/{faceted => facets}/personas/pr-commenter.md (100%) rename builtins/en/{faceted => facets}/personas/qa-reviewer.md (100%) rename builtins/en/{faceted => facets}/personas/research-analyzer.md (100%) rename builtins/en/{faceted => facets}/personas/research-digger.md (100%) rename builtins/en/{faceted => facets}/personas/research-planner.md (100%) rename builtins/en/{faceted => facets}/personas/research-supervisor.md (100%) rename builtins/en/{faceted => facets}/personas/security-reviewer.md (100%) rename builtins/en/{faceted => facets}/personas/supervisor.md (100%) rename builtins/en/{faceted => facets}/personas/test-planner.md (100%) rename builtins/en/{faceted => facets}/policies/ai-antipattern.md (100%) rename builtins/en/{faceted => facets}/policies/coding.md (100%) rename builtins/en/{faceted => facets}/policies/qa.md (100%) rename builtins/en/{faceted => facets}/policies/research.md (100%) rename builtins/en/{faceted => facets}/policies/review.md (100%) rename builtins/en/{faceted => facets}/policies/testing.md (100%) rename builtins/ja/{faceted => facets}/instructions/ai-fix.md (100%) rename builtins/ja/{faceted => facets}/instructions/ai-review.md (100%) rename builtins/ja/{faceted => facets}/instructions/arbitrate.md (100%) rename builtins/ja/{faceted => facets}/instructions/architect.md (100%) rename builtins/ja/{faceted => facets}/instructions/fix-supervisor.md (100%) rename builtins/ja/{faceted => facets}/instructions/fix.md (100%) rename builtins/ja/{faceted => facets}/instructions/implement-e2e-test.md (100%) rename builtins/ja/{faceted => facets}/instructions/implement-test.md (100%) rename builtins/ja/{faceted => facets}/instructions/implement.md (100%) rename builtins/ja/{faceted => facets}/instructions/loop-monitor-ai-fix.md (100%) rename builtins/ja/{faceted => facets}/instructions/plan-e2e-test.md (100%) rename builtins/ja/{faceted => facets}/instructions/plan-investigate.md (100%) rename builtins/ja/{faceted => facets}/instructions/plan-test.md (100%) rename builtins/ja/{faceted => facets}/instructions/plan.md (100%) rename builtins/ja/{faceted => facets}/instructions/research-analyze.md (100%) rename builtins/ja/{faceted => facets}/instructions/research-dig.md (100%) rename builtins/ja/{faceted => facets}/instructions/research-plan.md (100%) rename builtins/ja/{faceted => facets}/instructions/research-supervise.md (100%) rename builtins/ja/{faceted => facets}/instructions/review-ai.md (100%) rename builtins/ja/{faceted => facets}/instructions/review-arch.md (100%) rename builtins/ja/{faceted => facets}/instructions/review-cqrs-es.md (100%) rename builtins/ja/{faceted => facets}/instructions/review-frontend.md (100%) rename builtins/ja/{faceted => facets}/instructions/review-qa.md (100%) rename builtins/ja/{faceted => facets}/instructions/review-security.md (100%) rename builtins/ja/{faceted => facets}/instructions/review-test.md (100%) rename builtins/ja/{faceted => facets}/instructions/supervise.md (100%) rename builtins/ja/{faceted => facets}/knowledge/architecture.md (100%) rename builtins/ja/{faceted => facets}/knowledge/backend.md (100%) rename builtins/ja/{faceted => facets}/knowledge/cqrs-es.md (100%) rename builtins/ja/{faceted => facets}/knowledge/frontend.md (100%) rename builtins/ja/{faceted => facets}/knowledge/research-comparative.md (100%) rename builtins/ja/{faceted => facets}/knowledge/research.md (100%) rename builtins/ja/{faceted => facets}/knowledge/security.md (100%) rename builtins/ja/{faceted => facets}/output-contracts/ai-review.md (100%) rename builtins/ja/{faceted => facets}/output-contracts/architecture-design.md (100%) rename builtins/ja/{faceted => facets}/output-contracts/architecture-review.md (100%) rename builtins/ja/{faceted => facets}/output-contracts/coder-decisions.md (100%) rename builtins/ja/{faceted => facets}/output-contracts/coder-scope.md (100%) rename builtins/ja/{faceted => facets}/output-contracts/cqrs-es-review.md (100%) rename builtins/ja/{faceted => facets}/output-contracts/frontend-review.md (100%) rename builtins/ja/{faceted => facets}/output-contracts/plan.md (100%) rename builtins/ja/{faceted => facets}/output-contracts/qa-review.md (100%) rename builtins/ja/{faceted => facets}/output-contracts/security-review.md (100%) rename builtins/ja/{faceted => facets}/output-contracts/summary.md (100%) rename builtins/ja/{faceted => facets}/output-contracts/supervisor-validation.md (100%) rename builtins/ja/{faceted => facets}/output-contracts/test-plan.md (100%) rename builtins/ja/{faceted => facets}/output-contracts/validation.md (100%) rename builtins/ja/{faceted => facets}/personas/ai-antipattern-reviewer.md (100%) rename builtins/ja/{faceted => facets}/personas/architect-planner.md (100%) rename builtins/ja/{faceted => facets}/personas/architecture-reviewer.md (100%) rename builtins/ja/{faceted => facets}/personas/balthasar.md (100%) rename builtins/ja/{faceted => facets}/personas/casper.md (100%) rename builtins/ja/{faceted => facets}/personas/coder.md (100%) rename builtins/ja/{faceted => facets}/personas/conductor.md (100%) rename builtins/ja/{faceted => facets}/personas/cqrs-es-reviewer.md (100%) rename builtins/ja/{faceted => facets}/personas/expert-supervisor.md (100%) rename builtins/ja/{faceted => facets}/personas/frontend-reviewer.md (100%) rename builtins/ja/{faceted => facets}/personas/melchior.md (100%) rename builtins/ja/{faceted => facets}/personas/planner.md (100%) rename builtins/ja/{faceted => facets}/personas/pr-commenter.md (100%) rename builtins/ja/{faceted => facets}/personas/qa-reviewer.md (100%) rename builtins/ja/{faceted => facets}/personas/research-analyzer.md (100%) rename builtins/ja/{faceted => facets}/personas/research-digger.md (100%) rename builtins/ja/{faceted => facets}/personas/research-planner.md (100%) rename builtins/ja/{faceted => facets}/personas/research-supervisor.md (100%) rename builtins/ja/{faceted => facets}/personas/security-reviewer.md (100%) rename builtins/ja/{faceted => facets}/personas/supervisor.md (100%) rename builtins/ja/{faceted => facets}/personas/test-planner.md (100%) rename builtins/ja/{faceted => facets}/policies/ai-antipattern.md (100%) rename builtins/ja/{faceted => facets}/policies/coding.md (100%) rename builtins/ja/{faceted => facets}/policies/qa.md (100%) rename builtins/ja/{faceted => facets}/policies/research.md (100%) rename builtins/ja/{faceted => facets}/policies/review.md (100%) rename builtins/ja/{faceted => facets}/policies/testing.md (100%) diff --git a/builtins/en/faceted/instructions/ai-fix.md b/builtins/en/facets/instructions/ai-fix.md similarity index 100% rename from builtins/en/faceted/instructions/ai-fix.md rename to builtins/en/facets/instructions/ai-fix.md diff --git a/builtins/en/faceted/instructions/ai-review.md b/builtins/en/facets/instructions/ai-review.md similarity index 100% rename from builtins/en/faceted/instructions/ai-review.md rename to builtins/en/facets/instructions/ai-review.md diff --git a/builtins/en/faceted/instructions/arbitrate.md b/builtins/en/facets/instructions/arbitrate.md similarity index 100% rename from builtins/en/faceted/instructions/arbitrate.md rename to builtins/en/facets/instructions/arbitrate.md diff --git a/builtins/en/faceted/instructions/architect.md b/builtins/en/facets/instructions/architect.md similarity index 100% rename from builtins/en/faceted/instructions/architect.md rename to builtins/en/facets/instructions/architect.md diff --git a/builtins/en/faceted/instructions/fix-supervisor.md b/builtins/en/facets/instructions/fix-supervisor.md similarity index 100% rename from builtins/en/faceted/instructions/fix-supervisor.md rename to builtins/en/facets/instructions/fix-supervisor.md diff --git a/builtins/en/faceted/instructions/fix.md b/builtins/en/facets/instructions/fix.md similarity index 100% rename from builtins/en/faceted/instructions/fix.md rename to builtins/en/facets/instructions/fix.md diff --git a/builtins/en/faceted/instructions/implement-e2e-test.md b/builtins/en/facets/instructions/implement-e2e-test.md similarity index 100% rename from builtins/en/faceted/instructions/implement-e2e-test.md rename to builtins/en/facets/instructions/implement-e2e-test.md diff --git a/builtins/en/faceted/instructions/implement-test.md b/builtins/en/facets/instructions/implement-test.md similarity index 100% rename from builtins/en/faceted/instructions/implement-test.md rename to builtins/en/facets/instructions/implement-test.md diff --git a/builtins/en/faceted/instructions/implement.md b/builtins/en/facets/instructions/implement.md similarity index 100% rename from builtins/en/faceted/instructions/implement.md rename to builtins/en/facets/instructions/implement.md diff --git a/builtins/en/faceted/instructions/loop-monitor-ai-fix.md b/builtins/en/facets/instructions/loop-monitor-ai-fix.md similarity index 100% rename from builtins/en/faceted/instructions/loop-monitor-ai-fix.md rename to builtins/en/facets/instructions/loop-monitor-ai-fix.md diff --git a/builtins/en/faceted/instructions/plan-e2e-test.md b/builtins/en/facets/instructions/plan-e2e-test.md similarity index 100% rename from builtins/en/faceted/instructions/plan-e2e-test.md rename to builtins/en/facets/instructions/plan-e2e-test.md diff --git a/builtins/en/faceted/instructions/plan-investigate.md b/builtins/en/facets/instructions/plan-investigate.md similarity index 100% rename from builtins/en/faceted/instructions/plan-investigate.md rename to builtins/en/facets/instructions/plan-investigate.md diff --git a/builtins/en/faceted/instructions/plan-test.md b/builtins/en/facets/instructions/plan-test.md similarity index 100% rename from builtins/en/faceted/instructions/plan-test.md rename to builtins/en/facets/instructions/plan-test.md diff --git a/builtins/en/faceted/instructions/plan.md b/builtins/en/facets/instructions/plan.md similarity index 100% rename from builtins/en/faceted/instructions/plan.md rename to builtins/en/facets/instructions/plan.md diff --git a/builtins/en/faceted/instructions/research-analyze.md b/builtins/en/facets/instructions/research-analyze.md similarity index 100% rename from builtins/en/faceted/instructions/research-analyze.md rename to builtins/en/facets/instructions/research-analyze.md diff --git a/builtins/en/faceted/instructions/research-dig.md b/builtins/en/facets/instructions/research-dig.md similarity index 100% rename from builtins/en/faceted/instructions/research-dig.md rename to builtins/en/facets/instructions/research-dig.md diff --git a/builtins/en/faceted/instructions/research-plan.md b/builtins/en/facets/instructions/research-plan.md similarity index 100% rename from builtins/en/faceted/instructions/research-plan.md rename to builtins/en/facets/instructions/research-plan.md diff --git a/builtins/en/faceted/instructions/research-supervise.md b/builtins/en/facets/instructions/research-supervise.md similarity index 100% rename from builtins/en/faceted/instructions/research-supervise.md rename to builtins/en/facets/instructions/research-supervise.md diff --git a/builtins/en/faceted/instructions/review-ai.md b/builtins/en/facets/instructions/review-ai.md similarity index 100% rename from builtins/en/faceted/instructions/review-ai.md rename to builtins/en/facets/instructions/review-ai.md diff --git a/builtins/en/faceted/instructions/review-arch.md b/builtins/en/facets/instructions/review-arch.md similarity index 100% rename from builtins/en/faceted/instructions/review-arch.md rename to builtins/en/facets/instructions/review-arch.md diff --git a/builtins/en/faceted/instructions/review-cqrs-es.md b/builtins/en/facets/instructions/review-cqrs-es.md similarity index 100% rename from builtins/en/faceted/instructions/review-cqrs-es.md rename to builtins/en/facets/instructions/review-cqrs-es.md diff --git a/builtins/en/faceted/instructions/review-frontend.md b/builtins/en/facets/instructions/review-frontend.md similarity index 100% rename from builtins/en/faceted/instructions/review-frontend.md rename to builtins/en/facets/instructions/review-frontend.md diff --git a/builtins/en/faceted/instructions/review-qa.md b/builtins/en/facets/instructions/review-qa.md similarity index 100% rename from builtins/en/faceted/instructions/review-qa.md rename to builtins/en/facets/instructions/review-qa.md diff --git a/builtins/en/faceted/instructions/review-security.md b/builtins/en/facets/instructions/review-security.md similarity index 100% rename from builtins/en/faceted/instructions/review-security.md rename to builtins/en/facets/instructions/review-security.md diff --git a/builtins/en/faceted/instructions/review-test.md b/builtins/en/facets/instructions/review-test.md similarity index 100% rename from builtins/en/faceted/instructions/review-test.md rename to builtins/en/facets/instructions/review-test.md diff --git a/builtins/en/faceted/instructions/supervise.md b/builtins/en/facets/instructions/supervise.md similarity index 100% rename from builtins/en/faceted/instructions/supervise.md rename to builtins/en/facets/instructions/supervise.md diff --git a/builtins/en/faceted/knowledge/architecture.md b/builtins/en/facets/knowledge/architecture.md similarity index 100% rename from builtins/en/faceted/knowledge/architecture.md rename to builtins/en/facets/knowledge/architecture.md diff --git a/builtins/en/faceted/knowledge/backend.md b/builtins/en/facets/knowledge/backend.md similarity index 100% rename from builtins/en/faceted/knowledge/backend.md rename to builtins/en/facets/knowledge/backend.md diff --git a/builtins/en/faceted/knowledge/cqrs-es.md b/builtins/en/facets/knowledge/cqrs-es.md similarity index 100% rename from builtins/en/faceted/knowledge/cqrs-es.md rename to builtins/en/facets/knowledge/cqrs-es.md diff --git a/builtins/en/faceted/knowledge/frontend.md b/builtins/en/facets/knowledge/frontend.md similarity index 100% rename from builtins/en/faceted/knowledge/frontend.md rename to builtins/en/facets/knowledge/frontend.md diff --git a/builtins/en/faceted/knowledge/research-comparative.md b/builtins/en/facets/knowledge/research-comparative.md similarity index 100% rename from builtins/en/faceted/knowledge/research-comparative.md rename to builtins/en/facets/knowledge/research-comparative.md diff --git a/builtins/en/faceted/knowledge/research.md b/builtins/en/facets/knowledge/research.md similarity index 100% rename from builtins/en/faceted/knowledge/research.md rename to builtins/en/facets/knowledge/research.md diff --git a/builtins/en/faceted/knowledge/security.md b/builtins/en/facets/knowledge/security.md similarity index 100% rename from builtins/en/faceted/knowledge/security.md rename to builtins/en/facets/knowledge/security.md diff --git a/builtins/en/faceted/output-contracts/ai-review.md b/builtins/en/facets/output-contracts/ai-review.md similarity index 100% rename from builtins/en/faceted/output-contracts/ai-review.md rename to builtins/en/facets/output-contracts/ai-review.md diff --git a/builtins/en/faceted/output-contracts/architecture-design.md b/builtins/en/facets/output-contracts/architecture-design.md similarity index 100% rename from builtins/en/faceted/output-contracts/architecture-design.md rename to builtins/en/facets/output-contracts/architecture-design.md diff --git a/builtins/en/faceted/output-contracts/architecture-review.md b/builtins/en/facets/output-contracts/architecture-review.md similarity index 100% rename from builtins/en/faceted/output-contracts/architecture-review.md rename to builtins/en/facets/output-contracts/architecture-review.md diff --git a/builtins/en/faceted/output-contracts/coder-decisions.md b/builtins/en/facets/output-contracts/coder-decisions.md similarity index 100% rename from builtins/en/faceted/output-contracts/coder-decisions.md rename to builtins/en/facets/output-contracts/coder-decisions.md diff --git a/builtins/en/faceted/output-contracts/coder-scope.md b/builtins/en/facets/output-contracts/coder-scope.md similarity index 100% rename from builtins/en/faceted/output-contracts/coder-scope.md rename to builtins/en/facets/output-contracts/coder-scope.md diff --git a/builtins/en/faceted/output-contracts/cqrs-es-review.md b/builtins/en/facets/output-contracts/cqrs-es-review.md similarity index 100% rename from builtins/en/faceted/output-contracts/cqrs-es-review.md rename to builtins/en/facets/output-contracts/cqrs-es-review.md diff --git a/builtins/en/faceted/output-contracts/frontend-review.md b/builtins/en/facets/output-contracts/frontend-review.md similarity index 100% rename from builtins/en/faceted/output-contracts/frontend-review.md rename to builtins/en/facets/output-contracts/frontend-review.md diff --git a/builtins/en/faceted/output-contracts/plan.md b/builtins/en/facets/output-contracts/plan.md similarity index 100% rename from builtins/en/faceted/output-contracts/plan.md rename to builtins/en/facets/output-contracts/plan.md diff --git a/builtins/en/faceted/output-contracts/qa-review.md b/builtins/en/facets/output-contracts/qa-review.md similarity index 100% rename from builtins/en/faceted/output-contracts/qa-review.md rename to builtins/en/facets/output-contracts/qa-review.md diff --git a/builtins/en/faceted/output-contracts/security-review.md b/builtins/en/facets/output-contracts/security-review.md similarity index 100% rename from builtins/en/faceted/output-contracts/security-review.md rename to builtins/en/facets/output-contracts/security-review.md diff --git a/builtins/en/faceted/output-contracts/summary.md b/builtins/en/facets/output-contracts/summary.md similarity index 100% rename from builtins/en/faceted/output-contracts/summary.md rename to builtins/en/facets/output-contracts/summary.md diff --git a/builtins/en/faceted/output-contracts/supervisor-validation.md b/builtins/en/facets/output-contracts/supervisor-validation.md similarity index 100% rename from builtins/en/faceted/output-contracts/supervisor-validation.md rename to builtins/en/facets/output-contracts/supervisor-validation.md diff --git a/builtins/en/faceted/output-contracts/test-plan.md b/builtins/en/facets/output-contracts/test-plan.md similarity index 100% rename from builtins/en/faceted/output-contracts/test-plan.md rename to builtins/en/facets/output-contracts/test-plan.md diff --git a/builtins/en/faceted/output-contracts/validation.md b/builtins/en/facets/output-contracts/validation.md similarity index 100% rename from builtins/en/faceted/output-contracts/validation.md rename to builtins/en/facets/output-contracts/validation.md diff --git a/builtins/en/faceted/personas/ai-antipattern-reviewer.md b/builtins/en/facets/personas/ai-antipattern-reviewer.md similarity index 100% rename from builtins/en/faceted/personas/ai-antipattern-reviewer.md rename to builtins/en/facets/personas/ai-antipattern-reviewer.md diff --git a/builtins/en/faceted/personas/architect-planner.md b/builtins/en/facets/personas/architect-planner.md similarity index 100% rename from builtins/en/faceted/personas/architect-planner.md rename to builtins/en/facets/personas/architect-planner.md diff --git a/builtins/en/faceted/personas/architecture-reviewer.md b/builtins/en/facets/personas/architecture-reviewer.md similarity index 100% rename from builtins/en/faceted/personas/architecture-reviewer.md rename to builtins/en/facets/personas/architecture-reviewer.md diff --git a/builtins/en/faceted/personas/balthasar.md b/builtins/en/facets/personas/balthasar.md similarity index 100% rename from builtins/en/faceted/personas/balthasar.md rename to builtins/en/facets/personas/balthasar.md diff --git a/builtins/en/faceted/personas/casper.md b/builtins/en/facets/personas/casper.md similarity index 100% rename from builtins/en/faceted/personas/casper.md rename to builtins/en/facets/personas/casper.md diff --git a/builtins/en/faceted/personas/coder.md b/builtins/en/facets/personas/coder.md similarity index 100% rename from builtins/en/faceted/personas/coder.md rename to builtins/en/facets/personas/coder.md diff --git a/builtins/en/faceted/personas/conductor.md b/builtins/en/facets/personas/conductor.md similarity index 100% rename from builtins/en/faceted/personas/conductor.md rename to builtins/en/facets/personas/conductor.md diff --git a/builtins/en/faceted/personas/cqrs-es-reviewer.md b/builtins/en/facets/personas/cqrs-es-reviewer.md similarity index 100% rename from builtins/en/faceted/personas/cqrs-es-reviewer.md rename to builtins/en/facets/personas/cqrs-es-reviewer.md diff --git a/builtins/en/faceted/personas/expert-supervisor.md b/builtins/en/facets/personas/expert-supervisor.md similarity index 100% rename from builtins/en/faceted/personas/expert-supervisor.md rename to builtins/en/facets/personas/expert-supervisor.md diff --git a/builtins/en/faceted/personas/frontend-reviewer.md b/builtins/en/facets/personas/frontend-reviewer.md similarity index 100% rename from builtins/en/faceted/personas/frontend-reviewer.md rename to builtins/en/facets/personas/frontend-reviewer.md diff --git a/builtins/en/faceted/personas/melchior.md b/builtins/en/facets/personas/melchior.md similarity index 100% rename from builtins/en/faceted/personas/melchior.md rename to builtins/en/facets/personas/melchior.md diff --git a/builtins/en/faceted/personas/planner.md b/builtins/en/facets/personas/planner.md similarity index 100% rename from builtins/en/faceted/personas/planner.md rename to builtins/en/facets/personas/planner.md diff --git a/builtins/en/faceted/personas/pr-commenter.md b/builtins/en/facets/personas/pr-commenter.md similarity index 100% rename from builtins/en/faceted/personas/pr-commenter.md rename to builtins/en/facets/personas/pr-commenter.md diff --git a/builtins/en/faceted/personas/qa-reviewer.md b/builtins/en/facets/personas/qa-reviewer.md similarity index 100% rename from builtins/en/faceted/personas/qa-reviewer.md rename to builtins/en/facets/personas/qa-reviewer.md diff --git a/builtins/en/faceted/personas/research-analyzer.md b/builtins/en/facets/personas/research-analyzer.md similarity index 100% rename from builtins/en/faceted/personas/research-analyzer.md rename to builtins/en/facets/personas/research-analyzer.md diff --git a/builtins/en/faceted/personas/research-digger.md b/builtins/en/facets/personas/research-digger.md similarity index 100% rename from builtins/en/faceted/personas/research-digger.md rename to builtins/en/facets/personas/research-digger.md diff --git a/builtins/en/faceted/personas/research-planner.md b/builtins/en/facets/personas/research-planner.md similarity index 100% rename from builtins/en/faceted/personas/research-planner.md rename to builtins/en/facets/personas/research-planner.md diff --git a/builtins/en/faceted/personas/research-supervisor.md b/builtins/en/facets/personas/research-supervisor.md similarity index 100% rename from builtins/en/faceted/personas/research-supervisor.md rename to builtins/en/facets/personas/research-supervisor.md diff --git a/builtins/en/faceted/personas/security-reviewer.md b/builtins/en/facets/personas/security-reviewer.md similarity index 100% rename from builtins/en/faceted/personas/security-reviewer.md rename to builtins/en/facets/personas/security-reviewer.md diff --git a/builtins/en/faceted/personas/supervisor.md b/builtins/en/facets/personas/supervisor.md similarity index 100% rename from builtins/en/faceted/personas/supervisor.md rename to builtins/en/facets/personas/supervisor.md diff --git a/builtins/en/faceted/personas/test-planner.md b/builtins/en/facets/personas/test-planner.md similarity index 100% rename from builtins/en/faceted/personas/test-planner.md rename to builtins/en/facets/personas/test-planner.md diff --git a/builtins/en/faceted/policies/ai-antipattern.md b/builtins/en/facets/policies/ai-antipattern.md similarity index 100% rename from builtins/en/faceted/policies/ai-antipattern.md rename to builtins/en/facets/policies/ai-antipattern.md diff --git a/builtins/en/faceted/policies/coding.md b/builtins/en/facets/policies/coding.md similarity index 100% rename from builtins/en/faceted/policies/coding.md rename to builtins/en/facets/policies/coding.md diff --git a/builtins/en/faceted/policies/qa.md b/builtins/en/facets/policies/qa.md similarity index 100% rename from builtins/en/faceted/policies/qa.md rename to builtins/en/facets/policies/qa.md diff --git a/builtins/en/faceted/policies/research.md b/builtins/en/facets/policies/research.md similarity index 100% rename from builtins/en/faceted/policies/research.md rename to builtins/en/facets/policies/research.md diff --git a/builtins/en/faceted/policies/review.md b/builtins/en/facets/policies/review.md similarity index 100% rename from builtins/en/faceted/policies/review.md rename to builtins/en/facets/policies/review.md diff --git a/builtins/en/faceted/policies/testing.md b/builtins/en/facets/policies/testing.md similarity index 100% rename from builtins/en/faceted/policies/testing.md rename to builtins/en/facets/policies/testing.md diff --git a/builtins/ja/faceted/instructions/ai-fix.md b/builtins/ja/facets/instructions/ai-fix.md similarity index 100% rename from builtins/ja/faceted/instructions/ai-fix.md rename to builtins/ja/facets/instructions/ai-fix.md diff --git a/builtins/ja/faceted/instructions/ai-review.md b/builtins/ja/facets/instructions/ai-review.md similarity index 100% rename from builtins/ja/faceted/instructions/ai-review.md rename to builtins/ja/facets/instructions/ai-review.md diff --git a/builtins/ja/faceted/instructions/arbitrate.md b/builtins/ja/facets/instructions/arbitrate.md similarity index 100% rename from builtins/ja/faceted/instructions/arbitrate.md rename to builtins/ja/facets/instructions/arbitrate.md diff --git a/builtins/ja/faceted/instructions/architect.md b/builtins/ja/facets/instructions/architect.md similarity index 100% rename from builtins/ja/faceted/instructions/architect.md rename to builtins/ja/facets/instructions/architect.md diff --git a/builtins/ja/faceted/instructions/fix-supervisor.md b/builtins/ja/facets/instructions/fix-supervisor.md similarity index 100% rename from builtins/ja/faceted/instructions/fix-supervisor.md rename to builtins/ja/facets/instructions/fix-supervisor.md diff --git a/builtins/ja/faceted/instructions/fix.md b/builtins/ja/facets/instructions/fix.md similarity index 100% rename from builtins/ja/faceted/instructions/fix.md rename to builtins/ja/facets/instructions/fix.md diff --git a/builtins/ja/faceted/instructions/implement-e2e-test.md b/builtins/ja/facets/instructions/implement-e2e-test.md similarity index 100% rename from builtins/ja/faceted/instructions/implement-e2e-test.md rename to builtins/ja/facets/instructions/implement-e2e-test.md diff --git a/builtins/ja/faceted/instructions/implement-test.md b/builtins/ja/facets/instructions/implement-test.md similarity index 100% rename from builtins/ja/faceted/instructions/implement-test.md rename to builtins/ja/facets/instructions/implement-test.md diff --git a/builtins/ja/faceted/instructions/implement.md b/builtins/ja/facets/instructions/implement.md similarity index 100% rename from builtins/ja/faceted/instructions/implement.md rename to builtins/ja/facets/instructions/implement.md diff --git a/builtins/ja/faceted/instructions/loop-monitor-ai-fix.md b/builtins/ja/facets/instructions/loop-monitor-ai-fix.md similarity index 100% rename from builtins/ja/faceted/instructions/loop-monitor-ai-fix.md rename to builtins/ja/facets/instructions/loop-monitor-ai-fix.md diff --git a/builtins/ja/faceted/instructions/plan-e2e-test.md b/builtins/ja/facets/instructions/plan-e2e-test.md similarity index 100% rename from builtins/ja/faceted/instructions/plan-e2e-test.md rename to builtins/ja/facets/instructions/plan-e2e-test.md diff --git a/builtins/ja/faceted/instructions/plan-investigate.md b/builtins/ja/facets/instructions/plan-investigate.md similarity index 100% rename from builtins/ja/faceted/instructions/plan-investigate.md rename to builtins/ja/facets/instructions/plan-investigate.md diff --git a/builtins/ja/faceted/instructions/plan-test.md b/builtins/ja/facets/instructions/plan-test.md similarity index 100% rename from builtins/ja/faceted/instructions/plan-test.md rename to builtins/ja/facets/instructions/plan-test.md diff --git a/builtins/ja/faceted/instructions/plan.md b/builtins/ja/facets/instructions/plan.md similarity index 100% rename from builtins/ja/faceted/instructions/plan.md rename to builtins/ja/facets/instructions/plan.md diff --git a/builtins/ja/faceted/instructions/research-analyze.md b/builtins/ja/facets/instructions/research-analyze.md similarity index 100% rename from builtins/ja/faceted/instructions/research-analyze.md rename to builtins/ja/facets/instructions/research-analyze.md diff --git a/builtins/ja/faceted/instructions/research-dig.md b/builtins/ja/facets/instructions/research-dig.md similarity index 100% rename from builtins/ja/faceted/instructions/research-dig.md rename to builtins/ja/facets/instructions/research-dig.md diff --git a/builtins/ja/faceted/instructions/research-plan.md b/builtins/ja/facets/instructions/research-plan.md similarity index 100% rename from builtins/ja/faceted/instructions/research-plan.md rename to builtins/ja/facets/instructions/research-plan.md diff --git a/builtins/ja/faceted/instructions/research-supervise.md b/builtins/ja/facets/instructions/research-supervise.md similarity index 100% rename from builtins/ja/faceted/instructions/research-supervise.md rename to builtins/ja/facets/instructions/research-supervise.md diff --git a/builtins/ja/faceted/instructions/review-ai.md b/builtins/ja/facets/instructions/review-ai.md similarity index 100% rename from builtins/ja/faceted/instructions/review-ai.md rename to builtins/ja/facets/instructions/review-ai.md diff --git a/builtins/ja/faceted/instructions/review-arch.md b/builtins/ja/facets/instructions/review-arch.md similarity index 100% rename from builtins/ja/faceted/instructions/review-arch.md rename to builtins/ja/facets/instructions/review-arch.md diff --git a/builtins/ja/faceted/instructions/review-cqrs-es.md b/builtins/ja/facets/instructions/review-cqrs-es.md similarity index 100% rename from builtins/ja/faceted/instructions/review-cqrs-es.md rename to builtins/ja/facets/instructions/review-cqrs-es.md diff --git a/builtins/ja/faceted/instructions/review-frontend.md b/builtins/ja/facets/instructions/review-frontend.md similarity index 100% rename from builtins/ja/faceted/instructions/review-frontend.md rename to builtins/ja/facets/instructions/review-frontend.md diff --git a/builtins/ja/faceted/instructions/review-qa.md b/builtins/ja/facets/instructions/review-qa.md similarity index 100% rename from builtins/ja/faceted/instructions/review-qa.md rename to builtins/ja/facets/instructions/review-qa.md diff --git a/builtins/ja/faceted/instructions/review-security.md b/builtins/ja/facets/instructions/review-security.md similarity index 100% rename from builtins/ja/faceted/instructions/review-security.md rename to builtins/ja/facets/instructions/review-security.md diff --git a/builtins/ja/faceted/instructions/review-test.md b/builtins/ja/facets/instructions/review-test.md similarity index 100% rename from builtins/ja/faceted/instructions/review-test.md rename to builtins/ja/facets/instructions/review-test.md diff --git a/builtins/ja/faceted/instructions/supervise.md b/builtins/ja/facets/instructions/supervise.md similarity index 100% rename from builtins/ja/faceted/instructions/supervise.md rename to builtins/ja/facets/instructions/supervise.md diff --git a/builtins/ja/faceted/knowledge/architecture.md b/builtins/ja/facets/knowledge/architecture.md similarity index 100% rename from builtins/ja/faceted/knowledge/architecture.md rename to builtins/ja/facets/knowledge/architecture.md diff --git a/builtins/ja/faceted/knowledge/backend.md b/builtins/ja/facets/knowledge/backend.md similarity index 100% rename from builtins/ja/faceted/knowledge/backend.md rename to builtins/ja/facets/knowledge/backend.md diff --git a/builtins/ja/faceted/knowledge/cqrs-es.md b/builtins/ja/facets/knowledge/cqrs-es.md similarity index 100% rename from builtins/ja/faceted/knowledge/cqrs-es.md rename to builtins/ja/facets/knowledge/cqrs-es.md diff --git a/builtins/ja/faceted/knowledge/frontend.md b/builtins/ja/facets/knowledge/frontend.md similarity index 100% rename from builtins/ja/faceted/knowledge/frontend.md rename to builtins/ja/facets/knowledge/frontend.md diff --git a/builtins/ja/faceted/knowledge/research-comparative.md b/builtins/ja/facets/knowledge/research-comparative.md similarity index 100% rename from builtins/ja/faceted/knowledge/research-comparative.md rename to builtins/ja/facets/knowledge/research-comparative.md diff --git a/builtins/ja/faceted/knowledge/research.md b/builtins/ja/facets/knowledge/research.md similarity index 100% rename from builtins/ja/faceted/knowledge/research.md rename to builtins/ja/facets/knowledge/research.md diff --git a/builtins/ja/faceted/knowledge/security.md b/builtins/ja/facets/knowledge/security.md similarity index 100% rename from builtins/ja/faceted/knowledge/security.md rename to builtins/ja/facets/knowledge/security.md diff --git a/builtins/ja/faceted/output-contracts/ai-review.md b/builtins/ja/facets/output-contracts/ai-review.md similarity index 100% rename from builtins/ja/faceted/output-contracts/ai-review.md rename to builtins/ja/facets/output-contracts/ai-review.md diff --git a/builtins/ja/faceted/output-contracts/architecture-design.md b/builtins/ja/facets/output-contracts/architecture-design.md similarity index 100% rename from builtins/ja/faceted/output-contracts/architecture-design.md rename to builtins/ja/facets/output-contracts/architecture-design.md diff --git a/builtins/ja/faceted/output-contracts/architecture-review.md b/builtins/ja/facets/output-contracts/architecture-review.md similarity index 100% rename from builtins/ja/faceted/output-contracts/architecture-review.md rename to builtins/ja/facets/output-contracts/architecture-review.md diff --git a/builtins/ja/faceted/output-contracts/coder-decisions.md b/builtins/ja/facets/output-contracts/coder-decisions.md similarity index 100% rename from builtins/ja/faceted/output-contracts/coder-decisions.md rename to builtins/ja/facets/output-contracts/coder-decisions.md diff --git a/builtins/ja/faceted/output-contracts/coder-scope.md b/builtins/ja/facets/output-contracts/coder-scope.md similarity index 100% rename from builtins/ja/faceted/output-contracts/coder-scope.md rename to builtins/ja/facets/output-contracts/coder-scope.md diff --git a/builtins/ja/faceted/output-contracts/cqrs-es-review.md b/builtins/ja/facets/output-contracts/cqrs-es-review.md similarity index 100% rename from builtins/ja/faceted/output-contracts/cqrs-es-review.md rename to builtins/ja/facets/output-contracts/cqrs-es-review.md diff --git a/builtins/ja/faceted/output-contracts/frontend-review.md b/builtins/ja/facets/output-contracts/frontend-review.md similarity index 100% rename from builtins/ja/faceted/output-contracts/frontend-review.md rename to builtins/ja/facets/output-contracts/frontend-review.md diff --git a/builtins/ja/faceted/output-contracts/plan.md b/builtins/ja/facets/output-contracts/plan.md similarity index 100% rename from builtins/ja/faceted/output-contracts/plan.md rename to builtins/ja/facets/output-contracts/plan.md diff --git a/builtins/ja/faceted/output-contracts/qa-review.md b/builtins/ja/facets/output-contracts/qa-review.md similarity index 100% rename from builtins/ja/faceted/output-contracts/qa-review.md rename to builtins/ja/facets/output-contracts/qa-review.md diff --git a/builtins/ja/faceted/output-contracts/security-review.md b/builtins/ja/facets/output-contracts/security-review.md similarity index 100% rename from builtins/ja/faceted/output-contracts/security-review.md rename to builtins/ja/facets/output-contracts/security-review.md diff --git a/builtins/ja/faceted/output-contracts/summary.md b/builtins/ja/facets/output-contracts/summary.md similarity index 100% rename from builtins/ja/faceted/output-contracts/summary.md rename to builtins/ja/facets/output-contracts/summary.md diff --git a/builtins/ja/faceted/output-contracts/supervisor-validation.md b/builtins/ja/facets/output-contracts/supervisor-validation.md similarity index 100% rename from builtins/ja/faceted/output-contracts/supervisor-validation.md rename to builtins/ja/facets/output-contracts/supervisor-validation.md diff --git a/builtins/ja/faceted/output-contracts/test-plan.md b/builtins/ja/facets/output-contracts/test-plan.md similarity index 100% rename from builtins/ja/faceted/output-contracts/test-plan.md rename to builtins/ja/facets/output-contracts/test-plan.md diff --git a/builtins/ja/faceted/output-contracts/validation.md b/builtins/ja/facets/output-contracts/validation.md similarity index 100% rename from builtins/ja/faceted/output-contracts/validation.md rename to builtins/ja/facets/output-contracts/validation.md diff --git a/builtins/ja/faceted/personas/ai-antipattern-reviewer.md b/builtins/ja/facets/personas/ai-antipattern-reviewer.md similarity index 100% rename from builtins/ja/faceted/personas/ai-antipattern-reviewer.md rename to builtins/ja/facets/personas/ai-antipattern-reviewer.md diff --git a/builtins/ja/faceted/personas/architect-planner.md b/builtins/ja/facets/personas/architect-planner.md similarity index 100% rename from builtins/ja/faceted/personas/architect-planner.md rename to builtins/ja/facets/personas/architect-planner.md diff --git a/builtins/ja/faceted/personas/architecture-reviewer.md b/builtins/ja/facets/personas/architecture-reviewer.md similarity index 100% rename from builtins/ja/faceted/personas/architecture-reviewer.md rename to builtins/ja/facets/personas/architecture-reviewer.md diff --git a/builtins/ja/faceted/personas/balthasar.md b/builtins/ja/facets/personas/balthasar.md similarity index 100% rename from builtins/ja/faceted/personas/balthasar.md rename to builtins/ja/facets/personas/balthasar.md diff --git a/builtins/ja/faceted/personas/casper.md b/builtins/ja/facets/personas/casper.md similarity index 100% rename from builtins/ja/faceted/personas/casper.md rename to builtins/ja/facets/personas/casper.md diff --git a/builtins/ja/faceted/personas/coder.md b/builtins/ja/facets/personas/coder.md similarity index 100% rename from builtins/ja/faceted/personas/coder.md rename to builtins/ja/facets/personas/coder.md diff --git a/builtins/ja/faceted/personas/conductor.md b/builtins/ja/facets/personas/conductor.md similarity index 100% rename from builtins/ja/faceted/personas/conductor.md rename to builtins/ja/facets/personas/conductor.md diff --git a/builtins/ja/faceted/personas/cqrs-es-reviewer.md b/builtins/ja/facets/personas/cqrs-es-reviewer.md similarity index 100% rename from builtins/ja/faceted/personas/cqrs-es-reviewer.md rename to builtins/ja/facets/personas/cqrs-es-reviewer.md diff --git a/builtins/ja/faceted/personas/expert-supervisor.md b/builtins/ja/facets/personas/expert-supervisor.md similarity index 100% rename from builtins/ja/faceted/personas/expert-supervisor.md rename to builtins/ja/facets/personas/expert-supervisor.md diff --git a/builtins/ja/faceted/personas/frontend-reviewer.md b/builtins/ja/facets/personas/frontend-reviewer.md similarity index 100% rename from builtins/ja/faceted/personas/frontend-reviewer.md rename to builtins/ja/facets/personas/frontend-reviewer.md diff --git a/builtins/ja/faceted/personas/melchior.md b/builtins/ja/facets/personas/melchior.md similarity index 100% rename from builtins/ja/faceted/personas/melchior.md rename to builtins/ja/facets/personas/melchior.md diff --git a/builtins/ja/faceted/personas/planner.md b/builtins/ja/facets/personas/planner.md similarity index 100% rename from builtins/ja/faceted/personas/planner.md rename to builtins/ja/facets/personas/planner.md diff --git a/builtins/ja/faceted/personas/pr-commenter.md b/builtins/ja/facets/personas/pr-commenter.md similarity index 100% rename from builtins/ja/faceted/personas/pr-commenter.md rename to builtins/ja/facets/personas/pr-commenter.md diff --git a/builtins/ja/faceted/personas/qa-reviewer.md b/builtins/ja/facets/personas/qa-reviewer.md similarity index 100% rename from builtins/ja/faceted/personas/qa-reviewer.md rename to builtins/ja/facets/personas/qa-reviewer.md diff --git a/builtins/ja/faceted/personas/research-analyzer.md b/builtins/ja/facets/personas/research-analyzer.md similarity index 100% rename from builtins/ja/faceted/personas/research-analyzer.md rename to builtins/ja/facets/personas/research-analyzer.md diff --git a/builtins/ja/faceted/personas/research-digger.md b/builtins/ja/facets/personas/research-digger.md similarity index 100% rename from builtins/ja/faceted/personas/research-digger.md rename to builtins/ja/facets/personas/research-digger.md diff --git a/builtins/ja/faceted/personas/research-planner.md b/builtins/ja/facets/personas/research-planner.md similarity index 100% rename from builtins/ja/faceted/personas/research-planner.md rename to builtins/ja/facets/personas/research-planner.md diff --git a/builtins/ja/faceted/personas/research-supervisor.md b/builtins/ja/facets/personas/research-supervisor.md similarity index 100% rename from builtins/ja/faceted/personas/research-supervisor.md rename to builtins/ja/facets/personas/research-supervisor.md diff --git a/builtins/ja/faceted/personas/security-reviewer.md b/builtins/ja/facets/personas/security-reviewer.md similarity index 100% rename from builtins/ja/faceted/personas/security-reviewer.md rename to builtins/ja/facets/personas/security-reviewer.md diff --git a/builtins/ja/faceted/personas/supervisor.md b/builtins/ja/facets/personas/supervisor.md similarity index 100% rename from builtins/ja/faceted/personas/supervisor.md rename to builtins/ja/facets/personas/supervisor.md diff --git a/builtins/ja/faceted/personas/test-planner.md b/builtins/ja/facets/personas/test-planner.md similarity index 100% rename from builtins/ja/faceted/personas/test-planner.md rename to builtins/ja/facets/personas/test-planner.md diff --git a/builtins/ja/faceted/policies/ai-antipattern.md b/builtins/ja/facets/policies/ai-antipattern.md similarity index 100% rename from builtins/ja/faceted/policies/ai-antipattern.md rename to builtins/ja/facets/policies/ai-antipattern.md diff --git a/builtins/ja/faceted/policies/coding.md b/builtins/ja/facets/policies/coding.md similarity index 100% rename from builtins/ja/faceted/policies/coding.md rename to builtins/ja/facets/policies/coding.md diff --git a/builtins/ja/faceted/policies/qa.md b/builtins/ja/facets/policies/qa.md similarity index 100% rename from builtins/ja/faceted/policies/qa.md rename to builtins/ja/facets/policies/qa.md diff --git a/builtins/ja/faceted/policies/research.md b/builtins/ja/facets/policies/research.md similarity index 100% rename from builtins/ja/faceted/policies/research.md rename to builtins/ja/facets/policies/research.md diff --git a/builtins/ja/faceted/policies/review.md b/builtins/ja/facets/policies/review.md similarity index 100% rename from builtins/ja/faceted/policies/review.md rename to builtins/ja/facets/policies/review.md diff --git a/builtins/ja/faceted/policies/testing.md b/builtins/ja/facets/policies/testing.md similarity index 100% rename from builtins/ja/faceted/policies/testing.md rename to builtins/ja/facets/policies/testing.md diff --git a/docs/takt-pack-spec.md b/docs/takt-pack-spec.md index 9176639..51b1a98 100644 --- a/docs/takt-pack-spec.md +++ b/docs/takt-pack-spec.md @@ -44,7 +44,7 @@ takt: ``` {path}/ - faceted/ # ファセット(部品ライブラリ) + facets/ # ファセット(部品ライブラリ) personas/ # WHO: ペルソナプロンプト policies/ # HOW: 判断基準・ポリシー knowledge/ # WHAT TO KNOW: ドメイン知識 @@ -53,7 +53,7 @@ takt: pieces/ # ピース(ワークフロー定義) ``` -`faceted/` と `pieces/` の両方が存在する必要はありません。ファセットのみ、ピースのみのパッケージも有効です。ただし、どちらも存在しない場合はエラーとなります(空パッケージは許容しません)。 +`facets/` と `pieces/` の両方が存在する必要はありません。ファセットのみ、ピースのみのパッケージも有効です。ただし、どちらも存在しない場合はエラーとなります(空パッケージは許容しません)。 #### takt.min_version @@ -74,7 +74,7 @@ takt: ``` {package-root}/ - faceted/ # ファセット群 + facets/ # ファセット群 personas/ expert-coder.md security-reviewer.md @@ -125,7 +125,7 @@ takt ensemble add github:{owner}/{repo}@{commit-sha} # コミットSHA指定 1. gh api repos/{owner}/{repo}/tarball/{ref} → /tmp/takt-import-xxxxx.tar.gz 2. tar 展開(filter: .md/.yaml/.yml のみ、lstat でシンボリックリンクをスキップ)→ /tmp/takt-import-xxxxx/ 3. takt-pack.yaml を読み取り → path 確定、バリデーション -4. {path}/faceted/ と {path}/pieces/ を ~/.takt/ensemble/@{owner}/{repo}/ にコピー +4. {path}/facets/ と {path}/pieces/ を ~/.takt/ensemble/@{owner}/{repo}/ にコピー 5. .takt-pack-lock.yaml を生成 6. rm -rf /tmp/takt-import-xxxxx* ``` @@ -149,7 +149,7 @@ imported_at: 2026-02-20T12:00:00Z ~/.takt/ensemble/@{owner}/{repo}/ takt-pack.yaml # 元の誘導ファイル(メタデータ参照用に保持) .takt-pack-lock.yaml # 取り込み元情報(自動生成) - faceted/ + facets/ pieces/ ``` @@ -173,7 +173,7 @@ takt ensemble add github:nrslib/takt-fullstack@v1.2.0 | 項目 | 内容 | |------|------| | パッケージ情報 | owner/repo、ref | -| ファセット数 | faceted/ の種別ごとのファイル数 | +| ファセット数 | facets/ の種別ごとのファイル数 | | ピース一覧 | pieces/ 内のピース名 | | 権限警告 | 各ピースの `edit`、`allowed_tools`、`required_permission_mode` を表示 | @@ -242,7 +242,7 @@ takt ensemble list ``` github:nrslib/takt-security-facets ├── takt-pack.yaml -└── faceted/ +└── facets/ ├── personas/ │ └── security-reviewer.md ├── policies/ @@ -279,11 +279,11 @@ takt ensemble add github:nrslib/takt-security-facets 5. コピーされるファイル: /tmp/.../takt-pack.yaml → ~/.takt/ensemble/@nrslib/takt-security-facets/takt-pack.yaml - /tmp/.../faceted/personas/... → ~/.takt/ensemble/@nrslib/takt-security-facets/faceted/personas/... - /tmp/.../faceted/policies/... → ~/.takt/ensemble/@nrslib/takt-security-facets/faceted/policies/... - /tmp/.../faceted/knowledge/... → ~/.takt/ensemble/@nrslib/takt-security-facets/faceted/knowledge/... + /tmp/.../facets/personas/... → ~/.takt/ensemble/@nrslib/takt-security-facets/facets/personas/... + /tmp/.../facets/policies/... → ~/.takt/ensemble/@nrslib/takt-security-facets/facets/policies/... + /tmp/.../facets/knowledge/... → ~/.takt/ensemble/@nrslib/takt-security-facets/facets/knowledge/... - ※ faceted/, pieces/ のみスキャン。それ以外のディレクトリは無視 + ※ facets/, pieces/ のみスキャン。それ以外のディレクトリは無視 6. .takt-pack-lock.yaml を生成 @@ -299,7 +299,7 @@ takt ensemble add github:nrslib/takt-security-facets takt-security-facets/ takt-pack.yaml .takt-pack-lock.yaml - faceted/ + facets/ personas/ security-reviewer.md policies/ @@ -335,7 +335,7 @@ movements: ``` github:nrslib/takt-fullstack ├── takt-pack.yaml -├── faceted/ +├── facets/ │ ├── personas/ │ │ ├── expert-coder.md │ │ └── architecture-reviewer.md @@ -361,9 +361,9 @@ description: フルスタック開発ワークフロー(ファセット + ピ name: expert movements: - name: implement - persona: expert-coder # → faceted/personas/expert-coder.md - policy: strict-coding # → faceted/policies/strict-coding.md - knowledge: design-patterns # → faceted/knowledge/design-patterns.md + persona: expert-coder # → facets/personas/expert-coder.md + policy: strict-coding # → facets/policies/strict-coding.md + knowledge: design-patterns # → facets/knowledge/design-patterns.md # ... - name: review persona: architecture-reviewer @@ -389,13 +389,13 @@ takt ensemble add github:nrslib/takt-fullstack 4. コピーされるファイル: /tmp/.../takt-pack.yaml → ~/.takt/ensemble/@nrslib/takt-fullstack/takt-pack.yaml - /tmp/.../faceted/personas/... → ~/.takt/ensemble/@nrslib/takt-fullstack/faceted/personas/... - /tmp/.../faceted/policies/... → ~/.takt/ensemble/@nrslib/takt-fullstack/faceted/policies/... - /tmp/.../faceted/knowledge/... → ~/.takt/ensemble/@nrslib/takt-fullstack/faceted/knowledge/... + /tmp/.../facets/personas/... → ~/.takt/ensemble/@nrslib/takt-fullstack/facets/personas/... + /tmp/.../facets/policies/... → ~/.takt/ensemble/@nrslib/takt-fullstack/facets/policies/... + /tmp/.../facets/knowledge/... → ~/.takt/ensemble/@nrslib/takt-fullstack/facets/knowledge/... /tmp/.../pieces/expert.yaml → ~/.takt/ensemble/@nrslib/takt-fullstack/pieces/expert.yaml /tmp/.../pieces/expert-mini.yaml → ~/.takt/ensemble/@nrslib/takt-fullstack/pieces/expert-mini.yaml - ※ faceted/, pieces/ のみスキャン。それ以外のディレクトリは無視 + ※ facets/, pieces/ のみスキャン。それ以外のディレクトリは無視 5. .takt-pack-lock.yaml を生成 @@ -411,7 +411,7 @@ takt ensemble add github:nrslib/takt-fullstack takt-fullstack/ takt-pack.yaml .takt-pack-lock.yaml - faceted/ + facets/ personas/ expert-coder.md architecture-reviewer.md @@ -434,14 +434,14 @@ takt -w @nrslib/takt-fullstack/expert "認証機能を実装して" ``` ピースの `pieceDir` は `~/.takt/ensemble/@nrslib/takt-fullstack/pieces/` になります。 -ピース内の名前ベース参照(`persona: expert-coder`)は、パッケージローカルの `faceted/` から解決されます。 +ピース内の名前ベース参照(`persona: expert-coder`)は、パッケージローカルの `facets/` から解決されます。 解決チェーン: ``` -1. package-local: ~/.takt/ensemble/@nrslib/takt-fullstack/faceted/personas/expert-coder.md ← HIT -2. project: .takt/faceted/personas/expert-coder.md -3. user: ~/.takt/faceted/personas/expert-coder.md -4. builtin: builtins/{lang}/faceted/personas/expert-coder.md +1. package-local: ~/.takt/ensemble/@nrslib/takt-fullstack/facets/personas/expert-coder.md ← HIT +2. project: .takt/facets/personas/expert-coder.md +3. user: ~/.takt/facets/personas/expert-coder.md +4. builtin: builtins/{lang}/facets/personas/expert-coder.md ``` **B. ファセットだけ自分のピースで使う** @@ -470,7 +470,7 @@ github:someone/dotfiles ├── zsh/ │ └── .zshrc └── takt/ # ← TAKT パッケージはここだけ - ├── faceted/ + ├── facets/ │ └── personas/ │ └── my-coder.md └── pieces/ @@ -506,10 +506,10 @@ takt ensemble add github:someone/dotfiles 5. コピーされるファイル: /tmp/.../takt-pack.yaml → ~/.takt/ensemble/@someone/dotfiles/takt-pack.yaml - /tmp/.../takt/faceted/personas/my-coder.md → ~/.takt/ensemble/@someone/dotfiles/faceted/personas/my-coder.md + /tmp/.../takt/facets/personas/my-coder.md → ~/.takt/ensemble/@someone/dotfiles/facets/personas/my-coder.md /tmp/.../takt/pieces/my-workflow.yaml → ~/.takt/ensemble/@someone/dotfiles/pieces/my-workflow.yaml - ※ faceted/, pieces/ のみスキャン。vim/, zsh/ 等は無視 + ※ facets/, pieces/ のみスキャン。vim/, zsh/ 等は無視 6. .takt-pack-lock.yaml を生成 @@ -620,7 +620,7 @@ y → rm -rf ~/.takt/ensemble/@nrslib/takt-fullstack/ 解決先: ``` -~/.takt/ensemble/@{owner}/{repo}/faceted/{facet-type}/{facet-name}.md +~/.takt/ensemble/@{owner}/{repo}/facets/{facet-type}/{facet-name}.md ``` `{facet-type}` はコンテキストから決まります。 @@ -636,7 +636,7 @@ y → rm -rf ~/.takt/ensemble/@nrslib/takt-fullstack/ 例: ```yaml persona: "@nrslib/takt-fullstack/expert-coder" -# → ~/.takt/ensemble/@nrslib/takt-fullstack/faceted/personas/expert-coder.md +# → ~/.takt/ensemble/@nrslib/takt-fullstack/facets/personas/expert-coder.md ``` ### ピース参照 @@ -662,17 +662,17 @@ takt -w @nrslib/takt-fullstack/expert "タスク内容" パッケージ内ピースの場合: ``` -1. package-local ~/.takt/ensemble/@{owner}/{repo}/faceted/{type}/{facet}.md -2. project .takt/faceted/{type}/{facet}.md -3. user ~/.takt/faceted/{type}/{facet}.md -4. builtin builtins/{lang}/faceted/{type}/{facet}.md +1. package-local ~/.takt/ensemble/@{owner}/{repo}/facets/{type}/{facet}.md +2. project .takt/facets/{type}/{facet}.md +3. user ~/.takt/facets/{type}/{facet}.md +4. builtin builtins/{lang}/facets/{type}/{facet}.md ``` 非パッケージピースの場合(ユーザー自身のピース、builtin ピース): ``` -1. project .takt/faceted/{type}/{facet}.md -2. user ~/.takt/faceted/{type}/{facet}.md -3. builtin builtins/{lang}/faceted/{type}/{facet}.md +1. project .takt/facets/{type}/{facet}.md +2. user ~/.takt/facets/{type}/{facet}.md +3. builtin builtins/{lang}/facets/{type}/{facet}.md ``` パッケージのファセットはグローバル名前解決に入りません。他パッケージのファセットを使いたい場合は `@scope` 参照で明示的に指定してください。 @@ -685,7 +685,7 @@ takt -w @nrslib/takt-fullstack/expert "タスク内容" pieceDir が ~/.takt/ensemble/@{owner}/{repo}/pieces/ 配下 → パッケージ @{owner}/{repo} に所属 → package-local 解決チェーンが有効化 - → candidateDirs の先頭に ~/.takt/ensemble/@{owner}/{repo}/faceted/{type}/ を追加 + → candidateDirs の先頭に ~/.takt/ensemble/@{owner}/{repo}/facets/{type}/ を追加 ``` `~/.takt/ensemble/` 配下でなければパッケージ所属なし(既存の3層解決チェーンのまま)。 @@ -697,7 +697,7 @@ pieceDir が ~/.takt/ensemble/@{owner}/{repo}/pieces/ 配下 | `takt-pack.yaml` がリポジトリルートに存在しない | エラー終了。メッセージ表示 | | `path` が絶対パスまたは `..` でリポジトリ外を参照 | エラー終了 | | `path` が指すディレクトリが存在しない | エラー終了 | -| `path` 先に `faceted/` も `pieces/` もない | エラー終了(空パッケージは不許可) | +| `path` 先に `facets/` も `pieces/` もない | エラー終了(空パッケージは不許可) | | `takt.min_version` が SemVer 形式でない | エラー終了。`{major}.{minor}.{patch}` 形式を要求 | | `takt.min_version` が現在の TAKT より新しい | エラー終了。必要バージョンと現在バージョンを表示 | @@ -705,11 +705,11 @@ pieceDir が ~/.takt/ensemble/@{owner}/{repo}/pieces/ 配下 ### コピー対象ディレクトリの制限 -`{path}/` 直下の `faceted/` と `pieces/` のみをスキャンします。それ以外のディレクトリ(README、テスト、CI設定等)は無視されます。`takt-pack.yaml` はリポジトリルートから常にコピーします。 +`{path}/` 直下の `facets/` と `pieces/` のみをスキャンします。それ以外のディレクトリ(README、テスト、CI設定等)は無視されます。`takt-pack.yaml` はリポジトリルートから常にコピーします。 ``` コピー対象: - {path}/faceted/** → ~/.takt/ensemble/@{owner}/{repo}/faceted/ + {path}/facets/** → ~/.takt/ensemble/@{owner}/{repo}/facets/ {path}/pieces/** → ~/.takt/ensemble/@{owner}/{repo}/pieces/ takt-pack.yaml → ~/.takt/ensemble/@{owner}/{repo}/takt-pack.yaml @@ -750,7 +750,7 @@ tar.extract({ 展開後のコピー処理: ``` -ALLOWED_DIRS = ['faceted', 'pieces'] +ALLOWED_DIRS = ['facets', 'pieces'] for each dir in ALLOWED_DIRS: if not exists(join(packageRoot, dir)) → skip @@ -799,7 +799,7 @@ for each dir in ALLOWED_DIRS: && !packageRoot.startsWith(extractRoot + '/') → エラー # 末尾に '/' を付けて比較することで /tmp/repo と /tmp/repo2 の誤判定を防ぐ -5. コピー走査時(faceted/, pieces/ 配下) +5. コピー走査時(facets/, pieces/ 配下) for each file: if lstat(file).isSymbolicLink() → skip # defence-in-depth if file.size > MAX_FILE_SIZE → skip @@ -860,7 +860,7 @@ takt switch ## builtin の構造変更 -この機能の導入に伴い、builtin ディレクトリ構造を `faceted/` + `pieces/` の2層構造に改修します。 +この機能の導入に伴い、builtin ディレクトリ構造を `facets/` + `pieces/` の2層構造に改修します。 ### 変更前(現行構造) @@ -902,7 +902,7 @@ builtins/{lang}/ ``` builtins/{lang}/ - faceted/ # ← ファセットを faceted/ 配下に集約 + facets/ # ← ファセットを facets/ 配下に集約 personas/ coder.md planner.md @@ -938,7 +938,7 @@ builtins/{lang}/ | ファイル | 変更内容 | |---------|---------| -| `src/infra/config/paths.ts` | `getBuiltinFacetDir()`, `getGlobalFacetDir()`, `getProjectFacetDir()` のパス構築に `faceted/` を追加 | +| `src/infra/config/paths.ts` | `getBuiltinFacetDir()`, `getGlobalFacetDir()`, `getProjectFacetDir()` のパス構築に `facets/` を追加 | | `src/infra/config/loaders/resource-resolver.ts` | `buildCandidateDirs()` が返すディレクトリパスの更新 | | `src/features/catalog/catalogFacets.ts` | `getFacetDirs()` のパス構築の更新 | | `src/infra/config/loaders/pieceResolver.ts` | パッケージ層の解決ロジック追加(`@scope` 対応)、`loadAllPiecesWithSources()` のパッケージスキャン | @@ -952,12 +952,12 @@ builtins/{lang}/ ```bash # 移行例 -mkdir -p ~/.takt/faceted -mv ~/.takt/personas ~/.takt/faceted/personas -mv ~/.takt/policies ~/.takt/faceted/policies -mv ~/.takt/knowledge ~/.takt/faceted/knowledge -mv ~/.takt/instructions ~/.takt/faceted/instructions -mv ~/.takt/output-contracts ~/.takt/faceted/output-contracts +mkdir -p ~/.takt/facets +mv ~/.takt/personas ~/.takt/facets/personas +mv ~/.takt/policies ~/.takt/facets/policies +mv ~/.takt/knowledge ~/.takt/facets/knowledge +mv ~/.takt/instructions ~/.takt/facets/instructions +mv ~/.takt/output-contracts ~/.takt/facets/output-contracts ``` プロジェクトレベル(`.takt/`)も同様です。 @@ -967,8 +967,8 @@ mv ~/.takt/output-contracts ~/.takt/faceted/output-contracts 名前ベース参照(影響なし): ```yaml -persona: coder # リゾルバが faceted/personas/coder.md を探す -policy: coding # リゾルバが faceted/policies/coding.md を探す +persona: coder # リゾルバが facets/personas/coder.md を探す +policy: coding # リゾルバが facets/policies/coding.md を探す ``` リゾルバの内部パスが変わるだけで、ピース YAML の修正は不要です。 @@ -982,7 +982,7 @@ personas: # 変更後 personas: - coder: ../faceted/personas/coder.md + coder: ../facets/personas/coder.md ``` ピースの `personas:` セクションマップで相対パスを使用している場合のみ修正が必要です。builtin のピースは名前ベース参照を使用しているため、影響を受けません。 @@ -991,7 +991,7 @@ personas: ``` ~/.takt/ - faceted/ # ユーザー自身のファセット + facets/ # ユーザー自身のファセット personas/ policies/ knowledge/ @@ -1003,7 +1003,7 @@ personas: takt-fullstack/ takt-pack.yaml .takt-pack-lock.yaml - faceted/ + facets/ personas/ policies/ knowledge/ @@ -1012,13 +1012,13 @@ personas: takt-security-facets/ takt-pack.yaml .takt-pack-lock.yaml - faceted/ + facets/ personas/ policies/ knowledge/ builtins/{lang}/ - faceted/ # ビルトインファセット + facets/ # ビルトインファセット personas/ policies/ knowledge/ @@ -1032,9 +1032,9 @@ builtins/{lang}/ ファセット解決の全体チェーン: ``` -@scope 参照 → ensemble/@{owner}/{repo}/faceted/ で直接解決 -名前参照 → project .takt/faceted/ → user ~/.takt/faceted/ → builtin faceted/ -pkg内名前参照 → package-local faceted/ → project → user → builtin +@scope 参照 → ensemble/@{owner}/{repo}/facets/ で直接解決 +名前参照 → project .takt/facets/ → user ~/.takt/facets/ → builtin facets/ +pkg内名前参照 → package-local facets/ → project → user → builtin ``` ## テスト戦略 diff --git a/e2e/specs/ensemble.e2e.ts b/e2e/specs/ensemble.e2e.ts index f1425d8..f449d11 100644 --- a/e2e/specs/ensemble.e2e.ts +++ b/e2e/specs/ensemble.e2e.ts @@ -6,7 +6,7 @@ * fill in the callbacks when the implementation lands. * * GitHub fixture repos used: - * - github:nrslib/takt-pack-fixture (standard: faceted/ + pieces/) + * - github:nrslib/takt-pack-fixture (standard: facets/ + pieces/) * - github:nrslib/takt-pack-fixture-subdir (path field specified) * - github:nrslib/takt-pack-fixture-facets-only (facets only, no pieces/) * @@ -23,7 +23,7 @@ describe('E2E: takt ensemble add (正常系)', () => { // Given: 空の isolatedEnv // When: takt ensemble add github:nrslib/takt-pack-fixture@v1.0.0、y 入力 // Then: {taktDir}/ensemble/@nrslib/takt-pack-fixture/ に takt-pack.yaml, - // .takt-pack-lock.yaml, faceted/, pieces/ が存在する + // .takt-pack-lock.yaml, facets/, pieces/ が存在する it.todo('should install standard package and verify directory structure'); // E2: lock ファイルのフィールド確認 @@ -41,7 +41,7 @@ describe('E2E: takt ensemble add (正常系)', () => { // E4: ファセットのみパッケージのインポート // Given: 空の isolatedEnv // When: takt ensemble add github:nrslib/takt-pack-fixture-facets-only@v1.0.0、y 入力 - // Then: faceted/ は存在し、pieces/ ディレクトリは存在しない + // Then: facets/ は存在し、pieces/ ディレクトリは存在しない it.todo('should install facets-only package without creating pieces/ directory'); // E4b: コミットSHA指定 @@ -128,11 +128,11 @@ describe('E2E: takt ensemble add (バリデーション・エラー系)', () => // Then: exit code 非0 it.todo('should reject takt-pack.yaml with path traversal via ".." segments'); - // E16: 空パッケージ(faceted/ も pieces/ もない) - // Given: faceted/, pieces/ のどちらもない takt-pack.yaml + // E16: 空パッケージ(facets/ も pieces/ もない) + // Given: facets/, pieces/ のどちらもない takt-pack.yaml // When: ensemble add // Then: exit code 非0 - it.todo('should reject package with neither faceted/ nor pieces/ directory'); + it.todo('should reject package with neither facets/ nor pieces/ directory'); // E17: min_version 不正形式(1.0、セグメント不足) // Given: takt.min_version: "1.0" diff --git a/src/__tests__/catalog.test.ts b/src/__tests__/catalog.test.ts index fb0cd24..a9ea46a 100644 --- a/src/__tests__/catalog.test.ts +++ b/src/__tests__/catalog.test.ts @@ -37,9 +37,9 @@ let mockGlobalDir: string; vi.mock('../infra/config/paths.js', () => ({ getGlobalConfigDir: () => mockGlobalDir, getProjectConfigDir: (cwd: string) => join(cwd, '.takt'), - getGlobalFacetDir: (facetType: string) => join(mockGlobalDir, 'faceted', facetType), - getProjectFacetDir: (cwd: string, facetType: string) => join(cwd, '.takt', 'faceted', facetType), - getBuiltinFacetDir: (_lang: string, facetType: string) => join(mockBuiltinDir, 'faceted', facetType), + getGlobalFacetDir: (facetType: string) => join(mockGlobalDir, 'facets', facetType), + getProjectFacetDir: (cwd: string, facetType: string) => join(cwd, '.takt', 'facets', facetType), + getBuiltinFacetDir: (_lang: string, facetType: string) => join(mockBuiltinDir, 'facets', facetType), })); describe('parseFacetType', () => { @@ -134,9 +134,9 @@ describe('scanFacets', () => { it('should collect facets from all three layers', () => { // Given: facets in builtin, user, and project layers - const builtinPersonas = join(builtinDir, 'faceted', 'personas'); - const globalPersonas = join(globalDir, 'faceted', 'personas'); - const projectPersonas = join(projectDir, '.takt', 'faceted', 'personas'); + const builtinPersonas = join(builtinDir, 'facets', 'personas'); + const globalPersonas = join(globalDir, 'facets', 'personas'); + const projectPersonas = join(projectDir, '.takt', 'facets', 'personas'); mkdirSync(builtinPersonas, { recursive: true }); mkdirSync(globalPersonas, { recursive: true }); mkdirSync(projectPersonas, { recursive: true }); @@ -167,8 +167,8 @@ describe('scanFacets', () => { it('should detect override when higher layer has same name', () => { // Given: same facet name in builtin and user layers - const builtinPersonas = join(builtinDir, 'faceted', 'personas'); - const globalPersonas = join(globalDir, 'faceted', 'personas'); + const builtinPersonas = join(builtinDir, 'facets', 'personas'); + const globalPersonas = join(globalDir, 'facets', 'personas'); mkdirSync(builtinPersonas, { recursive: true }); mkdirSync(globalPersonas, { recursive: true }); @@ -190,8 +190,8 @@ describe('scanFacets', () => { it('should detect override through project layer', () => { // Given: same facet name in builtin and project layers - const builtinPolicies = join(builtinDir, 'faceted', 'policies'); - const projectPolicies = join(projectDir, '.takt', 'faceted', 'policies'); + const builtinPolicies = join(builtinDir, 'facets', 'policies'); + const projectPolicies = join(projectDir, '.takt', 'facets', 'policies'); mkdirSync(builtinPolicies, { recursive: true }); mkdirSync(projectPolicies, { recursive: true }); @@ -218,7 +218,7 @@ describe('scanFacets', () => { it('should only include .md files', () => { // Given: directory with mixed file types - const builtinKnowledge = join(builtinDir, 'faceted', 'knowledge'); + const builtinKnowledge = join(builtinDir, 'facets', 'knowledge'); mkdirSync(builtinKnowledge, { recursive: true }); writeFileSync(join(builtinKnowledge, 'valid.md'), '# Valid'); @@ -237,7 +237,7 @@ describe('scanFacets', () => { // Given: one facet in each type directory const types = ['personas', 'policies', 'knowledge', 'instructions', 'output-contracts'] as const; for (const type of types) { - const dir = join(builtinDir, 'faceted', type); + const dir = join(builtinDir, 'facets', type); mkdirSync(dir, { recursive: true }); writeFileSync(join(dir, 'test.md'), `# Test ${type}`); } @@ -331,7 +331,7 @@ describe('showCatalog', () => { it('should display only the specified facet type when valid type is given', () => { // Given: personas facet exists - const builtinPersonas = join(builtinDir, 'faceted', 'personas'); + const builtinPersonas = join(builtinDir, 'facets', 'personas'); mkdirSync(builtinPersonas, { recursive: true }); writeFileSync(join(builtinPersonas, 'coder.md'), '# Coder Agent'); diff --git a/src/__tests__/ensemble-scope-resolver.test.ts b/src/__tests__/ensemble-scope-resolver.test.ts index 47fef9d..02cef2c 100644 --- a/src/__tests__/ensemble-scope-resolver.test.ts +++ b/src/__tests__/ensemble-scope-resolver.test.ts @@ -8,7 +8,7 @@ * * @scope resolution rules: * "@{owner}/{repo}/{name}" in a facet field → - * {ensembleDir}/@{owner}/{repo}/faceted/{type}/{name}.md + * {ensembleDir}/@{owner}/{repo}/facets/{type}/{name}.md * * Name constraints: * owner: /^[a-z0-9][a-z0-9-]*$/ (lowercase only after normalization) @@ -16,10 +16,10 @@ * facet/piece name: /^[a-z0-9][a-z0-9-]*$/ * * Facet resolution order (package piece): - * 1. package-local: {ensembleDir}/@{owner}/{repo}/faceted/{type}/{facet}.md - * 2. project: .takt/faceted/{type}/{facet}.md - * 3. user: ~/.takt/faceted/{type}/{facet}.md - * 4. builtin: builtins/{lang}/faceted/{type}/{facet}.md + * 1. package-local: {ensembleDir}/@{owner}/{repo}/facets/{type}/{facet}.md + * 2. project: .takt/facets/{type}/{facet}.md + * 3. user: ~/.takt/facets/{type}/{facet}.md + * 4. builtin: builtins/{lang}/facets/{type}/{facet}.md * * Facet resolution order (non-package piece): * 1. project → 2. user → 3. builtin (package-local is NOT consulted) @@ -56,27 +56,27 @@ describe('@scope reference resolution', () => { // U34: persona @scope 解決 // Input: "@nrslib/takt-pack-fixture/expert-coder" (personas field) - // Expect: resolves to {ensembleDir}/@nrslib/takt-pack-fixture/faceted/personas/expert-coder.md + // Expect: resolves to {ensembleDir}/@nrslib/takt-pack-fixture/facets/personas/expert-coder.md it('should resolve persona @scope reference to ensemble faceted path', () => { const ensembleDir = tempDir; const ref = '@nrslib/takt-pack-fixture/expert-coder'; const scopeRef = parseScopeRef(ref); const resolved = resolveScopeRef(scopeRef, 'personas', ensembleDir); - const expected = join(ensembleDir, '@nrslib', 'takt-pack-fixture', 'faceted', 'personas', 'expert-coder.md'); + const expected = join(ensembleDir, '@nrslib', 'takt-pack-fixture', 'facets', 'personas', 'expert-coder.md'); expect(resolved).toBe(expected); }); // U35: policy @scope 解決 // Input: "@nrslib/takt-pack-fixture/strict-coding" (policies field) - // Expect: resolves to {ensembleDir}/@nrslib/takt-pack-fixture/faceted/policies/strict-coding.md + // Expect: resolves to {ensembleDir}/@nrslib/takt-pack-fixture/facets/policies/strict-coding.md it('should resolve policy @scope reference to ensemble faceted path', () => { const ensembleDir = tempDir; const ref = '@nrslib/takt-pack-fixture/strict-coding'; const scopeRef = parseScopeRef(ref); const resolved = resolveScopeRef(scopeRef, 'policies', ensembleDir); - const expected = join(ensembleDir, '@nrslib', 'takt-pack-fixture', 'faceted', 'policies', 'strict-coding.md'); + const expected = join(ensembleDir, '@nrslib', 'takt-pack-fixture', 'facets', 'policies', 'strict-coding.md'); expect(resolved).toBe(expected); }); @@ -93,7 +93,7 @@ describe('@scope reference resolution', () => { expect(scopeRef.repo).toBe('takt-pack-fixture'); const resolved = resolveScopeRef(scopeRef, 'personas', ensembleDir); - const expected = join(ensembleDir, '@nrslib', 'takt-pack-fixture', 'faceted', 'personas', 'expert-coder.md'); + const expected = join(ensembleDir, '@nrslib', 'takt-pack-fixture', 'facets', 'personas', 'expert-coder.md'); expect(resolved).toBe(expected); }); @@ -179,8 +179,8 @@ describe('facet resolution chain: package-local layer', () => { it('should prefer package-local facet over project/user/builtin layers', () => { const ensembleDir = join(tempDir, 'ensemble'); const packagePiecesDir = join(ensembleDir, '@nrslib', 'takt-pack-fixture', 'pieces'); - const packageFacetDir = join(ensembleDir, '@nrslib', 'takt-pack-fixture', 'faceted', 'personas'); - const projectFacetDir = join(tempDir, 'project', '.takt', 'faceted', 'personas'); + const packageFacetDir = join(ensembleDir, '@nrslib', 'takt-pack-fixture', 'facets', 'personas'); + const projectFacetDir = join(tempDir, 'project', '.takt', 'facets', 'personas'); // Create both package-local and project facet files with the same name mkdirSync(packageFacetDir, { recursive: true }); @@ -207,7 +207,7 @@ describe('facet resolution chain: package-local layer', () => { it('should fall back to project facet when package-local does not have it', () => { const ensembleDir = join(tempDir, 'ensemble'); const packagePiecesDir = join(ensembleDir, '@nrslib', 'takt-pack-fixture', 'pieces'); - const projectFacetDir = join(tempDir, 'project', '.takt', 'faceted', 'personas'); + const projectFacetDir = join(tempDir, 'project', '.takt', 'facets', 'personas'); mkdirSync(packagePiecesDir, { recursive: true }); mkdirSync(projectFacetDir, { recursive: true }); @@ -231,7 +231,7 @@ describe('facet resolution chain: package-local layer', () => { // Then: package-local は無視。project → user → builtin の3層で解決 it('should not consult package-local layer for non-package pieces', () => { const ensembleDir = join(tempDir, 'ensemble'); - const packageFacetDir = join(ensembleDir, '@nrslib', 'takt-pack-fixture', 'faceted', 'personas'); + const packageFacetDir = join(ensembleDir, '@nrslib', 'takt-pack-fixture', 'facets', 'personas'); // Non-package pieceDir (not under ensembleDir) const globalPiecesDir = join(tempDir, 'global-pieces'); diff --git a/src/__tests__/ensemble/ensemble-paths.test.ts b/src/__tests__/ensemble/ensemble-paths.test.ts index c098823..29af314 100644 --- a/src/__tests__/ensemble/ensemble-paths.test.ts +++ b/src/__tests__/ensemble/ensemble-paths.test.ts @@ -1,7 +1,7 @@ /** * Tests for facet directory path helpers in paths.ts — items 42–45. * - * Verifies the `faceted/` segment is present in all facet path results, + * Verifies the `facets/` segment is present in all facet path results, * and that getEnsembleFacetDir constructs the correct full ensemble path. */ @@ -21,28 +21,28 @@ const ALL_FACET_TYPES: FacetType[] = ['personas', 'policies', 'knowledge', 'inst // getProjectFacetDir — item 42 // --------------------------------------------------------------------------- -describe('getProjectFacetDir — faceted/ prefix', () => { - it('should include "faceted" segment in the path', () => { +describe('getProjectFacetDir — facets/ prefix', () => { + it('should include "facets" segment in the path', () => { // Given: project dir and facet type // When: path is built const dir = getProjectFacetDir('/my/project', 'personas'); // Then: path must contain the faceted segment const normalized = dir.replace(/\\/g, '/'); - expect(normalized).toContain('faceted'); + expect(normalized).toContain('facets'); }); - it('should return .takt/faceted/{type} structure', () => { + it('should return .takt/facets/{type} structure', () => { // Given: project dir // When: path is built const dir = getProjectFacetDir('/my/project', 'personas'); - // Then: segment order is .takt → faceted → personas + // Then: segment order is .takt → facets → personas const normalized = dir.replace(/\\/g, '/'); - expect(normalized).toMatch(/\.takt\/faceted\/personas/); + expect(normalized).toMatch(/\.takt\/facets\/personas/); }); - it('should work for all facet types with faceted/ prefix', () => { + it('should work for all facet types with facets/ prefix', () => { // Given: all valid facet types for (const t of ALL_FACET_TYPES) { // When: path is built @@ -50,7 +50,7 @@ describe('getProjectFacetDir — faceted/ prefix', () => { // Then: contains both faceted and the type in the correct order const normalized = dir.replace(/\\/g, '/'); - expect(normalized).toMatch(new RegExp(`\\.takt/faceted/${t}`)); + expect(normalized).toMatch(new RegExp(`\\.takt/facets/${t}`)); } }); }); @@ -59,27 +59,27 @@ describe('getProjectFacetDir — faceted/ prefix', () => { // getGlobalFacetDir — item 43 // --------------------------------------------------------------------------- -describe('getGlobalFacetDir — faceted/ prefix', () => { - it('should include "faceted" segment in the path', () => { +describe('getGlobalFacetDir — facets/ prefix', () => { + it('should include "facets" segment in the path', () => { // Given: facet type // When: path is built const dir = getGlobalFacetDir('policies'); // Then: path must contain the faceted segment - expect(dir).toContain('faceted'); + expect(dir).toContain('facets'); }); - it('should return .takt/faceted/{type} structure under global config dir', () => { + it('should return .takt/facets/{type} structure under global config dir', () => { // Given: facet type // When: path is built const dir = getGlobalFacetDir('policies'); - // Then: segment order is .takt → faceted → policies + // Then: segment order is .takt → facets → policies const normalized = dir.replace(/\\/g, '/'); - expect(normalized).toMatch(/\.takt\/faceted\/policies/); + expect(normalized).toMatch(/\.takt\/facets\/policies/); }); - it('should work for all facet types with faceted/ prefix', () => { + it('should work for all facet types with facets/ prefix', () => { // Given: all valid facet types for (const t of ALL_FACET_TYPES) { // When: path is built @@ -87,7 +87,7 @@ describe('getGlobalFacetDir — faceted/ prefix', () => { // Then: contains both faceted and the type in the correct order const normalized = dir.replace(/\\/g, '/'); - expect(normalized).toMatch(new RegExp(`\\.takt/faceted/${t}`)); + expect(normalized).toMatch(new RegExp(`\\.takt/facets/${t}`)); } }); }); @@ -96,27 +96,27 @@ describe('getGlobalFacetDir — faceted/ prefix', () => { // getBuiltinFacetDir — item 44 // --------------------------------------------------------------------------- -describe('getBuiltinFacetDir — faceted/ prefix', () => { - it('should include "faceted" segment in the path', () => { +describe('getBuiltinFacetDir — facets/ prefix', () => { + it('should include "facets" segment in the path', () => { // Given: language and facet type // When: path is built const dir = getBuiltinFacetDir('ja', 'knowledge'); // Then: path must contain the faceted segment - expect(dir).toContain('faceted'); + expect(dir).toContain('facets'); }); - it('should return {lang}/faceted/{type} structure', () => { + it('should return {lang}/facets/{type} structure', () => { // Given: language and facet type // When: path is built const dir = getBuiltinFacetDir('ja', 'knowledge'); - // Then: segment order is ja → faceted → knowledge + // Then: segment order is ja → facets → knowledge const normalized = dir.replace(/\\/g, '/'); - expect(normalized).toMatch(/ja\/faceted\/knowledge/); + expect(normalized).toMatch(/ja\/facets\/knowledge/); }); - it('should work for all facet types with faceted/ prefix', () => { + it('should work for all facet types with facets/ prefix', () => { // Given: all valid facet types for (const t of ALL_FACET_TYPES) { // When: path is built @@ -124,7 +124,7 @@ describe('getBuiltinFacetDir — faceted/ prefix', () => { // Then: contains both faceted and the type in the correct order const normalized = dir.replace(/\\/g, '/'); - expect(normalized).toMatch(new RegExp(`en/faceted/${t}`)); + expect(normalized).toMatch(new RegExp(`en/facets/${t}`)); } }); }); @@ -134,7 +134,7 @@ describe('getBuiltinFacetDir — faceted/ prefix', () => { // --------------------------------------------------------------------------- describe('getEnsembleFacetDir — new path function', () => { - it('should return path containing ensemble/@{owner}/{repo}/faceted/{type}', () => { + it('should return path containing ensemble/@{owner}/{repo}/facets/{type}', () => { // Given: owner, repo, and facet type // When: path is built const dir = getEnsembleFacetDir('nrslib', 'takt-fullstack', 'personas'); @@ -144,18 +144,18 @@ describe('getEnsembleFacetDir — new path function', () => { expect(normalized).toContain('ensemble'); expect(normalized).toContain('@nrslib'); expect(normalized).toContain('takt-fullstack'); - expect(normalized).toContain('faceted'); + expect(normalized).toContain('facets'); expect(normalized).toContain('personas'); }); - it('should construct path as ~/.takt/ensemble/@{owner}/{repo}/faceted/{type}', () => { + it('should construct path as ~/.takt/ensemble/@{owner}/{repo}/facets/{type}', () => { // Given: owner, repo, and facet type // When: path is built const dir = getEnsembleFacetDir('nrslib', 'takt-fullstack', 'personas'); - // Then: full segment order is ensemble → @nrslib → takt-fullstack → faceted → personas + // Then: full segment order is ensemble → @nrslib → takt-fullstack → facets → personas const normalized = dir.replace(/\\/g, '/'); - expect(normalized).toMatch(/ensemble\/@nrslib\/takt-fullstack\/faceted\/personas/); + expect(normalized).toMatch(/ensemble\/@nrslib\/takt-fullstack\/facets\/personas/); }); it('should prepend @ before owner name in the path', () => { @@ -176,7 +176,7 @@ describe('getEnsembleFacetDir — new path function', () => { // Then: path has correct ensemble structure with facet type const normalized = dir.replace(/\\/g, '/'); - expect(normalized).toMatch(new RegExp(`ensemble/@owner/repo/faceted/${t}`)); + expect(normalized).toMatch(new RegExp(`ensemble/@owner/repo/facets/${t}`)); } }); }); diff --git a/src/__tests__/ensemble/file-filter.test.ts b/src/__tests__/ensemble/file-filter.test.ts index a3557b9..a49f94d 100644 --- a/src/__tests__/ensemble/file-filter.test.ts +++ b/src/__tests__/ensemble/file-filter.test.ts @@ -4,7 +4,7 @@ * Covers: * - Allowed extensions (.md, .yaml, .yml) * - Disallowed extensions (.sh, .js, .env, .ts, etc.) - * - collectCopyTargets: only faceted/ and pieces/ directories copied + * - collectCopyTargets: only facets/ and pieces/ directories copied * - collectCopyTargets: symbolic links skipped * - collectCopyTargets: file count limit (error if exceeds MAX_FILE_COUNT) * - collectCopyTargets: path subdirectory scenario @@ -86,11 +86,11 @@ describe('collectCopyTargets', () => { rmSync(tempDir, { recursive: true, force: true }); }); - it('should only include files under faceted/ and pieces/ directories', () => { - // Given: package root with faceted/, pieces/, and a README.md at root - mkdirSync(join(tempDir, 'faceted', 'personas'), { recursive: true }); + it('should only include files under facets/ and pieces/ directories', () => { + // Given: package root with facets/, pieces/, and a README.md at root + mkdirSync(join(tempDir, 'facets', 'personas'), { recursive: true }); mkdirSync(join(tempDir, 'pieces'), { recursive: true }); - writeFileSync(join(tempDir, 'faceted', 'personas', 'coder.md'), 'Coder persona'); + writeFileSync(join(tempDir, 'facets', 'personas', 'coder.md'), 'Coder persona'); writeFileSync(join(tempDir, 'pieces', 'expert.yaml'), 'name: expert'); writeFileSync(join(tempDir, 'README.md'), 'Readme'); // should be excluded @@ -98,18 +98,18 @@ describe('collectCopyTargets', () => { const targets = collectCopyTargets(tempDir); const paths = targets.map((t) => t.relativePath); - // Then: only faceted/ and pieces/ files are included - expect(paths).toContain(join('faceted', 'personas', 'coder.md')); + // Then: only facets/ and pieces/ files are included + expect(paths).toContain(join('facets', 'personas', 'coder.md')); expect(paths).toContain(join('pieces', 'expert.yaml')); expect(paths.some((p) => p === 'README.md')).toBe(false); }); it('should skip symbolic links during scan', () => { - // Given: faceted/ with a symlink - mkdirSync(join(tempDir, 'faceted', 'personas'), { recursive: true }); - const target = join(tempDir, 'faceted', 'personas', 'real.md'); + // Given: facets/ with a symlink + mkdirSync(join(tempDir, 'facets', 'personas'), { recursive: true }); + const target = join(tempDir, 'facets', 'personas', 'real.md'); writeFileSync(target, 'Real content'); - symlinkSync(target, join(tempDir, 'faceted', 'personas', 'link.md')); + symlinkSync(target, join(tempDir, 'facets', 'personas', 'link.md')); // When: collectCopyTargets scans const targets = collectCopyTargets(tempDir); @@ -121,10 +121,10 @@ describe('collectCopyTargets', () => { }); it('should throw when file count exceeds MAX_FILE_COUNT', () => { - // Given: more than MAX_FILE_COUNT files under faceted/ - mkdirSync(join(tempDir, 'faceted', 'personas'), { recursive: true }); + // Given: more than MAX_FILE_COUNT files under facets/ + mkdirSync(join(tempDir, 'facets', 'personas'), { recursive: true }); for (let i = 0; i <= MAX_FILE_COUNT; i++) { - writeFileSync(join(tempDir, 'faceted', 'personas', `file-${i}.md`), 'content'); + writeFileSync(join(tempDir, 'facets', 'personas', `file-${i}.md`), 'content'); } // When: collectCopyTargets scans @@ -133,11 +133,11 @@ describe('collectCopyTargets', () => { }); it('should skip files exceeding MAX_FILE_SIZE', () => { - // Given: faceted/ with a valid file and a file exceeding the size limit - mkdirSync(join(tempDir, 'faceted', 'personas'), { recursive: true }); - writeFileSync(join(tempDir, 'faceted', 'personas', 'coder.md'), 'valid'); + // Given: facets/ with a valid file and a file exceeding the size limit + mkdirSync(join(tempDir, 'facets', 'personas'), { recursive: true }); + writeFileSync(join(tempDir, 'facets', 'personas', 'coder.md'), 'valid'); writeFileSync( - join(tempDir, 'faceted', 'personas', 'large.md'), + join(tempDir, 'facets', 'personas', 'large.md'), Buffer.alloc(MAX_FILE_SIZE + 1), ); @@ -151,17 +151,17 @@ describe('collectCopyTargets', () => { }); it('should adjust copy base when path is "takt" (subdirectory scenario)', () => { - // Given: package has path: "takt", so faceted/ is under takt/faceted/ - mkdirSync(join(tempDir, 'takt', 'faceted', 'personas'), { recursive: true }); - writeFileSync(join(tempDir, 'takt', 'faceted', 'personas', 'coder.md'), 'Coder'); + // Given: package has path: "takt", so facets/ is under takt/facets/ + mkdirSync(join(tempDir, 'takt', 'facets', 'personas'), { recursive: true }); + writeFileSync(join(tempDir, 'takt', 'facets', 'personas', 'coder.md'), 'Coder'); // When: collectCopyTargets is called with packageRoot = tempDir/takt const packageRoot = join(tempDir, 'takt'); const targets = collectCopyTargets(packageRoot); const paths = targets.map((t) => t.relativePath); - // Then: file is found under faceted/personas/ - expect(paths).toContain(join('faceted', 'personas', 'coder.md')); + // Then: file is found under facets/personas/ + expect(paths).toContain(join('facets', 'personas', 'coder.md')); }); }); @@ -177,7 +177,7 @@ describe('constants', () => { }); it('ALLOWED_DIRS should include faceted and pieces', () => { - expect(ALLOWED_DIRS).toContain('faceted'); + expect(ALLOWED_DIRS).toContain('facets'); expect(ALLOWED_DIRS).toContain('pieces'); }); diff --git a/src/__tests__/ensemble/pack-summary.test.ts b/src/__tests__/ensemble/pack-summary.test.ts index 906dda8..0ced975 100644 --- a/src/__tests__/ensemble/pack-summary.test.ts +++ b/src/__tests__/ensemble/pack-summary.test.ts @@ -21,19 +21,19 @@ describe('summarizeFacetsByType', () => { it('should count single type correctly', () => { const paths = [ - 'faceted/personas/coder.md', - 'faceted/personas/reviewer.md', + 'facets/personas/coder.md', + 'facets/personas/reviewer.md', ]; expect(summarizeFacetsByType(paths)).toBe('2 personas'); }); it('should count multiple types and join with commas', () => { const paths = [ - 'faceted/personas/coder.md', - 'faceted/personas/reviewer.md', - 'faceted/policies/coding.md', - 'faceted/knowledge/typescript.md', - 'faceted/knowledge/react.md', + 'facets/personas/coder.md', + 'facets/personas/reviewer.md', + 'facets/policies/coding.md', + 'facets/knowledge/typescript.md', + 'facets/knowledge/react.md', ]; const result = summarizeFacetsByType(paths); // Order depends on insertion order; check all types are present @@ -43,13 +43,13 @@ describe('summarizeFacetsByType', () => { }); it('should skip paths that do not have at least 2 segments', () => { - const paths = ['faceted/', 'faceted/personas/coder.md']; + const paths = ['facets/', 'facets/personas/coder.md']; expect(summarizeFacetsByType(paths)).toBe('1 personas'); }); it('should skip paths where second segment is empty', () => { - // 'faceted//coder.md' splits to ['faceted', '', 'coder.md'] - const paths = ['faceted//coder.md', 'faceted/personas/coder.md']; + // 'facets//coder.md' splits to ['facets', '', 'coder.md'] + const paths = ['facets//coder.md', 'facets/personas/coder.md']; expect(summarizeFacetsByType(paths)).toBe('1 personas'); }); }); diff --git a/src/__tests__/ensemble/package-facet-resolution.test.ts b/src/__tests__/ensemble/package-facet-resolution.test.ts index 8578bb2..80ff09c 100644 --- a/src/__tests__/ensemble/package-facet-resolution.test.ts +++ b/src/__tests__/ensemble/package-facet-resolution.test.ts @@ -157,7 +157,7 @@ describe('buildCandidateDirsWithPackage', () => { const dirs = buildCandidateDirsWithPackage('personas', context); // Then: package-local dir is first - const expectedPackageLocal = join(ensembleDir, '@nrslib', 'takt-fullstack', 'faceted', 'personas'); + const expectedPackageLocal = join(ensembleDir, '@nrslib', 'takt-fullstack', 'facets', 'personas'); expect(dirs[0]).toBe(expectedPackageLocal); }); @@ -196,12 +196,12 @@ describe('buildCandidateDirsWithPackage', () => { it('should resolve package-local facet before project-level for package piece', () => { // Given: both package-local and project-level facet files exist const ensembleDir = join(tempDir, 'ensemble'); - const pkgFacetDir = join(ensembleDir, '@nrslib', 'takt-fullstack', 'faceted', 'personas'); + const pkgFacetDir = join(ensembleDir, '@nrslib', 'takt-fullstack', 'facets', 'personas'); mkdirSync(pkgFacetDir, { recursive: true }); writeFileSync(join(pkgFacetDir, 'expert-coder.md'), 'Package persona'); const projectDir = join(tempDir, 'project'); - const projectFacetDir = join(projectDir, '.takt', 'faceted', 'personas'); + const projectFacetDir = join(projectDir, '.takt', 'facets', 'personas'); mkdirSync(projectFacetDir, { recursive: true }); writeFileSync(join(projectFacetDir, 'expert-coder.md'), 'Project persona'); diff --git a/src/__tests__/ensemble/tar-parser.test.ts b/src/__tests__/ensemble/tar-parser.test.ts index fcf53c3..4e8697c 100644 --- a/src/__tests__/ensemble/tar-parser.test.ts +++ b/src/__tests__/ensemble/tar-parser.test.ts @@ -42,7 +42,7 @@ describe('parseTarVerboseListing', () => { // Given: first line is a directory entry in BSD tar format const lines = [ bsdLine('d', 'owner-repo-abc1234/'), - bsdLine('-', 'owner-repo-abc1234/faceted/personas/coder.md'), + bsdLine('-', 'owner-repo-abc1234/facets/personas/coder.md'), ]; // When: parsed @@ -56,7 +56,7 @@ describe('parseTarVerboseListing', () => { // Given: first line is a directory entry in GNU tar format const lines = [ gnuLine('d', 'owner-repo-abc1234/'), - gnuLine('-', 'owner-repo-abc1234/faceted/personas/coder.md'), + gnuLine('-', 'owner-repo-abc1234/facets/personas/coder.md'), ]; // When: parsed @@ -70,14 +70,14 @@ describe('parseTarVerboseListing', () => { // Given: a regular .md file const lines = [ bsdLine('d', 'repo-sha/'), - bsdLine('-', 'repo-sha/faceted/personas/coder.md'), + bsdLine('-', 'repo-sha/facets/personas/coder.md'), ]; // When: parsed const result = parseTarVerboseListing(lines); // Then: .md is included - expect(result.includePaths).toContain('repo-sha/faceted/personas/coder.md'); + expect(result.includePaths).toContain('repo-sha/facets/personas/coder.md'); }); it('should include .yaml files', () => { @@ -108,56 +108,56 @@ describe('parseTarVerboseListing', () => { bsdLine('d', 'repo-sha/'), bsdLine('-', 'repo-sha/src/index.ts'), bsdLine('-', 'repo-sha/package.json'), - bsdLine('-', 'repo-sha/faceted/personas/coder.md'), + bsdLine('-', 'repo-sha/facets/personas/coder.md'), ]; const result = parseTarVerboseListing(lines); // Then: only .md is included - expect(result.includePaths).toEqual(['repo-sha/faceted/personas/coder.md']); + expect(result.includePaths).toEqual(['repo-sha/facets/personas/coder.md']); }); it('should skip directory entries (type "d")', () => { // Given: mix of directory and file entries const lines = [ bsdLine('d', 'repo-sha/'), - bsdLine('d', 'repo-sha/faceted/'), - bsdLine('-', 'repo-sha/faceted/personas/coder.md'), + bsdLine('d', 'repo-sha/facets/'), + bsdLine('-', 'repo-sha/facets/personas/coder.md'), ]; const result = parseTarVerboseListing(lines); // Then: directories are not in includePaths - expect(result.includePaths).not.toContain('repo-sha/faceted/'); - expect(result.includePaths).toContain('repo-sha/faceted/personas/coder.md'); + expect(result.includePaths).not.toContain('repo-sha/facets/'); + expect(result.includePaths).toContain('repo-sha/facets/personas/coder.md'); }); it('should skip symlink entries (type "l")', () => { // Given: a symlink entry (type "l") alongside a normal file const lines = [ bsdLine('d', 'repo-sha/'), - bsdLine('l', 'repo-sha/faceted/link.md'), - bsdLine('-', 'repo-sha/faceted/personas/coder.md'), + bsdLine('l', 'repo-sha/facets/link.md'), + bsdLine('-', 'repo-sha/facets/personas/coder.md'), ]; const result = parseTarVerboseListing(lines); // Then: symlink is excluded, normal file is included - expect(result.includePaths).not.toContain('repo-sha/faceted/link.md'); - expect(result.includePaths).toContain('repo-sha/faceted/personas/coder.md'); + expect(result.includePaths).not.toContain('repo-sha/facets/link.md'); + expect(result.includePaths).toContain('repo-sha/facets/personas/coder.md'); }); it('should handle lines that do not match the timestamp regex', () => { // Given: lines without a recognizable timestamp (should be ignored) const lines = [ 'some-garbage-line', - bsdLine('-', 'repo-sha/faceted/personas/coder.md'), + bsdLine('-', 'repo-sha/facets/personas/coder.md'), ]; const result = parseTarVerboseListing(lines); // Then: garbage line is skipped, file is included - expect(result.includePaths).toContain('repo-sha/faceted/personas/coder.md'); + expect(result.includePaths).toContain('repo-sha/facets/personas/coder.md'); }); it('should set firstDirEntry to empty string when first matching line has no trailing slash', () => { diff --git a/src/__tests__/facet-resolution.test.ts b/src/__tests__/facet-resolution.test.ts index af4b8f2..6e2acbe 100644 --- a/src/__tests__/facet-resolution.test.ts +++ b/src/__tests__/facet-resolution.test.ts @@ -84,7 +84,7 @@ describe('resolveFacetByName', () => { }); it('should resolve from project layer over builtin', () => { - const projectPersonasDir = join(projectDir, '.takt', 'faceted', 'personas'); + const projectPersonasDir = join(projectDir, '.takt', 'facets', 'personas'); mkdirSync(projectPersonasDir, { recursive: true }); writeFileSync(join(projectPersonasDir, 'coder.md'), 'Project-level coder persona'); @@ -98,7 +98,7 @@ describe('resolveFacetByName', () => { }); it('should resolve different facet types', () => { - const projectPoliciesDir = join(projectDir, '.takt', 'faceted', 'policies'); + const projectPoliciesDir = join(projectDir, '.takt', 'facets', 'policies'); mkdirSync(projectPoliciesDir, { recursive: true }); writeFileSync(join(projectPoliciesDir, 'custom-policy.md'), 'Custom policy content'); @@ -108,7 +108,7 @@ describe('resolveFacetByName', () => { it('should try project before builtin', () => { // Create project override - const projectPersonasDir = join(projectDir, '.takt', 'faceted', 'personas'); + const projectPersonasDir = join(projectDir, '.takt', 'facets', 'personas'); mkdirSync(projectPersonasDir, { recursive: true }); writeFileSync(join(projectPersonasDir, 'coder.md'), 'OVERRIDE'); @@ -137,7 +137,7 @@ describe('resolveRefToContent with layer resolution', () => { }); it('should use layer resolution for name refs when not in resolvedMap', () => { - const policiesDir = join(tempDir, '.takt', 'faceted', 'policies'); + const policiesDir = join(tempDir, '.takt', 'facets', 'policies'); mkdirSync(policiesDir, { recursive: true }); writeFileSync(join(policiesDir, 'coding.md'), 'Project coding policy'); @@ -189,7 +189,7 @@ describe('resolveRefList with layer resolution', () => { }); it('should resolve array of name refs via layer resolution', () => { - const policiesDir = join(tempDir, '.takt', 'faceted', 'policies'); + const policiesDir = join(tempDir, '.takt', 'facets', 'policies'); mkdirSync(policiesDir, { recursive: true }); writeFileSync(join(policiesDir, 'policy-a.md'), 'Policy A content'); writeFileSync(join(policiesDir, 'policy-b.md'), 'Policy B content'); @@ -206,7 +206,7 @@ describe('resolveRefList with layer resolution', () => { }); it('should handle mixed array of name refs and path refs', () => { - const policiesDir = join(tempDir, '.takt', 'faceted', 'policies'); + const policiesDir = join(tempDir, '.takt', 'facets', 'policies'); mkdirSync(policiesDir, { recursive: true }); writeFileSync(join(policiesDir, 'name-policy.md'), 'Name-resolved policy'); @@ -230,7 +230,7 @@ describe('resolveRefList with layer resolution', () => { }); it('should handle single string ref (not array)', () => { - const policiesDir = join(tempDir, '.takt', 'faceted', 'policies'); + const policiesDir = join(tempDir, '.takt', 'facets', 'policies'); mkdirSync(policiesDir, { recursive: true }); writeFileSync(join(policiesDir, 'single.md'), 'Single policy'); @@ -284,7 +284,7 @@ describe('resolvePersona with layer resolution', () => { }); it('should resolve persona from project layer', () => { - const projectPersonasDir = join(projectDir, '.takt', 'faceted', 'personas'); + const projectPersonasDir = join(projectDir, '.takt', 'facets', 'personas'); mkdirSync(projectPersonasDir, { recursive: true }); const personaPath = join(projectPersonasDir, 'custom-persona.md'); writeFileSync(personaPath, 'Custom persona content'); @@ -416,7 +416,7 @@ describe('normalizePieceConfig with layer resolution', () => { it('should resolve policy by name when section map is absent', () => { // Create project-level policy - const policiesDir = join(projectDir, '.takt', 'faceted', 'policies'); + const policiesDir = join(projectDir, '.takt', 'facets', 'policies'); mkdirSync(policiesDir, { recursive: true }); writeFileSync(join(policiesDir, 'custom-policy.md'), '# Custom Policy\nBe nice.'); @@ -486,7 +486,7 @@ describe('normalizePieceConfig with layer resolution', () => { }); it('should resolve knowledge by name from project layer', () => { - const knowledgeDir = join(projectDir, '.takt', 'faceted', 'knowledge'); + const knowledgeDir = join(projectDir, '.takt', 'facets', 'knowledge'); mkdirSync(knowledgeDir, { recursive: true }); writeFileSync(join(knowledgeDir, 'domain-kb.md'), '# Domain Knowledge'); @@ -532,7 +532,7 @@ describe('normalizePieceConfig with layer resolution', () => { }); it('should resolve instruction_template by name via layer resolution', () => { - const instructionsDir = join(projectDir, '.takt', 'faceted', 'instructions'); + const instructionsDir = join(projectDir, '.takt', 'facets', 'instructions'); mkdirSync(instructionsDir, { recursive: true }); writeFileSync(join(instructionsDir, 'implement.md'), 'Project implement template'); @@ -576,7 +576,7 @@ Second line remains inline.`; }); it('should resolve loop monitor judge instruction_template via layer resolution', () => { - const instructionsDir = join(projectDir, '.takt', 'faceted', 'instructions'); + const instructionsDir = join(projectDir, '.takt', 'facets', 'instructions'); mkdirSync(instructionsDir, { recursive: true }); writeFileSync(join(instructionsDir, 'judge-template.md'), 'Project judge template'); diff --git a/src/__tests__/faceted-prompting/scope-ref.test.ts b/src/__tests__/faceted-prompting/scope-ref.test.ts index 6ba3e79..cf860a5 100644 --- a/src/__tests__/faceted-prompting/scope-ref.test.ts +++ b/src/__tests__/faceted-prompting/scope-ref.test.ts @@ -4,7 +4,7 @@ * Covers: * - isScopeRef(): detects @{owner}/{repo}/{facet-name} format * - parseScopeRef(): parses components from scope reference - * - resolveScopeRef(): resolves to ~/.takt/ensemble/@{owner}/{repo}/faceted/{facet-type}/{facet-name}.md + * - resolveScopeRef(): resolves to ~/.takt/ensemble/@{owner}/{repo}/facets/{facet-type}/{facet-name}.md * - facet-type mapping from field context (persona→personas, policy→policies, etc.) * - Name constraint validation (owner, repo, facet-name patterns) * - Case normalization (uppercase → lowercase) @@ -134,9 +134,9 @@ describe('resolveScopeRef', () => { rmSync(tempEnsembleDir, { recursive: true, force: true }); }); - it('should resolve persona scope ref to faceted/personas/{name}.md', () => { + it('should resolve persona scope ref to facets/personas/{name}.md', () => { // Given: ensemble directory with the package's persona file - const facetDir = join(tempEnsembleDir, '@nrslib', 'takt-fullstack', 'faceted', 'personas'); + const facetDir = join(tempEnsembleDir, '@nrslib', 'takt-fullstack', 'facets', 'personas'); mkdirSync(facetDir, { recursive: true }); writeFileSync(join(facetDir, 'expert-coder.md'), 'Expert coder persona'); @@ -146,12 +146,12 @@ describe('resolveScopeRef', () => { const result = resolveScopeRef(scopeRef, 'personas', tempEnsembleDir); // Then: resolved to the correct file path - expect(result).toBe(join(tempEnsembleDir, '@nrslib', 'takt-fullstack', 'faceted', 'personas', 'expert-coder.md')); + expect(result).toBe(join(tempEnsembleDir, '@nrslib', 'takt-fullstack', 'facets', 'personas', 'expert-coder.md')); }); - it('should resolve policy scope ref to faceted/policies/{name}.md', () => { + it('should resolve policy scope ref to facets/policies/{name}.md', () => { // Given: ensemble directory with policy file - const facetDir = join(tempEnsembleDir, '@nrslib', 'takt-fullstack', 'faceted', 'policies'); + const facetDir = join(tempEnsembleDir, '@nrslib', 'takt-fullstack', 'facets', 'policies'); mkdirSync(facetDir, { recursive: true }); writeFileSync(join(facetDir, 'owasp-checklist.md'), 'OWASP content'); @@ -161,12 +161,12 @@ describe('resolveScopeRef', () => { const result = resolveScopeRef(scopeRef, 'policies', tempEnsembleDir); // Then: resolved to correct path - expect(result).toBe(join(tempEnsembleDir, '@nrslib', 'takt-fullstack', 'faceted', 'policies', 'owasp-checklist.md')); + expect(result).toBe(join(tempEnsembleDir, '@nrslib', 'takt-fullstack', 'facets', 'policies', 'owasp-checklist.md')); }); - it('should resolve knowledge scope ref to faceted/knowledge/{name}.md', () => { + it('should resolve knowledge scope ref to facets/knowledge/{name}.md', () => { // Given: ensemble directory with knowledge file - const facetDir = join(tempEnsembleDir, '@nrslib', 'takt-security-facets', 'faceted', 'knowledge'); + const facetDir = join(tempEnsembleDir, '@nrslib', 'takt-security-facets', 'facets', 'knowledge'); mkdirSync(facetDir, { recursive: true }); writeFileSync(join(facetDir, 'vulnerability-patterns.md'), 'Vuln patterns'); @@ -176,12 +176,12 @@ describe('resolveScopeRef', () => { const result = resolveScopeRef(scopeRef, 'knowledge', tempEnsembleDir); // Then: resolved to correct path - expect(result).toBe(join(tempEnsembleDir, '@nrslib', 'takt-security-facets', 'faceted', 'knowledge', 'vulnerability-patterns.md')); + expect(result).toBe(join(tempEnsembleDir, '@nrslib', 'takt-security-facets', 'facets', 'knowledge', 'vulnerability-patterns.md')); }); - it('should resolve instructions scope ref to faceted/instructions/{name}.md', () => { + it('should resolve instructions scope ref to facets/instructions/{name}.md', () => { // Given: instruction file - const facetDir = join(tempEnsembleDir, '@acme', 'takt-backend', 'faceted', 'instructions'); + const facetDir = join(tempEnsembleDir, '@acme', 'takt-backend', 'facets', 'instructions'); mkdirSync(facetDir, { recursive: true }); writeFileSync(join(facetDir, 'review-checklist.md'), 'Review steps'); @@ -191,12 +191,12 @@ describe('resolveScopeRef', () => { const result = resolveScopeRef(scopeRef, 'instructions', tempEnsembleDir); // Then: correct path - expect(result).toBe(join(tempEnsembleDir, '@acme', 'takt-backend', 'faceted', 'instructions', 'review-checklist.md')); + expect(result).toBe(join(tempEnsembleDir, '@acme', 'takt-backend', 'facets', 'instructions', 'review-checklist.md')); }); - it('should resolve output-contracts scope ref to faceted/output-contracts/{name}.md', () => { + it('should resolve output-contracts scope ref to facets/output-contracts/{name}.md', () => { // Given: output contract file - const facetDir = join(tempEnsembleDir, '@acme', 'takt-backend', 'faceted', 'output-contracts'); + const facetDir = join(tempEnsembleDir, '@acme', 'takt-backend', 'facets', 'output-contracts'); mkdirSync(facetDir, { recursive: true }); writeFileSync(join(facetDir, 'review-report.md'), 'Report contract'); @@ -206,7 +206,7 @@ describe('resolveScopeRef', () => { const result = resolveScopeRef(scopeRef, 'output-contracts', tempEnsembleDir); // Then: correct path - expect(result).toBe(join(tempEnsembleDir, '@acme', 'takt-backend', 'faceted', 'output-contracts', 'review-report.md')); + expect(result).toBe(join(tempEnsembleDir, '@acme', 'takt-backend', 'facets', 'output-contracts', 'review-report.md')); }); }); diff --git a/src/__tests__/review-only-piece.test.ts b/src/__tests__/review-only-piece.test.ts index da9ca1b..ee741c3 100644 --- a/src/__tests__/review-only-piece.test.ts +++ b/src/__tests__/review-only-piece.test.ts @@ -188,7 +188,7 @@ describe('review-only piece (JA)', () => { describe('pr-commenter persona files', () => { it('should exist for EN with domain knowledge', () => { - const filePath = join(RESOURCES_DIR, 'en', 'faceted', 'personas', 'pr-commenter.md'); + const filePath = join(RESOURCES_DIR, 'en', 'facets', 'personas', 'pr-commenter.md'); const content = readFileSync(filePath, 'utf-8'); expect(content).toContain('PR Commenter'); expect(content).toContain('gh api'); @@ -196,7 +196,7 @@ describe('pr-commenter persona files', () => { }); it('should exist for JA with domain knowledge', () => { - const filePath = join(RESOURCES_DIR, 'ja', 'faceted', 'personas', 'pr-commenter.md'); + const filePath = join(RESOURCES_DIR, 'ja', 'facets', 'personas', 'pr-commenter.md'); const content = readFileSync(filePath, 'utf-8'); expect(content).toContain('PR Commenter'); expect(content).toContain('gh api'); @@ -204,7 +204,7 @@ describe('pr-commenter persona files', () => { }); it('should NOT contain piece-specific report names (EN)', () => { - const filePath = join(RESOURCES_DIR, 'en', 'faceted', 'personas', 'pr-commenter.md'); + const filePath = join(RESOURCES_DIR, 'en', 'facets', 'personas', 'pr-commenter.md'); const content = readFileSync(filePath, 'utf-8'); // Persona should not reference specific review-only piece report files expect(content).not.toContain('01-architect-review.md'); @@ -218,7 +218,7 @@ describe('pr-commenter persona files', () => { }); it('should NOT contain piece-specific report names (JA)', () => { - const filePath = join(RESOURCES_DIR, 'ja', 'faceted', 'personas', 'pr-commenter.md'); + const filePath = join(RESOURCES_DIR, 'ja', 'facets', 'personas', 'pr-commenter.md'); const content = readFileSync(filePath, 'utf-8'); expect(content).not.toContain('01-architect-review.md'); expect(content).not.toContain('02-security-review.md'); diff --git a/src/app/cli/index.ts b/src/app/cli/index.ts index 76394a9..eaf6e81 100644 --- a/src/app/cli/index.ts +++ b/src/app/cli/index.ts @@ -7,6 +7,8 @@ */ import { checkForUpdates } from '../../shared/utils/index.js'; +import { getErrorMessage } from '../../shared/utils/error.js'; +import { error as errorLog } from '../../shared/ui/index.js'; checkForUpdates(); @@ -41,6 +43,6 @@ import { executeDefaultAction } from './routing.js'; process.exit(0); } })().catch((err) => { - console.error(err); + errorLog(getErrorMessage(err)); process.exit(1); }); diff --git a/src/faceted-prompting/scope.ts b/src/faceted-prompting/scope.ts index be09a4a..6f856cd 100644 --- a/src/faceted-prompting/scope.ts +++ b/src/faceted-prompting/scope.ts @@ -53,7 +53,7 @@ export function parseScopeRef(ref: string): ScopeRef { /** * Resolve a scope reference to a file path in the ensemble directory. * - * Path: {ensembleDir}/@{owner}/{repo}/faceted/{facetType}/{name}.md + * Path: {ensembleDir}/@{owner}/{repo}/facets/{facetType}/{name}.md * * @param scopeRef - parsed scope reference * @param facetType - e.g. "personas", "policies", "knowledge" @@ -69,7 +69,7 @@ export function resolveScopeRef( ensembleDir, `@${scopeRef.owner}`, scopeRef.repo, - 'faceted', + 'facets', facetType, `${scopeRef.name}.md`, ); diff --git a/src/features/ensemble/file-filter.ts b/src/features/ensemble/file-filter.ts index c39c980..d921b56 100644 --- a/src/features/ensemble/file-filter.ts +++ b/src/features/ensemble/file-filter.ts @@ -3,7 +3,7 @@ * * Security constraints: * - Only .md, .yaml, .yml files are copied - * - Only files under faceted/ or pieces/ top-level directories are copied + * - Only files under facets/ or pieces/ top-level directories are copied * - Symbolic links are skipped (lstat check) * - Files exceeding MAX_FILE_SIZE (1 MB) are skipped * - Packages with more than MAX_FILE_COUNT files throw an error @@ -19,7 +19,7 @@ const log = createLogger('ensemble-file-filter'); export const ALLOWED_EXTENSIONS = ['.md', '.yaml', '.yml'] as const; /** Top-level directories that are copied from a package. */ -export const ALLOWED_DIRS = ['faceted', 'pieces'] as const; +export const ALLOWED_DIRS = ['facets', 'pieces'] as const; /** Maximum single file size in bytes (1 MB). */ export const MAX_FILE_SIZE = 1024 * 1024; @@ -30,7 +30,7 @@ export const MAX_FILE_COUNT = 500; export interface CopyTarget { /** Absolute path to the source file. */ absolutePath: string; - /** Relative path from the package root (e.g. "faceted/personas/coder.md"). */ + /** Relative path from the package root (e.g. "facets/personas/coder.md"). */ relativePath: string; } @@ -103,7 +103,7 @@ function collectFromDir( /** * Collect all files to copy from a package root directory. * - * Only files under faceted/ and pieces/ top-level directories are included. + * Only files under facets/ and pieces/ top-level directories are included. * Symbolic links are skipped. Files over MAX_FILE_SIZE are skipped. * Throws if total file count exceeds MAX_FILE_COUNT. * diff --git a/src/features/ensemble/pack-summary.ts b/src/features/ensemble/pack-summary.ts index a58a4af..a9e531f 100644 --- a/src/features/ensemble/pack-summary.ts +++ b/src/features/ensemble/pack-summary.ts @@ -20,7 +20,7 @@ export interface EditPieceInfo { * Count facet files per type (personas, policies, knowledge, etc.) * and produce a human-readable summary string. * - * @param facetRelativePaths - Paths relative to package root, starting with `faceted/` + * @param facetRelativePaths - Paths relative to package root, starting with `facets/` */ export function summarizeFacetsByType(facetRelativePaths: string[]): string { const countsByType = new Map(); diff --git a/src/infra/config/loaders/resource-resolver.ts b/src/infra/config/loaders/resource-resolver.ts index ac6a5fa..5aba3dd 100644 --- a/src/infra/config/loaders/resource-resolver.ts +++ b/src/infra/config/loaders/resource-resolver.ts @@ -84,10 +84,10 @@ export function getPackageFromPieceDir( * Build candidate directories with optional package-local layer (4-layer for package pieces). * * Resolution order for package pieces: - * 1. package-local: {ensembleDir}/@{owner}/{repo}/faceted/{type} - * 2. project: {projectDir}/.takt/faceted/{type} - * 3. user: ~/.takt/faceted/{type} - * 4. builtin: builtins/{lang}/faceted/{type} + * 1. package-local: {ensembleDir}/@{owner}/{repo}/facets/{type} + * 2. project: {projectDir}/.takt/facets/{type} + * 3. user: ~/.takt/facets/{type} + * 4. builtin: builtins/{lang}/facets/{type} * * For non-package pieces: 3-layer (project → user → builtin). */ diff --git a/src/infra/config/paths.ts b/src/infra/config/paths.ts index 125a225..4fa0bea 100644 --- a/src/infra/config/paths.ts +++ b/src/infra/config/paths.ts @@ -48,9 +48,9 @@ export function getBuiltinPiecesDir(lang: Language): string { return join(getLanguageResourcesDir(lang), 'pieces'); } -/** Get builtin personas directory (builtins/{lang}/faceted/personas) */ +/** Get builtin personas directory (builtins/{lang}/facets/personas) */ export function getBuiltinPersonasDir(lang: Language): string { - return join(getLanguageResourcesDir(lang), 'faceted', 'personas'); + return join(getLanguageResourcesDir(lang), 'facets', 'personas'); } /** Get project takt config directory (.takt in project) */ @@ -90,19 +90,19 @@ export function ensureDir(dirPath: string): void { } } -/** Get project facet directory (.takt/faceted/{facetType} in project) */ +/** Get project facet directory (.takt/facets/{facetType} in project) */ export function getProjectFacetDir(projectDir: string, facetType: FacetType): string { - return join(getProjectConfigDir(projectDir), 'faceted', facetType); + return join(getProjectConfigDir(projectDir), 'facets', facetType); } -/** Get global facet directory (~/.takt/faceted/{facetType}) */ +/** Get global facet directory (~/.takt/facets/{facetType}) */ export function getGlobalFacetDir(facetType: FacetType): string { - return join(getGlobalConfigDir(), 'faceted', facetType); + return join(getGlobalConfigDir(), 'facets', facetType); } -/** Get builtin facet directory (builtins/{lang}/faceted/{facetType}) */ +/** Get builtin facet directory (builtins/{lang}/facets/{facetType}) */ export function getBuiltinFacetDir(lang: Language, facetType: FacetType): string { - return join(getLanguageResourcesDir(lang), 'faceted', facetType); + return join(getLanguageResourcesDir(lang), 'facets', facetType); } /** Get ensemble directory (~/.takt/ensemble/) */ @@ -124,7 +124,7 @@ export function getEnsemblePackageDir(owner: string, repo: string): string { */ export function getEnsembleFacetDir(owner: string, repo: string, facetType: FacetType, ensembleDir?: string): string { const base = ensembleDir ?? getEnsembleDir(); - return join(base, `@${owner}`, repo, 'faceted', facetType); + return join(base, `@${owner}`, repo, 'facets', facetType); } /** Validate path is safe (no directory traversal) */