@litfamily/litopencode 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/.gitattributes +8 -0
- package/ATTRIBUTION.md +56 -0
- package/CHANGELOG.md +267 -0
- package/CODE_OF_CONDUCT.md +30 -0
- package/CONTRIBUTING.md +82 -0
- package/LICENSE +21 -0
- package/README-Ko-KR.md +252 -0
- package/README.md +252 -0
- package/SECURITY.md +36 -0
- package/SUPPORT.md +37 -0
- package/bin/litopencode +3 -0
- package/bin/litopencode.cjs +10 -0
- package/dist/activation-managed-prompts.d.ts +2 -0
- package/dist/activation-managed-prompts.js +51 -0
- package/dist/activation-primary-prompts.d.ts +2 -0
- package/dist/activation-primary-prompts.js +176 -0
- package/dist/activation-probe.d.ts +3 -0
- package/dist/activation-probe.js +19 -0
- package/dist/activation-prompt-utils.d.ts +6 -0
- package/dist/activation-prompt-utils.js +36 -0
- package/dist/activation-routing.d.ts +5 -0
- package/dist/activation-routing.js +340 -0
- package/dist/activation-workflow-prompts.d.ts +26 -0
- package/dist/activation-workflow-prompts.js +295 -0
- package/dist/activation.d.ts +24 -0
- package/dist/activation.js +152 -0
- package/dist/agents/defaults.d.ts +15 -0
- package/dist/agents/defaults.js +112 -0
- package/dist/agents/registry.d.ts +65 -0
- package/dist/agents/registry.js +319 -0
- package/dist/agents/specialists.d.ts +49 -0
- package/dist/agents/specialists.js +307 -0
- package/dist/agents/types.d.ts +55 -0
- package/dist/agents/types.js +4 -0
- package/dist/agents.d.ts +4 -0
- package/dist/agents.js +3 -0
- package/dist/benchmark.d.ts +94 -0
- package/dist/benchmark.js +172 -0
- package/dist/bounded-authority-hooks.d.ts +19 -0
- package/dist/bounded-authority-hooks.js +157 -0
- package/dist/bounded-authority.d.ts +184 -0
- package/dist/bounded-authority.js +825 -0
- package/dist/cache-metrics.d.ts +54 -0
- package/dist/cache-metrics.js +81 -0
- package/dist/cli/args.d.ts +5 -0
- package/dist/cli/args.js +415 -0
- package/dist/cli/auto-update.d.ts +117 -0
- package/dist/cli/auto-update.js +604 -0
- package/dist/cli/command-alias-ownership.d.ts +2 -0
- package/dist/cli/command-alias-ownership.js +14 -0
- package/dist/cli/command-aliases.d.ts +12 -0
- package/dist/cli/command-aliases.js +112 -0
- package/dist/cli/doctor.d.ts +2 -0
- package/dist/cli/doctor.js +175 -0
- package/dist/cli/host-capabilities.d.ts +12 -0
- package/dist/cli/host-capabilities.js +25 -0
- package/dist/cli/host-limits.d.ts +21 -0
- package/dist/cli/host-limits.js +83 -0
- package/dist/cli/install-config.d.ts +13 -0
- package/dist/cli/install-config.js +201 -0
- package/dist/cli/install-report.d.ts +2 -0
- package/dist/cli/install-report.js +180 -0
- package/dist/cli/install-tui.d.ts +12 -0
- package/dist/cli/install-tui.js +174 -0
- package/dist/cli/install.d.ts +2 -0
- package/dist/cli/install.js +264 -0
- package/dist/cli/json.d.ts +4 -0
- package/dist/cli/json.js +31 -0
- package/dist/cli/loop.d.ts +3 -0
- package/dist/cli/loop.js +135 -0
- package/dist/cli/lsp-capability.d.ts +17 -0
- package/dist/cli/lsp-capability.js +92 -0
- package/dist/cli/managed-skill-assets.d.ts +23 -0
- package/dist/cli/managed-skill-assets.js +117 -0
- package/dist/cli/model-catalog.d.ts +21 -0
- package/dist/cli/model-catalog.js +107 -0
- package/dist/cli/model-policy.d.ts +3 -0
- package/dist/cli/model-policy.js +143 -0
- package/dist/cli/model-routing.d.ts +5 -0
- package/dist/cli/model-routing.js +208 -0
- package/dist/cli/native-canonical-backup.d.ts +9 -0
- package/dist/cli/native-canonical-backup.js +96 -0
- package/dist/cli/native-canonical-cache.d.ts +9 -0
- package/dist/cli/native-canonical-cache.js +37 -0
- package/dist/cli/native-skill-install.d.ts +2 -0
- package/dist/cli/native-skill-install.js +128 -0
- package/dist/cli/native-skill-integrity.d.ts +25 -0
- package/dist/cli/native-skill-integrity.js +178 -0
- package/dist/cli/native-skill-tree.d.ts +12 -0
- package/dist/cli/native-skill-tree.js +104 -0
- package/dist/cli/native-skills.d.ts +22 -0
- package/dist/cli/native-skills.js +105 -0
- package/dist/cli/plugin-mutation.d.ts +4 -0
- package/dist/cli/plugin-mutation.js +89 -0
- package/dist/cli/scientific-visualization-dependencies.d.ts +18 -0
- package/dist/cli/scientific-visualization-dependencies.js +91 -0
- package/dist/cli/skill-loop.d.ts +3 -0
- package/dist/cli/skill-loop.js +649 -0
- package/dist/cli/types.d.ts +188 -0
- package/dist/cli/types.js +1 -0
- package/dist/cli/update-check.d.ts +2 -0
- package/dist/cli/update-check.js +15 -0
- package/dist/cli/update-notifier.d.ts +70 -0
- package/dist/cli/update-notifier.js +717 -0
- package/dist/cli/vendor-path-migration.d.ts +9 -0
- package/dist/cli/vendor-path-migration.js +96 -0
- package/dist/cli.d.ts +7 -0
- package/dist/cli.js +250 -0
- package/dist/commands.d.ts +331 -0
- package/dist/commands.js +600 -0
- package/dist/config-parser.d.ts +5 -0
- package/dist/config-parser.js +274 -0
- package/dist/config.d.ts +72 -0
- package/dist/config.js +157 -0
- package/dist/deliverable-hedge-guard.d.ts +26 -0
- package/dist/deliverable-hedge-guard.js +302 -0
- package/dist/durable-plan.d.ts +23 -0
- package/dist/durable-plan.js +349 -0
- package/dist/features.d.ts +828 -0
- package/dist/features.js +1109 -0
- package/dist/hooks.d.ts +17 -0
- package/dist/hooks.js +83 -0
- package/dist/ignition.d.ts +14 -0
- package/dist/ignition.js +33 -0
- package/dist/index.d.ts +30 -0
- package/dist/index.js +30 -0
- package/dist/inert-data.d.ts +2 -0
- package/dist/inert-data.js +13 -0
- package/dist/knowledge.d.ts +98 -0
- package/dist/knowledge.js +961 -0
- package/dist/ledger.d.ts +181 -0
- package/dist/ledger.js +1179 -0
- package/dist/lit-fetch-classify.d.ts +8 -0
- package/dist/lit-fetch-classify.js +107 -0
- package/dist/lit-fetch-content.d.ts +2 -0
- package/dist/lit-fetch-content.js +43 -0
- package/dist/lit-fetch-http.d.ts +10 -0
- package/dist/lit-fetch-http.js +82 -0
- package/dist/lit-fetch-result.d.ts +2 -0
- package/dist/lit-fetch-result.js +65 -0
- package/dist/lit-fetch-ssrf.d.ts +9 -0
- package/dist/lit-fetch-ssrf.js +77 -0
- package/dist/lit-fetch-url.d.ts +3 -0
- package/dist/lit-fetch-url.js +28 -0
- package/dist/lit-fetch.d.ts +69 -0
- package/dist/lit-fetch.js +84 -0
- package/dist/lit-mark.d.ts +17 -0
- package/dist/lit-mark.js +129 -0
- package/dist/logger.d.ts +9 -0
- package/dist/logger.js +21 -0
- package/dist/model-route-policy.d.ts +25 -0
- package/dist/model-route-policy.js +129 -0
- package/dist/reader-facing-output.d.ts +3 -0
- package/dist/reader-facing-output.js +28 -0
- package/dist/rules/discovery.d.ts +36 -0
- package/dist/rules/discovery.js +270 -0
- package/dist/rules/engine.d.ts +43 -0
- package/dist/rules/engine.js +236 -0
- package/dist/rules/frontmatter.d.ts +16 -0
- package/dist/rules/frontmatter.js +179 -0
- package/dist/rules/glob.d.ts +12 -0
- package/dist/rules/glob.js +233 -0
- package/dist/rules/hooks.d.ts +25 -0
- package/dist/rules/hooks.js +75 -0
- package/dist/rules/output-style.d.ts +1 -0
- package/dist/rules/output-style.js +20 -0
- package/dist/scientific-visualization-banner.d.ts +1 -0
- package/dist/scientific-visualization-banner.js +2 -0
- package/dist/search-workflow-ideas.d.ts +67 -0
- package/dist/search-workflow-ideas.js +128 -0
- package/dist/secret-shapes.d.ts +9 -0
- package/dist/secret-shapes.js +63 -0
- package/dist/server.d.ts +6 -0
- package/dist/server.js +129 -0
- package/dist/session-lineage.d.ts +8 -0
- package/dist/session-lineage.js +12 -0
- package/dist/skill-loop/apply.d.ts +19 -0
- package/dist/skill-loop/apply.js +483 -0
- package/dist/skill-loop/config.d.ts +50 -0
- package/dist/skill-loop/config.js +215 -0
- package/dist/skill-loop/curator.d.ts +18 -0
- package/dist/skill-loop/curator.js +232 -0
- package/dist/skill-loop/ledger.d.ts +39 -0
- package/dist/skill-loop/ledger.js +344 -0
- package/dist/skill-loop/proposals.d.ts +48 -0
- package/dist/skill-loop/proposals.js +290 -0
- package/dist/skill-loop/storage.d.ts +72 -0
- package/dist/skill-loop/storage.js +817 -0
- package/dist/skill-loop/time.d.ts +2 -0
- package/dist/skill-loop/time.js +23 -0
- package/dist/skill-loop/transaction.d.ts +62 -0
- package/dist/skill-loop/transaction.js +836 -0
- package/dist/skill-loop/usage.d.ts +31 -0
- package/dist/skill-loop/usage.js +146 -0
- package/dist/skill-observer.d.ts +22 -0
- package/dist/skill-observer.js +1154 -0
- package/dist/skill-renames.d.ts +5 -0
- package/dist/skill-renames.js +8 -0
- package/dist/skills.d.ts +307 -0
- package/dist/skills.js +450 -0
- package/dist/stable-identity.d.ts +14 -0
- package/dist/stable-identity.js +15 -0
- package/dist/state.d.ts +25 -0
- package/dist/state.js +38 -0
- package/dist/strict-json.d.ts +2 -0
- package/dist/strict-json.js +94 -0
- package/dist/tool-guards.d.ts +34 -0
- package/dist/tool-guards.js +210 -0
- package/dist/tool-kit.d.ts +32 -0
- package/dist/tool-kit.js +75 -0
- package/dist/tools.d.ts +43 -0
- package/dist/tools.js +381 -0
- package/dist/uiux-visual-catalog.d.ts +50 -0
- package/dist/uiux-visual-catalog.js +103 -0
- package/dist/user-facing-markdown.d.ts +5 -0
- package/dist/user-facing-markdown.js +93 -0
- package/dist/workflow-families.d.ts +16 -0
- package/dist/workflow-families.js +95 -0
- package/docs/assets/cover.webp +0 -0
- package/docs/assets/litopencode-continuity-1600.webp +0 -0
- package/docs/assets/litopencode-ignition-1600.webp +0 -0
- package/docs/assets/readme/badge-license.svg +1 -0
- package/docs/assets/readme/badge-version.svg +1 -0
- package/docs/assets/readme/litopencode-clay-icon.png +0 -0
- package/docs/assets/readme/litopencode-wordmark.svg +5 -0
- package/docs/lit-mark.md +46 -0
- package/docs/migration.md +162 -0
- package/docs/privacy.md +82 -0
- package/docs/reference-Ko-KR.md +309 -0
- package/docs/reference.md +444 -0
- package/output-styles/asd-ste100-ko.md +41 -0
- package/output-styles/asd-ste100.md +40 -0
- package/output-styles/eli5-ko.md +13 -0
- package/output-styles/eli5.md +11 -0
- package/package.json +57 -0
- package/qa/fixtures/litfamily-harness-speed-v1.json +38 -0
- package/qa/harness-speed-contract.mjs +209 -0
- package/qa/harness-speed-v2-contract.mjs +213 -0
- package/qa/harness-speed-verdict.mjs +105 -0
- package/skills/agent-roster/SKILL.md +262 -0
- package/skills/autoconference/LICENSE +21 -0
- package/skills/autoconference/PROVENANCE.md +20 -0
- package/skills/autoconference/SKILL.md +125 -0
- package/skills/autoconference/assets/conference_template.md +76 -0
- package/skills/autoconference/assets/report_template.md +53 -0
- package/skills/autoconference/assets/synthesis_template.md +39 -0
- package/skills/autoconference/modes/analyze.md +255 -0
- package/skills/autoconference/modes/core.md +112 -0
- package/skills/autoconference/modes/debate.md +373 -0
- package/skills/autoconference/modes/plan.md +310 -0
- package/skills/autoconference/modes/resume.md +48 -0
- package/skills/autoconference/modes/ship.md +57 -0
- package/skills/autoconference/modes/survey.md +109 -0
- package/skills/autoconference/references/agent-prompts.md +134 -0
- package/skills/autoconference/references/conference-protocol.md +102 -0
- package/skills/autoconference/references/convergence-guide.md +167 -0
- package/skills/autoconference/references/core-principles.md +83 -0
- package/skills/autoconference/references/crash-recovery.md +104 -0
- package/skills/autoconference/references/results-logging.md +198 -0
- package/skills/autoconference/references/upstream-family-contract.md +130 -0
- package/skills/autoconference/references/visualization-guide.md +105 -0
- package/skills/autoconference/scripts/check_conference.sh +371 -0
- package/skills/autoconference/scripts/init_conference.py +625 -0
- package/skills/autoconference/scripts/style_presets.py +104 -0
- package/skills/autoresearch/LICENSE +21 -0
- package/skills/autoresearch/PROVENANCE.md +20 -0
- package/skills/autoresearch/SKILL.md +131 -0
- package/skills/autoresearch/assets/report_template.md +50 -0
- package/skills/autoresearch/assets/research_template.md +38 -0
- package/skills/autoresearch/assets/results_template.tsv +1 -0
- package/skills/autoresearch/modes/core.md +216 -0
- package/skills/autoresearch/modes/debug.md +235 -0
- package/skills/autoresearch/modes/fix.md +173 -0
- package/skills/autoresearch/modes/learn.md +91 -0
- package/skills/autoresearch/modes/plan.md +291 -0
- package/skills/autoresearch/modes/predict.md +266 -0
- package/skills/autoresearch/modes/reason.md +170 -0
- package/skills/autoresearch/modes/scenario.md +164 -0
- package/skills/autoresearch/modes/security.md +282 -0
- package/skills/autoresearch/modes/ship.md +49 -0
- package/skills/autoresearch/references/core-principles.md +80 -0
- package/skills/autoresearch/references/evaluator-contract.md +126 -0
- package/skills/autoresearch/references/investigation-techniques.md +205 -0
- package/skills/autoresearch/references/owasp-checklist.md +161 -0
- package/skills/autoresearch/references/persona-templates.md +232 -0
- package/skills/autoresearch/references/results-logging.md +96 -0
- package/skills/autoresearch/references/scenario-dimensions.md +178 -0
- package/skills/autoresearch/references/stride-model.md +196 -0
- package/skills/autoresearch/references/stuck-detection.md +107 -0
- package/skills/autoresearch/references/type-checklists.md +163 -0
- package/skills/autoresearch/references/upstream-family-contract.md +125 -0
- package/skills/autoresearch/references/visualization-guide.md +95 -0
- package/skills/autoresearch/scripts/check_progress.sh +272 -0
- package/skills/autoresearch/scripts/init_research.py +330 -0
- package/skills/autoresearch/scripts/run_with_deadline.py +164 -0
- package/skills/autoresearch/scripts/style_presets.py +104 -0
- package/skills/browser-drive/SKILL.md +133 -0
- package/skills/browser-drive/references/snapshot-act-loop.md +37 -0
- package/skills/browser-drive/scripts/capability-probe.mjs +262 -0
- package/skills/comment-checker/SKILL.md +171 -0
- package/skills/debugging/SKILL.md +202 -0
- package/skills/debugging/references/README.md +15 -0
- package/skills/debugging/references/escalation.md +43 -0
- package/skills/debugging/references/runtimes/README.md +17 -0
- package/skills/debugging/references/runtimes/bundled-js-binary.md +44 -0
- package/skills/debugging/references/runtimes/go.md +37 -0
- package/skills/debugging/references/runtimes/native-binary.md +44 -0
- package/skills/debugging/references/runtimes/node.md +43 -0
- package/skills/debugging/references/runtimes/python.md +41 -0
- package/skills/debugging/references/runtimes/rust.md +37 -0
- package/skills/debugging/references/tools.md +72 -0
- package/skills/deep-interview/SKILL.md +201 -0
- package/skills/doctor-installer/SKILL.md +252 -0
- package/skills/durable-litgoal/SKILL.md +248 -0
- package/skills/frontend-ui-ux/SKILL.md +70 -0
- package/skills/frontend-ui-ux/data/LICENSE +21 -0
- package/skills/frontend-ui-ux/data/PROVENANCE.json +1088 -0
- package/skills/frontend-ui-ux/data/THIRD-PARTY-NOTICE.txt +14 -0
- package/skills/frontend-ui-ux/data/design-intelligence.json +1 -0
- package/skills/frontend-ui-ux/references/_canonical-corpus/ATTRIBUTION.md +217 -0
- package/skills/frontend-ui-ux/references/_canonical-corpus/LICENSE +21 -0
- package/skills/frontend-ui-ux/references/_canonical-corpus/LICENSE-Apache-2.0.txt +201 -0
- package/skills/frontend-ui-ux/references/_canonical-corpus/manifest.json +867 -0
- package/skills/frontend-ui-ux/references/adaptive-layout.md +85 -0
- package/skills/frontend-ui-ux/references/brand-and-imagery.md +79 -0
- package/skills/frontend-ui-ux/references/complete-contract.md +282 -0
- package/skills/frontend-ui-ux/references/composition.md +87 -0
- package/skills/frontend-ui-ux/references/creative-directions.md +83 -0
- package/skills/frontend-ui-ux/references/design/README.md +248 -0
- package/skills/frontend-ui-ux/references/design/_INDEX.md +191 -0
- package/skills/frontend-ui-ux/references/design/airbnb.md +393 -0
- package/skills/frontend-ui-ux/references/design/airtable.md +92 -0
- package/skills/frontend-ui-ux/references/design/apple.md +250 -0
- package/skills/frontend-ui-ux/references/design/aside.md +209 -0
- package/skills/frontend-ui-ux/references/design/binance.md +348 -0
- package/skills/frontend-ui-ux/references/design/bmw.md +183 -0
- package/skills/frontend-ui-ux/references/design/brutalist-skill.md +92 -0
- package/skills/frontend-ui-ux/references/design/bugatti.md +271 -0
- package/skills/frontend-ui-ux/references/design/cal.md +262 -0
- package/skills/frontend-ui-ux/references/design/claude.md +315 -0
- package/skills/frontend-ui-ux/references/design/clay.md +307 -0
- package/skills/frontend-ui-ux/references/design/clickhouse.md +284 -0
- package/skills/frontend-ui-ux/references/design/clone-from-url.md +65 -0
- package/skills/frontend-ui-ux/references/design/cohere.md +269 -0
- package/skills/frontend-ui-ux/references/design/coinbase.md +132 -0
- package/skills/frontend-ui-ux/references/design/composio.md +310 -0
- package/skills/frontend-ui-ux/references/design/cursor.md +312 -0
- package/skills/frontend-ui-ux/references/design/design-system-architecture.md +244 -0
- package/skills/frontend-ui-ux/references/design/elevenlabs.md +268 -0
- package/skills/frontend-ui-ux/references/design/expo.md +284 -0
- package/skills/frontend-ui-ux/references/design/ferrari.md +317 -0
- package/skills/frontend-ui-ux/references/design/figma.md +223 -0
- package/skills/frontend-ui-ux/references/design/framer.md +249 -0
- package/skills/frontend-ui-ux/references/design/gpt-tasteskill.md +74 -0
- package/skills/frontend-ui-ux/references/design/hashicorp.md +281 -0
- package/skills/frontend-ui-ux/references/design/ibm.md +335 -0
- package/skills/frontend-ui-ux/references/design/image-to-code-skill.md +1228 -0
- package/skills/frontend-ui-ux/references/design/imagegen-brandkit.md +798 -0
- package/skills/frontend-ui-ux/references/design/imagegen-frontend-mobile.md +1465 -0
- package/skills/frontend-ui-ux/references/design/imagegen-frontend-web.md +987 -0
- package/skills/frontend-ui-ux/references/design/intercom.md +149 -0
- package/skills/frontend-ui-ux/references/design/kraken.md +128 -0
- package/skills/frontend-ui-ux/references/design/lamborghini.md +291 -0
- package/skills/frontend-ui-ux/references/design/layout-skill.md +107 -0
- package/skills/frontend-ui-ux/references/design/lazyweb.md +77 -0
- package/skills/frontend-ui-ux/references/design/linear.app.md +370 -0
- package/skills/frontend-ui-ux/references/design/lovable.md +301 -0
- package/skills/frontend-ui-ux/references/design/mastercard.md +368 -0
- package/skills/frontend-ui-ux/references/design/meta.md +369 -0
- package/skills/frontend-ui-ux/references/design/minimalist-skill.md +85 -0
- package/skills/frontend-ui-ux/references/design/minimax.md +260 -0
- package/skills/frontend-ui-ux/references/design/mintlify.md +329 -0
- package/skills/frontend-ui-ux/references/design/miro.md +111 -0
- package/skills/frontend-ui-ux/references/design/mistral.ai.md +264 -0
- package/skills/frontend-ui-ux/references/design/mongodb.md +269 -0
- package/skills/frontend-ui-ux/references/design/nike.md +366 -0
- package/skills/frontend-ui-ux/references/design/notion.md +312 -0
- package/skills/frontend-ui-ux/references/design/nvidia.md +296 -0
- package/skills/frontend-ui-ux/references/design/ollama.md +270 -0
- package/skills/frontend-ui-ux/references/design/opencode.ai.md +284 -0
- package/skills/frontend-ui-ux/references/design/output-skill.md +49 -0
- package/skills/frontend-ui-ux/references/design/pinterest.md +233 -0
- package/skills/frontend-ui-ux/references/design/playstation.md +367 -0
- package/skills/frontend-ui-ux/references/design/posthog.md +259 -0
- package/skills/frontend-ui-ux/references/design/raycast.md +271 -0
- package/skills/frontend-ui-ux/references/design/react-dev-tooling-skill.md +230 -0
- package/skills/frontend-ui-ux/references/design/redesign-skill.md +178 -0
- package/skills/frontend-ui-ux/references/design/renault.md +314 -0
- package/skills/frontend-ui-ux/references/design/replicate.md +264 -0
- package/skills/frontend-ui-ux/references/design/resend.md +306 -0
- package/skills/frontend-ui-ux/references/design/revolut.md +188 -0
- package/skills/frontend-ui-ux/references/design/runwayml.md +247 -0
- package/skills/frontend-ui-ux/references/design/sanity.md +360 -0
- package/skills/frontend-ui-ux/references/design/sentry.md +265 -0
- package/skills/frontend-ui-ux/references/design/shopify.md +353 -0
- package/skills/frontend-ui-ux/references/design/soft-skill.md +98 -0
- package/skills/frontend-ui-ux/references/design/spacex.md +197 -0
- package/skills/frontend-ui-ux/references/design/spotify.md +249 -0
- package/skills/frontend-ui-ux/references/design/starbucks.md +583 -0
- package/skills/frontend-ui-ux/references/design/stitch-design-example.md +121 -0
- package/skills/frontend-ui-ux/references/design/stitch-skill.md +184 -0
- package/skills/frontend-ui-ux/references/design/stripe.md +325 -0
- package/skills/frontend-ui-ux/references/design/supabase.md +258 -0
- package/skills/frontend-ui-ux/references/design/superhuman.md +255 -0
- package/skills/frontend-ui-ux/references/design/taste-skill.md +1206 -0
- package/skills/frontend-ui-ux/references/design/tesla.md +289 -0
- package/skills/frontend-ui-ux/references/design/theverge.md +342 -0
- package/skills/frontend-ui-ux/references/design/together.ai.md +266 -0
- package/skills/frontend-ui-ux/references/design/uber.md +298 -0
- package/skills/frontend-ui-ux/references/design/vercel.md +313 -0
- package/skills/frontend-ui-ux/references/design/vodafone.md +426 -0
- package/skills/frontend-ui-ux/references/design/voltagent.md +326 -0
- package/skills/frontend-ui-ux/references/design/warp.md +256 -0
- package/skills/frontend-ui-ux/references/design/webflow.md +95 -0
- package/skills/frontend-ui-ux/references/design/wired.md +281 -0
- package/skills/frontend-ui-ux/references/design/wise.md +176 -0
- package/skills/frontend-ui-ux/references/design/x.ai.md +260 -0
- package/skills/frontend-ui-ux/references/design/zapier.md +331 -0
- package/skills/frontend-ui-ux/references/designpowers/EVIDENCE.md +97 -0
- package/skills/frontend-ui-ux/references/designpowers/README.md +48 -0
- package/skills/frontend-ui-ux/references/designpowers/UPSTREAM.md +80 -0
- package/skills/frontend-ui-ux/references/designpowers/lane-a-direction.md +64 -0
- package/skills/frontend-ui-ux/references/designpowers/lane-b-execution.md +65 -0
- package/skills/frontend-ui-ux/references/designpowers/lane-c-review.md +65 -0
- package/skills/frontend-ui-ux/references/designpowers/lane-d-memory.md +83 -0
- package/skills/frontend-ui-ux/references/designpowers/orchestration.md +80 -0
- package/skills/frontend-ui-ux/references/designpowers/routing.md +79 -0
- package/skills/frontend-ui-ux/references/designpowers/vendor/LICENSE +21 -0
- package/skills/frontend-ui-ux/references/designpowers/vendor/agents/accessibility-reviewer.md +83 -0
- package/skills/frontend-ui-ux/references/designpowers/vendor/agents/content-writer.md +132 -0
- package/skills/frontend-ui-ux/references/designpowers/vendor/agents/design-builder.md +109 -0
- package/skills/frontend-ui-ux/references/designpowers/vendor/agents/design-critic.md +89 -0
- package/skills/frontend-ui-ux/references/designpowers/vendor/agents/design-lead.md +113 -0
- package/skills/frontend-ui-ux/references/designpowers/vendor/agents/design-scout.md +78 -0
- package/skills/frontend-ui-ux/references/designpowers/vendor/agents/design-strategist.md +121 -0
- package/skills/frontend-ui-ux/references/designpowers/vendor/agents/heuristic-evaluator.md +268 -0
- package/skills/frontend-ui-ux/references/designpowers/vendor/agents/inspiration-scout.md +107 -0
- package/skills/frontend-ui-ux/references/designpowers/vendor/agents/motion-designer.md +120 -0
- package/skills/frontend-ui-ux/references/designpowers/vendor/skills/accessible-content/reference.md +101 -0
- package/skills/frontend-ui-ux/references/designpowers/vendor/skills/adaptive-interfaces/reference.md +109 -0
- package/skills/frontend-ui-ux/references/designpowers/vendor/skills/cognitive-accessibility/reference.md +107 -0
- package/skills/frontend-ui-ux/references/designpowers/vendor/skills/design-debate/reference.md +199 -0
- package/skills/frontend-ui-ux/references/designpowers/vendor/skills/design-debt-tracker/reference.md +174 -0
- package/skills/frontend-ui-ux/references/designpowers/vendor/skills/design-handoff/reference.md +125 -0
- package/skills/frontend-ui-ux/references/designpowers/vendor/skills/design-md/reference.md +106 -0
- package/skills/frontend-ui-ux/references/designpowers/vendor/skills/design-retrospective/reference.md +266 -0
- package/skills/frontend-ui-ux/references/designpowers/vendor/skills/design-review/reference.md +123 -0
- package/skills/frontend-ui-ux/references/designpowers/vendor/skills/design-system-alignment/reference.md +120 -0
- package/skills/frontend-ui-ux/references/designpowers/vendor/skills/designpowers-critique/reference.md +164 -0
- package/skills/frontend-ui-ux/references/designpowers/vendor/skills/heuristic-evaluation/reference.md +85 -0
- package/skills/frontend-ui-ux/references/designpowers/vendor/skills/inclusive-personas/reference.md +98 -0
- package/skills/frontend-ui-ux/references/designpowers/vendor/skills/inspiration-scouting/reference.md +165 -0
- package/skills/frontend-ui-ux/references/designpowers/vendor/skills/interaction-design/reference.md +122 -0
- package/skills/frontend-ui-ux/references/designpowers/vendor/skills/motion-choreography/reference.md +81 -0
- package/skills/frontend-ui-ux/references/designpowers/vendor/skills/research-planning/reference.md +96 -0
- package/skills/frontend-ui-ux/references/designpowers/vendor/skills/responsive-patterns/reference.md +77 -0
- package/skills/frontend-ui-ux/references/designpowers/vendor/skills/synthetic-user-testing/reference.md +192 -0
- package/skills/frontend-ui-ux/references/designpowers/vendor/skills/taste-feedback/reference.md +165 -0
- package/skills/frontend-ui-ux/references/designpowers/vendor/skills/taste-report/reference.md +78 -0
- package/skills/frontend-ui-ux/references/designpowers/vendor/skills/token-architecture/reference.md +75 -0
- package/skills/frontend-ui-ux/references/designpowers/vendor/skills/ui-composition/reference.md +117 -0
- package/skills/frontend-ui-ux/references/designpowers/vendor/skills/usability-testing/reference.md +78 -0
- package/skills/frontend-ui-ux/references/designpowers/vendor/skills/verification-before-shipping/reference.md +125 -0
- package/skills/frontend-ui-ux/references/designpowers/vendor/skills/voice-and-tone/reference.md +79 -0
- package/skills/frontend-ui-ux/references/designpowers/vendor/skills/writing-design-plans/reference.md +119 -0
- package/skills/frontend-ui-ux/references/evidence-review.md +103 -0
- package/skills/frontend-ui-ux/references/implementation-platforms.md +94 -0
- package/skills/frontend-ui-ux/references/inclusive-interface.md +85 -0
- package/skills/frontend-ui-ux/references/interaction-motion.md +93 -0
- package/skills/frontend-ui-ux/references/operating-lanes.md +80 -0
- package/skills/frontend-ui-ux/references/perfection/README.md +160 -0
- package/skills/frontend-ui-ux/references/perfection/react-perf-tooling.md +127 -0
- package/skills/frontend-ui-ux/references/performance-delivery.md +77 -0
- package/skills/frontend-ui-ux/references/product-direction.md +84 -0
- package/skills/frontend-ui-ux/references/redesign-playbook.md +88 -0
- package/skills/frontend-ui-ux/references/system-foundations.md +86 -0
- package/skills/frontend-ui-ux/references/taste-direction.md +55 -0
- package/skills/frontend-ui-ux/references/ui-ux-db/README.md +659 -0
- package/skills/frontend-ui-ux/references/ui-ux-db/data/charts.csv +26 -0
- package/skills/frontend-ui-ux/references/ui-ux-db/data/colors.csv +162 -0
- package/skills/frontend-ui-ux/references/ui-ux-db/data/icons.csv +106 -0
- package/skills/frontend-ui-ux/references/ui-ux-db/data/landing.csv +35 -0
- package/skills/frontend-ui-ux/references/ui-ux-db/data/products.csv +162 -0
- package/skills/frontend-ui-ux/references/ui-ux-db/data/react-performance.csv +45 -0
- package/skills/frontend-ui-ux/references/ui-ux-db/data/stacks/astro.csv +54 -0
- package/skills/frontend-ui-ux/references/ui-ux-db/data/stacks/flutter.csv +53 -0
- package/skills/frontend-ui-ux/references/ui-ux-db/data/stacks/html-tailwind.csv +56 -0
- package/skills/frontend-ui-ux/references/ui-ux-db/data/stacks/jetpack-compose.csv +53 -0
- package/skills/frontend-ui-ux/references/ui-ux-db/data/stacks/nextjs.csv +53 -0
- package/skills/frontend-ui-ux/references/ui-ux-db/data/stacks/nuxt-ui.csv +51 -0
- package/skills/frontend-ui-ux/references/ui-ux-db/data/stacks/nuxtjs.csv +59 -0
- package/skills/frontend-ui-ux/references/ui-ux-db/data/stacks/react-native.csv +52 -0
- package/skills/frontend-ui-ux/references/ui-ux-db/data/stacks/react.csv +54 -0
- package/skills/frontend-ui-ux/references/ui-ux-db/data/stacks/shadcn.csv +61 -0
- package/skills/frontend-ui-ux/references/ui-ux-db/data/stacks/svelte.csv +54 -0
- package/skills/frontend-ui-ux/references/ui-ux-db/data/stacks/swiftui.csv +51 -0
- package/skills/frontend-ui-ux/references/ui-ux-db/data/stacks/vue.csv +50 -0
- package/skills/frontend-ui-ux/references/ui-ux-db/data/styles.csv +85 -0
- package/skills/frontend-ui-ux/references/ui-ux-db/data/typography.csv +74 -0
- package/skills/frontend-ui-ux/references/ui-ux-db/data/ui-reasoning.csv +162 -0
- package/skills/frontend-ui-ux/references/ui-ux-db/data/ux-guidelines.csv +100 -0
- package/skills/frontend-ui-ux/references/ui-ux-db/data/web-interface.csv +31 -0
- package/skills/frontend-ui-ux/references/ui-ux-db/scripts/core.py +262 -0
- package/skills/frontend-ui-ux/references/ui-ux-db/scripts/design_system.py +1148 -0
- package/skills/frontend-ui-ux/references/ui-ux-db/scripts/search.py +114 -0
- package/skills/frontend-ui-ux/references/visual-language.md +84 -0
- package/skills/frontend-ui-ux/references/visual-reconstruction.md +87 -0
- package/skills/frontend-ui-ux/schemas/design-contract-v1alpha1.json +570 -0
- package/skills/frontend-ui-ux/schemas/design-contract-v1beta1.json +32 -0
- package/skills/frontend-ui-ux/schemas/design-contract-v1beta2.json +34 -0
- package/skills/frontend-ui-ux/scripts/bounded-json.mjs +45 -0
- package/skills/frontend-ui-ux/scripts/canonical-json.mjs +26 -0
- package/skills/frontend-ui-ux/scripts/contract-error.mjs +15 -0
- package/skills/frontend-ui-ux/scripts/csv.mjs +64 -0
- package/skills/frontend-ui-ux/scripts/dataset.mjs +65 -0
- package/skills/frontend-ui-ux/scripts/design-contract.mjs +609 -0
- package/skills/frontend-ui-ux/scripts/import-design-intelligence.mjs +193 -0
- package/skills/frontend-ui-ux/scripts/retrieval.mjs +92 -0
- package/skills/frontend-ui-ux/scripts/stable-file-read.mjs +237 -0
- package/skills/frontend-ui-ux/scripts/stdin-json.mjs +16 -0
- package/skills/frontend-ui-ux/scripts/strict-json.mjs +102 -0
- package/skills/frontend-ui-ux/scripts/uiux.mjs +86 -0
- package/skills/frontend-ui-ux/scripts/verify-canonical-corpus.mjs +266 -0
- package/skills/lit-burnoff/SKILL.md +227 -0
- package/skills/lit-burnoff-file/SKILL.md +175 -0
- package/skills/lit-code/SKILL.md +266 -0
- package/skills/lit-code/references/README.md +18 -0
- package/skills/lit-code/references/go/README.md +12 -0
- package/skills/lit-code/references/go/concurrency.md +42 -0
- package/skills/lit-code/references/go/error-handling.md +47 -0
- package/skills/lit-code/references/go/testing.md +55 -0
- package/skills/lit-code/references/go/tooling.md +35 -0
- package/skills/lit-code/references/go/type-patterns.md +50 -0
- package/skills/lit-code/references/python/README.md +12 -0
- package/skills/lit-code/references/python/async.md +50 -0
- package/skills/lit-code/references/python/error-handling.md +44 -0
- package/skills/lit-code/references/python/testing.md +50 -0
- package/skills/lit-code/references/python/tooling.md +38 -0
- package/skills/lit-code/references/python/type-patterns.md +46 -0
- package/skills/lit-code/references/rust/README.md +12 -0
- package/skills/lit-code/references/rust/concurrency.md +45 -0
- package/skills/lit-code/references/rust/error-handling.md +43 -0
- package/skills/lit-code/references/rust/tooling.md +36 -0
- package/skills/lit-code/references/rust/type-patterns.md +46 -0
- package/skills/lit-code/references/rust/unsafe.md +47 -0
- package/skills/lit-code/references/typescript/README.md +11 -0
- package/skills/lit-code/references/typescript/error-handling.md +56 -0
- package/skills/lit-code/references/typescript/testing.md +42 -0
- package/skills/lit-code/references/typescript/tsconfig-strict.md +40 -0
- package/skills/lit-code/references/typescript/type-patterns.md +60 -0
- package/skills/lit-commit/SKILL.md +222 -0
- package/skills/lit-comprehend/SKILL.md +278 -0
- package/skills/lit-comprehend/assets/explainer-scaffold.html +104 -0
- package/skills/lit-comprehend/references/artifact-template.md +114 -0
- package/skills/lit-comprehend/references/micro-worlds.md +115 -0
- package/skills/lit-comprehend/scripts/verify-explainer.ts +339 -0
- package/skills/lit-crucible/SKILL.md +212 -0
- package/skills/lit-fetch/SKILL.md +242 -0
- package/skills/lit-handoff/SKILL.md +199 -0
- package/skills/lit-init/SKILL.md +214 -0
- package/skills/lit-korean/SKILL.md +231 -0
- package/skills/lit-plan/SKILL.md +351 -0
- package/skills/lit-plan/scripts/scaffold-plan.mjs +275 -0
- package/skills/lit-recap/SKILL.md +233 -0
- package/skills/lit-scientific-visualization/SKILL.md +175 -0
- package/skills/litresearch/SKILL.md +436 -0
- package/skills/litwork/SKILL.md +227 -0
- package/skills/lsp/SKILL.md +186 -0
- package/skills/lsp-setup/SKILL.md +187 -0
- package/skills/lsp-setup/references/README.md +40 -0
- package/skills/lsp-setup/references/bash.md +31 -0
- package/skills/lsp-setup/references/c-cpp.md +43 -0
- package/skills/lsp-setup/references/csharp.md +29 -0
- package/skills/lsp-setup/references/dart.md +25 -0
- package/skills/lsp-setup/references/elixir.md +30 -0
- package/skills/lsp-setup/references/go.md +33 -0
- package/skills/lsp-setup/references/haskell.md +27 -0
- package/skills/lsp-setup/references/java.md +28 -0
- package/skills/lsp-setup/references/julia.md +28 -0
- package/skills/lsp-setup/references/kotlin.md +25 -0
- package/skills/lsp-setup/references/lua.md +26 -0
- package/skills/lsp-setup/references/php.md +30 -0
- package/skills/lsp-setup/references/python.md +33 -0
- package/skills/lsp-setup/references/ruby.md +34 -0
- package/skills/lsp-setup/references/rust.md +34 -0
- package/skills/lsp-setup/references/swift.md +26 -0
- package/skills/lsp-setup/references/terraform.md +26 -0
- package/skills/lsp-setup/references/typescript.md +35 -0
- package/skills/lsp-setup/references/yaml.md +27 -0
- package/skills/lsp-setup/references/zig.md +28 -0
- package/skills/managed-skill-manifest.json +1386 -0
- package/skills/native-goal-verdict/SKILL.md +216 -0
- package/skills/refactor/SKILL.md +221 -0
- package/skills/reference-benchmark-claims/SKILL.md +204 -0
- package/skills/release-guardrails/SKILL.md +245 -0
- package/skills/review-work/SKILL.md +301 -0
- package/skills/rules/SKILL.md +196 -0
- package/skills/search-workflow-ideas/SKILL.md +223 -0
- package/skills/skill-observer/SKILL.md +148 -0
- package/skills/skill-observer/references/review-contract.md +95 -0
- package/skills/skill-rename-aliases.json +10 -0
- package/skills/start-work/SKILL.md +334 -0
- package/skills/structural-search/SKILL.md +234 -0
- package/skills/tool-guards/SKILL.md +223 -0
- package/skills/visual-qa/SKILL.md +61 -0
- package/skills/visual-qa/references/capture-playbook.md +105 -0
- package/skills/visual-qa/references/complete-contract.md +411 -0
- package/skills/visual-qa/schemas/evidence-manifest-v1alpha1.json +201 -0
- package/skills/visual-qa/schemas/evidence-manifest-v1beta1.json +141 -0
- package/skills/visual-qa/schemas/review-receipt-v1alpha1.json +113 -0
- package/skills/visual-qa/scripts/artifact.mjs +123 -0
- package/skills/visual-qa/scripts/bounded-json.mjs +47 -0
- package/skills/visual-qa/scripts/canonical-json.mjs +28 -0
- package/skills/visual-qa/scripts/capabilities.mjs +66 -0
- package/skills/visual-qa/scripts/contract-text.mjs +15 -0
- package/skills/visual-qa/scripts/design-contract.mjs +611 -0
- package/skills/visual-qa/scripts/evidence-evaluate.mjs +521 -0
- package/skills/visual-qa/scripts/evidence.mjs +271 -0
- package/skills/visual-qa/scripts/png-decode.mjs +146 -0
- package/skills/visual-qa/scripts/png.mjs +154 -0
- package/skills/visual-qa/scripts/review.mjs +188 -0
- package/skills/visual-qa/scripts/stdin-json.mjs +16 -0
- package/skills/visual-qa/scripts/strict-json.mjs +102 -0
- package/skills/visual-qa/scripts/tui.mjs +149 -0
- package/skills/visual-qa/scripts/visual-qa.mjs +90 -0
- package/skills/wikify/LICENSE +21 -0
- package/skills/wikify/PROVENANCE.md +18 -0
- package/skills/wikify/SKILL.md +176 -0
- package/skills/wikify/assets/home-template.md +44 -0
- package/skills/wikify/assets/maintenance-report-template.md +46 -0
- package/skills/wikify/assets/paper-source-note-template.md +137 -0
- package/skills/wikify/assets/source-note-template.md +45 -0
- package/skills/wikify/assets/wiki-rules-template.md +117 -0
- package/skills/wikify/modes/ingest.md +57 -0
- package/skills/wikify/modes/init.md +44 -0
- package/skills/wikify/modes/lint.md +60 -0
- package/skills/wikify/modes/query.md +38 -0
- package/skills/wikify/modes/save.md +45 -0
- package/skills/wikify/references-upstream-contract.md +758 -0
- package/skills/workflow-loop/SKILL.md +387 -0
- package/tools/check-pack-payload.mjs +410 -0
- package/tools/check-payload-substance.mjs +738 -0
- package/tools/check-version-lockstep.mjs +238 -0
- package/tools/gen-canonical-frontend-manifest.mjs +66 -0
- package/tools/gen-managed-skill-manifest.mjs +135 -0
- package/tools/harness-speed-local.mjs +261 -0
- package/tools/payload-reference-exemptions.json +49 -0
- package/tools/payload-substance-allowlist.json +46 -0
- package/tools/payload-substance-parity.json +571 -0
- package/tools/qa-real-surface-fixtures.mjs +428 -0
- package/tools/qa-real-surface-harness.mjs +173 -0
- package/tools/run-behavior-replacement-probes.mjs +296 -0
- package/tools/run-build.mjs +101 -0
- package/tools/run-harness-speed-local.mjs +52 -0
- package/tools/run-harness-speed-v2.mjs +36 -0
- package/tools/run-installed-resource-tamper-probe.mjs +62 -0
- package/tools/run-negative-gate-matrix.mjs +516 -0
- package/tools/run-rules-glob-differential.mjs +232 -0
- package/tools/run-typecheck.mjs +25 -0
- package/tools/run-uiux-visual-qa-scenarios.mjs +234 -0
- package/tools/run-wikify-surface-probe.mjs +170 -0
- package/tools/scan-legacy-tokens.mjs +431 -0
- package/tools/version-manifests.json +60 -0
- package/tsconfig.build.json +12 -0
- package/tsconfig.json +13 -0
- package/vendor/NOTICE.md +21 -0
- package/vendor/handoff/SKILL.md +199 -0
- package/vendor/handoff/evals/evals.json +154 -0
- package/vendor/handoff/examples/HANDOFF-example-generic-auth-refactor.md +97 -0
- package/vendor/handoff/templates/HANDOFF.md +121 -0
- package/vendor/licenses/022_handoff-MIT.txt +21 -0
- package/vendor/licenses/045_scientific-visualization-MIT.txt +21 -0
- package/vendor/provenance/022_handoff.md +19 -0
- package/vendor/provenance/045_scientific-visualization.md +36 -0
- package/vendor/scientific-visualization/SKILL.md +283 -0
- package/vendor/scientific-visualization/assets/color_palettes.py +197 -0
- package/vendor/scientific-visualization/assets/nature.mplstyle +75 -0
- package/vendor/scientific-visualization/assets/presentation.mplstyle +74 -0
- package/vendor/scientific-visualization/assets/publication.mplstyle +78 -0
- package/vendor/scientific-visualization/evals/evals.json +158 -0
- package/vendor/scientific-visualization/references/color_palettes.md +380 -0
- package/vendor/scientific-visualization/references/journal_requirements.md +359 -0
- package/vendor/scientific-visualization/references/matplotlib_examples.md +608 -0
- package/vendor/scientific-visualization/references/mdanalysis_martini_visualization.md +85 -0
- package/vendor/scientific-visualization/references/publication_guidelines.md +217 -0
- package/vendor/scientific-visualization/references/seaborn_for_publications.md +293 -0
- package/vendor/scientific-visualization/scripts/figure_export.py +238 -0
- package/vendor/scientific-visualization/scripts/style_presets.py +467 -0
- package/vendor/scientific-visualization/tests/test_figure_export.py +51 -0
- package/vendor/scientific-visualization/tests/test_style_presets.py +114 -0
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<!-- LitOpenCode comprehend explainer scaffold -->
|
|
3
|
+
<html lang="ko">
|
|
4
|
+
<head>
|
|
5
|
+
<meta charset="utf-8">
|
|
6
|
+
<meta name="viewport" content="width=device-width,initial-scale=1">
|
|
7
|
+
<title>__TITLE__</title>
|
|
8
|
+
<style>
|
|
9
|
+
*,*::before,*::after{box-sizing:border-box}
|
|
10
|
+
:root{--bg:#faf8f5;--fg:#1a1a1a;--accent:#8a5a2b;--muted:#6b5e50;
|
|
11
|
+
--border:#d4c8bb;--code-bg:#f0ebe4;--ok:#2d7a3a;--warn:#b07d20;--bad:#b33;
|
|
12
|
+
--quiz-bg:#eee8df;--world-bg:#f5f0e8}
|
|
13
|
+
@media(prefers-color-scheme:dark){
|
|
14
|
+
:root{--bg:#1c1a17;--fg:#e8e0d4;--accent:#d4a064;--muted:#a89880;
|
|
15
|
+
--border:#3a342c;--code-bg:#26231e;--ok:#5cb86c;--warn:#d4a030;--bad:#e66;
|
|
16
|
+
--quiz-bg:#28241e;--world-bg:#24211c}
|
|
17
|
+
}
|
|
18
|
+
body{font-family:-apple-system,BlinkMacSystemFont,"Pretendard","Segoe UI","Noto Sans KR",sans-serif;
|
|
19
|
+
background:var(--bg);color:var(--fg);line-height:1.65;margin:0;padding:0}
|
|
20
|
+
.wrap{max-width:52rem;margin:0 auto;padding:1.5rem 1.25rem}
|
|
21
|
+
.doc h1{font-size:1.6rem;color:var(--accent);border-bottom:2px solid var(--border);padding-bottom:.4rem}
|
|
22
|
+
.doc h2{font-size:1.25rem;margin-top:2.2rem;color:var(--accent)}
|
|
23
|
+
.doc h3{font-size:1.05rem;margin-top:1.5rem}
|
|
24
|
+
.doc h4{font-size:.95rem;margin-top:1rem;color:var(--muted)}
|
|
25
|
+
.toc{background:var(--code-bg);border:1px solid var(--border);border-radius:6px;padding:.8rem 1.2rem;margin:1.2rem 0}
|
|
26
|
+
.toc a{color:var(--accent);text-decoration:none}
|
|
27
|
+
.toc a:hover{text-decoration:underline}
|
|
28
|
+
pre,code{font-family:"Fira Code","JetBrains Mono","SF Mono",monospace;font-size:.88rem}
|
|
29
|
+
pre{background:var(--code-bg);border:1px solid var(--border);border-radius:4px;padding:.8rem 1rem;
|
|
30
|
+
overflow-x:auto;white-space:pre;line-height:1.5}
|
|
31
|
+
code{background:var(--code-bg);padding:.15rem .35rem;border-radius:3px}
|
|
32
|
+
pre code{background:none;padding:0}
|
|
33
|
+
.add{color:var(--ok);font-weight:600}
|
|
34
|
+
.del{color:var(--bad);text-decoration:line-through}
|
|
35
|
+
.note{border-left:3px solid var(--border);padding:.5rem .8rem;margin:.8rem 0;border-radius:0 4px 4px 0;font-size:.9rem}
|
|
36
|
+
.note.ok{border-color:var(--ok);background:color-mix(in srgb,var(--ok) 8%,transparent)}
|
|
37
|
+
.note.warn{border-color:var(--warn);background:color-mix(in srgb,var(--warn) 8%,transparent)}
|
|
38
|
+
.note.bad{border-color:var(--bad);background:color-mix(in srgb,var(--bad) 8%,transparent)}
|
|
39
|
+
.skippable{opacity:.7;font-size:.9rem}
|
|
40
|
+
.pipe{display:flex;gap:.5rem;align-items:center;flex-wrap:wrap;margin:.8rem 0}
|
|
41
|
+
.pipe .box,.box{background:var(--code-bg);border:1px solid var(--border);border-radius:4px;padding:.4rem .8rem;font-size:.88rem}
|
|
42
|
+
.pipe .box::after{content:"\2192";margin-left:.5rem;color:var(--muted)}
|
|
43
|
+
.pipe .box:last-child::after{content:""}
|
|
44
|
+
.box.done{background:color-mix(in srgb,var(--ok) 15%,var(--code-bg));border-color:var(--ok)}
|
|
45
|
+
.box.active{background:color-mix(in srgb,var(--accent) 15%,var(--code-bg));border-color:var(--accent)}
|
|
46
|
+
.ba{display:grid;grid-template-columns:1fr 1fr;gap:1rem;margin:.8rem 0}
|
|
47
|
+
@media(max-width:40rem){.ba{grid-template-columns:1fr}}
|
|
48
|
+
.world{background:var(--world-bg);border:1px solid var(--border);border-radius:6px;padding:1rem;margin:1rem 0}
|
|
49
|
+
.world input[type="range"]{width:100%;max-width:20rem}
|
|
50
|
+
.scroll-x{overflow-x:auto}
|
|
51
|
+
table{border-collapse:collapse;width:100%;font-size:.9rem}
|
|
52
|
+
th,td{border:1px solid var(--border);padding:.4rem .6rem;text-align:left}
|
|
53
|
+
th{background:var(--code-bg)}
|
|
54
|
+
.quiz-q{background:var(--quiz-bg);border:1px solid var(--border);border-radius:6px;padding:1rem;margin:1rem 0}
|
|
55
|
+
.quiz-q h4{margin-top:0}
|
|
56
|
+
.opt{display:block;margin:.3rem 0;padding:.4rem .6rem;border:1px solid var(--border);border-radius:4px;
|
|
57
|
+
cursor:pointer;transition:background .15s}
|
|
58
|
+
.opt:hover{background:color-mix(in srgb,var(--accent) 10%,transparent)}
|
|
59
|
+
.opt.correct{background:color-mix(in srgb,var(--ok) 15%,transparent);border-color:var(--ok)}
|
|
60
|
+
.opt.wrong{background:color-mix(in srgb,var(--bad) 10%,transparent);border-color:var(--bad)}
|
|
61
|
+
.fb{display:none;margin:.3rem 0 .3rem 1rem;padding:.3rem .6rem;font-size:.88rem;
|
|
62
|
+
border-left:2px solid var(--muted);color:var(--muted)}
|
|
63
|
+
.fb.show{display:block}
|
|
64
|
+
#quiz-score{font-weight:600;color:var(--accent);margin-top:.8rem}
|
|
65
|
+
</style>
|
|
66
|
+
</head>
|
|
67
|
+
<body>
|
|
68
|
+
<div class="wrap doc">
|
|
69
|
+
|
|
70
|
+
<h1>__TITLE__</h1>
|
|
71
|
+
<p>__SUBTITLE__</p>
|
|
72
|
+
|
|
73
|
+
__TOC__
|
|
74
|
+
|
|
75
|
+
__CONTENT__
|
|
76
|
+
|
|
77
|
+
<div id="quiz-score"></div>
|
|
78
|
+
|
|
79
|
+
</div>
|
|
80
|
+
<script>
|
|
81
|
+
(()=>{
|
|
82
|
+
let answered=0,correct=0;
|
|
83
|
+
const total=document.querySelectorAll('.quiz-q').length;
|
|
84
|
+
document.querySelectorAll('.quiz-q').forEach(q=>{
|
|
85
|
+
const answer=q.dataset.answer;
|
|
86
|
+
let done=false;
|
|
87
|
+
q.querySelectorAll('.opt').forEach(o=>{
|
|
88
|
+
o.addEventListener('click',()=>{
|
|
89
|
+
if(done)return;
|
|
90
|
+
done=true;answered++;
|
|
91
|
+
const pick=o.dataset.i;
|
|
92
|
+
if(pick===answer){correct++;o.classList.add('correct')}
|
|
93
|
+
else{o.classList.add('wrong');
|
|
94
|
+
q.querySelector('.opt[data-i="'+answer+'"]')?.classList.add('correct')}
|
|
95
|
+
q.querySelectorAll('.fb').forEach(f=>f.classList.add('show'));
|
|
96
|
+
const el=document.getElementById('quiz-score');
|
|
97
|
+
if(el)el.textContent=correct+'/'+answered+(answered===total?' complete':'');
|
|
98
|
+
});
|
|
99
|
+
});
|
|
100
|
+
});
|
|
101
|
+
})();
|
|
102
|
+
</script>
|
|
103
|
+
</body>
|
|
104
|
+
</html>
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
# Explainer Artifact Template
|
|
2
|
+
|
|
3
|
+
This reference documents the canonical section contract and diagram markup for comprehend explainer artifacts.
|
|
4
|
+
|
|
5
|
+
## Section Contract
|
|
6
|
+
|
|
7
|
+
Every explainer uses the following sections, in order. Headers are Korean, byte-identical across all harnesses.
|
|
8
|
+
|
|
9
|
+
### 한눈에
|
|
10
|
+
|
|
11
|
+
One-paragraph summary of what changed and why it matters. Assume the reader knows the objective. Link to the most important theme below.
|
|
12
|
+
|
|
13
|
+
### 이미 알고 있던 것
|
|
14
|
+
|
|
15
|
+
State the reader's starting point: the objective, the brief, the ledger's first timestamp, what was already working. This section anchors the delta so the reader never feels lost.
|
|
16
|
+
|
|
17
|
+
### 직관
|
|
18
|
+
|
|
19
|
+
Build intuition with toy data that reappears across the whole document. Use 2-3 diagram families:
|
|
20
|
+
|
|
21
|
+
- **Pipeline** (`.pipe`): show data flowing through named stages.
|
|
22
|
+
- **Before/After** (`.ba`): side-by-side comparison of old and new behavior.
|
|
23
|
+
- **State/Timeline** (table): show progression over time or through states.
|
|
24
|
+
- **Simplified UI**: a static mockup showing the user-facing change.
|
|
25
|
+
|
|
26
|
+
Diagrams are HTML/CSS. Never ASCII art.
|
|
27
|
+
|
|
28
|
+
### 바뀐 것
|
|
29
|
+
|
|
30
|
+
Walk through the actual changes grouped into named themes. Each theme explains one coherent idea. Order themes so each is comprehensible from what came before.
|
|
31
|
+
|
|
32
|
+
Code excerpts use `<pre data-src="path:startLine-endLine">` with `.add` and `.del` span classes for changed lines. Quote only lines that exist in the cited file.
|
|
33
|
+
|
|
34
|
+
### 직접 만져보기
|
|
35
|
+
|
|
36
|
+
A micro-world: a small interactive widget. Patterns:
|
|
37
|
+
|
|
38
|
+
- **Faithful miniature**: port logic to JS with editable input.
|
|
39
|
+
- **Slider**: range input for threshold/sensitivity.
|
|
40
|
+
- **Step-through**: next/reset buttons for pipeline visualization.
|
|
41
|
+
- **Old/new toggle**: radio buttons comparing before/after.
|
|
42
|
+
|
|
43
|
+
Always label as a simplified model. Use the same toy data as the 직관 section. Omit for purely structural changes.
|
|
44
|
+
|
|
45
|
+
### 확인 안 된 것
|
|
46
|
+
|
|
47
|
+
The honesty ledger. Report:
|
|
48
|
+
|
|
49
|
+
- What is verified by a command vs merely read.
|
|
50
|
+
- Code that exists but was never executed.
|
|
51
|
+
- Work the objective asked for that did not happen.
|
|
52
|
+
- Missing or stale cited artifacts.
|
|
53
|
+
- Explicit uncertainty.
|
|
54
|
+
|
|
55
|
+
Use a table: `검증 수단 | 대상 | 상태` with values like `명령 실행`, `코드 읽기`, `미검증`.
|
|
56
|
+
|
|
57
|
+
### 증거
|
|
58
|
+
|
|
59
|
+
Evidence table in a `.scroll-x` container. Columns: `종류 | 경로 | 상태`. Link to actual artifacts.
|
|
60
|
+
|
|
61
|
+
### 퀴즈
|
|
62
|
+
|
|
63
|
+
5 questions (3 for a small change). Each question has `data-answer` on the `.quiz-q` container. Each option (`.opt[data-i]`) has a matching feedback block (`.fb[data-i]`). Rules:
|
|
64
|
+
|
|
65
|
+
- Every option gets feedback explaining WHY it is right or wrong.
|
|
66
|
+
- No positional tell: vary the correct slot across questions (no 3-in-a-row same position).
|
|
67
|
+
- No length tell: keep options at roughly even lengths.
|
|
68
|
+
- The quiz slows the reader down; it is not a grade.
|
|
69
|
+
|
|
70
|
+
### 다음
|
|
71
|
+
|
|
72
|
+
Concrete next actions ordered by priority. Each names an OpenCode command or surface when applicable.
|
|
73
|
+
|
|
74
|
+
## Diagram Markup Reference
|
|
75
|
+
|
|
76
|
+
### Pipeline
|
|
77
|
+
|
|
78
|
+
```html
|
|
79
|
+
<div class="pipe">
|
|
80
|
+
<div class="box">Stage A</div>
|
|
81
|
+
<div class="box">Stage B</div>
|
|
82
|
+
<div class="box">Stage C</div>
|
|
83
|
+
</div>
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
### Before/After
|
|
87
|
+
|
|
88
|
+
```html
|
|
89
|
+
<div class="ba">
|
|
90
|
+
<div><h4>Before</h4><pre>old behavior</pre></div>
|
|
91
|
+
<div><h4>After</h4><pre>new behavior</pre></div>
|
|
92
|
+
</div>
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
### Callout Classes
|
|
96
|
+
|
|
97
|
+
- `.note.ok` -- success, verified fact.
|
|
98
|
+
- `.note.warn` -- caution, partial evidence.
|
|
99
|
+
- `.note.bad` -- failure, missing evidence.
|
|
100
|
+
- `.skippable` -- reader may skip if short on time.
|
|
101
|
+
|
|
102
|
+
### Code Blocks
|
|
103
|
+
|
|
104
|
+
```html
|
|
105
|
+
<pre data-src="src/activation-routing.ts:33-56">
|
|
106
|
+
<span class="del">- old line</span>
|
|
107
|
+
<span class="add">+ new line</span>
|
|
108
|
+
unchanged line
|
|
109
|
+
</pre>
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
## Markdown Fallback (--md)
|
|
113
|
+
|
|
114
|
+
When `--md` is requested: quizzes become `<details>` blocks, micro-worlds become worked examples with explicit before/after values, and diagrams become indented prose descriptions.
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
# Micro-World Patterns
|
|
2
|
+
|
|
3
|
+
This reference provides four micro-world patterns for comprehend explainer artifacts. A micro-world is a small interactive widget that lets the reader FEEL a behavior rather than just read about it.
|
|
4
|
+
|
|
5
|
+
## Ground Rules
|
|
6
|
+
|
|
7
|
+
1. Always label as "simplified model" -- never present as the real code.
|
|
8
|
+
2. Be faithful on the teaching dimension: if the real code retries 3 times, the model retries 3 times.
|
|
9
|
+
3. Use the same toy data as the 직관 section.
|
|
10
|
+
4. Show the interesting range by default so the reader sees meaningful behavior immediately.
|
|
11
|
+
5. No external dependencies, no network requests, no imports.
|
|
12
|
+
6. In `--md` mode, degrade to a worked example with explicit before/after values.
|
|
13
|
+
|
|
14
|
+
## Pattern 1: Faithful Miniature
|
|
15
|
+
|
|
16
|
+
Port the key logic to JavaScript, wire it to an editable input.
|
|
17
|
+
|
|
18
|
+
```html
|
|
19
|
+
<div class="world">
|
|
20
|
+
<h4>직접 만져보기 <span class="note warn">simplified model</span></h4>
|
|
21
|
+
<label>Input: <input id="mw-in" value="Hello World"></label>
|
|
22
|
+
<p>Output: <code id="mw-out"></code></p>
|
|
23
|
+
<script>
|
|
24
|
+
(() => {
|
|
25
|
+
const input = document.getElementById('mw-in');
|
|
26
|
+
const output = document.getElementById('mw-out');
|
|
27
|
+
function update() {
|
|
28
|
+
output.textContent = input.value.toLowerCase().replace(/\s+/g, '-');
|
|
29
|
+
}
|
|
30
|
+
input.addEventListener('input', update);
|
|
31
|
+
update();
|
|
32
|
+
})();
|
|
33
|
+
</script>
|
|
34
|
+
</div>
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
## Pattern 2: Slider
|
|
38
|
+
|
|
39
|
+
A range input for threshold or sensitivity exploration.
|
|
40
|
+
|
|
41
|
+
```html
|
|
42
|
+
<div class="world">
|
|
43
|
+
<h4>직접 만져보기 <span class="note warn">simplified model</span></h4>
|
|
44
|
+
<label>Retry delay (ms): <input type="range" id="mw-delay" min="100" max="5000" value="1000"></label>
|
|
45
|
+
<p>Delay: <code id="mw-val">1000</code>ms → Total wait: <code id="mw-total">3000</code>ms</p>
|
|
46
|
+
<script>
|
|
47
|
+
(() => {
|
|
48
|
+
const slider = document.getElementById('mw-delay');
|
|
49
|
+
const val = document.getElementById('mw-val');
|
|
50
|
+
const total = document.getElementById('mw-total');
|
|
51
|
+
function update() {
|
|
52
|
+
const d = Number(slider.value);
|
|
53
|
+
val.textContent = d;
|
|
54
|
+
total.textContent = d + d * 2 + d * 4;
|
|
55
|
+
}
|
|
56
|
+
slider.addEventListener('input', update);
|
|
57
|
+
update();
|
|
58
|
+
})();
|
|
59
|
+
</script>
|
|
60
|
+
</div>
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
## Pattern 3: Step-through
|
|
64
|
+
|
|
65
|
+
Next/reset buttons for visualizing a pipeline or sequence.
|
|
66
|
+
|
|
67
|
+
```html
|
|
68
|
+
<div class="world">
|
|
69
|
+
<h4>직접 만져보기 <span class="note warn">simplified model</span></h4>
|
|
70
|
+
<div id="mw-steps"></div>
|
|
71
|
+
<button id="mw-next">Next</button>
|
|
72
|
+
<button id="mw-reset">Reset</button>
|
|
73
|
+
<script>
|
|
74
|
+
(() => {
|
|
75
|
+
const steps = ['Parse input', 'Validate schema', 'Transform data', 'Write output'];
|
|
76
|
+
let current = 0;
|
|
77
|
+
const container = document.getElementById('mw-steps');
|
|
78
|
+
function render() {
|
|
79
|
+
container.innerHTML = steps.map((s, i) =>
|
|
80
|
+
'<div class="box' + (i < current ? ' done' : i === current ? ' active' : '') + '">' + s + '</div>'
|
|
81
|
+
).join('');
|
|
82
|
+
}
|
|
83
|
+
document.getElementById('mw-next').addEventListener('click', () => {
|
|
84
|
+
if (current <= steps.length) { current++; render(); }
|
|
85
|
+
});
|
|
86
|
+
document.getElementById('mw-reset').addEventListener('click', () => {
|
|
87
|
+
current = 0; render();
|
|
88
|
+
});
|
|
89
|
+
render();
|
|
90
|
+
})();
|
|
91
|
+
</script>
|
|
92
|
+
</div>
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
## Pattern 4: Old/New Toggle
|
|
96
|
+
|
|
97
|
+
Radio buttons comparing before and after behavior.
|
|
98
|
+
|
|
99
|
+
```html
|
|
100
|
+
<div class="world">
|
|
101
|
+
<h4>직접 만져보기 <span class="note warn">simplified model</span></h4>
|
|
102
|
+
<label><input type="radio" name="mw-ver" value="old" checked> Before</label>
|
|
103
|
+
<label><input type="radio" name="mw-ver" value="new"> After</label>
|
|
104
|
+
<pre id="mw-display">old output here</pre>
|
|
105
|
+
<script>
|
|
106
|
+
(() => {
|
|
107
|
+
const display = document.getElementById('mw-display');
|
|
108
|
+
const outputs = { old: 'old output here', new: 'new output here' };
|
|
109
|
+
document.querySelectorAll('input[name="mw-ver"]').forEach(r => {
|
|
110
|
+
r.addEventListener('change', () => { display.textContent = outputs[r.value]; });
|
|
111
|
+
});
|
|
112
|
+
})();
|
|
113
|
+
</script>
|
|
114
|
+
</div>
|
|
115
|
+
```
|
|
@@ -0,0 +1,339 @@
|
|
|
1
|
+
import { readFileSync, existsSync, statSync } from "node:fs";
|
|
2
|
+
import { resolve, basename, relative, isAbsolute } from "node:path";
|
|
3
|
+
|
|
4
|
+
type CheckResult = {
|
|
5
|
+
readonly name: string;
|
|
6
|
+
readonly status: "PASS" | "FAIL" | "WARN";
|
|
7
|
+
readonly detail: string;
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
type VerifierOutput = {
|
|
11
|
+
readonly file: string;
|
|
12
|
+
readonly checks: readonly CheckResult[];
|
|
13
|
+
readonly pass: boolean;
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
const canonicalSections = [
|
|
17
|
+
"한눈에",
|
|
18
|
+
"이미 알고 있던 것",
|
|
19
|
+
"직관",
|
|
20
|
+
"바뀐 것",
|
|
21
|
+
"직접 만져보기",
|
|
22
|
+
"확인 안 된 것",
|
|
23
|
+
"증거",
|
|
24
|
+
"퀴즈",
|
|
25
|
+
"다음"
|
|
26
|
+
] as const;
|
|
27
|
+
|
|
28
|
+
const externalResourcePatterns = [
|
|
29
|
+
/<script[^>]+src\s*=/i,
|
|
30
|
+
/<link[^>]+rel\s*=\s*["']stylesheet["'][^>]*href\s*=/i,
|
|
31
|
+
/<link[^>]+href\s*=[^>]*rel\s*=\s*["']stylesheet["']/i,
|
|
32
|
+
/<img[^>]+src\s*=\s*["']https?:\/\//i,
|
|
33
|
+
/\bfetch\s*\(/,
|
|
34
|
+
/\bXMLHttpRequest\b/,
|
|
35
|
+
/\bimportScripts\s*\(/,
|
|
36
|
+
/<script[^>]+type\s*=\s*["']module["'][^>]+src\s*=/i,
|
|
37
|
+
/@import\s+url\s*\(/i
|
|
38
|
+
];
|
|
39
|
+
|
|
40
|
+
const asciiBoxChars = /[┌┐└┘├┤┬┴┼─│═║╔╗╚╝╠╣╦╩╬]/u;
|
|
41
|
+
const asciiBoxPattern = /\+[-=]{3,}\+/;
|
|
42
|
+
|
|
43
|
+
function stripPreBlocks(html: string): string {
|
|
44
|
+
return html.replace(/<pre[\s>][\s\S]*?<\/pre>/gi, "");
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function stripCodeBlocks(html: string): string {
|
|
48
|
+
return html.replace(/<code[\s>][\s\S]*?<\/code>/gi, "");
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
function run(artifactPath: string, repoRoot: string, jsonOutput: boolean): void {
|
|
52
|
+
const checks: CheckResult[] = [];
|
|
53
|
+
|
|
54
|
+
function check(name: string, status: "PASS" | "FAIL" | "WARN", detail: string): void {
|
|
55
|
+
checks.push({ name, status, detail });
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
// 1. artifact-exists
|
|
59
|
+
const absPath = resolve(artifactPath);
|
|
60
|
+
if (!existsSync(absPath)) {
|
|
61
|
+
check("artifact-exists", "FAIL", `File not found: ${absPath}`);
|
|
62
|
+
output({ file: absPath, checks, pass: false }, jsonOutput);
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
check("artifact-exists", "PASS", "File exists");
|
|
66
|
+
|
|
67
|
+
// 2. artifact-nonempty
|
|
68
|
+
const stat = statSync(absPath);
|
|
69
|
+
if (stat.size < 400) {
|
|
70
|
+
check("artifact-nonempty", "FAIL", `File is ${stat.size} bytes, expected > 400`);
|
|
71
|
+
} else {
|
|
72
|
+
check("artifact-nonempty", "PASS", `${stat.size} bytes`);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
const html = readFileSync(absPath, "utf8");
|
|
76
|
+
|
|
77
|
+
// 3. filename-dated
|
|
78
|
+
const name = basename(absPath);
|
|
79
|
+
if (/^\d{4}-\d{2}-\d{2}-/.test(name)) {
|
|
80
|
+
check("filename-dated", "PASS", `Filename starts with date prefix: ${name}`);
|
|
81
|
+
} else {
|
|
82
|
+
check("filename-dated", "FAIL", `Filename must start with YYYY-MM-DD-: ${name}`);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// 4. outside-repo
|
|
86
|
+
const absRepo = resolve(repoRoot);
|
|
87
|
+
const rel = relative(absRepo, absPath);
|
|
88
|
+
if (!rel.startsWith("..") && !isAbsolute(rel)) {
|
|
89
|
+
check("outside-repo", "FAIL", `Artifact is inside the repo worktree. Write to ~/.litopencode/lit-comprehend/ instead.`);
|
|
90
|
+
} else {
|
|
91
|
+
check("outside-repo", "PASS", "Artifact is outside the repo worktree");
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
// 5. self-contained
|
|
95
|
+
let hasExternal = false;
|
|
96
|
+
for (const pattern of externalResourcePatterns) {
|
|
97
|
+
if (pattern.test(html)) {
|
|
98
|
+
hasExternal = true;
|
|
99
|
+
check("self-contained", "FAIL", `External resource detected: ${pattern.source}`);
|
|
100
|
+
break;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
if (!hasExternal) {
|
|
104
|
+
check("self-contained", "PASS", "No external resource references found");
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
// 6. sections
|
|
108
|
+
const missingSections: string[] = [];
|
|
109
|
+
const optionalSections = new Set(["직접 만져보기"]);
|
|
110
|
+
for (const section of canonicalSections) {
|
|
111
|
+
if (!html.includes(section)) {
|
|
112
|
+
if (optionalSections.has(section)) {
|
|
113
|
+
check("sections", "WARN", `Optional section missing: ${section}`);
|
|
114
|
+
} else {
|
|
115
|
+
missingSections.push(section);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
if (missingSections.length > 0) {
|
|
120
|
+
check("sections", "FAIL", `Missing required sections: ${missingSections.join(", ")}`);
|
|
121
|
+
} else {
|
|
122
|
+
check("sections", "PASS", "All required canonical sections present");
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
// 7. quotes-real (phantom quote detection)
|
|
126
|
+
const preDataSrcPattern = /<pre[^>]+data-src\s*=\s*["']([^"']+)["'][^>]*>([\s\S]*?)<\/pre>/gi;
|
|
127
|
+
let quoteMatch;
|
|
128
|
+
let phantomFound = false;
|
|
129
|
+
while ((quoteMatch = preDataSrcPattern.exec(html)) !== null) {
|
|
130
|
+
const srcAttr = quoteMatch[1];
|
|
131
|
+
const quotedContent = quoteMatch[2];
|
|
132
|
+
const filePath = srcAttr.replace(/:[\d-]+$/, "");
|
|
133
|
+
const absFilePath = resolve(repoRoot, filePath);
|
|
134
|
+
|
|
135
|
+
if (!existsSync(absFilePath)) {
|
|
136
|
+
check("quotes-real", "FAIL", `Quoted file does not exist: ${filePath}`);
|
|
137
|
+
phantomFound = true;
|
|
138
|
+
continue;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
const fileContent = readFileSync(absFilePath, "utf8");
|
|
142
|
+
// Exclude deleted lines from hit check
|
|
143
|
+
const delPattern = /<span[^>]+class\s*=\s*["'][^"']*\bdel\b[^"']*["'][^>]*>[\s\S]*?<\/span>/gi;
|
|
144
|
+
const withoutDel = quotedContent.replace(delPattern, "");
|
|
145
|
+
const activeLines = withoutDel
|
|
146
|
+
.replace(/<[^>]+>/g, "")
|
|
147
|
+
.split("\n")
|
|
148
|
+
.map((line) => line.replace(/^[+]\s?/, "").trim())
|
|
149
|
+
.filter((line) => line.length > 0);
|
|
150
|
+
|
|
151
|
+
if (activeLines.length === 0) continue;
|
|
152
|
+
|
|
153
|
+
const hits = activeLines.filter((line) => fileContent.includes(line)).length;
|
|
154
|
+
const hitRate = hits / activeLines.length;
|
|
155
|
+
|
|
156
|
+
if (hitRate < 0.6) {
|
|
157
|
+
check("quotes-real", "FAIL", `Phantom quote: ${filePath} — only ${Math.round(hitRate * 100)}% of lines found in file`);
|
|
158
|
+
phantomFound = true;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
if (!phantomFound) {
|
|
162
|
+
check("quotes-real", "PASS", "All code quotes verified against source files");
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
// 7b. quotes-attributed — every <pre> code block must carry data-src attribution
|
|
166
|
+
const allPreBlocks = html.match(/<pre[\s>][\s\S]*?<\/pre>/gi) ?? [];
|
|
167
|
+
const codePreBlocks = allPreBlocks.filter((block: string) => {
|
|
168
|
+
const inner = block.replace(/<[^>]+>/g, "").trim();
|
|
169
|
+
return inner.length > 0;
|
|
170
|
+
});
|
|
171
|
+
const attributedPreBlocks = allPreBlocks.filter((block: string) => /data-src\s*=/.test(block));
|
|
172
|
+
if (codePreBlocks.length > 0 && attributedPreBlocks.length === 0) {
|
|
173
|
+
check("quotes-attributed", "FAIL", `${codePreBlocks.length} code block(s) found but none carry a data-src attribution — the anti-fabrication check cannot verify unattributed quotes`);
|
|
174
|
+
} else if (codePreBlocks.length === 0) {
|
|
175
|
+
check("quotes-attributed", "WARN", "No code blocks found — a walkthrough of a code change normally quotes the code it explains");
|
|
176
|
+
} else {
|
|
177
|
+
check("quotes-attributed", "PASS", `${attributedPreBlocks.length}/${codePreBlocks.length} code block(s) carry data-src attribution`);
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
// 8. paths-exist
|
|
181
|
+
const codePathPattern = /<code>([^<]+\.[a-z]{1,4})<\/code>/gi;
|
|
182
|
+
let pathMatch;
|
|
183
|
+
const knownExtensions = new Set(["ts", "tsx", "js", "mjs", "cjs", "json", "md", "html", "css", "yaml", "yml"]);
|
|
184
|
+
while ((pathMatch = codePathPattern.exec(html)) !== null) {
|
|
185
|
+
const candidate = pathMatch[1].trim();
|
|
186
|
+
const ext = candidate.split(".").pop() ?? "";
|
|
187
|
+
if (!knownExtensions.has(ext)) continue;
|
|
188
|
+
if (candidate.includes("__") || candidate.startsWith("http")) continue;
|
|
189
|
+
const absCandidate = resolve(repoRoot, candidate);
|
|
190
|
+
if (!existsSync(absCandidate)) {
|
|
191
|
+
check("paths-exist", "WARN", `Referenced path may not exist: ${candidate}`);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
// 9. no-ascii-art
|
|
196
|
+
const outsidePre = stripPreBlocks(html);
|
|
197
|
+
const outsideCode = stripCodeBlocks(outsidePre);
|
|
198
|
+
if (asciiBoxChars.test(outsideCode) || asciiBoxPattern.test(outsideCode)) {
|
|
199
|
+
check("no-ascii-art", "FAIL", "ASCII box-drawing characters found outside <pre> blocks. Use HTML/CSS diagrams.");
|
|
200
|
+
} else {
|
|
201
|
+
check("no-ascii-art", "PASS", "No ASCII box-drawing outside code blocks");
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
// 10. quiz
|
|
205
|
+
const quizQuestions = html.match(/<[^>]+class\s*=\s*["'][^"']*\bquiz-q\b[^"']*["'][^>]*>/gi) ?? [];
|
|
206
|
+
if (quizQuestions.length < 3) {
|
|
207
|
+
check("quiz", "FAIL", `Only ${quizQuestions.length} quiz questions found, need at least 3`);
|
|
208
|
+
} else {
|
|
209
|
+
check("quiz", "PASS", `${quizQuestions.length} quiz questions found`);
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
// Check quiz answer attributes
|
|
213
|
+
const quizQPattern = /<[^>]+class\s*=\s*["'][^"']*\bquiz-q\b[^"']*["'][^>]*data-answer\s*=\s*["']([^"']+)["']/gi;
|
|
214
|
+
const answers: string[] = [];
|
|
215
|
+
let qMatch;
|
|
216
|
+
while ((qMatch = quizQPattern.exec(html)) !== null) {
|
|
217
|
+
answers.push(qMatch[1]);
|
|
218
|
+
}
|
|
219
|
+
// Also try reversed attribute order
|
|
220
|
+
const quizQPatternAlt = /data-answer\s*=\s*["']([^"']+)["'][^>]*class\s*=\s*["'][^"']*\bquiz-q\b/gi;
|
|
221
|
+
while ((qMatch = quizQPatternAlt.exec(html)) !== null) {
|
|
222
|
+
if (!answers.includes(qMatch[1])) answers.push(qMatch[1]);
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
// Check for feedback blocks per question
|
|
226
|
+
const quizBlocks = html.match(/<[^>]+class\s*=\s*["'][^"']*\bquiz-q\b[\s\S]*?(?=<[^>]+class\s*=\s*["'][^"']*\bquiz-q\b|$)/gi) ?? [];
|
|
227
|
+
for (let i = 0; i < quizBlocks.length; i++) {
|
|
228
|
+
const block = quizBlocks[i];
|
|
229
|
+
const opts = block.match(/<[^>]+class\s*=\s*["'][^"']*\bopt\b[^"']*["'][^>]*data-i\s*=\s*["']([^"']+)["']/gi) ?? [];
|
|
230
|
+
const fbs = block.match(/<[^>]+class\s*=\s*["'][^"']*\bfb\b[^"']*["'][^>]*data-i\s*=\s*["']([^"']+)["']/gi) ?? [];
|
|
231
|
+
|
|
232
|
+
if (opts.length < 3) {
|
|
233
|
+
check("quiz", "FAIL", `Question ${i + 1} has fewer than 3 options`);
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
const optIds = new Set(opts.map((o) => {
|
|
237
|
+
const m = o.match(/data-i\s*=\s*["']([^"']+)["']/);
|
|
238
|
+
return m ? m[1] : "";
|
|
239
|
+
}));
|
|
240
|
+
const fbIds = new Set(fbs.map((f) => {
|
|
241
|
+
const m = f.match(/data-i\s*=\s*["']([^"']+)["']/);
|
|
242
|
+
return m ? m[1] : "";
|
|
243
|
+
}));
|
|
244
|
+
|
|
245
|
+
for (const id of optIds) {
|
|
246
|
+
if (id && !fbIds.has(id)) {
|
|
247
|
+
check("quiz", "FAIL", `Question ${i + 1}: option ${id} has no matching feedback block`);
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
// Positional tell: 3+ consecutive same-slot answers
|
|
253
|
+
if (answers.length >= 3) {
|
|
254
|
+
for (let i = 0; i <= answers.length - 3; i++) {
|
|
255
|
+
if (answers[i] === answers[i + 1] && answers[i + 1] === answers[i + 2]) {
|
|
256
|
+
check("quiz", "FAIL", `Positional tell: answers ${i + 1}-${i + 3} are all slot "${answers[i]}"`);
|
|
257
|
+
break;
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
// Length tell warning: check if longest option is correct > 60% of the time
|
|
263
|
+
if (quizBlocks.length >= 3) {
|
|
264
|
+
let longestIsCorrect = 0;
|
|
265
|
+
for (const block of quizBlocks) {
|
|
266
|
+
const answerMatch = block.match(/data-answer\s*=\s*["']([^"']+)["']/);
|
|
267
|
+
if (!answerMatch) continue;
|
|
268
|
+
const correctId = answerMatch[1];
|
|
269
|
+
const optPattern = /<[^>]+class\s*=\s*["'][^"']*\bopt\b[^"']*["'][^>]*data-i\s*=\s*["']([^"']+)["'][^>]*>([\s\S]*?)(?=<[^>]+class\s*=\s*["'][^"']*\b(?:opt|fb)\b|<\/div>)/gi;
|
|
270
|
+
let oMatch;
|
|
271
|
+
let maxLen = 0;
|
|
272
|
+
let maxId = "";
|
|
273
|
+
while ((oMatch = optPattern.exec(block)) !== null) {
|
|
274
|
+
const text = oMatch[2].replace(/<[^>]+>/g, "").trim();
|
|
275
|
+
if (text.length > maxLen) {
|
|
276
|
+
maxLen = text.length;
|
|
277
|
+
maxId = oMatch[1];
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
if (maxId === correctId) longestIsCorrect++;
|
|
281
|
+
}
|
|
282
|
+
if (quizBlocks.length > 0 && longestIsCorrect / quizBlocks.length > 0.6) {
|
|
283
|
+
check("quiz", "WARN", `Length tell: longest option is correct in ${longestIsCorrect}/${quizBlocks.length} questions`);
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
// 11. honesty-substantive
|
|
288
|
+
const honestyIdx = html.indexOf("확인 안 된 것");
|
|
289
|
+
if (honestyIdx !== -1) {
|
|
290
|
+
const nextSectionIdx = html.indexOf("증거", honestyIdx + 10);
|
|
291
|
+
if (nextSectionIdx !== -1) {
|
|
292
|
+
const honestyContent = html.slice(honestyIdx, nextSectionIdx).replace(/<[^>]+>/g, "").trim();
|
|
293
|
+
if (honestyContent.length < 80) {
|
|
294
|
+
check("honesty-substantive", "WARN", "Honesty ledger section appears near-empty");
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
const hasFail = checks.some((c) => c.status === "FAIL");
|
|
300
|
+
output({ file: absPath, checks, pass: !hasFail }, jsonOutput);
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
function output(result: VerifierOutput, jsonOutput: boolean): void {
|
|
304
|
+
if (jsonOutput) {
|
|
305
|
+
process.stdout.write(JSON.stringify(result, null, 2) + "\n");
|
|
306
|
+
} else {
|
|
307
|
+
const icon = result.pass ? "PASS" : "FAIL";
|
|
308
|
+
console.log(`\n${icon}: ${result.file}\n`);
|
|
309
|
+
for (const c of result.checks) {
|
|
310
|
+
const sym = c.status === "PASS" ? "✓" : c.status === "WARN" ? "⚠" : "✗";
|
|
311
|
+
console.log(` ${sym} ${c.name}: ${c.detail}`);
|
|
312
|
+
}
|
|
313
|
+
console.log("");
|
|
314
|
+
}
|
|
315
|
+
process.exitCode = result.pass ? 0 : 1;
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
// CLI entry
|
|
319
|
+
const args = process.argv.slice(2);
|
|
320
|
+
let artifactPath = "";
|
|
321
|
+
let repoRoot = process.cwd();
|
|
322
|
+
let jsonFlag = false;
|
|
323
|
+
|
|
324
|
+
for (let i = 0; i < args.length; i++) {
|
|
325
|
+
if (args[i] === "--repo" && args[i + 1]) {
|
|
326
|
+
repoRoot = args[++i];
|
|
327
|
+
} else if (args[i] === "--json") {
|
|
328
|
+
jsonFlag = true;
|
|
329
|
+
} else if (!args[i].startsWith("-")) {
|
|
330
|
+
artifactPath = args[i];
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
if (!artifactPath) {
|
|
335
|
+
console.error("Usage: node --experimental-strip-types skills/lit-comprehend/scripts/verify-explainer.ts <artifact> [--repo <dir>] [--json]");
|
|
336
|
+
process.exit(1);
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
run(artifactPath, repoRoot, jsonFlag);
|