@litfamily/lithermes 1.0.0
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/LICENSE +21 -0
- package/README.md +186 -0
- package/README_Ko-KR.md +188 -0
- package/assets/lithermes-plugin/NOTICE.md +46 -0
- package/assets/lithermes-plugin/README.md +390 -0
- package/assets/lithermes-plugin/__init__.py +589 -0
- package/assets/lithermes-plugin/auto_update.py +338 -0
- package/assets/lithermes-plugin/bounded_work.py +1120 -0
- package/assets/lithermes-plugin/bounded_work_tools.py +115 -0
- package/assets/lithermes-plugin/core.py +1813 -0
- package/assets/lithermes-plugin/core_commands.py +243 -0
- package/assets/lithermes-plugin/core_contexts.py +458 -0
- package/assets/lithermes-plugin/core_contract.py +456 -0
- package/assets/lithermes-plugin/core_plans.py +418 -0
- package/assets/lithermes-plugin/core_reader_args.py +34 -0
- package/assets/lithermes-plugin/core_recap_command.py +141 -0
- package/assets/lithermes-plugin/core_recap_state.py +175 -0
- package/assets/lithermes-plugin/core_review.py +198 -0
- package/assets/lithermes-plugin/core_routing.py +641 -0
- package/assets/lithermes-plugin/core_runs.py +283 -0
- package/assets/lithermes-plugin/core_runtime.py +251 -0
- package/assets/lithermes-plugin/core_workflow_commands.py +207 -0
- package/assets/lithermes-plugin/deliverable_hedge_guard.py +562 -0
- package/assets/lithermes-plugin/diagnostics.py +468 -0
- package/assets/lithermes-plugin/handoff.py +97 -0
- package/assets/lithermes-plugin/knowledge.py +920 -0
- package/assets/lithermes-plugin/knowledge_tools.py +130 -0
- package/assets/lithermes-plugin/lit_mark.py +140 -0
- package/assets/lithermes-plugin/lit_mark_rows.json +1363 -0
- package/assets/lithermes-plugin/litgoal/__init__.py +10 -0
- package/assets/lithermes-plugin/litgoal/cli.py +207 -0
- package/assets/lithermes-plugin/litgoal/hook.py +81 -0
- package/assets/lithermes-plugin/litgoal/model.py +203 -0
- package/assets/lithermes-plugin/litgoal/runtime.py +522 -0
- package/assets/lithermes-plugin/litgoal/store.py +367 -0
- package/assets/lithermes-plugin/litgoal/tools.py +300 -0
- package/assets/lithermes-plugin/output-styles/asd-ste100-ko.md +41 -0
- package/assets/lithermes-plugin/output-styles/asd-ste100.md +40 -0
- package/assets/lithermes-plugin/output-styles/eli5-ko.md +13 -0
- package/assets/lithermes-plugin/output-styles/eli5.md +11 -0
- package/assets/lithermes-plugin/output_styles.py +62 -0
- package/assets/lithermes-plugin/payload-version.json +2107 -0
- package/assets/lithermes-plugin/plugin.yaml +16 -0
- package/assets/lithermes-plugin/provider_metrics.py +161 -0
- package/assets/lithermes-plugin/redaction.py +148 -0
- package/assets/lithermes-plugin/rules/__init__.py +55 -0
- package/assets/lithermes-plugin/rules/bundled-rules/baseline-discipline.md +20 -0
- package/assets/lithermes-plugin/rules/bundled-rules/build-decision-gate.md +19 -0
- package/assets/lithermes-plugin/rules/bundled-rules/windows-git-bash.md +17 -0
- package/assets/lithermes-plugin/rules/constants.py +122 -0
- package/assets/lithermes-plugin/rules/discovery.py +276 -0
- package/assets/lithermes-plugin/rules/engine.py +447 -0
- package/assets/lithermes-plugin/rules/frontmatter.py +149 -0
- package/assets/lithermes-plugin/rules/globmatch.py +333 -0
- package/assets/lithermes-plugin/scientific_visualization.py +158 -0
- package/assets/lithermes-plugin/session_context.py +8 -0
- package/assets/lithermes-plugin/skill_loop.py +2044 -0
- package/assets/lithermes-plugin/skill_observer.py +1778 -0
- package/assets/lithermes-plugin/skills/autoconference/LICENSE +21 -0
- package/assets/lithermes-plugin/skills/autoconference/ORIGIN.json +11 -0
- package/assets/lithermes-plugin/skills/autoconference/SKILL.md +163 -0
- package/assets/lithermes-plugin/skills/autoconference/assets/conference_template.md +76 -0
- package/assets/lithermes-plugin/skills/autoconference/assets/report_template.md +53 -0
- package/assets/lithermes-plugin/skills/autoconference/assets/synthesis_template.md +39 -0
- package/assets/lithermes-plugin/skills/autoconference/dependencies/autoresearch.md +14 -0
- package/assets/lithermes-plugin/skills/autoconference/modes/analyze/SKILL.md +269 -0
- package/assets/lithermes-plugin/skills/autoconference/modes/core/SKILL.md +134 -0
- package/assets/lithermes-plugin/skills/autoconference/modes/core/convergence-guide.md +162 -0
- package/assets/lithermes-plugin/skills/autoconference/modes/core/crash-recovery.md +63 -0
- package/assets/lithermes-plugin/skills/autoconference/modes/debate/SKILL.md +383 -0
- package/assets/lithermes-plugin/skills/autoconference/modes/plan/SKILL.md +304 -0
- package/assets/lithermes-plugin/skills/autoconference/modes/resume/SKILL.md +82 -0
- package/assets/lithermes-plugin/skills/autoconference/modes/ship/SKILL.md +78 -0
- package/assets/lithermes-plugin/skills/autoconference/modes/survey/SKILL.md +376 -0
- package/assets/lithermes-plugin/skills/autoconference/references/agent-prompts.md +110 -0
- package/assets/lithermes-plugin/skills/autoconference/references/conference-protocol.md +90 -0
- package/assets/lithermes-plugin/skills/autoconference/references/core-principles.md +78 -0
- package/assets/lithermes-plugin/skills/autoconference/references/results-logging.md +165 -0
- package/assets/lithermes-plugin/skills/autoconference/references/visualization-guide.md +99 -0
- package/assets/lithermes-plugin/skills/autoconference/scripts/check_conference.sh +197 -0
- package/assets/lithermes-plugin/skills/autoconference/scripts/init_conference.py +489 -0
- package/assets/lithermes-plugin/skills/autoconference/scripts/style_presets.py +104 -0
- package/assets/lithermes-plugin/skills/autoconference/templates/code-performance.md +59 -0
- package/assets/lithermes-plugin/skills/autoconference/templates/debate-mode.md +50 -0
- package/assets/lithermes-plugin/skills/autoconference/templates/prompt-optimization.md +58 -0
- package/assets/lithermes-plugin/skills/autoconference/templates/quick-conference.md +48 -0
- package/assets/lithermes-plugin/skills/autoconference/templates/research-synthesis.md +56 -0
- package/assets/lithermes-plugin/skills/autoconference/templates/survey-mode.md +63 -0
- package/assets/lithermes-plugin/skills/autoresearch/LICENSE +21 -0
- package/assets/lithermes-plugin/skills/autoresearch/ORIGIN.json +11 -0
- package/assets/lithermes-plugin/skills/autoresearch/SKILL.md +175 -0
- package/assets/lithermes-plugin/skills/autoresearch/assets/report_template.md +50 -0
- package/assets/lithermes-plugin/skills/autoresearch/assets/research_template.md +38 -0
- package/assets/lithermes-plugin/skills/autoresearch/assets/results_template.tsv +2 -0
- package/assets/lithermes-plugin/skills/autoresearch/modes/core/SKILL.md +204 -0
- package/assets/lithermes-plugin/skills/autoresearch/modes/core/evaluator-contract.md +108 -0
- package/assets/lithermes-plugin/skills/autoresearch/modes/core/stuck-detection.md +102 -0
- package/assets/lithermes-plugin/skills/autoresearch/modes/debug/SKILL.md +240 -0
- package/assets/lithermes-plugin/skills/autoresearch/modes/debug/investigation-techniques.md +254 -0
- package/assets/lithermes-plugin/skills/autoresearch/modes/fix/SKILL.md +176 -0
- package/assets/lithermes-plugin/skills/autoresearch/modes/learn/SKILL.md +96 -0
- package/assets/lithermes-plugin/skills/autoresearch/modes/plan/SKILL.md +291 -0
- package/assets/lithermes-plugin/skills/autoresearch/modes/predict/SKILL.md +271 -0
- package/assets/lithermes-plugin/skills/autoresearch/modes/predict/persona-templates.md +227 -0
- package/assets/lithermes-plugin/skills/autoresearch/modes/reason/SKILL.md +174 -0
- package/assets/lithermes-plugin/skills/autoresearch/modes/scenario/SKILL.md +168 -0
- package/assets/lithermes-plugin/skills/autoresearch/modes/scenario/dimensions.md +173 -0
- package/assets/lithermes-plugin/skills/autoresearch/modes/security/SKILL.md +287 -0
- package/assets/lithermes-plugin/skills/autoresearch/modes/security/owasp-checklist.md +156 -0
- package/assets/lithermes-plugin/skills/autoresearch/modes/security/stride-model.md +191 -0
- package/assets/lithermes-plugin/skills/autoresearch/modes/ship/SKILL.md +99 -0
- package/assets/lithermes-plugin/skills/autoresearch/modes/ship/type-checklists.md +158 -0
- package/assets/lithermes-plugin/skills/autoresearch/references/core-principles.md +75 -0
- package/assets/lithermes-plugin/skills/autoresearch/references/results-logging.md +55 -0
- package/assets/lithermes-plugin/skills/autoresearch/references/visualization-guide.md +90 -0
- package/assets/lithermes-plugin/skills/autoresearch/scripts/check_progress.sh +139 -0
- package/assets/lithermes-plugin/skills/autoresearch/scripts/init_research.py +219 -0
- package/assets/lithermes-plugin/skills/autoresearch/scripts/style_presets.py +104 -0
- package/assets/lithermes-plugin/skills/browser-drive/SKILL.md +147 -0
- package/assets/lithermes-plugin/skills/browser-drive/scripts/capability_probe.py +528 -0
- package/assets/lithermes-plugin/skills/comment-checker/SKILL.md +162 -0
- package/assets/lithermes-plugin/skills/debugging/SKILL.md +271 -0
- package/assets/lithermes-plugin/skills/debugging/references/methodology/00-setup.md +108 -0
- package/assets/lithermes-plugin/skills/debugging/references/methodology/02-investigate.md +122 -0
- package/assets/lithermes-plugin/skills/debugging/references/methodology/04-oracle-triple.md +136 -0
- package/assets/lithermes-plugin/skills/debugging/references/methodology/05-escalate.md +69 -0
- package/assets/lithermes-plugin/skills/debugging/references/methodology/06-fix.md +116 -0
- package/assets/lithermes-plugin/skills/debugging/references/methodology/08-qa.md +94 -0
- package/assets/lithermes-plugin/skills/debugging/references/methodology/09-cleanup.md +164 -0
- package/assets/lithermes-plugin/skills/debugging/references/methodology/partial-runtime-evidence.md +229 -0
- package/assets/lithermes-plugin/skills/debugging/references/runtimes/bundled-js-binary.md +415 -0
- package/assets/lithermes-plugin/skills/debugging/references/runtimes/go.md +252 -0
- package/assets/lithermes-plugin/skills/debugging/references/runtimes/native-binary.md +484 -0
- package/assets/lithermes-plugin/skills/debugging/references/runtimes/node.md +260 -0
- package/assets/lithermes-plugin/skills/debugging/references/runtimes/python.md +248 -0
- package/assets/lithermes-plugin/skills/debugging/references/runtimes/rust.md +234 -0
- package/assets/lithermes-plugin/skills/debugging/references/tools/ghidra.md +212 -0
- package/assets/lithermes-plugin/skills/debugging/references/tools/playwright-cli.md +194 -0
- package/assets/lithermes-plugin/skills/debugging/references/tools/pwndbg.md +263 -0
- package/assets/lithermes-plugin/skills/debugging/references/tools/pwntools.md +265 -0
- package/assets/lithermes-plugin/skills/deep-interview/SKILL.md +419 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/SKILL.md +49 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/.gitattributes +2 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/README.md +248 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/_INDEX.md +191 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/airbnb.md +393 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/airtable.md +92 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/apple.md +250 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/aside.md +209 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/binance.md +348 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/bmw.md +183 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/brutalist-skill.md +92 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/bugatti.md +271 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/cal.md +262 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/claude.md +315 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/clay.md +307 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/clickhouse.md +284 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/clone-from-url.md +65 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/cohere.md +269 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/coinbase.md +132 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/composio.md +310 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/cursor.md +312 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/design-system-architecture.md +244 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/elevenlabs.md +268 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/expo.md +284 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/ferrari.md +317 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/figma.md +223 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/framer.md +249 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/gpt-tasteskill.md +74 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/hashicorp.md +281 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/ibm.md +335 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/image-to-code-skill.md +1228 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/imagegen-brandkit.md +798 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/imagegen-frontend-mobile.md +1465 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/imagegen-frontend-web.md +987 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/intercom.md +149 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/kraken.md +128 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/lamborghini.md +291 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/layout-skill.md +107 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/lazyweb.md +77 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/linear.app.md +370 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/lovable.md +301 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/mastercard.md +368 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/meta.md +369 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/minimalist-skill.md +85 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/minimax.md +260 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/mintlify.md +329 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/miro.md +111 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/mistral.ai.md +264 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/mongodb.md +269 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/nike.md +366 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/notion.md +312 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/nvidia.md +296 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/ollama.md +270 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/opencode.ai.md +284 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/output-skill.md +49 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/pinterest.md +233 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/playstation.md +367 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/posthog.md +259 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/raycast.md +271 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/react-dev-tooling-skill.md +230 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/redesign-skill.md +178 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/renault.md +314 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/replicate.md +264 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/resend.md +306 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/revolut.md +188 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/runwayml.md +247 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/sanity.md +360 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/sentry.md +265 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/shopify.md +353 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/soft-skill.md +98 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/spacex.md +197 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/spotify.md +249 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/starbucks.md +583 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/stitch-design-example.md +121 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/stitch-skill.md +184 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/stripe.md +325 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/supabase.md +258 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/superhuman.md +255 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/taste-skill.md +1206 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/tesla.md +289 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/theverge.md +342 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/together.ai.md +266 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/uber.md +298 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/vercel.md +313 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/vodafone.md +426 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/voltagent.md +326 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/warp.md +256 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/webflow.md +95 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/wired.md +281 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/wise.md +176 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/x.ai.md +260 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/zapier.md +331 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/EVIDENCE.md +97 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/README.md +48 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/UPSTREAM.md +80 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/lane-a-direction.md +64 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/lane-b-execution.md +65 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/lane-c-review.md +65 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/lane-d-memory.md +83 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/orchestration.md +80 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/routing.md +79 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/vendor/LICENSE +21 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/vendor/agents/accessibility-reviewer.md +83 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/vendor/agents/content-writer.md +132 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/vendor/agents/design-builder.md +109 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/vendor/agents/design-critic.md +89 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/vendor/agents/design-lead.md +113 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/vendor/agents/design-scout.md +78 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/vendor/agents/design-strategist.md +121 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/vendor/agents/heuristic-evaluator.md +268 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/vendor/agents/inspiration-scout.md +107 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/vendor/agents/motion-designer.md +120 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/vendor/skills/accessible-content/reference.md +101 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/vendor/skills/adaptive-interfaces/reference.md +109 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/vendor/skills/cognitive-accessibility/reference.md +107 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/vendor/skills/design-debate/reference.md +199 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/vendor/skills/design-debt-tracker/reference.md +174 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/vendor/skills/design-handoff/reference.md +125 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/vendor/skills/design-md/reference.md +106 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/vendor/skills/design-retrospective/reference.md +266 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/vendor/skills/design-review/reference.md +123 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/vendor/skills/design-system-alignment/reference.md +120 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/vendor/skills/designpowers-critique/reference.md +164 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/vendor/skills/heuristic-evaluation/reference.md +85 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/vendor/skills/inclusive-personas/reference.md +98 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/vendor/skills/inspiration-scouting/reference.md +165 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/vendor/skills/interaction-design/reference.md +122 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/vendor/skills/motion-choreography/reference.md +81 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/vendor/skills/research-planning/reference.md +96 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/vendor/skills/responsive-patterns/reference.md +77 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/vendor/skills/synthetic-user-testing/reference.md +192 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/vendor/skills/taste-feedback/reference.md +165 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/vendor/skills/taste-report/reference.md +78 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/vendor/skills/token-architecture/reference.md +75 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/vendor/skills/ui-composition/reference.md +117 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/vendor/skills/usability-testing/reference.md +78 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/vendor/skills/verification-before-shipping/reference.md +125 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/vendor/skills/voice-and-tone/reference.md +79 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/vendor/skills/writing-design-plans/reference.md +119 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/perfection/README.md +160 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/perfection/react-perf-tooling.md +127 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/ui-ux-db/README.md +659 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/ui-ux-db/data/charts.csv +26 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/ui-ux-db/data/colors.csv +162 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/ui-ux-db/data/icons.csv +106 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/ui-ux-db/data/landing.csv +35 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/ui-ux-db/data/products.csv +162 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/ui-ux-db/data/react-performance.csv +45 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/ui-ux-db/data/stacks/astro.csv +54 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/ui-ux-db/data/stacks/flutter.csv +53 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/ui-ux-db/data/stacks/html-tailwind.csv +56 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/ui-ux-db/data/stacks/jetpack-compose.csv +53 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/ui-ux-db/data/stacks/nextjs.csv +53 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/ui-ux-db/data/stacks/nuxt-ui.csv +51 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/ui-ux-db/data/stacks/nuxtjs.csv +59 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/ui-ux-db/data/stacks/react-native.csv +52 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/ui-ux-db/data/stacks/react.csv +54 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/ui-ux-db/data/stacks/shadcn.csv +61 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/ui-ux-db/data/stacks/svelte.csv +54 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/ui-ux-db/data/stacks/swiftui.csv +51 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/ui-ux-db/data/stacks/vue.csv +50 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/ui-ux-db/data/styles.csv +85 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/ui-ux-db/data/typography.csv +74 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/ui-ux-db/data/ui-reasoning.csv +162 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/ui-ux-db/data/ux-guidelines.csv +100 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/ui-ux-db/data/web-interface.csv +31 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/ui-ux-db/scripts/core.py +262 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/ui-ux-db/scripts/design_system.py +1148 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/ui-ux-db/scripts/search.py +114 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/legal/ATTRIBUTION.md +217 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/legal/LICENSE +21 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/legal/LICENSE-Apache-2.0.txt +201 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/manifest.json +876 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/adaptive-layout.md +81 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/brand-and-imagery.md +84 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/complete-contract.md +457 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/composition.md +89 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/creative-directions.md +81 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/evidence-review.md +113 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/implementation-platforms.md +92 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/inclusive-interface.md +85 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/interaction-motion.md +87 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/operating-lanes.md +85 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/performance-delivery.md +85 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/product-direction.md +86 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/redesign-playbook.md +91 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/system-foundations.md +82 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/taste-direction.md +86 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/visual-language.md +85 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/visual-reconstruction.md +94 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/resources/LICENSE +21 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/resources/PROVENANCE.json +38 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/resources/THIRD-PARTY-NOTICE.txt +14 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/resources/design-intelligence.json +1 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/resources/import-manifest.json +1060 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/schemas/design-contract-v1alpha1.schema.json +264 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/schemas/design-contract-v1beta1.schema.json +268 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/schemas/design-contract-v1beta2.schema.json +280 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/scripts/design_contract_validation.py +996 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/scripts/design_intelligence.py +128 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/scripts/design_runtime.py +98 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/scripts/import_design_intelligence.py +56 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/scripts/source_import.py +144 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/scripts/source_manifest.py +65 -0
- package/assets/lithermes-plugin/skills/lit-burnoff/SKILL.md +448 -0
- package/assets/lithermes-plugin/skills/lit-burnoff-file/SKILL.md +254 -0
- package/assets/lithermes-plugin/skills/lit-code/SKILL.md +609 -0
- package/assets/lithermes-plugin/skills/lit-code/references/go/README.md +90 -0
- package/assets/lithermes-plugin/skills/lit-code/references/go/backend-stack.md +641 -0
- package/assets/lithermes-plugin/skills/lit-code/references/go/bootstrap.md +328 -0
- package/assets/lithermes-plugin/skills/lit-code/references/go/bubbletea-v2.md +359 -0
- package/assets/lithermes-plugin/skills/lit-code/references/go/cobra-stack.md +468 -0
- package/assets/lithermes-plugin/skills/lit-code/references/go/concurrency.md +362 -0
- package/assets/lithermes-plugin/skills/lit-code/references/go/data-modeling.md +329 -0
- package/assets/lithermes-plugin/skills/lit-code/references/go/error-handling.md +359 -0
- package/assets/lithermes-plugin/skills/lit-code/references/go/golangci-strict.md +236 -0
- package/assets/lithermes-plugin/skills/lit-code/references/go/grpc-connect.md +375 -0
- package/assets/lithermes-plugin/skills/lit-code/references/go/libraries.md +337 -0
- package/assets/lithermes-plugin/skills/lit-code/references/go/one-liners.md +202 -0
- package/assets/lithermes-plugin/skills/lit-code/references/go/sqlc-pgx.md +471 -0
- package/assets/lithermes-plugin/skills/lit-code/references/go/testing.md +467 -0
- package/assets/lithermes-plugin/skills/lit-code/references/go/type-patterns.md +298 -0
- package/assets/lithermes-plugin/skills/lit-code/references/python/README.md +314 -0
- package/assets/lithermes-plugin/skills/lit-code/references/python/async-anyio.md +442 -0
- package/assets/lithermes-plugin/skills/lit-code/references/python/data-modeling.md +233 -0
- package/assets/lithermes-plugin/skills/lit-code/references/python/data-processing.md +133 -0
- package/assets/lithermes-plugin/skills/lit-code/references/python/error-handling.md +218 -0
- package/assets/lithermes-plugin/skills/lit-code/references/python/fastapi-stack.md +316 -0
- package/assets/lithermes-plugin/skills/lit-code/references/python/httpx2-optimization.md +360 -0
- package/assets/lithermes-plugin/skills/lit-code/references/python/libraries.md +307 -0
- package/assets/lithermes-plugin/skills/lit-code/references/python/one-liners.md +268 -0
- package/assets/lithermes-plugin/skills/lit-code/references/python/orjson-stack.md +378 -0
- package/assets/lithermes-plugin/skills/lit-code/references/python/pydantic-ai.md +285 -0
- package/assets/lithermes-plugin/skills/lit-code/references/python/pyproject-strict.md +232 -0
- package/assets/lithermes-plugin/skills/lit-code/references/python/textual-tui.md +201 -0
- package/assets/lithermes-plugin/skills/lit-code/references/python/type-patterns.md +176 -0
- package/assets/lithermes-plugin/skills/lit-code/references/rust/README.md +317 -0
- package/assets/lithermes-plugin/skills/lit-code/references/rust/async-tokio.md +299 -0
- package/assets/lithermes-plugin/skills/lit-code/references/rust/axum-stack.md +467 -0
- package/assets/lithermes-plugin/skills/lit-code/references/rust/cargo-strict.md +317 -0
- package/assets/lithermes-plugin/skills/lit-code/references/rust/clap-stack.md +409 -0
- package/assets/lithermes-plugin/skills/lit-code/references/rust/concurrency.md +375 -0
- package/assets/lithermes-plugin/skills/lit-code/references/rust/libraries.md +439 -0
- package/assets/lithermes-plugin/skills/lit-code/references/rust/one-liners.md +291 -0
- package/assets/lithermes-plugin/skills/lit-code/references/rust/proptest-insta.md +429 -0
- package/assets/lithermes-plugin/skills/lit-code/references/rust/type-state.md +354 -0
- package/assets/lithermes-plugin/skills/lit-code/references/rust/unsafe-discipline.md +250 -0
- package/assets/lithermes-plugin/skills/lit-code/references/rust/zero-cost-safety.md +527 -0
- package/assets/lithermes-plugin/skills/lit-code/references/rust-ub/README.md +289 -0
- package/assets/lithermes-plugin/skills/lit-code/references/rust-ub/miri-sanitizers-loom.md +411 -0
- package/assets/lithermes-plugin/skills/lit-code/references/rust-ub/ub-taxonomy.md +269 -0
- package/assets/lithermes-plugin/skills/lit-code/references/typescript/README.md +195 -0
- package/assets/lithermes-plugin/skills/lit-code/references/typescript/backend-hono.md +672 -0
- package/assets/lithermes-plugin/skills/lit-code/references/typescript/bootstrap.md +199 -0
- package/assets/lithermes-plugin/skills/lit-code/references/typescript/data-modeling.md +202 -0
- package/assets/lithermes-plugin/skills/lit-code/references/typescript/error-handling.md +169 -0
- package/assets/lithermes-plugin/skills/lit-code/references/typescript/tsconfig-strict.md +152 -0
- package/assets/lithermes-plugin/skills/lit-code/references/typescript/type-patterns.md +196 -0
- package/assets/lithermes-plugin/skills/lit-code/scripts/go/check-no-excuse-rules.sh +173 -0
- package/assets/lithermes-plugin/skills/lit-code/scripts/go/new-project.py +138 -0
- package/assets/lithermes-plugin/skills/lit-code/scripts/go/templates/.editorconfig +13 -0
- package/assets/lithermes-plugin/skills/lit-code/scripts/go/templates/.golangci.yml +95 -0
- package/assets/lithermes-plugin/skills/lit-code/scripts/go/templates/AGENTS.md.tmpl +24 -0
- package/assets/lithermes-plugin/skills/lit-code/scripts/go/templates/README.md.tmpl +12 -0
- package/assets/lithermes-plugin/skills/lit-code/scripts/go/templates/Taskfile.yml +40 -0
- package/assets/lithermes-plugin/skills/lit-code/scripts/go/templates/ci.yml +37 -0
- package/assets/lithermes-plugin/skills/lit-code/scripts/go/templates/config.go +24 -0
- package/assets/lithermes-plugin/skills/lit-code/scripts/go/templates/gitignore +15 -0
- package/assets/lithermes-plugin/skills/lit-code/scripts/go/templates/main.go.tmpl +22 -0
- package/assets/lithermes-plugin/skills/lit-code/scripts/go/templates/run.go +15 -0
- package/assets/lithermes-plugin/skills/lit-code/scripts/python/check-no-excuse-rules.py +687 -0
- package/assets/lithermes-plugin/skills/lit-code/scripts/python/new-project.py +172 -0
- package/assets/lithermes-plugin/skills/lit-code/scripts/python/new-script.py +116 -0
- package/assets/lithermes-plugin/skills/lit-code/scripts/rust/check-no-excuse-rules.py +296 -0
- package/assets/lithermes-plugin/skills/lit-code/scripts/rust/check-no-excuse-rules.sh +158 -0
- package/assets/lithermes-plugin/skills/lit-code/scripts/rust/new-project.py +175 -0
- package/assets/lithermes-plugin/skills/lit-code/scripts/typescript/check-no-excuse-rules.ts +282 -0
- package/assets/lithermes-plugin/skills/lit-code/scripts/typescript/new-project.ts +177 -0
- package/assets/lithermes-plugin/skills/lit-commit/SKILL.md +242 -0
- package/assets/lithermes-plugin/skills/lit-comprehend/SKILL.md +259 -0
- package/assets/lithermes-plugin/skills/lit-comprehend/assets/explainer-scaffold.html +123 -0
- package/assets/lithermes-plugin/skills/lit-comprehend/references/artifact-template.md +205 -0
- package/assets/lithermes-plugin/skills/lit-comprehend/references/micro-worlds.md +139 -0
- package/assets/lithermes-plugin/skills/lit-comprehend/scripts/verify-explainer.py +324 -0
- package/assets/lithermes-plugin/skills/lit-crucible/SKILL.md +315 -0
- package/assets/lithermes-plugin/skills/lit-handoff/ORIGIN.json +23 -0
- package/assets/lithermes-plugin/skills/lit-handoff/SKILL.md +145 -0
- package/assets/lithermes-plugin/skills/lit-init/SKILL.md +329 -0
- package/assets/lithermes-plugin/skills/lit-korean/SKILL.md +237 -0
- package/assets/lithermes-plugin/skills/lit-korean/references/quick-rules.md +24 -0
- package/assets/lithermes-plugin/skills/lit-korean/references/safety-checklist.md +23 -0
- package/assets/lithermes-plugin/skills/lit-plan/SKILL.md +596 -0
- package/assets/lithermes-plugin/skills/lit-recap/SKILL.md +183 -0
- package/assets/lithermes-plugin/skills/lit-scientific-visualization/ORIGIN.json +32 -0
- package/assets/lithermes-plugin/skills/lit-scientific-visualization/SKILL.md +170 -0
- package/assets/lithermes-plugin/skills/litgoal/.gitkeep +0 -0
- package/assets/lithermes-plugin/skills/litgoal/SKILL.md +372 -0
- package/assets/lithermes-plugin/skills/litresearch/ATTRIBUTION.md +50 -0
- package/assets/lithermes-plugin/skills/litresearch/SKILL.md +593 -0
- package/assets/lithermes-plugin/skills/litwork/SKILL.md +419 -0
- package/assets/lithermes-plugin/skills/lsp/SKILL.md +165 -0
- package/assets/lithermes-plugin/skills/lsp-setup/SKILL.md +265 -0
- package/assets/lithermes-plugin/skills/lsp-setup/references/bash/README.md +68 -0
- package/assets/lithermes-plugin/skills/lsp-setup/references/c-cpp/README.md +78 -0
- package/assets/lithermes-plugin/skills/lsp-setup/references/csharp/README.md +90 -0
- package/assets/lithermes-plugin/skills/lsp-setup/references/dart/README.md +59 -0
- package/assets/lithermes-plugin/skills/lsp-setup/references/elixir/README.md +61 -0
- package/assets/lithermes-plugin/skills/lsp-setup/references/go/README.md +63 -0
- package/assets/lithermes-plugin/skills/lsp-setup/references/haskell/README.md +69 -0
- package/assets/lithermes-plugin/skills/lsp-setup/references/java/README.md +70 -0
- package/assets/lithermes-plugin/skills/lsp-setup/references/julia/README.md +70 -0
- package/assets/lithermes-plugin/skills/lsp-setup/references/kotlin/README.md +72 -0
- package/assets/lithermes-plugin/skills/lsp-setup/references/lua/README.md +68 -0
- package/assets/lithermes-plugin/skills/lsp-setup/references/php/README.md +61 -0
- package/assets/lithermes-plugin/skills/lsp-setup/references/python/README.md +73 -0
- package/assets/lithermes-plugin/skills/lsp-setup/references/ruby/README.md +67 -0
- package/assets/lithermes-plugin/skills/lsp-setup/references/rust/README.md +65 -0
- package/assets/lithermes-plugin/skills/lsp-setup/references/swift/README.md +64 -0
- package/assets/lithermes-plugin/skills/lsp-setup/references/terraform/README.md +66 -0
- package/assets/lithermes-plugin/skills/lsp-setup/references/typescript/README.md +82 -0
- package/assets/lithermes-plugin/skills/lsp-setup/references/yaml/README.md +65 -0
- package/assets/lithermes-plugin/skills/lsp-setup/references/zig/README.md +59 -0
- package/assets/lithermes-plugin/skills/lsp-setup/scripts/detect-lsp.ts +221 -0
- package/assets/lithermes-plugin/skills/lsp-setup/scripts/lsp-server-table.ts +146 -0
- package/assets/lithermes-plugin/skills/lsp-setup/scripts/tsconfig.json +18 -0
- package/assets/lithermes-plugin/skills/lsp-setup/scripts/verify-lsp.ts +252 -0
- package/assets/lithermes-plugin/skills/refactor/SKILL.md +896 -0
- package/assets/lithermes-plugin/skills/review-work/SKILL.md +450 -0
- package/assets/lithermes-plugin/skills/rules/SKILL.md +194 -0
- package/assets/lithermes-plugin/skills/skill-observer/SKILL.md +190 -0
- package/assets/lithermes-plugin/skills/skill-observer/references/review-contract.md +77 -0
- package/assets/lithermes-plugin/skills/start-work/SKILL.md +550 -0
- package/assets/lithermes-plugin/skills/structural-search/SKILL.md +274 -0
- package/assets/lithermes-plugin/skills/visual-qa/SKILL.md +48 -0
- package/assets/lithermes-plugin/skills/visual-qa/references/capture-playbook.md +133 -0
- package/assets/lithermes-plugin/skills/visual-qa/references/complete-contract.md +522 -0
- package/assets/lithermes-plugin/skills/visual-qa/schemas/evidence-manifest-v1alpha1.schema.json +135 -0
- package/assets/lithermes-plugin/skills/visual-qa/schemas/evidence-manifest-v1beta1.schema.json +110 -0
- package/assets/lithermes-plugin/skills/visual-qa/schemas/review-receipt-v1alpha1.schema.json +49 -0
- package/assets/lithermes-plugin/skills/visual-qa/scripts/contract_checks.py +71 -0
- package/assets/lithermes-plugin/skills/visual-qa/scripts/evidence_contract.py +288 -0
- package/assets/lithermes-plugin/skills/visual-qa/scripts/png_runtime.py +379 -0
- package/assets/lithermes-plugin/skills/visual-qa/scripts/review_contract.py +151 -0
- package/assets/lithermes-plugin/skills/visual-qa/scripts/tier_checks.py +190 -0
- package/assets/lithermes-plugin/skills/visual-qa/scripts/tier_contract.py +103 -0
- package/assets/lithermes-plugin/skills/visual-qa/scripts/tui_runtime.py +170 -0
- package/assets/lithermes-plugin/skills/visual-qa/scripts/visual_contracts.py +31 -0
- package/assets/lithermes-plugin/skills/visual-qa/scripts/visual_qa.py +79 -0
- package/assets/lithermes-plugin/skills/wikify/LICENSE +21 -0
- package/assets/lithermes-plugin/skills/wikify/ORIGIN.json +12 -0
- package/assets/lithermes-plugin/skills/wikify/SKILL.md +192 -0
- package/assets/lithermes-plugin/skills/wikify/assets/home-template.md +44 -0
- package/assets/lithermes-plugin/skills/wikify/assets/maintenance-report-template.md +46 -0
- package/assets/lithermes-plugin/skills/wikify/assets/paper-source-note-template.md +138 -0
- package/assets/lithermes-plugin/skills/wikify/assets/source-note-template.md +45 -0
- package/assets/lithermes-plugin/skills/wikify/assets/wiki-rules-template.md +117 -0
- package/assets/lithermes-plugin/skills/wikify/modes/ingest/SKILL.md +24 -0
- package/assets/lithermes-plugin/skills/wikify/modes/init/SKILL.md +26 -0
- package/assets/lithermes-plugin/skills/wikify/modes/lint/SKILL.md +30 -0
- package/assets/lithermes-plugin/skills/wikify/modes/query/SKILL.md +22 -0
- package/assets/lithermes-plugin/skills/wikify/modes/save/SKILL.md +32 -0
- package/assets/lithermes-plugin/skills/wikify/references/full-contract.md +761 -0
- package/assets/lithermes-plugin/uiux_runtime_common.py +117 -0
- package/assets/lithermes-plugin/vendor/NOTICE.md +21 -0
- package/assets/lithermes-plugin/vendor/handoff/SKILL.md +199 -0
- package/assets/lithermes-plugin/vendor/handoff/evals/evals.json +154 -0
- package/assets/lithermes-plugin/vendor/handoff/examples/HANDOFF-example-generic-auth-refactor.md +97 -0
- package/assets/lithermes-plugin/vendor/handoff/templates/HANDOFF.md +121 -0
- package/assets/lithermes-plugin/vendor/licenses/022_handoff-MIT.txt +21 -0
- package/assets/lithermes-plugin/vendor/licenses/045_scientific-visualization-MIT.txt +21 -0
- package/assets/lithermes-plugin/vendor/provenance/022_handoff.md +16 -0
- package/assets/lithermes-plugin/vendor/provenance/045_scientific-visualization.md +18 -0
- package/assets/lithermes-plugin/vendor/scientific-visualization/SKILL.md +283 -0
- package/assets/lithermes-plugin/vendor/scientific-visualization/assets/color_palettes.py +197 -0
- package/assets/lithermes-plugin/vendor/scientific-visualization/assets/nature.mplstyle +75 -0
- package/assets/lithermes-plugin/vendor/scientific-visualization/assets/presentation.mplstyle +74 -0
- package/assets/lithermes-plugin/vendor/scientific-visualization/assets/publication.mplstyle +78 -0
- package/assets/lithermes-plugin/vendor/scientific-visualization/evals/evals.json +158 -0
- package/assets/lithermes-plugin/vendor/scientific-visualization/references/color_palettes.md +380 -0
- package/assets/lithermes-plugin/vendor/scientific-visualization/references/journal_requirements.md +359 -0
- package/assets/lithermes-plugin/vendor/scientific-visualization/references/matplotlib_examples.md +608 -0
- package/assets/lithermes-plugin/vendor/scientific-visualization/references/mdanalysis_martini_visualization.md +85 -0
- package/assets/lithermes-plugin/vendor/scientific-visualization/references/publication_guidelines.md +217 -0
- package/assets/lithermes-plugin/vendor/scientific-visualization/references/seaborn_for_publications.md +293 -0
- package/assets/lithermes-plugin/vendor/scientific-visualization/scripts/figure_export.py +238 -0
- package/assets/lithermes-plugin/vendor/scientific-visualization/scripts/style_presets.py +467 -0
- package/assets/lithermes-plugin/vendor/scientific-visualization/tests/test_figure_export.py +51 -0
- package/assets/lithermes-plugin/vendor/scientific-visualization/tests/test_style_presets.py +114 -0
- package/bin/lithermes.js +8 -0
- package/package.json +58 -0
- package/readme-assets/badge-license.svg +1 -0
- package/readme-assets/badge-version.svg +1 -0
- package/readme-assets/cover.webp +0 -0
- package/readme-assets/lithermes-clay-icon.png +0 -0
- package/readme-assets/lithermes-wordmark.svg +5 -0
- package/src/cli.js +396 -0
- package/src/lib/autoUpdate.js +4 -0
- package/src/lib/canonicalCorpus.js +436 -0
- package/src/lib/check.js +200 -0
- package/src/lib/config.js +229 -0
- package/src/lib/files.js +126 -0
- package/src/lib/hermesDiscovery.js +122 -0
- package/src/lib/hud.js +135 -0
- package/src/lib/install.js +559 -0
- package/src/lib/litMark.js +68 -0
- package/src/lib/modelConfig.js +431 -0
- package/src/lib/modelConfigBoundary.js +206 -0
- package/src/lib/modelPrompt.js +201 -0
- package/src/lib/modelRoutePolicy.js +379 -0
- package/src/lib/patch.js +153 -0
- package/src/lib/skillLoop.js +62 -0
- package/src/lib/skillPayload.js +306 -0
- package/src/lib/skins.js +274 -0
- package/src/lib/spinner.js +193 -0
- package/src/lib/updateNotifier.js +1133 -0
- package/src/lib/updateNotifierWorker.js +9 -0
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
from __future__ import annotations
|
|
3
|
+
|
|
4
|
+
import argparse
|
|
5
|
+
import sys
|
|
6
|
+
from pathlib import Path
|
|
7
|
+
|
|
8
|
+
PLUGIN_ROOT = Path(__file__).resolve().parents[3]
|
|
9
|
+
sys.path.insert(0, str(PLUGIN_ROOT))
|
|
10
|
+
|
|
11
|
+
from uiux_runtime_common import ContractError, emit_error, emit_json
|
|
12
|
+
|
|
13
|
+
from design_contract_validation import (
|
|
14
|
+
BETA2_SCHEMA_ID,
|
|
15
|
+
BETA_SCHEMA_ID,
|
|
16
|
+
SCHEMA_ID,
|
|
17
|
+
canonical_design_contract,
|
|
18
|
+
design_contract_report,
|
|
19
|
+
load_design_contract_path,
|
|
20
|
+
load_design_contract_stdin,
|
|
21
|
+
validate_design_contract,
|
|
22
|
+
)
|
|
23
|
+
from design_runtime import query_dataset
|
|
24
|
+
|
|
25
|
+
DEFAULT_DATASET = Path(__file__).resolve().parents[1] / "resources" / "design-intelligence.json"
|
|
26
|
+
|
|
27
|
+
# Exit-code contract for the Design Contract commands:
|
|
28
|
+
# 0 the contract satisfies every rule; stdout carries one line of JSON
|
|
29
|
+
# {"issues": [], "schema": "<id>", "valid": true}
|
|
30
|
+
# 1 the input parsed but broke rules; stdout carries the same envelope with a
|
|
31
|
+
# populated issues array
|
|
32
|
+
# 2 the input could not be trusted at all (oversize, non-UTF-8, NUL byte, duplicate
|
|
33
|
+
# JSON key, trailing data, unreadable or non-regular file); a human sentence goes
|
|
34
|
+
# to stderr and stdout stays empty
|
|
35
|
+
# Every command hands its code back to `run`, which hands it to SystemExit at the bottom
|
|
36
|
+
# of this file. Nothing exits from inside a nested call, so buffered stdout is always
|
|
37
|
+
# flushed by normal interpreter shutdown before the code reaches the caller.
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
def parser() -> argparse.ArgumentParser:
|
|
41
|
+
root = argparse.ArgumentParser(description="LitHermes offline design intelligence")
|
|
42
|
+
commands = root.add_subparsers(dest="command", required=True)
|
|
43
|
+
validate = commands.add_parser(
|
|
44
|
+
"validate-design-contract",
|
|
45
|
+
help="check a Design Contract; exits 0 valid, 1 invalid, 2 untrusted input",
|
|
46
|
+
)
|
|
47
|
+
validate.add_argument("--contract", type=Path, help="contract path; defaults to stdin")
|
|
48
|
+
validate.add_argument("--json", action="store_true", help="stdout is always the JSON envelope")
|
|
49
|
+
canonical = commands.add_parser(
|
|
50
|
+
"canonical-design-contract",
|
|
51
|
+
help="emit the canonical hashable text of a valid Design Contract",
|
|
52
|
+
)
|
|
53
|
+
canonical.add_argument("--contract", type=Path, help="contract path; defaults to stdin")
|
|
54
|
+
query = commands.add_parser("query")
|
|
55
|
+
query.add_argument("--query", required=True)
|
|
56
|
+
query.add_argument("--domain", required=True)
|
|
57
|
+
query.add_argument("--limit", type=int, default=20)
|
|
58
|
+
query.add_argument("--dataset", type=Path, default=DEFAULT_DATASET)
|
|
59
|
+
query.add_argument("--json", action="store_true")
|
|
60
|
+
return root
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
def _load_contract(contract: Path):
|
|
64
|
+
if contract is None:
|
|
65
|
+
return load_design_contract_stdin()
|
|
66
|
+
return load_design_contract_path(contract)
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
def _report_untrusted(error: ContractError) -> int:
|
|
70
|
+
sys.stderr.write("design contract input rejected: {0}\n".format(error.detail))
|
|
71
|
+
return 2
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
def _validate_command(contract: Path) -> int:
|
|
75
|
+
try:
|
|
76
|
+
value = _load_contract(contract)
|
|
77
|
+
except ContractError as error:
|
|
78
|
+
return _report_untrusted(error)
|
|
79
|
+
report = design_contract_report(value)
|
|
80
|
+
emit_json(report)
|
|
81
|
+
return 0 if report["evidence_eligible"] else 1
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
def _canonical_command(contract: Path) -> int:
|
|
85
|
+
try:
|
|
86
|
+
value = _load_contract(contract)
|
|
87
|
+
except ContractError as error:
|
|
88
|
+
return _report_untrusted(error)
|
|
89
|
+
issues = validate_design_contract(value)
|
|
90
|
+
if issues:
|
|
91
|
+
sys.stderr.write("design contract is invalid; canonical text withheld:\n")
|
|
92
|
+
for issue in issues:
|
|
93
|
+
sys.stderr.write(" - {0}\n".format(issue))
|
|
94
|
+
return 1
|
|
95
|
+
if value.get("schema_id") == SCHEMA_ID:
|
|
96
|
+
sys.stderr.write(
|
|
97
|
+
"design contract v1alpha1 is diagnostic-only; canonical completion requires v1beta1 or v1beta2\n"
|
|
98
|
+
)
|
|
99
|
+
return 1
|
|
100
|
+
if value.get("schema_id") not in (BETA_SCHEMA_ID, BETA2_SCHEMA_ID):
|
|
101
|
+
sys.stderr.write("design contract schema is not canonical\n")
|
|
102
|
+
return 1
|
|
103
|
+
sys.stdout.write(canonical_design_contract(value))
|
|
104
|
+
return 0
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
def run(arguments: list[str]) -> int:
|
|
108
|
+
args = parser().parse_args(arguments)
|
|
109
|
+
if args.command == "validate-design-contract":
|
|
110
|
+
return _validate_command(args.contract)
|
|
111
|
+
if args.command == "canonical-design-contract":
|
|
112
|
+
return _canonical_command(args.contract)
|
|
113
|
+
try:
|
|
114
|
+
emit_json(
|
|
115
|
+
query_dataset(
|
|
116
|
+
args.dataset,
|
|
117
|
+
query=args.query,
|
|
118
|
+
domain=args.domain,
|
|
119
|
+
limit=args.limit,
|
|
120
|
+
)
|
|
121
|
+
)
|
|
122
|
+
return 0
|
|
123
|
+
except ContractError as error:
|
|
124
|
+
return emit_error(error)
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
if __name__ == "__main__":
|
|
128
|
+
raise SystemExit(run(sys.argv[1:]))
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import hashlib
|
|
4
|
+
import stat
|
|
5
|
+
from pathlib import Path
|
|
6
|
+
from typing import Final
|
|
7
|
+
|
|
8
|
+
from uiux_runtime_common import ContractError, JsonValue, parse_json_bytes, require_mapping
|
|
9
|
+
|
|
10
|
+
# The packaged corpus identity lives with the corpus loader. The Design Contract does
|
|
11
|
+
# not carry, pin, or depend on it.
|
|
12
|
+
DATASET_SCHEMA: Final = "litfamily.design-intelligence/v1"
|
|
13
|
+
DATASET_SHA256: Final = "a89011236a6ff14e12ec55fccbfab1bbd40ae34614cea5710c022121aa841bb8"
|
|
14
|
+
DATASET_BYTES: Final = 1_023_482
|
|
15
|
+
QUERY_MAX_BYTES: Final = 4096
|
|
16
|
+
OUTPUT_RECORD_LIMIT: Final = 20
|
|
17
|
+
DATASET_MAX_BYTES: Final = 4 * 1024 * 1024
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def _records(dataset: dict[str, JsonValue]) -> list[dict[str, JsonValue]]:
|
|
21
|
+
raw_records = dataset.get("records")
|
|
22
|
+
if not isinstance(raw_records, list) or not raw_records:
|
|
23
|
+
raise ContractError("DATASET_RECORD_INVALID", "records must be a non-empty array")
|
|
24
|
+
checked: list[dict[str, JsonValue]] = []
|
|
25
|
+
for index, candidate in enumerate(raw_records):
|
|
26
|
+
if not isinstance(candidate, dict):
|
|
27
|
+
raise ContractError("DATASET_RECORD_INVALID", f"record {index} is not an object")
|
|
28
|
+
required = ("record_id", "domain", "No")
|
|
29
|
+
if any(key not in candidate for key in required):
|
|
30
|
+
raise ContractError("DATASET_RECORD_INVALID", f"record {index} missing required fields")
|
|
31
|
+
if len(candidate) < 4:
|
|
32
|
+
raise ContractError("DATASET_RECORD_INVALID", f"record {index} has no content fields")
|
|
33
|
+
checked.append(candidate)
|
|
34
|
+
return checked
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def load_dataset(path: Path) -> tuple[dict[str, JsonValue], list[dict[str, JsonValue]]]:
|
|
38
|
+
try:
|
|
39
|
+
stat_result = path.lstat()
|
|
40
|
+
except OSError as error:
|
|
41
|
+
raise ContractError("DATASET_UNREADABLE", str(error)) from error
|
|
42
|
+
if path.is_symlink() or not stat.S_ISREG(stat_result.st_mode):
|
|
43
|
+
raise ContractError("DATASET_UNSAFE_PATH", str(path))
|
|
44
|
+
try:
|
|
45
|
+
raw = path.read_bytes()
|
|
46
|
+
except OSError as error:
|
|
47
|
+
raise ContractError("DATASET_UNREADABLE", str(error)) from error
|
|
48
|
+
try:
|
|
49
|
+
parsed = parse_json_bytes(raw, maximum_bytes=DATASET_MAX_BYTES)
|
|
50
|
+
except ContractError as error:
|
|
51
|
+
raise ContractError("DATASET_MALFORMED", error.detail) from error
|
|
52
|
+
dataset = require_mapping(parsed, code="DATASET_MALFORMED")
|
|
53
|
+
if dataset.get("schema_version") != DATASET_SCHEMA:
|
|
54
|
+
raise ContractError("DATASET_RECORD_INVALID", "unknown dataset schema")
|
|
55
|
+
records = _records(dataset)
|
|
56
|
+
digest = hashlib.sha256(raw).hexdigest()
|
|
57
|
+
if digest != DATASET_SHA256:
|
|
58
|
+
raise ContractError("DATASET_HASH_MISMATCH", digest)
|
|
59
|
+
return dataset, records
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
def query_dataset(
|
|
63
|
+
path: Path,
|
|
64
|
+
*,
|
|
65
|
+
query: str,
|
|
66
|
+
domain: str,
|
|
67
|
+
limit: int,
|
|
68
|
+
) -> dict[str, JsonValue]:
|
|
69
|
+
query_bytes = len(query.encode("utf-8"))
|
|
70
|
+
if query_bytes > QUERY_MAX_BYTES:
|
|
71
|
+
raise ContractError("QUERY_UTF8_TOO_LARGE", f"{query_bytes} > {QUERY_MAX_BYTES}")
|
|
72
|
+
if limit < 1 or limit > OUTPUT_RECORD_LIMIT:
|
|
73
|
+
raise ContractError("LIMIT_INVALID", f"limit must be 1..{OUTPUT_RECORD_LIMIT}")
|
|
74
|
+
_, records = load_dataset(path)
|
|
75
|
+
domains = {str(record["domain"]) for record in records}
|
|
76
|
+
if domain not in domains:
|
|
77
|
+
raise ContractError("UNKNOWN_DOMAIN", f"unknown domain: {domain}")
|
|
78
|
+
terms = [term for term in query.casefold().split() if term]
|
|
79
|
+
matches: list[dict[str, JsonValue]] = []
|
|
80
|
+
for record in records:
|
|
81
|
+
if record["domain"] != domain:
|
|
82
|
+
continue
|
|
83
|
+
searchable = " ".join(str(value) for value in record.values()).casefold()
|
|
84
|
+
if terms and not all(term in searchable for term in terms):
|
|
85
|
+
continue
|
|
86
|
+
matches.append(record)
|
|
87
|
+
if len(matches) == limit:
|
|
88
|
+
break
|
|
89
|
+
return {
|
|
90
|
+
"dataset_sha256": DATASET_SHA256,
|
|
91
|
+
"empty_result": not matches,
|
|
92
|
+
"fallback_applied": False,
|
|
93
|
+
"files_written": 0,
|
|
94
|
+
"network_access": False,
|
|
95
|
+
"query_utf8_bytes": query_bytes,
|
|
96
|
+
"records": matches,
|
|
97
|
+
"schema_id": "litfamily.design-intelligence-query/v1alpha1",
|
|
98
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
from __future__ import annotations
|
|
3
|
+
|
|
4
|
+
import argparse
|
|
5
|
+
import hashlib
|
|
6
|
+
import sys
|
|
7
|
+
from pathlib import Path
|
|
8
|
+
|
|
9
|
+
PLUGIN_ROOT = Path(__file__).resolve().parents[3]
|
|
10
|
+
sys.path.insert(0, str(PLUGIN_ROOT))
|
|
11
|
+
|
|
12
|
+
from uiux_runtime_common import ContractError, emit_error, emit_json
|
|
13
|
+
|
|
14
|
+
from source_import import canonicalize
|
|
15
|
+
from source_manifest import load_manifest
|
|
16
|
+
|
|
17
|
+
DEFAULT_MANIFEST = Path(__file__).resolve().parents[1] / "resources" / "import-manifest.json"
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def parser() -> argparse.ArgumentParser:
|
|
21
|
+
result = argparse.ArgumentParser(description="Validate the pinned 34-source design-intelligence import")
|
|
22
|
+
result.add_argument("--source-root", required=True, type=Path)
|
|
23
|
+
result.add_argument("--manifest", type=Path, default=DEFAULT_MANIFEST)
|
|
24
|
+
result.add_argument("--check", action="store_true", required=True)
|
|
25
|
+
result.add_argument("--expect-records", type=int, required=True)
|
|
26
|
+
result.add_argument("--max-bytes", type=int, required=True)
|
|
27
|
+
return result
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
def run(arguments: list[str]) -> int:
|
|
31
|
+
args = parser().parse_args(arguments)
|
|
32
|
+
try:
|
|
33
|
+
if args.expect_records != 2277 or args.max_bytes != 4_194_304:
|
|
34
|
+
raise ContractError("SOURCE_CONTRACT_INVALID", "approved record and byte bounds required")
|
|
35
|
+
source_root = args.source_root.resolve()
|
|
36
|
+
if not source_root.is_dir():
|
|
37
|
+
raise ContractError("SOURCE_ROOT_INVALID", str(source_root))
|
|
38
|
+
_, entries = load_manifest(args.manifest.resolve())
|
|
39
|
+
canonical = canonicalize(source_root, entries, args.expect_records, args.max_bytes)
|
|
40
|
+
emit_json(
|
|
41
|
+
{
|
|
42
|
+
"bytes": len(canonical),
|
|
43
|
+
"dataset_sha256": hashlib.sha256(canonical).hexdigest(),
|
|
44
|
+
"records": args.expect_records,
|
|
45
|
+
"status": "SOURCE_CONTRACT_PASS",
|
|
46
|
+
}
|
|
47
|
+
)
|
|
48
|
+
return 0
|
|
49
|
+
except (ContractError, OSError) as error:
|
|
50
|
+
if isinstance(error, ContractError):
|
|
51
|
+
return emit_error(error)
|
|
52
|
+
return emit_error(ContractError("SOURCE_IO_ERROR", str(error)))
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
if __name__ == "__main__":
|
|
56
|
+
raise SystemExit(run(sys.argv[1:]))
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import csv
|
|
4
|
+
import hashlib
|
|
5
|
+
import io
|
|
6
|
+
import json
|
|
7
|
+
import re
|
|
8
|
+
from pathlib import Path
|
|
9
|
+
from typing import Final
|
|
10
|
+
|
|
11
|
+
from source_manifest import LICENSE_SHA256, REPAIRED_JAVAFX_SHA256, SOURCE_COMMIT
|
|
12
|
+
from uiux_runtime_common import ContractError, JsonValue
|
|
13
|
+
|
|
14
|
+
DATASET_SHA256: Final = "a89011236a6ff14e12ec55fccbfab1bbd40ae34614cea5710c022121aa841bb8"
|
|
15
|
+
DATASET_BYTES: Final = 1_023_482
|
|
16
|
+
PLACEHOLDER = re.compile(r"(?i)(?:TODO|TBD|lorem\s+ipsum)")
|
|
17
|
+
PUNCTUATION_ONLY = re.compile(r"^[^\w\s]+$", re.UNICODE)
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def _csv_rows(text: str, relative: str) -> list[list[str]]:
|
|
21
|
+
reader = csv.reader(io.StringIO(text, newline=""), strict=True)
|
|
22
|
+
try:
|
|
23
|
+
rows = list(reader)
|
|
24
|
+
except csv.Error as error:
|
|
25
|
+
raise ContractError("SOURCE_CSV_INVALID", f"{relative}: {error}") from error
|
|
26
|
+
if not rows:
|
|
27
|
+
raise ContractError("SOURCE_CSV_INVALID", f"{relative}: empty")
|
|
28
|
+
width = len(rows[0])
|
|
29
|
+
if any(len(row) != width for row in rows[1:]):
|
|
30
|
+
raise ContractError("SOURCE_CSV_INVALID", f"{relative}: row width drift")
|
|
31
|
+
return rows
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def _repair(text: str, entry: dict[str, JsonValue]) -> str:
|
|
35
|
+
repair = entry.get("repair")
|
|
36
|
+
if repair is None:
|
|
37
|
+
return text
|
|
38
|
+
expected = {
|
|
39
|
+
"occurrences": 18,
|
|
40
|
+
"repaired_sha256": REPAIRED_JAVAFX_SHA256,
|
|
41
|
+
"rule": "backslash_quote_to_rfc4180_double_quote",
|
|
42
|
+
}
|
|
43
|
+
if entry.get("path") != "src/ui-ux-pro-max/data/stacks/javafx.csv" or repair != expected:
|
|
44
|
+
raise ContractError("SOURCE_REPAIR_INVALID", str(entry.get("path")))
|
|
45
|
+
try:
|
|
46
|
+
_csv_rows(text, str(entry["path"]))
|
|
47
|
+
except ContractError:
|
|
48
|
+
pass
|
|
49
|
+
else:
|
|
50
|
+
raise ContractError("SOURCE_REPAIR_INVALID", "repair source unexpectedly parses")
|
|
51
|
+
if text.count('\\"') != 18:
|
|
52
|
+
raise ContractError("SOURCE_REPAIR_INVALID", "repair occurrence drift")
|
|
53
|
+
repaired = text.replace('\\"', '""')
|
|
54
|
+
if hashlib.sha256(repaired.encode("utf-8")).hexdigest() != REPAIRED_JAVAFX_SHA256:
|
|
55
|
+
raise ContractError("SOURCE_REPAIR_INVALID", "repaired hash drift")
|
|
56
|
+
return repaired
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
def _source_bytes(source_root: Path, entry: dict[str, JsonValue]) -> bytes:
|
|
60
|
+
relative = Path(str(entry["path"]))
|
|
61
|
+
path = source_root / relative
|
|
62
|
+
if path.is_symlink() or not path.is_file():
|
|
63
|
+
raise ContractError("SOURCE_FILE_MISSING", str(relative))
|
|
64
|
+
raw = path.read_bytes()
|
|
65
|
+
if hashlib.sha256(raw).hexdigest() != entry.get("raw_sha256"):
|
|
66
|
+
raise ContractError("SOURCE_HASH_MISMATCH", str(relative))
|
|
67
|
+
if b"\x00" in raw:
|
|
68
|
+
raise ContractError("SOURCE_CSV_INVALID", f"{relative}: NUL")
|
|
69
|
+
return raw
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
def _entry_records(source_root: Path, entry: dict[str, JsonValue]) -> list[dict[str, JsonValue]]:
|
|
73
|
+
relative = str(entry["path"])
|
|
74
|
+
try:
|
|
75
|
+
text = _source_bytes(source_root, entry).decode("utf-8", errors="strict")
|
|
76
|
+
except UnicodeDecodeError as error:
|
|
77
|
+
raise ContractError("SOURCE_CSV_INVALID", f"{relative}: UTF-8") from error
|
|
78
|
+
text = _repair(text.replace("\r\n", "\n").replace("\r", "\n"), entry)
|
|
79
|
+
rows = _csv_rows(text, relative)
|
|
80
|
+
header = rows[0]
|
|
81
|
+
if header != entry.get("header") or len(header) != len(set(header)):
|
|
82
|
+
raise ContractError("SOURCE_HEADER_MISMATCH", relative)
|
|
83
|
+
if len(rows) - 1 != entry.get("data_row_count"):
|
|
84
|
+
raise ContractError("SOURCE_ROW_COUNT_MISMATCH", relative)
|
|
85
|
+
selected = list(entry["selected_columns"])
|
|
86
|
+
positions = {column: header.index(column) for column in selected}
|
|
87
|
+
source_path = Path(relative)
|
|
88
|
+
stack = source_path.stem if source_path.parent.name == "stacks" else None
|
|
89
|
+
domain = f"stack/{stack}" if stack else source_path.stem
|
|
90
|
+
records: list[dict[str, JsonValue]] = []
|
|
91
|
+
for row_number, row in enumerate(rows[1:], start=2):
|
|
92
|
+
values = {column: row[positions[column]].strip(" \t\r\n\v\f") for column in selected}
|
|
93
|
+
if any(PLACEHOLDER.fullmatch(value) or (value and PUNCTUATION_ONLY.fullmatch(value)) for value in values.values()):
|
|
94
|
+
raise ContractError("SOURCE_TEXT_INVALID", f"{relative}: row {row_number}")
|
|
95
|
+
try:
|
|
96
|
+
source_no = int(values["No"], 10)
|
|
97
|
+
except ValueError as error:
|
|
98
|
+
raise ContractError("SOURCE_RECORD_INVALID", f"{relative}: row {row_number}") from error
|
|
99
|
+
if source_no < 1 or str(source_no) != values["No"]:
|
|
100
|
+
raise ContractError("SOURCE_RECORD_INVALID", f"{relative}: noncanonical No")
|
|
101
|
+
record: dict[str, JsonValue] = dict(values)
|
|
102
|
+
record["No"] = source_no
|
|
103
|
+
record["domain"] = domain
|
|
104
|
+
record["record_id"] = f"{domain}/{source_no}"
|
|
105
|
+
if stack:
|
|
106
|
+
record["stack"] = stack
|
|
107
|
+
records.append(record)
|
|
108
|
+
if len(records) != entry.get("normalized_record_count"):
|
|
109
|
+
raise ContractError("SOURCE_ROW_COUNT_MISMATCH", relative)
|
|
110
|
+
return records
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
def canonicalize(
|
|
114
|
+
source_root: Path,
|
|
115
|
+
entries: list[dict[str, JsonValue]],
|
|
116
|
+
expected_records: int,
|
|
117
|
+
maximum_bytes: int,
|
|
118
|
+
) -> bytes:
|
|
119
|
+
license_path = source_root / "LICENSE"
|
|
120
|
+
if license_path.is_symlink() or not license_path.is_file():
|
|
121
|
+
raise ContractError("SOURCE_LICENSE_INVALID", "LICENSE missing")
|
|
122
|
+
if hashlib.sha256(license_path.read_bytes()).hexdigest() != LICENSE_SHA256:
|
|
123
|
+
raise ContractError("SOURCE_LICENSE_INVALID", "LICENSE hash drift")
|
|
124
|
+
records: list[dict[str, JsonValue]] = []
|
|
125
|
+
record_ids: set[str] = set()
|
|
126
|
+
for entry in entries:
|
|
127
|
+
for record in _entry_records(source_root, entry):
|
|
128
|
+
record_id = str(record["record_id"])
|
|
129
|
+
if record_id in record_ids:
|
|
130
|
+
raise ContractError("SOURCE_RECORD_INVALID", f"duplicate {record_id}")
|
|
131
|
+
record_ids.add(record_id)
|
|
132
|
+
records.append(record)
|
|
133
|
+
if len(records) != expected_records:
|
|
134
|
+
raise ContractError("SOURCE_RECORD_COUNT_MISMATCH", f"{len(records)} != {expected_records}")
|
|
135
|
+
payload = {"records": records, "schema_version": "litfamily.design-intelligence/v1", "source_commit": SOURCE_COMMIT}
|
|
136
|
+
canonical = (
|
|
137
|
+
json.dumps(payload, ensure_ascii=False, sort_keys=True, separators=(",", ":"), allow_nan=False) + "\n"
|
|
138
|
+
).encode("utf-8")
|
|
139
|
+
digest = hashlib.sha256(canonical).hexdigest()
|
|
140
|
+
if len(canonical) > maximum_bytes:
|
|
141
|
+
raise ContractError("SOURCE_OUTPUT_TOO_LARGE", f"{len(canonical)} > {maximum_bytes}")
|
|
142
|
+
if len(canonical) != DATASET_BYTES or digest != DATASET_SHA256:
|
|
143
|
+
raise ContractError("SOURCE_CANONICAL_MISMATCH", f"bytes={len(canonical)} sha256={digest}")
|
|
144
|
+
return canonical
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import hashlib
|
|
4
|
+
import re
|
|
5
|
+
from pathlib import Path
|
|
6
|
+
from typing import Final
|
|
7
|
+
|
|
8
|
+
from uiux_runtime_common import ContractError, JsonValue, parse_json_bytes, require_mapping
|
|
9
|
+
|
|
10
|
+
MANIFEST_SHA256: Final = "9adf471d95aaf17e7866e1c7674cb1a101daae9abdab87c71c96a60f2a58e6fa"
|
|
11
|
+
SOURCE_COMMIT: Final = "1307d97a72e6c1cda572cb65471ae5ce82995218"
|
|
12
|
+
LICENSE_SHA256: Final = "738f69dfa83db5c347c678fb9d90e560877059f0de93a327c39001bff92dc014"
|
|
13
|
+
REPAIRED_JAVAFX_SHA256: Final = "cb424eee50fff9fb6f503ce9a2793177e6eafa6eb7d2ba68561fb3e1b7301ba0"
|
|
14
|
+
HASH = re.compile(r"^[0-9a-f]{64}$")
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def load_manifest(path: Path) -> tuple[dict[str, JsonValue], list[dict[str, JsonValue]]]:
|
|
18
|
+
if path.is_symlink() or not path.is_file():
|
|
19
|
+
raise ContractError("SOURCE_MANIFEST_INVALID", "manifest must be a regular file")
|
|
20
|
+
raw = path.read_bytes()
|
|
21
|
+
if hashlib.sha256(raw).hexdigest() != MANIFEST_SHA256:
|
|
22
|
+
raise ContractError("SOURCE_MANIFEST_INVALID", "manifest hash drift")
|
|
23
|
+
manifest = require_mapping(
|
|
24
|
+
parse_json_bytes(raw, maximum_bytes=256 * 1024),
|
|
25
|
+
code="SOURCE_MANIFEST_INVALID",
|
|
26
|
+
)
|
|
27
|
+
if set(manifest) != {"schema_version", "source", "sources"}:
|
|
28
|
+
raise ContractError("SOURCE_MANIFEST_INVALID", "manifest fields drift")
|
|
29
|
+
if manifest.get("schema_version") != "litfamily.source-import-manifest/v1":
|
|
30
|
+
raise ContractError("SOURCE_MANIFEST_INVALID", "manifest schema drift")
|
|
31
|
+
source = manifest.get("source")
|
|
32
|
+
if not isinstance(source, dict) or source.get("commit") != SOURCE_COMMIT:
|
|
33
|
+
raise ContractError("SOURCE_MANIFEST_INVALID", "source commit drift")
|
|
34
|
+
license_info = source.get("license")
|
|
35
|
+
if not isinstance(license_info, dict) or license_info.get("sha256") != LICENSE_SHA256:
|
|
36
|
+
raise ContractError("SOURCE_MANIFEST_INVALID", "license identity drift")
|
|
37
|
+
entries = manifest.get("sources")
|
|
38
|
+
if not isinstance(entries, list) or len(entries) != 34:
|
|
39
|
+
raise ContractError("SOURCE_MANIFEST_INVALID", "exactly 34 sources required")
|
|
40
|
+
paths: list[str] = []
|
|
41
|
+
for entry in entries:
|
|
42
|
+
if not isinstance(entry, dict):
|
|
43
|
+
raise ContractError("SOURCE_MANIFEST_INVALID", "source entry must be an object")
|
|
44
|
+
required = {
|
|
45
|
+
"data_row_count", "header", "normalized_record_count", "path", "profile",
|
|
46
|
+
"raw_sha256", "selected_columns",
|
|
47
|
+
}
|
|
48
|
+
if set(entry) not in (required, required | {"repair"}):
|
|
49
|
+
raise ContractError("SOURCE_MANIFEST_INVALID", "source entry fields drift")
|
|
50
|
+
source_path = entry.get("path")
|
|
51
|
+
if not isinstance(source_path, str) or not source_path.startswith("src/ui-ux-pro-max/data/"):
|
|
52
|
+
raise ContractError("SOURCE_MANIFEST_INVALID", "source path invalid")
|
|
53
|
+
paths.append(source_path)
|
|
54
|
+
if not isinstance(entry.get("header"), list) or not isinstance(entry.get("selected_columns"), list):
|
|
55
|
+
raise ContractError("SOURCE_MANIFEST_INVALID", f"column inventory invalid: {source_path}")
|
|
56
|
+
if not set(entry["selected_columns"]).issubset(set(entry["header"])) or "No" not in entry["selected_columns"]:
|
|
57
|
+
raise ContractError("SOURCE_MANIFEST_INVALID", f"selected columns invalid: {source_path}")
|
|
58
|
+
if HASH.fullmatch(str(entry.get("raw_sha256", ""))) is None:
|
|
59
|
+
raise ContractError("SOURCE_MANIFEST_INVALID", f"source hash invalid: {source_path}")
|
|
60
|
+
for key in ("data_row_count", "normalized_record_count"):
|
|
61
|
+
if not isinstance(entry.get(key), int) or isinstance(entry.get(key), bool) or entry[key] < 1:
|
|
62
|
+
raise ContractError("SOURCE_MANIFEST_INVALID", f"{key} invalid: {source_path}")
|
|
63
|
+
if len(set(paths)) != 34:
|
|
64
|
+
raise ContractError("SOURCE_MANIFEST_INVALID", "source paths must be unique")
|
|
65
|
+
return manifest, entries
|