claudecode-omc 5.6.5 → 5.6.7
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/.local/commands/code-review.md +416 -0
- package/.local/commands/pr.md +250 -0
- package/.local/commands/prp-pr.md +244 -0
- package/.local/guidelines/CLAUDE.md +47 -0
- package/.local/skills/h5-to-swiftui/SKILL.md +201 -0
- package/.local/skills/h5-to-swiftui/assets/calibration/README.md +176 -0
- package/.local/skills/h5-to-swiftui/assets/calibration/h5-twin/index.html +52 -0
- package/.local/skills/h5-to-swiftui/assets/calibration/h5-twin/style.css +133 -0
- package/.local/skills/h5-to-swiftui/assets/calibration/swiftui-twin/Package.swift +26 -0
- package/.local/skills/h5-to-swiftui/assets/calibration/swiftui-twin/Sources/CalibrationScreen/CalibrationScreen.swift +142 -0
- package/.local/skills/h5-to-swiftui/assets/calibration/swiftui-twin-divergent/Package.swift +32 -0
- package/.local/skills/h5-to-swiftui/assets/calibration/swiftui-twin-divergent/Sources/CalibrationScreenDivergent/CalibrationScreenDivergent.swift +122 -0
- package/.local/skills/h5-to-swiftui/assets/calibration/tokens.json +42 -0
- package/.local/skills/h5-to-swiftui/assets/sample-h5-react/index.html +14 -0
- package/.local/skills/h5-to-swiftui/assets/sample-h5-react/package.json +20 -0
- package/.local/skills/h5-to-swiftui/assets/sample-h5-react/public/api/articles/001.json +96 -0
- package/.local/skills/h5-to-swiftui/assets/sample-h5-react/public/api/articles/index.json +89 -0
- package/.local/skills/h5-to-swiftui/assets/sample-h5-react/src/App.jsx +22 -0
- package/.local/skills/h5-to-swiftui/assets/sample-h5-react/src/App.module.css +11 -0
- package/.local/skills/h5-to-swiftui/assets/sample-h5-react/src/components/ArticleCard.jsx +53 -0
- package/.local/skills/h5-to-swiftui/assets/sample-h5-react/src/components/ArticleCard.module.css +139 -0
- package/.local/skills/h5-to-swiftui/assets/sample-h5-react/src/components/NavBar.jsx +37 -0
- package/.local/skills/h5-to-swiftui/assets/sample-h5-react/src/components/NavBar.module.css +72 -0
- package/.local/skills/h5-to-swiftui/assets/sample-h5-react/src/components/TagCloud.jsx +30 -0
- package/.local/skills/h5-to-swiftui/assets/sample-h5-react/src/components/TagCloud.module.css +50 -0
- package/.local/skills/h5-to-swiftui/assets/sample-h5-react/src/components/TrendChart.jsx +159 -0
- package/.local/skills/h5-to-swiftui/assets/sample-h5-react/src/components/TrendChart.module.css +21 -0
- package/.local/skills/h5-to-swiftui/assets/sample-h5-react/src/main.jsx +12 -0
- package/.local/skills/h5-to-swiftui/assets/sample-h5-react/src/screens/ArticleScreen.jsx +182 -0
- package/.local/skills/h5-to-swiftui/assets/sample-h5-react/src/screens/ArticleScreen.module.css +294 -0
- package/.local/skills/h5-to-swiftui/assets/sample-h5-react/src/screens/FeedScreen.jsx +147 -0
- package/.local/skills/h5-to-swiftui/assets/sample-h5-react/src/screens/FeedScreen.module.css +161 -0
- package/.local/skills/h5-to-swiftui/assets/sample-h5-react/src/styles/global.css +50 -0
- package/.local/skills/h5-to-swiftui/assets/sample-h5-react/src/styles/tokens.css +103 -0
- package/.local/skills/h5-to-swiftui/assets/sample-h5-react/vite.config.js +6 -0
- package/.local/skills/h5-to-swiftui/assets/sample-h5-vanilla/data/tasks.js +67 -0
- package/.local/skills/h5-to-swiftui/assets/sample-h5-vanilla/index.html +26 -0
- package/.local/skills/h5-to-swiftui/assets/sample-h5-vanilla/router.js +73 -0
- package/.local/skills/h5-to-swiftui/assets/sample-h5-vanilla/screens/detail.js +164 -0
- package/.local/skills/h5-to-swiftui/assets/sample-h5-vanilla/screens/home.js +53 -0
- package/.local/skills/h5-to-swiftui/assets/sample-h5-vanilla/screens/list.js +87 -0
- package/.local/skills/h5-to-swiftui/assets/sample-h5-vanilla/styles/app.css +342 -0
- package/.local/skills/h5-to-swiftui/assets/sample-h5-vanilla/styles/tokens.css +68 -0
- package/.local/skills/h5-to-swiftui/references/css-to-swiftui-map.md +205 -0
- package/.local/skills/h5-to-swiftui/references/design-token-extraction.md +209 -0
- package/.local/skills/h5-to-swiftui/references/high-risk-triage.md +209 -0
- package/.local/skills/h5-to-swiftui/references/render-equivalence-calibration.md +193 -0
- package/.local/skills/h5-to-swiftui/references/stack-detection.md +160 -0
- package/.local/skills/h5-to-swiftui/references/visual-diff-loop-protocol.md +365 -0
- package/.local/skills/h5-to-swiftui/scripts/_calib-consts.mjs +150 -0
- package/.local/skills/h5-to-swiftui/scripts/_imglib.mjs +547 -0
- package/.local/skills/h5-to-swiftui/scripts/_provenance.mjs +123 -0
- package/.local/skills/h5-to-swiftui/scripts/calibrate-render.mjs +625 -0
- package/.local/skills/h5-to-swiftui/scripts/capture-reference.mjs +386 -0
- package/.local/skills/h5-to-swiftui/scripts/detect-stack.mjs +305 -0
- package/.local/skills/h5-to-swiftui/scripts/evaluate-convergence.mjs +1093 -0
- package/.local/skills/h5-to-swiftui/scripts/extract-tokens.mjs +600 -0
- package/.local/skills/h5-to-swiftui/scripts/mark-overlay.mjs +379 -0
- package/.local/skills/h5-to-swiftui/scripts/pixel-diff.mjs +530 -0
- package/.local/skills/h5-to-swiftui/scripts/sim-screenshot.sh +544 -0
- package/bundled/manifest.json +4 -4
- package/bundled/upstream/anthropic-skills/skills/algorithmic-art/LICENSE.txt +1 -1
- package/bundled/upstream/anthropic-skills/skills/brand-guidelines/LICENSE.txt +1 -1
- package/bundled/upstream/anthropic-skills/skills/canvas-design/LICENSE.txt +1 -1
- package/bundled/upstream/anthropic-skills/skills/claude-api/LICENSE.txt +1 -1
- package/bundled/upstream/anthropic-skills/skills/claude-api/SKILL.md +120 -58
- package/bundled/upstream/anthropic-skills/skills/claude-api/curl/examples.md +9 -9
- package/bundled/upstream/anthropic-skills/skills/claude-api/curl/managed-agents.md +336 -0
- package/bundled/upstream/anthropic-skills/skills/claude-api/go/managed-agents/README.md +561 -0
- package/bundled/upstream/anthropic-skills/skills/claude-api/java/claude-api.md +2 -2
- package/bundled/upstream/anthropic-skills/skills/claude-api/java/managed-agents/README.md +442 -0
- package/bundled/upstream/anthropic-skills/skills/claude-api/php/claude-api.md +10 -10
- package/bundled/upstream/anthropic-skills/skills/claude-api/php/managed-agents/README.md +435 -0
- package/bundled/upstream/anthropic-skills/skills/claude-api/python/claude-api/README.md +16 -16
- package/bundled/upstream/anthropic-skills/skills/claude-api/python/claude-api/batches.md +3 -3
- package/bundled/upstream/anthropic-skills/skills/claude-api/python/claude-api/files-api.md +3 -3
- package/bundled/upstream/anthropic-skills/skills/claude-api/python/claude-api/streaming.md +7 -7
- package/bundled/upstream/anthropic-skills/skills/claude-api/python/claude-api/tool-use.md +19 -19
- package/bundled/upstream/anthropic-skills/skills/claude-api/python/managed-agents/README.md +332 -0
- package/bundled/upstream/anthropic-skills/skills/claude-api/ruby/claude-api.md +4 -4
- package/bundled/upstream/anthropic-skills/skills/claude-api/ruby/managed-agents/README.md +389 -0
- package/bundled/upstream/anthropic-skills/skills/claude-api/shared/agent-design.md +101 -0
- package/bundled/upstream/anthropic-skills/skills/claude-api/shared/error-codes.md +11 -4
- package/bundled/upstream/anthropic-skills/skills/claude-api/shared/live-sources.md +60 -48
- package/bundled/upstream/anthropic-skills/skills/claude-api/shared/managed-agents-api-reference.md +372 -0
- package/bundled/upstream/anthropic-skills/skills/claude-api/shared/managed-agents-client-patterns.md +209 -0
- package/bundled/upstream/anthropic-skills/skills/claude-api/shared/managed-agents-core.md +220 -0
- package/bundled/upstream/anthropic-skills/skills/claude-api/shared/managed-agents-environments.md +211 -0
- package/bundled/upstream/anthropic-skills/skills/claude-api/shared/managed-agents-events.md +195 -0
- package/bundled/upstream/anthropic-skills/skills/claude-api/shared/managed-agents-memory.md +197 -0
- package/bundled/upstream/anthropic-skills/skills/claude-api/shared/managed-agents-multiagent.md +99 -0
- package/bundled/upstream/anthropic-skills/skills/claude-api/shared/managed-agents-onboarding.md +114 -0
- package/bundled/upstream/anthropic-skills/skills/claude-api/shared/managed-agents-outcomes.md +106 -0
- package/bundled/upstream/anthropic-skills/skills/claude-api/shared/managed-agents-overview.md +67 -0
- package/bundled/upstream/anthropic-skills/skills/claude-api/shared/managed-agents-tools.md +315 -0
- package/bundled/upstream/anthropic-skills/skills/claude-api/shared/managed-agents-webhooks.md +110 -0
- package/bundled/upstream/anthropic-skills/skills/claude-api/shared/model-migration.md +779 -0
- package/bundled/upstream/anthropic-skills/skills/claude-api/shared/models.md +16 -14
- package/bundled/upstream/anthropic-skills/skills/claude-api/shared/prompt-caching.md +45 -2
- package/bundled/upstream/anthropic-skills/skills/claude-api/shared/tool-use-concepts.md +28 -6
- package/bundled/upstream/anthropic-skills/skills/claude-api/typescript/claude-api/README.md +15 -15
- package/bundled/upstream/anthropic-skills/skills/claude-api/typescript/claude-api/batches.md +2 -2
- package/bundled/upstream/anthropic-skills/skills/claude-api/typescript/claude-api/files-api.md +1 -1
- package/bundled/upstream/anthropic-skills/skills/claude-api/typescript/claude-api/streaming.md +5 -5
- package/bundled/upstream/anthropic-skills/skills/claude-api/typescript/claude-api/tool-use.md +15 -15
- package/bundled/upstream/anthropic-skills/skills/claude-api/typescript/managed-agents/README.md +359 -0
- package/bundled/upstream/anthropic-skills/skills/internal-comms/LICENSE.txt +1 -1
- package/bundled/upstream/anthropic-skills/skills/mcp-builder/LICENSE.txt +1 -1
- package/bundled/upstream/anthropic-skills/skills/skill-creator/LICENSE.txt +1 -1
- package/bundled/upstream/anthropic-skills/skills/slack-gif-creator/LICENSE.txt +1 -1
- package/bundled/upstream/anthropic-skills/skills/theme-factory/LICENSE.txt +1 -1
- package/bundled/upstream/anthropic-skills/skills/web-artifacts-builder/LICENSE.txt +1 -1
- package/bundled/upstream/anthropic-skills/skills/webapp-testing/LICENSE.txt +1 -1
- package/bundled/upstream/ecc/.omc-source/bundle.json +2 -3
- package/bundled/upstream/ecc/.omc-source/manifests/.claude-plugin/marketplace.json +4 -4
- package/bundled/upstream/ecc/agents/a11y-architect.md +10 -2
- package/bundled/upstream/ecc/agents/architect.md +9 -0
- package/bundled/upstream/ecc/agents/build-error-resolver.md +9 -0
- package/bundled/upstream/ecc/agents/chief-of-staff.md +9 -0
- package/bundled/upstream/ecc/agents/code-architect.md +9 -0
- package/bundled/upstream/ecc/agents/code-explorer.md +10 -1
- package/bundled/upstream/ecc/agents/code-reviewer.md +87 -1
- package/bundled/upstream/ecc/agents/code-simplifier.md +9 -0
- package/bundled/upstream/ecc/agents/comment-analyzer.md +10 -1
- package/bundled/upstream/ecc/agents/conversation-analyzer.md +9 -0
- package/bundled/upstream/ecc/agents/cpp-build-resolver.md +9 -0
- package/bundled/upstream/ecc/agents/cpp-reviewer.md +9 -0
- package/bundled/upstream/ecc/agents/csharp-reviewer.md +9 -0
- package/bundled/upstream/ecc/agents/dart-build-resolver.md +9 -0
- package/bundled/upstream/ecc/agents/database-reviewer.md +9 -0
- package/bundled/upstream/ecc/agents/django-build-resolver.md +252 -0
- package/bundled/upstream/ecc/agents/django-reviewer.md +169 -0
- package/bundled/upstream/ecc/agents/doc-updater.md +9 -0
- package/bundled/upstream/ecc/agents/docs-lookup.md +9 -0
- package/bundled/upstream/ecc/agents/e2e-runner.md +9 -0
- package/bundled/upstream/ecc/agents/fastapi-reviewer.md +79 -0
- package/bundled/upstream/ecc/agents/flutter-reviewer.md +9 -0
- package/bundled/upstream/ecc/agents/fsharp-reviewer.md +109 -0
- package/bundled/upstream/ecc/agents/gan-evaluator.md +9 -0
- package/bundled/upstream/ecc/agents/gan-generator.md +9 -0
- package/bundled/upstream/ecc/agents/gan-planner.md +9 -0
- package/bundled/upstream/ecc/agents/go-build-resolver.md +9 -0
- package/bundled/upstream/ecc/agents/go-reviewer.md +9 -0
- package/bundled/upstream/ecc/agents/harmonyos-app-resolver.md +182 -0
- package/bundled/upstream/ecc/agents/harness-optimizer.md +9 -0
- package/bundled/upstream/ecc/agents/healthcare-reviewer.md +9 -0
- package/bundled/upstream/ecc/agents/homelab-architect.md +107 -0
- package/bundled/upstream/ecc/agents/java-build-resolver.md +133 -11
- package/bundled/upstream/ecc/agents/java-reviewer.md +130 -32
- package/bundled/upstream/ecc/agents/kotlin-build-resolver.md +9 -0
- package/bundled/upstream/ecc/agents/kotlin-reviewer.md +9 -0
- package/bundled/upstream/ecc/agents/loop-operator.md +9 -0
- package/bundled/upstream/ecc/agents/mle-reviewer.md +162 -0
- package/bundled/upstream/ecc/agents/network-architect.md +106 -0
- package/bundled/upstream/ecc/agents/network-config-reviewer.md +106 -0
- package/bundled/upstream/ecc/agents/network-troubleshooter.md +128 -0
- package/bundled/upstream/ecc/agents/opensource-forker.md +9 -0
- package/bundled/upstream/ecc/agents/opensource-packager.md +9 -0
- package/bundled/upstream/ecc/agents/opensource-sanitizer.md +9 -0
- package/bundled/upstream/ecc/agents/performance-optimizer.md +9 -0
- package/bundled/upstream/ecc/agents/planner.md +9 -0
- package/bundled/upstream/ecc/agents/pr-test-analyzer.md +9 -0
- package/bundled/upstream/ecc/agents/python-reviewer.md +9 -0
- package/bundled/upstream/ecc/agents/pytorch-build-resolver.md +12 -3
- package/bundled/upstream/ecc/agents/refactor-cleaner.md +9 -0
- package/bundled/upstream/ecc/agents/rust-build-resolver.md +9 -0
- package/bundled/upstream/ecc/agents/rust-reviewer.md +9 -0
- package/bundled/upstream/ecc/agents/security-reviewer.md +9 -0
- package/bundled/upstream/ecc/agents/seo-specialist.md +10 -1
- package/bundled/upstream/ecc/agents/silent-failure-hunter.md +9 -0
- package/bundled/upstream/ecc/agents/swift-build-resolver.md +170 -0
- package/bundled/upstream/ecc/agents/swift-reviewer.md +116 -0
- package/bundled/upstream/ecc/agents/tdd-guide.md +9 -0
- package/bundled/upstream/ecc/agents/type-design-analyzer.md +10 -1
- package/bundled/upstream/ecc/agents/typescript-reviewer.md +9 -0
- package/bundled/upstream/ecc/commands/auto-update.md +28 -0
- package/bundled/upstream/ecc/commands/build-fix.md +4 -0
- package/bundled/upstream/ecc/commands/checkpoint.md +4 -0
- package/bundled/upstream/ecc/commands/code-review.md +3 -3
- package/bundled/upstream/ecc/commands/cost-report.md +107 -0
- package/bundled/upstream/ecc/commands/cpp-build.md +1 -1
- package/bundled/upstream/ecc/commands/cpp-test.md +1 -1
- package/bundled/upstream/ecc/commands/ecc-guide.md +93 -0
- package/bundled/upstream/ecc/commands/fastapi-review.md +39 -0
- package/bundled/upstream/ecc/commands/flutter-build.md +1 -1
- package/bundled/upstream/ecc/commands/flutter-test.md +1 -1
- package/bundled/upstream/ecc/commands/gan-build.md +4 -0
- package/bundled/upstream/ecc/commands/gan-design.md +4 -0
- package/bundled/upstream/ecc/commands/go-build.md +1 -1
- package/bundled/upstream/ecc/commands/go-test.md +1 -1
- package/bundled/upstream/ecc/commands/harness-audit.md +4 -0
- package/bundled/upstream/ecc/commands/jira.md +2 -2
- package/bundled/upstream/ecc/commands/kotlin-build.md +1 -1
- package/bundled/upstream/ecc/commands/kotlin-test.md +1 -1
- package/bundled/upstream/ecc/commands/learn.md +4 -0
- package/bundled/upstream/ecc/commands/loop-start.md +4 -0
- package/bundled/upstream/ecc/commands/loop-status.md +54 -1
- package/bundled/upstream/ecc/commands/model-route.md +4 -0
- package/bundled/upstream/ecc/commands/multi-backend.md +4 -0
- package/bundled/upstream/ecc/commands/multi-execute.md +4 -0
- package/bundled/upstream/ecc/commands/multi-frontend.md +4 -0
- package/bundled/upstream/ecc/commands/multi-plan.md +4 -0
- package/bundled/upstream/ecc/commands/multi-workflow.md +4 -0
- package/bundled/upstream/ecc/commands/plan-prd.md +160 -0
- package/bundled/upstream/ecc/commands/plan.md +96 -13
- package/bundled/upstream/ecc/commands/pm2.md +4 -0
- package/bundled/upstream/ecc/commands/pr.md +184 -0
- package/bundled/upstream/ecc/commands/project-init.md +86 -0
- package/bundled/upstream/ecc/commands/python-review.md +1 -1
- package/bundled/upstream/ecc/commands/quality-gate.md +4 -0
- package/bundled/upstream/ecc/commands/refactor-clean.md +4 -0
- package/bundled/upstream/ecc/commands/rust-build.md +1 -1
- package/bundled/upstream/ecc/commands/rust-test.md +1 -1
- package/bundled/upstream/ecc/commands/security-scan.md +92 -0
- package/bundled/upstream/ecc/commands/sessions.md +6 -6
- package/bundled/upstream/ecc/commands/skill-health.md +3 -3
- package/bundled/upstream/ecc/commands/test-coverage.md +4 -0
- package/bundled/upstream/ecc/commands/update-codemaps.md +4 -0
- package/bundled/upstream/ecc/commands/update-docs.md +4 -0
- package/bundled/upstream/ecc/skills/accessibility/SKILL.md +1 -1
- package/bundled/upstream/ecc/skills/agent-architecture-audit/SKILL.md +256 -0
- package/bundled/upstream/ecc/skills/agent-payment-x402/SKILL.md +49 -3
- package/bundled/upstream/ecc/skills/agentic-os/SKILL.md +387 -0
- package/bundled/upstream/ecc/skills/angular-developer/SKILL.md +154 -0
- package/bundled/upstream/ecc/skills/angular-developer/references/angular-animations.md +160 -0
- package/bundled/upstream/ecc/skills/angular-developer/references/angular-aria.md +410 -0
- package/bundled/upstream/ecc/skills/angular-developer/references/cli.md +86 -0
- package/bundled/upstream/ecc/skills/angular-developer/references/component-harnesses.md +59 -0
- package/bundled/upstream/ecc/skills/angular-developer/references/component-styling.md +91 -0
- package/bundled/upstream/ecc/skills/angular-developer/references/components.md +117 -0
- package/bundled/upstream/ecc/skills/angular-developer/references/creating-services.md +97 -0
- package/bundled/upstream/ecc/skills/angular-developer/references/data-resolvers.md +69 -0
- package/bundled/upstream/ecc/skills/angular-developer/references/define-routes.md +67 -0
- package/bundled/upstream/ecc/skills/angular-developer/references/defining-providers.md +72 -0
- package/bundled/upstream/ecc/skills/angular-developer/references/di-fundamentals.md +120 -0
- package/bundled/upstream/ecc/skills/angular-developer/references/e2e-testing.md +56 -0
- package/bundled/upstream/ecc/skills/angular-developer/references/effects.md +83 -0
- package/bundled/upstream/ecc/skills/angular-developer/references/hierarchical-injectors.md +43 -0
- package/bundled/upstream/ecc/skills/angular-developer/references/host-elements.md +80 -0
- package/bundled/upstream/ecc/skills/angular-developer/references/injection-context.md +63 -0
- package/bundled/upstream/ecc/skills/angular-developer/references/inputs.md +101 -0
- package/bundled/upstream/ecc/skills/angular-developer/references/linked-signal.md +59 -0
- package/bundled/upstream/ecc/skills/angular-developer/references/loading-strategies.md +61 -0
- package/bundled/upstream/ecc/skills/angular-developer/references/mcp.md +108 -0
- package/bundled/upstream/ecc/skills/angular-developer/references/navigate-to-routes.md +69 -0
- package/bundled/upstream/ecc/skills/angular-developer/references/outputs.md +86 -0
- package/bundled/upstream/ecc/skills/angular-developer/references/reactive-forms.md +122 -0
- package/bundled/upstream/ecc/skills/angular-developer/references/rendering-strategies.md +44 -0
- package/bundled/upstream/ecc/skills/angular-developer/references/resource.md +77 -0
- package/bundled/upstream/ecc/skills/angular-developer/references/route-animations.md +56 -0
- package/bundled/upstream/ecc/skills/angular-developer/references/route-guards.md +52 -0
- package/bundled/upstream/ecc/skills/angular-developer/references/router-lifecycle.md +45 -0
- package/bundled/upstream/ecc/skills/angular-developer/references/router-testing.md +87 -0
- package/bundled/upstream/ecc/skills/angular-developer/references/show-routes-with-outlets.md +68 -0
- package/bundled/upstream/ecc/skills/angular-developer/references/signal-forms.md +795 -0
- package/bundled/upstream/ecc/skills/angular-developer/references/signals-overview.md +94 -0
- package/bundled/upstream/ecc/skills/angular-developer/references/tailwind-css.md +69 -0
- package/bundled/upstream/ecc/skills/angular-developer/references/template-driven-forms.md +114 -0
- package/bundled/upstream/ecc/skills/angular-developer/references/testing-fundamentals.md +65 -0
- package/bundled/upstream/ecc/skills/autonomous-agent-harness/SKILL.md +6 -0
- package/bundled/upstream/ecc/skills/backend-patterns/SKILL.md +8 -45
- package/bundled/upstream/ecc/skills/cisco-ios-patterns/SKILL.md +163 -0
- package/bundled/upstream/ecc/skills/configure-ecc/SKILL.md +31 -14
- package/bundled/upstream/ecc/skills/continuous-learning/SKILL.md +10 -2
- package/bundled/upstream/ecc/skills/continuous-learning-v2/SKILL.md +19 -5
- package/bundled/upstream/ecc/skills/continuous-learning-v2/agents/observer-loop.sh +44 -4
- package/bundled/upstream/ecc/skills/continuous-learning-v2/agents/observer.md +4 -4
- package/bundled/upstream/ecc/skills/continuous-learning-v2/agents/start-observer.sh +5 -1
- package/bundled/upstream/ecc/skills/continuous-learning-v2/hooks/observe.sh +21 -5
- package/bundled/upstream/ecc/skills/continuous-learning-v2/scripts/detect-project.sh +58 -13
- package/bundled/upstream/ecc/skills/continuous-learning-v2/scripts/instinct-cli.py +97 -4
- package/bundled/upstream/ecc/skills/continuous-learning-v2/scripts/lib/homunculus-dir.sh +31 -0
- package/bundled/upstream/ecc/skills/continuous-learning-v2/scripts/migrate-homunculus.sh +62 -0
- package/bundled/upstream/ecc/skills/continuous-learning-v2/scripts/test_parse_instinct.py +34 -0
- package/bundled/upstream/ecc/skills/cost-tracking/SKILL.md +147 -0
- package/bundled/upstream/ecc/skills/deep-research/SKILL.md +4 -0
- package/bundled/upstream/ecc/skills/defi-amm-security/SKILL.md +6 -0
- package/bundled/upstream/ecc/skills/django-celery/SKILL.md +457 -0
- package/bundled/upstream/ecc/skills/ecc-guide/SKILL.md +189 -0
- package/bundled/upstream/ecc/skills/error-handling/SKILL.md +376 -0
- package/bundled/upstream/ecc/skills/exa-search/SKILL.md +4 -0
- package/bundled/upstream/ecc/skills/fal-ai-media/SKILL.md +4 -0
- package/bundled/upstream/ecc/skills/fastapi-patterns/SKILL.md +327 -0
- package/bundled/upstream/ecc/skills/flox-environments/SKILL.md +496 -0
- package/bundled/upstream/ecc/skills/frontend-design-direction/SKILL.md +92 -0
- package/bundled/upstream/ecc/skills/frontend-slides/animation-patterns.md +122 -0
- package/bundled/upstream/ecc/skills/frontend-slides/html-template.md +419 -0
- package/bundled/upstream/ecc/skills/frontend-slides/scripts/export-pdf.sh +418 -0
- package/bundled/upstream/ecc/skills/frontend-slides/scripts/extract-pptx.py +96 -0
- package/bundled/upstream/ecc/skills/frontend-slides/viewport-base.css +153 -0
- package/bundled/upstream/ecc/skills/fsharp-testing/SKILL.md +280 -0
- package/bundled/upstream/ecc/skills/gateguard/SKILL.md +4 -0
- package/bundled/upstream/ecc/skills/hermes-imports/SKILL.md +88 -0
- package/bundled/upstream/ecc/skills/homelab-network-readiness/SKILL.md +169 -0
- package/bundled/upstream/ecc/skills/homelab-network-setup/SKILL.md +129 -0
- package/bundled/upstream/ecc/skills/homelab-pihole-dns/SKILL.md +274 -0
- package/bundled/upstream/ecc/skills/homelab-vlan-segmentation/SKILL.md +311 -0
- package/bundled/upstream/ecc/skills/homelab-wireguard-vpn/SKILL.md +305 -0
- package/bundled/upstream/ecc/skills/ios-icon-gen/SKILL.md +157 -0
- package/bundled/upstream/ecc/skills/ios-icon-gen/scripts/generate_icons.swift +258 -0
- package/bundled/upstream/ecc/skills/ios-icon-gen/scripts/iconify_gen.sh +235 -0
- package/bundled/upstream/ecc/skills/java-coding-standards/SKILL.md +241 -5
- package/bundled/upstream/ecc/skills/make-interfaces-feel-better/SKILL.md +151 -0
- package/bundled/upstream/ecc/skills/mle-workflow/SKILL.md +346 -0
- package/bundled/upstream/ecc/skills/motion-advanced/SKILL.md +596 -0
- package/bundled/upstream/ecc/skills/motion-foundations/SKILL.md +299 -0
- package/bundled/upstream/ecc/skills/motion-patterns/SKILL.md +435 -0
- package/bundled/upstream/ecc/skills/motion-ui/SKILL.md +575 -0
- package/bundled/upstream/ecc/skills/mysql-patterns/SKILL.md +412 -0
- package/bundled/upstream/ecc/skills/netmiko-ssh-automation/SKILL.md +173 -0
- package/bundled/upstream/ecc/skills/network-bgp-diagnostics/SKILL.md +167 -0
- package/bundled/upstream/ecc/skills/network-config-validation/SKILL.md +210 -0
- package/bundled/upstream/ecc/skills/network-interface-health/SKILL.md +152 -0
- package/bundled/upstream/ecc/skills/openclaw-persona-forge/SKILL.md +1 -9
- package/bundled/upstream/ecc/skills/plan-orchestrate/SKILL.md +262 -0
- package/bundled/upstream/ecc/skills/prisma-patterns/SKILL.md +371 -0
- package/bundled/upstream/ecc/skills/production-audit/SKILL.md +206 -0
- package/bundled/upstream/ecc/skills/prompt-optimizer/SKILL.md +24 -400
- package/bundled/upstream/ecc/skills/quarkus-patterns/SKILL.md +722 -0
- package/bundled/upstream/ecc/skills/quarkus-security/SKILL.md +467 -0
- package/bundled/upstream/ecc/skills/quarkus-tdd/SKILL.md +811 -0
- package/bundled/upstream/ecc/skills/quarkus-verification/SKILL.md +479 -0
- package/bundled/upstream/ecc/skills/redis-patterns/SKILL.md +403 -0
- package/bundled/upstream/ecc/skills/scientific-db-pubmed-database/SKILL.md +175 -0
- package/bundled/upstream/ecc/skills/scientific-db-uspto-database/SKILL.md +177 -0
- package/bundled/upstream/ecc/skills/scientific-pkg-gget/SKILL.md +166 -0
- package/bundled/upstream/ecc/skills/scientific-thinking-literature-review/SKILL.md +192 -0
- package/bundled/upstream/ecc/skills/scientific-thinking-scholar-evaluation/SKILL.md +160 -0
- package/bundled/upstream/ecc/skills/search-first/SKILL.md +23 -2
- package/bundled/upstream/ecc/skills/security-review/SKILL.md +10 -2
- package/bundled/upstream/ecc/skills/skill-comply/scripts/runner.py +28 -3
- package/bundled/upstream/ecc/skills/skill-comply/tests/test_runner.py +172 -0
- package/bundled/upstream/ecc/skills/skill-scout/SKILL.md +140 -0
- package/bundled/upstream/ecc/skills/skill-stocktake/SKILL.md +1 -0
- package/bundled/upstream/ecc/skills/strategic-compact/SKILL.md +2 -2
- package/bundled/upstream/ecc/skills/tinystruct-patterns/SKILL.md +203 -0
- package/bundled/upstream/ecc/skills/tinystruct-patterns/references/architecture.md +90 -0
- package/bundled/upstream/ecc/skills/tinystruct-patterns/references/data-handling.md +60 -0
- package/bundled/upstream/ecc/skills/tinystruct-patterns/references/database.md +99 -0
- package/bundled/upstream/ecc/skills/tinystruct-patterns/references/routing.md +64 -0
- package/bundled/upstream/ecc/skills/tinystruct-patterns/references/system-usage.md +97 -0
- package/bundled/upstream/ecc/skills/tinystruct-patterns/references/testing.md +72 -0
- package/bundled/upstream/ecc/skills/ui-to-vue/SKILL.md +134 -0
- package/bundled/upstream/ecc/skills/vite-patterns/SKILL.md +449 -0
- package/bundled/upstream/ecc/skills/windows-desktop-e2e/SKILL.md +788 -0
- package/bundled/upstream/ecc/skills/x-api/SKILL.md +4 -0
- package/bundled/upstream/oh-my-claudecode/.omc-source/bundle.json +20 -0
- package/bundled/upstream/oh-my-claudecode/agents/analyst.md +2 -1
- package/bundled/upstream/oh-my-claudecode/agents/architect.md +2 -1
- package/bundled/upstream/oh-my-claudecode/agents/code-reviewer.md +26 -7
- package/bundled/upstream/oh-my-claudecode/agents/critic.md +2 -1
- package/bundled/upstream/oh-my-claudecode/agents/debugger.md +2 -1
- package/bundled/upstream/oh-my-claudecode/agents/designer.md +14 -1
- package/bundled/upstream/oh-my-claudecode/agents/document-specialist.md +1 -1
- package/bundled/upstream/oh-my-claudecode/agents/executor.md +2 -1
- package/bundled/upstream/oh-my-claudecode/agents/explore.md +2 -1
- package/bundled/upstream/oh-my-claudecode/agents/git-master.md +2 -1
- package/bundled/upstream/oh-my-claudecode/agents/planner.md +2 -1
- package/bundled/upstream/oh-my-claudecode/agents/qa-tester.md +2 -1
- package/bundled/upstream/oh-my-claudecode/agents/scientist.md +2 -1
- package/bundled/upstream/oh-my-claudecode/agents/security-reviewer.md +2 -1
- package/bundled/upstream/oh-my-claudecode/agents/test-engineer.md +2 -1
- package/bundled/upstream/oh-my-claudecode/agents/tracer.md +2 -1
- package/bundled/upstream/oh-my-claudecode/agents/verifier.md +2 -1
- package/bundled/upstream/oh-my-claudecode/agents/writer.md +2 -1
- package/bundled/upstream/oh-my-claudecode/skills/AGENTS.md +4 -3
- package/bundled/upstream/oh-my-claudecode/skills/ai-slop-cleaner/SKILL.md +12 -0
- package/bundled/upstream/oh-my-claudecode/skills/deep-dive/SKILL.md +69 -13
- package/bundled/upstream/oh-my-claudecode/skills/deep-interview/SKILL.md +176 -63
- package/bundled/upstream/oh-my-claudecode/skills/learner/SKILL.md +3 -1
- package/bundled/upstream/oh-my-claudecode/skills/omc-doctor/SKILL.md +22 -3
- package/bundled/upstream/oh-my-claudecode/skills/omc-reference/SKILL.md +1 -1
- package/bundled/upstream/oh-my-claudecode/skills/omc-setup/phases/01-install-claude-md.md +2 -2
- package/bundled/upstream/oh-my-claudecode/skills/omc-setup/phases/02-configure.md +45 -2
- package/bundled/upstream/oh-my-claudecode/skills/omc-setup/phases/03-integrations.md +46 -5
- package/bundled/upstream/oh-my-claudecode/skills/plan/SKILL.md +19 -17
- package/bundled/upstream/oh-my-claudecode/skills/project-session-manager/lib/config.sh +1 -1
- package/bundled/upstream/oh-my-claudecode/skills/project-session-manager/lib/parse.sh +1 -1
- package/bundled/upstream/oh-my-claudecode/skills/project-session-manager/lib/providers/azure-devops.sh +1 -1
- package/bundled/upstream/oh-my-claudecode/skills/project-session-manager/lib/providers/bitbucket.sh +1 -1
- package/bundled/upstream/oh-my-claudecode/skills/project-session-manager/lib/providers/gitea.sh +1 -1
- package/bundled/upstream/oh-my-claudecode/skills/project-session-manager/lib/providers/github.sh +1 -1
- package/bundled/upstream/oh-my-claudecode/skills/project-session-manager/lib/providers/gitlab.sh +1 -1
- package/bundled/upstream/oh-my-claudecode/skills/project-session-manager/lib/providers/interface.sh +1 -1
- package/bundled/upstream/oh-my-claudecode/skills/project-session-manager/lib/providers/jira.sh +1 -1
- package/bundled/upstream/oh-my-claudecode/skills/project-session-manager/lib/session.sh +1 -1
- package/bundled/upstream/oh-my-claudecode/skills/project-session-manager/lib/tmux.sh +1 -1
- package/bundled/upstream/oh-my-claudecode/skills/project-session-manager/lib/worktree.sh +1 -1
- package/bundled/upstream/oh-my-claudecode/skills/project-session-manager/psm.sh +1 -1
- package/bundled/upstream/oh-my-claudecode/skills/project-session-manager/tests/test-psm-prompt-injection.sh +1 -1
- package/bundled/upstream/oh-my-claudecode/skills/ralph/SKILL.md +8 -8
- package/bundled/upstream/oh-my-claudecode/skills/ralplan/SKILL.md +9 -5
- package/bundled/upstream/oh-my-claudecode/skills/skill/SKILL.md +6 -6
- package/bundled/upstream/oh-my-claudecode/skills/skillify/SKILL.md +19 -3
- package/bundled/upstream/oh-my-claudecode/skills/trace/SKILL.md +3 -1
- package/bundled/upstream/oh-my-claudecode/skills/ultrawork/SKILL.md +20 -7
- package/bundled/upstream/superpowers/.omc-source/bundle.json +21 -0
- package/bundled/upstream/superpowers/hooks/hooks-cursor.json +1 -1
- package/bundled/upstream/superpowers/skills/executing-plans/SKILL.md +1 -1
- package/bundled/upstream/superpowers/skills/finishing-a-development-branch/SKILL.md +93 -42
- package/bundled/upstream/superpowers/skills/requesting-code-review/SKILL.md +7 -9
- package/bundled/upstream/superpowers/skills/requesting-code-review/code-reviewer.md +107 -85
- package/bundled/upstream/superpowers/skills/subagent-driven-development/SKILL.md +3 -1
- package/bundled/upstream/superpowers/skills/subagent-driven-development/code-quality-reviewer-prompt.md +2 -3
- package/bundled/upstream/superpowers/skills/systematic-debugging/CREATION-LOG.md +1 -1
- package/bundled/upstream/superpowers/skills/systematic-debugging/root-cause-tracing.md +1 -1
- package/bundled/upstream/superpowers/skills/using-git-worktrees/SKILL.md +95 -98
- package/bundled/upstream/superpowers/skills/using-superpowers/references/codex-tools.md +7 -48
- package/bundled/upstream/superpowers/skills/using-superpowers/references/copilot-tools.md +1 -11
- package/bundled/upstream/superpowers/skills/using-superpowers/references/gemini-tools.md +21 -3
- package/bundled/upstream/superpowers/skills/writing-plans/SKILL.md +1 -1
- package/package.json +1 -1
- package/bundled/upstream/anthropic-skills/skills/claude-api/python/agent-sdk/README.md +0 -355
- package/bundled/upstream/anthropic-skills/skills/claude-api/python/agent-sdk/patterns.md +0 -359
- package/bundled/upstream/anthropic-skills/skills/claude-api/typescript/agent-sdk/README.md +0 -297
- package/bundled/upstream/anthropic-skills/skills/claude-api/typescript/agent-sdk/patterns.md +0 -209
- package/bundled/upstream/ecc/commands/agent-sort.md +0 -23
- package/bundled/upstream/ecc/commands/claw.md +0 -23
- package/bundled/upstream/ecc/commands/context-budget.md +0 -23
- package/bundled/upstream/ecc/commands/devfleet.md +0 -23
- package/bundled/upstream/ecc/commands/docs.md +0 -23
- package/bundled/upstream/ecc/commands/e2e.md +0 -268
- package/bundled/upstream/ecc/commands/eval.md +0 -23
- package/bundled/upstream/ecc/commands/orchestrate.md +0 -135
- package/bundled/upstream/ecc/commands/prompt-optimize.md +0 -23
- package/bundled/upstream/ecc/commands/rules-distill.md +0 -20
- package/bundled/upstream/ecc/commands/tdd.md +0 -231
- package/bundled/upstream/ecc/commands/verify.md +0 -23
- package/bundled/upstream/ecc/skills/claude-api/SKILL.md +0 -337
- package/bundled/upstream/ecc/skills/frontend-design/SKILL.md +0 -145
- package/bundled/upstream/superpowers/agents/code-reviewer.md +0 -48
- package/bundled/upstream/superpowers/commands/brainstorm.md +0 -5
- package/bundled/upstream/superpowers/commands/execute-plan.md +0 -5
- package/bundled/upstream/superpowers/commands/write-plan.md +0 -5
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
# High-Risk Surface Triage — Stage 1
|
|
2
|
+
|
|
3
|
+
Triage runs during Stage 1 (static analysis), **before any code generation**. Its
|
|
4
|
+
output is `risk-triage.json`. Every surface in the tier catalog below is evaluated
|
|
5
|
+
against every discovered usage in the source. Tier assignment is final for a given
|
|
6
|
+
iOS floor — it is not re-evaluated per component.
|
|
7
|
+
|
|
8
|
+
Source: findings.md RQ6 (Android→iOS pilot 2507.16037; lottie-ios 4.3; rive-ios;
|
|
9
|
+
Stripe iOS; Firebase iOS; Google Maps SPM; Apple WWDC; WebRTC iOS).
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## Tier definitions
|
|
14
|
+
|
|
15
|
+
| Tier | Name | What the skill emits | Compiler behavior | Human action required |
|
|
16
|
+
|---|---|---|---|---|
|
|
17
|
+
| 1 | **Auto** | Full, correct native implementation | Compiles and runs | Verify behavior, no code change expected |
|
|
18
|
+
| 2 | **Assisted** | Compiling stub with `// VERIFY` comment at every deviation | Compiles; may not match source behavior exactly | Review marked deviations; test on device |
|
|
19
|
+
| 3 | **Human-only** | Non-compiling stub with `fatalError` + `// OMC-CONVERSION: HUMAN-ONLY` block | **Does not compile by design** | Must be replaced before the app ships |
|
|
20
|
+
|
|
21
|
+
Tier 3 stubs **must fail to ship**. Using `fatalError`/`preconditionFailure`
|
|
22
|
+
ensures the Xcode build reminder is the app crashing at the stub call site during
|
|
23
|
+
testing — not a subtle runtime wrong behavior that reaches users. (findings.md RQ6
|
|
24
|
+
cites the 2507.16037 pilot: 43.2% of auto-converted files were invalid with no
|
|
25
|
+
clean build "without substantial human effort".)
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
## iOS floor awareness
|
|
30
|
+
|
|
31
|
+
Some conversions are only available above a minimum iOS version. When
|
|
32
|
+
`--ios-floor` is below the listed floor, the tier upgrades one level (Tier 1 →
|
|
33
|
+
Tier 2 if a workaround exists, Tier 2 → Tier 3 if not).
|
|
34
|
+
|
|
35
|
+
| API | Minimum iOS |
|
|
36
|
+
|---|---|
|
|
37
|
+
| `KeyframeAnimator` | 17 |
|
|
38
|
+
| `scrollTransition` | 17 |
|
|
39
|
+
| `onScrollGeometryChange` | 18 |
|
|
40
|
+
| Swift Charts (`Chart`) | 16 |
|
|
41
|
+
| `Canvas` | 15 |
|
|
42
|
+
| `Layout` protocol | 16 |
|
|
43
|
+
| `AVPlayer` with HLS | 7 (always available in v1 scope) |
|
|
44
|
+
|
|
45
|
+
---
|
|
46
|
+
|
|
47
|
+
## Tier catalog
|
|
48
|
+
|
|
49
|
+
Detection signal: file/line reference from static scan + grep of source, not
|
|
50
|
+
runtime behavior. The `detect` column is what `scripts/detect-stack.mjs` and the
|
|
51
|
+
Stage 1 static analyzer grep for.
|
|
52
|
+
|
|
53
|
+
| Surface | Detection signal in source | Native iOS counterpart | Tier | Fidelity risk |
|
|
54
|
+
|---|---|---|---|---|
|
|
55
|
+
| **Lottie `.json` / `.lottie`** | `lottie-web` dep; `new Lottie.loadAnimation`; `.lottie` file references | `lottie-ios 4.3` — same asset file, `LottieAnimationView` | **1 Auto** | Low — asset file identical, timing matches |
|
|
56
|
+
| **Rive `.riv`** | `@rive-app/canvas` dep; `new Rive(...)` with `.riv` file | `rive-ios` — same `.riv` asset, `RiveViewModel` | **1 Auto** | Low — asset file identical |
|
|
57
|
+
| **REST + JSON** | `fetch('/api/...')`, `axios.get`, `XMLHttpRequest` JSON endpoints | `URLSession.shared.data(from:)` async/await | **1 Auto** | None — semantics equivalent; ATS flag applies to `http://` |
|
|
58
|
+
| **HLS `<video>`** | `<video src="...m3u8">`, HLS.js dep | `AVPlayer` + `AVPlayerViewController` or custom `VideoPlayer` | **1 Auto** | Low — HLS is a first-class iOS media format |
|
|
59
|
+
| **`localStorage` KV** | `localStorage.getItem`, `localStorage.setItem` | `UserDefaults.standard` | **1 Auto** (non-secrets only) | **Critical caveat:** auth tokens/secrets must NOT go to UserDefaults — see anti-pattern section |
|
|
60
|
+
| **Chart.js / D3 charts** | `chart.js` dep; `new Chart(ctx, {type:...})`; `d3` dep with `d3.select` | Swift Charts (`Chart`) iOS 16+ | **2 Assisted** | Medium — data series ports cleanly; custom chart types (radar, custom scales) may not |
|
|
61
|
+
| **Static SVG** | Inline `<svg>` elements or `.svg` file `<img>` embeds with no animation | SwiftUI `Path` / `Image(systemName:)` / `Canvas` | **2 Assisted** | Medium — simple shapes port; complex filters, patterns, and gradients require `// VERIFY` |
|
|
62
|
+
| **Scroll-linked effects** | `window.addEventListener('scroll', ...)`, `IntersectionObserver`, `scroll-timeline` CSS | `.scrollTransition` (iOS 17+) / `onScrollGeometryChange` (iOS 18+) | **2 Assisted** | Medium — parallax and fade effects port; physics-based scroll effects are Tier 3 |
|
|
63
|
+
| **Maps (basic region + markers)** | `google.maps.Map`, `mapboxgl.Map`, `<MapContainer>` (leaflet) basic usage | `MapKit` / `Map` SwiftUI view (iOS 17+) | **2 Assisted** | Medium — region display and pin markers port; custom tile layers, routing UI, Street View are Tier 3 |
|
|
64
|
+
| **GSAP / CSS keyframes (linear/cubic)** | `gsap.to(...)` linear/cubic easing; `@keyframes` with `from`/`to` or step keyframes | `KeyframeAnimator` (iOS 17+) / `withAnimation(.easeInOut)` | **2 Assisted** | Medium — simple easing ports; spring physics, morphing, and stagger sequences are Tier 3 |
|
|
65
|
+
| **`http://` REST endpoints** | `fetch('http://...')` or `axios.get('http://...')` with non-TLS scheme | `URLSession` with ATS exemption or enforce TLS | **2 Assisted** | High — ATS blocks `http://` by default; emit `// WARNING: ATS — this URL must be upgraded to HTTPS or an ATS exception added to Info.plist` |
|
|
66
|
+
| **`IndexedDB` / complex storage** | `indexedDB.open(...)`, `idb` dep | No direct equivalent; use CoreData, SwiftData (iOS 17+), or SQLite | **2 Assisted** | High — data model ports; query API is completely different |
|
|
67
|
+
| **Canvas 2D (non-chart)** | `canvas.getContext('2d')`, `ctx.drawImage`, `ctx.fillRect` as primary rendering | SwiftUI `Canvas` (iOS 15+) / `drawRect` in `UIView` | **2 Assisted** (simple drawing) / **3** (pixel-manipulation shaders) | High — drawing commands port individually; `getImageData`/`putImageData` pixel manipulation is Tier 3 |
|
|
68
|
+
| **WebGL / WebGPU** | `canvas.getContext('webgl')`, `canvas.getContext('webgpu')`, `three.js`, `babylon.js` deps | Metal / MetalKit / RealityKit (requires GLSL→MSL translation, state model redesign) | **3 Human-only** | Critical — GLSL and WGSL do not mechanically translate to MSL; coordinate system, depth buffer conventions, and GPU state model differ; no automatable path |
|
|
69
|
+
| **`requestAnimationFrame` physics** | `requestAnimationFrame` in a game loop or physics update; Matter.js, Cannon.js deps | UIKit `CADisplayLink` or custom physics engine | **3 Human-only** | Critical — frame-loop physics is architectural; no declarative SwiftUI equivalent |
|
|
70
|
+
| **WebRTC** | `RTCPeerConnection`, `navigator.mediaDevices.getUserMedia`, `simple-peer` dep | `WebRTC.framework` (Google) or `LiveKit` SDK; requires entitlements + provisioning | **3 Human-only** | Critical — signaling protocol, ICE, and media pipeline require full reimplementation |
|
|
71
|
+
| **Stripe.js / payment surfaces** | `@stripe/stripe-js`, `loadStripe(...)`, `CardElement` | Stripe iOS SDK + Apple Pay entitlement | **3 Human-only** | Critical — publishable key handling, webhook secrets, and PCI compliance require human audit; never auto-port |
|
|
72
|
+
| **Firebase / OAuth provisioning** | `firebase/auth`, `GoogleSignIn`, `signInWithPopup` | Firebase iOS SDK / GoogleSignIn iOS; requires `GoogleService-Info.plist`, URL schemes, entitlements | **3 Human-only** | High — client IDs, redirect URIs, and entitlement provisioning cannot be inferred from web config |
|
|
73
|
+
| **Analytics / ATT** | `gtag`, `mixpanel`, `amplitude`, `posthog`; any event tracking | ATT framework (`AppTrackingTransparency`); native analytics SDK | **3 Human-only** | High — ATT permission prompt must appear before any IDFA access; timing and phrasing are legally significant in some jurisdictions |
|
|
74
|
+
| **`SessionStorage` / auth tokens in storage** | `sessionStorage.setItem('token', ...)`, `localStorage.setItem('authToken', ...)` | `Keychain` via `Security.framework` | **3 Human-only** | Critical — see anti-pattern section |
|
|
75
|
+
|
|
76
|
+
---
|
|
77
|
+
|
|
78
|
+
## Anti-pattern call-out (never emit these)
|
|
79
|
+
|
|
80
|
+
These three patterns are the canonical examples of **confident, compiling, subtly
|
|
81
|
+
wrong code** — the exact failure mode the skill forbids.
|
|
82
|
+
|
|
83
|
+
### 1. Auth tokens in UserDefaults (not Keychain)
|
|
84
|
+
```swift
|
|
85
|
+
// WRONG — never emit this for auth tokens
|
|
86
|
+
UserDefaults.standard.set(token, forKey: "authToken")
|
|
87
|
+
|
|
88
|
+
// Correct — emit a Tier-3 stub instead
|
|
89
|
+
// OMC-CONVERSION: HUMAN-ONLY
|
|
90
|
+
// Reason: auth tokens must be stored in Keychain (Security.framework kSecClassGenericPassword),
|
|
91
|
+
// not UserDefaults. UserDefaults is not encrypted at rest and is accessible without the
|
|
92
|
+
// Secure Enclave. Port this using SecItemAdd/SecItemCopyMatching or a Keychain wrapper library.
|
|
93
|
+
preconditionFailure("Token storage not implemented — see conversion-report.json")
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
### 2. ATS-dropped `http://` URLs
|
|
97
|
+
```swift
|
|
98
|
+
// WRONG — compiles but ATS blocks this at runtime on all iOS apps without an exception
|
|
99
|
+
let url = URL(string: "http://api.example.com/data")!
|
|
100
|
+
|
|
101
|
+
// Correct — emit Tier-2 stub with explicit warning
|
|
102
|
+
// VERIFY: ATS blocks http:// by default. Either:
|
|
103
|
+
// (a) Upgrade the server to https:// (preferred), or
|
|
104
|
+
// (b) Add NSAppTransportSecurity > NSAllowsArbitraryLoads exception to Info.plist (not recommended for production).
|
|
105
|
+
let url = URL(string: "http://api.example.com/data")! // ATS WARNING — see above
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
### 3. Fake-timed `withAnimation` (mimicking CSS duration with a hardcoded constant)
|
|
109
|
+
```swift
|
|
110
|
+
// WRONG — not an animation port, it is a guess that will look wrong on different devices
|
|
111
|
+
withAnimation(.easeInOut(duration: 0.3)) { ... }
|
|
112
|
+
|
|
113
|
+
// Correct for Tier-2 (when CSS timing is known):
|
|
114
|
+
// VERIFY: CSS animation was 'transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1)'
|
|
115
|
+
// The cubic-bezier maps to approximately .timingCurve(0.4, 0, 0.2, 1, duration: 0.3)
|
|
116
|
+
// Verify visually against the reference render.
|
|
117
|
+
withAnimation(.timingCurve(0.4, 0, 0.2, 1, duration: 0.3)) { ... } // VERIFY
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
---
|
|
121
|
+
|
|
122
|
+
## Tier-3 non-compiling stub format
|
|
123
|
+
|
|
124
|
+
Every Tier-3 stub must include the machine-parseable block. This format allows
|
|
125
|
+
`conversion-report.json` to be generated by grep, not by LLM post-processing.
|
|
126
|
+
|
|
127
|
+
```swift
|
|
128
|
+
// OMC-CONVERSION: HUMAN-ONLY
|
|
129
|
+
// surface: WebGL
|
|
130
|
+
// file: src/components/Globe.tsx
|
|
131
|
+
// reason: WebGL (Three.js) cannot be automatically converted to Metal/MetalKit.
|
|
132
|
+
// GLSL shaders require manual translation to MSL. GPU state model and coordinate
|
|
133
|
+
// conventions differ. Suggested native counterpart: Metal + SceneKit or RealityKit.
|
|
134
|
+
// action: Replace this stub with a Metal-based implementation before shipping.
|
|
135
|
+
struct GlobeView: View {
|
|
136
|
+
var body: some View {
|
|
137
|
+
fatalError("GlobeView: WebGL conversion not implemented — OMC-CONVERSION: HUMAN-ONLY")
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
The `// OMC-CONVERSION: HUMAN-ONLY` marker on the first line is the grep anchor.
|
|
143
|
+
Fields `surface`, `file`, and `reason` are on subsequent `//` lines in `key: value`
|
|
144
|
+
format. The `fatalError` is the last statement in `body`.
|
|
145
|
+
|
|
146
|
+
---
|
|
147
|
+
|
|
148
|
+
## `conversion-report.json` schema
|
|
149
|
+
|
|
150
|
+
Aggregated at Stage 7. One entry per triaged surface (all tiers — Tier 1/2 entries
|
|
151
|
+
confirm what was auto-handled; Tier 3 entries are the required human action list).
|
|
152
|
+
|
|
153
|
+
```json
|
|
154
|
+
{
|
|
155
|
+
"schema": "h5-to-swiftui/conversion-report@1",
|
|
156
|
+
"generated_at": "2026-05-19T12:00:00Z",
|
|
157
|
+
"ios_floor": 17,
|
|
158
|
+
"surfaces": [
|
|
159
|
+
{
|
|
160
|
+
"surface": "WebGL",
|
|
161
|
+
"file": "Sources/App/Globe/GlobeView.swift",
|
|
162
|
+
"line": 12,
|
|
163
|
+
"severity": "critical",
|
|
164
|
+
"tier": 3,
|
|
165
|
+
"native_counterpart": "Metal + SceneKit or RealityKit",
|
|
166
|
+
"action_required": "Replace fatalError stub with Metal-based implementation; translate GLSL shaders to MSL manually"
|
|
167
|
+
},
|
|
168
|
+
{
|
|
169
|
+
"surface": "Lottie",
|
|
170
|
+
"file": "Sources/App/Onboarding/OnboardingAnimationView.swift",
|
|
171
|
+
"line": 8,
|
|
172
|
+
"severity": "none",
|
|
173
|
+
"tier": 1,
|
|
174
|
+
"native_counterpart": "lottie-ios 4.3 LottieAnimationView",
|
|
175
|
+
"action_required": "None — auto-converted; verify animation timing on device"
|
|
176
|
+
},
|
|
177
|
+
{
|
|
178
|
+
"surface": "http-endpoint",
|
|
179
|
+
"file": "Sources/App/Network/APIClient.swift",
|
|
180
|
+
"line": 34,
|
|
181
|
+
"severity": "high",
|
|
182
|
+
"tier": 2,
|
|
183
|
+
"native_counterpart": "URLSession — upgrade URL to https://",
|
|
184
|
+
"action_required": "Upgrade http:// to https:// or add ATS exception to Info.plist"
|
|
185
|
+
}
|
|
186
|
+
],
|
|
187
|
+
"summary": {
|
|
188
|
+
"tier1_count": 3,
|
|
189
|
+
"tier2_count": 2,
|
|
190
|
+
"tier3_count": 1,
|
|
191
|
+
"human_action_required": true
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
| Field | Type | Notes |
|
|
197
|
+
|---|---|---|
|
|
198
|
+
| `surface` | string | Short surface name from the tier catalog (e.g. `"WebGL"`, `"Lottie"`, `"REST"`) |
|
|
199
|
+
| `file` | string | Output Swift file path (not input H5 file) |
|
|
200
|
+
| `line` | integer | Line number of the stub or generated call site in the Swift file |
|
|
201
|
+
| `severity` | string | `"critical"` \| `"high"` \| `"medium"` \| `"low"` \| `"none"` |
|
|
202
|
+
| `tier` | integer | 1, 2, or 3 |
|
|
203
|
+
| `native_counterpart` | string | Specific framework/API/library to use |
|
|
204
|
+
| `action_required` | string | Concrete instruction for the human reviewer |
|
|
205
|
+
|
|
206
|
+
The `conversion-report.json` is the primary deliverable for communicating what a
|
|
207
|
+
human must finish. The final run summary (`convergence-summary.json`) must lead
|
|
208
|
+
with `"needs-human": true` and the Tier-3 count when any Tier-3 surfaces are
|
|
209
|
+
present.
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
# Stage 2.5 — Render-Equivalence Calibration
|
|
2
|
+
|
|
3
|
+
**Why this exists.** A simulator screenshot and a Playwright screenshot of
|
|
4
|
+
the "same" screen are *not* comparable rasters. Diffing them directly makes
|
|
5
|
+
every metric meaningless and the loop oscillates on non-defects. Calibration
|
|
6
|
+
defines the exact normalization that makes them comparable, and **measures
|
|
7
|
+
the best achievable cross-renderer agreement** so Stage 5 gates against a
|
|
8
|
+
real number instead of an asserted constant.
|
|
9
|
+
|
|
10
|
+
## The non-comparability sources (all must be neutralized)
|
|
11
|
+
|
|
12
|
+
| Source | H5 (Playwright/WebKit) | iOS (simctl/SwiftUI) | Fix |
|
|
13
|
+
|---|---|---|---|
|
|
14
|
+
| Chrome | no status bar / home indicator | full framebuffer incl. status bar, notch, home indicator | crop simulator content rect via known safe-area insets for `--device` |
|
|
15
|
+
| Scale | logical px × `deviceScaleFactor` | physical px (e.g. @3x) | resample **both** to a common logical raster (device logical pt × fixed scale) with an **identical filter** (Lanczos3 both sides) |
|
|
16
|
+
| Color | sRGB-tagged PNG | Display-P3 framebuffer | convert P3 → sRGB (relative colorimetric) before any ΔE |
|
|
17
|
+
| Coords | DOM bbox in CSS px @ logical viewport | view frame in screen pt | apply `transform` (scale + safe-area offset) DOM-bbox → screen-rect |
|
|
18
|
+
| Text raster | Skia glyphs | CoreText glyphs | irreducible — handled in Stage 5 by judging text regions on layout-box IoU + resolved token-color ΔE, NOT glyph-raster SSIM |
|
|
19
|
+
|
|
20
|
+
## Calibration procedure
|
|
21
|
+
|
|
22
|
+
Inputs: `assets/calibration/` ships a **hand-built known-correct SwiftUI
|
|
23
|
+
screen** + its **H5 twin** (must include both a text block and a non-text
|
|
24
|
+
color/shape block).
|
|
25
|
+
|
|
26
|
+
1. Render H5 twin via `capture-reference.mjs` settings; render the SwiftUI
|
|
27
|
+
twin via `sim-screenshot.sh` for `--device`.
|
|
28
|
+
2. Apply the normalization pipeline above → two co-registered logical
|
|
29
|
+
rasters + the `transform`.
|
|
30
|
+
3. Run `pixel-diff.mjs` on the *known-correct* pair. The result is the
|
|
31
|
+
**best achievable** cross-renderer agreement for this exact toolchain:
|
|
32
|
+
- `floor.ssim_nontext` — SSIM over non-text regions (expect ≥ ~0.98)
|
|
33
|
+
- `floor.deltaE_p95` — 95th-pct CIEDE2000 over color regions
|
|
34
|
+
- `floor.text_iou` — layout-box IoU achievable for text regions
|
|
35
|
+
- `floor.ssim_global` — whole-screen SSIM of a *correct* screen (this is
|
|
36
|
+
the realistic ceiling, typically **< 0.995**, often ~0.97–0.99 with text)
|
|
37
|
+
4. Sanity bound: if the known-correct pair cannot beat conservative bounds
|
|
38
|
+
(`ssim_nontext ≥ 0.95`, `text_iou ≥ 0.9`), the toolchain is **not
|
|
39
|
+
measurable** → write `blocked.json` and STOP. Never grade real screens
|
|
40
|
+
against an unproven metric.
|
|
41
|
+
5. **Flat-content guard**: SSIM is insensitive to a uniform mean shift on
|
|
42
|
+
near-zero-variance (effectively flat) images — a clearly-divergent solid
|
|
43
|
+
pair can still score ~0.95. If BOTH normalized images are effectively flat
|
|
44
|
+
(luma variance below the flat threshold on each side), the floor is
|
|
45
|
+
unreliable → `blocked.json` + STOP, never a falsely-high floor. This is
|
|
46
|
+
why the bundled calibration content is **textured** (text + a multi-color
|
|
47
|
+
stripe region), not flat solid blocks — see
|
|
48
|
+
`../assets/calibration/README.md`.
|
|
49
|
+
|
|
50
|
+
## `calibration.json` schema (consumed by Stage 5)
|
|
51
|
+
|
|
52
|
+
```json
|
|
53
|
+
{
|
|
54
|
+
"schema": "h5-to-swiftui/calibration@1",
|
|
55
|
+
"pinned": {
|
|
56
|
+
"sim_runtime": "iOS 17.5 (21F79)",
|
|
57
|
+
"device": "iPhone 15 Pro",
|
|
58
|
+
"logical_size": [393, 852],
|
|
59
|
+
"render_scale": 3,
|
|
60
|
+
"browser": "chromium-1180",
|
|
61
|
+
"model_id": "claude-sonnet-4-6",
|
|
62
|
+
"temperature": 0
|
|
63
|
+
},
|
|
64
|
+
"transform": {
|
|
65
|
+
"dom_to_screen_scale": 1.0,
|
|
66
|
+
"safe_area_offset_pt": [0, 59],
|
|
67
|
+
"content_rect_pt": [0, 59, 393, 759],
|
|
68
|
+
"resample_filter": "lanczos3",
|
|
69
|
+
"color": "p3->srgb-relative"
|
|
70
|
+
},
|
|
71
|
+
"twin_hashes": {
|
|
72
|
+
"ref_png": "/abs/path/twin-ref.png",
|
|
73
|
+
"ref_sha256": "…64-hex…",
|
|
74
|
+
"gen_png": "/abs/path/twin-gen.png",
|
|
75
|
+
"gen_sha256": "…64-hex…"
|
|
76
|
+
},
|
|
77
|
+
"calibration_source": {
|
|
78
|
+
"h5_twin_dir": "assets/calibration/h5-twin",
|
|
79
|
+
"swiftui_twin_dir": "assets/calibration/swiftui-twin",
|
|
80
|
+
"h5_twin_source_sha256": "…64-hex…",
|
|
81
|
+
"swiftui_twin_source_sha256": "…64-hex…",
|
|
82
|
+
"source_tree_hash_algo": "sha256/sorted-relpath+filebytes/v1"
|
|
83
|
+
},
|
|
84
|
+
"floor": {
|
|
85
|
+
"ssim_global": 0.982,
|
|
86
|
+
"ssim_nontext": 0.991,
|
|
87
|
+
"deltaE_p95": 1.6,
|
|
88
|
+
"text_iou": null,
|
|
89
|
+
"luma_variance": { "ref": 612.4, "gen": 588.1, "flat_threshold": 9 }
|
|
90
|
+
},
|
|
91
|
+
"gate": {
|
|
92
|
+
"converged": {
|
|
93
|
+
"ssim_nontext_min": 0.986,
|
|
94
|
+
"deltaE_p95_max": 2.0,
|
|
95
|
+
"text_iou_min": null,
|
|
96
|
+
"require_judge_yes": true
|
|
97
|
+
},
|
|
98
|
+
"close": {
|
|
99
|
+
"ssim_nontext_min": 0.981,
|
|
100
|
+
"deltaE_p95_max": 2.4,
|
|
101
|
+
"text_iou_min": null,
|
|
102
|
+
"require_judge_equiv": true
|
|
103
|
+
},
|
|
104
|
+
"gate_explain": "human-readable only — code reads gate.converged / gate.close numerically"
|
|
105
|
+
},
|
|
106
|
+
"measured_at": "ISO8601"
|
|
107
|
+
}
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
`gate.converged` / `gate.close` are **structured numeric objects**, not a
|
|
111
|
+
string DSL — `scripts/evaluate-convergence.mjs` evaluates them directly
|
|
112
|
+
without a parser (a legacy string gate is rejected as un-enforceable). They
|
|
113
|
+
are derived from the measured floor: `ssim_nontext_min = floor − 0.005`,
|
|
114
|
+
`deltaE_p95_max = floor + 0.4`, `text_iou_min = floor − 0.03` (null ⇒ the
|
|
115
|
+
text-IoU sub-gate is skipped for that calibration); `close` is the 2× band.
|
|
116
|
+
`gate_explain` is a human-only convenience string and is **never** evaluated
|
|
117
|
+
by code. The numbers in `floor` are **measured per run**, not shipped
|
|
118
|
+
constants — different Xcode/sim versions yield different floors, which is
|
|
119
|
+
exactly why this stage exists. `floor.luma_variance` records each side's
|
|
120
|
+
structure (a both-flat pair is blocked, never floored).
|
|
121
|
+
|
|
122
|
+
### Provenance binding (enforced, not advisory)
|
|
123
|
+
|
|
124
|
+
`scripts/evaluate-convergence.mjs` **mechanically binds** the floor it grades
|
|
125
|
+
against — these are code-enforced fail-closed checks, not prose:
|
|
126
|
+
|
|
127
|
+
1. **schema** — `calibration.json.schema` MUST be
|
|
128
|
+
`h5-to-swiftui/calibration@1`, else the grader exits 1 (it refuses to
|
|
129
|
+
grade against an unrecognized contract).
|
|
130
|
+
2. **gate ⇐ floor** — the grader **recomputes** the expected structured gate
|
|
131
|
+
from `floor` with the published tolerances (converged
|
|
132
|
+
`ssim_nontext_min = floor − 0.005`, `deltaE_p95_max = floor + 0.4`,
|
|
133
|
+
`text_iou_min = floor − 0.03` when non-null; `close` = 2× band) and
|
|
134
|
+
rejects any `gate` that deviates beyond a 1e-4 rounding epsilon
|
|
135
|
+
(`gate-floor-mismatch`, exit 1). This binds the **gate to the floor**: a
|
|
136
|
+
hand-loosened `gate` (tight-looking `floor` + loose `gate`) is rejected
|
|
137
|
+
unless the `floor` itself is loosened. It does **not** bind the floor's
|
|
138
|
+
*value* — that is checks 3 and 4.
|
|
139
|
+
3. **twin source identity ⇐ shipped twins** — `calibration_source` carries a
|
|
140
|
+
**deterministic SHA-256 source-tree hash** of the bundled
|
|
141
|
+
`assets/calibration/h5-twin` and `assets/calibration/swiftui-twin`
|
|
142
|
+
**source files (excluding build output/dotfiles)**. The grader
|
|
143
|
+
**recomputes those hashes from the actual shipped assets** (resolved
|
|
144
|
+
relative to the skill root, not the cwd) and fails closed
|
|
145
|
+
(`calibration-twin-mismatch`, exit 1) on any mismatch. This binds the
|
|
146
|
+
**identity of the bundled twin source files**. It does **not** re-measure
|
|
147
|
+
or bind the `floor` *value*: an attacker can keep the real, public,
|
|
148
|
+
unmodified bundled-twin source hashes here and still write a loose
|
|
149
|
+
`floor`. (The *rendered* PNGs are runtime-produced and not byte-stable
|
|
150
|
+
across machines, so the SOURCE tree — fixed and shippable — is what is
|
|
151
|
+
bound. `twin_hashes` is non-security provenance metadata of the exact PNGs
|
|
152
|
+
the floor was measured on; the *enforced* binding is the source-tree hash
|
|
153
|
+
of the source files.)
|
|
154
|
+
4. **floor value ⇐ calibrate-render's own sanity envelope** — the grader
|
|
155
|
+
asserts `floor` satisfies the SAME sanity bound `calibrate-render.mjs`
|
|
156
|
+
enforces before it is willing to emit `calibration.json` at all
|
|
157
|
+
(`ssim_nontext ≥ 0.95`, non-null `text_iou ≥ 0.9`, metric-valid
|
|
158
|
+
`deltaE_p95`), via the shared `scripts/_calib-consts.mjs` (single source
|
|
159
|
+
of truth, imported by both producer and consumer). A `floor` that fails
|
|
160
|
+
this envelope could not have been produced by an honest
|
|
161
|
+
`calibrate-render.mjs` run (it writes `blocked.json`, not
|
|
162
|
+
`calibration.json`) ⇒ `floor-implausible`, exit 1. This **kills the
|
|
163
|
+
absurd-floor attack** (e.g. `ssim_nontext:0.05, deltaE_p95:200` with the
|
|
164
|
+
real public twin hashes copied in). It does **not** re-measure the floor:
|
|
165
|
+
a `floor` *within* this envelope yet looser than the TRUE measured floor
|
|
166
|
+
is still trusted — the grader cannot re-render the bundled twins to
|
|
167
|
+
re-derive the real number.
|
|
168
|
+
|
|
169
|
+
**Named irreducible residuals (honest, per §1.1) — BOTH stated, neither
|
|
170
|
+
hidden:**
|
|
171
|
+
|
|
172
|
+
1. **The grader cannot re-execute the simulator renders.** It trusts the
|
|
173
|
+
per-iteration `pixel-diff.mjs` JSONs were produced by running the real
|
|
174
|
+
`pixel-diff.mjs` on real `sim-screenshot.sh` renders (bounded by that
|
|
175
|
+
script's no-fake build/env spine — no simulator / no build ⇒
|
|
176
|
+
`blocked`/`needs-human`, never converged).
|
|
177
|
+
2. **The grader cannot re-measure the calibration floor.** Check 4 asserts
|
|
178
|
+
the supplied `floor` is within calibrate-render's own sanity envelope and
|
|
179
|
+
the gate is recomputed from it, but a `floor` *within* that envelope yet
|
|
180
|
+
looser than the true measured floor is trusted (the grader cannot
|
|
181
|
+
re-render the bundled twins to re-derive the real number). Mitigated by:
|
|
182
|
+
the orchestrator's contractual obligation to run the real,
|
|
183
|
+
sanity/flat-image-spined `calibrate-render.mjs`, and the human-readable
|
|
184
|
+
`calibration_provenance` recorded in the convergence artifact.
|
|
185
|
+
|
|
186
|
+
Both residuals are irreducible without the grader itself re-rendering; they
|
|
187
|
+
are stated, not hidden.
|
|
188
|
+
|
|
189
|
+
## Reproducibility rule
|
|
190
|
+
|
|
191
|
+
Re-running calibration on the same pinned toolchain must produce `floor`
|
|
192
|
+
values within ±0.005 SSIM / ±0.3 ΔE. Larger drift ⇒ environment is unstable;
|
|
193
|
+
record it and degrade the run's claims (Stage 5 verdicts become advisory).
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
# Stack Detection — Stage 0
|
|
2
|
+
|
|
3
|
+
Used by `scripts/detect-stack.mjs`. Runs **before any other stage**. Determines
|
|
4
|
+
whether the project is in v1 scope; out-of-scope projects stop here with an
|
|
5
|
+
explicit written report — they are never guessed past.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Why native rewrite beats WebView shell and mechanical transpilation
|
|
10
|
+
|
|
11
|
+
Condensed from findings.md RQ1 (sources: kean.blog; Apple "Composing custom
|
|
12
|
+
layouts" WWDC22-10056; MDN Specificity; LogRocket / Yoga 3.0; dbushell; bjango;
|
|
13
|
+
fatbobman; MDN animations; tonsky.me; Android→iOS pilot 2507.16037).
|
|
14
|
+
|
|
15
|
+
| Route | Fidelity ceiling | Core failure mechanism |
|
|
16
|
+
|---|---|---|
|
|
17
|
+
| WebView shell (Capacitor / Cordova / Ionic) | ~70–80% | Renders in WebKit, not Core Animation/Metal; ProMotion 120 Hz unavailable to WebKit-rendered content; Dynamic Type needs full reload; rubber-band scroll constant diverges; haptics absent; 2 extra OS processes per instance |
|
|
18
|
+
| React Native / NativeScript | ~85–92% | Yoga bridge drops 5 CSS flex properties (`flex-basis`, `flex` shorthand, `wrap-reverse`, `order`, column/row-gap individually); bridge latency; not SwiftUI semantics |
|
|
19
|
+
| Flutter (Impeller) | ~80–85% | Own GPU renderer independent of UIKit; iOS conventions require manual Cupertino override throughout |
|
|
20
|
+
| Mechanical transpilation (DOM→view tree) | **<60%** | Six structural incompatibilities listed below — errors compound per nesting level |
|
|
21
|
+
| **Native rewrite** (this skill) | **100% platform ceiling** | Requires a render-measure-feedback loop; see `visual-diff-loop-protocol.md` |
|
|
22
|
+
|
|
23
|
+
### Six reasons mechanical transpilation cannot reach pixel-level
|
|
24
|
+
|
|
25
|
+
1. **Inverted layout protocol.** CSS: parent establishes a containing block;
|
|
26
|
+
child size = content + padding + border + margin. SwiftUI: parent _proposes_
|
|
27
|
+
a size; child _chooses_; parent must honor it. The information-flow direction
|
|
28
|
+
is reversed. Reconstructing it from CSS is underdetermined for nested
|
|
29
|
+
layouts. (kean.blog; Apple "Composing custom layouts".)
|
|
30
|
+
|
|
31
|
+
2. **No cascade.** CSS resolves styles by global selector specificity +
|
|
32
|
+
inheritance + `!important`. SwiftUI styling is local modifier-chain order +
|
|
33
|
+
downward `environment`. A transpiler needs a full cascade engine; any cascade
|
|
34
|
+
error is a visible defect. (MDN Specificity.)
|
|
35
|
+
|
|
36
|
+
3. **No 1:1 flex mapping.** Yoga (the most mature CSS-flex bridge) drops
|
|
37
|
+
`flex-basis`, the `flex` shorthand, `wrap-reverse`, `order`, and individual
|
|
38
|
+
`row-gap`/`column-gap`. Errors compound per nesting level. (LogRocket /
|
|
39
|
+
Yoga 3.0.)
|
|
40
|
+
|
|
41
|
+
4. **Font metric divergence.** WebKit implements `line-height: normal ≈ 1.2`
|
|
42
|
+
against the CSS font spec; SwiftUI uses CoreText metrics directly. Identical
|
|
43
|
+
`16px` declarations yield different line height, advance width, and
|
|
44
|
+
baseline — different wrap column — all subsequent layout shifts. (dbushell;
|
|
45
|
+
bjango.)
|
|
46
|
+
|
|
47
|
+
5. **Animation model mismatch.** CSS = timeline keyframes on absolute time;
|
|
48
|
+
SwiftUI = state-diff interpolation on Core Animation. Mechanical
|
|
49
|
+
`@keyframes` → `.animation()` diverges in timing, easing, and
|
|
50
|
+
interruptibility. (fatbobman; MDN animations.)
|
|
51
|
+
|
|
52
|
+
6. **Non-deterministic adaptive spacing.** SwiftUI inserts type-dependent
|
|
53
|
+
spacing and context-sensitive control styling with no CSS source to
|
|
54
|
+
translate from. (tonsky.me.)
|
|
55
|
+
|
|
56
|
+
**Takeaway:** native rewrite is the only route to the 100% ceiling; transpilation
|
|
57
|
+
is at best a draft generator; a render-diff feedback loop is mandatory because
|
|
58
|
+
these divergences are invisible to static code diffing.
|
|
59
|
+
|
|
60
|
+
---
|
|
61
|
+
|
|
62
|
+
## Detection heuristics table
|
|
63
|
+
|
|
64
|
+
`detect-stack.mjs` reads `package.json` + a shallow source scan (`.js/.ts/.jsx/
|
|
65
|
+
.tsx/.vue/.svelte` in `src/` or root, max 500 files). No network calls.
|
|
66
|
+
|
|
67
|
+
### Framework detection
|
|
68
|
+
|
|
69
|
+
| Framework | `package.json` deps (any of) | Source signatures |
|
|
70
|
+
|---|---|---|
|
|
71
|
+
| React | `react`, `react-dom`, `@types/react` | `import React`, `JSX.Element`, `.jsx`/`.tsx` extensions, `ReactDOM.render`, `createRoot` |
|
|
72
|
+
| Vue | `vue`, `@vue/core`, `nuxt` | `.vue` files, `<template>` + `<script setup>`, `createApp` |
|
|
73
|
+
| Svelte | `svelte`, `@sveltejs/kit` | `.svelte` files, `<script>` + `<style>` co-located, `$:` reactivity |
|
|
74
|
+
| Angular | `@angular/core`, `@angular/common` | `@Component`, `@NgModule`, `.component.ts` suffix pattern |
|
|
75
|
+
| Solid | `solid-js`, `@solidjs/router` | `createSignal`, `createEffect`, `.jsx` with no `react` dep |
|
|
76
|
+
| Vanilla | none of the above in deps | Bare `addEventListener`, no framework imports, `.js`/`.ts` only |
|
|
77
|
+
|
|
78
|
+
Confidence scoring: `high` = dep present + source signature found; `medium` =
|
|
79
|
+
dep only (source scan inconclusive); `low` = source signature only (dep absent,
|
|
80
|
+
e.g. CDN-loaded). At `low` confidence, `detect-stack.mjs` logs a warning and
|
|
81
|
+
continues; `in_v1_scope` reflects the most-likely classification.
|
|
82
|
+
|
|
83
|
+
### Build tool detection
|
|
84
|
+
|
|
85
|
+
| Build tool | Primary signal | Secondary signal |
|
|
86
|
+
|---|---|---|
|
|
87
|
+
| Vite | `vite` in deps or devDeps; `vite.config.{js,ts}` present | `"dev": "vite"` in scripts |
|
|
88
|
+
| webpack | `webpack` in deps; `webpack.config.{js,cjs,mjs}` present | `"build": "webpack"` in scripts |
|
|
89
|
+
| Next.js | `next` in deps; `next.config.{js,mjs,ts}` present | `pages/` or `app/` dir with `page.{tsx,jsx}` |
|
|
90
|
+
| Nuxt | `nuxt` in deps; `nuxt.config.{ts,js}` present | `pages/` dir with `.vue` files |
|
|
91
|
+
| CRA | `react-scripts` in deps | `"start": "react-scripts start"` in scripts |
|
|
92
|
+
| None | none of the above | Single `index.html` + inline `<script>` or `<script type=module>` |
|
|
93
|
+
|
|
94
|
+
### Styling detection
|
|
95
|
+
|
|
96
|
+
| Styling system | Detection signal |
|
|
97
|
+
|---|---|
|
|
98
|
+
| Tailwind v3 | `tailwindcss@^3` in deps; `tailwind.config.{js,ts}` present; class names like `text-sm`, `flex`, `bg-gray-100` in source |
|
|
99
|
+
| Tailwind v4 | `tailwindcss@^4` in deps; `@import "tailwindcss"` or `@theme` block in a `.css` file; no `tailwind.config.*` |
|
|
100
|
+
| CSS Modules | `.module.css` / `.module.scss` files present; `import styles from '…module.css'` in source |
|
|
101
|
+
| Sass / SCSS | `.scss` or `.sass` files; `sass` or `node-sass` in deps |
|
|
102
|
+
| CSS-in-JS | `styled-components`, `@emotion/react`, `@emotion/styled`, `@stitches/react`, or `linaria` in deps |
|
|
103
|
+
| Plain CSS | None of the above; `.css` files imported directly |
|
|
104
|
+
|
|
105
|
+
### Router detection
|
|
106
|
+
|
|
107
|
+
| Router | Detection signal |
|
|
108
|
+
|---|---|
|
|
109
|
+
| React Router | `react-router-dom` or `react-router` in deps |
|
|
110
|
+
| TanStack Router | `@tanstack/react-router` in deps |
|
|
111
|
+
| Next.js router | Next.js detected (built-in) |
|
|
112
|
+
| Vue Router | `vue-router` in deps |
|
|
113
|
+
| Wouter | `wouter` in deps |
|
|
114
|
+
| None | Single-page with no router dep |
|
|
115
|
+
|
|
116
|
+
---
|
|
117
|
+
|
|
118
|
+
## v1 scope gate
|
|
119
|
+
|
|
120
|
+
**v1 supports: framework ∈ {vanilla, React}.**
|
|
121
|
+
|
|
122
|
+
All other detected frameworks (Vue, Svelte, Angular, Solid) are **out of v1 scope**.
|
|
123
|
+
`detect-stack.mjs` writes `stack-report.json` and **exits with code 2** (not 0,
|
|
124
|
+
not 1 — pipeline scripts detect this as a scope-stop, not an error).
|
|
125
|
+
|
|
126
|
+
The pipeline does **not** attempt to convert an out-of-scope project. It does not
|
|
127
|
+
guess. It does not warn and continue. It stops cleanly so the caller knows exactly
|
|
128
|
+
what happened.
|
|
129
|
+
|
|
130
|
+
### `stack-report.json` schema
|
|
131
|
+
|
|
132
|
+
```json
|
|
133
|
+
{
|
|
134
|
+
"schema": "h5-to-swiftui/stack-report@1",
|
|
135
|
+
"framework": "vue",
|
|
136
|
+
"buildTool": "vite",
|
|
137
|
+
"styling": ["css-modules", "tailwind-v3"],
|
|
138
|
+
"router": "vue-router",
|
|
139
|
+
"confidence": "high",
|
|
140
|
+
"in_v1_scope": false,
|
|
141
|
+
"stop_reason": "detected=vue, out of v1 scope; v1 supports vanilla|React only",
|
|
142
|
+
"detected_at": "2026-05-19T12:00:00Z"
|
|
143
|
+
}
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
| Field | Type | Notes |
|
|
147
|
+
|---|---|---|
|
|
148
|
+
| `framework` | string | `vanilla` \| `react` \| `vue` \| `svelte` \| `angular` \| `solid` \| `unknown` |
|
|
149
|
+
| `buildTool` | string | `vite` \| `webpack` \| `next` \| `nuxt` \| `cra` \| `none` \| `unknown` |
|
|
150
|
+
| `styling` | string[] | Array; a project may use multiple (e.g. `["tailwind-v3","css-modules"]`) |
|
|
151
|
+
| `router` | string | Primary detected router or `none` |
|
|
152
|
+
| `confidence` | string | `high` \| `medium` \| `low` |
|
|
153
|
+
| `in_v1_scope` | boolean | `true` only when `framework` is `vanilla` or `react` |
|
|
154
|
+
| `stop_reason` | string | Present only when `in_v1_scope: false` |
|
|
155
|
+
| `detected_at` | string | ISO-8601 timestamp |
|
|
156
|
+
|
|
157
|
+
When `in_v1_scope: true`, the pipeline proceeds to Stage 1. The `stack-report.json`
|
|
158
|
+
is retained as a Stage 0 artifact and its fields inform Stage 1 (token extraction
|
|
159
|
+
strategy differs for plain CSS vs Tailwind v4 vs CSS-in-JS) and Stage 4 (component
|
|
160
|
+
pattern differs for class components vs function+hooks vs vanilla DOM).
|