create-yss-spec 1.1.2 → 1.1.4
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.
- package/package.json +1 -1
- package/template/.agents/skills/excalidraw-diagram-generator/SKILL.md +3 -3
- package/template/.agents/skills/grill-me/SKILL.md +7 -0
- package/template/.agents/skills/grilling/SKILL.md +12 -0
- package/template/.agents/skills/handoff/SKILL.md +16 -0
- package/template/.agents/skills/to-issues/SKILL.md +2 -2
- package/template/.claude/skills/grill-me/SKILL.md +7 -0
- package/template/.claude/skills/grilling/SKILL.md +12 -0
- package/template/.claude/skills/handoff/SKILL.md +16 -0
- package/template/.claude/skills/to-issues/SKILL.md +2 -2
- package/template/.codex/skills/cross-repo-implementation-routing/SKILL.md +1 -1
- package/template/.codex/skills/data-analytics/.app.json +84 -0
- package/template/.codex/skills/data-analytics/.codex-plugin/plugin.json +66 -0
- package/template/.codex/skills/data-analytics/.mcp.json +30 -0
- package/template/.codex/skills/data-analytics/AGENTS.md +20 -0
- package/template/.codex/skills/data-analytics/DEPENDENCIES.MD +27 -0
- package/template/.codex/skills/data-analytics/README.md +60 -0
- package/template/.codex/skills/data-analytics/assets/datascience-artifact-widget.html +16 -0
- package/template/.codex/skills/data-analytics/assets/datascience-artifact-widget.html.gz.b64.part001 +1 -0
- package/template/.codex/skills/data-analytics/assets/datascience-artifact-widget.html.gz.b64.part002 +1 -0
- package/template/.codex/skills/data-analytics/assets/datascience-artifact-widget.html.gz.b64.part003 +1 -0
- package/template/.codex/skills/data-analytics/assets/datascience-artifact-widget.html.gz.b64.part004 +1 -0
- package/template/.codex/skills/data-analytics/assets/datascience-artifact-widget.html.gz.b64.part005 +1 -0
- package/template/.codex/skills/data-analytics/assets/datascience-artifact-widget.html.gz.b64.part006 +1 -0
- package/template/.codex/skills/data-analytics/assets/datascience-chart-widget.html +16 -0
- package/template/.codex/skills/data-analytics/assets/datascience-chart-widget.html.gz.b64.part001 +1 -0
- package/template/.codex/skills/data-analytics/assets/datascience-chart-widget.html.gz.b64.part002 +1 -0
- package/template/.codex/skills/data-analytics/assets/datascience-chart-widget.html.gz.b64.part003 +1 -0
- package/template/.codex/skills/data-analytics/assets/datascience-chart-widget.html.gz.b64.part004 +1 -0
- package/template/.codex/skills/data-analytics/assets/datascience-chart-widget.html.gz.b64.part005 +1 -0
- package/template/.codex/skills/data-analytics/assets/datascience-chart-widget.html.gz.b64.part006 +1 -0
- package/template/.codex/skills/data-analytics/assets/datascience-chart-widget.html.gz.b64.part007 +1 -0
- package/template/.codex/skills/data-analytics/assets/datascience-small.svg +5 -0
- package/template/.codex/skills/data-analytics/assets/datascience-table-widget.html +16 -0
- package/template/.codex/skills/data-analytics/assets/datascience-table-widget.html.gz.b64.part001 +1 -0
- package/template/.codex/skills/data-analytics/assets/datascience-table-widget.html.gz.b64.part002 +1 -0
- package/template/.codex/skills/data-analytics/assets/datascience-table-widget.html.gz.b64.part003 +1 -0
- package/template/.codex/skills/data-analytics/assets/datascience-table-widget.html.gz.b64.part004 +1 -0
- package/template/.codex/skills/data-analytics/assets/datascience.png +0 -0
- package/template/.codex/skills/data-analytics/assets/datascience.svg +10 -0
- package/template/.codex/skills/data-analytics/mcp/server.cjs +2963 -0
- package/template/.codex/skills/data-analytics/package-lock.json +3048 -0
- package/template/.codex/skills/data-analytics/package.json +43 -0
- package/template/.codex/skills/data-analytics/scripts/normalize-widget-assets.mjs +75 -0
- package/template/.codex/skills/data-analytics/skills/analyze-data-quality/SKILL.md +160 -0
- package/template/.codex/skills/data-analytics/skills/analyze-data-quality/agents/openai.yaml +6 -0
- package/template/.codex/skills/data-analytics/skills/build-dashboard/SKILL.md +148 -0
- package/template/.codex/skills/data-analytics/skills/build-dashboard/agents/openai.yaml +6 -0
- package/template/.codex/skills/data-analytics/skills/build-dashboard/specifications/bi-platform-dashboard.md +18 -0
- package/template/.codex/skills/data-analytics/skills/build-dashboard/specifications/html-dashboard.md +24 -0
- package/template/.codex/skills/data-analytics/skills/build-dashboard/specifications/mcp-artifact-dashboard.md +71 -0
- package/template/.codex/skills/data-analytics/skills/build-dashboard/specifications/streamlit-dashboard.md +85 -0
- package/template/.codex/skills/data-analytics/skills/build-report/SKILL.md +207 -0
- package/template/.codex/skills/data-analytics/skills/build-report/agents/openai.yaml +6 -0
- package/template/.codex/skills/data-analytics/skills/build-report/assets/executive-report-shell.html +70 -0
- package/template/.codex/skills/data-analytics/skills/build-report/assets/technical-report-shell.html +66 -0
- package/template/.codex/skills/data-analytics/skills/build-report/report-to-google-doc/SKILL.md +118 -0
- package/template/.codex/skills/data-analytics/skills/build-report/report-to-google-doc/agents/openai.yaml +6 -0
- package/template/.codex/skills/data-analytics/skills/build-report/report-to-google-doc/scripts/report_to_google_doc/__init__.py +1 -0
- package/template/.codex/skills/data-analytics/skills/build-report/report-to-google-doc/scripts/report_to_google_doc/cli.py +57 -0
- package/template/.codex/skills/data-analytics/skills/build-report/report-to-google-doc/scripts/report_to_google_doc/constants.py +61 -0
- package/template/.codex/skills/data-analytics/skills/build-report/report-to-google-doc/scripts/report_to_google_doc/docx_writer.py +362 -0
- package/template/.codex/skills/data-analytics/skills/build-report/report-to-google-doc/scripts/report_to_google_doc/html_parser.py +829 -0
- package/template/.codex/skills/data-analytics/skills/build-report/report-to-google-doc/scripts/report_to_google_doc/model.py +30 -0
- package/template/.codex/skills/data-analytics/skills/build-report/report-to-google-doc/scripts/report_to_google_doc/plan.py +129 -0
- package/template/.codex/skills/data-analytics/skills/build-report/report-to-google-doc/scripts/report_to_google_doc/quality.py +374 -0
- package/template/.codex/skills/data-analytics/skills/build-report/report-to-google-doc/scripts/report_to_google_doc/rendering.py +613 -0
- package/template/.codex/skills/data-analytics/skills/build-report/report-to-google-doc/scripts/report_to_google_doc/table_utils.py +54 -0
- package/template/.codex/skills/data-analytics/skills/build-report/report-to-google-doc/scripts/report_to_google_doc/utils.py +16 -0
- package/template/.codex/skills/data-analytics/skills/build-report/report-to-google-doc/scripts/report_to_google_doc_plan.py +9 -0
- package/template/.codex/skills/data-analytics/skills/build-report/report-to-google-slides/SKILL.md +78 -0
- package/template/.codex/skills/data-analytics/skills/build-report/report-to-google-slides/agents/openai.yaml +6 -0
- package/template/.codex/skills/data-analytics/skills/build-report/report-to-google-slides/scripts/report_to_google_slides.py +2379 -0
- package/template/.codex/skills/data-analytics/skills/build-report/report-to-pdf/SKILL.md +88 -0
- package/template/.codex/skills/data-analytics/skills/build-report/report-to-pdf/agents/openai.yaml +6 -0
- package/template/.codex/skills/data-analytics/skills/build-report/specifications/executive-report.md +97 -0
- package/template/.codex/skills/data-analytics/skills/build-report/specifications/mcp-app-report.md +59 -0
- package/template/.codex/skills/data-analytics/skills/build-report/specifications/technical-report.md +75 -0
- package/template/.codex/skills/data-analytics/skills/design-kpis/SKILL.md +103 -0
- package/template/.codex/skills/data-analytics/skills/design-kpis/agents/openai.yaml +6 -0
- package/template/.codex/skills/data-analytics/skills/gather-business-context/SKILL.md +68 -0
- package/template/.codex/skills/data-analytics/skills/gather-business-context/agents/openai.yaml +6 -0
- package/template/.codex/skills/data-analytics/skills/index/SKILL.md +251 -0
- package/template/.codex/skills/data-analytics/skills/index/agents/openai.yaml +6 -0
- package/template/.codex/skills/data-analytics/skills/jupyter-notebooks/SKILL.md +131 -0
- package/template/.codex/skills/data-analytics/skills/jupyter-notebooks/agents/openai.yaml +6 -0
- package/template/.codex/skills/data-analytics/skills/kpi-reporting/SKILL.md +141 -0
- package/template/.codex/skills/data-analytics/skills/kpi-reporting/agents/openai.yaml +6 -0
- package/template/.codex/skills/data-analytics/skills/kpi-reporting/references/report-templates.md +32 -0
- package/template/.codex/skills/data-analytics/skills/market-sizing/SKILL.md +106 -0
- package/template/.codex/skills/data-analytics/skills/market-sizing/agents/openai.yaml +6 -0
- package/template/.codex/skills/data-analytics/skills/metric-diagnostics/SKILL.md +130 -0
- package/template/.codex/skills/data-analytics/skills/metric-diagnostics/agents/openai.yaml +6 -0
- package/template/.codex/skills/data-analytics/skills/product-business-analysis/SKILL.md +141 -0
- package/template/.codex/skills/data-analytics/skills/product-business-analysis/agents/openai.yaml +6 -0
- package/template/.codex/skills/data-analytics/skills/spreadsheets/SKILL.md +178 -0
- package/template/.codex/skills/data-analytics/skills/spreadsheets/agents/openai.yaml +9 -0
- package/template/.codex/skills/data-analytics/skills/spreadsheets/assets/file-spreadsheet.png +0 -0
- package/template/.codex/skills/data-analytics/skills/spreadsheets/charts.md +31 -0
- package/template/.codex/skills/data-analytics/skills/spreadsheets/references/artifact_tool_api.md +466 -0
- package/template/.codex/skills/data-analytics/skills/spreadsheets/style_guidelines.md +99 -0
- package/template/.codex/skills/data-analytics/skills/user-context/SKILL.md +195 -0
- package/template/.codex/skills/data-analytics/skills/user-context/agents/openai.yaml +6 -0
- package/template/.codex/skills/data-analytics/skills/user-context/plugin-author-config/automation-config.md +26 -0
- package/template/.codex/skills/data-analytics/skills/user-context/plugin-author-config/source-category-config.json +51 -0
- package/template/.codex/skills/data-analytics/skills/user-context/plugin-author-config/user-context-config.md +66 -0
- package/template/.codex/skills/data-analytics/skills/user-context/references/automation.md +69 -0
- package/template/.codex/skills/data-analytics/skills/user-context/references/onboarding-examples.md +204 -0
- package/template/.codex/skills/data-analytics/skills/user-context/references/onboarding-state-template.json +87 -0
- package/template/.codex/skills/data-analytics/skills/user-context/references/onboarding.md +497 -0
- package/template/.codex/skills/data-analytics/skills/user-context/references/semantic-layer/connector-playbook.md +74 -0
- package/template/.codex/skills/data-analytics/skills/user-context/references/semantic-layer/setup.md +65 -0
- package/template/.codex/skills/data-analytics/skills/user-context/references/semantic-layer/skill-template.md +160 -0
- package/template/.codex/skills/data-analytics/skills/user-context/references/semantic-layer/source-intake.md +75 -0
- package/template/.codex/skills/data-analytics/skills/user-context/references/semantic-layer/weekly-polling-automation.md +96 -0
- package/template/.codex/skills/data-analytics/skills/user-context/references/source-category-runtime.md +263 -0
- package/template/.codex/skills/data-analytics/skills/user-context/scripts/data_analytics_preflight.py +1460 -0
- package/template/.codex/skills/data-analytics/skills/user-context/scripts/init_user_context_state.py +128 -0
- package/template/.codex/skills/data-analytics/skills/user-context/scripts/reset_user_context_state.py +101 -0
- package/template/.codex/skills/data-analytics/skills/user-context/scripts/validate_user_context_preflight.py +499 -0
- package/template/.codex/skills/data-analytics/skills/user-context/tests/test_state_helpers.py +978 -0
- package/template/.codex/skills/data-analytics/skills/validate-data/SKILL.md +190 -0
- package/template/.codex/skills/data-analytics/skills/validate-data/agents/openai.yaml +6 -0
- package/template/.codex/skills/data-analytics/skills/visualize-data/SKILL.md +157 -0
- package/template/.codex/skills/data-analytics/skills/visualize-data/agents/openai.yaml +6 -0
- package/template/.codex/skills/data-analytics/skills/visualize-data/references/seaborn-templates.md +774 -0
- package/template/.codex/skills/data-analytics/src/DESIGN.md +222 -0
- package/template/.codex/skills/data-analytics/src/analytics-app/App.tsx +3666 -0
- package/template/.codex/skills/data-analytics/src/analytics-app/analytics-layout.test.mjs +136 -0
- package/template/.codex/skills/data-analytics/src/analytics-app/charting/ChartFrame.tsx +54 -0
- package/template/.codex/skills/data-analytics/src/analytics-app/charting/ChartLegend.tsx +96 -0
- package/template/.codex/skills/data-analytics/src/analytics-app/charting/ChartRenderer.tsx +1647 -0
- package/template/.codex/skills/data-analytics/src/analytics-app/charting/ChartTooltip.tsx +245 -0
- package/template/.codex/skills/data-analytics/src/analytics-app/charting/chart-app-helpers.tsx +462 -0
- package/template/.codex/skills/data-analytics/src/analytics-app/charting/chart-capabilities.ts +107 -0
- package/template/.codex/skills/data-analytics/src/analytics-app/charting/chart-compatibility.ts +164 -0
- package/template/.codex/skills/data-analytics/src/analytics-app/charting/chart-contract.ts +192 -0
- package/template/.codex/skills/data-analytics/src/analytics-app/charting/chart-theme.ts +203 -0
- package/template/.codex/skills/data-analytics/src/analytics-app/charting/chart-tokens.css +619 -0
- package/template/.codex/skills/data-analytics/src/analytics-app/charting/chart-transforms.ts +402 -0
- package/template/.codex/skills/data-analytics/src/analytics-app/fonts/SystemSansVariableVF.woff2 +0 -0
- package/template/.codex/skills/data-analytics/src/analytics-app/imageExport.ts +370 -0
- package/template/.codex/skills/data-analytics/src/analytics-app/layout/AnalyticsLayoutCanvas.tsx +536 -0
- package/template/.codex/skills/data-analytics/src/analytics-app/layout/RichMarkdown.tsx +681 -0
- package/template/.codex/skills/data-analytics/src/analytics-app/layout/analyticsLayoutCore.ts +164 -0
- package/template/.codex/skills/data-analytics/src/analytics-app/main.tsx +21 -0
- package/template/.codex/skills/data-analytics/src/analytics-app/scripts/chart_contract.py +472 -0
- package/template/.codex/skills/data-analytics/src/analytics-app/scripts/check_analytics_app_runtime_links.py +75 -0
- package/template/.codex/skills/data-analytics/src/analytics-app/scripts/design_contract.py +142 -0
- package/template/.codex/skills/data-analytics/src/analytics-app/scripts/package_utils.py +142 -0
- package/template/.codex/skills/data-analytics/src/analytics-app/scripts/tests/test_package_utils.py +377 -0
- package/template/.codex/skills/data-analytics/src/analytics-app/styles.css +3468 -0
- package/template/.codex/skills/data-analytics/src/analytics-app/tables/DataTable.d.ts +44 -0
- package/template/.codex/skills/data-analytics/src/analytics-app/tables/DataTable.jsx +639 -0
- package/template/.codex/skills/data-analytics/src/analytics-app/tables/data-table.css +327 -0
- package/template/.codex/skills/data-analytics/src/analytics-app/tokens.css +225 -0
- package/template/.codex/skills/data-analytics/src/analytics-app/types.ts +204 -0
- package/template/.codex/skills/data-analytics/src/analytics-app-core.md +85 -0
- package/template/.codex/skills/data-analytics/src/codex-style-contract.md +30 -0
- package/template/.codex/skills/data-analytics/src/datascience-artifact-widget.html +12 -0
- package/template/.codex/skills/data-analytics/src/datascience-artifact-widget.jsx +1008 -0
- package/template/.codex/skills/data-analytics/src/datascience-chart-widget.css +2117 -0
- package/template/.codex/skills/data-analytics/src/datascience-chart-widget.html +122 -0
- package/template/.codex/skills/data-analytics/src/datascience-chart-widget.js +3588 -0
- package/template/.codex/skills/data-analytics/src/datascience-table-widget.css +483 -0
- package/template/.codex/skills/data-analytics/src/datascience-table-widget.html +32 -0
- package/template/.codex/skills/data-analytics/src/datascience-table-widget.js +333 -0
- package/template/.codex/skills/data-analytics/src/mcp-host.js +153 -0
- package/template/.codex/skills/data-analytics/src/recharts-config.js +315 -0
- package/template/.codex/skills/data-analytics/src/recharts-renderer.jsx +294 -0
- package/template/.codex/skills/data-analytics/src/sql-source-view.css +33 -0
- package/template/.codex/skills/data-analytics/src/sql-source-view.js +157 -0
- package/template/.codex/skills/data-analytics/src/styles/codex-theme.css +121 -0
- package/template/.codex/skills/data-analytics/src/table-renderer.jsx +28 -0
- package/template/.codex/skills/data-analytics/tests/chart-transforms.test.mjs +87 -0
- package/template/.codex/skills/data-analytics/tests/funnel-smoke.html +105 -0
- package/template/.codex/skills/data-analytics/tests/inline-widget-compare.html +233 -0
- package/template/.codex/skills/data-analytics/tests/mcp-server.test.mjs +1500 -0
- package/template/.codex/skills/data-analytics/tests/native-style-contract.test.mjs +219 -0
- package/template/.codex/skills/data-analytics/tests/recharts-config.test.mjs +144 -0
- package/template/.codex/skills/data-analytics/tests/recharts-renderer.test.mjs +11 -0
- package/template/.codex/skills/data-analytics/tests/rich-markdown.test.mjs +54 -0
- package/template/.codex/skills/data-analytics/tests/widget-render-harness.html +321 -0
- package/template/.codex/skills/data-analytics/tsconfig.json +19 -0
- package/template/.codex/skills/data-analytics/vite.config.ts +46 -0
- package/template/.codex/skills/product-design/.app.json +7 -0
- package/template/.codex/skills/product-design/.codex-plugin/plugin.json +50 -0
- package/template/.codex/skills/product-design/README.md +50 -0
- package/template/.codex/skills/product-design/agents/openai.yaml +4 -0
- package/template/.codex/skills/product-design/assets/composerIcon.svg +9 -0
- package/template/.codex/skills/product-design/assets/logo.png +0 -0
- package/template/.codex/skills/product-design/package.json +11 -0
- package/template/.codex/skills/product-design/references/browser-order.md +9 -0
- package/template/.codex/skills/product-design/references/communication-protocol.md +45 -0
- package/template/.codex/skills/product-design/references/critical-overrides.md +58 -0
- package/template/.codex/skills/product-design/references/local-prototype-preflight.md +16 -0
- package/template/.codex/skills/product-design/scripts/bootstrap-prototype.mjs +147 -0
- package/template/.codex/skills/product-design/skills/audit/SKILL.md +159 -0
- package/template/.codex/skills/product-design/skills/audit/agents/openai.yaml +6 -0
- package/template/.codex/skills/product-design/skills/audit/references/design-audit-framework.md +73 -0
- package/template/.codex/skills/product-design/skills/design-qa/SKILL.md +133 -0
- package/template/.codex/skills/product-design/skills/design-qa/agents/openai.yaml +6 -0
- package/template/.codex/skills/product-design/skills/design-qa/references/qa-rubric.md +61 -0
- package/template/.codex/skills/product-design/skills/get-context/SKILL.md +81 -0
- package/template/.codex/skills/product-design/skills/get-context/agents/openai.yaml +6 -0
- package/template/.codex/skills/product-design/skills/ideate/SKILL.md +179 -0
- package/template/.codex/skills/product-design/skills/ideate/agents/openai.yaml +6 -0
- package/template/.codex/skills/product-design/skills/image-to-code/SKILL.md +105 -0
- package/template/.codex/skills/product-design/skills/image-to-code/agents/openai.yaml +6 -0
- package/template/.codex/skills/product-design/skills/index/SKILL.md +126 -0
- package/template/.codex/skills/product-design/skills/index/agents/openai.yaml +6 -0
- package/template/.codex/skills/product-design/skills/prototype/SKILL.md +128 -0
- package/template/.codex/skills/product-design/skills/prototype/agents/openai.yaml +6 -0
- package/template/.codex/skills/product-design/skills/prototype/references/existing-codebase-edits.md +18 -0
- package/template/.codex/skills/product-design/skills/research/SKILL.md +92 -0
- package/template/.codex/skills/product-design/skills/research/agents/openai.yaml +6 -0
- package/template/.codex/skills/product-design/skills/share/SKILL.md +41 -0
- package/template/.codex/skills/product-design/skills/share/agents/openai.yaml +6 -0
- package/template/.codex/skills/product-design/skills/url-to-code/SKILL.md +124 -0
- package/template/.codex/skills/product-design/skills/url-to-code/agents/openai.yaml +6 -0
- package/template/.codex/skills/product-design/skills/user-context/SKILL.md +147 -0
- package/template/.codex/skills/product-design/skills/user-context/agents/openai.yaml +6 -0
- package/template/.codex/skills/product-design/skills/user-context/plugin-author-config/user-context-template.md +63 -0
- package/template/.codex/skills/product-design/skills/user-context/references/onboarding.md +66 -0
- package/template/.codex/skills/product-design/skills/user-context/scripts/init_user_context.py +86 -0
- package/template/.codex/skills/product-design/skills/user-context/scripts/user_context_preflight.py +204 -0
- package/template/.codex/skills/product-design/templates/prototype/AGENTS.md +7 -0
- package/template/.codex/skills/product-design/templates/prototype/index.html +12 -0
- package/template/.codex/skills/product-design/templates/prototype/package.json +18 -0
- package/template/.codex/skills/product-design/templates/prototype/src/App.jsx +5 -0
- package/template/.codex/skills/product-design/templates/prototype/src/main.jsx +10 -0
- package/template/.codex/skills/product-design/templates/prototype/src/styles.css +13 -0
- package/template/.codex/skills/product-design/templates/prototype/vite.config.mjs +14 -0
- package/template/.codex/skills/product-design-prototype/SKILL.md +1 -1
- package/template/.codex/skills/yss-api-integration/SKILL.md +1 -1
- package/template/.codex/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-parent/SKILL.md +1 -1
- package/template/.codex/skills/yss-filerunner/SKILL.md +1 -1
- package/template/.codex/skills/yss-openapi/SKILL.md +1 -1
- package/template/.codex/skills/yss-openapi-draft-review/SKILL.md +1 -1
- package/template/.codex/skills/yss-openapi-governance/SKILL.md +3 -3
- package/template/.codex/skills/yss-product-lifecycle/SKILL.md +23 -7
- package/template/.codex/skills/yss-router/SKILL.md +1 -2
- package/template/.codex/skills/yss-router/references/boundaries.md +0 -1
- package/template/.codex/skills/yss-source-index/references/source-map-config.md +0 -1
- package/template/.codex/skills/yss-source-index/scripts/refresh-yss-skill-index.py +0 -3
- package/template/.hermes/skills/grill-me/SKILL.md +7 -0
- package/template/.hermes/skills/grilling/SKILL.md +12 -0
- package/template/.hermes/skills/handoff/SKILL.md +16 -0
- package/template/.hermes/skills/to-issues/SKILL.md +2 -2
- package/template/.pi/skills/grill-me/SKILL.md +7 -0
- package/template/.pi/skills/grilling/SKILL.md +12 -0
- package/template/.pi/skills/handoff/SKILL.md +16 -0
- package/template/.pi/skills/to-issues/SKILL.md +2 -2
- package/template/.trae/skills/grill-me/SKILL.md +7 -0
- package/template/.trae/skills/grilling/SKILL.md +12 -0
- package/template/.trae/skills/handoff/SKILL.md +16 -0
- package/template/.trae/skills/to-issues/SKILL.md +2 -2
- package/template/AGENTS.md +11 -3
- package/template/docs/adr/adr-product-design-prototype-entrypoint.md +54 -0
- package/template/docs/api/templates/openapi-draft-review-checklist.md +4 -2
- package/template/docs/design/README.md +8 -4
- package/template/docs/design/templates/interaction-spec-template.md +4 -1
- package/template/docs/design/templates/prototype-confirmation-template.md +57 -0
- package/template/docs/design/templates/prototype-review-checklist.md +6 -2
- package/template/docs/design/templates/state-matrix-template.md +1 -1
- package/template/docs/process/MATT-POCOCK-ENGINEERING-SKILLS.md +22 -3
- package/template/docs/process/harness-executive-blueprint.md +2 -1
- package/template/docs/process/harness-process-tailoring.md +8 -1
- package/template/docs/process/harness-work-unit-map.md +1 -1
- package/template/docs/process/lifecycle-artifact-map.md +17 -8
- package/template/docs/process/product-prototype-workflow.md +82 -0
- package/template/docs/user-guide/product-lifecycle-workflow.md +2 -2
- package/template/docs/user-guide/product-rd-lifecycle-best-practices.md +15 -10
- package/template/scripts/verify-template +0 -14
- package/template/skills-lock.json +70 -27
- package/template/.codex/skills/yss-anti-scheduler/SKILL.md +0 -53
- package/template/.codex/skills/yss-anti-scheduler/agents/openai.yaml +0 -4
- package/template/.codex/skills/yss-anti-scheduler/references/source-index.md +0 -157
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Fail when analytics app runtime paths drift from their expected layout."""
|
|
3
|
+
|
|
4
|
+
from __future__ import annotations
|
|
5
|
+
|
|
6
|
+
from pathlib import Path
|
|
7
|
+
|
|
8
|
+
PLUGIN_ROOT = Path(__file__).resolve().parents[3]
|
|
9
|
+
ANALYTICS_APP_SRC = PLUGIN_ROOT / "src" / "analytics-app"
|
|
10
|
+
|
|
11
|
+
EXPECTED_LOCAL_PATHS = {
|
|
12
|
+
ANALYTICS_APP_SRC / "charting": [
|
|
13
|
+
"ChartFrame.tsx",
|
|
14
|
+
"ChartLegend.tsx",
|
|
15
|
+
"ChartRenderer.tsx",
|
|
16
|
+
"ChartTooltip.tsx",
|
|
17
|
+
"chart-capabilities.ts",
|
|
18
|
+
"chart-compatibility.ts",
|
|
19
|
+
"chart-contract.ts",
|
|
20
|
+
"chart-theme.ts",
|
|
21
|
+
"chart-tokens.css",
|
|
22
|
+
"chart-transforms.ts",
|
|
23
|
+
],
|
|
24
|
+
ANALYTICS_APP_SRC / "tables": [
|
|
25
|
+
"DataTable.d.ts",
|
|
26
|
+
"DataTable.jsx",
|
|
27
|
+
"data-table.css",
|
|
28
|
+
],
|
|
29
|
+
ANALYTICS_APP_SRC / "layout": [
|
|
30
|
+
"AnalyticsLayoutCanvas.tsx",
|
|
31
|
+
"RichMarkdown.tsx",
|
|
32
|
+
"analyticsLayoutCore.ts",
|
|
33
|
+
],
|
|
34
|
+
ANALYTICS_APP_SRC / "fonts": [
|
|
35
|
+
"SystemSansVariableVF.woff2",
|
|
36
|
+
],
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
EXPECTED_LOCAL_FILES = [
|
|
40
|
+
ANALYTICS_APP_SRC / "analytics-layout.test.mjs",
|
|
41
|
+
ANALYTICS_APP_SRC / "main.tsx",
|
|
42
|
+
ANALYTICS_APP_SRC / "tokens.css",
|
|
43
|
+
]
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def layout_problems() -> list[str]:
|
|
47
|
+
problems: list[str] = []
|
|
48
|
+
for path, required_files in EXPECTED_LOCAL_PATHS.items():
|
|
49
|
+
if path.is_symlink():
|
|
50
|
+
problems.append(f"{path.relative_to(PLUGIN_ROOT)} must be a real directory")
|
|
51
|
+
continue
|
|
52
|
+
if not path.is_dir():
|
|
53
|
+
problems.append(f"{path.relative_to(PLUGIN_ROOT)} is not a directory")
|
|
54
|
+
continue
|
|
55
|
+
for filename in required_files:
|
|
56
|
+
if not (path / filename).is_file():
|
|
57
|
+
problems.append(f"{(path / filename).relative_to(PLUGIN_ROOT)} is missing")
|
|
58
|
+
for path in EXPECTED_LOCAL_FILES:
|
|
59
|
+
if path.is_symlink():
|
|
60
|
+
problems.append(f"{path.relative_to(PLUGIN_ROOT)} must be a real file")
|
|
61
|
+
elif not path.is_file():
|
|
62
|
+
problems.append(f"{path.relative_to(PLUGIN_ROOT)} is missing")
|
|
63
|
+
return problems
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
def main() -> int:
|
|
67
|
+
problems = layout_problems()
|
|
68
|
+
if problems:
|
|
69
|
+
names = "\n".join(f" - {problem}" for problem in problems)
|
|
70
|
+
raise SystemExit(f"Analytics app runtime layout is out of sync:\n{names}")
|
|
71
|
+
return 0
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
if __name__ == "__main__":
|
|
75
|
+
raise SystemExit(main())
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Shared DESIGN.md contract checks for generated analytics app packages."""
|
|
3
|
+
|
|
4
|
+
from __future__ import annotations
|
|
5
|
+
|
|
6
|
+
import re
|
|
7
|
+
from pathlib import Path
|
|
8
|
+
|
|
9
|
+
from package_utils import ContractError
|
|
10
|
+
|
|
11
|
+
CANONICAL_DESIGN_SECTIONS = [
|
|
12
|
+
"Overview",
|
|
13
|
+
"Colors",
|
|
14
|
+
"Typography",
|
|
15
|
+
"Layout",
|
|
16
|
+
"Elevation & Depth",
|
|
17
|
+
"Shapes",
|
|
18
|
+
"Components",
|
|
19
|
+
"Do's and Don'ts",
|
|
20
|
+
]
|
|
21
|
+
REQUIRED_FRONTMATTER_KEYS = (
|
|
22
|
+
"name",
|
|
23
|
+
"description",
|
|
24
|
+
"colors",
|
|
25
|
+
"typography",
|
|
26
|
+
"spacing",
|
|
27
|
+
"rounded",
|
|
28
|
+
"surfaces",
|
|
29
|
+
"components",
|
|
30
|
+
"implementation",
|
|
31
|
+
)
|
|
32
|
+
REQUIRED_DESIGN_TOKENS = (
|
|
33
|
+
"bg/primary",
|
|
34
|
+
"bg/secondary",
|
|
35
|
+
"bg/tertiary",
|
|
36
|
+
"border/light",
|
|
37
|
+
"border/default",
|
|
38
|
+
"text/primary",
|
|
39
|
+
"text/secondary",
|
|
40
|
+
"text/tertiary",
|
|
41
|
+
"icon/accent",
|
|
42
|
+
"space-12",
|
|
43
|
+
"space-24",
|
|
44
|
+
"corner-radius/cr-24",
|
|
45
|
+
"elevation/01",
|
|
46
|
+
"blue/500",
|
|
47
|
+
"green/700",
|
|
48
|
+
"purple/500",
|
|
49
|
+
)
|
|
50
|
+
REQUIRED_TYPE_TOKENS = (
|
|
51
|
+
"System Sans Variable",
|
|
52
|
+
"text/xs/normal",
|
|
53
|
+
"text/xs/semibold",
|
|
54
|
+
"text/sm/normal",
|
|
55
|
+
"text/sm/medium",
|
|
56
|
+
"heading/md/medium",
|
|
57
|
+
"heading/2xl",
|
|
58
|
+
)
|
|
59
|
+
REQUIRED_SURFACE_MEASUREMENTS = (
|
|
60
|
+
"1140px",
|
|
61
|
+
"800px",
|
|
62
|
+
"48px",
|
|
63
|
+
"24px",
|
|
64
|
+
)
|
|
65
|
+
REQUIRED_COMPONENT_NAMES = (
|
|
66
|
+
"top-bar",
|
|
67
|
+
"metric-card",
|
|
68
|
+
"report-block",
|
|
69
|
+
"chart-block",
|
|
70
|
+
"table-list",
|
|
71
|
+
"popover-menu",
|
|
72
|
+
)
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
def split_design_file(markdown: str, path: Path) -> tuple[str, str]:
|
|
76
|
+
if not markdown.startswith("---\n"):
|
|
77
|
+
raise ContractError(f"{path.name} must start with YAML front matter")
|
|
78
|
+
try:
|
|
79
|
+
_opening, frontmatter, body = markdown.split("---\n", 2)
|
|
80
|
+
except ValueError as exc:
|
|
81
|
+
raise ContractError(f"{path.name} must contain closed YAML front matter") from exc
|
|
82
|
+
if not frontmatter.strip():
|
|
83
|
+
raise ContractError(f"{path.name} front matter must not be empty")
|
|
84
|
+
if not body.strip():
|
|
85
|
+
raise ContractError(f"{path.name} body must not be empty")
|
|
86
|
+
return frontmatter, body
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
def require_frontmatter_key(frontmatter: str, key: str, path: Path) -> None:
|
|
90
|
+
if not re.search(rf"^{re.escape(key)}\s*:", frontmatter, flags=re.MULTILINE):
|
|
91
|
+
raise ContractError(f"{path.name} front matter must define {key}")
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
def require_text_anchor(markdown: str, anchor: str, path: Path, group: str) -> None:
|
|
95
|
+
if anchor not in markdown:
|
|
96
|
+
raise ContractError(f"{path.name} must include {group} anchor: {anchor}")
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
def section_positions(body: str) -> dict[str, int]:
|
|
100
|
+
positions: dict[str, int] = {}
|
|
101
|
+
for match in re.finditer(r"^##\s+(.+?)\s*$", body, flags=re.MULTILINE):
|
|
102
|
+
title = match.group(1).strip()
|
|
103
|
+
if title in CANONICAL_DESIGN_SECTIONS:
|
|
104
|
+
positions[title] = match.start()
|
|
105
|
+
return positions
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
def validate_design_contract(root: Path) -> None:
|
|
109
|
+
path = root / "DESIGN.md"
|
|
110
|
+
if not path.exists():
|
|
111
|
+
raise ContractError("analytics app package must include DESIGN.md")
|
|
112
|
+
|
|
113
|
+
markdown = path.read_text(encoding="utf-8")
|
|
114
|
+
frontmatter, body = split_design_file(markdown, path)
|
|
115
|
+
|
|
116
|
+
for key in REQUIRED_FRONTMATTER_KEYS:
|
|
117
|
+
require_frontmatter_key(frontmatter, key, path)
|
|
118
|
+
|
|
119
|
+
for token in REQUIRED_DESIGN_TOKENS:
|
|
120
|
+
require_text_anchor(markdown, token, path, "design token")
|
|
121
|
+
for token in REQUIRED_TYPE_TOKENS:
|
|
122
|
+
require_text_anchor(markdown, token, path, "typography token")
|
|
123
|
+
for measurement in REQUIRED_SURFACE_MEASUREMENTS:
|
|
124
|
+
require_text_anchor(markdown, measurement, path, "surface measurement")
|
|
125
|
+
for component in REQUIRED_COMPONENT_NAMES:
|
|
126
|
+
require_text_anchor(frontmatter, component, path, "component recipe")
|
|
127
|
+
|
|
128
|
+
positions = section_positions(body)
|
|
129
|
+
missing_sections = [
|
|
130
|
+
section for section in CANONICAL_DESIGN_SECTIONS if section not in positions
|
|
131
|
+
]
|
|
132
|
+
if missing_sections:
|
|
133
|
+
raise ContractError(f"{path.name} is missing sections: {missing_sections}")
|
|
134
|
+
ordered_positions = [positions[section] for section in CANONICAL_DESIGN_SECTIONS]
|
|
135
|
+
if ordered_positions != sorted(ordered_positions):
|
|
136
|
+
raise ContractError(f"{path.name} sections must follow the canonical DESIGN.md order")
|
|
137
|
+
|
|
138
|
+
lower_body = body.lower()
|
|
139
|
+
if "decorative orb" in lower_body or "bokeh" in lower_body:
|
|
140
|
+
raise ContractError(f"{path.name} must not encourage decorative effects")
|
|
141
|
+
if "customiz" not in lower_body and "customis" not in lower_body:
|
|
142
|
+
raise ContractError(f"{path.name} must explain how users can customize outputs")
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Shared helpers for generated data analytics app packages."""
|
|
3
|
+
|
|
4
|
+
from __future__ import annotations
|
|
5
|
+
|
|
6
|
+
import fnmatch
|
|
7
|
+
import json
|
|
8
|
+
import shutil
|
|
9
|
+
from pathlib import Path
|
|
10
|
+
from typing import Any
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class ContractError(Exception):
|
|
14
|
+
"""Raised when an analytics app package does not satisfy its contract."""
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
ALLOWED_SOURCE_EXTENSIONS = {".csv", ".json", ".md", ".sql", ".tsv", ".txt"}
|
|
18
|
+
SENSITIVE_FILE_NAMES = {".env", ".env.local", ".env.production", ".env.staging"}
|
|
19
|
+
SENSITIVE_FILE_GLOBS = {"*.pem", "*.key", "*.p12", "*.pfx", "id_rsa*", "id_ed25519*"}
|
|
20
|
+
SENSITIVE_SCAN_SKIP_DIRS = {
|
|
21
|
+
".git",
|
|
22
|
+
".pytest_cache",
|
|
23
|
+
".ruff_cache",
|
|
24
|
+
".vite",
|
|
25
|
+
"build",
|
|
26
|
+
"dist",
|
|
27
|
+
"node_modules",
|
|
28
|
+
"__pycache__",
|
|
29
|
+
}
|
|
30
|
+
TEMPLATE_IGNORE_PATTERNS = (
|
|
31
|
+
".dashboard-data",
|
|
32
|
+
".report-data",
|
|
33
|
+
"dist",
|
|
34
|
+
"node_modules",
|
|
35
|
+
)
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def slugify(value: str, fallback: str) -> str:
|
|
39
|
+
chars: list[str] = []
|
|
40
|
+
previous_dash = False
|
|
41
|
+
for char in value.lower():
|
|
42
|
+
if char.isalnum():
|
|
43
|
+
chars.append(char)
|
|
44
|
+
previous_dash = False
|
|
45
|
+
elif not previous_dash:
|
|
46
|
+
chars.append("-")
|
|
47
|
+
previous_dash = True
|
|
48
|
+
slug = "".join(chars).strip("-")
|
|
49
|
+
return slug or fallback
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
def load_json(path: Path) -> dict[str, Any]:
|
|
53
|
+
if not path.exists():
|
|
54
|
+
raise ContractError(f"Missing required file: {path}")
|
|
55
|
+
try:
|
|
56
|
+
value = json.loads(path.read_text(encoding="utf-8"))
|
|
57
|
+
except json.JSONDecodeError as exc:
|
|
58
|
+
raise ContractError(f"Invalid JSON in {path}: {exc}") from exc
|
|
59
|
+
if not isinstance(value, dict):
|
|
60
|
+
raise ContractError(f"{path} must contain a JSON object")
|
|
61
|
+
return value
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
def write_json(path: Path, payload: dict[str, Any]) -> None:
|
|
65
|
+
path.write_text(f"{json.dumps(payload, indent=2)}\n", encoding="utf-8")
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
def copy_template(template: Path, output: Path, *, force: bool = False) -> None:
|
|
69
|
+
output = output.resolve()
|
|
70
|
+
if output.exists() and any(output.iterdir()) and not force:
|
|
71
|
+
raise RuntimeError(f"{output} already exists and is not empty; pass --force to replace it")
|
|
72
|
+
if output.exists() and force:
|
|
73
|
+
shutil.rmtree(output)
|
|
74
|
+
shutil.copytree(
|
|
75
|
+
template,
|
|
76
|
+
output,
|
|
77
|
+
ignore=shutil.ignore_patterns(*TEMPLATE_IGNORE_PATTERNS),
|
|
78
|
+
)
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
def require_string(obj: dict[str, Any], field: str, path: str) -> str:
|
|
82
|
+
value = obj.get(field)
|
|
83
|
+
if not isinstance(value, str) or not value.strip():
|
|
84
|
+
raise ContractError(f"{path}.{field} must be a non-empty string")
|
|
85
|
+
return value
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
def optional_list(obj: dict[str, Any], field: str, path: str) -> list[Any]:
|
|
89
|
+
value = obj.get(field, [])
|
|
90
|
+
if not isinstance(value, list):
|
|
91
|
+
raise ContractError(f"{path}.{field} must be a list when present")
|
|
92
|
+
return value
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
def require_list(obj: dict[str, Any], field: str, path: str) -> list[Any]:
|
|
96
|
+
value = obj.get(field)
|
|
97
|
+
if not isinstance(value, list):
|
|
98
|
+
raise ContractError(f"{path}.{field} must be a list")
|
|
99
|
+
return value
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
def require_unique_ids(items: list[Any], field_path: str) -> None:
|
|
103
|
+
seen: set[str] = set()
|
|
104
|
+
for idx, item in enumerate(items):
|
|
105
|
+
if not isinstance(item, dict):
|
|
106
|
+
continue
|
|
107
|
+
item_id = item.get("id")
|
|
108
|
+
if not isinstance(item_id, str) or not item_id.strip():
|
|
109
|
+
continue
|
|
110
|
+
if item_id in seen:
|
|
111
|
+
raise ContractError(f"{field_path}[{idx}].id must be unique")
|
|
112
|
+
seen.add(item_id)
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
def validate_relative_source_path(
|
|
116
|
+
root: Path, source_path: str, path: str, package_label: str = "analytics app package"
|
|
117
|
+
) -> None:
|
|
118
|
+
candidate = (root / source_path).resolve()
|
|
119
|
+
try:
|
|
120
|
+
candidate.relative_to(root.resolve())
|
|
121
|
+
except ValueError as exc:
|
|
122
|
+
raise ContractError(f"{path}.path must stay inside the {package_label}") from exc
|
|
123
|
+
if candidate.is_dir():
|
|
124
|
+
raise ContractError(f"{path}.path must point to a file, not a directory")
|
|
125
|
+
if candidate.suffix.lower() not in ALLOWED_SOURCE_EXTENSIONS:
|
|
126
|
+
raise ContractError(f"{path}.path must use one of {sorted(ALLOWED_SOURCE_EXTENSIONS)}")
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
def validate_no_sensitive_files(root: Path, package_label: str = "analytics app") -> None:
|
|
130
|
+
for path in root.rglob("*"):
|
|
131
|
+
if not path.is_file():
|
|
132
|
+
continue
|
|
133
|
+
relative = path.relative_to(root)
|
|
134
|
+
if any(part in SENSITIVE_SCAN_SKIP_DIRS for part in relative.parts[:-1]):
|
|
135
|
+
continue
|
|
136
|
+
name = path.name
|
|
137
|
+
if name in SENSITIVE_FILE_NAMES or any(
|
|
138
|
+
fnmatch.fnmatch(name, pattern) for pattern in SENSITIVE_FILE_GLOBS
|
|
139
|
+
):
|
|
140
|
+
raise ContractError(
|
|
141
|
+
f"{package_label} package must not include sensitive files: {relative}"
|
|
142
|
+
)
|