fabricast 1.0.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- fabricast-1.0.0/LICENSE +21 -0
- fabricast-1.0.0/MANIFEST.in +10 -0
- fabricast-1.0.0/PKG-INFO +426 -0
- fabricast-1.0.0/README.md +382 -0
- fabricast-1.0.0/data/__init__.py +1 -0
- fabricast-1.0.0/data/base/__init__.py +9 -0
- fabricast-1.0.0/data/base/layer/__init__.py +5 -0
- fabricast-1.0.0/data/base/layer/agent-systems-engineer.yaml +66 -0
- fabricast-1.0.0/data/base/layer/automation-engineer.yaml +71 -0
- fabricast-1.0.0/data/base/layer/backend-developer.yaml +77 -0
- fabricast-1.0.0/data/base/layer/configuration-author.yaml +66 -0
- fabricast-1.0.0/data/base/layer/database-specialist.yaml +81 -0
- fabricast-1.0.0/data/base/layer/frontend-developer.yaml +90 -0
- fabricast-1.0.0/data/base/layer/game-developer.yaml +67 -0
- fabricast-1.0.0/data/base/layer/infrastructure-engineer.yaml +99 -0
- fabricast-1.0.0/data/base/lifecycle/__init__.py +5 -0
- fabricast-1.0.0/data/base/lifecycle/api-documentation-architect.yaml +139 -0
- fabricast-1.0.0/data/base/lifecycle/architect.yaml +105 -0
- fabricast-1.0.0/data/base/lifecycle/code-reviewer.yaml +93 -0
- fabricast-1.0.0/data/base/lifecycle/content-writer.yaml +85 -0
- fabricast-1.0.0/data/base/lifecycle/debugger.yaml +90 -0
- fabricast-1.0.0/data/base/lifecycle/documenter.yaml +96 -0
- fabricast-1.0.0/data/base/lifecycle/game-designer.yaml +126 -0
- fabricast-1.0.0/data/base/lifecycle/generalist.yaml +32 -0
- fabricast-1.0.0/data/base/lifecycle/implementation-developer.yaml +92 -0
- fabricast-1.0.0/data/base/lifecycle/level-designer.yaml +111 -0
- fabricast-1.0.0/data/base/lifecycle/systems-designer.yaml +116 -0
- fabricast-1.0.0/data/base/lifecycle/test-writer.yaml +102 -0
- fabricast-1.0.0/data/base/mixins/__init__.py +5 -0
- fabricast-1.0.0/data/base/mixins/api-documentation-focused.yaml +84 -0
- fabricast-1.0.0/data/base/mixins/developer-experience-focused.yaml +87 -0
- fabricast-1.0.0/data/base/mixins/diagram-quality-focused.yaml +78 -0
- fabricast-1.0.0/data/base/mixins/extensibility-focused.yaml +36 -0
- fabricast-1.0.0/data/base/mixins/maintainability-focused.yaml +55 -0
- fabricast-1.0.0/data/base/mixins/performance-focused.yaml +57 -0
- fabricast-1.0.0/data/base/mixins/readability-focused.yaml +43 -0
- fabricast-1.0.0/data/base/mixins/scalability-focused.yaml +56 -0
- fabricast-1.0.0/data/base/mixins/security-aware.yaml +67 -0
- fabricast-1.0.0/data/base/system/__init__.py +9 -0
- fabricast-1.0.0/data/base/system/baseline.yaml +83 -0
- fabricast-1.0.0/data/base/system/router.yaml +45 -0
- fabricast-1.0.0/data/bundled-skills/__init__.py +1 -0
- fabricast-1.0.0/data/bundled-skills/claude/fabricast-current/SKILL.md +38 -0
- fabricast-1.0.0/data/bundled-skills/claude/fabricast-list/SKILL.md +36 -0
- fabricast-1.0.0/data/bundled-skills/claude/fabricast-set-active/SKILL.md +45 -0
- fabricast-1.0.0/data/bundled-skills/copilot/fabricast-current/SKILL.md +38 -0
- fabricast-1.0.0/data/bundled-skills/copilot/fabricast-list/SKILL.md +37 -0
- fabricast-1.0.0/data/bundled-skills/copilot/fabricast-set-active/SKILL.md +46 -0
- fabricast-1.0.0/data/bundled-skills/cursor/fabricast-current/SKILL.md +44 -0
- fabricast-1.0.0/data/bundled-skills/cursor/fabricast-list/SKILL.md +42 -0
- fabricast-1.0.0/data/bundled-skills/cursor/fabricast-set-active/SKILL.md +56 -0
- fabricast-1.0.0/data/config/__init__.py +9 -0
- fabricast-1.0.0/data/config/merge-config.yaml +51 -0
- fabricast-1.0.0/data/config/provisions.yaml +69 -0
- fabricast-1.0.0/data/config/recipe-naming.yaml +82 -0
- fabricast-1.0.0/data/language_specific/__init__.py +9 -0
- fabricast-1.0.0/data/language_specific/csharp/__init__.py +5 -0
- fabricast-1.0.0/data/language_specific/csharp/csharp-aspnet.yaml +58 -0
- fabricast-1.0.0/data/language_specific/csharp/csharp-data.yaml +59 -0
- fabricast-1.0.0/data/language_specific/csharp/csharp-developer.yaml +116 -0
- fabricast-1.0.0/data/language_specific/csharp/csharp-formatting-standards.yaml +121 -0
- fabricast-1.0.0/data/language_specific/csharp/csharp-ime-standards.yaml +163 -0
- fabricast-1.0.0/data/language_specific/javascript/__init__.py +5 -0
- fabricast-1.0.0/data/language_specific/javascript/javascript-developer.yaml +118 -0
- fabricast-1.0.0/data/language_specific/javascript/javascript-formatting-standards.yaml +118 -0
- fabricast-1.0.0/data/language_specific/javascript/javascript-ime-standards.yaml +122 -0
- fabricast-1.0.0/data/language_specific/powershell/__init__.py +5 -0
- fabricast-1.0.0/data/language_specific/powershell/powershell-developer.yaml +91 -0
- fabricast-1.0.0/data/language_specific/powershell/powershell-formatting-standards.yaml +99 -0
- fabricast-1.0.0/data/language_specific/python/__init__.py +5 -0
- fabricast-1.0.0/data/language_specific/python/python-developer.yaml +123 -0
- fabricast-1.0.0/data/language_specific/python/python-formatting-standards.yaml +115 -0
- fabricast-1.0.0/data/language_specific/tsql/__init__.py +5 -0
- fabricast-1.0.0/data/language_specific/tsql/tsql-developer.yaml +133 -0
- fabricast-1.0.0/data/language_specific/tsql/tsql-formatting-standards.yaml +147 -0
- fabricast-1.0.0/data/language_specific/tsql/tsql-ime-standards.yaml +190 -0
- fabricast-1.0.0/data/recipes/__init__.py +9 -0
- fabricast-1.0.0/data/recipes/debug-csharp.yaml +15 -0
- fabricast-1.0.0/data/recipes/debug-javascript.yaml +15 -0
- fabricast-1.0.0/data/recipes/debug-powershell.yaml +14 -0
- fabricast-1.0.0/data/recipes/debug-python.yaml +15 -0
- fabricast-1.0.0/data/recipes/design-agent-roles.yaml +14 -0
- fabricast-1.0.0/data/recipes/design-config-schema.yaml +13 -0
- fabricast-1.0.0/data/recipes/design-csharp-backend-infra.yaml +15 -0
- fabricast-1.0.0/data/recipes/design-csharp.yaml +17 -0
- fabricast-1.0.0/data/recipes/design-data-pipeline.yaml +16 -0
- fabricast-1.0.0/data/recipes/design-devops.yaml +16 -0
- fabricast-1.0.0/data/recipes/design-game-balance.yaml +8 -0
- fabricast-1.0.0/data/recipes/design-game-complete.yaml +10 -0
- fabricast-1.0.0/data/recipes/design-game-levels.yaml +9 -0
- fabricast-1.0.0/data/recipes/design-game-mechanics.yaml +7 -0
- fabricast-1.0.0/data/recipes/design-javascript-frontend.yaml +17 -0
- fabricast-1.0.0/data/recipes/design-javascript.yaml +17 -0
- fabricast-1.0.0/data/recipes/design-powershell.yaml +17 -0
- fabricast-1.0.0/data/recipes/design-python-backend-perf.yaml +15 -0
- fabricast-1.0.0/data/recipes/design-python-backend-scale.yaml +12 -0
- fabricast-1.0.0/data/recipes/design-python.yaml +17 -0
- fabricast-1.0.0/data/recipes/design-tsql.yaml +17 -0
- fabricast-1.0.0/data/recipes/document-api-system.yaml +77 -0
- fabricast-1.0.0/data/recipes/document-python-backend.yaml +10 -0
- fabricast-1.0.0/data/recipes/edit-copyedit.yaml +11 -0
- fabricast-1.0.0/data/recipes/general.yaml +15 -0
- fabricast-1.0.0/data/recipes/implement-agent-config.yaml +16 -0
- fabricast-1.0.0/data/recipes/implement-config.yaml +13 -0
- fabricast-1.0.0/data/recipes/implement-csharp-backend-secure.yaml +15 -0
- fabricast-1.0.0/data/recipes/implement-csharp-backend.yaml +18 -0
- fabricast-1.0.0/data/recipes/implement-csharp-database.yaml +20 -0
- fabricast-1.0.0/data/recipes/implement-csharp.yaml +17 -0
- fabricast-1.0.0/data/recipes/implement-devops.yaml +13 -0
- fabricast-1.0.0/data/recipes/implement-game-unity.yaml +14 -0
- fabricast-1.0.0/data/recipes/implement-javascript-frontend.yaml +17 -0
- fabricast-1.0.0/data/recipes/implement-javascript.yaml +17 -0
- fabricast-1.0.0/data/recipes/implement-powershell-infra.yaml +15 -0
- fabricast-1.0.0/data/recipes/implement-powershell.yaml +17 -0
- fabricast-1.0.0/data/recipes/implement-python-automation.yaml +17 -0
- fabricast-1.0.0/data/recipes/implement-python-backend-perf.yaml +14 -0
- fabricast-1.0.0/data/recipes/implement-python.yaml +17 -0
- fabricast-1.0.0/data/recipes/implement-tsql.yaml +17 -0
- fabricast-1.0.0/data/recipes/review-agent-prompts.yaml +14 -0
- fabricast-1.0.0/data/recipes/review-config.yaml +13 -0
- fabricast-1.0.0/data/recipes/review-csharp.yaml +16 -0
- fabricast-1.0.0/data/recipes/review-devops-secure.yaml +13 -0
- fabricast-1.0.0/data/recipes/review-game-unity.yaml +13 -0
- fabricast-1.0.0/data/recipes/review-javascript-frontend.yaml +16 -0
- fabricast-1.0.0/data/recipes/review-javascript.yaml +16 -0
- fabricast-1.0.0/data/recipes/review-powershell-infra-secure.yaml +12 -0
- fabricast-1.0.0/data/recipes/review-powershell.yaml +16 -0
- fabricast-1.0.0/data/recipes/review-python-automation.yaml +17 -0
- fabricast-1.0.0/data/recipes/review-python-backend-perf.yaml +15 -0
- fabricast-1.0.0/data/recipes/review-python-backend-secure.yaml +12 -0
- fabricast-1.0.0/data/recipes/review-python.yaml +16 -0
- fabricast-1.0.0/data/recipes/review-tsql.yaml +16 -0
- fabricast-1.0.0/data/recipes/test-csharp-backend-secure.yaml +13 -0
- fabricast-1.0.0/data/recipes/test-csharp-database.yaml +9 -0
- fabricast-1.0.0/data/recipes/test-csharp.yaml +17 -0
- fabricast-1.0.0/data/recipes/test-game-unity.yaml +10 -0
- fabricast-1.0.0/data/recipes/test-javascript-frontend.yaml +15 -0
- fabricast-1.0.0/data/recipes/test-javascript.yaml +17 -0
- fabricast-1.0.0/data/recipes/test-powershell-infra.yaml +10 -0
- fabricast-1.0.0/data/recipes/test-powershell.yaml +17 -0
- fabricast-1.0.0/data/recipes/test-python-backend.yaml +10 -0
- fabricast-1.0.0/data/recipes/test-python.yaml +17 -0
- fabricast-1.0.0/data/recipes/test-tsql.yaml +15 -0
- fabricast-1.0.0/data/recipes/write-career-materials.yaml +9 -0
- fabricast-1.0.0/data/recipes/write-creative.yaml +16 -0
- fabricast-1.0.0/data/recipes/write-professional-docs.yaml +11 -0
- fabricast-1.0.0/data/schemas/__init__.py +9 -0
- fabricast-1.0.0/data/schemas/base-role.schema.json +158 -0
- fabricast-1.0.0/data/schemas/provisions.schema.json +97 -0
- fabricast-1.0.0/data/schemas/recipe.schema.json +61 -0
- fabricast-1.0.0/data/templates/__init__.py +1 -0
- fabricast-1.0.0/data/templates/base-role-template.yaml.template +56 -0
- fabricast-1.0.0/data/templates/skill/README.md.template +53 -0
- fabricast-1.0.0/data/templates/skill/SKILL.md.template +33 -0
- fabricast-1.0.0/data/templates/skill/checklist.md.template +30 -0
- fabricast-1.0.0/data/templates/skill/criteria.md.template +20 -0
- fabricast-1.0.0/data/tooling/domains.yaml +22 -0
- fabricast-1.0.0/data/tooling/ingest-sources.yaml +37 -0
- fabricast-1.0.0/data/tooling/obsolete.yaml +3 -0
- fabricast-1.0.0/data/tooling/source-map.yaml +3 -0
- fabricast-1.0.0/fabricast.egg-info/PKG-INFO +426 -0
- fabricast-1.0.0/fabricast.egg-info/SOURCES.txt +319 -0
- fabricast-1.0.0/fabricast.egg-info/dependency_links.txt +1 -0
- fabricast-1.0.0/fabricast.egg-info/entry_points.txt +2 -0
- fabricast-1.0.0/fabricast.egg-info/requires.txt +26 -0
- fabricast-1.0.0/fabricast.egg-info/top_level.txt +3 -0
- fabricast-1.0.0/pyproject.toml +188 -0
- fabricast-1.0.0/scripts/Check-AzureDevOpsSetup.ps1 +175 -0
- fabricast-1.0.0/scripts/Check-Latest.ps1 +12 -0
- fabricast-1.0.0/scripts/Check-PipelineRuns.ps1 +56 -0
- fabricast-1.0.0/scripts/Check-Publish.ps1 +12 -0
- fabricast-1.0.0/scripts/Clean-BuildArtifacts.ps1 +46 -0
- fabricast-1.0.0/scripts/Cleanup-And-Reinstall.ps1 +65 -0
- fabricast-1.0.0/scripts/Connect-To-Pythontools-Feed.ps1 +152 -0
- fabricast-1.0.0/scripts/Ensure-GlobalCommand.ps1 +219 -0
- fabricast-1.0.0/scripts/Find-Feed.ps1 +49 -0
- fabricast-1.0.0/scripts/Get-PipelineErrors.ps1 +70 -0
- fabricast-1.0.0/scripts/Get-RunError.ps1 +52 -0
- fabricast-1.0.0/scripts/Grant-FeedPermissions.ps1 +89 -0
- fabricast-1.0.0/scripts/Monitor-PipelineRun.ps1 +50 -0
- fabricast-1.0.0/scripts/Profile-Helper.ps1 +86 -0
- fabricast-1.0.0/scripts/Quick-Status.ps1 +30 -0
- fabricast-1.0.0/scripts/Reorganize-Artifacts.ps1 +129 -0
- fabricast-1.0.0/scripts/Reorganize-ProjectStructure.ps1 +109 -0
- fabricast-1.0.0/scripts/Setup-AzureDevOps.ps1 +155 -0
- fabricast-1.0.0/scripts/Setup-Fabricast.ps1 +843 -0
- fabricast-1.0.0/scripts/Setup-Pythontools.ps1 +414 -0
- fabricast-1.0.0/scripts/Status.ps1 +18 -0
- fabricast-1.0.0/scripts/Test-Regex-Fix.ps1 +42 -0
- fabricast-1.0.0/scripts/__init__.py +3 -0
- fabricast-1.0.0/scripts/check_all_pipelines.py +38 -0
- fabricast-1.0.0/scripts/check_build_failure.py +69 -0
- fabricast-1.0.0/scripts/check_ci.py +43 -0
- fabricast-1.0.0/scripts/check_feed.py +44 -0
- fabricast-1.0.0/scripts/check_feed_packages.py +70 -0
- fabricast-1.0.0/scripts/check_identity.py +78 -0
- fabricast-1.0.0/scripts/check_pipelines.py +54 -0
- fabricast-1.0.0/scripts/check_system_tools_pipelines.py +87 -0
- fabricast-1.0.0/scripts/compare_pipelines.py +87 -0
- fabricast-1.0.0/scripts/explain_status.py +141 -0
- fabricast-1.0.0/scripts/fix_workspace_violations.py +1065 -0
- fabricast-1.0.0/scripts/get_build_logs.py +113 -0
- fabricast-1.0.0/scripts/get_failed_build.py +104 -0
- fabricast-1.0.0/scripts/get_pipeline_logs.py +89 -0
- fabricast-1.0.0/scripts/grant_pipeline_permissions.py +71 -0
- fabricast-1.0.0/scripts/install-fabricast.sh +63 -0
- fabricast-1.0.0/scripts/monitor_build.py +49 -0
- fabricast-1.0.0/scripts/monitor_latest.py +65 -0
- fabricast-1.0.0/scripts/quick_check.py +28 -0
- fabricast-1.0.0/scripts/quick_status.py +23 -0
- fabricast-1.0.0/scripts/record_audit_date.py +27 -0
- fabricast-1.0.0/setup.cfg +4 -0
- fabricast-1.0.0/src/generator/__init__.py +22 -0
- fabricast-1.0.0/src/generator/__main__.py +7 -0
- fabricast-1.0.0/src/generator/audit_freshness.py +57 -0
- fabricast-1.0.0/src/generator/claude_layout.py +231 -0
- fabricast-1.0.0/src/generator/claude_skills_install.py +47 -0
- fabricast-1.0.0/src/generator/cli/__init__.py +3 -0
- fabricast-1.0.0/src/generator/cli/commands/__init__.py +115 -0
- fabricast-1.0.0/src/generator/cli/commands/_helpers.py +138 -0
- fabricast-1.0.0/src/generator/cli/commands/check_skills.py +103 -0
- fabricast-1.0.0/src/generator/cli/commands/clean_skills.py +171 -0
- fabricast-1.0.0/src/generator/cli/commands/current.py +65 -0
- fabricast-1.0.0/src/generator/cli/commands/discover.py +113 -0
- fabricast-1.0.0/src/generator/cli/commands/generate.py +259 -0
- fabricast-1.0.0/src/generator/cli/commands/ingest.py +105 -0
- fabricast-1.0.0/src/generator/cli/commands/install.py +391 -0
- fabricast-1.0.0/src/generator/cli/commands/list.py +111 -0
- fabricast-1.0.0/src/generator/cli/commands/list_skills.py +129 -0
- fabricast-1.0.0/src/generator/cli/commands/provision.py +198 -0
- fabricast-1.0.0/src/generator/cli/commands/recipe.py +141 -0
- fabricast-1.0.0/src/generator/cli/commands/remove.py +411 -0
- fabricast-1.0.0/src/generator/cli/commands/remove_skill.py +161 -0
- fabricast-1.0.0/src/generator/cli/commands/route.py +151 -0
- fabricast-1.0.0/src/generator/cli/commands/route_emit.py +61 -0
- fabricast-1.0.0/src/generator/cli/commands/route_hook.py +85 -0
- fabricast-1.0.0/src/generator/cli/commands/set_active.py +141 -0
- fabricast-1.0.0/src/generator/cli/commands/setup.py +168 -0
- fabricast-1.0.0/src/generator/cli/commands/skill.py +325 -0
- fabricast-1.0.0/src/generator/cli/commands/update_skill.py +319 -0
- fabricast-1.0.0/src/generator/cli/commands/validate.py +27 -0
- fabricast-1.0.0/src/generator/cli/commands/verify.py +189 -0
- fabricast-1.0.0/src/generator/cli/main.py +10 -0
- fabricast-1.0.0/src/generator/cli/parser.py +458 -0
- fabricast-1.0.0/src/generator/cline_layout.py +233 -0
- fabricast-1.0.0/src/generator/constants.py +127 -0
- fabricast-1.0.0/src/generator/copilot_layout.py +322 -0
- fabricast-1.0.0/src/generator/copilot_skills_install.py +74 -0
- fabricast-1.0.0/src/generator/cursor_layout.py +281 -0
- fabricast-1.0.0/src/generator/cursor_personal_context_sync.py +162 -0
- fabricast-1.0.0/src/generator/cursor_skills_install.py +57 -0
- fabricast-1.0.0/src/generator/exceptions.py +41 -0
- fabricast-1.0.0/src/generator/executor.py +129 -0
- fabricast-1.0.0/src/generator/format_resolver.py +129 -0
- fabricast-1.0.0/src/generator/formatter.py +37 -0
- fabricast-1.0.0/src/generator/formatters/__init__.py +34 -0
- fabricast-1.0.0/src/generator/formatters/claude_xml.py +12 -0
- fabricast-1.0.0/src/generator/formatters/common.py +39 -0
- fabricast-1.0.0/src/generator/formatters/copilot_md.py +121 -0
- fabricast-1.0.0/src/generator/formatters/cursor.py +320 -0
- fabricast-1.0.0/src/generator/formatters/prompt_styles/__init__.py +18 -0
- fabricast-1.0.0/src/generator/formatters/prompt_styles/base.py +111 -0
- fabricast-1.0.0/src/generator/formatters/prompt_styles/compact.py +82 -0
- fabricast-1.0.0/src/generator/formatters/prompt_styles/markdown.py +306 -0
- fabricast-1.0.0/src/generator/formatters/prompt_styles/ultra_compact.py +117 -0
- fabricast-1.0.0/src/generator/formatters/standalone_prompt.py +70 -0
- fabricast-1.0.0/src/generator/formatters/system.py +419 -0
- fabricast-1.0.0/src/generator/host_detect.py +62 -0
- fabricast-1.0.0/src/generator/ingest/__init__.py +44 -0
- fabricast-1.0.0/src/generator/ingest/diff.py +69 -0
- fabricast-1.0.0/src/generator/ingest/fetch.py +121 -0
- fabricast-1.0.0/src/generator/ingest/index_parse.py +41 -0
- fabricast-1.0.0/src/generator/ingest/mapping.py +55 -0
- fabricast-1.0.0/src/generator/ingest/models.py +61 -0
- fabricast-1.0.0/src/generator/ingest/parse.py +90 -0
- fabricast-1.0.0/src/generator/ingest/pipeline.py +82 -0
- fabricast-1.0.0/src/generator/ingest/report.py +85 -0
- fabricast-1.0.0/src/generator/ingest/sources.py +56 -0
- fabricast-1.0.0/src/generator/installer.py +64 -0
- fabricast-1.0.0/src/generator/layout_base.py +254 -0
- fabricast-1.0.0/src/generator/layout_common.py +194 -0
- fabricast-1.0.0/src/generator/loader.py +144 -0
- fabricast-1.0.0/src/generator/merge/__init__.py +44 -0
- fabricast-1.0.0/src/generator/merge/conflict_detection.py +108 -0
- fabricast-1.0.0/src/generator/merge/model_requirements.py +175 -0
- fabricast-1.0.0/src/generator/merge/strategies.py +229 -0
- fabricast-1.0.0/src/generator/merger.py +136 -0
- fabricast-1.0.0/src/generator/output_formats.py +90 -0
- fabricast-1.0.0/src/generator/paths.py +170 -0
- fabricast-1.0.0/src/generator/pipeline.py +186 -0
- fabricast-1.0.0/src/generator/project_layout.py +211 -0
- fabricast-1.0.0/src/generator/provisions/__init__.py +39 -0
- fabricast-1.0.0/src/generator/provisions/behavior.py +180 -0
- fabricast-1.0.0/src/generator/provisions/capabilities.py +82 -0
- fabricast-1.0.0/src/generator/provisions/delegation.py +159 -0
- fabricast-1.0.0/src/generator/provisions/dict_merge.py +26 -0
- fabricast-1.0.0/src/generator/provisions/installer.py +141 -0
- fabricast-1.0.0/src/generator/provisions/loader.py +111 -0
- fabricast-1.0.0/src/generator/provisions/models.py +94 -0
- fabricast-1.0.0/src/generator/provisions/plugin.py +157 -0
- fabricast-1.0.0/src/generator/provisions/schema.py +41 -0
- fabricast-1.0.0/src/generator/provisions/strategies.py +57 -0
- fabricast-1.0.0/src/generator/provisions/tool_setting.py +78 -0
- fabricast-1.0.0/src/generator/recipe_naming.py +80 -0
- fabricast-1.0.0/src/generator/routing/__init__.py +30 -0
- fabricast-1.0.0/src/generator/routing/classifier.py +443 -0
- fabricast-1.0.0/src/generator/routing/emitters.py +123 -0
- fabricast-1.0.0/src/generator/routing/engine.py +217 -0
- fabricast-1.0.0/src/generator/routing/hook.py +208 -0
- fabricast-1.0.0/src/generator/routing/hook_install.py +161 -0
- fabricast-1.0.0/src/generator/routing/launcher.py +31 -0
- fabricast-1.0.0/src/generator/routing/prompter.py +168 -0
- fabricast-1.0.0/src/generator/routing/strategies.py +166 -0
- fabricast-1.0.0/src/generator/skill_catalog.py +516 -0
- fabricast-1.0.0/src/generator/skill_updater.py +201 -0
- fabricast-1.0.0/src/generator/skills/__init__.py +218 -0
- fabricast-1.0.0/src/generator/skills/composer.py +923 -0
- fabricast-1.0.0/src/generator/skills/enhancer.py +351 -0
- fabricast-1.0.0/src/generator/skills/metadata.py +263 -0
- fabricast-1.0.0/src/generator/skills/scripts.py +120 -0
- fabricast-1.0.0/src/generator/validator.py +99 -0
fabricast-1.0.0/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Edward Fry
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
# Include recipe and configuration data in source distributions
|
|
2
|
+
include README.md
|
|
3
|
+
include LICENSE*
|
|
4
|
+
|
|
5
|
+
# Include all data files from data/ directory
|
|
6
|
+
recursive-include data *.yaml
|
|
7
|
+
recursive-include data *.json
|
|
8
|
+
recursive-include data *.md
|
|
9
|
+
recursive-include data *.txt
|
|
10
|
+
recursive-include data *.template
|
fabricast-1.0.0/PKG-INFO
ADDED
|
@@ -0,0 +1,426 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: fabricast
|
|
3
|
+
Version: 1.0.0
|
|
4
|
+
Summary: Composable AI role system with recipe-based generation for Cursor, Copilot, Claude, and Cline
|
|
5
|
+
Author: Edward Fry
|
|
6
|
+
License-Expression: MIT
|
|
7
|
+
Classifier: Development Status :: 4 - Beta
|
|
8
|
+
Classifier: Environment :: Console
|
|
9
|
+
Classifier: Intended Audience :: Developers
|
|
10
|
+
Classifier: Operating System :: OS Independent
|
|
11
|
+
Classifier: Programming Language :: Python :: 3
|
|
12
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
13
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
14
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
15
|
+
Classifier: Topic :: Software Development :: Code Generators
|
|
16
|
+
Requires-Python: >=3.11
|
|
17
|
+
Description-Content-Type: text/markdown
|
|
18
|
+
License-File: LICENSE
|
|
19
|
+
Requires-Dist: pyyaml>=6.0
|
|
20
|
+
Requires-Dist: jsonschema>=4.20
|
|
21
|
+
Provides-Extra: dev
|
|
22
|
+
Requires-Dist: build>=1.0; extra == "dev"
|
|
23
|
+
Requires-Dist: setuptools>=77; extra == "dev"
|
|
24
|
+
Requires-Dist: wheel>=0.40; extra == "dev"
|
|
25
|
+
Requires-Dist: pytest>=8.0; extra == "dev"
|
|
26
|
+
Requires-Dist: pytest-cov>=4.0; extra == "dev"
|
|
27
|
+
Requires-Dist: pytest-xdist>=3.0; extra == "dev"
|
|
28
|
+
Requires-Dist: pytest-timeout>=2.0; extra == "dev"
|
|
29
|
+
Requires-Dist: ruff>=0.1.0; extra == "dev"
|
|
30
|
+
Requires-Dist: mypy>=1.0; extra == "dev"
|
|
31
|
+
Requires-Dist: types-PyYAML>=6.0; extra == "dev"
|
|
32
|
+
Requires-Dist: types-jsonschema>=4.20; extra == "dev"
|
|
33
|
+
Requires-Dist: black>=24.0; extra == "dev"
|
|
34
|
+
Requires-Dist: bandit>=1.7; extra == "dev"
|
|
35
|
+
Requires-Dist: pylint>=3.0; extra == "dev"
|
|
36
|
+
Requires-Dist: mutmut>=3.0; extra == "dev"
|
|
37
|
+
Requires-Dist: radon>=6.0; extra == "dev"
|
|
38
|
+
Requires-Dist: cognitive-complexity>=1.3; extra == "dev"
|
|
39
|
+
Provides-Extra: tooling
|
|
40
|
+
Requires-Dist: httpx>=0.27; extra == "tooling"
|
|
41
|
+
Requires-Dist: ruamel.yaml>=0.18; extra == "tooling"
|
|
42
|
+
Requires-Dist: packaging>=23.0; extra == "tooling"
|
|
43
|
+
Dynamic: license-file
|
|
44
|
+
|
|
45
|
+
# Fabricast
|
|
46
|
+
|
|
47
|
+
**Last Updated:** April 25, 2026
|
|
48
|
+
|
|
49
|
+
Composable YAML **roles** and **recipes** for AI coding assistants. Generates and installs tool-native rules for **Cursor**, **GitHub Copilot**, **Claude**, and **Cline**.
|
|
50
|
+
|
|
51
|
+
---
|
|
52
|
+
|
|
53
|
+
## 📚 Documentation
|
|
54
|
+
|
|
55
|
+
**New to Fabricast?** Start here:
|
|
56
|
+
|
|
57
|
+
### 🚀 Getting Started
|
|
58
|
+
- **[Quick Start Guide](docs/quickstart.md)** - Get up and running in 5 minutes
|
|
59
|
+
- **[User Guide](docs/user-guide.md)** - Complete workflows and usage patterns
|
|
60
|
+
- **[Global Command Setup](docs/global-command-setup.md)** - Make fabricast work from anywhere
|
|
61
|
+
- **[Troubleshooting](docs/troubleshooting.md)** - Common issues and solutions
|
|
62
|
+
|
|
63
|
+
### 🧠 Understanding Fabricast
|
|
64
|
+
- **[Core Concepts](docs/concepts.md)** - How Fabricast works (with diagrams!)
|
|
65
|
+
- **[Recipe Guide](docs/recipe-guide.md)** - Creating and customizing recipes
|
|
66
|
+
- **[Visual Diagrams](docs/diagrams.md)** - All diagrams in one place
|
|
67
|
+
- **[Diagram Style Guide](docs/diagram-style-guide.md)** - Visual design system
|
|
68
|
+
|
|
69
|
+
### 🔧 For Developers
|
|
70
|
+
- **[Developer Guide](docs/developer-guide.md)** - Setup, testing, and best practices
|
|
71
|
+
- **[Contributing Guide](docs/contributing.md)** - How to contribute (PR process, standards)
|
|
72
|
+
- **[Extending Fabricast](docs/extending.md)** - Adding new features (step-by-step)
|
|
73
|
+
- **[Architecture](docs/architecture.md)** - Technical design and patterns
|
|
74
|
+
- **[Requirements](docs/requirements.md)** - Product goals and principles
|
|
75
|
+
|
|
76
|
+
### 📖 Reference
|
|
77
|
+
- **[CLI Reference](docs/cli-reference.md)** - Complete command documentation
|
|
78
|
+
- **[Recipe Schema](docs/recipe-schema.md)** - YAML schema reference
|
|
79
|
+
- **[Examples & Cookbook](docs/examples.md)** - Real-world scenarios
|
|
80
|
+
|
|
81
|
+
---
|
|
82
|
+
|
|
83
|
+
## Code Quality
|
|
84
|
+
|
|
85
|
+
[](tests/)
|
|
86
|
+
[](tests/)
|
|
87
|
+
|
|
88
|
+
**Automated Quality Guards** (enforced via `pytest`):
|
|
89
|
+
- ✅ Cyclomatic Complexity ≤ 10 (PRIMARY SRP guard)
|
|
90
|
+
- ✅ Method Count ≤ 10 per class
|
|
91
|
+
- ✅ File Size ≤ 400 lines per module
|
|
92
|
+
- ✅ Function Size ≤ 25 lines
|
|
93
|
+
- ✅ Import Count ≤ 10 per module
|
|
94
|
+
- ✅ Workspace Organization (17 convention tests)
|
|
95
|
+
|
|
96
|
+
See [docs/architecture.md#code-quality-standards](docs/architecture.md#code-quality-standards) for details.
|
|
97
|
+
|
|
98
|
+
## Requirements
|
|
99
|
+
|
|
100
|
+
- Python **3.11+**
|
|
101
|
+
- [PyYAML](https://pypi.org/project/PyYAML/) and [jsonschema](https://pypi.org/project/jsonschema/) (installed with the package)
|
|
102
|
+
|
|
103
|
+
## Installation
|
|
104
|
+
|
|
105
|
+
### One-Command Setup (Recommended)
|
|
106
|
+
|
|
107
|
+
**Same experience for both feed and local repo users:**
|
|
108
|
+
|
|
109
|
+
**From Azure Artifacts feed:**
|
|
110
|
+
```powershell
|
|
111
|
+
# After pip install fabricast
|
|
112
|
+
fabricast setup
|
|
113
|
+
|
|
114
|
+
# Or with PAT directly
|
|
115
|
+
fabricast setup --pat 'your-pat-here'
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
**From local repository:**
|
|
119
|
+
```powershell
|
|
120
|
+
.\scripts\Setup-Fabricast.ps1
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
Both approaches:
|
|
124
|
+
- ✓ Auto-detect feed vs local installation
|
|
125
|
+
- ✓ Handle pip configuration and package installation
|
|
126
|
+
- ✓ Ensure `fabricast` command works globally from any directory
|
|
127
|
+
- ✓ Configure PowerShell profile with helpful functions
|
|
128
|
+
- ✓ Are idempotent - safe to run multiple times
|
|
129
|
+
|
|
130
|
+
**Need a PAT for feed access?**
|
|
131
|
+
- Get one at: `https://dev.azure.com/edwardf/_usersSettings/tokens`
|
|
132
|
+
- Required scope: **Packaging (Read)**
|
|
133
|
+
|
|
134
|
+
**Additional options:**
|
|
135
|
+
```powershell
|
|
136
|
+
# Feed users - extract setup script without running it
|
|
137
|
+
fabricast setup --extract-only
|
|
138
|
+
|
|
139
|
+
# Feed users - run with specific options
|
|
140
|
+
fabricast setup --from-feed --skip-profile
|
|
141
|
+
|
|
142
|
+
# Local repo - run with options
|
|
143
|
+
.\scripts\Setup-Fabricast.ps1 -FromLocal -SkipProfile
|
|
144
|
+
|
|
145
|
+
# Local repo - test distribution by building wheel first
|
|
146
|
+
.\scripts\Setup-Fabricast.ps1 -FromLocal -BuildWheel
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
**Troubleshooting:** If setup fails, run the test suite for diagnostics:
|
|
150
|
+
```powershell
|
|
151
|
+
.\tests\Test-SetupScript.ps1
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
### After Setup
|
|
155
|
+
|
|
156
|
+
**Restart your terminal**, then test:
|
|
157
|
+
|
|
158
|
+
```bash
|
|
159
|
+
fabricast --version
|
|
160
|
+
fabricast verify # confirms install health, PATH, and recipe data
|
|
161
|
+
fabricast list
|
|
162
|
+
fabricast install '*' --format cursor
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
**Alternative commands that always work:**
|
|
166
|
+
```bash
|
|
167
|
+
fab --version # Short alias (if profile configured)
|
|
168
|
+
python -m generator.cli.main --version # Module form (always works)
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
### Manual Installation (Advanced)
|
|
172
|
+
|
|
173
|
+
If you prefer manual control:
|
|
174
|
+
|
|
175
|
+
**From Azure Artifacts feed:**
|
|
176
|
+
```powershell
|
|
177
|
+
# See scripts/Setup-Pythontools.ps1 for pip configuration details
|
|
178
|
+
pip install --user fabricast
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
**From local repository:**
|
|
182
|
+
```bash
|
|
183
|
+
pip install --user -e ".[dev]"
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
- **`[dev]`** — pytest and pytest-cov for tests.
|
|
187
|
+
- **`[tooling]`** — optional sidecar for auditing tool lists (`python -m tooling`). See [tooling/README.md](tooling/README.md).
|
|
188
|
+
|
|
189
|
+
**After manual installation, ensure global access:**
|
|
190
|
+
```powershell
|
|
191
|
+
.\scripts\Setup-Fabricast.ps1 -SkipProfile # Just fix PATH, skip profile edits
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
## Making fabricast Globally Available
|
|
195
|
+
|
|
196
|
+
The `fabricast` command should work from **any directory** - this is handled automatically by `Setup-Fabricast.ps1`.
|
|
197
|
+
|
|
198
|
+
**If you used the recommended setup script, you're done!** Just restart your terminal.
|
|
199
|
+
|
|
200
|
+
**If you installed manually or having issues:**
|
|
201
|
+
|
|
202
|
+
```powershell
|
|
203
|
+
# Test if it's working
|
|
204
|
+
fabricast --version
|
|
205
|
+
|
|
206
|
+
# If not found, run the setup script to fix it
|
|
207
|
+
.\scripts\Setup-Fabricast.ps1
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
**📖 For troubleshooting and details: [Global Command Setup Guide](docs/global-command-setup.md)**
|
|
211
|
+
|
|
212
|
+
### How It Works
|
|
213
|
+
|
|
214
|
+
When you install fabricast, Python creates a `fabricast.exe` (Windows) or `fabricast` (Linux/Mac) in its Scripts directory. For the command to work globally:
|
|
215
|
+
|
|
216
|
+
1. **Package must be installed** - Not just cloned, but actually installed with pip
|
|
217
|
+
2. **Scripts folder must be in PATH** - So your shell can find the executable
|
|
218
|
+
|
|
219
|
+
**Setup-Fabricast.ps1 handles both automatically.**
|
|
220
|
+
|
|
221
|
+
### Three Ways to Use fabricast
|
|
222
|
+
|
|
223
|
+
After setup, you can use any of these commands:
|
|
224
|
+
|
|
225
|
+
```bash
|
|
226
|
+
# 1. Direct command (cleanest - requires PATH)
|
|
227
|
+
fabricast --version
|
|
228
|
+
fabricast list
|
|
229
|
+
fabricast install '*' --format cursor
|
|
230
|
+
|
|
231
|
+
# 2. PowerShell alias (convenient - if profile configured)
|
|
232
|
+
fab --version
|
|
233
|
+
fab list
|
|
234
|
+
|
|
235
|
+
# 3. Module form (always works - no PATH needed)
|
|
236
|
+
python -m generator.cli.main --version
|
|
237
|
+
python -m generator.cli.main list
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
### Troubleshooting
|
|
241
|
+
|
|
242
|
+
**Command not found?**
|
|
243
|
+
```powershell
|
|
244
|
+
# One command to fix everything
|
|
245
|
+
.\scripts\Setup-Fabricast.ps1
|
|
246
|
+
|
|
247
|
+
# Then restart your terminal
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
**Still having issues?**
|
|
251
|
+
See the [Global Command Setup Guide](docs/global-command-setup.md) for detailed troubleshooting.
|
|
252
|
+
|
|
253
|
+
## CLI
|
|
254
|
+
|
|
255
|
+
After install, use `fabricast …` (console script from `[project.scripts]`).
|
|
256
|
+
|
|
257
|
+
Common commands:
|
|
258
|
+
|
|
259
|
+
| Command | Purpose |
|
|
260
|
+
|--------|---------|
|
|
261
|
+
| `fabricast install '*' --format cursor` (or `copilot`, `claude`, `cline`) | Install all recipes globally (default target: user home) |
|
|
262
|
+
| `fabricast install '*game*' 'test-*' --format cursor` | Install recipes matching wildcard patterns |
|
|
263
|
+
| `fabricast remove 'game*' --format cursor` | Remove installed recipes matching wildcard patterns |
|
|
264
|
+
| `fabricast list '*game*' 'test-*'` | List recipes matching wildcard patterns |
|
|
265
|
+
| `fabricast set-active <recipe> --format cursor` (or `copilot`, `claude`, `cline`) | Switch active persona for that tool |
|
|
266
|
+
| `fabricast provision list` / `provision enable <name>` / `provision apply` | Apply optional, non-persona capabilities (status line, plugins, behaviors). See [docs/provisions.md](docs/provisions.md) |
|
|
267
|
+
| `fabricast ingest <source>` | Scan an external source and emit a report-only ingest proposal. See [docs/ingest.md](docs/ingest.md) and [docs/recipe-naming.md](docs/recipe-naming.md) |
|
|
268
|
+
| `fabricast discover [--source <repo>]` | Scan community indexes for candidates, flagging which already exist in Fabricast (report-only). See [docs/discovery.md](docs/discovery.md) |
|
|
269
|
+
| `fabricast recipe <name> --format copilot` | Print composed output for one recipe |
|
|
270
|
+
| `fabricast validate` | Validate roles/recipes against JSON Schema |
|
|
271
|
+
| `fabricast verify` | Verify install health (version, PATH, recipe data, active personas) |
|
|
272
|
+
| `fabricast list` | List roles and recipes |
|
|
273
|
+
|
|
274
|
+
> **v1.1.0 Breaking Change:** The `install-all` command has been replaced with `install` that accepts wildcard patterns.
|
|
275
|
+
>
|
|
276
|
+
> **Migration:**
|
|
277
|
+
> - Old: `fabricast install-all --format cursor`
|
|
278
|
+
> - New: `fabricast install '*' --format cursor`
|
|
279
|
+
>
|
|
280
|
+
> The new `install` command supports multiple glob patterns for more flexible recipe selection:
|
|
281
|
+
> - `install '*'` — install all recipes (replaces install-all)
|
|
282
|
+
> - `install '*game*'` — install all game-related recipes
|
|
283
|
+
> - `install 'test-*' '*python*'` — install test recipes and Python recipes
|
|
284
|
+
>
|
|
285
|
+
> The `list` command also supports multiple patterns: `list '*game*' 'test-*'`
|
|
286
|
+
|
|
287
|
+
### Cursor: global install and User Rules sync
|
|
288
|
+
|
|
289
|
+
Fabricast's **global** `install` / `set-active` (default `--target global`, i.e. your user home) writes under `~/.cursor/rules/` **and** merges the same text into Cursor's **Settings > Rules for AI** storage (`aicontext.personalContext` in `%APPDATA%\Cursor\User\globalStorage\state.vscdb` on Windows, analogous paths on macOS/Linux). That way the Agent sees your personas in **every folder** without per-repo installs. After `set-active`, run **Reload Window** if Cursor was already open so the UI picks up the updated row.
|
|
290
|
+
|
|
291
|
+
If the DB is locked, quit Cursor once and re-run the command, or set `FABRICAST_SKIP_CURSOR_USER_SYNC=1` to only update files on disk.
|
|
292
|
+
|
|
293
|
+
**Note:** Sync **replaces** the entire Cursor **Rules for AI** field. If you already keep unrelated instructions there, copy them elsewhere first.
|
|
294
|
+
|
|
295
|
+
**"fabricast" in Cursor Settings:** Cursor may show a **fabricast** tab or filter under **Rules, Skills, Subagents**. Fabricast **cannot** hide that UI or mirror full state into it from this CLI (no supported API). That tab is **not** updated by `install` / `set-active`. **Source of truth** = this repo's YAML + CLI outputs (`~/.cursor/rules/`, `~/.fabricast/`, synced User rules, `~/.cursor/skills/`). Avoid adding parallel Rules or Skills there for personas—they can confuse people or conflict. The synced rules text includes a short reminder.
|
|
296
|
+
|
|
297
|
+
|
|
298
|
+
### Cursor skills (chat / slash)
|
|
299
|
+
|
|
300
|
+
Each successful **`install --format cursor`** (any `--target`) copies Agent skills from [`.cursor/skills/`](.cursor/skills/) into **`~/.cursor/skills/`** (Windows: `%USERPROFILE%\.cursor\skills\`) so **`/fabricast-*`** works in every workspace. No separate setup step.
|
|
301
|
+
|
|
302
|
+
| Skill | Purpose |
|
|
303
|
+
|--------|--------|
|
|
304
|
+
| `fabricast-current` | Show active recipe id (`~/.fabricast/cursor-active.json`) |
|
|
305
|
+
| `fabricast-list` | Run `generate.py list` (set **`FABRICAST_BASE`** to your clone when the workspace is not Fabricast) |
|
|
306
|
+
| `fabricast-set-active` | Run global `set-active <recipe> --format cursor` |
|
|
307
|
+
|
|
308
|
+
Set **`FABRICAST_SKIP_CURSOR_SKILLS=1`** to skip copying skills (e.g. in CI).
|
|
309
|
+
|
|
310
|
+
### GitHub Copilot (VS Code)
|
|
311
|
+
|
|
312
|
+
Global **`install '*' --format copilot`** writes always-on custom instructions under **`~/.copilot/instructions/`** (`fabricast-baseline`, `fabricast-router`, `fabricast-active` as `*.instructions.md` with `applyTo: "**"`, per [VS Code custom instructions](https://code.visualstudio.com/docs/copilot/customization/custom-instructions)). Recipe bodies are cached under **`~/.fabricast/copilot-recipes/`**. Switch persona: **`fabricast set-active <recipe> --format copilot`**.
|
|
313
|
+
|
|
314
|
+
### Claude Code
|
|
315
|
+
|
|
316
|
+
Global install writes **`~/.claude/rules/`** (`fabricast-baseline.md`, `fabricast-router.md`, `fabricast-active.md`) plus cache **`~/.fabricast/claude-recipes/`**, matching [Claude Code memory / user rules](https://code.claude.com/docs/en/memory). **`install '*' --format claude`** also publishes skills from **`.claude/skills/`** to **`~/.claude/skills/`** (skip with **`FABRICAST_SKIP_CLAUDE_SKILLS=1`**). Switch persona: **`fabricast set-active <recipe> --format claude`**.
|
|
317
|
+
|
|
318
|
+
### Cline
|
|
319
|
+
|
|
320
|
+
Global install writes **`~/Documents/Cline/Rules/`** (same three `fabricast-*.md` files) and cache **`~/.fabricast/cline-recipes/`**, consistent with Cline's global rules directory. Switch persona: **`fabricast set-active <recipe> --format cline`**.
|
|
321
|
+
|
|
322
|
+
Override where roles/recipes are read from (e.g. in tests):
|
|
323
|
+
|
|
324
|
+
```bash
|
|
325
|
+
set FABRICAST_BASE=C:\path\to\fabricast
|
|
326
|
+
fabricast validate
|
|
327
|
+
```
|
|
328
|
+
|
|
329
|
+
When the package is installed from PyPI without a nearby recipe tree, set `FABRICAST_BASE` to your clone or data directory.
|
|
330
|
+
|
|
331
|
+
## Working in this repository (clone)
|
|
332
|
+
|
|
333
|
+
Do **not** commit workspace-scoped rules that mirror the global install: **`.github/copilot-instructions.md`**, **`.claude/*.md`** (keep **`.claude/skills/`**), or recipe caches under **`.fabricast/*-recipes/`** and `*-active.json` in the clone. Those paths are ignored (see `.gitignore`) so Copilot, Claude Code, and Cursor pick up personas from your **global** `install` under your user profile. The small **`.fabricast/last-audit`** stamp stays versioned for tooling.
|
|
334
|
+
|
|
335
|
+
## Tests
|
|
336
|
+
|
|
337
|
+
```bash
|
|
338
|
+
# Full test suite (1,334 tests, ~91% coverage)
|
|
339
|
+
pytest
|
|
340
|
+
|
|
341
|
+
# Fast: unit tests only
|
|
342
|
+
pytest --ignore=tests/integration
|
|
343
|
+
|
|
344
|
+
# Faster: unit tests in parallel (~2-3x speedup)
|
|
345
|
+
pytest --ignore=tests/integration -n auto
|
|
346
|
+
|
|
347
|
+
# With coverage report (matches CI)
|
|
348
|
+
pytest --cov=src/generator --cov-report=term --cov-report=html
|
|
349
|
+
|
|
350
|
+
# Integration tests only
|
|
351
|
+
pytest tests/integration
|
|
352
|
+
|
|
353
|
+
# Skip audit tooling tests (optional dependency)
|
|
354
|
+
pytest -m "not audit_tooling"
|
|
355
|
+
|
|
356
|
+
# Run complexity guard tests
|
|
357
|
+
pytest tests/test_code_complexity_guards.py -v
|
|
358
|
+
```
|
|
359
|
+
|
|
360
|
+
**Performance Tips:**
|
|
361
|
+
- Use `-n auto` with pytest-xdist for parallel execution (2-4x faster on multi-core machines)
|
|
362
|
+
- Run unit tests alone during development: `pytest --ignore=tests/integration`
|
|
363
|
+
- Integration tests take ~85% of total runtime (mostly subprocess overhead)
|
|
364
|
+
- Coverage target: 90%+ (currently 91.18%)
|
|
365
|
+
|
|
366
|
+
**Quality Guards:** Automated tests enforce code complexity thresholds to prevent regression. See [docs/architecture.md#code-quality-standards](docs/architecture.md#code-quality-standards).
|
|
367
|
+
|
|
368
|
+
Integration-style tests live under [tests/integration/](tests/integration/).
|
|
369
|
+
|
|
370
|
+
## Package Structure
|
|
371
|
+
|
|
372
|
+
Fabricast uses a standard Python `src/` layout (PEP 517/518 compliant):
|
|
373
|
+
|
|
374
|
+
| Path | Role |
|
|
375
|
+
|------|------|
|
|
376
|
+
| `data/base/`, `data/language_specific/` | Role YAML |
|
|
377
|
+
| `data/recipes/` | Recipe YAML |
|
|
378
|
+
| `data/config/merge-config.yaml` | Merge **field_strategies** and conflict rules (used by the merger) |
|
|
379
|
+
| `data/schemas/` | JSON Schema for roles and recipes |
|
|
380
|
+
| `src/generator/` | Load, merge, validate, format, install |
|
|
381
|
+
| `src/generator/cli/` | CLI entry point and subcommand modules |
|
|
382
|
+
| `src/generator/cli/commands/` | Individual command modules (install, remove, set-active, skill, etc.) |
|
|
383
|
+
| `src/generator/formatters/` | Per-tool markdown/XML emitters |
|
|
384
|
+
| `src/generator/skills/` | Skill generation subsystem (composer, enhancer, metadata) |
|
|
385
|
+
| `tests/` | Test suite (1,334 tests, 91% coverage) |
|
|
386
|
+
| `tests/integration/` | Pipeline and install tests (shared helpers in `tests/integration/helpers.py`) |
|
|
387
|
+
| `src/tooling/` | Optional corpus auditor (`python -m tooling`) |
|
|
388
|
+
| `.cursor/skills/` | Optional Cursor Agent skills (current recipe, list, set-active) |
|
|
389
|
+
| `.claude/skills/` | Optional Claude Code skills (same commands, `--format claude`) |
|
|
390
|
+
| `docs/` | Requirements, architecture, and setup documentation |
|
|
391
|
+
|
|
392
|
+
**Key files:**
|
|
393
|
+
- `src/generator/copilot_layout.py`, `src/generator/claude_layout.py`, `src/generator/cline_layout.py` - Format-specific installers
|
|
394
|
+
- `src/generator/layout_common.py` - Shared baseline + router generation
|
|
395
|
+
- `src/generator/merger.py` - Recipe composition engine
|
|
396
|
+
- `src/generator/pipeline.py` - Generation pipeline orchestration
|
|
397
|
+
|
|
398
|
+
See [docs/architecture.md](docs/architecture.md) for detailed architecture and design decisions.
|
|
399
|
+
|
|
400
|
+
## Workspace Standards
|
|
401
|
+
|
|
402
|
+
**File Naming Conventions:**
|
|
403
|
+
- **Python files:** `snake_case.py` (e.g., `merge_config.py`)
|
|
404
|
+
- **PowerShell scripts:** `PascalCase-With-Hyphens.ps1` (e.g., `Setup-Pythontools.ps1`, `Connect-To-Pythontools-Feed.ps1`)
|
|
405
|
+
- **YAML/JSON config:** `kebab-case.yaml` (e.g., `merge-config.yaml`, `pyproject.toml`)
|
|
406
|
+
- **Documentation:** `kebab-case.md` (e.g., `architecture.md`, `requirements.md`)
|
|
407
|
+
- **Conventional root files:** `README.md`, `WORKSPACE_STATUS.md`, `MANIFEST.in` (allowed exceptions)
|
|
408
|
+
- **Bundled skills:** `SKILL.md` (required by convention)
|
|
409
|
+
- **Schema files:** `name.schema.json` pattern
|
|
410
|
+
- **Template files:** `name.extension.template` pattern
|
|
411
|
+
|
|
412
|
+
**Directory Organization:**
|
|
413
|
+
- **`src/`** — Python code only (no YAML, JSON, or markdown files)
|
|
414
|
+
- **`data/`** — Data files only (YAML, JSON, schemas, templates, no Python)
|
|
415
|
+
- **`tests/`** — Test files mirror `src/` structure (e.g., `tests/unit/generator/` mirrors `src/generator/`)
|
|
416
|
+
- **`scripts/`** — Operational PowerShell scripts (separate from `src/`)
|
|
417
|
+
- **`.tool-stuff/`** — Tool by-products (coverage reports, cache, quality reviews)
|
|
418
|
+
- **`docs/`** — Project documentation
|
|
419
|
+
|
|
420
|
+
**Enforced by:** 17 automated workspace convention tests in `tests/quality/workspace/`
|
|
421
|
+
|
|
422
|
+
Run workspace tests: `pytest tests/quality/workspace/ -v`
|
|
423
|
+
|
|
424
|
+
## License
|
|
425
|
+
|
|
426
|
+
See repository license file if present.
|