@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
package/assets/lithermes-plugin/skills/visual-qa/schemas/evidence-manifest-v1beta1.schema.json
ADDED
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "litfamily.evidence-manifest/v1beta1",
|
|
4
|
+
"title": "LitFamily material Evidence Manifest v1beta1",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"additionalProperties": false,
|
|
7
|
+
"required": [
|
|
8
|
+
"schema_id", "tier", "design_contract_sha256", "source_revision", "captures", "inventory",
|
|
9
|
+
"mechanical_results", "accessibility_results", "tui_results", "reviewer_receipt_hashes",
|
|
10
|
+
"open_findings", "exception_references", "cleanup", "final_verdict"
|
|
11
|
+
],
|
|
12
|
+
"properties": {
|
|
13
|
+
"schema_id": { "const": "litfamily.evidence-manifest/v1beta1" },
|
|
14
|
+
"tier": { "enum": ["smoke", "full", "reference-fidelity"] },
|
|
15
|
+
"design_contract_sha256": { "$ref": "#/$defs/sha256" },
|
|
16
|
+
"source_revision": { "type": "string", "pattern": "^[0-9a-f]{40}$" },
|
|
17
|
+
"captures": { "type": "array", "minItems": 1, "uniqueItems": true, "items": { "$ref": "#/$defs/capture" } },
|
|
18
|
+
"inventory": { "type": "array", "minItems": 1, "uniqueItems": true, "items": { "$ref": "#/$defs/inventoryItem" } },
|
|
19
|
+
"mechanical_results": { "$ref": "#/$defs/results" },
|
|
20
|
+
"accessibility_results": { "$ref": "#/$defs/accessibilityResults" },
|
|
21
|
+
"tui_results": { "$ref": "#/$defs/results" },
|
|
22
|
+
"reviewer_receipt_hashes": { "type": "array", "maxItems": 2, "uniqueItems": true, "items": { "$ref": "#/$defs/sha256" } },
|
|
23
|
+
"open_findings": { "type": "array" },
|
|
24
|
+
"exception_references": { "type": "array", "uniqueItems": true, "items": { "$ref": "#/$defs/nonempty" } },
|
|
25
|
+
"cleanup": {
|
|
26
|
+
"type": "object", "additionalProperties": false,
|
|
27
|
+
"required": ["state", "process_terminated", "auth_session_closed", "transient_paths_removed"],
|
|
28
|
+
"properties": {
|
|
29
|
+
"state": { "const": "complete" },
|
|
30
|
+
"process_terminated": { "const": true },
|
|
31
|
+
"auth_session_closed": { "const": true },
|
|
32
|
+
"transient_paths_removed": { "const": true }
|
|
33
|
+
}
|
|
34
|
+
},
|
|
35
|
+
"final_verdict": { "const": "PASS" }
|
|
36
|
+
},
|
|
37
|
+
"$defs": {
|
|
38
|
+
"nonempty": { "type": "string", "minLength": 1, "pattern": "\\S" },
|
|
39
|
+
"sha256": { "type": "string", "pattern": "^[0-9a-f]{64}$" },
|
|
40
|
+
"capture": {
|
|
41
|
+
"type": "object", "additionalProperties": false,
|
|
42
|
+
"required": [
|
|
43
|
+
"capture_id", "source_sha256", "capture_sha256", "created_at", "maximum_age_seconds",
|
|
44
|
+
"viewport", "dpr", "os", "runtime", "runtime_version", "font_set", "locale",
|
|
45
|
+
"reduced_motion", "animation_settling_policy", "color_scheme", "auth_owner", "process_owner"
|
|
46
|
+
],
|
|
47
|
+
"properties": {
|
|
48
|
+
"capture_id": { "$ref": "#/$defs/nonempty" },
|
|
49
|
+
"source_sha256": { "$ref": "#/$defs/sha256" },
|
|
50
|
+
"capture_sha256": { "$ref": "#/$defs/sha256" },
|
|
51
|
+
"created_at": { "type": "string", "format": "date-time", "pattern": "\\S" },
|
|
52
|
+
"maximum_age_seconds": { "type": "integer", "minimum": 1, "maximum": 86400 },
|
|
53
|
+
"viewport": {
|
|
54
|
+
"type": "object", "additionalProperties": false, "required": ["width", "height"],
|
|
55
|
+
"properties": {
|
|
56
|
+
"width": { "type": "integer", "minimum": 1, "maximum": 16384 },
|
|
57
|
+
"height": { "type": "integer", "minimum": 1, "maximum": 16384 }
|
|
58
|
+
}
|
|
59
|
+
},
|
|
60
|
+
"dpr": { "type": "number", "exclusiveMinimum": 0, "maximum": 8 },
|
|
61
|
+
"os": { "$ref": "#/$defs/nonempty" },
|
|
62
|
+
"runtime": { "$ref": "#/$defs/nonempty" },
|
|
63
|
+
"runtime_version": { "$ref": "#/$defs/nonempty" },
|
|
64
|
+
"font_set": { "type": "array", "minItems": 1, "uniqueItems": true, "items": { "$ref": "#/$defs/nonempty" } },
|
|
65
|
+
"locale": { "$ref": "#/$defs/nonempty" },
|
|
66
|
+
"reduced_motion": { "type": "boolean" },
|
|
67
|
+
"animation_settling_policy": { "$ref": "#/$defs/nonempty" },
|
|
68
|
+
"color_scheme": { "enum": ["light", "dark", "system"] },
|
|
69
|
+
"auth_owner": { "$ref": "#/$defs/nonempty" },
|
|
70
|
+
"process_owner": { "$ref": "#/$defs/nonempty" }
|
|
71
|
+
}
|
|
72
|
+
},
|
|
73
|
+
"inventoryItem": {
|
|
74
|
+
"type": "object", "additionalProperties": false,
|
|
75
|
+
"required": ["id", "status", "evidence_path", "evidence_sha256"],
|
|
76
|
+
"properties": {
|
|
77
|
+
"id": { "$ref": "#/$defs/nonempty" },
|
|
78
|
+
"status": { "const": "captured" },
|
|
79
|
+
"evidence_path": { "type": "string", "minLength": 1, "pattern": "^(?=.*\\S)(?!/)(?!.*\\.\\.).+$" },
|
|
80
|
+
"evidence_sha256": { "$ref": "#/$defs/sha256" }
|
|
81
|
+
}
|
|
82
|
+
},
|
|
83
|
+
"results": {
|
|
84
|
+
"type": "array", "minItems": 1, "uniqueItems": true,
|
|
85
|
+
"items": { "$ref": "#/$defs/result" }
|
|
86
|
+
},
|
|
87
|
+
"accessibilityResults": {
|
|
88
|
+
"type": "array", "minItems": 1, "uniqueItems": true,
|
|
89
|
+
"items": { "$ref": "#/$defs/accessibilityResult" }
|
|
90
|
+
},
|
|
91
|
+
"result": {
|
|
92
|
+
"type": "object", "additionalProperties": false,
|
|
93
|
+
"required": ["check_id", "status", "evidence_pointer"],
|
|
94
|
+
"properties": {
|
|
95
|
+
"check_id": { "$ref": "#/$defs/nonempty" },
|
|
96
|
+
"status": { "enum": ["PASS", "FAIL", "NOT_APPLICABLE"] },
|
|
97
|
+
"evidence_pointer": { "$ref": "#/$defs/nonempty" }
|
|
98
|
+
}
|
|
99
|
+
},
|
|
100
|
+
"accessibilityResult": {
|
|
101
|
+
"type": "object", "additionalProperties": false,
|
|
102
|
+
"required": ["criterion", "status", "evidence_pointer"],
|
|
103
|
+
"properties": {
|
|
104
|
+
"criterion": { "$ref": "#/$defs/nonempty" },
|
|
105
|
+
"status": { "enum": ["PASS", "FAIL", "NOT_APPLICABLE"] },
|
|
106
|
+
"evidence_pointer": { "$ref": "#/$defs/nonempty" }
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "litfamily.review-receipt/v1alpha1",
|
|
4
|
+
"title": "LitFamily Review Receipt v1alpha1",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"required": [
|
|
7
|
+
"schema_id", "review_id", "fresh_context_id", "reviewer_capability_class",
|
|
8
|
+
"input_hashes", "reviewed_inventory", "findings", "confidence",
|
|
9
|
+
"independence_assertion", "started_at", "ended_at", "timed_out", "cancelled", "verdict"
|
|
10
|
+
],
|
|
11
|
+
"properties": {
|
|
12
|
+
"schema_id": {"const": "litfamily.review-receipt/v1alpha1"},
|
|
13
|
+
"review_id": {"$ref": "#/$defs/nonempty"},
|
|
14
|
+
"fresh_context_id": {"$ref": "#/$defs/nonempty"},
|
|
15
|
+
"reviewer_capability_class": {"$ref": "#/$defs/nonempty"},
|
|
16
|
+
"input_hashes": {
|
|
17
|
+
"type": "array", "minItems": 2, "uniqueItems": true,
|
|
18
|
+
"items": {"$ref": "#/$defs/sha256"}
|
|
19
|
+
},
|
|
20
|
+
"reviewed_inventory": {
|
|
21
|
+
"type": "array", "minItems": 1, "uniqueItems": true,
|
|
22
|
+
"items": {"$ref": "#/$defs/nonempty"}
|
|
23
|
+
},
|
|
24
|
+
"findings": {"type": "array", "items": {"$ref": "#/$defs/finding"}},
|
|
25
|
+
"confidence": {"enum": ["HIGH", "MEDIUM", "LOW"]},
|
|
26
|
+
"independence_assertion": {"const": true},
|
|
27
|
+
"started_at": {"type": "string", "format": "date-time", "pattern": "\\S"},
|
|
28
|
+
"ended_at": {"type": "string", "format": "date-time", "pattern": "\\S"},
|
|
29
|
+
"timed_out": {"const": false},
|
|
30
|
+
"cancelled": {"const": false},
|
|
31
|
+
"verdict": {"enum": ["PASS", "REVISE", "FAIL"]}
|
|
32
|
+
},
|
|
33
|
+
"$defs": {
|
|
34
|
+
"nonempty": {"type": "string", "minLength": 1, "pattern": "\\S"},
|
|
35
|
+
"sha256": {"type": "string", "pattern": "^[0-9a-f]{64}$"},
|
|
36
|
+
"finding": {
|
|
37
|
+
"type": "object",
|
|
38
|
+
"required": ["finding_id", "severity", "status", "evidence_pointer"],
|
|
39
|
+
"properties": {
|
|
40
|
+
"finding_id": {"$ref": "#/$defs/nonempty"},
|
|
41
|
+
"severity": {"enum": ["critical", "high", "medium", "low"]},
|
|
42
|
+
"status": {"enum": ["open", "resolved", "accepted_exception"]},
|
|
43
|
+
"evidence_pointer": {"$ref": "#/$defs/nonempty"}
|
|
44
|
+
},
|
|
45
|
+
"additionalProperties": false
|
|
46
|
+
}
|
|
47
|
+
},
|
|
48
|
+
"additionalProperties": false
|
|
49
|
+
}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import re
|
|
4
|
+
from typing import Dict, Iterable, Set
|
|
5
|
+
|
|
6
|
+
from uiux_runtime_common import ContractError, JsonValue
|
|
7
|
+
|
|
8
|
+
SHA256 = re.compile(r"^[0-9a-f]{64}$")
|
|
9
|
+
REVISION = re.compile(r"^[0-9a-f]{40}$")
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def exact(mapping: Dict[str, JsonValue], keys: Set[str], code: str, label: str) -> None:
|
|
13
|
+
if set(mapping) != keys:
|
|
14
|
+
missing = sorted(keys - set(mapping))
|
|
15
|
+
unknown = sorted(set(mapping) - keys)
|
|
16
|
+
raise ContractError(code, f"{label} missing={missing} unknown={unknown}")
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def text(value: JsonValue, code: str, label: str) -> str:
|
|
20
|
+
if not isinstance(value, str) or not value.strip():
|
|
21
|
+
raise ContractError(code, f"{label} must be a non-empty string")
|
|
22
|
+
return value
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def hash256(value: JsonValue, code: str, label: str) -> str:
|
|
26
|
+
result = text(value, code, label)
|
|
27
|
+
if SHA256.fullmatch(result) is None:
|
|
28
|
+
raise ContractError(code, f"{label} must be a lowercase sha256")
|
|
29
|
+
return result
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def revision(value: JsonValue, code: str, label: str) -> str:
|
|
33
|
+
result = text(value, code, label)
|
|
34
|
+
if REVISION.fullmatch(result) is None:
|
|
35
|
+
raise ContractError(code, f"{label} must be a 40-character revision")
|
|
36
|
+
return result
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def integer(value: JsonValue, code: str, label: str, *, minimum: int, maximum: int) -> int:
|
|
40
|
+
if isinstance(value, bool) or not isinstance(value, int) or not minimum <= value <= maximum:
|
|
41
|
+
raise ContractError(code, f"{label} must be an integer in {minimum}..{maximum}")
|
|
42
|
+
return value
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
def number(value: JsonValue, code: str, label: str, *, exclusive_minimum: float, maximum: float) -> float:
|
|
46
|
+
if isinstance(value, bool) or not isinstance(value, (int, float)):
|
|
47
|
+
raise ContractError(code, f"{label} must be a number")
|
|
48
|
+
result = float(value)
|
|
49
|
+
if not exclusive_minimum < result <= maximum:
|
|
50
|
+
raise ContractError(code, f"{label} must be in ({exclusive_minimum}, {maximum}]")
|
|
51
|
+
return result
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
def string_list(
|
|
55
|
+
value: JsonValue,
|
|
56
|
+
code: str,
|
|
57
|
+
label: str,
|
|
58
|
+
*,
|
|
59
|
+
minimum: int = 1,
|
|
60
|
+
unique: bool = True,
|
|
61
|
+
) -> list[str]:
|
|
62
|
+
if not isinstance(value, list) or len(value) < minimum:
|
|
63
|
+
raise ContractError(code, f"{label} must contain at least {minimum} entries")
|
|
64
|
+
items = [text(item, code, label) for item in value]
|
|
65
|
+
if unique and len(set(items)) != len(items):
|
|
66
|
+
raise ContractError(code, f"{label} must be unique")
|
|
67
|
+
return items
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
def all_true(mapping: Dict[str, JsonValue], keys: Iterable[str]) -> bool:
|
|
71
|
+
return all(mapping.get(key) is True for key in keys)
|
|
@@ -0,0 +1,288 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from dataclasses import dataclass
|
|
4
|
+
from datetime import datetime, timedelta, timezone
|
|
5
|
+
from hashlib import sha256
|
|
6
|
+
from pathlib import Path
|
|
7
|
+
from typing import Final, Mapping
|
|
8
|
+
|
|
9
|
+
from contract_checks import all_true, exact, hash256, integer, number, revision, string_list, text
|
|
10
|
+
from uiux_runtime_common import ContractError, JsonValue, parse_utc, require_mapping
|
|
11
|
+
from png_runtime import inspect_png_bytes, open_bounded_bytes
|
|
12
|
+
|
|
13
|
+
EVIDENCE_SCHEMA: Final = "litfamily.evidence-manifest/v1alpha1"
|
|
14
|
+
EVIDENCE_SCHEMA_BETA: Final = "litfamily.evidence-manifest/v1beta1"
|
|
15
|
+
TOP_KEYS: Final = {
|
|
16
|
+
"schema_id", "design_contract_sha256", "source_revision", "captures", "inventory",
|
|
17
|
+
"mechanical_results", "accessibility_results", "tui_results", "reviewer_receipt_hashes",
|
|
18
|
+
"open_findings", "exception_references", "cleanup", "final_verdict",
|
|
19
|
+
}
|
|
20
|
+
BETA_TOP_KEYS: Final = TOP_KEYS | {"tier"}
|
|
21
|
+
CAPTURE_KEYS: Final = {
|
|
22
|
+
"capture_id", "source_sha256", "capture_sha256", "created_at", "maximum_age_seconds",
|
|
23
|
+
"viewport", "dpr", "os", "runtime", "runtime_version", "font_set", "locale",
|
|
24
|
+
"reduced_motion", "animation_settling_policy", "color_scheme", "auth_owner", "process_owner",
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
@dataclass(frozen=True)
|
|
29
|
+
class HostCaptureProvenance:
|
|
30
|
+
"""Trusted in-process receipt; never parsed from manifest or CLI input."""
|
|
31
|
+
|
|
32
|
+
capture_id: str
|
|
33
|
+
capture_sha256: str
|
|
34
|
+
source_sha256: str
|
|
35
|
+
source_revision: str
|
|
36
|
+
artifact_identity: tuple[int, int]
|
|
37
|
+
captured_at: datetime
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
def _capture(
|
|
41
|
+
candidate: JsonValue, now: str, *, material_freshness: bool = False
|
|
42
|
+
) -> tuple[str, str, str, tuple[int, int], datetime, int]:
|
|
43
|
+
if not isinstance(candidate, dict):
|
|
44
|
+
raise ContractError("EVIDENCE_INVALID", "capture must be an object")
|
|
45
|
+
exact(candidate, CAPTURE_KEYS, "EVIDENCE_INVALID", "capture")
|
|
46
|
+
for key in (
|
|
47
|
+
"capture_id", "os", "runtime", "runtime_version", "locale", "animation_settling_policy",
|
|
48
|
+
"color_scheme", "auth_owner", "process_owner",
|
|
49
|
+
):
|
|
50
|
+
text(candidate.get(key), "EVIDENCE_INVALID", f"capture {key}")
|
|
51
|
+
source_digest = hash256(
|
|
52
|
+
candidate.get("source_sha256"), "EVIDENCE_INVALID", "capture source_sha256"
|
|
53
|
+
)
|
|
54
|
+
digest = hash256(candidate.get("capture_sha256"), "EVIDENCE_INVALID", "capture capture_sha256")
|
|
55
|
+
string_list(candidate.get("font_set"), "EVIDENCE_INVALID", "capture font_set")
|
|
56
|
+
viewport = candidate.get("viewport")
|
|
57
|
+
if not isinstance(viewport, dict):
|
|
58
|
+
raise ContractError("EVIDENCE_INVALID", "capture viewport must be an object")
|
|
59
|
+
exact(viewport, {"width", "height"}, "EVIDENCE_INVALID", "capture viewport")
|
|
60
|
+
for key in ("width", "height"):
|
|
61
|
+
integer(viewport.get(key), "EVIDENCE_INVALID", f"capture viewport {key}", minimum=1, maximum=16384)
|
|
62
|
+
maximum_age = integer(
|
|
63
|
+
candidate.get("maximum_age_seconds"),
|
|
64
|
+
"EVIDENCE_INVALID",
|
|
65
|
+
"capture maximum_age_seconds",
|
|
66
|
+
minimum=1,
|
|
67
|
+
maximum=86400,
|
|
68
|
+
)
|
|
69
|
+
number(candidate.get("dpr"), "EVIDENCE_INVALID", "capture dpr", exclusive_minimum=0, maximum=8)
|
|
70
|
+
if not isinstance(candidate.get("reduced_motion"), bool):
|
|
71
|
+
raise ContractError("EVIDENCE_INVALID", "capture reduced_motion invalid")
|
|
72
|
+
if candidate.get("color_scheme") not in {"light", "dark", "system"}:
|
|
73
|
+
raise ContractError("EVIDENCE_INVALID", "capture color_scheme invalid")
|
|
74
|
+
current = parse_utc(now)
|
|
75
|
+
created = parse_utc(text(candidate.get("created_at"), "EVIDENCE_INVALID", "capture created_at"))
|
|
76
|
+
if not material_freshness:
|
|
77
|
+
if created > current:
|
|
78
|
+
raise ContractError("BLOCKED_EVIDENCE_FUTURE", str(candidate["capture_id"]))
|
|
79
|
+
if current > created + timedelta(seconds=maximum_age):
|
|
80
|
+
raise ContractError("BLOCKED_EVIDENCE_STALE", str(candidate["capture_id"]))
|
|
81
|
+
return (
|
|
82
|
+
str(candidate["capture_id"]),
|
|
83
|
+
digest,
|
|
84
|
+
source_digest,
|
|
85
|
+
(int(viewport["width"]), int(viewport["height"])),
|
|
86
|
+
created,
|
|
87
|
+
maximum_age,
|
|
88
|
+
)
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
def _material_capture(
|
|
92
|
+
root: Path,
|
|
93
|
+
relative_path: str,
|
|
94
|
+
expected_hash: str,
|
|
95
|
+
dimensions: tuple[int, int],
|
|
96
|
+
*,
|
|
97
|
+
capture_id: str,
|
|
98
|
+
source_sha256: str,
|
|
99
|
+
source_revision: str,
|
|
100
|
+
created_at: datetime,
|
|
101
|
+
maximum_age_seconds: int,
|
|
102
|
+
now: str,
|
|
103
|
+
provenance: HostCaptureProvenance | None,
|
|
104
|
+
) -> None:
|
|
105
|
+
candidate = Path(relative_path)
|
|
106
|
+
if candidate.is_absolute() or not candidate.parts or any(
|
|
107
|
+
part in {"", ".", ".."} for part in candidate.parts
|
|
108
|
+
):
|
|
109
|
+
raise ContractError("EVIDENCE_ARTIFACT_PATH_INVALID", relative_path)
|
|
110
|
+
with open_bounded_bytes(
|
|
111
|
+
root,
|
|
112
|
+
candidate,
|
|
113
|
+
root_invalid_code="EVIDENCE_ARTIFACT_ROOT_INVALID",
|
|
114
|
+
unsafe_code="EVIDENCE_ARTIFACT_PATH_INVALID",
|
|
115
|
+
unreadable_code="EVIDENCE_ARTIFACT_UNAVAILABLE",
|
|
116
|
+
resource_code="EVIDENCE_ARTIFACT_RESOURCE_BOUND",
|
|
117
|
+
changed_code="EVIDENCE_ARTIFACT_PATH_CHANGED",
|
|
118
|
+
) as opened:
|
|
119
|
+
raw = opened.raw
|
|
120
|
+
if sha256(raw).hexdigest() != expected_hash:
|
|
121
|
+
raise ContractError("EVIDENCE_ARTIFACT_HASH_INVALID", relative_path)
|
|
122
|
+
report = inspect_png_bytes(raw)
|
|
123
|
+
opened.verify()
|
|
124
|
+
if (report.get("width"), report.get("height")) != dimensions:
|
|
125
|
+
raise ContractError("EVIDENCE_CAPTURE_DIMENSIONS_INVALID", relative_path)
|
|
126
|
+
if provenance is None:
|
|
127
|
+
raise ContractError(
|
|
128
|
+
"BLOCKED_CAPTURE_PROVENANCE_UNAVAILABLE",
|
|
129
|
+
capture_id,
|
|
130
|
+
)
|
|
131
|
+
if not isinstance(provenance, HostCaptureProvenance):
|
|
132
|
+
raise ContractError("BLOCKED_CAPTURE_PROVENANCE_UNVERIFIED", capture_id)
|
|
133
|
+
captured_at = provenance.captured_at
|
|
134
|
+
if captured_at.tzinfo is None:
|
|
135
|
+
raise ContractError("BLOCKED_CAPTURE_PROVENANCE_UNVERIFIED", capture_id)
|
|
136
|
+
captured_at = captured_at.astimezone(timezone.utc)
|
|
137
|
+
if (
|
|
138
|
+
provenance.capture_id != capture_id
|
|
139
|
+
or provenance.capture_sha256 != expected_hash
|
|
140
|
+
or provenance.source_sha256 != source_sha256
|
|
141
|
+
or provenance.source_revision != source_revision
|
|
142
|
+
or provenance.artifact_identity != opened.source_identity
|
|
143
|
+
or captured_at != created_at
|
|
144
|
+
):
|
|
145
|
+
raise ContractError("BLOCKED_CAPTURE_PROVENANCE_UNVERIFIED", capture_id)
|
|
146
|
+
current = parse_utc(now)
|
|
147
|
+
if captured_at > current:
|
|
148
|
+
raise ContractError("BLOCKED_EVIDENCE_FUTURE", capture_id)
|
|
149
|
+
if current > captured_at + timedelta(seconds=maximum_age_seconds):
|
|
150
|
+
raise ContractError("BLOCKED_EVIDENCE_STALE", capture_id)
|
|
151
|
+
|
|
152
|
+
|
|
153
|
+
def _result(candidate: JsonValue, *, accessibility: bool = False) -> None:
|
|
154
|
+
if not isinstance(candidate, dict):
|
|
155
|
+
raise ContractError("EVIDENCE_INVALID", "result must be an object")
|
|
156
|
+
id_key = "criterion" if accessibility else "check_id"
|
|
157
|
+
exact(candidate, {id_key, "status", "evidence_pointer"}, "EVIDENCE_INVALID", "result")
|
|
158
|
+
text(candidate.get(id_key), "EVIDENCE_INVALID", f"result {id_key}")
|
|
159
|
+
text(candidate.get("evidence_pointer"), "EVIDENCE_INVALID", "result evidence_pointer")
|
|
160
|
+
if candidate.get("status") not in {"PASS", "FAIL", "NOT_APPLICABLE"}:
|
|
161
|
+
raise ContractError("EVIDENCE_INVALID", "result status invalid")
|
|
162
|
+
|
|
163
|
+
|
|
164
|
+
def validate_evidence(
|
|
165
|
+
value: JsonValue,
|
|
166
|
+
*,
|
|
167
|
+
now: str,
|
|
168
|
+
evidence_root: Path | None = None,
|
|
169
|
+
host_capture_provenance: Mapping[str, HostCaptureProvenance] | None = None,
|
|
170
|
+
) -> dict[str, JsonValue]:
|
|
171
|
+
manifest = require_mapping(value, code="EVIDENCE_INVALID")
|
|
172
|
+
beta = manifest.get("schema_id") == EVIDENCE_SCHEMA_BETA
|
|
173
|
+
exact(manifest, BETA_TOP_KEYS if beta else TOP_KEYS, "EVIDENCE_INVALID", "manifest")
|
|
174
|
+
if manifest.get("schema_id") not in {EVIDENCE_SCHEMA, EVIDENCE_SCHEMA_BETA} or manifest.get("final_verdict") != "PASS":
|
|
175
|
+
raise ContractError("EVIDENCE_INVALID", "exact PASS evidence manifest required")
|
|
176
|
+
if beta and manifest.get("tier") not in {"smoke", "full", "reference-fidelity"}:
|
|
177
|
+
raise ContractError("EVIDENCE_INVALID", "beta tier invalid")
|
|
178
|
+
if beta and evidence_root is None:
|
|
179
|
+
raise ContractError("EVIDENCE_ARTIFACT_ROOT_INVALID", "--evidence-root is required for beta")
|
|
180
|
+
hash256(manifest.get("design_contract_sha256"), "EVIDENCE_INVALID", "design contract hash")
|
|
181
|
+
revision(manifest.get("source_revision"), "EVIDENCE_INVALID", "source revision")
|
|
182
|
+
captures = manifest.get("captures")
|
|
183
|
+
if not isinstance(captures, list) or not captures:
|
|
184
|
+
raise ContractError("EVIDENCE_INVALID", "captures must be non-empty")
|
|
185
|
+
capture_hashes: list[str] = []
|
|
186
|
+
capture_ids: list[str] = []
|
|
187
|
+
capture_dimensions: dict[str, tuple[int, int]] = {}
|
|
188
|
+
capture_freshness: dict[str, tuple[str, str, datetime, int]] = {}
|
|
189
|
+
for item in captures:
|
|
190
|
+
capture_id, capture_hash, source_hash, dimensions, created_at, maximum_age = _capture(
|
|
191
|
+
item,
|
|
192
|
+
now,
|
|
193
|
+
material_freshness=beta,
|
|
194
|
+
)
|
|
195
|
+
capture_hashes.append(capture_hash)
|
|
196
|
+
capture_ids.append(capture_id)
|
|
197
|
+
capture_dimensions[capture_hash] = dimensions
|
|
198
|
+
capture_freshness[capture_hash] = (capture_id, source_hash, created_at, maximum_age)
|
|
199
|
+
if len(set(capture_hashes)) != len(capture_hashes) or len(set(capture_ids)) != len(capture_ids):
|
|
200
|
+
raise ContractError("EVIDENCE_INVALID", "capture ids and hashes must be unique")
|
|
201
|
+
inventory = manifest.get("inventory")
|
|
202
|
+
if not isinstance(inventory, list) or not inventory:
|
|
203
|
+
raise ContractError("EVIDENCE_INVALID", "inventory must be non-empty")
|
|
204
|
+
inventory_ids: list[str] = []
|
|
205
|
+
for item in inventory:
|
|
206
|
+
if not isinstance(item, dict):
|
|
207
|
+
raise ContractError("EVIDENCE_INVALID", "inventory item must be an object")
|
|
208
|
+
exact(item, {"id", "status", "evidence_path", "evidence_sha256"}, "EVIDENCE_INVALID", "inventory")
|
|
209
|
+
inventory_ids.append(text(item.get("id"), "EVIDENCE_INVALID", "inventory id"))
|
|
210
|
+
text(item.get("evidence_path"), "EVIDENCE_INVALID", "inventory evidence_path")
|
|
211
|
+
digest = hash256(item.get("evidence_sha256"), "EVIDENCE_INVALID", "inventory evidence_sha256")
|
|
212
|
+
if item.get("status") != "captured" or digest not in capture_hashes:
|
|
213
|
+
raise ContractError("EVIDENCE_INVALID", "inventory is blocked, unresolved, or hash-mismatched")
|
|
214
|
+
if beta:
|
|
215
|
+
capture_id, source_hash, created_at, maximum_age = capture_freshness[digest]
|
|
216
|
+
_material_capture(
|
|
217
|
+
evidence_root,
|
|
218
|
+
str(item["evidence_path"]),
|
|
219
|
+
digest,
|
|
220
|
+
capture_dimensions[digest],
|
|
221
|
+
capture_id=capture_id,
|
|
222
|
+
source_sha256=source_hash,
|
|
223
|
+
source_revision=str(manifest["source_revision"]),
|
|
224
|
+
created_at=created_at,
|
|
225
|
+
maximum_age_seconds=maximum_age,
|
|
226
|
+
now=now,
|
|
227
|
+
provenance=(host_capture_provenance or {}).get(capture_id),
|
|
228
|
+
)
|
|
229
|
+
if len(set(inventory_ids)) != len(inventory_ids):
|
|
230
|
+
raise ContractError("EVIDENCE_INVALID", "inventory ids must be unique")
|
|
231
|
+
for key, accessibility in (
|
|
232
|
+
("mechanical_results", False), ("accessibility_results", True), ("tui_results", False),
|
|
233
|
+
):
|
|
234
|
+
results = manifest.get(key)
|
|
235
|
+
if not isinstance(results, list) or not results:
|
|
236
|
+
raise ContractError("EVIDENCE_INVALID", f"{key} must be non-empty")
|
|
237
|
+
result_ids: list[str] = []
|
|
238
|
+
id_key = "criterion" if accessibility else "check_id"
|
|
239
|
+
for result in results:
|
|
240
|
+
_result(result, accessibility=accessibility)
|
|
241
|
+
result_ids.append(str(result.get(id_key)))
|
|
242
|
+
if len(set(result_ids)) != len(result_ids):
|
|
243
|
+
raise ContractError("EVIDENCE_INVALID", f"{key} ids must be unique")
|
|
244
|
+
if any(result.get("status") == "FAIL" for result in results):
|
|
245
|
+
raise ContractError("EVIDENCE_INVALID", f"{key} contains a failure")
|
|
246
|
+
hashes = manifest.get("reviewer_receipt_hashes")
|
|
247
|
+
expected_review_count = 0 if beta and manifest.get("tier") == "smoke" else 2
|
|
248
|
+
if not isinstance(hashes, list) or len(hashes) != expected_review_count:
|
|
249
|
+
raise ContractError("EVIDENCE_INVALID", f"exactly {expected_review_count} review receipt hashes required")
|
|
250
|
+
receipt_hashes = [hash256(item, "EVIDENCE_INVALID", "review receipt hash") for item in hashes]
|
|
251
|
+
if len(set(receipt_hashes)) != expected_review_count:
|
|
252
|
+
raise ContractError("EVIDENCE_INVALID", "review receipt hashes must be distinct")
|
|
253
|
+
if beta and manifest.get("tier") != "smoke":
|
|
254
|
+
# Hermes delegate_task receipts are model-supplied JSON. Until Hermes exposes a
|
|
255
|
+
# host-owned provenance adapter, those self-attestations cannot unlock a higher tier.
|
|
256
|
+
raise ContractError(
|
|
257
|
+
"BLOCKED_INDEPENDENT_REVIEW_UNAVAILABLE",
|
|
258
|
+
"host-owned reviewer provenance is unavailable",
|
|
259
|
+
)
|
|
260
|
+
if manifest.get("open_findings") != []:
|
|
261
|
+
raise ContractError("EVIDENCE_INVALID", "PASS manifest cannot contain open findings")
|
|
262
|
+
string_list(
|
|
263
|
+
manifest.get("exception_references"),
|
|
264
|
+
"EVIDENCE_INVALID",
|
|
265
|
+
"exception_references",
|
|
266
|
+
minimum=0,
|
|
267
|
+
)
|
|
268
|
+
cleanup = manifest.get("cleanup")
|
|
269
|
+
if not isinstance(cleanup, dict):
|
|
270
|
+
raise ContractError("EVIDENCE_INVALID", "cleanup receipt required")
|
|
271
|
+
exact(
|
|
272
|
+
cleanup,
|
|
273
|
+
{"state", "process_terminated", "auth_session_closed", "transient_paths_removed"},
|
|
274
|
+
"EVIDENCE_INVALID",
|
|
275
|
+
"cleanup",
|
|
276
|
+
)
|
|
277
|
+
if cleanup.get("state") != "complete" or not all_true(
|
|
278
|
+
cleanup, ("process_terminated", "auth_session_closed", "transient_paths_removed")
|
|
279
|
+
):
|
|
280
|
+
raise ContractError("BLOCKED_CLEANUP_INCOMPLETE", "cleanup receipt incomplete")
|
|
281
|
+
if not beta:
|
|
282
|
+
return {
|
|
283
|
+
**manifest,
|
|
284
|
+
"diagnostics": ["LEGACY_SCHEMA_V1ALPHA1"],
|
|
285
|
+
"evidence_eligible": False,
|
|
286
|
+
"final_verdict": "DIAGNOSTIC_ONLY",
|
|
287
|
+
}
|
|
288
|
+
return {**manifest, "evidence_eligible": True}
|