@ccoalm/ccl-skills 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +201 -0
- package/README.md +49 -0
- package/dist/assets/marketplace/.agents/plugins/marketplace.json +12 -0
- package/dist/assets/marketplace/.claude-plugin/marketplace.json +13 -0
- package/dist/assets/marketplace/marketplace-manifest.json +12 -0
- package/dist/assets/marketplace/plugins/ccl-skills/.claude-plugin/marketplace.json +16 -0
- package/dist/assets/marketplace/plugins/ccl-skills/.claude-plugin/plugin.json +5 -0
- package/dist/assets/marketplace/plugins/ccl-skills/.codex-plugin/plugin.json +5 -0
- package/dist/assets/marketplace/plugins/ccl-skills/.worktree-only +3 -0
- package/dist/assets/marketplace/plugins/ccl-skills/agent-context/session-start.md +45 -0
- package/dist/assets/marketplace/plugins/ccl-skills/agent-context/subagent-start.md +12 -0
- package/dist/assets/marketplace/plugins/ccl-skills/hooks/AGENTS.md +19 -0
- package/dist/assets/marketplace/plugins/ccl-skills/hooks/guard-delegation-owner.sh +125 -0
- package/dist/assets/marketplace/plugins/ccl-skills/hooks/guard-edit-isolation.sh +102 -0
- package/dist/assets/marketplace/plugins/ccl-skills/hooks/guard-merge-authorization.sh +1156 -0
- package/dist/assets/marketplace/plugins/ccl-skills/hooks/hooks.json +131 -0
- package/dist/assets/marketplace/plugins/ccl-skills/hooks/merge-authorization-prompt.sh +142 -0
- package/dist/assets/marketplace/plugins/ccl-skills/hooks/owner-dispatch-guard.sh +12 -0
- package/dist/assets/marketplace/plugins/ccl-skills/hooks/owner-dispatch-stop.sh +13 -0
- package/dist/assets/marketplace/plugins/ccl-skills/hooks/remind-post-merge-cleanup.sh +144 -0
- package/dist/assets/marketplace/plugins/ccl-skills/hooks/session-context.sh +87 -0
- package/dist/assets/marketplace/plugins/ccl-skills/hooks/session-start.sh +86 -0
- package/dist/assets/marketplace/plugins/ccl-skills/hooks/skill-extraction-gate-stop.sh +69 -0
- package/dist/assets/marketplace/plugins/ccl-skills/hooks/subagent-start.sh +26 -0
- package/dist/assets/marketplace/plugins/ccl-skills/hooks/test_guard_delegation_owner.sh +329 -0
- package/dist/assets/marketplace/plugins/ccl-skills/hooks/test_guard_edit_isolation.sh +322 -0
- package/dist/assets/marketplace/plugins/ccl-skills/hooks/test_guard_merge_authorization.sh +902 -0
- package/dist/assets/marketplace/plugins/ccl-skills/hooks/test_merge_authorization_prompt.sh +178 -0
- package/dist/assets/marketplace/plugins/ccl-skills/hooks/test_remind_post_merge_cleanup.sh +121 -0
- package/dist/assets/marketplace/plugins/ccl-skills/hooks/test_session_start.sh +170 -0
- package/dist/assets/marketplace/plugins/ccl-skills/packages/opencode-plugin/AGENTS.md +17 -0
- package/dist/assets/marketplace/plugins/ccl-skills/packages/opencode-plugin/ccl-skills.ts +564 -0
- package/dist/assets/marketplace/plugins/ccl-skills/packages/opencode-plugin/commands/ccl-install-skills.md +14 -0
- package/dist/assets/marketplace/plugins/ccl-skills/packages/opencode-plugin/commands/ccl-update-skills.md +44 -0
- package/dist/assets/marketplace/plugins/ccl-skills/packages/opencode-plugin/commands/ccl-verify-skills.md +109 -0
- package/dist/assets/marketplace/plugins/ccl-skills/packages/opencode-plugin/commands/ccl-worktree-check.md +36 -0
- package/dist/assets/marketplace/plugins/ccl-skills/scripts/owner-dispatch/AGENTS.md +28 -0
- package/dist/assets/marketplace/plugins/ccl-skills/scripts/owner-dispatch/README.md +276 -0
- package/dist/assets/marketplace/plugins/ccl-skills/scripts/owner-dispatch/owner-dispatch.example.json +10 -0
- package/dist/assets/marketplace/plugins/ccl-skills/scripts/owner-dispatch/owner-dispatch.sh +1307 -0
- package/dist/assets/marketplace/plugins/ccl-skills/scripts/owner-dispatch/test.sh +941 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/agents-file-coverage-gate/SKILL.md +45 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/agents-file-coverage-gate/agents/openai.yaml +4 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/app-cross-platform-dev/SKILL.md +188 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/app-cross-platform-dev/agents/openai.yaml +4 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/app-cross-platform-dev/references/android-dev.md +92 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/app-cross-platform-dev/references/flutter-dev.md +80 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/app-cross-platform-dev/references/ios-dev.md +72 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/app-cross-platform-dev/references/kotlin-multiplatform.md +93 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/app-cross-platform-dev/references/mobile-platform-boundaries.md +77 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/app-cross-platform-dev/references/mobile-quality-release.md +77 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/app-cross-platform-dev/references/source-evidence-map.md +64 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/SKILL.md +353 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/agents/openai.yaml +4 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/references/client-routing.md +419 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/references/manual-invocation-and-prompts.md +126 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/references/staged-review-contract.md +197 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/references/timeout-auth-and-capabilities.md +179 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/AGENTS.md +98 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/classify_envelope.py +93 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/classify_timeout_exit.sh +15 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/claude_review.sh +1438 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/codex_review.sh +324 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/concern_excerpt.py +295 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/egress_schema.py +214 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/init_policy_matrix.py +642 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/kimi_packet_mcp.py +181 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/kimi_review.sh +1165 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/opencode_review.sh +1190 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/parse_cli_review.py +946 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/parse_opencode_review.py +474 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/parse_probe_result.py +1899 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/parse_review_json.py +200 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/review_gate.py +2845 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/review_gate.sh +6 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/run_claude_capture.py +71 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/runtime-surface-verification-design.md +53 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/test_classify_envelope.sh +68 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/test_claude_review_probe.sh +2311 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/test_cli_review_wrappers.sh +1832 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/test_code_review_identity.sh +73 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/test_concern_excerpt.sh +245 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/test_egress_schema.sh +177 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/test_init_policy_matrix.sh +272 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/test_kimi_packet_mcp.py +195 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/test_opencode_review_concurrency.sh +120 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/test_opencode_review_retry.sh +1005 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/test_parse_opencode_review.sh +258 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/test_parse_probe_result.sh +574 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/test_parse_review_json.sh +349 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/test_review_client_compat.py +434 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/test_review_client_order.sh +264 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/test_review_gate.sh +2412 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/verify_native_skill_binding.py +123 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/defect-diagnosis/SKILL.md +153 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/defect-diagnosis/agents/openai.yaml +4 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/defect-diagnosis/references/diagnosis-playbook.md +54 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/defect-diagnosis/references/prevention-routing.md +36 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/feature-risk-router/SKILL.md +69 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/feature-risk-router/agents/openai.yaml +4 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/feature-risk-router/references/security-review-gate.md +41 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-architecture/SKILL.md +165 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-architecture/agents/openai.yaml +4 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-architecture/references/api-security-boundaries.md +47 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-architecture/references/architecture-playbook.md +160 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-architecture/references/artifact-generation-architecture.md +37 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-architecture/references/audit-history-architecture.md +29 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-architecture/references/bulk-workflow-architecture.md +33 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-architecture/references/config-rule-routing-architecture.md +34 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-architecture/references/cross-cutting-concerns.md +72 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-architecture/references/data-modeling-and-migrations.md +79 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-architecture/references/data-platform-architecture.md +210 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-architecture/references/dependency-platform.md +105 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-architecture/references/developer-tooling-architecture.md +38 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-architecture/references/error-contract-architecture.md +36 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-architecture/references/event-driven-architecture.md +260 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-architecture/references/http-gateway-architecture.md +74 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-architecture/references/mq-consumer-architecture.md +38 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-architecture/references/multi-tenant-isolation.md +275 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-architecture/references/notification-architecture.md +25 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-architecture/references/ops-checklist.md +57 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-architecture/references/performance-capacity-architecture.md +38 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-architecture/references/protobuf-contract-architecture.md +119 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-architecture/references/redis-cache-coordination.md +93 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-architecture/references/release-runtime-readiness.md +65 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-architecture/references/replay-comparison-architecture.md +26 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-architecture/references/runtime-observability.md +94 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-architecture/references/service-scaffold.md +76 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-architecture/references/source-evidence-map.md +55 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-architecture/references/workflow-state-architecture.md +38 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-dev/SKILL.md +159 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-dev/agents/openai.yaml +4 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-dev/references/artifact-generation-patterns.md +37 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-dev/references/audit-history-patterns.md +28 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-dev/references/bulk-import-export-patterns.md +56 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-dev/references/config-rule-routing-patterns.md +38 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-dev/references/data-access-patterns.md +55 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-dev/references/db-schema-and-dal-patterns.md +109 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-dev/references/dependency-client-patterns.md +130 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-dev/references/developer-tooling-patterns.md +70 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-dev/references/domain-feature-patterns.md +78 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-dev/references/engineering-patterns.md +119 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-dev/references/error-contract-patterns.md +55 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-dev/references/feature-playbook.md +61 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-dev/references/http-gateway-client-patterns.md +76 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-dev/references/mq-consumer-patterns.md +55 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-dev/references/notification-patterns.md +42 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-dev/references/observability-implementation-patterns.md +101 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-dev/references/performance-capacity-patterns.md +44 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-dev/references/protobuf-contract-patterns.md +72 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-dev/references/public-api-integration-patterns.md +56 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-dev/references/quality-and-testing-patterns.md +91 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-dev/references/redis-cache-lock-patterns.md +123 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-dev/references/release-ops-patterns.md +112 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-dev/references/reliability-patterns.md +83 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-dev/references/replay-comparison-patterns.md +32 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-dev/references/scaffold-and-codegen.md +86 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-dev/references/source-evidence-map.md +54 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-dev/references/state-machine-task-patterns.md +45 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/grill-me/SKILL.md +80 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/grill-me/agents/openai.yaml +4 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/llm-inference-integration/SKILL.md +117 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/llm-inference-integration/agents/openai.yaml +4 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/llm-inference-integration/references/agent-approval-auto-reviewer.md +106 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/llm-inference-integration/references/agent-command-sandbox.md +441 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/llm-inference-integration/references/agent-context-freshness.md +47 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/llm-inference-integration/references/agent-credentials-auth.md +13 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/llm-inference-integration/references/agent-extensions-skills.md +13 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/llm-inference-integration/references/agent-file-edit-protocol.md +129 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/llm-inference-integration/references/agent-ide-integration.md +5 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/llm-inference-integration/references/agent-input-ingestion.md +13 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/llm-inference-integration/references/agent-instruction-composition.md +13 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/llm-inference-integration/references/agent-lifecycle-hooks.md +92 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/llm-inference-integration/references/agent-messaging.md +5 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/llm-inference-integration/references/agent-runtime-bootstrap.md +5 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/llm-inference-integration/references/agent-session-persistence.md +448 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/llm-inference-integration/references/agent-task-orchestration.md +13 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/llm-inference-integration/references/agent-tool-dispatch.md +123 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/llm-inference-integration/references/agent-turn-lifecycle.md +131 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/llm-inference-integration/references/inference-capacity-operations.md +162 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/llm-inference-integration/references/llm-client-gateway.md +156 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/llm-inference-integration/references/model-prompt-evaluation.md +146 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/llm-inference-integration/references/retrieval-agent-safety.md +273 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/miniapp-product-dev/SKILL.md +202 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/miniapp-product-dev/agents/openai.yaml +4 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/miniapp-product-dev/references/contracts-and-state.md +62 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/miniapp-product-dev/references/cross-stack-alignment.md +94 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/miniapp-product-dev/references/framework-choice.md +76 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/miniapp-product-dev/references/online-practice-uptake.md +56 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/miniapp-product-dev/references/platform-capabilities.md +91 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/miniapp-product-dev/references/product-page-checklist.md +40 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/miniapp-product-dev/references/qa-release.md +72 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/miniapp-product-dev/references/source-evidence-map.md +82 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/multi-agent-delegation/SKILL.md +103 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/multi-agent-delegation/agents/openai.yaml +5 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/multi-agent-delegation/references/multi-agent-delegation-playbook.md +100 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/multi-perspective-research/SKILL.md +70 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/multi-perspective-research/agents/openai.yaml +4 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/multi-perspective-research/references/public-data-acquisition.md +549 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/multi-perspective-research/references/public-disclosure-channels.md +97 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/multi-perspective-research/references/research-prompts.md +66 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/multi-perspective-research/scripts/AGENTS.md +32 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/multi-perspective-research/scripts/test-public-data-acquisition-recipes.sh +379 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-observability/SKILL.md +244 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-observability/agents/openai.yaml +4 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-observability/references/alerting-and-on-call.md +76 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-observability/references/framework-middleware-checklist.md +142 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-observability/references/infra-component-deployment.md +268 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-observability/references/log-correlation-recipe.md +124 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-observability/references/log-schema-canonical.md +208 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-observability/references/metrics-conventions.md +105 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-observability/references/obs-stack-architecture.md +107 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-observability/references/sli-slo-design.md +95 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-observability/references/source-register.md +11 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-release-engineering/SKILL.md +303 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-release-engineering/agents/openai.yaml +4 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-release-engineering/references/canary-and-rollout-strategy.md +163 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-release-engineering/references/config-center-via-etcd.md +245 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-release-engineering/references/custom-control-plane-boundary.md +298 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-release-engineering/references/deploy-cli-concrete-recipe.md +312 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-release-engineering/references/deploy-pipeline.md +165 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-release-engineering/references/env-and-lane-matrix.md +126 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-release-engineering/references/lane-orchestration-control-plane.md +383 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-release-engineering/references/multi-region-and-cluster.md +135 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-release-engineering/references/promotion-gate-and-review.md +149 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-release-engineering/references/python-package-registry-release.md +462 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-release-engineering/references/rollback-playbook.md +123 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-release-engineering/references/secret-and-config-management.md +231 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-release-engineering/references/version-authority-and-deprecation.md +21 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-service-connectivity/SKILL.md +276 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-service-connectivity/agents/openai.yaml +4 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-service-connectivity/references/dual-sidecar-and-traffic-config-center.md +127 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-service-connectivity/references/framework-middleware.md +143 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-service-connectivity/references/grpc-authority-workaround.md +90 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-service-connectivity/references/http-response-envelope-contract.md +24 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-service-connectivity/references/mesh-architecture.md +127 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-service-connectivity/references/multi-env-routing.md +192 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-service-connectivity/references/protobuf-http-contract-signals.md +64 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-service-connectivity/references/retry-timeout-circuit-breaker.md +124 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-service-connectivity/references/rpc-framework-recipe.md +494 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-service-connectivity/references/service-discovery-choice.md +113 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-service-connectivity/references/service-discovery-migration-playbook.md +231 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-service-connectivity/references/service-discovery-recipe.md +131 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/SKILL.md +235 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/agents/openai.yaml +4 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/adr-convention.md +146 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/algorithm-launch-checklist.md +30 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/algorithm-launch-evaluation-report-template.md +25 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/algorithm-launch-execution-spec.md +108 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/algorithm-launch-sop.md +457 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/algorithm-launch-templates.md +24 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/artifact-egress-confidentiality.md +58 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/code-review-checklist.md +86 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/cross-repo-coordination.md +46 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/delivery-lifecycle.md +192 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/design-review-gate-mechanics.md +62 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/design-routing-and-readiness.md +45 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/diagnostic-spec-match-gate.md +36 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/dispatch-owner-skills.md +35 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/dormant-code-activation.md +47 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/existing-project-assessment-report.md +223 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/external-skill-augmentation.md +46 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/feature-deprecation-cascade.md +15 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/high-risk-resilience-gates.md +73 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/implementation-completeness-and-minimality.md +120 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/implementation-entry-reentry-gate.md +122 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/modular-monolith-heuristic.md +105 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/pre-final-continuation-gate.md +115 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/problem-resolution-and-learning.md +62 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/quality-attributes.md +112 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/quality-remediation-program.md +88 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/rd-standards-doc-family-checklist.md +27 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/refactoring-discipline.md +52 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/review-reception.md +34 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/shared-gate-artifact-classification.md +76 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/source-evidence-map.md +31 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/status-tracker-sync.md +77 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/sync-spec-repo-contract.md +25 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/verify-developer-experience.md +34 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/worktree-mechanics.md +55 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/scripts/AGENTS.md +18 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/scripts/check-agent-contract-coverage.sh +213 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/SKILL.md +136 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/agents/openai.yaml +9 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/analytics-visualization-interactions.md +206 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/behavioral-aesthetic-logic.md +108 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/complex-creation-interactions.md +194 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/design-execution-checklist.md +214 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/design-impl-naming-and-versioning.md +53 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/design-intake-and-acceptance.md +129 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/design-system-source-of-truth.md +97 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/external-ui-ux-quality-benchmarks.md +79 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/frontend-code-evidence-map.md +63 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/interaction-design-patterns.md +146 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/layout-recipes-and-screenshot-acceptance.md +250 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/multi-project-token-consistency.md +237 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/multi-stack-strategy.md +65 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/operational-processing-workflows.md +237 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/platform-mobile-patterns.md +324 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/platform-web-desktop-patterns.md +456 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/product-lifecycle-acceptance-and-iteration.md +114 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/product-surface-patterns.md +79 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/resource-management-interactions.md +113 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/scenario-community-patterns.md +133 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/source-map.md +130 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/tokens-and-components.md +47 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/trust-sensitive-ai-and-data-patterns.md +96 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/ui-ux-audit.md +106 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/ui-ux-design-development.md +176 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/visual-craft.md +111 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-architecture/SKILL.md +157 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-architecture/agents/openai.yaml +4 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-architecture/references/ai-service-integration-boundaries.md +57 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-architecture/references/api-contract-and-schema.md +62 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-architecture/references/api-security-boundaries.md +39 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-architecture/references/architecture-playbook.md +46 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-architecture/references/async-execution-model.md +24 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-architecture/references/background-jobs-and-scheduling.md +18 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-architecture/references/batch-and-pipeline-architecture.md +11 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-architecture/references/config-secrets-runtime.md +22 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-architecture/references/data-modeling-and-migrations.md +64 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-architecture/references/data-platform-architecture.md +211 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-architecture/references/event-driven-architecture.md +263 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-architecture/references/multi-tenant-isolation.md +281 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-architecture/references/observability-and-ops.md +26 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-architecture/references/packaging-runtime-readiness.md +20 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-architecture/references/redis-cache-coordination.md +41 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-architecture/references/reliability-and-error-contract.md +17 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-architecture/references/source-evidence-map.md +55 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-architecture/references/web-framework-boundaries.md +26 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-dev/SKILL.md +143 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-dev/agents/openai.yaml +4 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-dev/references/ai-service-wiring-patterns.md +16 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-dev/references/async-and-worker-patterns.md +24 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-dev/references/background-job-patterns.md +18 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-dev/references/batch-and-artifact-patterns.md +13 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-dev/references/dependency-client-patterns.md +39 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-dev/references/error-handling-patterns.md +26 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-dev/references/feature-playbook.md +43 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-dev/references/observability-implementation-patterns.md +31 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-dev/references/project-structure-and-tooling.md +24 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-dev/references/public-api-security-patterns.md +52 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-dev/references/redis-cache-lock-patterns.md +78 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-dev/references/schema-and-validation-patterns.md +23 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-dev/references/source-evidence-map.md +56 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-dev/references/sqlalchemy-and-migrations-patterns.md +99 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-dev/references/testing-and-quality-patterns.md +61 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-dev/references/web-framework-patterns.md +35 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/release-coordination/SKILL.md +91 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/release-coordination/agents/openai.yaml +4 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/release-coordination/references/config-runtime-readback.md +20 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/release-coordination/references/mr-merge-authorization.md +31 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/release-coordination/references/post-release-env-reset.md +31 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/release-coordination/references/release-closeout-evidence.md +20 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/release-coordination/references/release-scope-confirmation.md +21 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/release-coordination/references/tag-and-prod-pipeline-gate.md +20 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/release-coordination/references/test-scope-prompt.md +24 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/release-coordination/references/watcher-discipline.md +14 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/release-doc-writer/SKILL.md +64 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/release-doc-writer/agents/openai.yaml +4 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/release-doc-writer/references/comment-safe-release-doc.md +19 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/release-doc-writer/references/release-evidence-workflow.md +23 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/release-doc-writer/references/release-testing-scope-section.md +15 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/requirement-baseline/SKILL.md +87 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/requirement-baseline/agents/openai.yaml +4 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/requirement-doc-writer/SKILL.md +130 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/requirement-doc-writer/agents/openai.yaml +4 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/requirement-doc-writer/references/prd-composition-contract.md +35 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/requirement-doc-writer/references/requirement-closure-contract.md +86 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/requirement-doc-writer/references/security-four-questions.md +38 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/requirement-intent/SKILL.md +91 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/requirement-intent/agents/openai.yaml +4 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/requirement-scope/SKILL.md +88 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/requirement-scope/agents/openai.yaml +4 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/SKILL.md +337 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/agents/openai.yaml +4 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/analysis-parse-fix-test-challenge-replay.md +47 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/attribution-verification.md +69 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/bootstrap-slim-c3-obligation-table.md +112 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/coverage-exhaustion-traps.md +45 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/description-authoring.md +162 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/dual-track-review-gate.md +507 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/eval-routing.md +86 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/evidence-card-template.md +51 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/example-domain-preselect.md +79 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/external-practice-controls.md +57 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/extraction-lifecycle-handoff.md +65 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/extraction-quickstart.md +194 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/firing-point-placement.md +75 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/harness-patterns-and-eval.md +286 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/incident-postmortem-extraction.md +190 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/l0-l1-l2-routing.md +114 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/online-skill-review.md +47 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/parallel-stack-references-pattern.md +164 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/r0-leakage-audit.md +90 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/recurring-anti-patterns-checklist.md +320 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/resume-paused-delivery.md +16 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/review-feedback-mining.md +33 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/review-finding-standards.md +57 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/review-rubric.md +40 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/rule-consolidation.md +118 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/skill-listing-budget.md +19 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/source-register.md +254 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/source-to-skill-extraction.md +658 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/two-source-extraction-pattern.md +167 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/uiux-judgment-extraction.md +179 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/uiux-routing-map.md +51 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/validation-and-landing.md +180 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/AGENTS.md +18 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/check-ccl-skills.sh +1452 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/check-evidence-card-leak.sh +491 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/check-mr-target-freshness.sh +173 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/check-size-budget.sh +488 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/check-sync-pointers.sh +419 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/eval-golden-trace.rb +197 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/eval-health.rb +327 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/eval-routing-bank.rb +401 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/eval-routing.rb +248 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/generic-r0-leak-scan.sh +282 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/governing-chain-diff.py +321 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/impact-chain-gate.rb +964 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/register-firing-path-resolution.rb +708 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/skill-behavior-eval.py +540 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/source-register-lifecycle.rb +51 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/source-register-pending-status.rb +55 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_ai_coding_implementation_gates.sh +829 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_check_ccl_impact_chain_refscripts.sh +1203 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_check_ccl_r0_status.sh +75 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_check_ccl_register_pending_exclusion.sh +137 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_check_ccl_regressions.sh +173 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_check_ccl_route_drift.sh +377 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_check_ccl_size_budget.sh +833 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_check_ccl_skill_catalog.sh +491 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_check_ccl_source_register_lifecycle.sh +114 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_check_mr_target_freshness.sh +261 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_check_sync_pointers.sh +538 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_controlled_escalation_pins.sh +154 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_eval_routing_bank_grader_diagnostics.sh +190 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_eval_routing_bank_surface_binding.sh +178 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_eval_routing_prose_target.sh +86 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_generic_r0_leak_scan.sh +131 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_git_identity_predicate_gate.sh +243 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_governing_chain_diff.sh +419 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_impact_chain_gate_dateless_host.sh +120 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_register_firing_path_resolution.sh +724 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_register_firing_path_wiring.sh +414 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_regression_runner_registration.sh +34 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_routing_bank_integrity.sh +205 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_routing_pointer_integrity.sh +194 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_validate_skill_credential_cwd.sh +61 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_validate_skill_cross_refs.sh +111 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_validate_skill_root_depth.sh +53 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/validate-skill.sh +257 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/terminal-cli-dev/SKILL.md +98 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/terminal-cli-dev/agents/openai.yaml +4 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/terminal-cli-dev/references/input-state-machines.md +36 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/terminal-cli-dev/references/streaming-rich-output.md +130 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/terminal-cli-dev/references/terminal-side-channels.md +96 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/test-artifact-management/SKILL.md +408 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/test-artifact-management/agents/openai.yaml +4 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/test-artifact-management/references/AGENTS.md +18 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/test-artifact-management/references/bitable-setup.md +573 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/test-artifact-management/references/ci_templates/README.md +120 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/test-artifact-management/references/ci_templates/github-actions.yml +119 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/test-artifact-management/references/ci_templates/gitlab-ci.yml +76 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/test-artifact-management/references/ci_templates/jenkins.Jenkinsfile +106 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/test-artifact-management/references/classical-test-design-techniques.md +279 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/test-artifact-management/references/gen_report.py +2807 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/test-artifact-management/references/makefile-template.md +200 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/test-artifact-management/references/report-config-schema.md +272 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/test-artifact-management/references/run_pytestless.py +475 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/test-artifact-management/references/source-to-case-workflows.md +258 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/test-artifact-management/references/tc-marker-conventions.md +316 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/test-artifact-management/references/tc-review-and-prioritization.md +145 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/test-artifact-management/references/tc_helpers/AGENTS.md +16 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/test-artifact-management/references/tc_helpers/tc.dart +129 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/test-artifact-management/references/tc_helpers/tc.go +197 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/test-artifact-management/references/tc_helpers/tc.py +135 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/test-artifact-management/references/tc_helpers/tc.ts +285 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/test-artifact-management/references/test_gen_report.py +2144 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/test-artifact-management/references/update-lifecycle.md +62 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/SKILL.md +212 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/agents/openai.yaml +4 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/references/ci-fixtures-and-flake-control.md +75 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/references/client-runtime-test-matrices.md +50 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/references/data-and-workflow-testing.md +34 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/references/design-closed-contract-oracles.md +31 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/references/e2e-real-flow-testing.md +71 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/references/fitness-functions.md +240 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/references/integration-contract-testing.md +235 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/references/non-functional-specialized-scenarios.md +296 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/references/rd-testing-standard-template.md +126 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/references/run-killing-mutation-walk.md +43 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/references/scenario-testing.md +136 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/references/source-evidence-map.md +59 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/references/structured-tc-input-translation.md +67 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/references/test-code-authoring-patterns.md +392 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/references/test-data-and-determinism.md +39 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/references/test-topology-and-commands.md +92 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/references/unit-testing.md +46 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/references/vendored-contract-drift-checklist.md +64 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/references/verify-enforcement-mechanisms.md +18 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/scripts/AGENTS.md +17 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/scripts/client-terminal-ansi-check.py +140 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/scripts/client-terminal-ansi-check.test.sh +75 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/scripts/lang-basics-ast-check.py +170 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/scripts/lang-basics-ast-check.test.sh +87 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/scripts/lang-basics-go-check.go +198 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/scripts/lang-basics-go-check.test.sh +109 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/scripts/test_mutation_backup_recipe.sh +237 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/tighten-doc/SKILL.md +184 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/tighten-doc/agents/openai.yaml +4 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/tighten-doc/references/comment-safe-feishu.md +93 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/tighten-doc/references/cross-model-co-review.md +3 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/tighten-doc/references/delivery-face-closeout.md +60 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/tighten-doc/references/doc-charter-first.md +17 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/tighten-doc/references/session-vantage-leakage.md +58 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/web-react-dev/SKILL.md +126 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/web-react-dev/agents/openai.yaml +4 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/web-react-dev/references/complex-workspace-patterns.md +47 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/web-react-dev/references/embedded-h5-in-host.md +87 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/web-react-dev/references/react-architecture.md +194 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/web-react-dev/references/source-evidence-map.md +60 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/web-react-dev/references/web-quality-release.md +190 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/web-react-dev/references/web-ui-quality.md +83 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/worktree-isolation/SKILL.md +179 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/worktree-isolation/agents/openai.yaml +4 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/worktree-isolation/references/shared-branch-rebase.md +25 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/worktree-isolation/scripts/AGENTS.md +23 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/worktree-isolation/scripts/test_worktree_status.sh +207 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/worktree-isolation/scripts/test_worktree_sweep.sh +481 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/worktree-isolation/scripts/worktree-status.sh +325 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/worktree-isolation/scripts/worktree-sweep.sh +245 -0
- package/dist/assets/release.json +2797 -0
- package/dist/claude-adapter.d.ts +9 -0
- package/dist/claude-adapter.js +240 -0
- package/dist/cli-worker.d.ts +1 -0
- package/dist/cli-worker.js +32 -0
- package/dist/cli.d.ts +22 -0
- package/dist/cli.js +214 -0
- package/dist/codex-host.d.ts +30 -0
- package/dist/codex-host.js +162 -0
- package/dist/fs-safe.d.ts +21 -0
- package/dist/fs-safe.js +241 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +1 -0
- package/dist/manifest.d.ts +8 -0
- package/dist/manifest.js +135 -0
- package/dist/opencode-adapter.d.ts +10 -0
- package/dist/opencode-adapter.js +416 -0
- package/dist/operations.d.ts +3 -0
- package/dist/operations.js +956 -0
- package/dist/paths.d.ts +20 -0
- package/dist/paths.js +4 -0
- package/dist/types.d.ts +58 -0
- package/dist/types.js +1 -0
- package/dist/unified.d.ts +4 -0
- package/dist/unified.js +64 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.js +5 -0
- package/package.json +35 -0
package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/parse_cli_review.py
ADDED
|
@@ -0,0 +1,946 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Fail-closed parser for dedicated Kimi and Codex CLI review wrappers."""
|
|
3
|
+
|
|
4
|
+
from __future__ import annotations
|
|
5
|
+
|
|
6
|
+
import argparse
|
|
7
|
+
import json
|
|
8
|
+
from pathlib import Path, PurePosixPath
|
|
9
|
+
import re
|
|
10
|
+
from typing import Any
|
|
11
|
+
|
|
12
|
+
from concern_excerpt import bounded_reason_detail, concern_fields
|
|
13
|
+
from kimi_packet_mcp import MAX_CHUNK_BYTES
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
FAMILIES = {
|
|
17
|
+
"anthropic": "claude",
|
|
18
|
+
"claude": "claude",
|
|
19
|
+
"codex": "openai",
|
|
20
|
+
"deepseek": "deepseek",
|
|
21
|
+
"gemini": "gemini",
|
|
22
|
+
"google": "gemini",
|
|
23
|
+
"kimi": "moonshot",
|
|
24
|
+
"moonshot": "moonshot",
|
|
25
|
+
"openai": "openai",
|
|
26
|
+
"grok": "grok",
|
|
27
|
+
"xai": "grok",
|
|
28
|
+
"groq": "groq",
|
|
29
|
+
"mistral": "mistral",
|
|
30
|
+
}
|
|
31
|
+
FINDING_RE = re.compile(r"^(P[0-2])\s+(\S+):(\d+)\s+(.+?)\s+\|\s+(.+)$")
|
|
32
|
+
CONCERN_RESULT_RE = re.compile(
|
|
33
|
+
r"^CHECK\s+([a-z][a-z0-9_]*)\s+\|\s+(.+)$", re.IGNORECASE
|
|
34
|
+
)
|
|
35
|
+
CODEX_STREAM_GAP_RE = re.compile(
|
|
36
|
+
r"^in-process app-server event stream lagged; dropped [1-9]\d* events?$",
|
|
37
|
+
re.IGNORECASE,
|
|
38
|
+
)
|
|
39
|
+
CODEX_BENIGN_ERROR_ITEMS = {
|
|
40
|
+
"Skill descriptions were shortened to fit the 2% skills context budget. "
|
|
41
|
+
"Codex can still see every skill, but some descriptions are shorter. "
|
|
42
|
+
"Disable unused skills or plugins to leave more room for the rest."
|
|
43
|
+
}
|
|
44
|
+
# The skills-context-budget notice is advisory, and its wording drifts with the
|
|
45
|
+
# CLI: an earlier release said "the 2% skills context budget", a later one dropped
|
|
46
|
+
# the number. The exact-sentence set above could not see that, so every Codex
|
|
47
|
+
# review lane died on `invalid_model_output` after a routine upstream release —
|
|
48
|
+
# with a complete verdict already in hand. Per scripts/AGENTS.md, match the
|
|
49
|
+
# invariant claim, not the release's phrasing. The anchor plus the required
|
|
50
|
+
# subject keep this from swallowing a real error item.
|
|
51
|
+
# Both ends are anchored and the tail is bounded: matching only the prefix would
|
|
52
|
+
# let a crafted error item append arbitrary content and still be waved through.
|
|
53
|
+
# Only the release-variable numeric slot is optional, so this does not re-pin the
|
|
54
|
+
# wording that broke last time.
|
|
55
|
+
# A free tail let a real fault ride along behind the benign prefix, so the
|
|
56
|
+
# advisory's own continuation is required. That does re-pin some vocabulary — the
|
|
57
|
+
# trade is deliberate: an upstream reword now fails LOUDLY as an item-level error
|
|
58
|
+
# whose text is carried in `client_diagnostic`, which is exactly the silent
|
|
59
|
+
# failure this slice removed. Only the release-variable numeric slot stays free.
|
|
60
|
+
CODEX_BENIGN_ERROR_RES = (
|
|
61
|
+
re.compile(
|
|
62
|
+
r"^skill descriptions were shortened to fit the (?:\d{1,3}% )?"
|
|
63
|
+
r"skills context budget\.\s*"
|
|
64
|
+
r"codex can still see every skill, but some descriptions are shorter\.\s*"
|
|
65
|
+
r"disable unused skills or plugins to leave more room for the rest\.?$",
|
|
66
|
+
re.IGNORECASE,
|
|
67
|
+
),
|
|
68
|
+
)
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
def is_benign_codex_error(message: object) -> bool:
|
|
72
|
+
if not isinstance(message, str):
|
|
73
|
+
return False
|
|
74
|
+
normalized = " ".join(message.split())
|
|
75
|
+
if normalized in CODEX_BENIGN_ERROR_ITEMS:
|
|
76
|
+
return True
|
|
77
|
+
return any(pattern.search(normalized) for pattern in CODEX_BENIGN_ERROR_RES)
|
|
78
|
+
CODEX_HOOK_TRUST_WARNING = (
|
|
79
|
+
"`--dangerously-bypass-hook-trust` is enabled. Enabled hooks may run "
|
|
80
|
+
"without review for this invocation."
|
|
81
|
+
)
|
|
82
|
+
TOOL_ACTIVITY_KEYS = {"function_call", "function_calls", "tool_call", "tool_calls"}
|
|
83
|
+
TOOL_ACTIVITY_TYPES = {"function_call", "tool_call", "tool_use"}
|
|
84
|
+
KIMI_ASSISTANT_KEYS = {"role", "content", "tool_calls"}
|
|
85
|
+
KIMI_TOOL_KEYS = {"role", "content", "tool_call_id"}
|
|
86
|
+
KIMI_RETRY_KEYS = {
|
|
87
|
+
"role",
|
|
88
|
+
"type",
|
|
89
|
+
"failed_attempt",
|
|
90
|
+
"next_attempt",
|
|
91
|
+
"max_attempts",
|
|
92
|
+
"delay_ms",
|
|
93
|
+
"error_name",
|
|
94
|
+
"error_message",
|
|
95
|
+
"status_code",
|
|
96
|
+
}
|
|
97
|
+
KIMI_RESUME_KEYS = {"role", "type", "session_id", "command", "content"}
|
|
98
|
+
KIMI_HOOK_PREFIX = "UserPromptSubmit hook\n"
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
def normalize_family(value: str | None) -> str | None:
|
|
102
|
+
if not value:
|
|
103
|
+
return None
|
|
104
|
+
candidate = value.strip().lower()
|
|
105
|
+
return FAMILIES.get(candidate)
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
def result(
|
|
109
|
+
args: argparse.Namespace,
|
|
110
|
+
status: str,
|
|
111
|
+
*,
|
|
112
|
+
reason: str | None = None,
|
|
113
|
+
reason_code: str | None = None,
|
|
114
|
+
cascade_eligible: bool = False,
|
|
115
|
+
**extra: Any,
|
|
116
|
+
) -> dict[str, Any]:
|
|
117
|
+
if extra.get("concern_results") == []:
|
|
118
|
+
extra.pop("concern_results")
|
|
119
|
+
payload: dict[str, Any] = {
|
|
120
|
+
"reviewer": args.client,
|
|
121
|
+
"mode": args.mode,
|
|
122
|
+
"status": status,
|
|
123
|
+
"reviewer_family": args.reviewer_family or None,
|
|
124
|
+
"provider": args.provider or None,
|
|
125
|
+
"model": args.model or None,
|
|
126
|
+
**extra,
|
|
127
|
+
}
|
|
128
|
+
if reason is not None:
|
|
129
|
+
payload["reason"] = reason
|
|
130
|
+
if reason_code is not None:
|
|
131
|
+
payload["reason_code"] = reason_code
|
|
132
|
+
payload["cascade_eligible"] = cascade_eligible
|
|
133
|
+
return payload
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
def inconclusive(
|
|
137
|
+
args: argparse.Namespace,
|
|
138
|
+
reason: str,
|
|
139
|
+
reason_code: str,
|
|
140
|
+
cascade_eligible: bool,
|
|
141
|
+
**extra: Any,
|
|
142
|
+
) -> dict[str, Any]:
|
|
143
|
+
return result(
|
|
144
|
+
args,
|
|
145
|
+
"inconclusive",
|
|
146
|
+
reason=reason,
|
|
147
|
+
reason_code=reason_code,
|
|
148
|
+
cascade_eligible=cascade_eligible,
|
|
149
|
+
**extra,
|
|
150
|
+
)
|
|
151
|
+
|
|
152
|
+
|
|
153
|
+
def invalid_model_output(
|
|
154
|
+
args: argparse.Namespace, reason: str, raw_verdict: str = ""
|
|
155
|
+
) -> dict[str, Any]:
|
|
156
|
+
# Carry the concern-shaped lines with the stop. The lane refuses to cascade
|
|
157
|
+
# precisely because this output may hold a finding; without the excerpt the
|
|
158
|
+
# operator is told a finding exists but not what it says, which leaves
|
|
159
|
+
# reject-and-rerun as the only move and hides a false positive entirely.
|
|
160
|
+
fields = concern_fields(raw_verdict)
|
|
161
|
+
return inconclusive(
|
|
162
|
+
args,
|
|
163
|
+
reason,
|
|
164
|
+
"invalid_model_output",
|
|
165
|
+
not fields["concern_evidence"],
|
|
166
|
+
**fields,
|
|
167
|
+
)
|
|
168
|
+
|
|
169
|
+
|
|
170
|
+
def load_json_lines(
|
|
171
|
+
path: Path,
|
|
172
|
+
) -> tuple[list[dict[str, Any]] | None, str | None, str]:
|
|
173
|
+
events: list[dict[str, Any]] = []
|
|
174
|
+
try:
|
|
175
|
+
raw_events = path.read_bytes().decode("utf-8", "replace")
|
|
176
|
+
for raw in raw_events.splitlines():
|
|
177
|
+
if not raw.strip():
|
|
178
|
+
continue
|
|
179
|
+
item = json.loads(raw)
|
|
180
|
+
if not isinstance(item, dict):
|
|
181
|
+
return None, "non_object_event", raw_events
|
|
182
|
+
events.append(item)
|
|
183
|
+
except OSError:
|
|
184
|
+
return None, "invalid_event_stream", ""
|
|
185
|
+
except json.JSONDecodeError:
|
|
186
|
+
return None, "invalid_event_stream", raw_events
|
|
187
|
+
return events, None, raw_events
|
|
188
|
+
|
|
189
|
+
|
|
190
|
+
def tool_name_and_arguments(
|
|
191
|
+
call: dict[str, Any],
|
|
192
|
+
) -> tuple[str | None, dict[str, Any] | None]:
|
|
193
|
+
function = call.get("function")
|
|
194
|
+
if isinstance(function, dict):
|
|
195
|
+
name = function.get("name")
|
|
196
|
+
arguments = function.get("arguments")
|
|
197
|
+
else:
|
|
198
|
+
name = call.get("name")
|
|
199
|
+
arguments = call.get("arguments") or call.get("input")
|
|
200
|
+
if isinstance(arguments, str):
|
|
201
|
+
try:
|
|
202
|
+
arguments = json.loads(arguments)
|
|
203
|
+
except json.JSONDecodeError:
|
|
204
|
+
return name if isinstance(name, str) else None, None
|
|
205
|
+
return name if isinstance(name, str) else None, arguments if isinstance(
|
|
206
|
+
arguments, dict
|
|
207
|
+
) else None
|
|
208
|
+
|
|
209
|
+
|
|
210
|
+
def has_unrecognized_tool_activity(value: Any) -> bool:
|
|
211
|
+
if isinstance(value, dict):
|
|
212
|
+
event_type = value.get("type")
|
|
213
|
+
if isinstance(event_type, str) and event_type.lower() in TOOL_ACTIVITY_TYPES:
|
|
214
|
+
return True
|
|
215
|
+
for key, child in value.items():
|
|
216
|
+
if isinstance(key, str) and key.lower() in TOOL_ACTIVITY_KEYS:
|
|
217
|
+
return True
|
|
218
|
+
if has_unrecognized_tool_activity(child):
|
|
219
|
+
return True
|
|
220
|
+
elif isinstance(value, list):
|
|
221
|
+
return any(has_unrecognized_tool_activity(item) for item in value)
|
|
222
|
+
return False
|
|
223
|
+
|
|
224
|
+
|
|
225
|
+
def is_safe_kimi_metadata_event(event: dict[str, Any]) -> bool:
|
|
226
|
+
"""Accept the version announcement without constraining its version value."""
|
|
227
|
+
version = event.get("version")
|
|
228
|
+
return (
|
|
229
|
+
event.get("role") == "meta"
|
|
230
|
+
and event.get("type") == "system.version"
|
|
231
|
+
and set(event) == {"role", "type", "version"}
|
|
232
|
+
and isinstance(version, str)
|
|
233
|
+
and 0 < len(version) <= 256
|
|
234
|
+
)
|
|
235
|
+
|
|
236
|
+
|
|
237
|
+
def safe_kimi_metadata_kind(event: dict[str, Any]) -> str | None:
|
|
238
|
+
"""Classify the bounded metadata envelopes accepted from Kimi."""
|
|
239
|
+
if is_safe_kimi_metadata_event(event):
|
|
240
|
+
return "version"
|
|
241
|
+
event_type = event.get("type")
|
|
242
|
+
if event.get("role") != "meta":
|
|
243
|
+
return None
|
|
244
|
+
if event_type == "turn.step.retrying" and not set(event) - KIMI_RETRY_KEYS:
|
|
245
|
+
return "retry"
|
|
246
|
+
if event_type == "session.resume_hint" and not set(event) - KIMI_RESUME_KEYS:
|
|
247
|
+
metadata = (
|
|
248
|
+
event.get("session_id"),
|
|
249
|
+
event.get("command"),
|
|
250
|
+
event.get("content"),
|
|
251
|
+
)
|
|
252
|
+
if all(isinstance(value, str) and value.strip() for value in metadata):
|
|
253
|
+
return "resume"
|
|
254
|
+
return None
|
|
255
|
+
|
|
256
|
+
|
|
257
|
+
def parse_kimi_tool_calls(
|
|
258
|
+
event: dict[str, Any],
|
|
259
|
+
) -> tuple[
|
|
260
|
+
list[tuple[str, str | None, dict[str, Any] | None]] | None,
|
|
261
|
+
str | None,
|
|
262
|
+
]:
|
|
263
|
+
"""Validate and normalize Kimi's function-call envelope."""
|
|
264
|
+
calls = event["tool_calls"] if "tool_calls" in event else []
|
|
265
|
+
if not isinstance(calls, list):
|
|
266
|
+
return None, "invalid_container"
|
|
267
|
+
parsed = []
|
|
268
|
+
for call in calls:
|
|
269
|
+
if not isinstance(call, dict):
|
|
270
|
+
return None, "invalid_call"
|
|
271
|
+
function = call.get("function")
|
|
272
|
+
if (
|
|
273
|
+
set(call) - {"type", "id", "function"}
|
|
274
|
+
or call.get("type") != "function"
|
|
275
|
+
or not isinstance(call.get("id"), str)
|
|
276
|
+
or not call["id"]
|
|
277
|
+
or not isinstance(function, dict)
|
|
278
|
+
or set(function) - {"name", "arguments"}
|
|
279
|
+
):
|
|
280
|
+
return None, "invalid_call"
|
|
281
|
+
name, arguments = tool_name_and_arguments(call)
|
|
282
|
+
parsed.append((call["id"], name, arguments))
|
|
283
|
+
return parsed, None
|
|
284
|
+
|
|
285
|
+
|
|
286
|
+
def kimi_text(
|
|
287
|
+
args: argparse.Namespace, events: list[dict[str, Any]]
|
|
288
|
+
) -> tuple[str | None, dict[str, Any] | None]:
|
|
289
|
+
packet_tool = "mcp__code_review_packet__read_packet"
|
|
290
|
+
assistant_texts: list[str] = []
|
|
291
|
+
packet_path = Path(args.packet).resolve()
|
|
292
|
+
try:
|
|
293
|
+
packet_bytes = packet_path.read_bytes()
|
|
294
|
+
packet_bytes.decode("utf-8")
|
|
295
|
+
except (OSError, UnicodeDecodeError):
|
|
296
|
+
return None, inconclusive(
|
|
297
|
+
args, "Kimi packet could not be inspected", "binding_mismatch", False
|
|
298
|
+
)
|
|
299
|
+
packet_byte_count = len(packet_bytes)
|
|
300
|
+
packet_read = False
|
|
301
|
+
packet_read_started = False
|
|
302
|
+
packet_read_ids: dict[str, tuple[int, int]] = {}
|
|
303
|
+
covered_ranges: list[tuple[int, int]] = []
|
|
304
|
+
premature_texts: list[str] = []
|
|
305
|
+
|
|
306
|
+
def full_packet_covered() -> bool:
|
|
307
|
+
if packet_byte_count == 0:
|
|
308
|
+
return True
|
|
309
|
+
cursor = 0
|
|
310
|
+
for start, end in sorted(covered_ranges):
|
|
311
|
+
if start > cursor:
|
|
312
|
+
return False
|
|
313
|
+
cursor = max(cursor, end)
|
|
314
|
+
if cursor >= packet_byte_count:
|
|
315
|
+
return True
|
|
316
|
+
return cursor >= packet_byte_count
|
|
317
|
+
for event in events:
|
|
318
|
+
role = event.get("role")
|
|
319
|
+
metadata_kind = safe_kimi_metadata_kind(event)
|
|
320
|
+
is_resume_hint = False
|
|
321
|
+
if role == "assistant":
|
|
322
|
+
allowed_keys = KIMI_ASSISTANT_KEYS
|
|
323
|
+
elif role == "tool":
|
|
324
|
+
allowed_keys = KIMI_TOOL_KEYS
|
|
325
|
+
elif metadata_kind == "retry":
|
|
326
|
+
allowed_keys = KIMI_RETRY_KEYS
|
|
327
|
+
elif metadata_kind == "resume":
|
|
328
|
+
allowed_keys = KIMI_RESUME_KEYS
|
|
329
|
+
is_resume_hint = True
|
|
330
|
+
elif metadata_kind == "version":
|
|
331
|
+
continue
|
|
332
|
+
else:
|
|
333
|
+
return None, inconclusive(
|
|
334
|
+
args,
|
|
335
|
+
"Kimi emitted an event outside the stream allowlist",
|
|
336
|
+
"tool_boundary_violation",
|
|
337
|
+
False,
|
|
338
|
+
)
|
|
339
|
+
if set(event) - allowed_keys:
|
|
340
|
+
return None, inconclusive(
|
|
341
|
+
args,
|
|
342
|
+
"Kimi emitted fields outside the stream allowlist",
|
|
343
|
+
"tool_boundary_violation",
|
|
344
|
+
False,
|
|
345
|
+
)
|
|
346
|
+
|
|
347
|
+
if is_resume_hint:
|
|
348
|
+
continue
|
|
349
|
+
|
|
350
|
+
parsed_calls, call_error = parse_kimi_tool_calls(event)
|
|
351
|
+
if call_error == "invalid_container":
|
|
352
|
+
return None, inconclusive(
|
|
353
|
+
args, "invalid Kimi tool-call shape", "invalid_model_output", True
|
|
354
|
+
)
|
|
355
|
+
if call_error is not None or parsed_calls is None:
|
|
356
|
+
return None, inconclusive(
|
|
357
|
+
args,
|
|
358
|
+
"Kimi emitted a tool call outside the stream allowlist",
|
|
359
|
+
"tool_boundary_violation",
|
|
360
|
+
False,
|
|
361
|
+
)
|
|
362
|
+
calls = event.get("tool_calls") or []
|
|
363
|
+
content = event.get("content")
|
|
364
|
+
if (
|
|
365
|
+
role == "assistant"
|
|
366
|
+
and not packet_read_started
|
|
367
|
+
and not calls
|
|
368
|
+
and isinstance(content, str)
|
|
369
|
+
and content.startswith(KIMI_HOOK_PREFIX)
|
|
370
|
+
):
|
|
371
|
+
# Kimi 0.27 emits trusted UserPromptSubmit hook context as an
|
|
372
|
+
# assistant-shaped prelude before the model reads the packet. It is
|
|
373
|
+
# workstation input, not reviewer verdict text. The pre-read/order
|
|
374
|
+
# guard prevents a later model concern from hiding behind the same
|
|
375
|
+
# prefix.
|
|
376
|
+
continue
|
|
377
|
+
for call_id, name, arguments in parsed_calls:
|
|
378
|
+
argument_keys = set(arguments or {})
|
|
379
|
+
page_span: tuple[int, int] | None = None
|
|
380
|
+
if name == packet_tool:
|
|
381
|
+
if argument_keys == {"byte_offset", "max_bytes"}:
|
|
382
|
+
byte_offset = (arguments or {}).get("byte_offset")
|
|
383
|
+
max_bytes = (arguments or {}).get("max_bytes")
|
|
384
|
+
if (
|
|
385
|
+
isinstance(byte_offset, int)
|
|
386
|
+
and not isinstance(byte_offset, bool)
|
|
387
|
+
and byte_offset >= 0
|
|
388
|
+
and (
|
|
389
|
+
byte_offset < packet_byte_count
|
|
390
|
+
or (
|
|
391
|
+
byte_offset == packet_byte_count
|
|
392
|
+
and full_packet_covered()
|
|
393
|
+
)
|
|
394
|
+
)
|
|
395
|
+
and isinstance(max_bytes, int)
|
|
396
|
+
and not isinstance(max_bytes, bool)
|
|
397
|
+
and 1 <= max_bytes <= MAX_CHUNK_BYTES
|
|
398
|
+
):
|
|
399
|
+
page_span = (byte_offset, max_bytes)
|
|
400
|
+
if page_span is None:
|
|
401
|
+
return None, inconclusive(
|
|
402
|
+
args,
|
|
403
|
+
"Kimi attempted a tool outside the exact packet pagination boundary",
|
|
404
|
+
"tool_boundary_violation",
|
|
405
|
+
False,
|
|
406
|
+
attempted_tool=name,
|
|
407
|
+
)
|
|
408
|
+
packet_read_started = True
|
|
409
|
+
packet_read_ids[call_id] = page_span
|
|
410
|
+
if role == "tool":
|
|
411
|
+
tool_call_id = event.get("tool_call_id")
|
|
412
|
+
if not isinstance(tool_call_id, str) or tool_call_id not in packet_read_ids:
|
|
413
|
+
return None, inconclusive(
|
|
414
|
+
args,
|
|
415
|
+
"Kimi emitted an unbound tool result",
|
|
416
|
+
"tool_boundary_violation",
|
|
417
|
+
False,
|
|
418
|
+
)
|
|
419
|
+
tool_content = event.get("content")
|
|
420
|
+
if not isinstance(tool_content, str):
|
|
421
|
+
return None, inconclusive(
|
|
422
|
+
args,
|
|
423
|
+
"Kimi emitted an unreadable packet page",
|
|
424
|
+
"tool_boundary_violation",
|
|
425
|
+
False,
|
|
426
|
+
)
|
|
427
|
+
expected_start, requested_bytes = packet_read_ids[tool_call_id]
|
|
428
|
+
header, separator, chunk = tool_content.partition("\n")
|
|
429
|
+
match = re.fullmatch(r"PACKET_CHUNK ([0-9]+):([0-9]+)/([0-9]+)", header)
|
|
430
|
+
if match is not None and separator:
|
|
431
|
+
returned_start, returned_end, returned_total = map(int, match.groups())
|
|
432
|
+
valid_page = (
|
|
433
|
+
returned_start == expected_start
|
|
434
|
+
and returned_total == packet_byte_count
|
|
435
|
+
and returned_start < returned_end <= min(
|
|
436
|
+
returned_start + requested_bytes, packet_byte_count
|
|
437
|
+
)
|
|
438
|
+
and chunk.encode("utf-8") == packet_bytes[returned_start:returned_end]
|
|
439
|
+
)
|
|
440
|
+
valid_eof_confirmation = (
|
|
441
|
+
returned_start == expected_start == packet_byte_count
|
|
442
|
+
and returned_end == packet_byte_count
|
|
443
|
+
and chunk == ""
|
|
444
|
+
and full_packet_covered()
|
|
445
|
+
)
|
|
446
|
+
if valid_page:
|
|
447
|
+
covered_ranges.append((returned_start, returned_end))
|
|
448
|
+
packet_read = full_packet_covered()
|
|
449
|
+
elif valid_eof_confirmation:
|
|
450
|
+
packet_read = True
|
|
451
|
+
remaining_event = {
|
|
452
|
+
key: value for key, value in event.items() if key != "tool_calls"
|
|
453
|
+
}
|
|
454
|
+
if has_unrecognized_tool_activity(remaining_event):
|
|
455
|
+
return None, inconclusive(
|
|
456
|
+
args,
|
|
457
|
+
"Kimi emitted an unrecognized tool activity shape",
|
|
458
|
+
"tool_boundary_violation",
|
|
459
|
+
False,
|
|
460
|
+
)
|
|
461
|
+
if role != "assistant":
|
|
462
|
+
continue
|
|
463
|
+
if isinstance(content, str) and content.strip():
|
|
464
|
+
if not packet_read:
|
|
465
|
+
premature_texts.append(content.strip())
|
|
466
|
+
else:
|
|
467
|
+
assistant_texts.append(content.strip())
|
|
468
|
+
if not packet_read:
|
|
469
|
+
concern_text = "\n".join(
|
|
470
|
+
line
|
|
471
|
+
for text in premature_texts
|
|
472
|
+
for line in text.splitlines()
|
|
473
|
+
if not CONCERN_RESULT_RE.match(line.strip())
|
|
474
|
+
and line.strip() != "NO_BLOCKING_FINDINGS"
|
|
475
|
+
)
|
|
476
|
+
if premature_texts:
|
|
477
|
+
return None, invalid_model_output(
|
|
478
|
+
args,
|
|
479
|
+
"Kimi produced verdict text before reading the full frozen packet",
|
|
480
|
+
concern_text,
|
|
481
|
+
)
|
|
482
|
+
return None, inconclusive(
|
|
483
|
+
args,
|
|
484
|
+
"Kimi did not read the full frozen packet",
|
|
485
|
+
"invalid_model_output",
|
|
486
|
+
True,
|
|
487
|
+
)
|
|
488
|
+
if premature_texts:
|
|
489
|
+
concern_text = "\n".join(
|
|
490
|
+
line
|
|
491
|
+
for text in premature_texts
|
|
492
|
+
for line in text.splitlines()
|
|
493
|
+
if not CONCERN_RESULT_RE.match(line.strip())
|
|
494
|
+
and line.strip() != "NO_BLOCKING_FINDINGS"
|
|
495
|
+
)
|
|
496
|
+
return None, invalid_model_output(
|
|
497
|
+
args,
|
|
498
|
+
"Kimi produced verdict text before reading the full frozen packet",
|
|
499
|
+
concern_text,
|
|
500
|
+
)
|
|
501
|
+
if not assistant_texts:
|
|
502
|
+
return None, inconclusive(
|
|
503
|
+
args, "Kimi produced no final assistant text", "invalid_model_output", True
|
|
504
|
+
)
|
|
505
|
+
combined_text = "\n".join(assistant_texts)
|
|
506
|
+
expected_receipt = getattr(args, "packet_receipt", "")
|
|
507
|
+
if expected_receipt:
|
|
508
|
+
output_lines = combined_text.splitlines()
|
|
509
|
+
if not output_lines or output_lines[0].strip() != expected_receipt:
|
|
510
|
+
concern_text = "\n".join(
|
|
511
|
+
line
|
|
512
|
+
for line in output_lines
|
|
513
|
+
if not CONCERN_RESULT_RE.match(line.strip())
|
|
514
|
+
and line.strip() != "NO_BLOCKING_FINDINGS"
|
|
515
|
+
and not line.strip().startswith("KIMI_PACKET_RECEIPT_")
|
|
516
|
+
)
|
|
517
|
+
return None, invalid_model_output(
|
|
518
|
+
args,
|
|
519
|
+
"Kimi did not echo the terminal packet receipt first",
|
|
520
|
+
concern_text,
|
|
521
|
+
)
|
|
522
|
+
combined_text = "\n".join(output_lines[1:]).strip()
|
|
523
|
+
if not combined_text:
|
|
524
|
+
return None, inconclusive(
|
|
525
|
+
args,
|
|
526
|
+
"Kimi echoed the packet receipt without a review verdict",
|
|
527
|
+
"invalid_model_output",
|
|
528
|
+
True,
|
|
529
|
+
)
|
|
530
|
+
return combined_text, None
|
|
531
|
+
|
|
532
|
+
|
|
533
|
+
def kimi_inline_text(
|
|
534
|
+
args: argparse.Namespace, events: list[dict[str, Any]]
|
|
535
|
+
) -> tuple[str | None, dict[str, Any] | None]:
|
|
536
|
+
"""Audit a no-tools Kimi stream with a pre-delivered frozen packet."""
|
|
537
|
+
assistant_texts: list[str] = []
|
|
538
|
+
for event in events:
|
|
539
|
+
role = event.get("role")
|
|
540
|
+
if role == "meta":
|
|
541
|
+
if safe_kimi_metadata_kind(event) is None:
|
|
542
|
+
return None, inconclusive(
|
|
543
|
+
args,
|
|
544
|
+
"Kimi emitted metadata outside the no-tools stream allowlist",
|
|
545
|
+
"tool_boundary_violation",
|
|
546
|
+
False,
|
|
547
|
+
)
|
|
548
|
+
continue
|
|
549
|
+
if role != "assistant" or set(event) - KIMI_ASSISTANT_KEYS:
|
|
550
|
+
return None, inconclusive(
|
|
551
|
+
args,
|
|
552
|
+
"Kimi emitted an event outside the no-tools packet boundary",
|
|
553
|
+
"tool_boundary_violation",
|
|
554
|
+
False,
|
|
555
|
+
)
|
|
556
|
+
calls, call_error = parse_kimi_tool_calls(event)
|
|
557
|
+
if call_error == "invalid_container":
|
|
558
|
+
return None, inconclusive(
|
|
559
|
+
args,
|
|
560
|
+
"Kimi emitted an invalid tool-call container during no-tools review",
|
|
561
|
+
"invalid_model_output",
|
|
562
|
+
True,
|
|
563
|
+
)
|
|
564
|
+
if call_error is not None:
|
|
565
|
+
return None, inconclusive(
|
|
566
|
+
args,
|
|
567
|
+
"Kimi emitted an invalid tool-call envelope during no-tools review",
|
|
568
|
+
"tool_boundary_violation",
|
|
569
|
+
False,
|
|
570
|
+
)
|
|
571
|
+
if calls:
|
|
572
|
+
return None, inconclusive(
|
|
573
|
+
args,
|
|
574
|
+
"Kimi attempted tool activity during no-tools review",
|
|
575
|
+
"tool_boundary_violation",
|
|
576
|
+
False,
|
|
577
|
+
attempted_tool=calls[0][1],
|
|
578
|
+
)
|
|
579
|
+
remaining_event = {
|
|
580
|
+
key: value for key, value in event.items() if key != "tool_calls"
|
|
581
|
+
}
|
|
582
|
+
if has_unrecognized_tool_activity(remaining_event):
|
|
583
|
+
return None, inconclusive(
|
|
584
|
+
args,
|
|
585
|
+
"Kimi emitted nested tool activity during no-tools review",
|
|
586
|
+
"tool_boundary_violation",
|
|
587
|
+
False,
|
|
588
|
+
)
|
|
589
|
+
content = event.get("content")
|
|
590
|
+
if content is not None and not isinstance(content, str):
|
|
591
|
+
return None, inconclusive(
|
|
592
|
+
args,
|
|
593
|
+
"Kimi emitted non-text no-tools review content",
|
|
594
|
+
"tool_boundary_violation",
|
|
595
|
+
False,
|
|
596
|
+
)
|
|
597
|
+
if isinstance(content, str) and content.strip():
|
|
598
|
+
assistant_texts.append(content.strip())
|
|
599
|
+
if not assistant_texts:
|
|
600
|
+
return None, inconclusive(
|
|
601
|
+
args, "Kimi produced no no-tools review text", "invalid_model_output", True
|
|
602
|
+
)
|
|
603
|
+
combined_text = "\n".join(assistant_texts)
|
|
604
|
+
expected_receipt = getattr(args, "packet_receipt", "")
|
|
605
|
+
if expected_receipt:
|
|
606
|
+
output_lines = combined_text.splitlines()
|
|
607
|
+
if not output_lines or output_lines[0].strip() != expected_receipt:
|
|
608
|
+
concern_text = "\n".join(
|
|
609
|
+
line
|
|
610
|
+
for line in output_lines
|
|
611
|
+
if not CONCERN_RESULT_RE.match(line.strip())
|
|
612
|
+
and line.strip() != "NO_BLOCKING_FINDINGS"
|
|
613
|
+
and not line.strip().startswith("KIMI_PACKET_RECEIPT_")
|
|
614
|
+
)
|
|
615
|
+
return None, invalid_model_output(
|
|
616
|
+
args,
|
|
617
|
+
"Kimi did not echo the terminal packet receipt first",
|
|
618
|
+
concern_text,
|
|
619
|
+
)
|
|
620
|
+
combined_text = "\n".join(output_lines[1:]).strip()
|
|
621
|
+
if not combined_text:
|
|
622
|
+
return None, inconclusive(
|
|
623
|
+
args,
|
|
624
|
+
"Kimi echoed the packet receipt without a review verdict",
|
|
625
|
+
"invalid_model_output",
|
|
626
|
+
True,
|
|
627
|
+
)
|
|
628
|
+
return combined_text, None
|
|
629
|
+
|
|
630
|
+
|
|
631
|
+
def audit_codex(
|
|
632
|
+
args: argparse.Namespace, events: list[dict[str, Any]]
|
|
633
|
+
) -> dict[str, Any] | None:
|
|
634
|
+
# Codex can emit known non-tool diagnostic items while still completing a
|
|
635
|
+
# valid response. Tool activity is represented by other item types such as
|
|
636
|
+
# command_execution. Unknown error items remain fail-closed even when the
|
|
637
|
+
# last-message file is valid.
|
|
638
|
+
allowed_items = {"agent_message", "reasoning"}
|
|
639
|
+
allowed_item_events = {"item.started", "item.updated", "item.completed"}
|
|
640
|
+
allowed_lifecycle_events = {"thread.started", "turn.started", "turn.completed"}
|
|
641
|
+
failed_lifecycle_events = {"turn.failed", "turn.cancelled", "error"}
|
|
642
|
+
saw_completed_agent_message = False
|
|
643
|
+
saw_completed_turn = False
|
|
644
|
+
concern_fragments: list[str] = []
|
|
645
|
+
try:
|
|
646
|
+
concern_fragments.append(
|
|
647
|
+
Path(args.result_file).read_bytes().decode("utf-8", "replace")
|
|
648
|
+
)
|
|
649
|
+
except OSError:
|
|
650
|
+
pass
|
|
651
|
+
|
|
652
|
+
def invalid(reason: str) -> dict[str, Any]:
|
|
653
|
+
return invalid_model_output(args, reason, "\n".join(concern_fragments))
|
|
654
|
+
|
|
655
|
+
for event in events:
|
|
656
|
+
event_type = event.get("type")
|
|
657
|
+
if event_type == "turn.completed":
|
|
658
|
+
saw_completed_turn = True
|
|
659
|
+
item = event.get("item")
|
|
660
|
+
if not isinstance(item, dict):
|
|
661
|
+
if event_type in failed_lifecycle_events:
|
|
662
|
+
return invalid("Codex reported a failed review lifecycle")
|
|
663
|
+
if event_type in allowed_lifecycle_events:
|
|
664
|
+
continue
|
|
665
|
+
return inconclusive(
|
|
666
|
+
args,
|
|
667
|
+
"Codex emitted an event outside the packet-only boundary",
|
|
668
|
+
"tool_boundary_violation",
|
|
669
|
+
False,
|
|
670
|
+
attempted_tool=event_type,
|
|
671
|
+
)
|
|
672
|
+
if event_type not in allowed_item_events:
|
|
673
|
+
return inconclusive(
|
|
674
|
+
args,
|
|
675
|
+
"Codex emitted an unrecognized item event",
|
|
676
|
+
"tool_boundary_violation",
|
|
677
|
+
False,
|
|
678
|
+
attempted_tool=event_type,
|
|
679
|
+
)
|
|
680
|
+
item_type = item.get("type")
|
|
681
|
+
if item_type == "agent_message":
|
|
682
|
+
item_text = item.get("text")
|
|
683
|
+
if isinstance(item_text, str) and item_text.strip():
|
|
684
|
+
concern_fragments.append(item_text.strip())
|
|
685
|
+
if item_type == "error":
|
|
686
|
+
message = item.get("message")
|
|
687
|
+
# The hook-trust stop must fire on any allowed item event: gating
|
|
688
|
+
# it on item.completed would let the same warning delivered as
|
|
689
|
+
# item.started/item.updated degrade into cascade-eligible
|
|
690
|
+
# invalid_model_output instead of a terminal boundary stop.
|
|
691
|
+
if message == CODEX_HOOK_TRUST_WARNING:
|
|
692
|
+
return inconclusive(
|
|
693
|
+
args,
|
|
694
|
+
"Codex hooks were enabled without persisted trust during packet-only review",
|
|
695
|
+
"tool_boundary_violation",
|
|
696
|
+
False,
|
|
697
|
+
# Same defect class as the malformed-output stop: a boundary
|
|
698
|
+
# violation that swallowed a concern leaves nothing to triage.
|
|
699
|
+
**concern_fields("\n".join(concern_fragments)),
|
|
700
|
+
)
|
|
701
|
+
if event_type == "item.completed" and is_benign_codex_error(message):
|
|
702
|
+
continue
|
|
703
|
+
if (
|
|
704
|
+
event_type == "item.completed"
|
|
705
|
+
and isinstance(message, str)
|
|
706
|
+
and CODEX_STREAM_GAP_RE.fullmatch(message.strip())
|
|
707
|
+
):
|
|
708
|
+
return inconclusive(
|
|
709
|
+
args,
|
|
710
|
+
"Codex event stream reported dropped events",
|
|
711
|
+
"transport_unverifiable",
|
|
712
|
+
False,
|
|
713
|
+
)
|
|
714
|
+
# Name the error, but not in `reason`. The events file dies with the
|
|
715
|
+
# run dir, so this string is otherwise unrecoverable — yet it is
|
|
716
|
+
# untrusted client text that may quote packet content, and `reason`
|
|
717
|
+
# is a stable field consumers display and compare. Keep `reason`
|
|
718
|
+
# fixed and carry the text in its own labelled field.
|
|
719
|
+
payload = invalid("Codex reported an item-level review error")
|
|
720
|
+
payload["client_diagnostic"] = bounded_reason_detail(message)
|
|
721
|
+
return payload
|
|
722
|
+
if item_type not in allowed_items:
|
|
723
|
+
return inconclusive(
|
|
724
|
+
args,
|
|
725
|
+
"Codex attempted tool activity during packet-only review",
|
|
726
|
+
"tool_boundary_violation",
|
|
727
|
+
False,
|
|
728
|
+
attempted_tool=item_type,
|
|
729
|
+
)
|
|
730
|
+
if event_type == "item.completed" and item_type == "agent_message":
|
|
731
|
+
saw_completed_agent_message = True
|
|
732
|
+
if not saw_completed_agent_message or not saw_completed_turn:
|
|
733
|
+
return inconclusive(
|
|
734
|
+
args,
|
|
735
|
+
"Codex event stream lacked positive completion evidence",
|
|
736
|
+
"transport_unverifiable",
|
|
737
|
+
False,
|
|
738
|
+
)
|
|
739
|
+
return None
|
|
740
|
+
|
|
741
|
+
|
|
742
|
+
def parse_text_contract(args: argparse.Namespace, text: str) -> dict[str, Any]:
|
|
743
|
+
concern_results: list[dict[str, str]] = []
|
|
744
|
+
verdict_lines: list[str] = []
|
|
745
|
+
seen_verdict = False
|
|
746
|
+
seen_concerns: set[str] = set()
|
|
747
|
+
for line in text.splitlines():
|
|
748
|
+
normalized = line.strip()
|
|
749
|
+
if not normalized:
|
|
750
|
+
continue
|
|
751
|
+
concern_match = CONCERN_RESULT_RE.fullmatch(normalized)
|
|
752
|
+
if concern_match and not seen_verdict:
|
|
753
|
+
concern, conclusion = concern_match.groups()
|
|
754
|
+
concern = concern.lower()
|
|
755
|
+
conclusion = conclusion.strip()
|
|
756
|
+
if concern in seen_concerns or not conclusion or len(conclusion) > 2000:
|
|
757
|
+
return invalid_model_output(
|
|
758
|
+
args, "review concern result used invalid values", text
|
|
759
|
+
)
|
|
760
|
+
seen_concerns.add(concern)
|
|
761
|
+
concern_results.append({"concern": concern, "conclusion": conclusion})
|
|
762
|
+
continue
|
|
763
|
+
seen_verdict = True
|
|
764
|
+
verdict_lines.append(normalized)
|
|
765
|
+
if verdict_lines == ["NO_BLOCKING_FINDINGS"]:
|
|
766
|
+
return result(args, "passed", concern_results=concern_results, findings=[])
|
|
767
|
+
findings: list[dict[str, Any]] = []
|
|
768
|
+
for line in verdict_lines:
|
|
769
|
+
match = FINDING_RE.fullmatch(line)
|
|
770
|
+
if not match:
|
|
771
|
+
return invalid_model_output(
|
|
772
|
+
args, "review verdict violated the output contract", text
|
|
773
|
+
)
|
|
774
|
+
severity, file_name, line_number, failure_path, smallest_fix = match.groups()
|
|
775
|
+
path = PurePosixPath(file_name)
|
|
776
|
+
if path.is_absolute() or ".." in path.parts:
|
|
777
|
+
return invalid_model_output(
|
|
778
|
+
args, "review finding used an unsafe file path", text
|
|
779
|
+
)
|
|
780
|
+
findings.append(
|
|
781
|
+
{
|
|
782
|
+
"severity": severity,
|
|
783
|
+
"file": file_name,
|
|
784
|
+
"line": int(line_number),
|
|
785
|
+
"failure_path": failure_path,
|
|
786
|
+
"smallest_fix": smallest_fix,
|
|
787
|
+
}
|
|
788
|
+
)
|
|
789
|
+
if not findings:
|
|
790
|
+
return invalid_model_output(args, "review verdict was empty", text)
|
|
791
|
+
return result(args, "findings", concern_results=concern_results, findings=findings)
|
|
792
|
+
|
|
793
|
+
|
|
794
|
+
def parse_json_contract(args: argparse.Namespace) -> dict[str, Any]:
|
|
795
|
+
try:
|
|
796
|
+
raw_verdict = Path(args.result_file).read_text(encoding="utf-8")
|
|
797
|
+
except (OSError, UnicodeError):
|
|
798
|
+
return invalid_model_output(args, "review verdict was not readable")
|
|
799
|
+
try:
|
|
800
|
+
payload = json.loads(raw_verdict)
|
|
801
|
+
except json.JSONDecodeError:
|
|
802
|
+
return invalid_model_output(
|
|
803
|
+
args, "review verdict was not valid JSON", raw_verdict
|
|
804
|
+
)
|
|
805
|
+
allowed = {"status", "findings", "concern_results"}
|
|
806
|
+
if (
|
|
807
|
+
not isinstance(payload, dict)
|
|
808
|
+
or not {"status", "findings"}.issubset(payload)
|
|
809
|
+
or set(payload) - allowed
|
|
810
|
+
):
|
|
811
|
+
return invalid_model_output(
|
|
812
|
+
args, "review verdict used an invalid schema", raw_verdict
|
|
813
|
+
)
|
|
814
|
+
status = payload.get("status")
|
|
815
|
+
findings = payload.get("findings")
|
|
816
|
+
if status not in {"passed", "findings"} or not isinstance(findings, list):
|
|
817
|
+
return invalid_model_output(
|
|
818
|
+
args, "review verdict used an invalid schema", raw_verdict
|
|
819
|
+
)
|
|
820
|
+
if (status == "passed" and findings) or (status == "findings" and not findings):
|
|
821
|
+
return invalid_model_output(
|
|
822
|
+
args, "review status did not match findings", raw_verdict
|
|
823
|
+
)
|
|
824
|
+
required = {"severity", "file", "line", "failure_path", "smallest_fix"}
|
|
825
|
+
for finding in findings:
|
|
826
|
+
if not isinstance(finding, dict) or set(finding) != required:
|
|
827
|
+
return invalid_model_output(
|
|
828
|
+
args, "review finding used an invalid schema", raw_verdict
|
|
829
|
+
)
|
|
830
|
+
path = PurePosixPath(str(finding.get("file", "")))
|
|
831
|
+
if (
|
|
832
|
+
finding.get("severity") not in {"P0", "P1", "P2"}
|
|
833
|
+
or not isinstance(finding.get("line"), int)
|
|
834
|
+
or finding["line"] < 1
|
|
835
|
+
or not isinstance(finding.get("failure_path"), str)
|
|
836
|
+
or not finding["failure_path"].strip()
|
|
837
|
+
or not isinstance(finding.get("smallest_fix"), str)
|
|
838
|
+
or not finding["smallest_fix"].strip()
|
|
839
|
+
or path.is_absolute()
|
|
840
|
+
or ".." in path.parts
|
|
841
|
+
):
|
|
842
|
+
return invalid_model_output(
|
|
843
|
+
args, "review finding used invalid values", raw_verdict
|
|
844
|
+
)
|
|
845
|
+
concern_results = payload.get("concern_results", [])
|
|
846
|
+
if not isinstance(concern_results, list):
|
|
847
|
+
return invalid_model_output(
|
|
848
|
+
args, "review concern results used an invalid schema", raw_verdict
|
|
849
|
+
)
|
|
850
|
+
seen_concerns: set[str] = set()
|
|
851
|
+
normalized_concerns: list[dict[str, str]] = []
|
|
852
|
+
for item in concern_results:
|
|
853
|
+
if not isinstance(item, dict) or set(item) != {"concern", "conclusion"}:
|
|
854
|
+
return invalid_model_output(
|
|
855
|
+
args, "review concern result used an invalid schema", raw_verdict
|
|
856
|
+
)
|
|
857
|
+
concern = item.get("concern")
|
|
858
|
+
conclusion = item.get("conclusion")
|
|
859
|
+
if (
|
|
860
|
+
not isinstance(concern, str)
|
|
861
|
+
or not re.fullmatch(r"[a-z][a-z0-9_]*", concern)
|
|
862
|
+
or concern in seen_concerns
|
|
863
|
+
or not isinstance(conclusion, str)
|
|
864
|
+
or not conclusion.strip()
|
|
865
|
+
or len(conclusion.strip()) > 2000
|
|
866
|
+
):
|
|
867
|
+
return invalid_model_output(
|
|
868
|
+
args, "review concern result used invalid values", raw_verdict
|
|
869
|
+
)
|
|
870
|
+
seen_concerns.add(concern)
|
|
871
|
+
normalized_concerns.append(
|
|
872
|
+
{"concern": concern, "conclusion": conclusion.strip()}
|
|
873
|
+
)
|
|
874
|
+
return result(args, status, concern_results=normalized_concerns, findings=findings)
|
|
875
|
+
|
|
876
|
+
|
|
877
|
+
def judge(args: argparse.Namespace) -> dict[str, Any]:
|
|
878
|
+
reviewer_family = normalize_family(args.reviewer_family)
|
|
879
|
+
implementer_family = normalize_family(args.implementer_family)
|
|
880
|
+
args.reviewer_family = reviewer_family or ""
|
|
881
|
+
if not reviewer_family:
|
|
882
|
+
payload = inconclusive(
|
|
883
|
+
args,
|
|
884
|
+
"reviewer family could not be attributed",
|
|
885
|
+
"missing_or_unmapped_reviewer_family",
|
|
886
|
+
True,
|
|
887
|
+
)
|
|
888
|
+
payload["candidate_ineligible"] = True
|
|
889
|
+
return payload
|
|
890
|
+
if not implementer_family:
|
|
891
|
+
return inconclusive(
|
|
892
|
+
args, "implementer family is unmapped", "unmapped_implementer_family", False
|
|
893
|
+
)
|
|
894
|
+
if reviewer_family == implementer_family:
|
|
895
|
+
payload = inconclusive(
|
|
896
|
+
args,
|
|
897
|
+
"reviewer belongs to the implementer model family",
|
|
898
|
+
"same_family_as_implementer",
|
|
899
|
+
True,
|
|
900
|
+
)
|
|
901
|
+
payload["candidate_ineligible"] = True
|
|
902
|
+
return payload
|
|
903
|
+
|
|
904
|
+
events, event_error, raw_events = load_json_lines(Path(args.events))
|
|
905
|
+
if event_error is not None or events is None:
|
|
906
|
+
return invalid_model_output(
|
|
907
|
+
args, event_error or "invalid_event_stream", raw_events
|
|
908
|
+
)
|
|
909
|
+
if args.client == "kimi":
|
|
910
|
+
if args.packet_delivery == "mcp":
|
|
911
|
+
text, failure = kimi_text(args, events)
|
|
912
|
+
else:
|
|
913
|
+
text, failure = kimi_inline_text(args, events)
|
|
914
|
+
return failure or parse_text_contract(args, text or "")
|
|
915
|
+
failure = audit_codex(args, events)
|
|
916
|
+
return failure or parse_json_contract(args)
|
|
917
|
+
|
|
918
|
+
|
|
919
|
+
def main() -> int:
|
|
920
|
+
parser = argparse.ArgumentParser(description=__doc__)
|
|
921
|
+
parser.add_argument("--client", required=True, choices=("kimi", "codex"))
|
|
922
|
+
parser.add_argument("--mode", required=True, choices=("review", "challenge"))
|
|
923
|
+
parser.add_argument("--implementer-family", required=True)
|
|
924
|
+
parser.add_argument("--reviewer-family", required=True)
|
|
925
|
+
parser.add_argument("--provider", default="")
|
|
926
|
+
parser.add_argument("--model", default="")
|
|
927
|
+
parser.add_argument("--events", required=True)
|
|
928
|
+
parser.add_argument("--packet")
|
|
929
|
+
parser.add_argument("--packet-delivery", choices=("mcp", "inline"), default="mcp")
|
|
930
|
+
parser.add_argument("--packet-receipt", default="")
|
|
931
|
+
parser.add_argument("--result-file")
|
|
932
|
+
args = parser.parse_args()
|
|
933
|
+
if args.client == "kimi" and not args.packet:
|
|
934
|
+
parser.error("--packet is required for Kimi")
|
|
935
|
+
if args.client == "kimi" and not args.packet_receipt:
|
|
936
|
+
parser.error("--packet-receipt is required for Kimi delivery")
|
|
937
|
+
if args.client == "codex" and not args.result_file:
|
|
938
|
+
parser.error("--result-file is required for Codex")
|
|
939
|
+
|
|
940
|
+
payload = judge(args)
|
|
941
|
+
print(json.dumps(payload, ensure_ascii=False, separators=(",", ":")))
|
|
942
|
+
return 0 if payload["status"] in {"passed", "findings"} else 2
|
|
943
|
+
|
|
944
|
+
|
|
945
|
+
if __name__ == "__main__":
|
|
946
|
+
raise SystemExit(main())
|