@prismer/runtime 2.0.7 → 2.2.55
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/CHANGELOG.md +3631 -0
- package/README.md +34 -12
- package/apc/skills/FIELD-DICTIONARY.md +111 -0
- package/apc/skills/bug-reproduce/SKILL.md +150 -0
- package/apc/skills/bug-reproduce/skill.json +96 -0
- package/apc/skills/code-review/SKILL.md +198 -0
- package/apc/skills/code-review/skill.json +124 -0
- package/apc/skills/design-review/SKILL.md +122 -0
- package/apc/skills/design-review/skill.json +88 -0
- package/apc/skills/doc-sync/SKILL.md +168 -0
- package/apc/skills/doc-sync/skill.json +81 -0
- package/apc/skills/env-doctor/SKILL.md +194 -0
- package/apc/skills/env-doctor/skill.json +209 -0
- package/apc/skills/git-ops/SKILL.md +189 -0
- package/apc/skills/git-ops/skill.json +94 -0
- package/apc/skills/impact-trace/SKILL.md +168 -0
- package/apc/skills/impact-trace/skill.json +104 -0
- package/apc/skills/observability/SKILL.md +195 -0
- package/apc/skills/observability/skill.json +116 -0
- package/apc/skills/release-db-config-sync/SKILL.md +186 -0
- package/apc/skills/release-db-config-sync/skill.json +109 -0
- package/apc/skills/release-ota-promote/SKILL.md +195 -0
- package/apc/skills/release-ota-promote/skill.json +176 -0
- package/apc/skills/release-preflight/SKILL.md +174 -0
- package/apc/skills/release-preflight/skill.json +175 -0
- package/apc/skills/release-rollback/SKILL.md +214 -0
- package/apc/skills/release-rollback/skill.json +230 -0
- package/apc/skills/release-tag/SKILL.md +194 -0
- package/apc/skills/release-tag/skill.json +94 -0
- package/apc/skills/releasing-prod/SKILL.md +49 -0
- package/apc/skills/releasing-test/SKILL.md +135 -0
- package/apc/skills/sdk-release/SKILL.md +200 -0
- package/apc/skills/spec-intake/SKILL.md +169 -0
- package/apc/skills/spec-intake/skill.json +93 -0
- package/apc/skills/test-result-feedback/SKILL.md +239 -0
- package/apc/skills/test-result-feedback/skill.json +193 -0
- package/apc/skills/test-runner/SKILL.md +169 -0
- package/apc/skills/test-runner/skill.json +103 -0
- package/apc/skills/ui-align/SKILL.md +209 -0
- package/apc/skills/ui-align/skill.json +114 -0
- package/apc/skills/ui-canvas/SKILL.md +148 -0
- package/apc/skills/ui-canvas/skill.json +127 -0
- package/built-in-skills/agent-coordination/SKILL.md +257 -0
- package/built-in-skills/agent-meta/SKILL.md +53 -0
- package/built-in-skills/assets/SKILL.md +133 -0
- package/built-in-skills/browser-use/SKILL.md +93 -0
- package/built-in-skills/canvas-design/LICENSE.txt +202 -0
- package/built-in-skills/canvas-design/SKILL.md +157 -0
- package/built-in-skills/canvas-design/canvas-fonts/ArsenalSC-OFL.txt +93 -0
- package/built-in-skills/canvas-design/canvas-fonts/ArsenalSC-Regular.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/BigShoulders-Bold.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/BigShoulders-OFL.txt +93 -0
- package/built-in-skills/canvas-design/canvas-fonts/BigShoulders-Regular.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/Boldonse-OFL.txt +93 -0
- package/built-in-skills/canvas-design/canvas-fonts/Boldonse-Regular.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/BricolageGrotesque-Bold.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/BricolageGrotesque-OFL.txt +93 -0
- package/built-in-skills/canvas-design/canvas-fonts/BricolageGrotesque-Regular.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/CrimsonPro-Bold.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/CrimsonPro-Italic.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/CrimsonPro-OFL.txt +93 -0
- package/built-in-skills/canvas-design/canvas-fonts/CrimsonPro-Regular.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/DMMono-OFL.txt +93 -0
- package/built-in-skills/canvas-design/canvas-fonts/DMMono-Regular.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/EricaOne-OFL.txt +94 -0
- package/built-in-skills/canvas-design/canvas-fonts/EricaOne-Regular.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/GeistMono-Bold.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/GeistMono-OFL.txt +93 -0
- package/built-in-skills/canvas-design/canvas-fonts/GeistMono-Regular.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/Gloock-OFL.txt +93 -0
- package/built-in-skills/canvas-design/canvas-fonts/Gloock-Regular.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/IBMPlexMono-Bold.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/IBMPlexMono-OFL.txt +93 -0
- package/built-in-skills/canvas-design/canvas-fonts/IBMPlexMono-Regular.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/IBMPlexSerif-Bold.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/IBMPlexSerif-BoldItalic.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/IBMPlexSerif-Italic.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/IBMPlexSerif-Regular.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/InstrumentSans-Bold.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/InstrumentSans-BoldItalic.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/InstrumentSans-Italic.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/InstrumentSans-OFL.txt +93 -0
- package/built-in-skills/canvas-design/canvas-fonts/InstrumentSans-Regular.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/InstrumentSerif-Italic.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/InstrumentSerif-Regular.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/Italiana-OFL.txt +93 -0
- package/built-in-skills/canvas-design/canvas-fonts/Italiana-Regular.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/JetBrainsMono-Bold.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/JetBrainsMono-OFL.txt +93 -0
- package/built-in-skills/canvas-design/canvas-fonts/JetBrainsMono-Regular.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/Jura-Light.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/Jura-Medium.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/Jura-OFL.txt +93 -0
- package/built-in-skills/canvas-design/canvas-fonts/LibreBaskerville-OFL.txt +93 -0
- package/built-in-skills/canvas-design/canvas-fonts/LibreBaskerville-Regular.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/Lora-Bold.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/Lora-BoldItalic.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/Lora-Italic.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/Lora-OFL.txt +93 -0
- package/built-in-skills/canvas-design/canvas-fonts/Lora-Regular.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/NationalPark-Bold.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/NationalPark-OFL.txt +93 -0
- package/built-in-skills/canvas-design/canvas-fonts/NationalPark-Regular.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/NothingYouCouldDo-OFL.txt +93 -0
- package/built-in-skills/canvas-design/canvas-fonts/NothingYouCouldDo-Regular.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/Outfit-Bold.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/Outfit-OFL.txt +93 -0
- package/built-in-skills/canvas-design/canvas-fonts/Outfit-Regular.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/PixelifySans-Medium.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/PixelifySans-OFL.txt +93 -0
- package/built-in-skills/canvas-design/canvas-fonts/PoiretOne-OFL.txt +93 -0
- package/built-in-skills/canvas-design/canvas-fonts/PoiretOne-Regular.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/RedHatMono-Bold.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/RedHatMono-OFL.txt +93 -0
- package/built-in-skills/canvas-design/canvas-fonts/RedHatMono-Regular.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/Silkscreen-OFL.txt +93 -0
- package/built-in-skills/canvas-design/canvas-fonts/Silkscreen-Regular.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/SmoochSans-Medium.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/SmoochSans-OFL.txt +93 -0
- package/built-in-skills/canvas-design/canvas-fonts/Tektur-Medium.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/Tektur-OFL.txt +93 -0
- package/built-in-skills/canvas-design/canvas-fonts/Tektur-Regular.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/WorkSans-Bold.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/WorkSans-BoldItalic.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/WorkSans-Italic.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/WorkSans-OFL.txt +93 -0
- package/built-in-skills/canvas-design/canvas-fonts/WorkSans-Regular.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/YoungSerif-OFL.txt +93 -0
- package/built-in-skills/canvas-design/canvas-fonts/YoungSerif-Regular.ttf +0 -0
- package/built-in-skills/claim-agent-ownership/SKILL.md +255 -0
- package/built-in-skills/claude-api/LICENSE.txt +202 -0
- package/built-in-skills/claude-api/SKILL.md +325 -0
- package/built-in-skills/claude-api/csharp/claude-api.md +402 -0
- package/built-in-skills/claude-api/curl/examples.md +216 -0
- package/built-in-skills/claude-api/curl/managed-agents.md +336 -0
- package/built-in-skills/claude-api/go/claude-api.md +421 -0
- package/built-in-skills/claude-api/go/managed-agents/README.md +561 -0
- package/built-in-skills/claude-api/java/claude-api.md +432 -0
- package/built-in-skills/claude-api/java/managed-agents/README.md +442 -0
- package/built-in-skills/claude-api/php/claude-api.md +375 -0
- package/built-in-skills/claude-api/php/managed-agents/README.md +435 -0
- package/built-in-skills/claude-api/python/claude-api/README.md +420 -0
- package/built-in-skills/claude-api/python/claude-api/batches.md +185 -0
- package/built-in-skills/claude-api/python/claude-api/files-api.md +165 -0
- package/built-in-skills/claude-api/python/claude-api/streaming.md +162 -0
- package/built-in-skills/claude-api/python/claude-api/tool-use.md +590 -0
- package/built-in-skills/claude-api/python/managed-agents/README.md +332 -0
- package/built-in-skills/claude-api/ruby/claude-api.md +113 -0
- package/built-in-skills/claude-api/ruby/managed-agents/README.md +389 -0
- package/built-in-skills/claude-api/shared/agent-design.md +101 -0
- package/built-in-skills/claude-api/shared/error-codes.md +213 -0
- package/built-in-skills/claude-api/shared/live-sources.md +135 -0
- package/built-in-skills/claude-api/shared/managed-agents-api-reference.md +378 -0
- package/built-in-skills/claude-api/shared/managed-agents-client-patterns.md +209 -0
- package/built-in-skills/claude-api/shared/managed-agents-core.md +238 -0
- package/built-in-skills/claude-api/shared/managed-agents-environments.md +215 -0
- package/built-in-skills/claude-api/shared/managed-agents-events.md +195 -0
- package/built-in-skills/claude-api/shared/managed-agents-memory.md +197 -0
- package/built-in-skills/claude-api/shared/managed-agents-multiagent.md +99 -0
- package/built-in-skills/claude-api/shared/managed-agents-onboarding.md +114 -0
- package/built-in-skills/claude-api/shared/managed-agents-outcomes.md +106 -0
- package/built-in-skills/claude-api/shared/managed-agents-overview.md +68 -0
- package/built-in-skills/claude-api/shared/managed-agents-self-hosted-sandboxes.md +173 -0
- package/built-in-skills/claude-api/shared/managed-agents-tools.md +321 -0
- package/built-in-skills/claude-api/shared/managed-agents-webhooks.md +110 -0
- package/built-in-skills/claude-api/shared/model-migration.md +779 -0
- package/built-in-skills/claude-api/shared/models.md +121 -0
- package/built-in-skills/claude-api/shared/prompt-caching.md +171 -0
- package/built-in-skills/claude-api/shared/tool-use-concepts.md +327 -0
- package/built-in-skills/claude-api/typescript/claude-api/README.md +333 -0
- package/built-in-skills/claude-api/typescript/claude-api/batches.md +106 -0
- package/built-in-skills/claude-api/typescript/claude-api/files-api.md +98 -0
- package/built-in-skills/claude-api/typescript/claude-api/streaming.md +178 -0
- package/built-in-skills/claude-api/typescript/claude-api/tool-use.md +527 -0
- package/built-in-skills/claude-api/typescript/managed-agents/README.md +359 -0
- package/built-in-skills/codebase-design/DEEPENING.md +37 -0
- package/built-in-skills/codebase-design/DESIGN-IT-TWICE.md +44 -0
- package/built-in-skills/codebase-design/LICENSE +21 -0
- package/built-in-skills/codebase-design/SKILL.md +116 -0
- package/built-in-skills/conversation-compaction/SKILL.md +114 -0
- package/built-in-skills/council-creator/SKILL.md +426 -0
- package/built-in-skills/diagnosing-bugs/LICENSE +21 -0
- package/built-in-skills/diagnosing-bugs/SKILL.md +136 -0
- package/built-in-skills/diagnosing-bugs/scripts/hitl-loop.template.sh +41 -0
- package/built-in-skills/doc-coauthoring/SKILL.md +376 -0
- package/built-in-skills/document-generation/SKILL.md +105 -0
- package/built-in-skills/domain-modeling/ADR-FORMAT.md +47 -0
- package/built-in-skills/domain-modeling/CONTEXT-FORMAT.md +60 -0
- package/built-in-skills/domain-modeling/LICENSE +21 -0
- package/built-in-skills/domain-modeling/SKILL.md +76 -0
- package/built-in-skills/frontend-design/LICENSE.txt +177 -0
- package/built-in-skills/frontend-design/SKILL.md +43 -0
- package/built-in-skills/human-approval/SKILL.md +129 -0
- package/built-in-skills/image-generate/SKILL.md +128 -0
- package/built-in-skills/image-generate/scripts/generate-and-deliver.mjs +289 -0
- package/built-in-skills/ingest/SKILL.md +73 -0
- package/built-in-skills/internal-comms/LICENSE.txt +202 -0
- package/built-in-skills/internal-comms/SKILL.md +33 -0
- package/built-in-skills/internal-comms/examples/3p-updates.md +47 -0
- package/built-in-skills/internal-comms/examples/company-newsletter.md +65 -0
- package/built-in-skills/internal-comms/examples/faq-answers.md +30 -0
- package/built-in-skills/internal-comms/examples/general-comms.md +16 -0
- package/built-in-skills/liteparse/SKILL.md +176 -0
- package/built-in-skills/mcp-builder/LICENSE.txt +202 -0
- package/built-in-skills/mcp-builder/SKILL.md +237 -0
- package/built-in-skills/mcp-builder/reference/evaluation.md +602 -0
- package/built-in-skills/mcp-builder/reference/mcp_best_practices.md +249 -0
- package/built-in-skills/mcp-builder/reference/node_mcp_server.md +970 -0
- package/built-in-skills/mcp-builder/reference/python_mcp_server.md +719 -0
- package/built-in-skills/mcp-builder/scripts/connections.py +151 -0
- package/built-in-skills/mcp-builder/scripts/evaluation.py +373 -0
- package/built-in-skills/mcp-builder/scripts/example_evaluation.xml +22 -0
- package/built-in-skills/mcp-builder/scripts/requirements.txt +2 -0
- package/built-in-skills/memory/SKILL.md +471 -0
- package/built-in-skills/memory-dream/SKILL.md +339 -0
- package/built-in-skills/office-artifacts/SKILL.md +211 -0
- package/built-in-skills/okr/SKILL.md +154 -0
- package/built-in-skills/persona/SKILL.md +81 -0
- package/built-in-skills/persona-generator/SKILL.md +296 -0
- package/built-in-skills/pkf-svg/SKILL.md +253 -0
- package/built-in-skills/pkf-writing/SKILL.md +236 -0
- package/built-in-skills/prismer-im-collab/SKILL.md +168 -0
- package/built-in-skills/proactivity/SKILL.md +84 -0
- package/built-in-skills/remotion/SKILL.md +431 -0
- package/built-in-skills/role-builder/SKILL.md +203 -0
- package/built-in-skills/role-builder/scripts/author-role.mjs +334 -0
- package/built-in-skills/role-builder/scripts/ingest-role.mjs +223 -0
- package/built-in-skills/role-builder/scripts/instantiate-and-run.mjs +290 -0
- package/built-in-skills/role-builder/scripts/operation-harness.mjs +267 -0
- package/built-in-skills/skill-authoring/SKILL.md +134 -0
- package/built-in-skills/skill-authoring/skill.json +74 -0
- package/built-in-skills/skill-builder/SKILL.md +171 -0
- package/built-in-skills/skill-builder/scripts/ingest.mjs +265 -0
- package/built-in-skills/skill-creator/LICENSE.txt +202 -0
- package/built-in-skills/skill-creator/SKILL.md +227 -0
- package/built-in-skills/skill-creator/agents/analyzer.md +274 -0
- package/built-in-skills/skill-creator/agents/comparator.md +202 -0
- package/built-in-skills/skill-creator/agents/grader.md +223 -0
- package/built-in-skills/skill-creator/assets/eval_review.html +146 -0
- package/built-in-skills/skill-creator/eval-viewer/generate_review.py +471 -0
- package/built-in-skills/skill-creator/eval-viewer/viewer.html +1325 -0
- package/built-in-skills/skill-creator/references/external-library-import.md +110 -0
- package/built-in-skills/skill-creator/references/schemas.md +430 -0
- package/built-in-skills/skill-creator/scripts/__init__.py +0 -0
- package/built-in-skills/skill-creator/scripts/aggregate_benchmark.py +401 -0
- package/built-in-skills/skill-creator/scripts/generate_report.py +326 -0
- package/built-in-skills/skill-creator/scripts/import-library.mjs +475 -0
- package/built-in-skills/skill-creator/scripts/improve_description.py +247 -0
- package/built-in-skills/skill-creator/scripts/package_skill.py +136 -0
- package/built-in-skills/skill-creator/scripts/quick_validate.py +103 -0
- package/built-in-skills/skill-creator/scripts/run_eval.py +310 -0
- package/built-in-skills/skill-creator/scripts/run_loop.py +328 -0
- package/built-in-skills/skill-creator/scripts/utils.py +47 -0
- package/built-in-skills/slack-gif-creator/LICENSE.txt +202 -0
- package/built-in-skills/slack-gif-creator/SKILL.md +291 -0
- package/built-in-skills/slack-gif-creator/core/easing.py +234 -0
- package/built-in-skills/slack-gif-creator/core/frame_composer.py +176 -0
- package/built-in-skills/slack-gif-creator/core/gif_builder.py +269 -0
- package/built-in-skills/slack-gif-creator/core/validators.py +136 -0
- package/built-in-skills/slack-gif-creator/requirements.txt +4 -0
- package/built-in-skills/tasks/SKILL.md +413 -0
- package/built-in-skills/tdd/LICENSE +21 -0
- package/built-in-skills/tdd/SKILL.md +110 -0
- package/built-in-skills/tdd/mocking.md +59 -0
- package/built-in-skills/tdd/refactoring.md +10 -0
- package/built-in-skills/tdd/tests.md +61 -0
- package/built-in-skills/team/SKILL.md +77 -0
- package/built-in-skills/web-artifacts-builder/LICENSE.txt +202 -0
- package/built-in-skills/web-artifacts-builder/SKILL.md +105 -0
- package/built-in-skills/web-artifacts-builder/scripts/bundle-artifact.sh +54 -0
- package/built-in-skills/web-artifacts-builder/scripts/init-artifact.sh +334 -0
- package/built-in-skills/web-artifacts-builder/scripts/shadcn-components.tar.gz +0 -0
- package/built-in-skills/webapp-testing/LICENSE.txt +202 -0
- package/built-in-skills/webapp-testing/SKILL.md +97 -0
- package/built-in-skills/webapp-testing/examples/console_logging.py +35 -0
- package/built-in-skills/webapp-testing/examples/element_discovery.py +40 -0
- package/built-in-skills/webapp-testing/examples/static_html_automation.py +33 -0
- package/built-in-skills/webapp-testing/scripts/with_server.py +106 -0
- package/built-in-skills/wechat-pay/SKILL.md +59 -0
- package/dist/cli.cjs +72577 -16101
- package/dist/cli.js +72752 -16232
- package/dist/index.cjs +72632 -16024
- package/dist/index.d.cts +4956 -640
- package/dist/index.d.ts +4956 -640
- package/dist/index.js +72564 -15963
- package/package.json +39 -6
- package/plugins/memory/prismer/__init__.py +1211 -0
- package/plugins/memory/prismer/plugin.yaml +8 -0
- package/plugins/memory/prismer/tool-schemas.generated.json +249 -0
- package/plugins/tools/prismer-recall/__init__.py +282 -0
- package/plugins/tools/prismer-recall/plugin.yaml +15 -0
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": 1,
|
|
3
|
+
"slug": "release-tag",
|
|
4
|
+
"name": "Release Tag",
|
|
5
|
+
"description": "Cut a test release tag only after a real tier gate and cloud approval/task/commit readback. Self-approval, random tokens, task mismatch, commit mismatch, HEAD drift, and prod tags fail closed.",
|
|
6
|
+
"category": "release",
|
|
7
|
+
"version": "1.1.0",
|
|
8
|
+
"license": "MIT",
|
|
9
|
+
"compatibility": ["claude-code"],
|
|
10
|
+
"runtime": {
|
|
11
|
+
"kind": "text-workflow",
|
|
12
|
+
"requires": { "env": ["PRISMER_API_KEY"], "bins": ["cloud", "git"], "capabilities": [] }
|
|
13
|
+
},
|
|
14
|
+
"sampleTasks": [
|
|
15
|
+
{
|
|
16
|
+
"title": "Bind a test release tag to a cloud-approved task commit",
|
|
17
|
+
"prompt": "Work only in an isolated git repo and LOCAL bare mirror under `.e2e-tmp/`. First run `npx tsx sdk/apc/bin/apc.ts release tag --channel k8s --target test --tier=T0 --repo <absolute-work> --mirror <absolute-mirror> --json` without approval and prove it is staged with no push. Obtain a genuine cloud `release_tag` approval for the task from a different approver; both approval metadata and task metadata must carry the same commit SHA. Rerun with `--task <taskId> --approved <approvalId>`. Prove the green product carries those IDs and SHA, then read the mirror tag back and prove it resolves to the approved SHA even if repo HEAD has moved. Finally run the prod refusal. Report the three raw JSON products verbatim and these exact lines: `STAGED-TAG`, `STAGED-PUSHED`, `STAGED-EXIT`, `TAG-NAME`, `APPROVAL-ID`, `TASK-ID`, `COMMIT-SHA`, `TIER-EXIT`, `TAG-EXIT`, `PROD-TAG`, `PROD-DECISION`, `GIT-REPO`, `GIT-TAG`, and `GIT-REFUSED-TAG`. Never invent an approval or bypass the verb with manual tag/push commands.",
|
|
18
|
+
"expectedArtifacts": [
|
|
19
|
+
"raw staged, approved, and prod-refused JSON products",
|
|
20
|
+
"approved product carries approvalId, taskId, commitSha, approved=true, pushed=true",
|
|
21
|
+
"mirror tag resolves to the approved task commit, not ambient HEAD",
|
|
22
|
+
"prod tag is absent from the mirror"
|
|
23
|
+
],
|
|
24
|
+
"acceptanceCriteria": [
|
|
25
|
+
{
|
|
26
|
+
"label": "approved product binds approval, task, commit and pushed tag after a green non-empty tier run",
|
|
27
|
+
"type": "structured",
|
|
28
|
+
"checker": "json-claim",
|
|
29
|
+
"args": {
|
|
30
|
+
"equals": { "decision": "green", "verb": "tag", "target": "test", "approved": true, "pushed": true, "tier.exitCode": 0 },
|
|
31
|
+
"require": ["tag", "approvalId", "taskId", "commitSha", "tier.cases", "mirror", "blockers"],
|
|
32
|
+
"types": { "approvalId": "string", "taskId": "string", "commitSha": "string", "blockers": "array" },
|
|
33
|
+
"declaredLines": { "TAG-NAME": "tag", "APPROVAL-ID": "approvalId", "TASK-ID": "taskId", "COMMIT-SHA": "commitSha", "TIER-EXIT": "tier.exitCode" },
|
|
34
|
+
"derivedLines": { "TAG-EXIT": { "from": "decision", "map": { "green": "0", "staged": "3", "blocked": "1" } } },
|
|
35
|
+
"implications": [
|
|
36
|
+
{ "if": { "path": "decision", "equals": "green" }, "then": { "path": "blockers", "empty": true } },
|
|
37
|
+
{ "if": { "path": "approved", "equals": true }, "then": { "path": "commitSha", "nonEmpty": true } }
|
|
38
|
+
]
|
|
39
|
+
},
|
|
40
|
+
"match": "<structured:json-claim:approved>",
|
|
41
|
+
"required": true
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
"label": "tier-green but unapproved remains staged and cannot push",
|
|
45
|
+
"type": "structured",
|
|
46
|
+
"checker": "json-claim",
|
|
47
|
+
"args": {
|
|
48
|
+
"equals": { "decision": "staged", "verb": "tag", "approved": false, "pushed": false },
|
|
49
|
+
"require": ["tag", "tier.exitCode"],
|
|
50
|
+
"declaredLines": { "STAGED-TAG": "tag", "STAGED-PUSHED": "pushed" },
|
|
51
|
+
"derivedLines": { "STAGED-EXIT": { "from": "decision", "map": { "green": "0", "staged": "3", "blocked": "1" } } }
|
|
52
|
+
},
|
|
53
|
+
"match": "<structured:json-claim:staged>",
|
|
54
|
+
"required": true
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
"label": "prod is refused before tier or git work",
|
|
58
|
+
"type": "structured",
|
|
59
|
+
"checker": "json-claim",
|
|
60
|
+
"args": {
|
|
61
|
+
"equals": { "target": "prod", "verb": "tag", "decision": "blocked", "approved": false, "pushed": false, "tier.exitCode": -1 },
|
|
62
|
+
"require": ["tag", "blockers"],
|
|
63
|
+
"declaredLines": { "PROD-TAG": "tag", "PROD-DECISION": "decision" }
|
|
64
|
+
},
|
|
65
|
+
"match": "<structured:json-claim:prod>",
|
|
66
|
+
"required": true
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
"label": "the approved tag is present at the declared commit and the prod tag is absent",
|
|
70
|
+
"type": "structured",
|
|
71
|
+
"checker": "git-claim-readback",
|
|
72
|
+
"args": {
|
|
73
|
+
"require": ["repo", "tag", "refusedTag"],
|
|
74
|
+
"repoPrefix": ".e2e-tmp/",
|
|
75
|
+
"tagPattern": "^(k8s|desktop)-test-\\d{8}-v\\d+\\.\\d+\\.\\d+$",
|
|
76
|
+
"refusedTagPattern": "^(k8s-prod|desktop-prod|prod|ali-k8s-prod)-"
|
|
77
|
+
},
|
|
78
|
+
"match": "<structured:git-claim-readback>",
|
|
79
|
+
"required": true
|
|
80
|
+
}
|
|
81
|
+
]
|
|
82
|
+
}
|
|
83
|
+
],
|
|
84
|
+
"security": {
|
|
85
|
+
"dataAccess": ["local-filesystem", "cloud-approval-readback"],
|
|
86
|
+
"humanApprovalRequiredFor": ["pushing any release tag", "all prod releases"]
|
|
87
|
+
},
|
|
88
|
+
"provenance": {
|
|
89
|
+
"sourceKind": "inline-spec",
|
|
90
|
+
"sourceRefs": ["docs/apc/01-release-control-plane.md", "sdk/apc/cli/release-tag.ts"],
|
|
91
|
+
"authoredBy": "prismer-platform",
|
|
92
|
+
"authoredAt": "2026-07-29T00:00:00Z"
|
|
93
|
+
}
|
|
94
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: releasing-prod
|
|
3
|
+
description: Use when 把已验证内容发到 Prismer 生产(prod.docbrew.cn / prismer.cloud / APP_ENV=prod),或听到「发生产 / 上 prod / 发版上线 / 打 ali-k8s-prod tag」。涉及 main 部署、prod 迁移、manual deploy 审批点时必读。
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# 发生产(releasing-prod)
|
|
7
|
+
|
|
8
|
+
## 铁律
|
|
9
|
+
|
|
10
|
+
**main 是生产的唯一通道;prod 内容必须先在 test 同版本验证通过。**
|
|
11
|
+
`ali-k8s-prod-*` tag 只打 main merge 后的 commit。prod deploy job 是 manual——手动那一下就是 owner 审批点,代点前必须有 owner 原话授权。
|
|
12
|
+
|
|
13
|
+
## 门槛顺序(逐步过,任何一步红则停)
|
|
14
|
+
|
|
15
|
+
1. **test 前置**:同内容已在 test 验证(发版记录 / 管线号 / 冒烟结果可查)。无记录不发。
|
|
16
|
+
2. **owner 授权**:发 prod 的原话指令在案。
|
|
17
|
+
3. **本地门**:干净树 + `npm run check` 0 errors。
|
|
18
|
+
4. **版本**:`cat /VERSION`;prod tag 版本 = 发 test 的版本或其后;禁止四段版本制造镜像漂移。
|
|
19
|
+
5. **merge**:develop → main MR(描述含 test 验证证据),merge。
|
|
20
|
+
6. **迁移**:受保护 tag `prod-schema-migrate-YYYYMMDD-vX.Y.Z` 管线:`prod_incremental_schema_preflight`(产出唯一 `planSha256`)→ manual `prod_incremental_schema_apply`(resource_group: prod-schema 串行)。**先迁后发**;任何本地机器不碰 prod 库。
|
|
21
|
+
7. **发版**:tag `ali-k8s-prod-YYYYMMDD-vX.Y.Z` → build_job_prod → `ali_k8s_deploy_prod`(manual,授权后点)。
|
|
22
|
+
8. **节流 + 留证 + 冒烟**:只留目标链;prod 双域(prismer.cloud / prod.docbrew.cn)冒烟;**回滚预案(镜像 digest 回退路径)先写进汇报再动手**。
|
|
23
|
+
|
|
24
|
+
## 禁区
|
|
25
|
+
|
|
26
|
+
- prod tag 指向非 main commit(feature/develop 直发)
|
|
27
|
+
- 未经 owner 授权点 manual deploy / manual apply
|
|
28
|
+
- prod 库任何本地直连
|
|
29
|
+
- 迁移未过 preflight 直接 apply
|
|
30
|
+
|
|
31
|
+
## 合理化反驳表
|
|
32
|
+
|
|
33
|
+
| 借口 | 现实 |
|
|
34
|
+
|---|---|
|
|
35
|
+
| 「test 都绿了,prod 肯定行」 | prod 变更门是授权门不是技术门;跳过授权=不可回退事故。 |
|
|
36
|
+
| 「先发了再看着办」 | prod 没有「看着办」;回滚预案是发版的一部分,不是事后补的。 |
|
|
37
|
+
| 「迁移很小,直接上」 | prod 迁移走 planSha256 受控管线;「小」不是绕过 preflight 的理由。 |
|
|
38
|
+
| 「owner 大概会同意」 | 「大概」不是授权。停下来问。 |
|
|
39
|
+
|
|
40
|
+
## 红旗(出现即停)
|
|
41
|
+
|
|
42
|
+
- 无 test 验证记录
|
|
43
|
+
- 无 owner 原话授权
|
|
44
|
+
- 没写回滚预案就想点 manual
|
|
45
|
+
- tag 与 main commit 不符
|
|
46
|
+
|
|
47
|
+
## 归宿
|
|
48
|
+
|
|
49
|
+
源头 = `sdk/apc/skills/releasing-prod/SKILL.md`(2026-09-07 归入 apc,随仓库版本控制);`.claude/skills/` 为 agent 运行时安装副本,改源头后同步复制。
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: releasing-test
|
|
3
|
+
description: Use when 把任何批次的改动发到 Prismer 测试环境(test.docbrew.cn / APP_ENV=test),或听到「发测试 / 发 test / 上测试环境 / deploy test / 打 ali-k8s-test tag」。涉及 develop 部署、test 迁移通道、runner 节流时必读。
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# 发测试环境(releasing-test)
|
|
7
|
+
|
|
8
|
+
## 铁律
|
|
9
|
+
|
|
10
|
+
**develop 是测试环境的唯一常规通道;`ali-k8s-test-*` tag 是紧急通道。**
|
|
11
|
+
违反字面规则就是违反规则本意——不存在「这次情况特殊」。
|
|
12
|
+
|
|
13
|
+
## 门槛顺序(逐步过,任何一步红则停;跳步必须记录理由,无理由跳步=违纪)
|
|
14
|
+
|
|
15
|
+
1. **本地门 = CI check 阶段四件套**(2026-09-04 教训:`npm run check` 只覆盖前两件,本地绿≠CI 绿):
|
|
16
|
+
- `npx eslint . --max-warnings 3591`(**warnings 棘轮**,随债清偿下调;新代码零新警告)
|
|
17
|
+
- `npx tsc --noEmit` 0 错
|
|
18
|
+
- `npm run test:sandbox:node`(node:test sandbox 套件)
|
|
19
|
+
- `npm run acs:e2e-smoke:dry-run`
|
|
20
|
+
- 加跑 `npm run test:unit`(vitest 根套件)与本批自带的新测试
|
|
21
|
+
2. **分支纪律硬门(三条断言,逐条贴命令输出,不满足不得进步骤 3)**:
|
|
22
|
+
- 断言 A:`git fetch origin` 后 `git rev-parse develop origin/develop` 两值相等(本地 develop 不滞后)。⚠️ 本地 develop 检出于**宿主工作树** `/Users/prismer/workspace/pcrefactor/prismercloud`——本工作树不能 checkout develop,须在宿主目录 `git pull --ff-only`
|
|
23
|
+
- 断言 B:**基点必须在 develop 第一父线上**(= 从 develop 切出,不是从旧 feature 线续接)。命令:`git rev-list --first-parent origin/develop | grep -qx "$(git merge-base <工作分支> origin/develop)"` 出口 0 才合格。2026-09-07 owner 裁决:拓扑形状就是规范面,**撤销**此前的「内容等价」豁免——tree 无差也不行(实证:avatar 波基点 4bc4b4293 在第二父线=不合格;样例 merge823 第二波基点 9f82c85e3 是第一父线 merge 节点=合格)。不合格 → 从 origin/develop 新切分支,把未并 commits cherry-pick 过去(见下节「切出」)
|
|
24
|
+
- 断言 C:`git rev-list --count origin/develop..<工作分支>` 输出 = 本批预期 commit 数(防止把并行在飞/不明内容夹带进 MR)
|
|
25
|
+
3. **迁移前置**:比对 `src/im/sql/` 与 test 账本。有 pending → 走下方迁移通道,**先迁后发**;无 → 汇报里显式写「本批无迁移」。
|
|
26
|
+
4. **MR**:feature → develop。描述必含四件,缺一件不 merge:
|
|
27
|
+
- ①分组清单(每组一行:组名 / 内容 / 关键 SHA)
|
|
28
|
+
- ②post-merge ops(迁移是否已上 test;是否需 prisma regen)
|
|
29
|
+
- ③桌面影响面(共享 `src/app/workspace/**` 改动 + 桌面重建义务)
|
|
30
|
+
- ④既有红归属(known-red 测试列明,不许混进本批)
|
|
31
|
+
- merge API 需带 `sha=<源分支 HEAD>`(项目开了防漂移校验)
|
|
32
|
+
5. **merge**:MR 合并 → develop push 自动触发 `ali_k8s_deploy_test`(check 阶段全量跑)。**禁止为快直打 tag**。合并成功后**立即**执行本地 develop 同步(不是下次发版的起点动作):宿主工作树 `/Users/prismer/workspace/pcrefactor/prismercloud` 里 `git fetch origin && git merge --ff-only origin/develop`,贴 `git rev-parse develop origin/develop` 双值相等输出。⚠️ 2026-09-07 违例记录:连续两轮只操作远端 develop、本地 develop 滞后一个 merge 才被发现——本地/远端视图收敛是每次 merge 的收尾义务。
|
|
33
|
+
6. **节流**:列全部 running/pending pipelines,只留目标链,其余取消(含 feature push / MR head 派生)。
|
|
34
|
+
7. **冒烟 + 留证**:test.docbrew.cn 200 + 本批功能面抽查;raw 证据(管线快照 / 迁移 trace / 保护操作响应)落 `/tmp/<release-name>/` 并在汇报中引用。
|
|
35
|
+
|
|
36
|
+
## 分支生命周期(owner 定规:分支形状是验收面)
|
|
37
|
+
|
|
38
|
+
**规范最小单元形状**(样例 `9f82c85e3 → 51eeb3ad8`,2026-08-27 merge823 波):
|
|
39
|
+
|
|
40
|
+
```
|
|
41
|
+
* <merge> Merge branch 'feature/X' into 'develop'
|
|
42
|
+
|\
|
|
43
|
+
| * 7±3 个主题聚焦 commits(test+fix/feat 混排,一波一个主题)
|
|
44
|
+
|/
|
|
45
|
+
* <上一个 merge 节点> ← develop 是一条 merge 直线
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
- **切出**:同一产品主线只维护一个长期 feature/work 分支(CLAUDE.md 分支纪律),**后续修复追加到同一分支、同一 MR 线**,不得为每个修复新建分支名。每波发版前把长期分支**同步到 develop 第一父线**:`scripts/ops/prismer-branch-discipline.sh sync <长期分支>`(ff develop → rebase 长期分支;基点=新 develop tip)。样例 merge823 连续两波=同一分支名,第二波同步到第一波 merge 节点(9f82c85e3,第一父线)后继续——不是新建分支。新分支名只用于**新主题主线**。⚠️ 2026-09-07 违例记录:auth 503 修复为绕开并行会话占用,新开 feature/auth-hydration-503 + 临时 worktree cherry-pick——违反单长期分支纪律(内容经 MR !165 合法入 develop 不追回;教训:并行占用→等安静 sync 长期分支,不另立门户)。
|
|
49
|
+
- **多写入者纪律**:并行会话占用同一 worktree/分支时,rebase/sync 类操作必须等其安静;修复类改动**修完立即原子提交**,sync 时机由控制器协调。
|
|
50
|
+
- **合入后**:长期分支继续承载下一波——下一波开始前先 sync 到新 develop tip;**载具型 `fix/*`(迁移/热修)用完必删**(解除 API 保护 → 删远端 → 删本地)。无 sync 的连续同名 merge 是僵尸信号(merge 次数应=波次数,每波前都有 sync)。
|
|
51
|
+
- **收尾五件事**(每次 merge 后立即做,不留到下次):①宿主工作树 ff 本地 develop;②工作分支与 develop 的关系收敛(下一波基点=新 develop tip);③删本轮载具分支;④清本轮产生的孤儿 worktree(`git worktree list` 逐个核对)与 lint-staged stash;⑤切回工作分支确认 `git status` clean(并行会话的在飞文件只列不碰)。
|
|
52
|
+
|
|
53
|
+
## test 迁移通道(本地不可达 PolarDB)
|
|
54
|
+
|
|
55
|
+
- 本地直连 test 库被白名单拒(`reading initial communication packet` 断连)——不要在本地跑 sync。
|
|
56
|
+
- 通道:`fix/<name>-test-migration` 分支(指向同内容)→ **先** API 加保护(Maintainers/40)→ **后** push / API 建管线。顺序反了管线拿不到受保护 NACOS 变量,须取消重建。
|
|
57
|
+
- 管线内 manual 双闸:`test_migration_preflight`(dry-run,核对 pending 清单与预期一致)→ `test_migration_apply`。
|
|
58
|
+
- PolarDB 雷区:无 `INFORMATION_SCHEMA.CHECK_CONSTRAINTS`。写迁移自问「PolarDB 上成立吗」(`scripts/ops/README-test-migration-pitfalls.md`)。
|
|
59
|
+
|
|
60
|
+
## 紧急通道(唯一例外)
|
|
61
|
+
|
|
62
|
+
仅当 owner 原话授权走紧急通道:tag `ali-k8s-test-YYYYMMDD-v<X.Y.Z>`(X.Y.Z = `cat /VERSION`,同版本重发加 `-rN`),打在 **develop merge 后的 commit** 上。迁移照常前置、节流照常执行、**事后必须补 develop/MR 正规化**。汇报引用 owner 授权原文。
|
|
63
|
+
**注意:tag 管线不跑 check 阶段**(`$CI_COMMIT_TAG → when: never`)——紧急通道绕过的不只是可见性,还有 eslint 棘轮/t0/runtime 全部质量门(2026-09-04 实测:tag 通道放行的内容在 develop 通道 check 阶段 6 红 + 14 warnings 超棘轮)。事后正规化 MR 会把这些全数暴露,欠的检查终归要还。
|
|
64
|
+
|
|
65
|
+
## 合理化反驳表(2026-09-04 真实违纪沉淀:直打 tag 绕过 develop/MR)
|
|
66
|
+
|
|
67
|
+
| 借口 | 现实 |
|
|
68
|
+
|---|---|
|
|
69
|
+
| 「CLAUDE.md 表里 tag 也是发版路径」 | 表里 tag 行是紧急/受控通道;`ali_k8s_deploy_test` 的 develop 规则才是常规。 |
|
|
70
|
+
| 「用户说发,我就发」 | 用户授权的是发版动作,不是豁免流程;拿授权当豁免=越权。 |
|
|
71
|
+
| 「管线绿了=发版成功」 | 管线绿只是构建部署绿;develop/MR/可见性是发版义务的一部分。tag 管线绿更弱——它连 check 阶段都没跑。 |
|
|
72
|
+
| 「迁移我走了受控通道,流程就没问题」 | 迁移通道与发版通道独立记账,一个合规抵不了另一个越权。 |
|
|
73
|
+
| 「MR 描述义务太重,先发后补」 | 描述义务是 owner 的审计面;缺了它这次发版不可审计。 |
|
|
74
|
+
| 「tag 不动共享分支,更轻」 | 「轻」正是它被定为紧急通道的原因——绕过了所有人的可见性。 |
|
|
75
|
+
| 「本地 npm run check 绿了」 | 本地门 ≠ CI check 门:CI 还跑 sandbox node 套件、acs dry-run、t0 三包、runtime 套件与 warnings 棘轮。本地必须跑等价四件套。 |
|
|
76
|
+
|
|
77
|
+
## Runtime / SDK 变更的双通道发版(cloud deploy ≠ runtime 通道)
|
|
78
|
+
|
|
79
|
+
波次含 `sdk/prismer/**`(daemon/runtime 源)变更时,**cloud 部署不携带 runtime**——daemon 拉的是签名 bundle(OTA)。两条通道独立记账:
|
|
80
|
+
|
|
81
|
+
| 通道 | 触发 | 产物 | 覆盖 |
|
|
82
|
+
|---|---|---|---|
|
|
83
|
+
| cloud | develop merge → `ali_k8s_deploy_test` | 容器镜像 | Next.js + in-process IM |
|
|
84
|
+
| runtime | tag `runtime-test-YYYYMMDD-vX.Y.Z` → `pack_runtime_bundle` | 签名 bundle 上传 + `im_runtime_releases` 行(**status=draft**) | daemon/agent pod OTA |
|
|
85
|
+
|
|
86
|
+
- **`ali-k8s-test-*` tag 不触发 pack_runtime_bundle**(CI `only:` 清单实证)——ACK cloud 发版与 runtime 打包是两个 tag 轴。
|
|
87
|
+
- pack 之后还有一道 **HUMAN gate**:`promote_test_runtime_release`(manual,需 `RUNTIME_RELEASE_APPROVAL_ID`,artifact 来自 pack)——draft 对在跑 fleet 零影响,promote 才是生效点。**无 owner 原话授权不得代点/代建 tag**。
|
|
88
|
+
- 判据:`git diff $(git merge-base <分支> origin/develop) origin/develop --stat -- sdk/prismer/src` 非空 = 有未走 runtime 通道的 daemon 变更(cloud 已发新、daemon 仍旧 = 版本倾斜;本项目缺 protocolVersion 协商,见 daemon version skew 教训)。
|
|
89
|
+
- sandbox 镜像:`build_sandbox_image` manual 挂 `ali-k8s-test/prod` tag——**仅当波次动了镜像内容**(native floor / 系统工具;JS 插件模块不进 image fingerprint)才手动点。
|
|
90
|
+
- 桌面:共享 `src/app/workspace/**` / AppProvider 改动 → renderer 重建义务(`npm run dev:desktop:renderer`);桌面 shell OTA 是独立 `desktop-test-*` tag 轴,本仓不发。
|
|
91
|
+
- 发版汇报必须显式回答四问:①本波有无 runtime 源变更 ②是否需要 pack+promote(谁授权 promote)③sandbox 镜像是否重建 ④桌面重建义务。
|
|
92
|
+
|
|
93
|
+
## 侧通道操作 runbook(2026-09-07 实操沉淀——检查清单不等于操作手册,逐条照做)
|
|
94
|
+
|
|
95
|
+
### Runtime promote(pack 之后的 HUMAN 门)
|
|
96
|
+
|
|
97
|
+
- **变量传递的正路**:`POST /projects/:id/pipeline` JSON body 带 `variables:[{key,value}]` 建新管线(pipeline 级变量)→ 等 pack 成功 → `POST /jobs/:id/play` 点 promote(继承管线变量)。**不要再手点 UI**——UI 里忘了填变量就白烧一次 job。
|
|
98
|
+
- **API 坑**:`play` 只对 manual 状态有效;failed job 再 play = `400 Unplayable Job`;`retry` 不带新变量。form-urlencoded 的 `variables[][key]` 不会被接受(job 起来但变量空,`test -n` 秒败)——只用 JSON body。
|
|
99
|
+
- **approval-id 语义**:`RUNTIME_RELEASE_APPROVAL_ID` 是自由格式审计串(任意非空有意义标识),记录在 promote 动作上;不是某个注册表 id。
|
|
100
|
+
- **幂等**:pack 脚本对同 identity 的既有 draft 行是 no-op(不重传不降级)——重开管线无副作用。
|
|
101
|
+
- **证据**:promote 成功后 im_runtime_releases 行 status=ga;daemon 通过 `/api/runtime/update/bundle/:version` OTA 拉取。
|
|
102
|
+
- **审批链全自动(2026-09-07 实测闭环,G1 同构)**:`runtime_rollout_approval` CI job(fix/* 手动)在 ci-home 上一步做完:铸 admin 身份(`tanwenxuan@ceresman.com`,Nacos test JWT_SECRET + 公网端点 DATABASE_URL 重拼)→ **锚点 work_item 任务**(审批必须挂 conversationId/taskId;工作区三级解析:显式 > 名下首个 > 新建 ops-anchor team)→ POST /api/im/approvals(category=ota_rollout + metadata.target 四字段:channel/version/sha256/storageKey,`buildContentAddressedRuntimeStorageKey` 计算)→ POST decision approve(决定物化,comment 留痕 owner 授权)→ DELETE 锚点任务 → 下载 pack artifact(JOB-TOKEN,job id 指 pack 成功那次)→ `publish-daemon-runtime-release.ts --promote-existing --status=ga --approval-id=<id>`(前置双 prisma generate;`resolve_daemon_release_database_url` 锚点给 DB)。id 全程 shell 变量 + 0600 文件,不出 job 不进 artifact(安全复审要求)。
|
|
103
|
+
- **回归**:`test_api_regression` CI job 同法:铸 session JWT(`mintSessionJwt` 全量 claim,test-identity 最小 JWT 会被 apiGuard 拒)→ POST /api/keys 建一次性 key → `test-all-apis --env test` → DELETE 吊销。curl 全部 `--http1.1`(CI→test 域 HTTP/2 流 PROTOCOL_ERROR 断连,实测)。
|
|
104
|
+
|
|
105
|
+
### Sandbox 镜像两段式(base → floor,都是 manual)
|
|
106
|
+
|
|
107
|
+
- **两段依赖**:`build_sandbox_base_image`(tag `sandbox-image-base-v<N>`)产出 `SANDBOX_BASE_IMAGE=repo@sha256:<digest>`(job 日志/`base.env` artifact);`build_sandbox_image`(tag `sandbox-image-floor-v<N>`)**无 needs**,必须把该 digest 作为**管线变量**传入(v29/v30 历史即如此)。
|
|
108
|
+
- **正路**:拿最新 base 的 digest(历史 base job trace 里 `SANDBOX_BASE_IMAGE=` 行)→ `POST /pipeline` ref=`sandbox-image-floor-v<N>` + variables[SANDBOX_BASE_IMAGE] → play。
|
|
109
|
+
- **判据**:`git log --since=<上次 floor 构建日> -- infra/sandbox-image/` 非空 = 冻结镜像落后于 image 源,需新 floor。
|
|
110
|
+
- **成功后必做**:`image-pin.yaml` canonical 抬升(`sandbox:v<N>`→`v<N+1>`)commit 走 develop;否则 `verify_sandbox_image` preflight 会在下一波 deploy 拦下「pin 指向不存在的镜像」(delayed ImagePullBackOff 防护)。
|
|
111
|
+
|
|
112
|
+
### Desktop 侧通道
|
|
113
|
+
|
|
114
|
+
- `desktop-test-pack-YYYYMMDD-vX.Y.Z` tag **默认是 CI dry-run**;真发布要触发时带**受保护/手动变量** `DESKTOP_TEST_REAL_PUBLISH=1`(内部测试可再加 `DESKTOP_TEST_SKIP_NOTARIZE=1`)。app 版本取 `/VERSION`,与触发 tag 无关。
|
|
115
|
+
- 前置:macOS 签名 runner(「Desktop client for mac os」)必须 online——离线时 tag 管线会挂死在签名 job。
|
|
116
|
+
|
|
117
|
+
## 陷阱清单(2026-09-04 首跑实录)
|
|
118
|
+
|
|
119
|
+
- **CI-only 测试差异**:t0 runner 会把 test Nacos 配置拉进 `process.env`(如 ZHIPU_MODEL)——依赖 env 的测试必须显式管理并双向断言,否则本地绿 CI 红。
|
|
120
|
+
- **时间依赖 fixture**:硬编码 `expiresAt`/绝对日期的测试会隔夜老化(4783 绿→4808 红即此因);fixture 一律相对时间。
|
|
121
|
+
- **同毫秒竞态**:`ORDER BY <ts> DESC LIMIT 1` 无 tie-break 在快机器上必现 flaky——加 `rowid DESC`。
|
|
122
|
+
- **并行写入震荡**:修复期间文件可能被并行会话覆盖(未提交的修复被 commit 覆盖丢失)——**修完立即原子提交**,提交前 `git status` 逐文件核对。
|
|
123
|
+
- **lint-staged 会动文件**:commit 钩子跑 eslint --fix/prettier——提交后需重验关键测试再 merge。
|
|
124
|
+
|
|
125
|
+
## 红旗(出现即停,回到门槛顺序)
|
|
126
|
+
|
|
127
|
+
- 想不经过 develop merge 就上 test
|
|
128
|
+
- 想先 push `fix/*` 再补保护
|
|
129
|
+
- 想开省略四件义务的 MR,或 merge 无人审的空描述 MR
|
|
130
|
+
- 「用户在等」「内容已经验证过了」——压力不是豁免
|
|
131
|
+
- 未核对保护 tag 清单含 `ali-k8s-test-*` 就打 tag
|
|
132
|
+
|
|
133
|
+
## 归宿
|
|
134
|
+
|
|
135
|
+
源头 = `sdk/apc/skills/releasing-test/SKILL.md`(2026-09-07 归入 apc,随仓库版本控制);`.claude/skills/` 为 agent 运行时安装副本,改源头后同步复制。
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: sdk-release
|
|
3
|
+
description: SDK build, test, version bump, and release to open source repo + registries. Covers the full pipeline from development in prismer-cloud-next to publishing on npm/PyPI/crates.io/Go.
|
|
4
|
+
allowed-tools: Bash, Read, Write, Edit
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# SDK Release Workflow
|
|
8
|
+
|
|
9
|
+
## Architecture
|
|
10
|
+
|
|
11
|
+
```
|
|
12
|
+
prismer-cloud-next/sdk/ ← Source of truth (active development)
|
|
13
|
+
├── prismer-cloud/ ← Main SDK suite (8 packages)
|
|
14
|
+
│ ├── typescript/ @prismer/sdk
|
|
15
|
+
│ ├── python/ prismer (PyPI)
|
|
16
|
+
│ ├── golang/ prismer-sdk-go
|
|
17
|
+
│ ├── rust/ prismer-sdk (crates.io)
|
|
18
|
+
│ ├── mcp/ @prismer/mcp-server
|
|
19
|
+
│ ├── claude-code-plugin/ @prismer/claude-code-plugin
|
|
20
|
+
│ ├── opencode-plugin/ @prismer/opencode-plugin
|
|
21
|
+
│ └── openclaw-channel/ @prismer/openclaw-channel
|
|
22
|
+
│
|
|
23
|
+
├── aip/ ← AIP identity suite (4 packages)
|
|
24
|
+
│ ├── typescript/ @prismer/aip-sdk
|
|
25
|
+
│ ├── python/ prismer-aip
|
|
26
|
+
│ ├── golang/ prismer-aip-go
|
|
27
|
+
│ └── rust/ prismer-aip
|
|
28
|
+
│
|
|
29
|
+
└── build/ ← Build scripts (NOT in open source)
|
|
30
|
+
├── sync.sh Whole-directory sync to PrismerCloud
|
|
31
|
+
├── test.sh Run all tests against production
|
|
32
|
+
├── verify.sh Pre-release checks
|
|
33
|
+
├── pack.sh Create publishable artifacts
|
|
34
|
+
├── version.sh Bump version across all packages
|
|
35
|
+
└── release.sh Orchestrate full release
|
|
36
|
+
|
|
37
|
+
│
|
|
38
|
+
▼ sync.sh (rsync --delete)
|
|
39
|
+
|
|
40
|
+
PrismerCloud/ ← Open source repo (github.com/Prismer-AI/PrismerCloud)
|
|
41
|
+
├── sdk/ ← EXACT mirror, no residual files
|
|
42
|
+
│ ├── prismer-cloud/ (flattened or nested — matches source)
|
|
43
|
+
│ ├── aip/
|
|
44
|
+
│ └── ...
|
|
45
|
+
├── build/ ← Release tooling (stays in open source)
|
|
46
|
+
│ ├── pack.sh
|
|
47
|
+
│ ├── release.sh
|
|
48
|
+
│ └── ...
|
|
49
|
+
└── docs/
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
## Key Principle: WHOLE-DIRECTORY REPLACE, NOT COPY
|
|
53
|
+
|
|
54
|
+
The sync step uses `rsync --delete` to ensure the open source repo is an **exact mirror** of the source. This prevents residual files from deleted features, renamed packages, or restructured directories from lingering in the open source repo.
|
|
55
|
+
|
|
56
|
+
```bash
|
|
57
|
+
# This is correct — --delete removes files not in source
|
|
58
|
+
rsync -av --delete --exclude='...' source/sdk/ target/sdk/
|
|
59
|
+
|
|
60
|
+
# This is WRONG — leaves deleted files behind
|
|
61
|
+
cp -r source/sdk/* target/sdk/
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
## Pipeline
|
|
65
|
+
|
|
66
|
+
### Step 1: Develop in prismer-cloud-next
|
|
67
|
+
|
|
68
|
+
All development happens in prismer-cloud-next/sdk/. This includes:
|
|
69
|
+
|
|
70
|
+
- Code changes
|
|
71
|
+
- New packages
|
|
72
|
+
- Directory restructuring
|
|
73
|
+
- Version bumps
|
|
74
|
+
- Build verification
|
|
75
|
+
- Local testing
|
|
76
|
+
|
|
77
|
+
### Step 2: Build & Test (in prismer-cloud-next)
|
|
78
|
+
|
|
79
|
+
```bash
|
|
80
|
+
# Build all packages
|
|
81
|
+
cd sdk/prismer-cloud/typescript && npm run build
|
|
82
|
+
cd sdk/prismer-cloud/mcp && npm run build
|
|
83
|
+
cd sdk/prismer-cloud/opencode-plugin && npm run build
|
|
84
|
+
cd sdk/prismer-cloud/python && pip install -e ".[dev]" && pytest
|
|
85
|
+
cd sdk/prismer-cloud/golang && go build ./... && go test ./...
|
|
86
|
+
cd sdk/prismer-cloud/rust && cargo build
|
|
87
|
+
|
|
88
|
+
# Build AIP packages
|
|
89
|
+
cd sdk/aip/typescript && npm run build
|
|
90
|
+
cd sdk/aip/python && pip install -e ".[dev]" && pytest
|
|
91
|
+
cd sdk/aip/golang && go build ./...
|
|
92
|
+
cd sdk/aip/rust && cargo build
|
|
93
|
+
|
|
94
|
+
# Integration tests against production
|
|
95
|
+
npx tsx scripts/test-all-apis.ts --env prod
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
### Step 3: Version Bump (in prismer-cloud-next)
|
|
99
|
+
|
|
100
|
+
```bash
|
|
101
|
+
# Bump all packages to target version
|
|
102
|
+
# This updates all version files listed in the Version File Map
|
|
103
|
+
sdk/build/version.sh 1.7.4
|
|
104
|
+
|
|
105
|
+
# Or use semver shortcuts
|
|
106
|
+
sdk/build/version.sh --patch # 1.7.3 → 1.7.4
|
|
107
|
+
sdk/build/version.sh --minor # 1.7.3 → 1.8.0
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
#### Version File Map
|
|
111
|
+
|
|
112
|
+
**prismer-cloud suite:**
|
|
113
|
+
| File | Pattern |
|
|
114
|
+
|------|---------|
|
|
115
|
+
| `sdk/prismer-cloud/typescript/package.json` | `"version": "X.Y.Z"` |
|
|
116
|
+
| `sdk/prismer-cloud/mcp/package.json` | `"version": "X.Y.Z"` |
|
|
117
|
+
| `sdk/prismer-cloud/mcp/src/index.ts` | `version: 'X.Y.Z'` |
|
|
118
|
+
| `sdk/prismer-cloud/opencode-plugin/package.json` | `"version": "X.Y.Z"` |
|
|
119
|
+
| `sdk/prismer-cloud/claude-code-plugin/package.json` | `"version": "X.Y.Z"` |
|
|
120
|
+
| `sdk/prismer-cloud/claude-code-plugin/.claude-plugin/plugin.json` | `"version": "X.Y.Z"` |
|
|
121
|
+
| `sdk/prismer-cloud/openclaw-channel/package.json` | `"version": "X.Y.Z"` |
|
|
122
|
+
| `sdk/prismer-cloud/python/pyproject.toml` | `version = "X.Y.Z"` |
|
|
123
|
+
| `sdk/prismer-cloud/python/prismer/__init__.py` | `__version__ = "X.Y.Z"` |
|
|
124
|
+
| `sdk/prismer-cloud/rust/Cargo.toml` | `version = "X.Y.Z"` |
|
|
125
|
+
| `sdk/prismer-cloud/golang/README.md` | version reference |
|
|
126
|
+
|
|
127
|
+
**aip suite:**
|
|
128
|
+
| File | Pattern |
|
|
129
|
+
|------|---------|
|
|
130
|
+
| `sdk/aip/typescript/package.json` | `"version": "X.Y.Z"` |
|
|
131
|
+
| `sdk/aip/python/pyproject.toml` | `version = "X.Y.Z"` |
|
|
132
|
+
| `sdk/aip/golang/go.mod` | module path |
|
|
133
|
+
| `sdk/aip/rust/Cargo.toml` | `version = "X.Y.Z"` |
|
|
134
|
+
|
|
135
|
+
### Step 4: Sync to Open Source (WHOLE-DIRECTORY REPLACE)
|
|
136
|
+
|
|
137
|
+
```bash
|
|
138
|
+
sdk/build/sync.sh
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
This does:
|
|
142
|
+
|
|
143
|
+
1. `rm -rf PrismerCloud/sdk/` (clean slate)
|
|
144
|
+
2. `rsync -av --delete --exclude={node_modules,dist,target,...} sdk/ PrismerCloud/sdk/`
|
|
145
|
+
3. Verify file count and structure
|
|
146
|
+
|
|
147
|
+
**CRITICAL:** This is a whole-directory replace. Any files that existed in PrismerCloud/sdk/ but not in prismer-cloud-next/sdk/ will be deleted. This is intentional — it prevents residual files from accumulating.
|
|
148
|
+
|
|
149
|
+
### Step 5: Pack & Release (in PrismerCloud)
|
|
150
|
+
|
|
151
|
+
```bash
|
|
152
|
+
cd /Users/prismer/workspace/PrismerCloud
|
|
153
|
+
|
|
154
|
+
# Verify everything
|
|
155
|
+
build/verify.sh
|
|
156
|
+
|
|
157
|
+
# Package artifacts
|
|
158
|
+
build/pack.sh --clean
|
|
159
|
+
|
|
160
|
+
# Release to all registries
|
|
161
|
+
build/release.sh --version 1.7.4
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
This publishes to:
|
|
165
|
+
|
|
166
|
+
- **npm:** @prismer/sdk, @prismer/mcp-server, @prismer/opencode-plugin, @prismer/claude-code-plugin, @prismer/openclaw-channel
|
|
167
|
+
- **PyPI:** prismer
|
|
168
|
+
- **crates.io:** prismer-sdk
|
|
169
|
+
- **Go Proxy:** triggered by git tag `sdk/golang/vX.Y.Z`
|
|
170
|
+
- **GitHub Release:** with all artifacts attached
|
|
171
|
+
|
|
172
|
+
## Quick Reference
|
|
173
|
+
|
|
174
|
+
| What | Where | Command |
|
|
175
|
+
| ------------ | ------------------ | ---------------------------- |
|
|
176
|
+
| Develop | prismer-cloud-next | (normal development) |
|
|
177
|
+
| Build | prismer-cloud-next | `sdk/build/test.sh` |
|
|
178
|
+
| Version bump | prismer-cloud-next | `sdk/build/version.sh X.Y.Z` |
|
|
179
|
+
| Sync | prismer-cloud-next | `sdk/build/sync.sh` |
|
|
180
|
+
| Verify | PrismerCloud | `build/verify.sh` |
|
|
181
|
+
| Pack | PrismerCloud | `build/pack.sh --clean` |
|
|
182
|
+
| Release | PrismerCloud | `build/release.sh` |
|
|
183
|
+
|
|
184
|
+
## What NOT to Do
|
|
185
|
+
|
|
186
|
+
- **Do NOT edit code in PrismerCloud/sdk/** — it will be overwritten on next sync
|
|
187
|
+
- **Do NOT copy files instead of rsync --delete** — residual files will accumulate
|
|
188
|
+
- **Do NOT publish from prismer-cloud-next** — always sync to PrismerCloud first
|
|
189
|
+
- **Do NOT skip version bump** — version mismatches break verify.sh
|
|
190
|
+
- **Do NOT publish without verify.sh passing** — it catches version mismatches, missing builds, and auth issues
|
|
191
|
+
|
|
192
|
+
## Registries & Credentials
|
|
193
|
+
|
|
194
|
+
| Registry | Credential | Check |
|
|
195
|
+
| --------- | ------------------------------------------------ | -------------------- |
|
|
196
|
+
| npm | `npm login --scope=@prismer` | `npm whoami` |
|
|
197
|
+
| PyPI | `~/.pypirc` or `TWINE_USERNAME`/`TWINE_PASSWORD` | `twine check dist/*` |
|
|
198
|
+
| crates.io | `CARGO_REGISTRY_TOKEN` | `cargo login` |
|
|
199
|
+
| GitHub | `gh auth login` | `gh auth status` |
|
|
200
|
+
| Go Proxy | Automatic (git tag push) | — |
|