@litfamily/litgrok 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/.grok/agents/litgrok-executor.md +33 -0
- package/.grok/agents/litgrok-korean-prose-editor.md +32 -0
- package/.grok/agents/litgrok-korean-style-analyzer.md +30 -0
- package/.grok/agents/litgrok-librarian-researcher.md +31 -0
- package/.grok/agents/litgrok-meaning-preservation-auditor.md +30 -0
- package/.grok/agents/litgrok-native-flow-reviewer.md +30 -0
- package/.grok/agents/litgrok-planner.md +31 -0
- package/.grok/agents/litgrok-polish-orchestrator.md +30 -0
- package/.grok/agents/litgrok-qa-runner.md +33 -0
- package/.grok/agents/litgrok-quality-reviewer.md +33 -0
- package/.grok/agents/litgrok-verifier.md +32 -0
- package/.grok/hooks/deliverable-hedge-guard.json +16 -0
- package/.grok/hooks/deliverable-hedge-guard.mjs +148 -0
- package/.grok/hooks/lit-mark.mjs +142 -0
- package/.grok/hooks/plan-gate.mjs +81 -0
- package/.grok/hooks/post-compact.json +15 -0
- package/.grok/hooks/post-compact.mjs +6 -0
- package/.grok/hooks/post-tool-use-failure.json +15 -0
- package/.grok/hooks/post-tool-use-failure.mjs +6 -0
- package/.grok/hooks/post-tool-use.json +16 -0
- package/.grok/hooks/post-tool-use.mjs +7 -0
- package/.grok/hooks/pre-compact.json +15 -0
- package/.grok/hooks/pre-compact.mjs +6 -0
- package/.grok/hooks/record-passive-event.mjs +198 -0
- package/.grok/hooks/session-start.json +15 -0
- package/.grok/hooks/session-start.mjs +37 -0
- package/.grok/hooks/stop-failure.json +15 -0
- package/.grok/hooks/stop-failure.mjs +6 -0
- package/.grok/hooks/stop.json +15 -0
- package/.grok/hooks/stop.mjs +36 -0
- package/.grok/hooks/subagent-start.json +15 -0
- package/.grok/hooks/subagent-start.mjs +6 -0
- package/.grok/hooks/subagent-stop.json +15 -0
- package/.grok/hooks/subagent-stop.mjs +6 -0
- package/.grok/hooks/user-prompt-submit.json +15 -0
- package/.grok/hooks/user-prompt-submit.mjs +7 -0
- package/.grok/rules/00-litgrok.md +152 -0
- package/.grok/skills/autoconference/LICENSE +21 -0
- package/.grok/skills/autoconference/PROVENANCE.md +23 -0
- package/.grok/skills/autoconference/SKILL.md +140 -0
- package/.grok/skills/autoconference/assets/conference_template.md +76 -0
- package/.grok/skills/autoconference/assets/report_template.md +56 -0
- package/.grok/skills/autoconference/assets/synthesis_template.md +40 -0
- package/.grok/skills/autoconference/references/_canonical-corpus/manifest.json +138 -0
- package/.grok/skills/autoconference/references/agent-prompts.md +30 -0
- package/.grok/skills/autoconference/references/conference-protocol.md +21 -0
- package/.grok/skills/autoconference/references/core-principles.md +13 -0
- package/.grok/skills/autoconference/references/family-contract.md +26 -0
- package/.grok/skills/autoconference/references/modes/analyze.md +11 -0
- package/.grok/skills/autoconference/references/modes/core/convergence-guide.md +41 -0
- package/.grok/skills/autoconference/references/modes/core/crash-recovery.md +11 -0
- package/.grok/skills/autoconference/references/modes/core.md +26 -0
- package/.grok/skills/autoconference/references/modes/debate.md +11 -0
- package/.grok/skills/autoconference/references/modes/plan.md +12 -0
- package/.grok/skills/autoconference/references/modes/resume.md +11 -0
- package/.grok/skills/autoconference/references/modes/ship.md +11 -0
- package/.grok/skills/autoconference/references/modes/survey.md +11 -0
- package/.grok/skills/autoconference/references/results-logging.md +12 -0
- package/.grok/skills/autoconference/references/visualization-guide.md +10 -0
- package/.grok/skills/autoconference/scripts/init_conference.py +646 -0
- package/.grok/skills/autoconference/scripts/verify-canonical-corpus.mjs +177 -0
- package/.grok/skills/autoconference/templates/code-performance.md +59 -0
- package/.grok/skills/autoconference/templates/debate-mode.md +50 -0
- package/.grok/skills/autoconference/templates/prompt-optimization.md +58 -0
- package/.grok/skills/autoconference/templates/quick-conference.md +48 -0
- package/.grok/skills/autoconference/templates/research-synthesis.md +56 -0
- package/.grok/skills/autoconference/templates/survey-mode.md +63 -0
- package/.grok/skills/autoresearch/LICENSE +21 -0
- package/.grok/skills/autoresearch/PROVENANCE.md +22 -0
- package/.grok/skills/autoresearch/SKILL.md +149 -0
- package/.grok/skills/autoresearch/assets/report_template.md +52 -0
- package/.grok/skills/autoresearch/assets/research_template.md +38 -0
- package/.grok/skills/autoresearch/assets/results_template.tsv +2 -0
- package/.grok/skills/autoresearch/references/_canonical-corpus/manifest.json +148 -0
- package/.grok/skills/autoresearch/references/core-principles.md +16 -0
- package/.grok/skills/autoresearch/references/family-contract.md +36 -0
- package/.grok/skills/autoresearch/references/modes/core/evaluator-contract.md +12 -0
- package/.grok/skills/autoresearch/references/modes/core/stuck-detection.md +11 -0
- package/.grok/skills/autoresearch/references/modes/core.md +21 -0
- package/.grok/skills/autoresearch/references/modes/debug/investigation-techniques.md +11 -0
- package/.grok/skills/autoresearch/references/modes/debug.md +11 -0
- package/.grok/skills/autoresearch/references/modes/fix.md +11 -0
- package/.grok/skills/autoresearch/references/modes/learn.md +11 -0
- package/.grok/skills/autoresearch/references/modes/plan.md +14 -0
- package/.grok/skills/autoresearch/references/modes/predict/persona-templates.md +11 -0
- package/.grok/skills/autoresearch/references/modes/predict.md +11 -0
- package/.grok/skills/autoresearch/references/modes/reason.md +11 -0
- package/.grok/skills/autoresearch/references/modes/scenario/dimensions.md +11 -0
- package/.grok/skills/autoresearch/references/modes/scenario.md +11 -0
- package/.grok/skills/autoresearch/references/modes/security/owasp-checklist.md +11 -0
- package/.grok/skills/autoresearch/references/modes/security/stride-model.md +11 -0
- package/.grok/skills/autoresearch/references/modes/security.md +12 -0
- package/.grok/skills/autoresearch/references/modes/ship/type-checklists.md +12 -0
- package/.grok/skills/autoresearch/references/modes/ship.md +11 -0
- package/.grok/skills/autoresearch/references/results-logging.md +12 -0
- package/.grok/skills/autoresearch/references/visualization-guide.md +24 -0
- package/.grok/skills/autoresearch/scripts/init_research.py +391 -0
- package/.grok/skills/autoresearch/scripts/style_presets.py +123 -0
- package/.grok/skills/autoresearch/scripts/verify-canonical-corpus.mjs +179 -0
- package/.grok/skills/browser-drive/SKILL.md +194 -0
- package/.grok/skills/browser-drive/references/snapshot-act-loop.md +61 -0
- package/.grok/skills/comment-checker/SKILL.md +194 -0
- package/.grok/skills/debugging/SKILL.md +82 -0
- package/.grok/skills/debugging/references/methodology/00-setup.md +108 -0
- package/.grok/skills/debugging/references/methodology/02-investigate.md +126 -0
- package/.grok/skills/debugging/references/methodology/04-oracle-triple.md +106 -0
- package/.grok/skills/debugging/references/methodology/05-escalate.md +69 -0
- package/.grok/skills/debugging/references/methodology/06-fix.md +116 -0
- package/.grok/skills/debugging/references/methodology/08-qa.md +94 -0
- package/.grok/skills/debugging/references/methodology/09-cleanup.md +164 -0
- package/.grok/skills/debugging/references/methodology/partial-runtime-evidence.md +228 -0
- package/.grok/skills/debugging/references/post-tool-use-failure-taxonomy.md +55 -0
- package/.grok/skills/debugging/references/reproduction-recipes.md +182 -0
- package/.grok/skills/debugging/references/runtimes/bundled-js-binary.md +415 -0
- package/.grok/skills/debugging/references/runtimes/go.md +252 -0
- package/.grok/skills/debugging/references/runtimes/native-binary.md +484 -0
- package/.grok/skills/debugging/references/runtimes/node.md +260 -0
- package/.grok/skills/debugging/references/runtimes/python.md +248 -0
- package/.grok/skills/debugging/references/runtimes/rust.md +234 -0
- package/.grok/skills/debugging/references/tools/ghidra.md +212 -0
- package/.grok/skills/debugging/references/tools/playwright-cli.md +194 -0
- package/.grok/skills/debugging/references/tools/pwndbg.md +263 -0
- package/.grok/skills/debugging/references/tools/pwntools.md +265 -0
- package/.grok/skills/deep-interview/SKILL.md +216 -0
- package/.grok/skills/frontend-ui-ux/LICENSE +21 -0
- package/.grok/skills/frontend-ui-ux/PROVENANCE.json +38 -0
- package/.grok/skills/frontend-ui-ux/SKILL.md +58 -0
- package/.grok/skills/frontend-ui-ux/SOURCE-MANIFEST.json +1060 -0
- package/.grok/skills/frontend-ui-ux/THIRD-PARTY-NOTICE.txt +14 -0
- package/.grok/skills/frontend-ui-ux/data/design-intelligence.json +1 -0
- package/.grok/skills/frontend-ui-ux/references/_canonical-corpus/legal/frontend-ATTRIBUTION.md +217 -0
- package/.grok/skills/frontend-ui-ux/references/_canonical-corpus/legal/frontend-LICENSE-Apache-2.0.txt +201 -0
- package/.grok/skills/frontend-ui-ux/references/_canonical-corpus/legal/root-LICENSE +21 -0
- package/.grok/skills/frontend-ui-ux/references/_canonical-corpus/manifest.json +873 -0
- package/.grok/skills/frontend-ui-ux/references/adaptive-layout.md +92 -0
- package/.grok/skills/frontend-ui-ux/references/brand-and-imagery.md +93 -0
- package/.grok/skills/frontend-ui-ux/references/complete-contract.md +557 -0
- package/.grok/skills/frontend-ui-ux/references/composition.md +85 -0
- package/.grok/skills/frontend-ui-ux/references/creative-directions.md +80 -0
- package/.grok/skills/frontend-ui-ux/references/design/README.md +248 -0
- package/.grok/skills/frontend-ui-ux/references/design/_INDEX.md +191 -0
- package/.grok/skills/frontend-ui-ux/references/design/airbnb.md +393 -0
- package/.grok/skills/frontend-ui-ux/references/design/airtable.md +92 -0
- package/.grok/skills/frontend-ui-ux/references/design/apple.md +250 -0
- package/.grok/skills/frontend-ui-ux/references/design/aside.md +209 -0
- package/.grok/skills/frontend-ui-ux/references/design/binance.md +348 -0
- package/.grok/skills/frontend-ui-ux/references/design/bmw.md +183 -0
- package/.grok/skills/frontend-ui-ux/references/design/brutalist-skill.md +92 -0
- package/.grok/skills/frontend-ui-ux/references/design/bugatti.md +271 -0
- package/.grok/skills/frontend-ui-ux/references/design/cal.md +262 -0
- package/.grok/skills/frontend-ui-ux/references/design/claude.md +315 -0
- package/.grok/skills/frontend-ui-ux/references/design/clay.md +307 -0
- package/.grok/skills/frontend-ui-ux/references/design/clickhouse.md +284 -0
- package/.grok/skills/frontend-ui-ux/references/design/clone-from-url.md +65 -0
- package/.grok/skills/frontend-ui-ux/references/design/cohere.md +269 -0
- package/.grok/skills/frontend-ui-ux/references/design/coinbase.md +132 -0
- package/.grok/skills/frontend-ui-ux/references/design/composio.md +310 -0
- package/.grok/skills/frontend-ui-ux/references/design/cursor.md +312 -0
- package/.grok/skills/frontend-ui-ux/references/design/design-system-architecture.md +244 -0
- package/.grok/skills/frontend-ui-ux/references/design/elevenlabs.md +268 -0
- package/.grok/skills/frontend-ui-ux/references/design/expo.md +284 -0
- package/.grok/skills/frontend-ui-ux/references/design/ferrari.md +317 -0
- package/.grok/skills/frontend-ui-ux/references/design/figma.md +223 -0
- package/.grok/skills/frontend-ui-ux/references/design/framer.md +249 -0
- package/.grok/skills/frontend-ui-ux/references/design/gpt-tasteskill.md +74 -0
- package/.grok/skills/frontend-ui-ux/references/design/hashicorp.md +281 -0
- package/.grok/skills/frontend-ui-ux/references/design/ibm.md +335 -0
- package/.grok/skills/frontend-ui-ux/references/design/image-to-code-skill.md +1228 -0
- package/.grok/skills/frontend-ui-ux/references/design/imagegen-brandkit.md +798 -0
- package/.grok/skills/frontend-ui-ux/references/design/imagegen-frontend-mobile.md +1465 -0
- package/.grok/skills/frontend-ui-ux/references/design/imagegen-frontend-web.md +987 -0
- package/.grok/skills/frontend-ui-ux/references/design/intercom.md +149 -0
- package/.grok/skills/frontend-ui-ux/references/design/kraken.md +128 -0
- package/.grok/skills/frontend-ui-ux/references/design/lamborghini.md +291 -0
- package/.grok/skills/frontend-ui-ux/references/design/layout-skill.md +107 -0
- package/.grok/skills/frontend-ui-ux/references/design/lazyweb.md +77 -0
- package/.grok/skills/frontend-ui-ux/references/design/linear.app.md +370 -0
- package/.grok/skills/frontend-ui-ux/references/design/lovable.md +301 -0
- package/.grok/skills/frontend-ui-ux/references/design/mastercard.md +368 -0
- package/.grok/skills/frontend-ui-ux/references/design/meta.md +369 -0
- package/.grok/skills/frontend-ui-ux/references/design/minimalist-skill.md +85 -0
- package/.grok/skills/frontend-ui-ux/references/design/minimax.md +260 -0
- package/.grok/skills/frontend-ui-ux/references/design/mintlify.md +329 -0
- package/.grok/skills/frontend-ui-ux/references/design/miro.md +111 -0
- package/.grok/skills/frontend-ui-ux/references/design/mistral.ai.md +264 -0
- package/.grok/skills/frontend-ui-ux/references/design/mongodb.md +269 -0
- package/.grok/skills/frontend-ui-ux/references/design/nike.md +366 -0
- package/.grok/skills/frontend-ui-ux/references/design/notion.md +312 -0
- package/.grok/skills/frontend-ui-ux/references/design/nvidia.md +296 -0
- package/.grok/skills/frontend-ui-ux/references/design/ollama.md +270 -0
- package/.grok/skills/frontend-ui-ux/references/design/opencode.ai.md +284 -0
- package/.grok/skills/frontend-ui-ux/references/design/output-skill.md +49 -0
- package/.grok/skills/frontend-ui-ux/references/design/pinterest.md +233 -0
- package/.grok/skills/frontend-ui-ux/references/design/playstation.md +367 -0
- package/.grok/skills/frontend-ui-ux/references/design/posthog.md +259 -0
- package/.grok/skills/frontend-ui-ux/references/design/raycast.md +271 -0
- package/.grok/skills/frontend-ui-ux/references/design/react-dev-tooling-skill.md +230 -0
- package/.grok/skills/frontend-ui-ux/references/design/redesign-skill.md +178 -0
- package/.grok/skills/frontend-ui-ux/references/design/renault.md +314 -0
- package/.grok/skills/frontend-ui-ux/references/design/replicate.md +264 -0
- package/.grok/skills/frontend-ui-ux/references/design/resend.md +306 -0
- package/.grok/skills/frontend-ui-ux/references/design/revolut.md +188 -0
- package/.grok/skills/frontend-ui-ux/references/design/runwayml.md +247 -0
- package/.grok/skills/frontend-ui-ux/references/design/sanity.md +360 -0
- package/.grok/skills/frontend-ui-ux/references/design/sentry.md +265 -0
- package/.grok/skills/frontend-ui-ux/references/design/shopify.md +353 -0
- package/.grok/skills/frontend-ui-ux/references/design/soft-skill.md +98 -0
- package/.grok/skills/frontend-ui-ux/references/design/spacex.md +197 -0
- package/.grok/skills/frontend-ui-ux/references/design/spotify.md +249 -0
- package/.grok/skills/frontend-ui-ux/references/design/starbucks.md +583 -0
- package/.grok/skills/frontend-ui-ux/references/design/stitch-design-example.md +121 -0
- package/.grok/skills/frontend-ui-ux/references/design/stitch-skill.md +184 -0
- package/.grok/skills/frontend-ui-ux/references/design/stripe.md +325 -0
- package/.grok/skills/frontend-ui-ux/references/design/supabase.md +258 -0
- package/.grok/skills/frontend-ui-ux/references/design/superhuman.md +255 -0
- package/.grok/skills/frontend-ui-ux/references/design/taste-skill.md +1206 -0
- package/.grok/skills/frontend-ui-ux/references/design/tesla.md +289 -0
- package/.grok/skills/frontend-ui-ux/references/design/theverge.md +342 -0
- package/.grok/skills/frontend-ui-ux/references/design/together.ai.md +266 -0
- package/.grok/skills/frontend-ui-ux/references/design/uber.md +298 -0
- package/.grok/skills/frontend-ui-ux/references/design/vercel.md +313 -0
- package/.grok/skills/frontend-ui-ux/references/design/vodafone.md +426 -0
- package/.grok/skills/frontend-ui-ux/references/design/voltagent.md +326 -0
- package/.grok/skills/frontend-ui-ux/references/design/warp.md +256 -0
- package/.grok/skills/frontend-ui-ux/references/design/webflow.md +95 -0
- package/.grok/skills/frontend-ui-ux/references/design/wired.md +281 -0
- package/.grok/skills/frontend-ui-ux/references/design/wise.md +176 -0
- package/.grok/skills/frontend-ui-ux/references/design/x.ai.md +260 -0
- package/.grok/skills/frontend-ui-ux/references/design/zapier.md +331 -0
- package/.grok/skills/frontend-ui-ux/references/designpowers/EVIDENCE.md +97 -0
- package/.grok/skills/frontend-ui-ux/references/designpowers/README.md +48 -0
- package/.grok/skills/frontend-ui-ux/references/designpowers/UPSTREAM.md +80 -0
- package/.grok/skills/frontend-ui-ux/references/designpowers/lane-a-direction.md +64 -0
- package/.grok/skills/frontend-ui-ux/references/designpowers/lane-b-execution.md +65 -0
- package/.grok/skills/frontend-ui-ux/references/designpowers/lane-c-review.md +65 -0
- package/.grok/skills/frontend-ui-ux/references/designpowers/lane-d-memory.md +83 -0
- package/.grok/skills/frontend-ui-ux/references/designpowers/orchestration.md +80 -0
- package/.grok/skills/frontend-ui-ux/references/designpowers/routing.md +79 -0
- package/.grok/skills/frontend-ui-ux/references/designpowers/vendor/LICENSE +21 -0
- package/.grok/skills/frontend-ui-ux/references/designpowers/vendor/agents/accessibility-reviewer.md +83 -0
- package/.grok/skills/frontend-ui-ux/references/designpowers/vendor/agents/content-writer.md +132 -0
- package/.grok/skills/frontend-ui-ux/references/designpowers/vendor/agents/design-builder.md +109 -0
- package/.grok/skills/frontend-ui-ux/references/designpowers/vendor/agents/design-critic.md +89 -0
- package/.grok/skills/frontend-ui-ux/references/designpowers/vendor/agents/design-lead.md +113 -0
- package/.grok/skills/frontend-ui-ux/references/designpowers/vendor/agents/design-scout.md +78 -0
- package/.grok/skills/frontend-ui-ux/references/designpowers/vendor/agents/design-strategist.md +121 -0
- package/.grok/skills/frontend-ui-ux/references/designpowers/vendor/agents/heuristic-evaluator.md +268 -0
- package/.grok/skills/frontend-ui-ux/references/designpowers/vendor/agents/inspiration-scout.md +107 -0
- package/.grok/skills/frontend-ui-ux/references/designpowers/vendor/agents/motion-designer.md +120 -0
- package/.grok/skills/frontend-ui-ux/references/designpowers/vendor/skills/accessible-content/reference.md +101 -0
- package/.grok/skills/frontend-ui-ux/references/designpowers/vendor/skills/adaptive-interfaces/reference.md +109 -0
- package/.grok/skills/frontend-ui-ux/references/designpowers/vendor/skills/cognitive-accessibility/reference.md +107 -0
- package/.grok/skills/frontend-ui-ux/references/designpowers/vendor/skills/design-debate/reference.md +199 -0
- package/.grok/skills/frontend-ui-ux/references/designpowers/vendor/skills/design-debt-tracker/reference.md +174 -0
- package/.grok/skills/frontend-ui-ux/references/designpowers/vendor/skills/design-handoff/reference.md +125 -0
- package/.grok/skills/frontend-ui-ux/references/designpowers/vendor/skills/design-md/reference.md +106 -0
- package/.grok/skills/frontend-ui-ux/references/designpowers/vendor/skills/design-retrospective/reference.md +266 -0
- package/.grok/skills/frontend-ui-ux/references/designpowers/vendor/skills/design-review/reference.md +123 -0
- package/.grok/skills/frontend-ui-ux/references/designpowers/vendor/skills/design-system-alignment/reference.md +120 -0
- package/.grok/skills/frontend-ui-ux/references/designpowers/vendor/skills/designpowers-critique/reference.md +164 -0
- package/.grok/skills/frontend-ui-ux/references/designpowers/vendor/skills/heuristic-evaluation/reference.md +85 -0
- package/.grok/skills/frontend-ui-ux/references/designpowers/vendor/skills/inclusive-personas/reference.md +98 -0
- package/.grok/skills/frontend-ui-ux/references/designpowers/vendor/skills/inspiration-scouting/reference.md +165 -0
- package/.grok/skills/frontend-ui-ux/references/designpowers/vendor/skills/interaction-design/reference.md +122 -0
- package/.grok/skills/frontend-ui-ux/references/designpowers/vendor/skills/motion-choreography/reference.md +81 -0
- package/.grok/skills/frontend-ui-ux/references/designpowers/vendor/skills/research-planning/reference.md +96 -0
- package/.grok/skills/frontend-ui-ux/references/designpowers/vendor/skills/responsive-patterns/reference.md +77 -0
- package/.grok/skills/frontend-ui-ux/references/designpowers/vendor/skills/synthetic-user-testing/reference.md +192 -0
- package/.grok/skills/frontend-ui-ux/references/designpowers/vendor/skills/taste-feedback/reference.md +165 -0
- package/.grok/skills/frontend-ui-ux/references/designpowers/vendor/skills/taste-report/reference.md +78 -0
- package/.grok/skills/frontend-ui-ux/references/designpowers/vendor/skills/token-architecture/reference.md +75 -0
- package/.grok/skills/frontend-ui-ux/references/designpowers/vendor/skills/ui-composition/reference.md +117 -0
- package/.grok/skills/frontend-ui-ux/references/designpowers/vendor/skills/usability-testing/reference.md +78 -0
- package/.grok/skills/frontend-ui-ux/references/designpowers/vendor/skills/verification-before-shipping/reference.md +125 -0
- package/.grok/skills/frontend-ui-ux/references/designpowers/vendor/skills/voice-and-tone/reference.md +79 -0
- package/.grok/skills/frontend-ui-ux/references/designpowers/vendor/skills/writing-design-plans/reference.md +119 -0
- package/.grok/skills/frontend-ui-ux/references/evidence-review.md +126 -0
- package/.grok/skills/frontend-ui-ux/references/implementation-platforms.md +109 -0
- package/.grok/skills/frontend-ui-ux/references/inclusive-interface.md +92 -0
- package/.grok/skills/frontend-ui-ux/references/interaction-motion.md +101 -0
- package/.grok/skills/frontend-ui-ux/references/operating-lanes.md +92 -0
- package/.grok/skills/frontend-ui-ux/references/perfection/README.md +160 -0
- package/.grok/skills/frontend-ui-ux/references/perfection/react-perf-tooling.md +127 -0
- package/.grok/skills/frontend-ui-ux/references/performance-delivery.md +93 -0
- package/.grok/skills/frontend-ui-ux/references/product-direction.md +84 -0
- package/.grok/skills/frontend-ui-ux/references/redesign-playbook.md +97 -0
- package/.grok/skills/frontend-ui-ux/references/system-foundations.md +84 -0
- package/.grok/skills/frontend-ui-ux/references/taste-direction.md +86 -0
- package/.grok/skills/frontend-ui-ux/references/ui-ux-db/README.md +659 -0
- package/.grok/skills/frontend-ui-ux/references/ui-ux-db/data/charts.csv +26 -0
- package/.grok/skills/frontend-ui-ux/references/ui-ux-db/data/colors.csv +162 -0
- package/.grok/skills/frontend-ui-ux/references/ui-ux-db/data/icons.csv +106 -0
- package/.grok/skills/frontend-ui-ux/references/ui-ux-db/data/landing.csv +35 -0
- package/.grok/skills/frontend-ui-ux/references/ui-ux-db/data/products.csv +162 -0
- package/.grok/skills/frontend-ui-ux/references/ui-ux-db/data/react-performance.csv +45 -0
- package/.grok/skills/frontend-ui-ux/references/ui-ux-db/data/stacks/astro.csv +54 -0
- package/.grok/skills/frontend-ui-ux/references/ui-ux-db/data/stacks/flutter.csv +53 -0
- package/.grok/skills/frontend-ui-ux/references/ui-ux-db/data/stacks/html-tailwind.csv +56 -0
- package/.grok/skills/frontend-ui-ux/references/ui-ux-db/data/stacks/jetpack-compose.csv +53 -0
- package/.grok/skills/frontend-ui-ux/references/ui-ux-db/data/stacks/nextjs.csv +53 -0
- package/.grok/skills/frontend-ui-ux/references/ui-ux-db/data/stacks/nuxt-ui.csv +51 -0
- package/.grok/skills/frontend-ui-ux/references/ui-ux-db/data/stacks/nuxtjs.csv +59 -0
- package/.grok/skills/frontend-ui-ux/references/ui-ux-db/data/stacks/react-native.csv +52 -0
- package/.grok/skills/frontend-ui-ux/references/ui-ux-db/data/stacks/react.csv +54 -0
- package/.grok/skills/frontend-ui-ux/references/ui-ux-db/data/stacks/shadcn.csv +61 -0
- package/.grok/skills/frontend-ui-ux/references/ui-ux-db/data/stacks/svelte.csv +54 -0
- package/.grok/skills/frontend-ui-ux/references/ui-ux-db/data/stacks/swiftui.csv +51 -0
- package/.grok/skills/frontend-ui-ux/references/ui-ux-db/data/stacks/vue.csv +50 -0
- package/.grok/skills/frontend-ui-ux/references/ui-ux-db/data/styles.csv +85 -0
- package/.grok/skills/frontend-ui-ux/references/ui-ux-db/data/typography.csv +74 -0
- package/.grok/skills/frontend-ui-ux/references/ui-ux-db/data/ui-reasoning.csv +162 -0
- package/.grok/skills/frontend-ui-ux/references/ui-ux-db/data/ux-guidelines.csv +100 -0
- package/.grok/skills/frontend-ui-ux/references/ui-ux-db/data/web-interface.csv +31 -0
- package/.grok/skills/frontend-ui-ux/references/ui-ux-db/scripts/core.py +262 -0
- package/.grok/skills/frontend-ui-ux/references/ui-ux-db/scripts/design_system.py +1148 -0
- package/.grok/skills/frontend-ui-ux/references/ui-ux-db/scripts/search.py +114 -0
- package/.grok/skills/frontend-ui-ux/references/visual-language.md +84 -0
- package/.grok/skills/frontend-ui-ux/references/visual-reconstruction.md +97 -0
- package/.grok/skills/frontend-ui-ux/schemas/design-contract-v1alpha1.schema.json +306 -0
- package/.grok/skills/frontend-ui-ux/schemas/design-contract-v1beta1.schema.json +291 -0
- package/.grok/skills/frontend-ui-ux/schemas/design-contract-v1beta2.schema.json +311 -0
- package/.grok/skills/frontend-ui-ux/scripts/design-contract-format.mjs +286 -0
- package/.grok/skills/frontend-ui-ux/scripts/design-contract-inventory-rules.mjs +354 -0
- package/.grok/skills/frontend-ui-ux/scripts/design-contract-rules.mjs +361 -0
- package/.grok/skills/frontend-ui-ux/scripts/design-contract-surface-rules.mjs +313 -0
- package/.grok/skills/frontend-ui-ux/scripts/design-data.mjs +68 -0
- package/.grok/skills/frontend-ui-ux/scripts/errors.mjs +12 -0
- package/.grok/skills/frontend-ui-ux/scripts/import-design-intelligence.mjs +124 -0
- package/.grok/skills/frontend-ui-ux/scripts/json-boundary.mjs +63 -0
- package/.grok/skills/frontend-ui-ux/scripts/query-design-intelligence.mjs +106 -0
- package/.grok/skills/frontend-ui-ux/scripts/search.mjs +43 -0
- package/.grok/skills/frontend-ui-ux/scripts/source-replay.mjs +153 -0
- package/.grok/skills/frontend-ui-ux/scripts/strict-json.mjs +143 -0
- package/.grok/skills/frontend-ui-ux/scripts/validate-design-contract.mjs +52 -0
- package/.grok/skills/frontend-ui-ux/scripts/verify-canonical-corpus.mjs +214 -0
- package/.grok/skills/lit-burnoff/SKILL.md +175 -0
- package/.grok/skills/lit-burnoff-file/SKILL.md +67 -0
- package/.grok/skills/lit-code/SKILL.md +531 -0
- package/.grok/skills/lit-code/references/go/README.md +90 -0
- package/.grok/skills/lit-code/references/go/backend-stack.md +641 -0
- package/.grok/skills/lit-code/references/go/bootstrap.md +328 -0
- package/.grok/skills/lit-code/references/go/bubbletea-v2.md +360 -0
- package/.grok/skills/lit-code/references/go/cobra-stack.md +468 -0
- package/.grok/skills/lit-code/references/go/concurrency.md +362 -0
- package/.grok/skills/lit-code/references/go/data-modeling.md +329 -0
- package/.grok/skills/lit-code/references/go/error-handling.md +359 -0
- package/.grok/skills/lit-code/references/go/golangci-strict.md +236 -0
- package/.grok/skills/lit-code/references/go/grpc-connect.md +375 -0
- package/.grok/skills/lit-code/references/go/libraries.md +337 -0
- package/.grok/skills/lit-code/references/go/one-liners.md +202 -0
- package/.grok/skills/lit-code/references/go/sqlc-pgx.md +471 -0
- package/.grok/skills/lit-code/references/go/testing.md +467 -0
- package/.grok/skills/lit-code/references/go/type-patterns.md +298 -0
- package/.grok/skills/lit-code/references/permission-sandbox-matrix.md +70 -0
- package/.grok/skills/lit-code/references/python/README.md +314 -0
- package/.grok/skills/lit-code/references/python/async-anyio.md +442 -0
- package/.grok/skills/lit-code/references/python/data-modeling.md +233 -0
- package/.grok/skills/lit-code/references/python/data-processing.md +133 -0
- package/.grok/skills/lit-code/references/python/error-handling.md +218 -0
- package/.grok/skills/lit-code/references/python/fastapi-stack.md +316 -0
- package/.grok/skills/lit-code/references/python/httpx2-optimization.md +360 -0
- package/.grok/skills/lit-code/references/python/libraries.md +307 -0
- package/.grok/skills/lit-code/references/python/one-liners.md +268 -0
- package/.grok/skills/lit-code/references/python/orjson-stack.md +378 -0
- package/.grok/skills/lit-code/references/python/pydantic-ai.md +285 -0
- package/.grok/skills/lit-code/references/python/pyproject-strict.md +232 -0
- package/.grok/skills/lit-code/references/python/textual-tui.md +201 -0
- package/.grok/skills/lit-code/references/python/type-patterns.md +176 -0
- package/.grok/skills/lit-code/references/rust/README.md +317 -0
- package/.grok/skills/lit-code/references/rust/async-tokio.md +299 -0
- package/.grok/skills/lit-code/references/rust/axum-stack.md +467 -0
- package/.grok/skills/lit-code/references/rust/cargo-strict.md +317 -0
- package/.grok/skills/lit-code/references/rust/clap-stack.md +409 -0
- package/.grok/skills/lit-code/references/rust/concurrency.md +375 -0
- package/.grok/skills/lit-code/references/rust/libraries.md +439 -0
- package/.grok/skills/lit-code/references/rust/one-liners.md +291 -0
- package/.grok/skills/lit-code/references/rust/proptest-insta.md +429 -0
- package/.grok/skills/lit-code/references/rust/type-state.md +354 -0
- package/.grok/skills/lit-code/references/rust/unsafe-discipline.md +250 -0
- package/.grok/skills/lit-code/references/rust/zero-cost-safety.md +527 -0
- package/.grok/skills/lit-code/references/rust-ub/README.md +289 -0
- package/.grok/skills/lit-code/references/rust-ub/miri-sanitizers-loom.md +411 -0
- package/.grok/skills/lit-code/references/rust-ub/ub-taxonomy.md +269 -0
- package/.grok/skills/lit-code/references/tool-boundaries.md +66 -0
- package/.grok/skills/lit-code/references/typescript/README.md +195 -0
- package/.grok/skills/lit-code/references/typescript/backend-hono.md +672 -0
- package/.grok/skills/lit-code/references/typescript/bootstrap.md +199 -0
- package/.grok/skills/lit-code/references/typescript/data-modeling.md +202 -0
- package/.grok/skills/lit-code/references/typescript/error-handling.md +169 -0
- package/.grok/skills/lit-code/references/typescript/tsconfig-strict.md +152 -0
- package/.grok/skills/lit-code/references/typescript/type-patterns.md +196 -0
- package/.grok/skills/lit-code/references/worked-cases.md +190 -0
- package/.grok/skills/lit-commit/SKILL.md +218 -0
- package/.grok/skills/lit-comprehend/SKILL.md +63 -0
- package/.grok/skills/lit-comprehend/references/artifact-format.md +58 -0
- package/.grok/skills/lit-comprehend/references/artifact-template.md +219 -0
- package/.grok/skills/lit-comprehend/references/honesty-ledger-contract.md +51 -0
- package/.grok/skills/lit-comprehend/references/micro-worlds.md +195 -0
- package/.grok/skills/lit-comprehend/references/worked-explainer.md +51 -0
- package/.grok/skills/lit-crucible/SKILL.md +231 -0
- package/.grok/skills/lit-handoff/SKILL.md +159 -0
- package/.grok/skills/lit-handoff/evals/evals.json +154 -0
- package/.grok/skills/lit-handoff/examples/HANDOFF-example-generic-auth-refactor.md +97 -0
- package/.grok/skills/lit-handoff/references/_canonical-corpus/manifest.json +17 -0
- package/.grok/skills/lit-handoff/references/source-pointer.md +31 -0
- package/.grok/skills/lit-handoff/scripts/verify-canonical-corpus.mjs +137 -0
- package/.grok/skills/lit-handoff/templates/HANDOFF.md +121 -0
- package/.grok/skills/lit-init/SKILL.md +244 -0
- package/.grok/skills/lit-korean/SKILL.md +176 -0
- package/.grok/skills/lit-plan/SKILL.md +71 -0
- package/.grok/skills/lit-plan/references/plan-schema.md +87 -0
- package/.grok/skills/lit-plan/references/start-work-handoff-contract.md +59 -0
- package/.grok/skills/lit-plan/scripts/scaffold-plan.mjs +259 -0
- package/.grok/skills/lit-plan/scripts/validate-plan.mjs +89 -0
- package/.grok/skills/lit-recap/SKILL.md +57 -0
- package/.grok/skills/lit-scientific-visualization/SKILL.md +213 -0
- package/.grok/skills/lit-scientific-visualization/scripts/verify-canonical-corpus.mjs +181 -0
- package/.grok/skills/lit-team/SKILL.md +73 -0
- package/.grok/skills/lit-team/references/explore-packet.md +70 -0
- package/.grok/skills/lit-team/references/general-purpose-packet.md +75 -0
- package/.grok/skills/lit-team/references/plan-packet.md +73 -0
- package/.grok/skills/litgoal/SKILL.md +98 -0
- package/.grok/skills/litgrok/SKILL.md +77 -0
- package/.grok/skills/litresearch/SKILL.md +60 -0
- package/.grok/skills/litresearch/references/mcp-tool-use-patterns.md +83 -0
- package/.grok/skills/litresearch/references/source-verdict-taxonomy.md +40 -0
- package/.grok/skills/litwork/SKILL.md +109 -0
- package/.grok/skills/lsp/SKILL.md +56 -0
- package/.grok/skills/lsp/references/built-in-lsp-contract.md +71 -0
- package/.grok/skills/lsp-setup/SKILL.md +82 -0
- package/.grok/skills/lsp-setup/references/bash/README.md +54 -0
- package/.grok/skills/lsp-setup/references/c-cpp/README.md +58 -0
- package/.grok/skills/lsp-setup/references/csharp/README.md +64 -0
- package/.grok/skills/lsp-setup/references/dart/README.md +48 -0
- package/.grok/skills/lsp-setup/references/elixir/README.md +51 -0
- package/.grok/skills/lsp-setup/references/go/README.md +53 -0
- package/.grok/skills/lsp-setup/references/haskell/README.md +57 -0
- package/.grok/skills/lsp-setup/references/java/README.md +55 -0
- package/.grok/skills/lsp-setup/references/julia/README.md +56 -0
- package/.grok/skills/lsp-setup/references/kotlin/README.md +58 -0
- package/.grok/skills/lsp-setup/references/lua/README.md +48 -0
- package/.grok/skills/lsp-setup/references/php/README.md +49 -0
- package/.grok/skills/lsp-setup/references/python/README.md +60 -0
- package/.grok/skills/lsp-setup/references/ruby/README.md +53 -0
- package/.grok/skills/lsp-setup/references/rust/README.md +55 -0
- package/.grok/skills/lsp-setup/references/swift/README.md +52 -0
- package/.grok/skills/lsp-setup/references/terraform/README.md +50 -0
- package/.grok/skills/lsp-setup/references/typescript/README.md +63 -0
- package/.grok/skills/lsp-setup/references/yaml/README.md +47 -0
- package/.grok/skills/lsp-setup/references/zig/README.md +49 -0
- package/.grok/skills/lsp-setup/scripts/detect-lsp.mjs +40 -0
- package/.grok/skills/lsp-setup/scripts/lsp-server-table.mjs +309 -0
- package/.grok/skills/lsp-setup/scripts/verify-lsp.mjs +54 -0
- package/.grok/skills/refactor/SKILL.md +210 -0
- package/.grok/skills/review-work/SKILL.md +515 -0
- package/.grok/skills/review-work/references/behavior-lane-contract.md +48 -0
- package/.grok/skills/review-work/references/documentation-lane-contract.md +49 -0
- package/.grok/skills/review-work/references/integration-lane-contract.md +51 -0
- package/.grok/skills/review-work/references/regression-lane-contract.md +48 -0
- package/.grok/skills/review-work/references/safety-lane-contract.md +48 -0
- package/.grok/skills/review-work/references/test-lane-contract.md +48 -0
- package/.grok/skills/review-work/scripts/check-lanes.mjs +63 -0
- package/.grok/skills/rules/SKILL.md +51 -0
- package/.grok/skills/rules/references/loading-order-contract.md +66 -0
- package/.grok/skills/rules/scripts/resolve-guidance.mjs +180 -0
- package/.grok/skills/skill-observer/SKILL.md +78 -0
- package/.grok/skills/skill-observer/references/review-contract.md +77 -0
- package/.grok/skills/skill-observer/scripts/curator.mjs +121 -0
- package/.grok/skills/skill-observer/scripts/review.mjs +347 -0
- package/.grok/skills/skill-observer/scripts/skill-loop.mjs +2087 -0
- package/.grok/skills/skill-observer/scripts/validate-skills.mjs +83 -0
- package/.grok/skills/start-work/SKILL.md +396 -0
- package/.grok/skills/structural-search/SKILL.md +195 -0
- package/.grok/skills/visual-qa/SKILL.md +50 -0
- package/.grok/skills/visual-qa/references/capture-playbook.md +47 -0
- package/.grok/skills/visual-qa/references/complete-contract.md +721 -0
- package/.grok/skills/visual-qa/references/verdict-taxonomy.md +34 -0
- package/.grok/skills/visual-qa/scripts/verify-evidence-manifest.mjs +91 -0
- package/.grok/skills/wikify/SKILL.md +65 -0
- package/.grok/skills/wikify/references/page-format.md +81 -0
- package/.grok/skills/wikify/references/provenance-contract.md +52 -0
- package/.grok/vendor/NOTICE.md +16 -0
- package/.grok/vendor/licenses/045_scientific-visualization-MIT.txt +21 -0
- package/.grok/vendor/provenance/045_scientific-visualization.md +37 -0
- package/.grok/vendor/scientific-visualization/assets/color_palettes.py +197 -0
- package/.grok/vendor/scientific-visualization/assets/nature.mplstyle +75 -0
- package/.grok/vendor/scientific-visualization/assets/presentation.mplstyle +74 -0
- package/.grok/vendor/scientific-visualization/assets/publication.mplstyle +78 -0
- package/.grok/vendor/scientific-visualization/evals/evals.json +158 -0
- package/.grok/vendor/scientific-visualization/references/_canonical-corpus/manifest.json +38 -0
- package/.grok/vendor/scientific-visualization/references/color_palettes.md +380 -0
- package/.grok/vendor/scientific-visualization/references/journal_requirements.md +359 -0
- package/.grok/vendor/scientific-visualization/references/matplotlib_examples.md +608 -0
- package/.grok/vendor/scientific-visualization/references/mdanalysis_martini_visualization.md +85 -0
- package/.grok/vendor/scientific-visualization/references/publication_guidelines.md +217 -0
- package/.grok/vendor/scientific-visualization/references/seaborn_for_publications.md +293 -0
- package/.grok/vendor/scientific-visualization/scripts/figure_export.py +238 -0
- package/.grok/vendor/scientific-visualization/scripts/style_presets.py +467 -0
- package/.grok/vendor/scientific-visualization/tests/test_figure_export.py +51 -0
- package/.grok/vendor/scientific-visualization/tests/test_style_presets.py +114 -0
- package/CHANGELOG.md +131 -0
- package/CODE_OF_CONDUCT.md +9 -0
- package/CONTRIBUTING.md +22 -0
- package/LICENSE +21 -0
- package/README.md +228 -0
- package/README_ko-KR.md +228 -0
- package/SECURITY.md +11 -0
- package/SUPPORT.md +9 -0
- package/bin/litgrok.mjs +860 -0
- package/docs/assets/cover.webp +0 -0
- package/docs/assets/litgrok-clay-icon.png +0 -0
- package/docs/assets/litgrok-continuity-1600.webp +0 -0
- package/docs/assets/litgrok-ignition-1600.webp +0 -0
- package/docs/assets/litgrok-wordmark.svg +5 -0
- package/docs/assets/readme/README.md +31 -0
- package/docs/assets/readme/badge-license.svg +1 -0
- package/docs/assets/readme/badge-version.svg +1 -0
- package/docs/privacy.md +13 -0
- package/docs/reference.md +271 -0
- package/docs/reference_ko-KR.md +267 -0
- package/package.json +50 -0
- package/plugin.json +27 -0
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# Security review mode
|
|
2
|
+
|
|
3
|
+
## Grok-native contract
|
|
4
|
+
|
|
5
|
+
Select security in the skill selector; hand authorized probes/writes to the native `start-work` handoff and a subsequent approved session.
|
|
6
|
+
Findings remain `REVIEW_REQUIRED` and cannot programmatically claim family completion. Changed
|
|
7
|
+
evaluator or budget requires re-planning and review.
|
|
8
|
+
|
|
9
|
+
Map assets, actors, trust boundaries, flows, entry points, and controls. Apply STRIDE and relevant
|
|
10
|
+
OWASP checks with safe evidence. No exploitation, credential use, denial of service, persistence,
|
|
11
|
+
external scanning, or secret collection occurs without specific authorization. Budget exhaustion
|
|
12
|
+
never means secure.
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# Artifact-type shipping checklists
|
|
2
|
+
|
|
3
|
+
## Grok-native contract
|
|
4
|
+
|
|
5
|
+
The skill selector loads these checklists; approved checks use the native `start-work` handoff and a subsequent approved session. Results
|
|
6
|
+
remain `REVIEW_REQUIRED` and cannot programmatically claim family completion. Changed evaluator or
|
|
7
|
+
budget requires re-planning and review.
|
|
8
|
+
|
|
9
|
+
Packages: reproducible build, exact payload, executable modes, runtime requirements, install smoke,
|
|
10
|
+
version lockstep, licenses, provenance, scanner, and dry packaging. Applications: tests,
|
|
11
|
+
accessibility, security, migrations, rollback, monitoring, and docs. Skills: skill selector registration,
|
|
12
|
+
installed paths, prompt boundaries, package enrollment, recursive scans, and host-shaped probes.
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
# Shipping-readiness mode
|
|
2
|
+
|
|
3
|
+
## Grok-native contract
|
|
4
|
+
|
|
5
|
+
Select ship in the skill selector; hand approved verification/artifact edits to native `start-work` and
|
|
6
|
+
a bounded review cycle. Readiness remains `REVIEW_REQUIRED` and cannot programmatically claim family completion.
|
|
7
|
+
Changed evaluator or budget requires re-planning and review.
|
|
8
|
+
|
|
9
|
+
Inventory checks, exact payload, provenance, documentation, rollback, security, and known risk. Use
|
|
10
|
+
host-bounded processes and capture exact evidence. Return GO/NO_GO readiness only. Publish, deploy,
|
|
11
|
+
tag, release, push, version, registry, credentials, and live profile require separate approval.
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# Autoresearch result artifacts
|
|
2
|
+
|
|
3
|
+
Skill selector guidance hands approved work to the native `start-work` handoff and a subsequent approved session. TSV/Markdown artifacts are
|
|
4
|
+
`REVIEW_REQUIRED`, are not host state, and cannot programmatically claim family completion. Changed
|
|
5
|
+
evaluator or budget requires re-planning and review.
|
|
6
|
+
|
|
7
|
+
`autoresearch-results.tsv` contains iteration, metric value, delta, percentage, status, description,
|
|
8
|
+
evaluator source, and timestamp. Iteration zero is baseline; positive integers are executed work.
|
|
9
|
+
Reject malformed rows, duplicate ids, NaN/infinite values, evaluator drift, and unexplained gaps.
|
|
10
|
+
|
|
11
|
+
Receipts should record evaluator/method identity, bounded command result, guards, changed paths, and
|
|
12
|
+
cleanup. Reports may summarize target evidence or `BUDGET_EXHAUSTED`, but remain review material.
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# Optional autoresearch visualization
|
|
2
|
+
|
|
3
|
+
Skill selector guidance hands approved writes to the native `start-work` handoff and a subsequent approved session. Plots remain
|
|
4
|
+
`REVIEW_REQUIRED` and cannot programmatically claim family completion. Changed evaluator or budget
|
|
5
|
+
requires re-planning and review.
|
|
6
|
+
|
|
7
|
+
Resolve `<loaded-autoresearch-skill-dir>/scripts/style_presets.py --check`. The preflight must actually
|
|
8
|
+
`import matplotlib`; discovery alone is insufficient. On
|
|
9
|
+
`BLOCKED_OPTIONAL_MATPLOTLIB_UNAVAILABLE`, omit plots and do not modify the environment.
|
|
10
|
+
|
|
11
|
+
The preflight only proves matplotlib imports; it applies nothing. Every figure script must also
|
|
12
|
+
`import rcparams` from that same `scripts/style_presets.py` and call `rcparams()` **before**
|
|
13
|
+
`plt.subplots()` or `plt.figure()`. Matplotlib reads its rcParams when the figure is constructed, so
|
|
14
|
+
a call placed after that point silently does nothing and the shipped contract — `savefig.dpi` 600,
|
|
15
|
+
`legend.framealpha` 1, `legend.edgecolor` black, the Okabe-Ito `axes.prop_cycle`, white facecolor,
|
|
16
|
+
inward ticks — never reaches the output.
|
|
17
|
+
|
|
18
|
+
For figure work beyond these run plots — journal sizing, multi-panel layout, export formats — use the
|
|
19
|
+
`lit-scientific-visualization` skill rather than re-deriving its rules here.
|
|
20
|
+
|
|
21
|
+
When available, show baseline, executed work points, kept/reverted/inconclusive labels, uncertainty,
|
|
22
|
+
best-so-far, and target. Use accessible colors, visible units/endpoints, nonoverlapping labels, and a
|
|
23
|
+
nonobscuring legend. Never hide failures or imply causality beyond receipts. Writes stay under the
|
|
24
|
+
approved root and reject unsafe parents/leaves.
|
|
@@ -0,0 +1,391 @@
|
|
|
1
|
+
"""
|
|
2
|
+
init_research.py — Scaffold a new autoresearch-skill project directory.
|
|
3
|
+
|
|
4
|
+
Usage:
|
|
5
|
+
python init_research.py --goal "..." --metric "..." --direction {maximize|minimize} \
|
|
6
|
+
[--target "..."] [--max-iterations 10] [--output ./my-research/]
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
import argparse
|
|
10
|
+
import math
|
|
11
|
+
import os
|
|
12
|
+
import secrets
|
|
13
|
+
import stat
|
|
14
|
+
import sys
|
|
15
|
+
import textwrap
|
|
16
|
+
from datetime import datetime
|
|
17
|
+
from pathlib import Path
|
|
18
|
+
from typing import Optional, Tuple
|
|
19
|
+
|
|
20
|
+
RESEARCH_TEMPLATE = """\
|
|
21
|
+
# Research: {title}
|
|
22
|
+
|
|
23
|
+
## Goal
|
|
24
|
+
{goal}
|
|
25
|
+
|
|
26
|
+
## Success Metric
|
|
27
|
+
- **Metric:** {metric}
|
|
28
|
+
- **Target:** {target}
|
|
29
|
+
- **Direction:** {direction}
|
|
30
|
+
|
|
31
|
+
## Constraints
|
|
32
|
+
- **Max iterations:** {max_iterations}
|
|
33
|
+
- **Time budget per experiment:** 5 minutes
|
|
34
|
+
- **Pause for review every:** never
|
|
35
|
+
- **Evaluator:** {evaluator}
|
|
36
|
+
- **Keep policy:** {keep_policy}
|
|
37
|
+
- **Guard:** {guard}
|
|
38
|
+
- **Noise runs:** {noise_runs}
|
|
39
|
+
- **Min delta:** {min_delta}
|
|
40
|
+
|
|
41
|
+
## Current Approach
|
|
42
|
+
_Describe your current baseline here._
|
|
43
|
+
|
|
44
|
+
## Search Space
|
|
45
|
+
- **Allowed changes:** _Define what the agent can modify._
|
|
46
|
+
- **Forbidden changes:** _Define what must NOT change._
|
|
47
|
+
|
|
48
|
+
## Context & References
|
|
49
|
+
_Add relevant papers, docs, or URLs here._
|
|
50
|
+
|
|
51
|
+
---
|
|
52
|
+
|
|
53
|
+
## History
|
|
54
|
+
| # | Change | Metric | Result | Timestamp |
|
|
55
|
+
|---|--------|--------|--------|-----------|
|
|
56
|
+
| 0 | Baseline | TBD | -- | {date} |
|
|
57
|
+
"""
|
|
58
|
+
|
|
59
|
+
LOG_TEMPLATE = """\
|
|
60
|
+
# Research Log
|
|
61
|
+
|
|
62
|
+
> Auto-generated by init_research.py on {date}
|
|
63
|
+
> Goal: {goal}
|
|
64
|
+
|
|
65
|
+
---
|
|
66
|
+
|
|
67
|
+
"""
|
|
68
|
+
|
|
69
|
+
TSV_HEADER = "iteration\tmetric_value\tdelta\tdelta_pct\tstatus\tdescription\tevaluator_source\ttimestamp\n"
|
|
70
|
+
TSV_BASELINE = "0\tTBD\t-\t-\tbaseline\tInitial state\tagent\t{date}\n"
|
|
71
|
+
|
|
72
|
+
MANAGED_FILE_LEAVES = (
|
|
73
|
+
"research.md",
|
|
74
|
+
"research_log.md",
|
|
75
|
+
"autoresearch-results.tsv",
|
|
76
|
+
"final_report.md",
|
|
77
|
+
"progress.png",
|
|
78
|
+
"autoresearch-run-state.json",
|
|
79
|
+
".autoresearch-loop.pid",
|
|
80
|
+
)
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
def fail(code: str, message: str) -> None:
|
|
84
|
+
print(f"Error: {code}: {message}", file=sys.stderr)
|
|
85
|
+
raise SystemExit(1)
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
def preflight_capabilities() -> None:
|
|
89
|
+
"""Fail before mutation unless the required Python/POSIX descriptor APIs exist."""
|
|
90
|
+
required_dir_fd = (os.open, os.mkdir, os.stat, os.unlink, os.link)
|
|
91
|
+
supported = (
|
|
92
|
+
sys.version_info >= (3, 8)
|
|
93
|
+
and hasattr(os, "O_DIRECTORY")
|
|
94
|
+
and hasattr(os, "O_NOFOLLOW")
|
|
95
|
+
and all(function in os.supports_dir_fd for function in required_dir_fd)
|
|
96
|
+
and os.listdir in os.supports_fd
|
|
97
|
+
and os.link in os.supports_follow_symlinks
|
|
98
|
+
)
|
|
99
|
+
if not supported:
|
|
100
|
+
fail(
|
|
101
|
+
"BLOCKED_UNSUPPORTED_PYTHON_POSIX_RUNTIME",
|
|
102
|
+
"requires Python 3.8+ with O_DIRECTORY, O_NOFOLLOW, dir_fd, fd-listdir, and no-follow link support",
|
|
103
|
+
)
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
def same_directory_identity(left: os.stat_result, right: os.stat_result) -> bool:
|
|
107
|
+
"""Compare path identity, including ctime to reject recreated directories."""
|
|
108
|
+
return (
|
|
109
|
+
left.st_dev,
|
|
110
|
+
left.st_ino,
|
|
111
|
+
left.st_mode,
|
|
112
|
+
left.st_uid,
|
|
113
|
+
left.st_ctime_ns,
|
|
114
|
+
) == (
|
|
115
|
+
right.st_dev,
|
|
116
|
+
right.st_ino,
|
|
117
|
+
right.st_mode,
|
|
118
|
+
right.st_uid,
|
|
119
|
+
right.st_ctime_ns,
|
|
120
|
+
)
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
def open_safe_directory(path: Path) -> Tuple[int, Path]:
|
|
124
|
+
"""Create/open path one component at a time without following symlinks."""
|
|
125
|
+
absolute = Path(os.path.abspath(os.fspath(path)))
|
|
126
|
+
parts = absolute.parts
|
|
127
|
+
if not parts or not absolute.is_absolute():
|
|
128
|
+
fail("UNSAFE_OUTPUT_PATH", "output must resolve to an absolute filesystem path")
|
|
129
|
+
|
|
130
|
+
flags = os.O_RDONLY | os.O_DIRECTORY | getattr(os, "O_CLOEXEC", 0)
|
|
131
|
+
nofollow = getattr(os, "O_NOFOLLOW", 0)
|
|
132
|
+
fd = os.open(parts[0], flags | nofollow)
|
|
133
|
+
try:
|
|
134
|
+
for part in parts[1:]:
|
|
135
|
+
try:
|
|
136
|
+
info = os.stat(part, dir_fd=fd, follow_symlinks=False)
|
|
137
|
+
except FileNotFoundError:
|
|
138
|
+
try:
|
|
139
|
+
os.mkdir(part, 0o755, dir_fd=fd)
|
|
140
|
+
except FileExistsError:
|
|
141
|
+
pass
|
|
142
|
+
info = os.stat(part, dir_fd=fd, follow_symlinks=False)
|
|
143
|
+
if stat.S_ISLNK(info.st_mode):
|
|
144
|
+
fail("UNSAFE_OUTPUT_SYMLINK", f"output component is a symlink: {absolute}")
|
|
145
|
+
if not stat.S_ISDIR(info.st_mode):
|
|
146
|
+
fail("UNSAFE_OUTPUT_PATH", f"output component is not a directory: {absolute}")
|
|
147
|
+
next_fd = None
|
|
148
|
+
try:
|
|
149
|
+
next_fd = os.open(part, flags | nofollow, dir_fd=fd)
|
|
150
|
+
opened = os.fstat(next_fd)
|
|
151
|
+
if not same_directory_identity(info, opened):
|
|
152
|
+
fail("UNSAFE_OUTPUT_SWAP", f"output component identity changed: {absolute}")
|
|
153
|
+
except BaseException:
|
|
154
|
+
if next_fd is not None:
|
|
155
|
+
os.close(next_fd)
|
|
156
|
+
raise
|
|
157
|
+
os.close(fd)
|
|
158
|
+
fd = next_fd
|
|
159
|
+
verify_directory_identity(absolute, fd)
|
|
160
|
+
return fd, absolute
|
|
161
|
+
except BaseException:
|
|
162
|
+
os.close(fd)
|
|
163
|
+
raise
|
|
164
|
+
|
|
165
|
+
|
|
166
|
+
def verify_directory_identity(path: Path, fd: int) -> None:
|
|
167
|
+
"""Reject replacement of the opened output directory before each mutation."""
|
|
168
|
+
try:
|
|
169
|
+
named = os.stat(path, follow_symlinks=False)
|
|
170
|
+
except OSError as error:
|
|
171
|
+
fail("UNSAFE_OUTPUT_SWAP", f"output directory identity changed: {error}")
|
|
172
|
+
opened = os.fstat(fd)
|
|
173
|
+
if stat.S_ISLNK(named.st_mode) or not stat.S_ISDIR(named.st_mode):
|
|
174
|
+
fail("UNSAFE_OUTPUT_SYMLINK", f"output directory is no longer a real directory: {path}")
|
|
175
|
+
if not same_directory_identity(named, opened):
|
|
176
|
+
fail("UNSAFE_OUTPUT_SWAP", f"output directory identity changed: {path}")
|
|
177
|
+
|
|
178
|
+
|
|
179
|
+
def leaf_info(fd: int, leaf: str) -> Optional[os.stat_result]:
|
|
180
|
+
try:
|
|
181
|
+
return os.stat(leaf, dir_fd=fd, follow_symlinks=False)
|
|
182
|
+
except FileNotFoundError:
|
|
183
|
+
return None
|
|
184
|
+
|
|
185
|
+
|
|
186
|
+
def reject_unsafe_leaf(fd: int, leaf: str, *, directory: bool = False) -> None:
|
|
187
|
+
info = leaf_info(fd, leaf)
|
|
188
|
+
if info is None:
|
|
189
|
+
return
|
|
190
|
+
expected = stat.S_ISDIR(info.st_mode) if directory else stat.S_ISREG(info.st_mode)
|
|
191
|
+
if stat.S_ISLNK(info.st_mode) or not expected:
|
|
192
|
+
fail("UNSAFE_GENERATED_LEAF", f"generated leaf has unsafe type: {leaf}")
|
|
193
|
+
|
|
194
|
+
|
|
195
|
+
def remove_regular_leaf(fd: int, root: Path, leaf: str) -> None:
|
|
196
|
+
reject_unsafe_leaf(fd, leaf)
|
|
197
|
+
if leaf_info(fd, leaf) is not None:
|
|
198
|
+
verify_directory_identity(root, fd)
|
|
199
|
+
os.unlink(leaf, dir_fd=fd)
|
|
200
|
+
|
|
201
|
+
|
|
202
|
+
def write_new_leaf(fd: int, root: Path, leaf: str, text: str) -> None:
|
|
203
|
+
"""Create a leaf without overwrite; a competing leaf creation fails closed."""
|
|
204
|
+
verify_directory_identity(root, fd)
|
|
205
|
+
if leaf_info(fd, leaf) is not None:
|
|
206
|
+
fail("UNSAFE_GENERATED_LEAF", f"generated leaf appeared during scaffold: {leaf}")
|
|
207
|
+
temp = f".{leaf}.tmp-{os.getpid()}-{secrets.token_hex(6)}"
|
|
208
|
+
flags = os.O_WRONLY | os.O_CREAT | os.O_EXCL | getattr(os, "O_NOFOLLOW", 0)
|
|
209
|
+
temp_fd = None
|
|
210
|
+
temp_created = False
|
|
211
|
+
try:
|
|
212
|
+
temp_fd = os.open(temp, flags, 0o600, dir_fd=fd)
|
|
213
|
+
temp_created = True
|
|
214
|
+
try:
|
|
215
|
+
data = text.encode("utf-8")
|
|
216
|
+
while data:
|
|
217
|
+
written = os.write(temp_fd, data)
|
|
218
|
+
data = data[written:]
|
|
219
|
+
os.fsync(temp_fd)
|
|
220
|
+
finally:
|
|
221
|
+
os.close(temp_fd)
|
|
222
|
+
temp_fd = None
|
|
223
|
+
verify_directory_identity(root, fd)
|
|
224
|
+
os.link(temp, leaf, src_dir_fd=fd, dst_dir_fd=fd, follow_symlinks=False)
|
|
225
|
+
except FileExistsError:
|
|
226
|
+
fail("UNSAFE_GENERATED_LEAF", f"generated leaf appeared during scaffold: {leaf}")
|
|
227
|
+
finally:
|
|
228
|
+
if temp_fd is not None:
|
|
229
|
+
try:
|
|
230
|
+
os.close(temp_fd)
|
|
231
|
+
except OSError:
|
|
232
|
+
pass
|
|
233
|
+
if temp_created:
|
|
234
|
+
try:
|
|
235
|
+
os.unlink(temp, dir_fd=fd)
|
|
236
|
+
except FileNotFoundError:
|
|
237
|
+
pass
|
|
238
|
+
|
|
239
|
+
|
|
240
|
+
def goal_to_title(goal: str) -> str:
|
|
241
|
+
"""Convert a goal string to a short title (first 8 words, title-cased)."""
|
|
242
|
+
words = goal.split()
|
|
243
|
+
short = " ".join(words[:8])
|
|
244
|
+
if len(words) > 8:
|
|
245
|
+
short += "..."
|
|
246
|
+
return short.title()
|
|
247
|
+
|
|
248
|
+
|
|
249
|
+
def parse_args() -> argparse.Namespace:
|
|
250
|
+
parser = argparse.ArgumentParser(
|
|
251
|
+
description="Scaffold a new autoresearch-skill project.",
|
|
252
|
+
formatter_class=argparse.RawDescriptionHelpFormatter,
|
|
253
|
+
epilog=textwrap.dedent("""\
|
|
254
|
+
Example:
|
|
255
|
+
python init_research.py \\
|
|
256
|
+
--goal "Optimize sorting algorithm performance" \\
|
|
257
|
+
--metric "execution_time_seconds" \\
|
|
258
|
+
--direction minimize \\
|
|
259
|
+
--target "< 0.5" \\
|
|
260
|
+
--max-iterations 20 \\
|
|
261
|
+
--output ./sort-research/
|
|
262
|
+
"""),
|
|
263
|
+
)
|
|
264
|
+
parser.add_argument("--goal", required=True, help="Research goal description.")
|
|
265
|
+
parser.add_argument("--metric", required=True, help="Metric name to track (e.g. accuracy, execution_time_seconds).")
|
|
266
|
+
parser.add_argument(
|
|
267
|
+
"--direction",
|
|
268
|
+
required=True,
|
|
269
|
+
choices=["maximize", "minimize"],
|
|
270
|
+
help="Whether to maximize or minimize the metric.",
|
|
271
|
+
)
|
|
272
|
+
parser.add_argument("--target", default="TBD", help="Target value or expression (e.g. '> 0.9', '< 0.5'). Default: TBD")
|
|
273
|
+
parser.add_argument("--max-iterations", type=int, default=20, metavar="N", help="Maximum number of iterations. Default: 20")
|
|
274
|
+
parser.add_argument("--output", default="./research/", metavar="PATH", help="Output directory. Default: ./research/")
|
|
275
|
+
parser.add_argument("--evaluator", default=None, metavar="CMD",
|
|
276
|
+
help="Evaluator command (e.g. 'python evaluate.py'). Must output JSON {pass:bool, score?:number}.")
|
|
277
|
+
parser.add_argument("--keep-policy", default="score_improvement",
|
|
278
|
+
choices=["score_improvement", "pass_only"],
|
|
279
|
+
help="Keep policy: score_improvement (default) or pass_only.")
|
|
280
|
+
parser.add_argument("--guard", default=None, metavar="CONDITION",
|
|
281
|
+
help="Guard condition that must remain true (e.g. 'all unit tests pass'). Hard stop if violated.")
|
|
282
|
+
parser.add_argument("--noise-runs", type=int, default=1, metavar="N",
|
|
283
|
+
help="Number of runs to median over for noisy metrics. Default: 1")
|
|
284
|
+
parser.add_argument("--min-delta", type=float, default=0.0, metavar="DELTA",
|
|
285
|
+
help="Minimum improvement required to keep a change. Default: 0 (any improvement counts).")
|
|
286
|
+
parser.add_argument(
|
|
287
|
+
"--force",
|
|
288
|
+
action="store_true",
|
|
289
|
+
help="Overwrite this scaffold's generated files in a non-empty output directory.",
|
|
290
|
+
)
|
|
291
|
+
return parser.parse_args()
|
|
292
|
+
|
|
293
|
+
|
|
294
|
+
def scaffold(goal: str, metric: str, direction: str, target: str, max_iterations: int, output: Path,
|
|
295
|
+
evaluator: Optional[str] = None, keep_policy: str = "score_improvement",
|
|
296
|
+
guard: Optional[str] = None, noise_runs: int = 1, min_delta: float = 0.0,
|
|
297
|
+
force: bool = False) -> None:
|
|
298
|
+
date = datetime.now().strftime("%Y-%m-%d")
|
|
299
|
+
title = goal_to_title(goal)
|
|
300
|
+
evaluator_str = f"`{evaluator}`" if evaluator else "_(none — agent judges manually)_"
|
|
301
|
+
guard_str = guard if guard else "_(none)_"
|
|
302
|
+
|
|
303
|
+
fd, output = open_safe_directory(output)
|
|
304
|
+
try:
|
|
305
|
+
entries = os.listdir(fd)
|
|
306
|
+
if entries and not force:
|
|
307
|
+
fail(
|
|
308
|
+
"OUTPUT_NOT_EMPTY",
|
|
309
|
+
f"output directory '{output}' already exists and is not empty. "
|
|
310
|
+
"Use --force to overwrite generated files.",
|
|
311
|
+
)
|
|
312
|
+
reject_unsafe_leaf(fd, "workspace", directory=True)
|
|
313
|
+
for leaf in MANAGED_FILE_LEAVES:
|
|
314
|
+
reject_unsafe_leaf(fd, leaf)
|
|
315
|
+
if force:
|
|
316
|
+
for leaf in MANAGED_FILE_LEAVES:
|
|
317
|
+
remove_regular_leaf(fd, output, leaf)
|
|
318
|
+
if leaf_info(fd, "workspace") is None:
|
|
319
|
+
verify_directory_identity(output, fd)
|
|
320
|
+
os.mkdir("workspace", 0o755, dir_fd=fd)
|
|
321
|
+
|
|
322
|
+
# Write research.md
|
|
323
|
+
research_text = RESEARCH_TEMPLATE.format(
|
|
324
|
+
title=title,
|
|
325
|
+
goal=goal,
|
|
326
|
+
metric=metric,
|
|
327
|
+
target=target,
|
|
328
|
+
direction=direction,
|
|
329
|
+
max_iterations=max_iterations,
|
|
330
|
+
evaluator=evaluator_str,
|
|
331
|
+
keep_policy=keep_policy,
|
|
332
|
+
guard=guard_str,
|
|
333
|
+
noise_runs=noise_runs,
|
|
334
|
+
min_delta=min_delta,
|
|
335
|
+
date=date,
|
|
336
|
+
)
|
|
337
|
+
write_new_leaf(fd, output, "research.md", research_text)
|
|
338
|
+
|
|
339
|
+
# Write research_log.md
|
|
340
|
+
write_new_leaf(fd, output, "research_log.md", LOG_TEMPLATE.format(date=date, goal=goal))
|
|
341
|
+
|
|
342
|
+
# Write autoresearch-results.tsv
|
|
343
|
+
write_new_leaf(fd, output, "autoresearch-results.tsv", TSV_HEADER + TSV_BASELINE.format(date=date))
|
|
344
|
+
verify_directory_identity(output, fd)
|
|
345
|
+
finally:
|
|
346
|
+
os.close(fd)
|
|
347
|
+
|
|
348
|
+
# Print success message
|
|
349
|
+
print(f"\nResearch project scaffolded at: {output.resolve()}")
|
|
350
|
+
print(f"\nFiles created:")
|
|
351
|
+
print(f" {output / 'research.md'}")
|
|
352
|
+
print(f" {output / 'research_log.md'}")
|
|
353
|
+
print(f" {output / 'autoresearch-results.tsv'}")
|
|
354
|
+
print(f" {output / 'workspace'}/")
|
|
355
|
+
print(f"\nNext steps:")
|
|
356
|
+
print(f" 1. Open research.md and fill in 'Current Approach' and 'Search Space'.")
|
|
357
|
+
print(f" 2. Add context (papers, docs, code) under 'Context & References'.")
|
|
358
|
+
print(f" 3. Run your baseline experiment and record it in the History table.")
|
|
359
|
+
print(f" 4. Start iterating: modify → measure → log → repeat.")
|
|
360
|
+
print(" 5. Select the explicit autoresearch skill request, approve a plan, then select the native start-work skill.")
|
|
361
|
+
|
|
362
|
+
|
|
363
|
+
def main() -> None:
|
|
364
|
+
args = parse_args()
|
|
365
|
+
if args.max_iterations < 1:
|
|
366
|
+
fail("INVALID_BUDGET", "--max-iterations must be >= 1")
|
|
367
|
+
if args.noise_runs < 1:
|
|
368
|
+
fail("INVALID_BUDGET", "--noise-runs must be >= 1")
|
|
369
|
+
if not math.isfinite(args.min_delta) or args.min_delta < 0:
|
|
370
|
+
fail("INVALID_BUDGET", "--min-delta must be finite and >= 0")
|
|
371
|
+
preflight_capabilities()
|
|
372
|
+
output = Path(args.output)
|
|
373
|
+
|
|
374
|
+
scaffold(
|
|
375
|
+
goal=args.goal,
|
|
376
|
+
metric=args.metric,
|
|
377
|
+
direction=args.direction,
|
|
378
|
+
target=args.target,
|
|
379
|
+
max_iterations=args.max_iterations,
|
|
380
|
+
output=output,
|
|
381
|
+
evaluator=args.evaluator,
|
|
382
|
+
keep_policy=args.keep_policy,
|
|
383
|
+
guard=args.guard,
|
|
384
|
+
noise_runs=args.noise_runs,
|
|
385
|
+
min_delta=args.min_delta,
|
|
386
|
+
force=args.force,
|
|
387
|
+
)
|
|
388
|
+
|
|
389
|
+
|
|
390
|
+
if __name__ == "__main__":
|
|
391
|
+
main()
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Optional matplotlib style presets for installed LitGrok autoresearch runs.
|
|
3
|
+
|
|
4
|
+
Call rcparams() before plt.subplots() or plt.figure(). Matplotlib snapshots rcParams
|
|
5
|
+
when a figure is constructed, so a later call is silently ignored and every preset
|
|
6
|
+
below — dpi, legend framing, the Okabe-Ito cycle, tick direction — is lost.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
import importlib
|
|
10
|
+
import json
|
|
11
|
+
import sys
|
|
12
|
+
from typing import Dict
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
OKABE_ITO = [
|
|
16
|
+
"#E69F00",
|
|
17
|
+
"#56B4E9",
|
|
18
|
+
"#009E73",
|
|
19
|
+
"#F0E442",
|
|
20
|
+
"#0072B2",
|
|
21
|
+
"#D55E00",
|
|
22
|
+
"#CC79A7",
|
|
23
|
+
"#000000",
|
|
24
|
+
]
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def matplotlib_available() -> bool:
|
|
28
|
+
"""Return whether the optional plotting dependency imports successfully."""
|
|
29
|
+
try:
|
|
30
|
+
importlib.import_module("matplotlib")
|
|
31
|
+
except Exception:
|
|
32
|
+
return False
|
|
33
|
+
return True
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def preflight_report() -> Dict[str, object]:
|
|
37
|
+
"""Return a stable, non-installing optional dependency verdict."""
|
|
38
|
+
available = matplotlib_available()
|
|
39
|
+
return {
|
|
40
|
+
"available": available,
|
|
41
|
+
"code": (
|
|
42
|
+
"OPTIONAL_MATPLOTLIB_READY"
|
|
43
|
+
if available
|
|
44
|
+
else "BLOCKED_OPTIONAL_MATPLOTLIB_UNAVAILABLE"
|
|
45
|
+
),
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def rcparams() -> None:
|
|
50
|
+
"""Apply the retained style after an explicit dependency preflight."""
|
|
51
|
+
if not matplotlib_available():
|
|
52
|
+
raise RuntimeError("BLOCKED_OPTIONAL_MATPLOTLIB_UNAVAILABLE")
|
|
53
|
+
|
|
54
|
+
import matplotlib as mpl
|
|
55
|
+
from matplotlib import font_manager, rcParams
|
|
56
|
+
|
|
57
|
+
rcParams["font.family"] = "sans-serif"
|
|
58
|
+
available_fonts = {font.name for font in font_manager.fontManager.ttflist}
|
|
59
|
+
if "Pretendard" in available_fonts:
|
|
60
|
+
rcParams["font.sans-serif"] = ["Pretendard"]
|
|
61
|
+
elif "Arial" in available_fonts:
|
|
62
|
+
rcParams["font.sans-serif"] = ["Arial"]
|
|
63
|
+
|
|
64
|
+
rcParams.update(
|
|
65
|
+
{
|
|
66
|
+
"font.size": 14,
|
|
67
|
+
"axes.titlesize": 18,
|
|
68
|
+
"axes.titleweight": "normal",
|
|
69
|
+
"axes.titlepad": 10,
|
|
70
|
+
"axes.labelsize": 16,
|
|
71
|
+
"axes.labelweight": "normal",
|
|
72
|
+
"axes.labelpad": 8,
|
|
73
|
+
"axes.linewidth": 1,
|
|
74
|
+
"axes.edgecolor": "black",
|
|
75
|
+
"axes.labelcolor": "black",
|
|
76
|
+
"axes.axisbelow": True,
|
|
77
|
+
"axes.grid": False,
|
|
78
|
+
"axes.prop_cycle": mpl.cycler(color=OKABE_ITO),
|
|
79
|
+
"xtick.labelsize": 12,
|
|
80
|
+
"ytick.labelsize": 12,
|
|
81
|
+
"xtick.direction": "in",
|
|
82
|
+
"ytick.direction": "in",
|
|
83
|
+
"xtick.minor.visible": True,
|
|
84
|
+
"ytick.minor.visible": True,
|
|
85
|
+
"xtick.major.width": 1,
|
|
86
|
+
"ytick.major.width": 1,
|
|
87
|
+
"xtick.minor.width": 0.5,
|
|
88
|
+
"ytick.minor.width": 0.5,
|
|
89
|
+
"xtick.major.size": 5,
|
|
90
|
+
"ytick.major.size": 5,
|
|
91
|
+
"xtick.minor.size": 3,
|
|
92
|
+
"ytick.minor.size": 3,
|
|
93
|
+
"xtick.major.pad": 7,
|
|
94
|
+
"ytick.major.pad": 7,
|
|
95
|
+
"xtick.color": "black",
|
|
96
|
+
"ytick.color": "black",
|
|
97
|
+
"figure.figsize": (5, 4),
|
|
98
|
+
"figure.dpi": 100,
|
|
99
|
+
"figure.facecolor": "white",
|
|
100
|
+
"figure.autolayout": False,
|
|
101
|
+
"lines.linewidth": 1.5,
|
|
102
|
+
"lines.markersize": 5,
|
|
103
|
+
"lines.markeredgewidth": 0.5,
|
|
104
|
+
"legend.fontsize": 12,
|
|
105
|
+
"legend.frameon": True,
|
|
106
|
+
"legend.edgecolor": "black",
|
|
107
|
+
"legend.framealpha": 1,
|
|
108
|
+
"legend.loc": "best",
|
|
109
|
+
"savefig.dpi": 600,
|
|
110
|
+
"savefig.bbox": "tight",
|
|
111
|
+
"savefig.pad_inches": 0.05,
|
|
112
|
+
"savefig.transparent": False,
|
|
113
|
+
"savefig.facecolor": "white",
|
|
114
|
+
"image.cmap": "viridis",
|
|
115
|
+
}
|
|
116
|
+
)
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
if __name__ == "__main__":
|
|
120
|
+
if sys.argv[1:] != ["--check"]:
|
|
121
|
+
print("Usage: python style_presets.py --check", file=sys.stderr)
|
|
122
|
+
raise SystemExit(2)
|
|
123
|
+
print(json.dumps(preflight_report(), sort_keys=True))
|