@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,136 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
Validators - Check if GIFs meet Slack's requirements.
|
|
4
|
+
|
|
5
|
+
These validators help ensure your GIFs meet Slack's size and dimension constraints.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from pathlib import Path
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def validate_gif(
|
|
12
|
+
gif_path: str | Path, is_emoji: bool = True, verbose: bool = True
|
|
13
|
+
) -> tuple[bool, dict]:
|
|
14
|
+
"""
|
|
15
|
+
Validate GIF for Slack (dimensions, size, frame count).
|
|
16
|
+
|
|
17
|
+
Args:
|
|
18
|
+
gif_path: Path to GIF file
|
|
19
|
+
is_emoji: True for emoji (128x128 recommended), False for message GIF
|
|
20
|
+
verbose: Print validation details
|
|
21
|
+
|
|
22
|
+
Returns:
|
|
23
|
+
Tuple of (passes: bool, results: dict with all details)
|
|
24
|
+
"""
|
|
25
|
+
from PIL import Image
|
|
26
|
+
|
|
27
|
+
gif_path = Path(gif_path)
|
|
28
|
+
|
|
29
|
+
if not gif_path.exists():
|
|
30
|
+
return False, {"error": f"File not found: {gif_path}"}
|
|
31
|
+
|
|
32
|
+
# Get file size
|
|
33
|
+
size_bytes = gif_path.stat().st_size
|
|
34
|
+
size_kb = size_bytes / 1024
|
|
35
|
+
size_mb = size_kb / 1024
|
|
36
|
+
|
|
37
|
+
# Get dimensions and frame info
|
|
38
|
+
try:
|
|
39
|
+
with Image.open(gif_path) as img:
|
|
40
|
+
width, height = img.size
|
|
41
|
+
|
|
42
|
+
# Count frames
|
|
43
|
+
frame_count = 0
|
|
44
|
+
try:
|
|
45
|
+
while True:
|
|
46
|
+
img.seek(frame_count)
|
|
47
|
+
frame_count += 1
|
|
48
|
+
except EOFError:
|
|
49
|
+
pass
|
|
50
|
+
|
|
51
|
+
# Get duration
|
|
52
|
+
try:
|
|
53
|
+
duration_ms = img.info.get("duration", 100)
|
|
54
|
+
total_duration = (duration_ms * frame_count) / 1000
|
|
55
|
+
fps = frame_count / total_duration if total_duration > 0 else 0
|
|
56
|
+
except:
|
|
57
|
+
total_duration = None
|
|
58
|
+
fps = None
|
|
59
|
+
|
|
60
|
+
except Exception as e:
|
|
61
|
+
return False, {"error": f"Failed to read GIF: {e}"}
|
|
62
|
+
|
|
63
|
+
# Validate dimensions
|
|
64
|
+
if is_emoji:
|
|
65
|
+
optimal = width == height == 128
|
|
66
|
+
acceptable = width == height and 64 <= width <= 128
|
|
67
|
+
dim_pass = acceptable
|
|
68
|
+
else:
|
|
69
|
+
aspect_ratio = (
|
|
70
|
+
max(width, height) / min(width, height)
|
|
71
|
+
if min(width, height) > 0
|
|
72
|
+
else float("inf")
|
|
73
|
+
)
|
|
74
|
+
dim_pass = aspect_ratio <= 2.0 and 320 <= min(width, height) <= 640
|
|
75
|
+
|
|
76
|
+
results = {
|
|
77
|
+
"file": str(gif_path),
|
|
78
|
+
"passes": dim_pass,
|
|
79
|
+
"width": width,
|
|
80
|
+
"height": height,
|
|
81
|
+
"size_kb": size_kb,
|
|
82
|
+
"size_mb": size_mb,
|
|
83
|
+
"frame_count": frame_count,
|
|
84
|
+
"duration_seconds": total_duration,
|
|
85
|
+
"fps": fps,
|
|
86
|
+
"is_emoji": is_emoji,
|
|
87
|
+
"optimal": optimal if is_emoji else None,
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
# Print if verbose
|
|
91
|
+
if verbose:
|
|
92
|
+
print(f"\nValidating {gif_path.name}:")
|
|
93
|
+
print(
|
|
94
|
+
f" Dimensions: {width}x{height}"
|
|
95
|
+
+ (
|
|
96
|
+
f" ({'optimal' if optimal else 'acceptable'})"
|
|
97
|
+
if is_emoji and acceptable
|
|
98
|
+
else ""
|
|
99
|
+
)
|
|
100
|
+
)
|
|
101
|
+
print(
|
|
102
|
+
f" Size: {size_kb:.1f} KB"
|
|
103
|
+
+ (f" ({size_mb:.2f} MB)" if size_mb >= 1.0 else "")
|
|
104
|
+
)
|
|
105
|
+
print(
|
|
106
|
+
f" Frames: {frame_count}"
|
|
107
|
+
+ (f" @ {fps:.1f} fps ({total_duration:.1f}s)" if fps else "")
|
|
108
|
+
)
|
|
109
|
+
|
|
110
|
+
if not dim_pass:
|
|
111
|
+
print(
|
|
112
|
+
f" Note: {'Emoji should be 128x128' if is_emoji else 'Unusual dimensions for Slack'}"
|
|
113
|
+
)
|
|
114
|
+
|
|
115
|
+
if size_mb > 5.0:
|
|
116
|
+
print(f" Note: Large file size - consider fewer frames/colors")
|
|
117
|
+
|
|
118
|
+
return dim_pass, results
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
def is_slack_ready(
|
|
122
|
+
gif_path: str | Path, is_emoji: bool = True, verbose: bool = True
|
|
123
|
+
) -> bool:
|
|
124
|
+
"""
|
|
125
|
+
Quick check if GIF is ready for Slack.
|
|
126
|
+
|
|
127
|
+
Args:
|
|
128
|
+
gif_path: Path to GIF file
|
|
129
|
+
is_emoji: True for emoji GIF, False for message GIF
|
|
130
|
+
verbose: Print feedback
|
|
131
|
+
|
|
132
|
+
Returns:
|
|
133
|
+
True if dimensions are acceptable
|
|
134
|
+
"""
|
|
135
|
+
passes, _ = validate_gif(gif_path, is_emoji, verbose)
|
|
136
|
+
return passes
|
|
@@ -0,0 +1,413 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: tasks
|
|
3
|
+
scope: common
|
|
4
|
+
description: Manage Prismer workspace tasks across the full Kanban lifecycle — create, list, inspect, update, complete, approve, reject, cancel. Use whenever the user asks to add a card to the board, dispatch work to another agent, track progress, or move a task between states. Executes via the `cloud task` CLI.
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Tasks
|
|
8
|
+
|
|
9
|
+
Use this skill to drive the **workspace Kanban** end-to-end. Tasks are durable board items with owner, priority, schedule, and conversation linkage. Every operation goes through the `cloud task` CLI — never reply that a task was created/moved/completed unless the command actually returned a task ID and status.
|
|
10
|
+
|
|
11
|
+
## ⛔ Hard rules — delegation discipline
|
|
12
|
+
|
|
13
|
+
When the user asks you to **assign / delegate / hand off** work to ANOTHER agent (e.g. "create kanban tasks and assign to @research-agent", "give this to Bob"):
|
|
14
|
+
|
|
15
|
+
1. **Call `cloud task create --assignee-name <agent>` (or `--assignee-id`).** That is the ONLY legitimate delegation path. A delegation is a **tracked board card that ALSO auto-dispatches**: the card shows on the Kanban (留痕/可观测) *and* the cloud routes it to the target agent's daemon the moment the assignee is set — the target picks it up via its own dispatch loop, no manual "drag to Running" needed. (A `--no-card` pure run exists for internal orchestrator sub-steps that should NOT surface a card.)
|
|
16
|
+
2. **STOP** as soon as `cloud task create` returns task IDs. Reply to the user with the IDs / titles. **Do not** invoke any other tool to "also do the research yourself" or "make sure it gets done".
|
|
17
|
+
3. **NEVER use a generic `Task` / subagent / fan-out / parallel-agent tool to silently do the work in-process.** That bypasses the kanban board, the assignee never sees the card, the user's mental model ("an agent is working on this") is violated, and the delegation is fake. If you find yourself reaching for any tool whose name is "Task", "Subagent", "Worker", "Fanout", "ParallelAgents", or anything else that spawns an inline executor — **stop and re-read this section**.
|
|
18
|
+
4. The phrase **"I've also started working on these"** after a `cloud task create` is a red flag that you violated rule 3. The correct phrase is **"Tasks created and assigned. @research-agent will pick up the cards."**
|
|
19
|
+
|
|
20
|
+
This is non-negotiable. Bypassing it makes the agent ecosystem look broken even when the cards are correct, because the user sees the answer come back too fast and notices that the supposed assignee was never @-mentioned in the conversation.
|
|
21
|
+
|
|
22
|
+
## ↩️ 结果回流 — 委派后怎么拿到结果(HARD)
|
|
23
|
+
|
|
24
|
+
委派出去之后,**结果不会自动回流**到你的对话或 run —— 没有回调、没有自动推送。被派的 agent 在它**自己的独立 context** 里执行(不进你当前这条会话、也不会在这里发言),产物落在 **task 卡 + 看板**上。所以:
|
|
25
|
+
|
|
26
|
+
- **要看结果,你必须主动拉**:`cloud task get <taskId>` 读 `status` / `result` / 附件。`status=completed` 才算交付;`review` 等你 approve/reject。
|
|
27
|
+
- **编排节奏**:`cloud task create --assignee-name <peer>` → 拿到 taskId → 反复 `cloud task get <taskId>` 直到 `status` 进终态 → 读产物 → 决定下一步。(有 `cloud task wait <id>` 时优先用它,省手搓轮询。)
|
|
28
|
+
- **「看不到对方回复 ≠ 它没在干」**。被派 agent 沉默是正常的——它在独立 context 里跑,结果只在卡上。**绝不要**因为对话里没动静就自己把活重做一遍(那就是影子执行,违反上面的 Hard rules)。
|
|
29
|
+
- 派完先停、把 taskId 报给用户;之后用 `cloud task get` 跟进,而不是把委派和自办混在一条回复里。
|
|
30
|
+
|
|
31
|
+
## When to use
|
|
32
|
+
|
|
33
|
+
- The user asks to **create**, **assign**, **schedule**, or **track** work ("add to kanban", "give Bob this task", "remind me to ship X by Friday").
|
|
34
|
+
- You need to **delegate** a concrete deliverable to another agent. **(See ⛔ rules above.)**
|
|
35
|
+
- A long-running objective should persist as a workspace **goal** (`kind=goal`).
|
|
36
|
+
- The user asks about board state ("what's pending", "show me Bob's tasks", "what's blocking the release").
|
|
37
|
+
- A task already on the board needs to be **updated** (priority change, retitle, attach context), **completed**, **approved/rejected** in review, or **cancelled**.
|
|
38
|
+
- The task output is a document / deck / spreadsheet / PDF / report. In that
|
|
39
|
+
case use the `office-artifacts` skill before completion; a prose-only result
|
|
40
|
+
is not enough for file-deliverable tasks.
|
|
41
|
+
|
|
42
|
+
## Lifecycle
|
|
43
|
+
|
|
44
|
+
```
|
|
45
|
+
pending → assigned → running → review → completed | failed | cancelled
|
|
46
|
+
↑ ↓
|
|
47
|
+
└──── blocked ────────┤ (unblock returns to assigned)
|
|
48
|
+
↓
|
|
49
|
+
awaiting_approval
|
|
50
|
+
↓
|
|
51
|
+
approved / rejected (back to review)
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
Nine-state lifecycle: `pending / assigned / running / review / blocked / awaiting_approval / completed / failed / cancelled`. `awaiting_approval` cards stay visible on the review column — never treat them as gone. `blocked` has its own column.
|
|
55
|
+
|
|
56
|
+
A `work_item` shows on the Kanban; a `goal` shows on the Goals lane. Filter at list time with `--kind work_item,goal` if you only want board projection. A **delegation** (`cloud task create --assignee-name …`) is a `work_item` board card that also auto-dispatches (`dispatchPolicy=on-assign`) — it is BOTH visible on the board AND executing. A `work_item` you create for a human (or to drive yourself via the UI) stays `manual`: it only runs on an explicit drag-to-Running. **Only globally-visible formal tasks are board cards** — a chat `@mention` is a session-internal run, NOT a board card, and never produces one.
|
|
57
|
+
|
|
58
|
+
## Permission model (v2.0 — `release 200` state machine)
|
|
59
|
+
|
|
60
|
+
The platform enforces a **trust-tier × transition matrix** (see `docs/release200/15-task-state-machine-and-kanban.md` §5.2). Each transition's `allowed` actors are part of the contract; calling outside the matrix returns `403 forbidden` with `{ actorTier, requiredTiers }`, and impossible transitions return `409 invalid-transition` with `{ allowedFromHere }`.
|
|
61
|
+
|
|
62
|
+
| Action | Permitted by |
|
|
63
|
+
|---|---|
|
|
64
|
+
| `create`, retitle, change priority, **reassign**, `cancel`, `approve`, `reject` | **creator** / orchestrator / admin |
|
|
65
|
+
| `claim`, update `--progress` / `--status-message`, `complete` (assignee submits to review), `fail` | **assignee** |
|
|
66
|
+
| **`review → completed` (approve)** | **creator** / orchestrator / admin — **never the assignee** (no self-approval) |
|
|
67
|
+
|
|
68
|
+
If you create a task and intend to drive it yourself (no other agent involved), **self-assign first**: `cloud task update <taskId> --assignee-id <your-imUserId>`. Otherwise `complete` and `update --progress` will both 403.
|
|
69
|
+
|
|
70
|
+
**v2.0 endpoint canonicalisation**: every kanban operation (`/complete`, `/approve`, `/reject`, `/cancel`, drag-to-column, restore-from-cancelled, blocked self-report) is forwarded internally to `POST /api/im/tasks/:id/transition`. The CLI verbs below are stable; the legacy `POST /tasks/:id/{complete,approve,reject,cancel,fail}` endpoints carry a `Deprecation` header but stay functional until **2026-09-01**. After that date, scripts hitting the API directly must migrate to `/transition`; CLI users are insulated.
|
|
71
|
+
|
|
72
|
+
## CLI Reference
|
|
73
|
+
|
|
74
|
+
### Create
|
|
75
|
+
|
|
76
|
+
```bash
|
|
77
|
+
# Standard board card
|
|
78
|
+
cloud task create \
|
|
79
|
+
--title "Review PR #42" \
|
|
80
|
+
--description "Security check for the auth refactor; ship blocker." \
|
|
81
|
+
--capability code-review \
|
|
82
|
+
--priority high \
|
|
83
|
+
--assignee-id <imUserId> # or --assignee-name "@alice"
|
|
84
|
+
--conversation-id <convId> # pin to the session you're in
|
|
85
|
+
|
|
86
|
+
# Long-running objective (goal lane, not Kanban)
|
|
87
|
+
cloud task create --kind goal --title "Reduce p95 latency to <300ms" --priority high
|
|
88
|
+
|
|
89
|
+
# Scheduled / recurring
|
|
90
|
+
cloud task create --title "Daily 9am report" --schedule-cron "0 9 * * *"
|
|
91
|
+
cloud task create --title "Run in 2h" --schedule-at "2026-05-19T16:00:00Z"
|
|
92
|
+
|
|
93
|
+
# Marketplace task with credit escrow
|
|
94
|
+
cloud task create --title "Scan deps" --reward 10
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
### Read
|
|
98
|
+
|
|
99
|
+
```bash
|
|
100
|
+
cloud task list # YOUR cards (created by or assigned to you)
|
|
101
|
+
cloud task list --mine # only tasks assigned to YOU (excludes ones you created)
|
|
102
|
+
cloud task list --status pending # your cards, filtered by status
|
|
103
|
+
cloud task list --kind work_item,goal # your cards, board projection only
|
|
104
|
+
cloud task list --conversation-id <convId> # your cards pinned to a conversation
|
|
105
|
+
cloud task get <taskId> # full detail + logs + runs (a card you have access to)
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
> ⚠️ **`cloud task list` is scoped to YOU.** As a regular (executor) agent you
|
|
109
|
+
> only ever see cards **you created or that are assigned to you** — the server
|
|
110
|
+
> enforces this on EVERY filter (you cannot widen it with `--kind` / `--status`
|
|
111
|
+
> / `--view`). You **cannot enumerate** other roles' cards. This is deliberate:
|
|
112
|
+
> if you can't see someone else's task, you can't accidentally poach it.
|
|
113
|
+
>
|
|
114
|
+
> - `--assignee-id <other>` / `--creator-id <other>` for someone who isn't you → **403**.
|
|
115
|
+
> - The **workspace orchestrator** and **humans** see the whole board (they coordinate / drive the UI). If you are NOT the orchestrator and need to know what another role is doing, **@ them or @ the orchestrator** — don't try to list their cards.
|
|
116
|
+
|
|
117
|
+
### 🚦 Act only on YOUR cards (HARD)
|
|
118
|
+
|
|
119
|
+
You only see your own cards, and even within them, seeing a card does NOT always mean it's yours to *transition*.
|
|
120
|
+
|
|
121
|
+
- **Only `claim` / `start` / `update --progress` / `complete` a task whose `assignee` is YOU.** Check the card's `assignee` against your own identity (`agent_im_user_id` / `agent_username` in `<execution_context>`) before acting.
|
|
122
|
+
- A card you can see but whose assignee is **another role / agent** (e.g. it appears because you *created* it for someone else) is **read-only** for you — do NOT claim it, do NOT start working it. The permission layer 403s the transition, and the real failure is social: you've told the room you're doing someone else's work.
|
|
123
|
+
- If you think a card should move (wrong assignee, stalled, mis-prioritised), **@ the orchestrator / task owner** and say why — don't poach it. Reassignment is the creator/orchestrator's call.
|
|
124
|
+
- The **orchestrator** role legitimately reads the full board to coordinate. Reading ≠ owning.
|
|
125
|
+
|
|
126
|
+
### Update + transition
|
|
127
|
+
|
|
128
|
+
```bash
|
|
129
|
+
cloud task update <taskId> --title "Updated title" --priority urgent
|
|
130
|
+
cloud task update <taskId> --progress 0.5 --status-message "halfway done"
|
|
131
|
+
cloud task claim <taskId> # take an unassigned task
|
|
132
|
+
cloud task complete <taskId> --result "LGTM, merged into main"
|
|
133
|
+
cloud task fail <taskId> --error "Build broke on CI"
|
|
134
|
+
cloud task approve <taskId> # accept a review-state result
|
|
135
|
+
cloud task reject <taskId> --reason "missing test coverage on edge case"
|
|
136
|
+
cloud task cancel <taskId> # withdraw before terminal state
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
## Operating Rules
|
|
140
|
+
|
|
141
|
+
### Create
|
|
142
|
+
|
|
143
|
+
- **Never create an unscoped task.** A workspace is required — use `PRISMER_WORKSPACE_ID` from the runtime when present, else fail loudly and ask.
|
|
144
|
+
- **Never create a `work_item` without a concrete assignee.** Pass `--assignee-id` or `--assignee-name` that resolves to a single visible agent. Vague routing (no assignee → "someone will pick it up") leaks tasks into limbo.
|
|
145
|
+
- Avoid vague titles like "help with this". The title must name an **observable deliverable**.
|
|
146
|
+
- Put acceptance criteria + constraints + handoff context in `--description`, not in chat. The description is the source of truth the assignee reads.
|
|
147
|
+
- Don't use task creation to **hide uncertainty**. If ownership or scope is unclear, ask the user first.
|
|
148
|
+
|
|
149
|
+
### Approve / Reject / Complete
|
|
150
|
+
|
|
151
|
+
- Read the task and its result **before** approving (`cloud task get`). The only exception is when the user just supplied explicit approval in this turn.
|
|
152
|
+
- Don't approve your own incomplete work to bypass review.
|
|
153
|
+
- Don't approve when the user asked for changes or raised unresolved concerns — use `task reject --reason` with a concrete actionable reason.
|
|
154
|
+
- Don't `task complete` if acceptance criteria are unmet. If human review is the gate, leave it in `review` and request approval instead.
|
|
155
|
+
- Never reject without a reason. Keep reasons factual and actionable (point to the missing artifact or failing criterion).
|
|
156
|
+
- `task cancel` is for **withdrawal of intent** (the work is no longer wanted). `task reject` is for **review failure** (the result is wrong). `task fail` is for **execution failure** (it tried and broke). Don't mix them.
|
|
157
|
+
- For file deliverables, do not complete until the generated file has been
|
|
158
|
+
placed in `$PRISMER_ARTIFACTS_DIR` or uploaded via `cloud asset upload --task-id`.
|
|
159
|
+
The Kanban card's artifact chip depends on the task-linked asset upload.
|
|
160
|
+
|
|
161
|
+
### Update
|
|
162
|
+
|
|
163
|
+
- Don't send an empty update.
|
|
164
|
+
- Don't force `--status completed` here — use `task complete` so the lifecycle hook fires (result summary, escrow release, board move).
|
|
165
|
+
- `--progress` is a float 0.0–1.0 with real meaning. Don't fake precision; agents reading the board treat `0.73` as a measured ratio.
|
|
166
|
+
|
|
167
|
+
### Read
|
|
168
|
+
|
|
169
|
+
- Don't infer task completion from `task list` summaries alone — `get` the task to confirm status.
|
|
170
|
+
- When no tasks match, report that directly. Never fabricate board state.
|
|
171
|
+
- Respect visibility — the service already scopes by workspace + ACL; don't try to query around it.
|
|
172
|
+
|
|
173
|
+
## SPEC discipline (you as task owner)
|
|
174
|
+
|
|
175
|
+
A task without a SPEC is a task that will drift. Before assigning a non-trivial task
|
|
176
|
+
(>15 min of agent work or any cross-agent handoff), write a SPEC.md.
|
|
177
|
+
|
|
178
|
+
### Write SPEC.md when
|
|
179
|
+
|
|
180
|
+
- task is delegated to another agent (cross-agent handoff)
|
|
181
|
+
- task involves >15 min of work
|
|
182
|
+
- task touches a deliverable the user will see / use
|
|
183
|
+
- you yourself want a contract to refer back to later
|
|
184
|
+
|
|
185
|
+
### SPEC.md structure (4 sections — all optional but Goal is highly recommended)
|
|
186
|
+
|
|
187
|
+
## Goal
|
|
188
|
+
one-sentence terminal state (what does "done" look like?)
|
|
189
|
+
|
|
190
|
+
## Background
|
|
191
|
+
why this task exists; constraints from prior work
|
|
192
|
+
|
|
193
|
+
## Constraints
|
|
194
|
+
bullet list — what must not break; what must be preserved
|
|
195
|
+
|
|
196
|
+
## Out of scope
|
|
197
|
+
bullet list — what this task explicitly does NOT cover
|
|
198
|
+
|
|
199
|
+
### Write via
|
|
200
|
+
|
|
201
|
+
cloud task spec-set <taskId> --file SPEC.md
|
|
202
|
+
cloud task spec-set <taskId> --markdown "..."
|
|
203
|
+
cloud task spec-show <taskId>
|
|
204
|
+
|
|
205
|
+
### Anti-patterns
|
|
206
|
+
|
|
207
|
+
- Don't write SPEC after assignment — owner authoring before handoff IS the contract
|
|
208
|
+
- Don't change SPEC silently after status=running — owner must surface change; assignee must re-confirm
|
|
209
|
+
|
|
210
|
+
## TODO discipline (you as task assignee)
|
|
211
|
+
|
|
212
|
+
When you receive an assigned task, before executing, decompose the SPEC into a TODO list.
|
|
213
|
+
The TODO list is your visible plan — the orchestrator (creator agent / human) watches
|
|
214
|
+
it for drift and intervenes if your plan stops matching the spec.
|
|
215
|
+
|
|
216
|
+
### Write TODO.md when
|
|
217
|
+
|
|
218
|
+
- you are the assignee on any task with capability not in ('trivial', 'one-shot')
|
|
219
|
+
- you are about to start work (TODO before code)
|
|
220
|
+
- you discover new sub-steps mid-execution — append rather than silently expand
|
|
221
|
+
|
|
222
|
+
### TODO.md structure
|
|
223
|
+
|
|
224
|
+
# TODO — <one-line restatement of objective>
|
|
225
|
+
|
|
226
|
+
- [ ] step 1 (small, observable)
|
|
227
|
+
- [ ] step 2
|
|
228
|
+
- [ ] sub-step 2a (depth ≤ 3)
|
|
229
|
+
- [ ] sub-step 2b
|
|
230
|
+
- [ ] step 3
|
|
231
|
+
|
|
232
|
+
3–15 items is a healthy range. <3 means you didn't decompose. >15 means task should split.
|
|
233
|
+
|
|
234
|
+
### Tick discipline
|
|
235
|
+
|
|
236
|
+
- Tick `- [ ] → - [x]` IMMEDIATELY when a step finishes (tick first, then move on)
|
|
237
|
+
- Do NOT tick speculatively — only after the step is verifiably done
|
|
238
|
+
- Each tick emits SSE → orchestrator sees progress; this is your observability layer
|
|
239
|
+
- If you skip a step (no longer needed) — remove it with a one-line note, don't leave unticked
|
|
240
|
+
|
|
241
|
+
### Write via
|
|
242
|
+
|
|
243
|
+
cloud task todo-add <taskId> "step text"
|
|
244
|
+
cloud task todo-done <taskId> <idx>
|
|
245
|
+
cloud task todo-uncheck <taskId> <idx>
|
|
246
|
+
cloud task todo-show <taskId>
|
|
247
|
+
|
|
248
|
+
### Anti-patterns
|
|
249
|
+
|
|
250
|
+
- Don't execute without a TODO.md (runaway risk)
|
|
251
|
+
- Don't tick the whole list at once at the end (orchestrator loses observability window)
|
|
252
|
+
- Don't silently expand TODO with steps that diverge from SPEC — surface to creator first
|
|
253
|
+
|
|
254
|
+
## Self-check & verification
|
|
255
|
+
|
|
256
|
+
A task is NOT done until acceptance criteria pass. There are 4 verify modes; you
|
|
257
|
+
interact with them differently.
|
|
258
|
+
|
|
259
|
+
### 4 verify modes (cloud does NOT pre-bake methods)
|
|
260
|
+
|
|
261
|
+
- `qualitative` — verifier agent picks a method at runtime (Playwright / LLM-judge / human eye).
|
|
262
|
+
- `quantitative` — verifier agent runs a real measurement against a threshold.
|
|
263
|
+
- `agent-self-check` — assignee self-evaluates before status=review.
|
|
264
|
+
- `manual` — human reviewer ticks the box in ApprovalCard.
|
|
265
|
+
|
|
266
|
+
Cloud does NOT ship a Playwright runner / endpoint-status checker / benchmark
|
|
267
|
+
harness. You (the agent) own the implementation. Use any tool in your skills.
|
|
268
|
+
|
|
269
|
+
### Before setting status=review (as assignee)
|
|
270
|
+
|
|
271
|
+
You MUST run `cloud task verify <taskId>`. This:
|
|
272
|
+
|
|
273
|
+
1. Lists all criteria with verifyMode='agent-self-check'
|
|
274
|
+
2. For each, you read the expectation and self-assess (be honest — if you can't
|
|
275
|
+
verify, mark failed and turn the task to status=blocked instead of review)
|
|
276
|
+
3. CLI exits 0 only if all self-check criteria pass; non-zero blocks review
|
|
277
|
+
|
|
278
|
+
You MUST also confirm:
|
|
279
|
+
|
|
280
|
+
- TODO.md progressPct ≥ 80% (cloud enforces; <80% triggers confirm modal)
|
|
281
|
+
- All evidence assets attached (`cloud task attach artifacts/foo.png` then add to
|
|
282
|
+
criterion.evidenceRefs via `cloud task verify-criterion ... --evidence asset:<id>`)
|
|
283
|
+
|
|
284
|
+
### As a verifier agent (when you receive task.verify.requested)
|
|
285
|
+
|
|
286
|
+
You will receive a task dispatch message:
|
|
287
|
+
|
|
288
|
+
type: task.verify.requested
|
|
289
|
+
taskId: ...
|
|
290
|
+
criterionId: ...
|
|
291
|
+
expectation: "<markdown>"
|
|
292
|
+
spec: "<SPEC.md content>"
|
|
293
|
+
evidenceRefs: [...]
|
|
294
|
+
|
|
295
|
+
Your job is to:
|
|
296
|
+
|
|
297
|
+
1. Read SPEC + criterion.expectation + existing evidence
|
|
298
|
+
2. **Decide at runtime** what method to use:
|
|
299
|
+
- qualitative → Playwright screenshot, LLM-judge, human eyeball (escalate if you can't judge)
|
|
300
|
+
- quantitative → run a benchmark, GET a metric endpoint, run pytest — pick the right tool
|
|
301
|
+
3. Execute the method; collect evidence (screenshots, metric values, logs)
|
|
302
|
+
4. Attach evidence as task-bound assets: `cloud task attach <file>`
|
|
303
|
+
5. Report outcome:
|
|
304
|
+
|
|
305
|
+
cloud task verify-criterion <tid> <cid> \
|
|
306
|
+
--outcome passed|failed \
|
|
307
|
+
--note "Method: Playwright spec checkout.spec.ts; ran 5 iterations; saw 28.9s p95. Steps: ..." \
|
|
308
|
+
--evidence asset:<id>
|
|
309
|
+
|
|
310
|
+
The `note` MUST include enough detail that a reader can re-run your method:
|
|
311
|
+
|
|
312
|
+
- what tool / command you used
|
|
313
|
+
- key parameters
|
|
314
|
+
- the actual measurement / observation
|
|
315
|
+
- (optional) why you chose this method
|
|
316
|
+
|
|
317
|
+
### Anti-patterns
|
|
318
|
+
|
|
319
|
+
- DO NOT mark `outcome=passed` without actually running a verification (false positive)
|
|
320
|
+
- DO NOT skip evidence attachment (note alone is not auditable)
|
|
321
|
+
- DO NOT use one fixed method blindly — pick the right tool for the criterion
|
|
322
|
+
- DO NOT escalate to manual without first trying — verifier-agent is the default
|
|
323
|
+
- DO NOT pretend cloud has built-in playwright/benchmark runners — you run them locally
|
|
324
|
+
|
|
325
|
+
### CLI quick reference
|
|
326
|
+
|
|
327
|
+
```bash
|
|
328
|
+
# SPEC (owner)
|
|
329
|
+
cloud task spec-set <taskId> --file SPEC.md
|
|
330
|
+
cloud task spec-show <taskId>
|
|
331
|
+
|
|
332
|
+
# TODO (assignee)
|
|
333
|
+
cloud task todo-show <taskId>
|
|
334
|
+
cloud task todo-add <taskId> "step text"
|
|
335
|
+
cloud task todo-done <taskId> <idx>
|
|
336
|
+
cloud task todo-uncheck <taskId> <idx>
|
|
337
|
+
|
|
338
|
+
# Acceptance criteria
|
|
339
|
+
cloud task acceptance <taskId> # show all criteria + status
|
|
340
|
+
cloud task add-criterion <taskId> \
|
|
341
|
+
--mode qualitative --expectation "..." \
|
|
342
|
+
--verifier-agent agent_xxx # default = creator
|
|
343
|
+
cloud task verify <taskId> # assignee self-check
|
|
344
|
+
cloud task verify-criterion <taskId> <cid> \
|
|
345
|
+
--outcome passed --note "..." --evidence asset:<id> # verifier agent report
|
|
346
|
+
cloud task apply-template <taskId> --template <id> # adopt a template
|
|
347
|
+
```
|
|
348
|
+
|
|
349
|
+
## 产物输出(user-deliverable)
|
|
350
|
+
|
|
351
|
+
**文件交付是显式的**(release202/09 P2 起)。把文件写进 `artifacts/` **不会**自动交付——`artifacts-watcher` auto-scan 默认 **OFF**(`2f3e901b` retire watcher auto-scan)。仅当 carrier 决策是文件时,才使用 `cloud deliver` / `cloud task attach` 显式交付该文件。
|
|
352
|
+
|
|
353
|
+
```bash
|
|
354
|
+
# 1) 把最终产物写到 artifacts/(draft / 中间文件走 scratch,不会被交付)
|
|
355
|
+
echo "..." > "${PRISMER_ARTIFACTS_DIR}/my-report.md"
|
|
356
|
+
|
|
357
|
+
# 2) 显式交付(按目标二选一)——传【绝对路径】:
|
|
358
|
+
cloud deliver "${PRISMER_ARTIFACTS_DIR}/my-report.md" # 动作 A:挂到你「当前这条回复」上
|
|
359
|
+
cloud task attach "${PRISMER_ARTIFACTS_DIR}/my-report.md" # 动作 ③:挂到「看板任务卡」(mode:task-attach)
|
|
360
|
+
```
|
|
361
|
+
|
|
362
|
+
> ⚠️ **写进 `artifacts/` ≠ 交付**。没有 auto-scan。每个文件都要显式 `cloud deliver`(聊天回复产物)或 `cloud task attach`(任务卡产物),否则用户收不到。`artifacts/` 放最终交付物,draft / 中间文件走 `scratch/`。
|
|
363
|
+
|
|
364
|
+
> **常态(含 hermes):直接 `cloud deliver <abs-path>` 即可**——hermes 虽没有 per-dispatch env id(`PRISMER_RUN_ID` / `PRISMER_CONVERSATION_ID` unset),但 daemon(release203/15c)会按你的 agent 身份自动关联你**当前**的 dispatch,补全 run/conversation。spawn 适配器(claude-code / codex)env 已注入,同样无需 flag。
|
|
365
|
+
> **仅以下情形才手传 flag**:(a) 你要对**另一个**(非当前)dispatch 交付;(b) daemon 返回 **409 歧义**(同 agent 多个并发 dispatch 无法区分)。这时才从 `<execution_context>` 抄 `<run_id>` / `<conversation_id>`:
|
|
366
|
+
> ```bash
|
|
367
|
+
> cloud deliver "<abs-path>" --run-id "<run_id>" --conversation-id "<conversation_id>"
|
|
368
|
+
> ```
|
|
369
|
+
> 详见 `office-artifacts` SKILL(唯一交付契约)。
|
|
370
|
+
|
|
371
|
+
**Workflow**:
|
|
372
|
+
|
|
373
|
+
1. 中间脚本 / draft 写到 `${PRISMER_SCRATCH_DIR}/`(scratch,不进 Asset、不交付)
|
|
374
|
+
2. 最终产物写到 `${PRISMER_ARTIFACTS_DIR}/`(agent process env; physically `${TASK_WORKDIR}/artifacts/`)
|
|
375
|
+
3. **显式交付每个产物**:聊天回复用 `cloud deliver <abs-path>`(动作 A),任务卡用 `cloud task attach <abs-path>`(动作 ③)。命令成功会打印 `assetId`
|
|
376
|
+
|
|
377
|
+
### Carrier 选择与显式交付
|
|
378
|
+
|
|
379
|
+
carrier 优先级是:**用户明确要求 > Runtime carrier directive > 已选内容 skill > task 默认**。`tasks` skill 只管任务与回执,不擅自把内容改成 Markdown 文件、Asset 或 Memory Page。
|
|
380
|
+
|
|
381
|
+
1. **inline PKF**:按 Runtime carrier directive 返回单一 inline PKF ContentBlock / sentinel。不写文件,不调 `cloud deliver` / `cloud task attach`,不并行产出 `.md` / `.html` / `.css` / `.js`。
|
|
382
|
+
2. **用户明确要求文件**:按用户指定格式或内容 skill 决定的格式写入 `${PRISMER_ARTIFACTS_DIR}/`,再显式调 `cloud deliver` / `cloud task attach`。不要另造 Markdown 投影。
|
|
383
|
+
3. **Asset / Memory**:只有用户要求或 Runtime carrier directive 明确选中时才 materialize;必须以服务端返回的 id / path / version / hash 以及读回结果作为权威证据。
|
|
384
|
+
4. **任务 evidence**:截图、benchmark JSON、日志等原始证据可作为明确文件附件显式 `cloud task attach`;它们不会改变主交付物的 carrier。
|
|
385
|
+
|
|
386
|
+
**禁止**:
|
|
387
|
+
|
|
388
|
+
- inline 选中后并行生成 Markdown/HTML/CSS/JS 或附件;
|
|
389
|
+
- 把 draft / 中间产物放进 `artifacts/`(draft 走 `scratch/`);
|
|
390
|
+
- 把“写进 `artifacts/`”当成已交付——auto-scan 是 OFF,文件 carrier 必须有显式 receipt;
|
|
391
|
+
- 用 role 模板或 task 流程覆盖 Runtime carrier directive。
|
|
392
|
+
|
|
393
|
+
**Self-check checkpoint**:
|
|
394
|
+
|
|
395
|
+
`cloud task update --status review` 内嵌调用本地 daemon `/v1/checkpoints/pre_status_change`。该 hook 比较 `artifacts/` 内文件 sha256 与已 attach Asset.contentHash,若 diff 非空:
|
|
396
|
+
|
|
397
|
+
- exit code = 12
|
|
398
|
+
- stderr 列出未 attach 的文件路径 + hash + size
|
|
399
|
+
- agent context 看到 stderr 自行 decide → 补 attach 或加 `--skip-checkpoint`
|
|
400
|
+
|
|
401
|
+
**这不是 mandate retry 机制** —— 是给 agent 自己看的 self-check,不污染 user session 也不发 IMMessage。
|
|
402
|
+
|
|
403
|
+
## Output reporting
|
|
404
|
+
|
|
405
|
+
After any state-changing operation, **echo back** the task ID and the **status the service returned** (not the status you expected). Example:
|
|
406
|
+
|
|
407
|
+
> Created task `cm5gxyz...` in `assigned` state, pinned to conversation `cm5conv...`, assigned to `@alice`.
|
|
408
|
+
|
|
409
|
+
If the CLI exits non-zero, surface the error code and message verbatim. **Never fabricate a task ID** — if you didn't run the command or it failed, say so.
|
|
410
|
+
|
|
411
|
+
## Backing capabilities (D22 mapping)
|
|
412
|
+
|
|
413
|
+
Replaces these v1.x built-in skills: `task-create`, `task-list`, `task-get`, `task-update`, `task-complete`, `task-approve`, `task-reject`, `task-cancel`.
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Matt Pocock
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|