@prismer/runtime 2.2.55 → 2.2.64
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 +574 -0
- package/apc/skills/releasing-test/SKILL.md +9 -0
- package/built-in-skills/agent-coordination/SKILL.md +21 -4
- package/built-in-skills/agent-meta/SKILL.md +11 -0
- package/built-in-skills/assets/SKILL.md +1 -1
- package/built-in-skills/canvas-design/SKILL.md +3 -3
- package/built-in-skills/canvas-design/canvas-fonts/IBMPlexSerif-OFL.txt +93 -0
- package/built-in-skills/canvas-design/canvas-fonts/InstrumentSerif-OFL.txt +93 -0
- package/built-in-skills/canvas-design/canvas-fonts/LICENSE-SOURCES.md +16 -0
- package/built-in-skills/claim-agent-ownership/SKILL.md +7 -3
- package/built-in-skills/claude-api/SKILL.md +1 -1
- package/built-in-skills/claude-api/python/claude-api/README.md +2 -2
- package/built-in-skills/claude-api/python/claude-api/tool-use.md +9 -5
- package/built-in-skills/claude-api/python/managed-agents/README.md +11 -1
- package/built-in-skills/claude-api/shared/error-codes.md +4 -4
- package/built-in-skills/claude-api/shared/managed-agents-client-patterns.md +4 -2
- package/built-in-skills/claude-api/shared/managed-agents-core.md +1 -2
- package/built-in-skills/claude-api/shared/managed-agents-events.md +41 -22
- package/built-in-skills/claude-api/shared/managed-agents-multiagent.md +5 -3
- package/built-in-skills/claude-api/shared/managed-agents-self-hosted-sandboxes.md +1 -1
- package/built-in-skills/claude-api/shared/managed-agents-tools.md +2 -3
- package/built-in-skills/claude-api/shared/model-migration.md +3 -3
- package/built-in-skills/claude-api/shared/models.md +1 -1
- package/built-in-skills/claude-api/typescript/claude-api/batches.md +1 -1
- package/built-in-skills/claude-api/typescript/claude-api/files-api.md +3 -1
- package/built-in-skills/claude-api/typescript/claude-api/tool-use.md +8 -2
- package/built-in-skills/claude-api/typescript/managed-agents/README.md +8 -2
- package/built-in-skills/codebase-design/SKILL.md +15 -1
- package/built-in-skills/codebase-design/references/requesting-code-review/GUIDE.md +291 -0
- package/built-in-skills/codebase-design/references/requesting-code-review/LICENSE +21 -0
- package/built-in-skills/codebase-design/references/requesting-code-review/LICENSE.superpowers +21 -0
- package/built-in-skills/codebase-design/references/requesting-code-review/NOTICE.md +37 -0
- package/built-in-skills/codebase-design/references/sdlc-review/GUIDE.md +130 -0
- package/built-in-skills/codebase-design/references/sdlc-review/LICENSE +21 -0
- package/built-in-skills/codebase-design/references/sdlc-review/NOTICE.md +17 -0
- package/built-in-skills/codebase-design/references/simplify-code/GUIDE.md +269 -0
- package/built-in-skills/codebase-design/references/simplify-code/LICENSE +21 -0
- package/built-in-skills/codebase-design/references/simplify-code/NOTICE.md +37 -0
- package/built-in-skills/competitor-intelligence/LICENSE +21 -0
- package/built-in-skills/competitor-intelligence/NOTICE.md +6 -0
- package/built-in-skills/competitor-intelligence/SKILL.md +125 -0
- package/built-in-skills/competitor-intelligence/scripts/watch_state.py +160 -0
- package/built-in-skills/conversation-compaction/SKILL.md +3 -0
- package/built-in-skills/council-creator/SKILL.md +4 -3
- package/built-in-skills/diagnosing-bugs/SKILL.md +12 -0
- package/built-in-skills/diagnosing-bugs/references/desktop-dom/GUIDE.md +64 -0
- package/built-in-skills/diagnosing-bugs/references/desktop-dom/LICENSE +21 -0
- package/built-in-skills/diagnosing-bugs/references/desktop-dom/NOTICE.md +17 -0
- package/built-in-skills/diagnosing-bugs/references/systematic-debugging/GUIDE.md +410 -0
- package/built-in-skills/diagnosing-bugs/references/systematic-debugging/LICENSE +21 -0
- package/built-in-skills/diagnosing-bugs/references/systematic-debugging/LICENSE.superpowers +21 -0
- package/built-in-skills/diagnosing-bugs/references/systematic-debugging/NOTICE.md +37 -0
- package/built-in-skills/doc-coauthoring/SKILL.md +6 -0
- package/built-in-skills/doc-coauthoring/references/humanizer/GUIDE.md +647 -0
- package/built-in-skills/doc-coauthoring/references/humanizer/LICENSE +21 -0
- package/built-in-skills/doc-coauthoring/references/humanizer/LICENSE.hermes +21 -0
- package/built-in-skills/doc-coauthoring/references/humanizer/PROVENANCE.md +7 -0
- package/built-in-skills/document-actions/LICENSE +21 -0
- package/built-in-skills/document-actions/NOTICE.md +21 -0
- package/built-in-skills/document-actions/SKILL.md +46 -0
- package/built-in-skills/evidence-citations/LICENSE +21 -0
- package/built-in-skills/evidence-citations/NOTICE.md +21 -0
- package/built-in-skills/evidence-citations/SKILL.md +46 -0
- package/built-in-skills/evidence-citations/references/citation-formats.md +68 -0
- package/built-in-skills/evidence-citations/references/grounding-rationale.md +64 -0
- package/built-in-skills/evidence-citations/scripts/sources.py +720 -0
- package/built-in-skills/frontend-design/SKILL.md +6 -0
- package/built-in-skills/frontend-design/references/claude-design/GUIDE.md +650 -0
- package/built-in-skills/frontend-design/references/claude-design/LICENSE +21 -0
- package/built-in-skills/frontend-design/references/claude-design/LICENSE.hermes +21 -0
- package/built-in-skills/frontend-design/references/claude-design/PROVENANCE.md +7 -0
- package/built-in-skills/image-generate/SKILL.md +5 -0
- package/built-in-skills/image-generate/scripts/generate-and-deliver.mjs +24 -3
- package/built-in-skills/mcp-builder/reference/evaluation.md +11 -2
- package/built-in-skills/mcp-builder/reference/node_mcp_server.md +34 -5
- package/built-in-skills/mcp-builder/reference/python_mcp_server.md +6 -2
- package/built-in-skills/mcp-builder/scripts/connections.py +1 -1
- package/built-in-skills/mcp-builder/scripts/evaluation.py +52 -34
- package/built-in-skills/mcp-builder/scripts/requirements.txt +2 -2
- package/built-in-skills/meeting-actions/LICENSE +21 -0
- package/built-in-skills/meeting-actions/NOTICE.md +21 -0
- package/built-in-skills/meeting-actions/SKILL.md +48 -0
- package/built-in-skills/memory/SKILL.md +27 -3
- package/built-in-skills/memory/references/llm-wiki/GUIDE.md +468 -0
- package/built-in-skills/memory/references/llm-wiki/LICENSE +21 -0
- package/built-in-skills/memory/references/llm-wiki/NOTICE.md +4 -0
- package/built-in-skills/memory/references/llm-wiki/scripts/lint_wiki.py +84 -0
- package/built-in-skills/memory/references/llm-wiki/scripts/requirements.txt +1 -0
- package/built-in-skills/memory/references/llm-wiki/templates/SCHEMA.md +19 -0
- package/built-in-skills/memory/references/llm-wiki/templates/index.md +9 -0
- package/built-in-skills/memory/references/llm-wiki/templates/log.md +4 -0
- package/built-in-skills/memory-dream/SKILL.md +8 -15
- package/built-in-skills/memory-import/SKILL.md +51 -0
- package/built-in-skills/office-artifacts/NOTICE.md +15 -0
- package/built-in-skills/office-artifacts/SKILL.md +20 -0
- package/built-in-skills/office-artifacts/references/RESOURCE-LIMITS.md +44 -0
- package/built-in-skills/office-artifacts/references/docx/GUIDE.md +196 -0
- package/built-in-skills/office-artifacts/references/docx/LICENSE +21 -0
- package/built-in-skills/office-artifacts/references/docx/NOTICE.md +21 -0
- package/built-in-skills/office-artifacts/references/docx/references/revisions-and-comments.md +88 -0
- package/built-in-skills/office-artifacts/references/docx/scripts/docx_comments.py +292 -0
- package/built-in-skills/office-artifacts/references/docx/scripts/docx_common.py +93 -0
- package/built-in-skills/office-artifacts/references/docx/scripts/docx_create.py +177 -0
- package/built-in-skills/office-artifacts/references/docx/scripts/docx_edit.py +250 -0
- package/built-in-skills/office-artifacts/references/docx/scripts/docx_read.py +169 -0
- package/built-in-skills/office-artifacts/references/docx/scripts/docx_revisions.py +149 -0
- package/built-in-skills/office-artifacts/references/docx/scripts/docx_template.py +70 -0
- package/built-in-skills/office-artifacts/references/docx/scripts/docx_validate.py +155 -0
- package/built-in-skills/office-artifacts/references/docx/tests/test_docx_skill.py +525 -0
- package/built-in-skills/office-artifacts/references/pdf/GUIDE.md +125 -0
- package/built-in-skills/office-artifacts/references/pdf/LICENSE +21 -0
- package/built-in-skills/office-artifacts/references/pdf/NOTICE.md +21 -0
- package/built-in-skills/office-artifacts/references/pdf/references/forms.md +99 -0
- package/built-in-skills/office-artifacts/references/pdf/references/nano-pdf-editing.md +40 -0
- package/built-in-skills/office-artifacts/references/pdf/references/ocr-extraction.md +165 -0
- package/built-in-skills/office-artifacts/references/pdf/scripts/_raster.py +87 -0
- package/built-in-skills/office-artifacts/references/pdf/scripts/extract_marker.py +95 -0
- package/built-in-skills/office-artifacts/references/pdf/scripts/extract_pymupdf.py +107 -0
- package/built-in-skills/office-artifacts/references/pdf/scripts/pdf_create.py +153 -0
- package/built-in-skills/office-artifacts/references/pdf/scripts/pdf_fill_form.py +97 -0
- package/built-in-skills/office-artifacts/references/pdf/scripts/pdf_form_layout.py +168 -0
- package/built-in-skills/office-artifacts/references/pdf/scripts/pdf_make_form.py +145 -0
- package/built-in-skills/office-artifacts/references/pdf/scripts/pdf_merge.py +50 -0
- package/built-in-skills/office-artifacts/references/pdf/scripts/pdf_meta.py +123 -0
- package/built-in-skills/office-artifacts/references/pdf/scripts/pdf_page_image.py +101 -0
- package/built-in-skills/office-artifacts/references/pdf/scripts/pdf_read.py +153 -0
- package/built-in-skills/office-artifacts/references/pdf/scripts/pdf_secure.py +71 -0
- package/built-in-skills/office-artifacts/references/pdf/scripts/pdf_split.py +86 -0
- package/built-in-skills/office-artifacts/references/pdf/scripts/pdf_stamp.py +145 -0
- package/built-in-skills/office-artifacts/references/pdf/scripts/pdf_watermark.py +51 -0
- package/built-in-skills/office-artifacts/references/pdf/tests/test_pdf_skill.py +414 -0
- package/built-in-skills/office-artifacts/references/powerpoint/GUIDE.md +220 -0
- package/built-in-skills/office-artifacts/references/powerpoint/LICENSE +21 -0
- package/built-in-skills/office-artifacts/references/powerpoint/NOTICE.md +21 -0
- package/built-in-skills/office-artifacts/references/powerpoint/scripts/pptx_create.py +214 -0
- package/built-in-skills/office-artifacts/references/powerpoint/scripts/pptx_edit.py +442 -0
- package/built-in-skills/office-artifacts/references/powerpoint/scripts/pptx_from_template.py +88 -0
- package/built-in-skills/office-artifacts/references/powerpoint/scripts/pptx_read.py +131 -0
- package/built-in-skills/office-artifacts/references/powerpoint/scripts/pptx_render.py +104 -0
- package/built-in-skills/office-artifacts/references/powerpoint/tests/test_powerpoint_skill.py +478 -0
- package/built-in-skills/office-artifacts/references/xlsx/GUIDE.md +196 -0
- package/built-in-skills/office-artifacts/references/xlsx/LICENSE +21 -0
- package/built-in-skills/office-artifacts/references/xlsx/NOTICE.md +21 -0
- package/built-in-skills/office-artifacts/references/xlsx/references/restructuring.md +74 -0
- package/built-in-skills/office-artifacts/references/xlsx/scripts/csv_to_xlsx.py +108 -0
- package/built-in-skills/office-artifacts/references/xlsx/scripts/xlsx_create.py +259 -0
- package/built-in-skills/office-artifacts/references/xlsx/scripts/xlsx_edit.py +269 -0
- package/built-in-skills/office-artifacts/references/xlsx/scripts/xlsx_read.py +160 -0
- package/built-in-skills/office-artifacts/references/xlsx/scripts/xlsx_recalc.py +111 -0
- package/built-in-skills/office-artifacts/references/xlsx/scripts/xlsx_restructure.py +418 -0
- package/built-in-skills/office-artifacts/references/xlsx/scripts/xlsx_to_csv.py +69 -0
- package/built-in-skills/office-artifacts/references/xlsx/tests/test_xlsx_skill.py +542 -0
- package/built-in-skills/office-artifacts/tests/test_resource_regressions.py +272 -0
- package/built-in-skills/persona-generator/SKILL.md +9 -9
- package/built-in-skills/pkf-svg/SKILL.md +5 -0
- package/built-in-skills/pkf-svg/references/architecture-diagram/GUIDE.md +148 -0
- package/built-in-skills/pkf-svg/references/architecture-diagram/LICENSE +21 -0
- package/built-in-skills/pkf-svg/references/architecture-diagram/LICENSE.hermes +21 -0
- package/built-in-skills/pkf-svg/references/architecture-diagram/PROVENANCE.md +7 -0
- package/built-in-skills/pkf-svg/references/architecture-diagram/templates/template.html +345 -0
- package/built-in-skills/pkf-writing/SKILL.md +36 -14
- package/built-in-skills/prismer-airtable/LICENSE +21 -0
- package/built-in-skills/prismer-airtable/NOTICE.md +11 -0
- package/built-in-skills/prismer-airtable/SKILL.md +248 -0
- package/built-in-skills/prismer-airtable/scripts/airtable_client.py +76 -0
- package/built-in-skills/prismer-apple-notes/LICENSE +21 -0
- package/built-in-skills/prismer-apple-notes/NOTICE.md +17 -0
- package/built-in-skills/prismer-apple-notes/SKILL.md +118 -0
- package/built-in-skills/prismer-apple-notes/scripts/readiness.py +47 -0
- package/built-in-skills/prismer-apple-reminders/LICENSE +21 -0
- package/built-in-skills/prismer-apple-reminders/NOTICE.md +17 -0
- package/built-in-skills/prismer-apple-reminders/SKILL.md +155 -0
- package/built-in-skills/prismer-apple-reminders/scripts/readiness.py +47 -0
- package/built-in-skills/prismer-ascii-video/LICENSE +21 -0
- package/built-in-skills/prismer-ascii-video/LICENSE.hermes +21 -0
- package/built-in-skills/prismer-ascii-video/PROVENANCE.md +7 -0
- package/built-in-skills/prismer-ascii-video/README.md +290 -0
- package/built-in-skills/prismer-ascii-video/SKILL.md +252 -0
- package/built-in-skills/prismer-ascii-video/provenance/category-DESCRIPTION.md +3 -0
- package/built-in-skills/prismer-ascii-video/references/architecture.md +807 -0
- package/built-in-skills/prismer-ascii-video/references/composition.md +900 -0
- package/built-in-skills/prismer-ascii-video/references/effects.md +1877 -0
- package/built-in-skills/prismer-ascii-video/references/inputs.md +693 -0
- package/built-in-skills/prismer-ascii-video/references/optimization.md +688 -0
- package/built-in-skills/prismer-ascii-video/references/scenes.md +1018 -0
- package/built-in-skills/prismer-ascii-video/references/shaders.md +1408 -0
- package/built-in-skills/prismer-ascii-video/references/troubleshooting.md +360 -0
- package/built-in-skills/prismer-baoyu-infographic/LICENSE +21 -0
- package/built-in-skills/prismer-baoyu-infographic/LICENSE.hermes +21 -0
- package/built-in-skills/prismer-baoyu-infographic/LICENSE.origin +21 -0
- package/built-in-skills/prismer-baoyu-infographic/PORT_NOTES.md +37 -0
- package/built-in-skills/prismer-baoyu-infographic/PROVENANCE.md +7 -0
- package/built-in-skills/prismer-baoyu-infographic/SKILL.md +240 -0
- package/built-in-skills/prismer-baoyu-infographic/references/analysis-framework.md +182 -0
- package/built-in-skills/prismer-baoyu-infographic/references/base-prompt.md +43 -0
- package/built-in-skills/prismer-baoyu-infographic/references/layouts/bento-grid.md +41 -0
- package/built-in-skills/prismer-baoyu-infographic/references/layouts/binary-comparison.md +48 -0
- package/built-in-skills/prismer-baoyu-infographic/references/layouts/bridge.md +41 -0
- package/built-in-skills/prismer-baoyu-infographic/references/layouts/circular-flow.md +41 -0
- package/built-in-skills/prismer-baoyu-infographic/references/layouts/comic-strip.md +41 -0
- package/built-in-skills/prismer-baoyu-infographic/references/layouts/comparison-matrix.md +41 -0
- package/built-in-skills/prismer-baoyu-infographic/references/layouts/dashboard.md +41 -0
- package/built-in-skills/prismer-baoyu-infographic/references/layouts/dense-modules.md +72 -0
- package/built-in-skills/prismer-baoyu-infographic/references/layouts/funnel.md +41 -0
- package/built-in-skills/prismer-baoyu-infographic/references/layouts/hierarchical-layers.md +48 -0
- package/built-in-skills/prismer-baoyu-infographic/references/layouts/hub-spoke.md +41 -0
- package/built-in-skills/prismer-baoyu-infographic/references/layouts/iceberg.md +41 -0
- package/built-in-skills/prismer-baoyu-infographic/references/layouts/isometric-map.md +41 -0
- package/built-in-skills/prismer-baoyu-infographic/references/layouts/jigsaw.md +41 -0
- package/built-in-skills/prismer-baoyu-infographic/references/layouts/linear-progression.md +48 -0
- package/built-in-skills/prismer-baoyu-infographic/references/layouts/periodic-table.md +41 -0
- package/built-in-skills/prismer-baoyu-infographic/references/layouts/story-mountain.md +41 -0
- package/built-in-skills/prismer-baoyu-infographic/references/layouts/structural-breakdown.md +48 -0
- package/built-in-skills/prismer-baoyu-infographic/references/layouts/tree-branching.md +41 -0
- package/built-in-skills/prismer-baoyu-infographic/references/layouts/venn-diagram.md +41 -0
- package/built-in-skills/prismer-baoyu-infographic/references/layouts/winding-roadmap.md +41 -0
- package/built-in-skills/prismer-baoyu-infographic/references/structured-content-template.md +244 -0
- package/built-in-skills/prismer-baoyu-infographic/references/styles/aged-academia.md +36 -0
- package/built-in-skills/prismer-baoyu-infographic/references/styles/bold-graphic.md +36 -0
- package/built-in-skills/prismer-baoyu-infographic/references/styles/chalkboard.md +61 -0
- package/built-in-skills/prismer-baoyu-infographic/references/styles/claymation.md +29 -0
- package/built-in-skills/prismer-baoyu-infographic/references/styles/corporate-memphis.md +29 -0
- package/built-in-skills/prismer-baoyu-infographic/references/styles/craft-handmade.md +44 -0
- package/built-in-skills/prismer-baoyu-infographic/references/styles/cyberpunk-neon.md +29 -0
- package/built-in-skills/prismer-baoyu-infographic/references/styles/hand-drawn-edu.md +63 -0
- package/built-in-skills/prismer-baoyu-infographic/references/styles/ikea-manual.md +29 -0
- package/built-in-skills/prismer-baoyu-infographic/references/styles/kawaii.md +29 -0
- package/built-in-skills/prismer-baoyu-infographic/references/styles/knolling.md +29 -0
- package/built-in-skills/prismer-baoyu-infographic/references/styles/lego-brick.md +29 -0
- package/built-in-skills/prismer-baoyu-infographic/references/styles/morandi-journal.md +60 -0
- package/built-in-skills/prismer-baoyu-infographic/references/styles/origami.md +29 -0
- package/built-in-skills/prismer-baoyu-infographic/references/styles/pixel-art.md +29 -0
- package/built-in-skills/prismer-baoyu-infographic/references/styles/pop-laboratory.md +48 -0
- package/built-in-skills/prismer-baoyu-infographic/references/styles/retro-pop-grid.md +47 -0
- package/built-in-skills/prismer-baoyu-infographic/references/styles/storybook-watercolor.md +29 -0
- package/built-in-skills/prismer-baoyu-infographic/references/styles/subway-map.md +29 -0
- package/built-in-skills/prismer-baoyu-infographic/references/styles/technical-schematic.md +36 -0
- package/built-in-skills/prismer-baoyu-infographic/references/styles/ui-wireframe.md +29 -0
- package/built-in-skills/prismer-blocked-page-recovery/LICENSE +21 -0
- package/built-in-skills/prismer-blocked-page-recovery/NOTICE.md +17 -0
- package/built-in-skills/prismer-blocked-page-recovery/SKILL.md +158 -0
- package/built-in-skills/prismer-blocked-page-recovery/scripts/recover_page.py +311 -0
- package/built-in-skills/prismer-box/LICENSE +21 -0
- package/built-in-skills/prismer-box/NOTICE.md +11 -0
- package/built-in-skills/prismer-box/SKILL.md +147 -0
- package/built-in-skills/prismer-box/references/bulk-operations.md +43 -0
- package/built-in-skills/prismer-box/references/cli-guide.md +133 -0
- package/built-in-skills/prismer-box/references/content-workflows.md +86 -0
- package/built-in-skills/prismer-box/references/hubs.md +77 -0
- package/built-in-skills/prismer-box/references/oauth-setup.md +92 -0
- package/built-in-skills/prismer-box/references/rest-api.md +37 -0
- package/built-in-skills/prismer-box/references/sdk-development.md +85 -0
- package/built-in-skills/prismer-box/references/search-and-ai.md +147 -0
- package/built-in-skills/prismer-box/references/troubleshooting.md +33 -0
- package/built-in-skills/prismer-box/references/webhooks-and-events.md +43 -0
- package/built-in-skills/prismer-codebase-inspection/LICENSE +21 -0
- package/built-in-skills/prismer-codebase-inspection/NOTICE.md +17 -0
- package/built-in-skills/prismer-codebase-inspection/SKILL.md +141 -0
- package/built-in-skills/prismer-computer-use/LICENSE +21 -0
- package/built-in-skills/prismer-computer-use/NOTICE.md +17 -0
- package/built-in-skills/prismer-computer-use/SKILL.md +372 -0
- package/built-in-skills/prismer-design-md/LICENSE +21 -0
- package/built-in-skills/prismer-design-md/LICENSE.hermes +21 -0
- package/built-in-skills/prismer-design-md/PROVENANCE.md +7 -0
- package/built-in-skills/prismer-design-md/SKILL.md +227 -0
- package/built-in-skills/prismer-design-md/templates/starter.md +99 -0
- package/built-in-skills/prismer-email-inbox-triage/LICENSE +21 -0
- package/built-in-skills/prismer-email-inbox-triage/NOTICE.md +11 -0
- package/built-in-skills/prismer-email-inbox-triage/SKILL.md +116 -0
- package/built-in-skills/prismer-findmy/LICENSE +21 -0
- package/built-in-skills/prismer-findmy/NOTICE.md +17 -0
- package/built-in-skills/prismer-findmy/SKILL.md +150 -0
- package/built-in-skills/prismer-findmy/scripts/readiness.py +47 -0
- package/built-in-skills/prismer-gif-search/LICENSE +21 -0
- package/built-in-skills/prismer-gif-search/LICENSE.hermes +21 -0
- package/built-in-skills/prismer-gif-search/PROVENANCE.md +7 -0
- package/built-in-skills/prismer-gif-search/SKILL.md +97 -0
- package/built-in-skills/prismer-gif-search/scripts/tenor.py +81 -0
- package/built-in-skills/prismer-github/LICENSE +21 -0
- package/built-in-skills/prismer-github/NOTICE.md +17 -0
- package/built-in-skills/prismer-github/SKILL.md +74 -0
- package/built-in-skills/prismer-github/references/auth.md +91 -0
- package/built-in-skills/prismer-github/references/ci-troubleshooting.md +193 -0
- package/built-in-skills/prismer-github/references/code-review.md +465 -0
- package/built-in-skills/prismer-github/references/conventional-commits.md +81 -0
- package/built-in-skills/prismer-github/references/github-api-cheatsheet.md +177 -0
- package/built-in-skills/prismer-github/references/issue-to-pr.md +74 -0
- package/built-in-skills/prismer-github/references/issues.md +336 -0
- package/built-in-skills/prismer-github/references/pr-workflow.md +346 -0
- package/built-in-skills/prismer-github/references/repo-management.md +484 -0
- package/built-in-skills/prismer-github/references/review-output-template.md +84 -0
- package/built-in-skills/prismer-github/scripts/ensure-gh.py +132 -0
- package/built-in-skills/prismer-github/scripts/gh-env.sh +25 -0
- package/built-in-skills/prismer-github/scripts/git-credential-token.py +68 -0
- package/built-in-skills/prismer-github/scripts/github-api.py +71 -0
- package/built-in-skills/prismer-github/scripts/github-context.py +28 -0
- package/built-in-skills/prismer-github/templates/bug-report.md +35 -0
- package/built-in-skills/prismer-github/templates/feature-request.md +31 -0
- package/built-in-skills/prismer-github/templates/pr-body-bugfix.md +35 -0
- package/built-in-skills/prismer-github/templates/pr-body-feature.md +33 -0
- package/built-in-skills/prismer-google-workspace/LICENSE +21 -0
- package/built-in-skills/prismer-google-workspace/NOTICE.md +11 -0
- package/built-in-skills/prismer-google-workspace/SKILL.md +369 -0
- package/built-in-skills/prismer-google-workspace/references/daily-brief.md +65 -0
- package/built-in-skills/prismer-google-workspace/references/gmail-search-syntax.md +63 -0
- package/built-in-skills/prismer-google-workspace/scripts/_hermes_home.py +17 -0
- package/built-in-skills/prismer-google-workspace/scripts/_private_state.py +39 -0
- package/built-in-skills/prismer-google-workspace/scripts/google_api.py +1339 -0
- package/built-in-skills/prismer-google-workspace/scripts/gws_bridge.py +121 -0
- package/built-in-skills/prismer-google-workspace/scripts/setup.py +563 -0
- package/built-in-skills/prismer-google-workspace/tests/test_productivity_regressions.py +214 -0
- package/built-in-skills/prismer-hermes-agent/LICENSE +21 -0
- package/built-in-skills/prismer-hermes-agent/NOTICE.md +17 -0
- package/built-in-skills/prismer-hermes-agent/SKILL.md +247 -0
- package/built-in-skills/prismer-hermes-agent/references/background-systems.md +108 -0
- package/built-in-skills/prismer-hermes-agent/references/cli-reference.md +158 -0
- package/built-in-skills/prismer-hermes-agent/references/configuration.md +96 -0
- package/built-in-skills/prismer-hermes-agent/references/contributor-guide.md +151 -0
- package/built-in-skills/prismer-hermes-agent/references/delegate-task-concurrency-diagnosis.md +47 -0
- package/built-in-skills/prismer-hermes-agent/references/desktop-plugins.md +215 -0
- package/built-in-skills/prismer-hermes-agent/references/native-mcp.md +351 -0
- package/built-in-skills/prismer-hermes-agent/references/petdex.md +82 -0
- package/built-in-skills/prismer-hermes-agent/references/portal-auth-for-third-party-apps.md +135 -0
- package/built-in-skills/prismer-hermes-agent/references/project-context-files.md +55 -0
- package/built-in-skills/prismer-hermes-agent/references/providers-and-models.md +81 -0
- package/built-in-skills/prismer-hermes-agent/references/security-privacy.md +73 -0
- package/built-in-skills/prismer-hermes-agent/references/slash-commands.md +119 -0
- package/built-in-skills/prismer-hermes-agent/references/themes.md +134 -0
- package/built-in-skills/prismer-hermes-agent/references/troubleshooting.md +87 -0
- package/built-in-skills/prismer-hermes-agent/references/tui-widgets.md +144 -0
- package/built-in-skills/prismer-hermes-agent/references/webhooks.md +219 -0
- package/built-in-skills/prismer-hermes-agent/references/windows-quirks.md +64 -0
- package/built-in-skills/prismer-hermes-agent/templates/clock.mjs +51 -0
- package/built-in-skills/prismer-hermes-agent/templates/plugin.js +97 -0
- package/built-in-skills/prismer-hermes-agent/templates/skin.yaml +49 -0
- package/built-in-skills/prismer-himalaya/LICENSE +21 -0
- package/built-in-skills/prismer-himalaya/NOTICE.md +11 -0
- package/built-in-skills/prismer-himalaya/SKILL.md +340 -0
- package/built-in-skills/prismer-himalaya/references/configuration.md +227 -0
- package/built-in-skills/prismer-himalaya/references/message-composition.md +206 -0
- package/built-in-skills/prismer-himalaya/scripts/compose_draft.py +48 -0
- package/built-in-skills/prismer-im-collab/SKILL.md +1 -1
- package/built-in-skills/prismer-imessage/LICENSE +21 -0
- package/built-in-skills/prismer-imessage/NOTICE.md +17 -0
- package/built-in-skills/prismer-imessage/SKILL.md +128 -0
- package/built-in-skills/prismer-imessage/scripts/readiness.py +47 -0
- package/built-in-skills/prismer-manim-video/LICENSE +21 -0
- package/built-in-skills/prismer-manim-video/LICENSE.hermes +21 -0
- package/built-in-skills/prismer-manim-video/PROVENANCE.md +7 -0
- package/built-in-skills/prismer-manim-video/README.md +23 -0
- package/built-in-skills/prismer-manim-video/SKILL.md +279 -0
- package/built-in-skills/prismer-manim-video/references/animation-design-thinking.md +161 -0
- package/built-in-skills/prismer-manim-video/references/animations.md +282 -0
- package/built-in-skills/prismer-manim-video/references/camera-and-3d.md +135 -0
- package/built-in-skills/prismer-manim-video/references/decorations.md +202 -0
- package/built-in-skills/prismer-manim-video/references/equations.md +216 -0
- package/built-in-skills/prismer-manim-video/references/graphs-and-data.md +163 -0
- package/built-in-skills/prismer-manim-video/references/mobjects.md +333 -0
- package/built-in-skills/prismer-manim-video/references/paper-explainer.md +255 -0
- package/built-in-skills/prismer-manim-video/references/production-quality.md +190 -0
- package/built-in-skills/prismer-manim-video/references/rendering.md +187 -0
- package/built-in-skills/prismer-manim-video/references/scene-planning.md +118 -0
- package/built-in-skills/prismer-manim-video/references/troubleshooting.md +135 -0
- package/built-in-skills/prismer-manim-video/references/updaters-and-trackers.md +260 -0
- package/built-in-skills/prismer-manim-video/references/visual-design.md +124 -0
- package/built-in-skills/prismer-manim-video/scripts/setup.sh +15 -0
- package/built-in-skills/prismer-maps/LICENSE +21 -0
- package/built-in-skills/prismer-maps/NOTICE.md +11 -0
- package/built-in-skills/prismer-maps/SKILL.md +240 -0
- package/built-in-skills/prismer-maps/scripts/maps_client.py +1324 -0
- package/built-in-skills/prismer-node-inspect-debugger/LICENSE +21 -0
- package/built-in-skills/prismer-node-inspect-debugger/NOTICE.md +17 -0
- package/built-in-skills/prismer-node-inspect-debugger/SKILL.md +347 -0
- package/built-in-skills/prismer-notion/LICENSE +21 -0
- package/built-in-skills/prismer-notion/NOTICE.md +11 -0
- package/built-in-skills/prismer-notion/SKILL.md +495 -0
- package/built-in-skills/prismer-notion/references/block-types.md +112 -0
- package/built-in-skills/prismer-obsidian/LICENSE +21 -0
- package/built-in-skills/prismer-obsidian/LICENSE.hermes +21 -0
- package/built-in-skills/prismer-obsidian/PROVENANCE.md +7 -0
- package/built-in-skills/prismer-obsidian/SKILL.md +80 -0
- package/built-in-skills/prismer-obsidian/provenance/category-DESCRIPTION.md +3 -0
- package/built-in-skills/prismer-obsidian/scripts/write_note.py +84 -0
- package/built-in-skills/prismer-p5js/LICENSE +21 -0
- package/built-in-skills/prismer-p5js/LICENSE.hermes +21 -0
- package/built-in-skills/prismer-p5js/PROVENANCE.md +7 -0
- package/built-in-skills/prismer-p5js/README.md +64 -0
- package/built-in-skills/prismer-p5js/SKILL.md +574 -0
- package/built-in-skills/prismer-p5js/references/animation.md +439 -0
- package/built-in-skills/prismer-p5js/references/color-systems.md +355 -0
- package/built-in-skills/prismer-p5js/references/core-api.md +410 -0
- package/built-in-skills/prismer-p5js/references/export-pipeline.md +534 -0
- package/built-in-skills/prismer-p5js/references/interaction.md +398 -0
- package/built-in-skills/prismer-p5js/references/shapes-and-geometry.md +300 -0
- package/built-in-skills/prismer-p5js/references/troubleshooting.md +532 -0
- package/built-in-skills/prismer-p5js/references/typography.md +302 -0
- package/built-in-skills/prismer-p5js/references/visual-effects.md +905 -0
- package/built-in-skills/prismer-p5js/references/webgl-and-3d.md +423 -0
- package/built-in-skills/prismer-p5js/scripts/export-frames.js +91 -0
- package/built-in-skills/prismer-p5js/scripts/render.sh +113 -0
- package/built-in-skills/prismer-p5js/scripts/serve.sh +25 -0
- package/built-in-skills/prismer-p5js/scripts/setup.sh +87 -0
- package/built-in-skills/prismer-p5js/templates/viewer.html +401 -0
- package/built-in-skills/prismer-popular-web-designs/LICENSE +21 -0
- package/built-in-skills/prismer-popular-web-designs/LICENSE.hermes +21 -0
- package/built-in-skills/prismer-popular-web-designs/LICENSE.origin +21 -0
- package/built-in-skills/prismer-popular-web-designs/PROVENANCE.md +7 -0
- package/built-in-skills/prismer-popular-web-designs/SKILL.md +218 -0
- package/built-in-skills/prismer-popular-web-designs/templates/airbnb.md +259 -0
- package/built-in-skills/prismer-popular-web-designs/templates/airtable.md +102 -0
- package/built-in-skills/prismer-popular-web-designs/templates/apple.md +326 -0
- package/built-in-skills/prismer-popular-web-designs/templates/bmw.md +193 -0
- package/built-in-skills/prismer-popular-web-designs/templates/cal.md +272 -0
- package/built-in-skills/prismer-popular-web-designs/templates/claude.md +325 -0
- package/built-in-skills/prismer-popular-web-designs/templates/clay.md +317 -0
- package/built-in-skills/prismer-popular-web-designs/templates/clickhouse.md +294 -0
- package/built-in-skills/prismer-popular-web-designs/templates/cohere.md +279 -0
- package/built-in-skills/prismer-popular-web-designs/templates/coinbase.md +142 -0
- package/built-in-skills/prismer-popular-web-designs/templates/composio.md +320 -0
- package/built-in-skills/prismer-popular-web-designs/templates/cursor.md +322 -0
- package/built-in-skills/prismer-popular-web-designs/templates/elevenlabs.md +278 -0
- package/built-in-skills/prismer-popular-web-designs/templates/expo.md +294 -0
- package/built-in-skills/prismer-popular-web-designs/templates/figma.md +233 -0
- package/built-in-skills/prismer-popular-web-designs/templates/framer.md +259 -0
- package/built-in-skills/prismer-popular-web-designs/templates/hashicorp.md +291 -0
- package/built-in-skills/prismer-popular-web-designs/templates/ibm.md +345 -0
- package/built-in-skills/prismer-popular-web-designs/templates/intercom.md +159 -0
- package/built-in-skills/prismer-popular-web-designs/templates/kraken.md +138 -0
- package/built-in-skills/prismer-popular-web-designs/templates/linear.app.md +380 -0
- package/built-in-skills/prismer-popular-web-designs/templates/lovable.md +311 -0
- package/built-in-skills/prismer-popular-web-designs/templates/minimax.md +270 -0
- package/built-in-skills/prismer-popular-web-designs/templates/mintlify.md +339 -0
- package/built-in-skills/prismer-popular-web-designs/templates/miro.md +121 -0
- package/built-in-skills/prismer-popular-web-designs/templates/mistral.ai.md +274 -0
- package/built-in-skills/prismer-popular-web-designs/templates/mongodb.md +279 -0
- package/built-in-skills/prismer-popular-web-designs/templates/notion.md +322 -0
- package/built-in-skills/prismer-popular-web-designs/templates/nvidia.md +306 -0
- package/built-in-skills/prismer-popular-web-designs/templates/ollama.md +280 -0
- package/built-in-skills/prismer-popular-web-designs/templates/opencode.ai.md +294 -0
- package/built-in-skills/prismer-popular-web-designs/templates/pinterest.md +243 -0
- package/built-in-skills/prismer-popular-web-designs/templates/posthog.md +269 -0
- package/built-in-skills/prismer-popular-web-designs/templates/raycast.md +281 -0
- package/built-in-skills/prismer-popular-web-designs/templates/replicate.md +274 -0
- package/built-in-skills/prismer-popular-web-designs/templates/resend.md +316 -0
- package/built-in-skills/prismer-popular-web-designs/templates/revolut.md +198 -0
- package/built-in-skills/prismer-popular-web-designs/templates/runwayml.md +257 -0
- package/built-in-skills/prismer-popular-web-designs/templates/sanity.md +370 -0
- package/built-in-skills/prismer-popular-web-designs/templates/sentry.md +275 -0
- package/built-in-skills/prismer-popular-web-designs/templates/spacex.md +207 -0
- package/built-in-skills/prismer-popular-web-designs/templates/spotify.md +259 -0
- package/built-in-skills/prismer-popular-web-designs/templates/stripe.md +335 -0
- package/built-in-skills/prismer-popular-web-designs/templates/supabase.md +268 -0
- package/built-in-skills/prismer-popular-web-designs/templates/superhuman.md +265 -0
- package/built-in-skills/prismer-popular-web-designs/templates/together.ai.md +276 -0
- package/built-in-skills/prismer-popular-web-designs/templates/uber.md +308 -0
- package/built-in-skills/prismer-popular-web-designs/templates/vercel.md +323 -0
- package/built-in-skills/prismer-popular-web-designs/templates/voltagent.md +336 -0
- package/built-in-skills/prismer-popular-web-designs/templates/warp.md +266 -0
- package/built-in-skills/prismer-popular-web-designs/templates/webflow.md +105 -0
- package/built-in-skills/prismer-popular-web-designs/templates/wise.md +186 -0
- package/built-in-skills/prismer-popular-web-designs/templates/x.ai.md +270 -0
- package/built-in-skills/prismer-popular-web-designs/templates/zapier.md +341 -0
- package/built-in-skills/prismer-product-price-monitor/LICENSE +21 -0
- package/built-in-skills/prismer-product-price-monitor/NOTICE.md +11 -0
- package/built-in-skills/prismer-product-price-monitor/SKILL.md +97 -0
- package/built-in-skills/prismer-product-price-monitor/scripts/watch_state.py +116 -0
- package/built-in-skills/prismer-python-debugpy/LICENSE +21 -0
- package/built-in-skills/prismer-python-debugpy/NOTICE.md +17 -0
- package/built-in-skills/prismer-python-debugpy/SKILL.md +377 -0
- package/built-in-skills/prismer-python-debugpy/scripts/dap_client.py +68 -0
- package/built-in-skills/prismer-songsee/LICENSE +21 -0
- package/built-in-skills/prismer-songsee/LICENSE.hermes +21 -0
- package/built-in-skills/prismer-songsee/PROVENANCE.md +7 -0
- package/built-in-skills/prismer-songsee/SKILL.md +91 -0
- package/built-in-skills/prismer-songwriting-and-ai-music/LICENSE +21 -0
- package/built-in-skills/prismer-songwriting-and-ai-music/LICENSE.hermes +21 -0
- package/built-in-skills/prismer-songwriting-and-ai-music/PROVENANCE.md +7 -0
- package/built-in-skills/prismer-songwriting-and-ai-music/SKILL.md +317 -0
- package/built-in-skills/prismer-spike/LICENSE +21 -0
- package/built-in-skills/prismer-spike/LICENSE.gsd +21 -0
- package/built-in-skills/prismer-spike/NOTICE.md +17 -0
- package/built-in-skills/prismer-spike/SKILL.md +212 -0
- package/built-in-skills/prismer-teams-meeting-pipeline/LICENSE +21 -0
- package/built-in-skills/prismer-teams-meeting-pipeline/NOTICE.md +11 -0
- package/built-in-skills/prismer-teams-meeting-pipeline/SKILL.md +156 -0
- package/built-in-skills/prismer-xurl/LICENSE +21 -0
- package/built-in-skills/prismer-xurl/LICENSE.hermes +21 -0
- package/built-in-skills/prismer-xurl/PROVENANCE.md +7 -0
- package/built-in-skills/prismer-xurl/SKILL.md +444 -0
- package/built-in-skills/prismer-xurl/provenance/category-DESCRIPTION.md +3 -0
- package/built-in-skills/prismer-youtube-content/LICENSE +21 -0
- package/built-in-skills/prismer-youtube-content/LICENSE.hermes +21 -0
- package/built-in-skills/prismer-youtube-content/PROVENANCE.md +7 -0
- package/built-in-skills/prismer-youtube-content/SKILL.md +86 -0
- package/built-in-skills/prismer-youtube-content/provenance/category-DESCRIPTION.md +3 -0
- package/built-in-skills/prismer-youtube-content/references/output-formats.md +56 -0
- package/built-in-skills/prismer-youtube-content/scripts/fetch_transcript.py +146 -0
- package/built-in-skills/research-arxiv/LICENSE +21 -0
- package/built-in-skills/research-arxiv/NOTICE.md +4 -0
- package/built-in-skills/research-arxiv/SKILL.md +263 -0
- package/built-in-skills/research-arxiv/scripts/search_arxiv.py +111 -0
- package/built-in-skills/role-builder/SKILL.md +7 -1
- package/built-in-skills/role-builder/scripts/author-role.mjs +23 -7
- package/built-in-skills/role-builder/scripts/ingest-role.mjs +15 -117
- package/built-in-skills/role-builder/scripts/instantiate-and-run.mjs +15 -1
- package/built-in-skills/role-builder/scripts/operation-harness.mjs +6 -4
- package/built-in-skills/skill-creator/LICENSE.prismer +21 -0
- package/built-in-skills/skill-creator/NOTICE.md +18 -0
- package/built-in-skills/skill-creator/SKILL.md +20 -1
- package/built-in-skills/skill-creator/eval-viewer/generate_review.py +20 -31
- package/built-in-skills/skill-creator/eval-viewer/viewer.html +35 -23
- package/built-in-skills/skill-creator/references/hermes-agent-skill-authoring/GUIDE.md +220 -0
- package/built-in-skills/skill-creator/references/hermes-agent-skill-authoring/LICENSE +21 -0
- package/built-in-skills/{skill-authoring/SKILL.md → skill-creator/references/skill-authoring/GUIDE.md} +1 -1
- package/built-in-skills/{skill-builder/SKILL.md → skill-creator/references/skill-builder/GUIDE.md} +8 -12
- package/built-in-skills/skill-creator/references/skill-builder/scripts/ingest.mjs +93 -0
- package/built-in-skills/skill-creator/scripts/aggregate_benchmark.py +3 -2
- package/built-in-skills/skill-creator/scripts/import-library.mjs +30 -7
- package/built-in-skills/skill-creator/scripts/improve_description.py +14 -16
- package/built-in-skills/skill-creator/scripts/package_skill.py +16 -9
- package/built-in-skills/skill-creator/scripts/quick_validate.py +22 -5
- package/built-in-skills/skill-creator/scripts/run_eval.py +63 -144
- package/built-in-skills/skill-creator/scripts/run_loop.py +24 -16
- package/built-in-skills/slack-gif-creator/core/gif_builder.py +13 -2
- package/built-in-skills/slack-gif-creator/core/validators.py +17 -7
- package/built-in-skills/tasks/SKILL.md +2 -2
- package/built-in-skills/tdd/SKILL.md +7 -0
- package/built-in-skills/tdd/references/test-driven-development/GUIDE.md +356 -0
- package/built-in-skills/tdd/references/test-driven-development/LICENSE +21 -0
- package/built-in-skills/tdd/references/test-driven-development/LICENSE.superpowers +21 -0
- package/built-in-skills/tdd/references/test-driven-development/NOTICE.md +37 -0
- package/built-in-skills/team/SKILL.md +1 -1
- package/built-in-skills/web-artifacts-builder/SKILL.md +3 -3
- package/built-in-skills/web-artifacts-builder/scripts/bundle-artifact.sh +9 -7
- package/built-in-skills/web-artifacts-builder/scripts/init-artifact.sh +28 -55
- package/built-in-skills/webapp-qa/LICENSE +21 -0
- package/built-in-skills/webapp-qa/NOTICE.md +37 -0
- package/built-in-skills/webapp-qa/SKILL.md +41 -0
- package/built-in-skills/webapp-qa/references/dogfood/GUIDE.md +161 -0
- package/built-in-skills/webapp-qa/references/issue-taxonomy.md +109 -0
- package/built-in-skills/webapp-qa/templates/dogfood-report-template.md +86 -0
- package/built-in-skills/webapp-testing/SKILL.md +9 -2
- package/built-in-skills/webapp-testing/examples/console_logging.py +10 -4
- package/built-in-skills/webapp-testing/examples/element_discovery.py +11 -4
- package/built-in-skills/webapp-testing/examples/static_html_automation.py +14 -9
- package/built-in-skills/webapp-testing/scripts/with_server.py +34 -10
- package/built-in-skills/weekly-review/LICENSE +21 -0
- package/built-in-skills/weekly-review/NOTICE.md +21 -0
- package/built-in-skills/weekly-review/SKILL.md +49 -0
- package/components/eaas-pi-components.manifest.json +37 -0
- package/dist/cli.cjs +7079 -3327
- package/dist/cli.js +6706 -2936
- package/dist/index.cjs +7930 -3822
- package/dist/index.d.cts +484 -5
- package/dist/index.d.ts +484 -5
- package/dist/index.js +7181 -3064
- package/package.json +7 -2
- package/plugins/memory/prismer/__init__.py +4 -0
- package/plugins/memory/prismer/tool-schemas.generated.json +8 -0
- package/built-in-skills/skill-builder/scripts/ingest.mjs +0 -265
- package/built-in-skills/web-artifacts-builder/scripts/shadcn-components.tar.gz +0 -0
- /package/built-in-skills/{document-generation/SKILL.md → office-artifacts/references/document-generation/GUIDE.md} +0 -0
- /package/built-in-skills/{skill-authoring/skill.json → skill-creator/references/skill-authoring/draft-contract.json} +0 -0
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Bounded, version-preserving arXiv Atom search (stdlib only)."""
|
|
3
|
+
import argparse
|
|
4
|
+
import json
|
|
5
|
+
import re
|
|
6
|
+
import sys
|
|
7
|
+
import time
|
|
8
|
+
import urllib.error
|
|
9
|
+
import urllib.parse
|
|
10
|
+
import urllib.request
|
|
11
|
+
import xml.etree.ElementTree as ET
|
|
12
|
+
|
|
13
|
+
NS = {"a": "http://www.w3.org/2005/Atom"}
|
|
14
|
+
ID = re.compile(r"(?:\d{4}\.\d{4,5}|[a-z-]+(?:\.[A-Z]{2})?/\d{7})(?:v[1-9]\d*)?\Z")
|
|
15
|
+
SORTS = {"relevance": "relevance", "date": "submittedDate", "updated": "lastUpdatedDate"}
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def parse_feed(data):
|
|
19
|
+
root = ET.fromstring(data)
|
|
20
|
+
if root.tag != "{" + NS["a"] + "}feed":
|
|
21
|
+
raise ValueError("response is not an Atom feed")
|
|
22
|
+
papers = []
|
|
23
|
+
for entry in root.findall("a:entry", NS):
|
|
24
|
+
def field(name, default="unknown"):
|
|
25
|
+
return " ".join((entry.findtext("a:" + name, default, NS) or default).split())
|
|
26
|
+
raw_id = field("id", "")
|
|
27
|
+
if "/api/errors" in raw_id:
|
|
28
|
+
raise ValueError("arXiv API error: " + field("summary"))
|
|
29
|
+
parsed = urllib.parse.urlsplit(raw_id)
|
|
30
|
+
if parsed.hostname not in {"arxiv.org", "www.arxiv.org", "export.arxiv.org"} or not parsed.path.startswith("/abs/"):
|
|
31
|
+
raise ValueError("entry has an invalid arXiv identifier")
|
|
32
|
+
paper_id = parsed.path.removeprefix("/abs/")
|
|
33
|
+
if not ID.fullmatch(paper_id):
|
|
34
|
+
raise ValueError("entry has an invalid arXiv identifier")
|
|
35
|
+
papers.append({
|
|
36
|
+
"id": paper_id, "title": field("title"),
|
|
37
|
+
"published": field("published"), "updated": field("updated"),
|
|
38
|
+
"authors": [a.findtext("a:name", "unknown", NS) for a in entry.findall("a:author", NS)],
|
|
39
|
+
"categories": [c.get("term", "") for c in entry.findall("a:category", NS)],
|
|
40
|
+
"abstract": field("summary", ""),
|
|
41
|
+
"abs_url": "https://arxiv.org/abs/" + paper_id,
|
|
42
|
+
"pdf_url": "https://arxiv.org/pdf/" + paper_id,
|
|
43
|
+
})
|
|
44
|
+
return papers
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
def search(query=None, author=None, category=None, ids=None, max_results=5, sort="relevance", start=0, as_json=False):
|
|
48
|
+
if not isinstance(max_results, int) or not 1 <= max_results <= 100:
|
|
49
|
+
raise ValueError("max_results must be between 1 and 100")
|
|
50
|
+
if not isinstance(start, int) or start < 0 or sort not in SORTS:
|
|
51
|
+
raise ValueError("invalid start or sort")
|
|
52
|
+
params = {"max_results": max_results, "start": start, "sortBy": SORTS[sort], "sortOrder": "descending"}
|
|
53
|
+
if ids:
|
|
54
|
+
values = [value.strip() for value in ids.split(",")]
|
|
55
|
+
if len(values) > 100 or not all(ID.fullmatch(value) for value in values):
|
|
56
|
+
raise ValueError("invalid arXiv id list")
|
|
57
|
+
params["id_list"] = ",".join(values)
|
|
58
|
+
else:
|
|
59
|
+
parts = [prefix + ":" + value for prefix, value in [("all", query), ("au", author), ("cat", category)] if value]
|
|
60
|
+
if not parts:
|
|
61
|
+
raise ValueError("provide a query, --author, --category, or --id")
|
|
62
|
+
params["search_query"] = " AND ".join(parts)
|
|
63
|
+
url = "https://export.arxiv.org/api/query?" + urllib.parse.urlencode(params)
|
|
64
|
+
request = urllib.request.Request(url, headers={"User-Agent": "PrismerResearch/1.0"})
|
|
65
|
+
for attempt in range(3):
|
|
66
|
+
try:
|
|
67
|
+
with urllib.request.urlopen(request, timeout=20) as response:
|
|
68
|
+
data = response.read(8 * 1024 * 1024 + 1)
|
|
69
|
+
if len(data) > 8 * 1024 * 1024:
|
|
70
|
+
raise ValueError("arXiv response exceeds 8 MiB")
|
|
71
|
+
break
|
|
72
|
+
except urllib.error.HTTPError as exc:
|
|
73
|
+
if attempt == 2 or exc.code not in {429, 500, 502, 503, 504}:
|
|
74
|
+
raise
|
|
75
|
+
time.sleep(3 * (attempt + 1))
|
|
76
|
+
papers = parse_feed(data)
|
|
77
|
+
if as_json:
|
|
78
|
+
print(json.dumps({"papers": papers, "start": start, "count": len(papers)}, ensure_ascii=False))
|
|
79
|
+
elif not papers:
|
|
80
|
+
print("No results found.")
|
|
81
|
+
else:
|
|
82
|
+
for index, paper in enumerate(papers, start=1):
|
|
83
|
+
print(f"{index}. {paper['title']}\n ID: {paper['id']} | Published: {paper['published']} | Updated: {paper['updated']}")
|
|
84
|
+
print(" Authors: " + ", ".join(paper["authors"]))
|
|
85
|
+
print(" Categories: " + ", ".join(paper["categories"]))
|
|
86
|
+
print(" Abstract: " + paper["abstract"])
|
|
87
|
+
print(f" Links: {paper['abs_url']} | {paper['pdf_url']}\n")
|
|
88
|
+
return papers
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
def main():
|
|
92
|
+
parser = argparse.ArgumentParser(description=__doc__)
|
|
93
|
+
parser.add_argument("query", nargs="?")
|
|
94
|
+
parser.add_argument("--author")
|
|
95
|
+
parser.add_argument("--category")
|
|
96
|
+
parser.add_argument("--id", dest="ids")
|
|
97
|
+
parser.add_argument("--max", type=int, default=5, dest="max_results")
|
|
98
|
+
parser.add_argument("--start", type=int, default=0)
|
|
99
|
+
parser.add_argument("--sort", choices=SORTS, default="relevance")
|
|
100
|
+
parser.add_argument("--json", action="store_true", dest="as_json")
|
|
101
|
+
args = parser.parse_args()
|
|
102
|
+
try:
|
|
103
|
+
search(**vars(args))
|
|
104
|
+
except (ValueError, ET.ParseError, OSError) as exc:
|
|
105
|
+
print(f"arxiv search failed: {exc}", file=sys.stderr)
|
|
106
|
+
return 1
|
|
107
|
+
return 0
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
if __name__ == "__main__":
|
|
111
|
+
sys.exit(main())
|
|
@@ -134,7 +134,7 @@ cloud role create ./<role-slug> --mine --json
|
|
|
134
134
|
cloud role show <returned-slug-or-id> --json
|
|
135
135
|
```
|
|
136
136
|
|
|
137
|
-
For
|
|
137
|
+
For the retained legacy entrypoint (requires the current Cloud CLI; no raw HTTP fallback):
|
|
138
138
|
|
|
139
139
|
```bash
|
|
140
140
|
node scripts/ingest-role.mjs ./<role-slug> --mine
|
|
@@ -142,6 +142,12 @@ node scripts/ingest-role.mjs ./<role-slug> --mine
|
|
|
142
142
|
|
|
143
143
|
It reads `PRISMER_API_KEY` and `PRISMER_CLOUD_BASE` from the already-injected
|
|
144
144
|
environment. Do not write literal secrets in the command, bundle, or ledger.
|
|
145
|
+
The adapter delegates validation and Skill preflight to Cloud before creation.
|
|
146
|
+
Ledger-based workflows require an injected API key even if Cloud has saved
|
|
147
|
+
credentials: the target origin and that executing key's hash bind every receipt.
|
|
148
|
+
Changing either requires a separate ledger. Completed receipts are read back,
|
|
149
|
+
not blindly trusted. A lock is never stolen on timeout; after a crash, verify
|
|
150
|
+
the old process has stopped and reconcile remote writes before explicit recovery.
|
|
145
151
|
|
|
146
152
|
## C. Change an existing agent's role
|
|
147
153
|
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
import { spawnSync } from 'node:child_process';
|
|
4
4
|
import { createHash } from 'node:crypto';
|
|
5
|
-
import { existsSync, mkdirSync, readFileSync, renameSync, statSync, writeFileSync } from 'node:fs';
|
|
5
|
+
import { existsSync, mkdirSync, readFileSync, renameSync, statSync, writeFileSync, openSync, closeSync, unlinkSync } from 'node:fs';
|
|
6
6
|
import { dirname, resolve } from 'node:path';
|
|
7
7
|
|
|
8
8
|
export class RoleAuthoringError extends Error {
|
|
@@ -95,7 +95,7 @@ export function loadRoleAuthoringConfig(argv, env = process.env) {
|
|
|
95
95
|
baseUrl.username ||
|
|
96
96
|
baseUrl.password ||
|
|
97
97
|
baseUrl.search ||
|
|
98
|
-
baseUrl.hash
|
|
98
|
+
baseUrl.hash || baseUrl.pathname !== '/'
|
|
99
99
|
) {
|
|
100
100
|
throw new RoleAuthoringError(
|
|
101
101
|
'local_validation',
|
|
@@ -116,6 +116,7 @@ export function loadRoleAuthoringConfig(argv, env = process.env) {
|
|
|
116
116
|
|
|
117
117
|
const revision = roleRevision(rolePath);
|
|
118
118
|
return {
|
|
119
|
+
credential: env.PRISMER_API_KEY?.trim() || '',
|
|
119
120
|
rolePath,
|
|
120
121
|
revision,
|
|
121
122
|
cloudBin: env.PRISMER_CLOUD_BIN?.trim() || 'cloud',
|
|
@@ -133,7 +134,8 @@ export function loadRoleAuthoringConfig(argv, env = process.env) {
|
|
|
133
134
|
function defaultRunCloud(config, args) {
|
|
134
135
|
const result = spawnSync(config.cloudBin, args, {
|
|
135
136
|
encoding: 'utf8',
|
|
136
|
-
env: { ...process.env, PRISMER_CLOUD_BASE: config.baseUrl },
|
|
137
|
+
env: { ...process.env, PRISMER_CLOUD_BASE: config.baseUrl, PRISMER_API_KEY: config.credential },
|
|
138
|
+
timeout: 120_000,
|
|
137
139
|
shell: false,
|
|
138
140
|
});
|
|
139
141
|
if (result.error) {
|
|
@@ -180,7 +182,7 @@ function cliError(result) {
|
|
|
180
182
|
|
|
181
183
|
function writeLedger(path, ledger) {
|
|
182
184
|
mkdirSync(dirname(path), { recursive: true });
|
|
183
|
-
const temporary = `${path}.tmp`;
|
|
185
|
+
const temporary = `${path}.${process.pid}.tmp`;
|
|
184
186
|
writeFileSync(temporary, `${JSON.stringify(ledger, null, 2)}\n`, { mode: 0o600 });
|
|
185
187
|
renameSync(temporary, path);
|
|
186
188
|
}
|
|
@@ -201,10 +203,24 @@ function readLedger(path) {
|
|
|
201
203
|
}
|
|
202
204
|
|
|
203
205
|
export async function runRoleAuthoring(config, runCloud = defaultRunCloud) {
|
|
206
|
+
mkdirSync(dirname(config.ledgerPath), { recursive: true });
|
|
207
|
+
const lockPath = `${config.ledgerPath}.lock`;
|
|
208
|
+
const lock = openSync(lockPath, 'wx', 0o600);
|
|
209
|
+
try {
|
|
210
|
+
return await runRoleAuthoringLocked(config, runCloud);
|
|
211
|
+
} finally {
|
|
212
|
+
closeSync(lock);
|
|
213
|
+
unlinkSync(lockPath);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
async function runRoleAuthoringLocked(config, runCloud) {
|
|
218
|
+
if (!config.credential) throw new RoleAuthoringError('local_validation', 'IDENTITY_REQUIRED', 'PRISMER_API_KEY is required to bind the ledger to the executing credential', 2);
|
|
219
|
+
const targetBinding = createHash('sha256').update(JSON.stringify([config.baseUrl, config.credential])).digest('hex');
|
|
204
220
|
const previous = readLedger(config.ledgerPath);
|
|
205
221
|
if (
|
|
206
222
|
previous &&
|
|
207
|
-
(previous.rolePath !== config.rolePath ||
|
|
223
|
+
(previous.targetBinding !== targetBinding || previous.rolePath !== config.rolePath ||
|
|
208
224
|
previous.revision !== config.revision ||
|
|
209
225
|
Boolean(previous.publish) !== config.publish)
|
|
210
226
|
) {
|
|
@@ -215,8 +231,7 @@ export async function runRoleAuthoring(config, runCloud = defaultRunCloud) {
|
|
|
215
231
|
2,
|
|
216
232
|
);
|
|
217
233
|
}
|
|
218
|
-
if (
|
|
219
|
-
if (previous?.stage === 'created' && previous.slug) {
|
|
234
|
+
if (['created', 'completed'].includes(previous?.stage) && previous.slug) {
|
|
220
235
|
// The server push completed and its canonical slug was durably recorded;
|
|
221
236
|
// resume from readback instead of pushing again (which intentionally bumps
|
|
222
237
|
// a role version even when its content is identical).
|
|
@@ -256,6 +271,7 @@ export async function runRoleAuthoring(config, runCloud = defaultRunCloud) {
|
|
|
256
271
|
}
|
|
257
272
|
|
|
258
273
|
const ledger = {
|
|
274
|
+
targetBinding,
|
|
259
275
|
schemaVersion: 1,
|
|
260
276
|
rolePath: config.rolePath,
|
|
261
277
|
revision: config.revision,
|
|
@@ -25,8 +25,7 @@
|
|
|
25
25
|
// EXPLICIT act, never the default (16 §2.3).
|
|
26
26
|
// • APPLY is admin OR the target agent's workspace owner.
|
|
27
27
|
|
|
28
|
-
import {
|
|
29
|
-
import { join } from 'node:path';
|
|
28
|
+
import { spawnSync } from 'node:child_process';
|
|
30
29
|
|
|
31
30
|
function die(msg, code = 1) {
|
|
32
31
|
console.error(`[role-builder] ✗ ${msg}`);
|
|
@@ -95,7 +94,7 @@ if (
|
|
|
95
94
|
target.username ||
|
|
96
95
|
target.password ||
|
|
97
96
|
target.search ||
|
|
98
|
-
target.hash
|
|
97
|
+
target.hash || target.pathname !== '/'
|
|
99
98
|
) {
|
|
100
99
|
die('PRISMER_CLOUD_BASE must be a plain http(s) origin without credentials, query, or hash', 2);
|
|
101
100
|
}
|
|
@@ -105,119 +104,18 @@ if (!isLocalTarget && !allowRemote) {
|
|
|
105
104
|
die('remote mutation is blocked; set PRISMER_ALLOW_REMOTE_WRITE=1 after confirming the target environment', 2);
|
|
106
105
|
}
|
|
107
106
|
|
|
108
|
-
//
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
107
|
+
// Preserve the legacy CLI surface while delegating parsing/preflight to Cloud.
|
|
108
|
+
const command = ['role', 'create', rolePath];
|
|
109
|
+
if (wantPublish) command.push('--publish');
|
|
110
|
+
if (wantApply) command.push('--apply');
|
|
111
|
+
if (agentId) command.push('--agent', agentId);
|
|
112
|
+
if (workspaceId) command.push('--workspace-id', workspaceId);
|
|
113
|
+
if (asJson) command.push('--json');
|
|
114
|
+
const cloud = process.env.PRISMER_CLOUD_BIN || 'cloud';
|
|
115
|
+
for (const args of [['role', 'validate', rolePath, '--json'], ['role', 'test', rolePath, '--json'], command]) {
|
|
116
|
+
const result = spawnSync(cloud, args, { stdio: 'inherit', shell: false, timeout: 120_000,
|
|
117
|
+
env: { ...process.env, PRISMER_CLOUD_BASE: BASE } });
|
|
118
|
+
if (result.error || result.status !== 0) {
|
|
119
|
+
die('Cloud CLI failed or timed out; inspect remote state before retrying', result.status || 5);
|
|
116
120
|
}
|
|
117
|
-
if (!st.isDirectory()) {
|
|
118
|
-
try {
|
|
119
|
-
return JSON.parse(readFileSync(p, 'utf8'));
|
|
120
|
-
} catch (err) {
|
|
121
|
-
die(`could not read/parse ${p}: ${err?.message || err}`);
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
// Directory bundle: role.json (required) + SOUL.md (optional persona).
|
|
125
|
-
let r;
|
|
126
|
-
try {
|
|
127
|
-
r = JSON.parse(readFileSync(join(p, 'role.json'), 'utf8'));
|
|
128
|
-
} catch (err) {
|
|
129
|
-
if (err?.code === 'ENOENT') die(`role bundle dir is missing role.json: ${join(p, 'role.json')}`);
|
|
130
|
-
die(`could not read/parse ${join(p, 'role.json')}: ${err?.message || err}`);
|
|
131
|
-
}
|
|
132
|
-
try {
|
|
133
|
-
const soul = readFileSync(join(p, 'SOUL.md'), 'utf8');
|
|
134
|
-
// SOUL.md is the persona source-of-truth → operatingPrinciples (markdown).
|
|
135
|
-
if (soul.trim() !== '') r.operatingPrinciples = soul;
|
|
136
|
-
} catch (err) {
|
|
137
|
-
if (err?.code !== 'ENOENT') die(`could not read SOUL.md: ${err?.message || err}`);
|
|
138
|
-
// SOUL.md absent is allowed.
|
|
139
|
-
}
|
|
140
|
-
return r;
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
const role = readRoleBundle(rolePath);
|
|
144
|
-
|
|
145
|
-
const slug = role.slug || role.templateName;
|
|
146
|
-
if (!slug && !role.name && !role.displayName) die('role.json must have slug or name/displayName');
|
|
147
|
-
|
|
148
|
-
if (role.requiredSkills && !Array.isArray(role.requiredSkills)) {
|
|
149
|
-
die('requiredSkills must be an array of { skillSlug, required }');
|
|
150
121
|
}
|
|
151
|
-
for (const rs of role.requiredSkills || []) {
|
|
152
|
-
if (!rs || typeof rs.skillSlug !== 'string') {
|
|
153
|
-
die(`each requiredSkills entry needs a string skillSlug — got ${JSON.stringify(rs)}`);
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
async function api(method, path, body) {
|
|
158
|
-
const res = await fetch(`${BASE}${path}`, {
|
|
159
|
-
method,
|
|
160
|
-
headers: { 'content-type': 'application/json', authorization: `Bearer ${API_KEY}` },
|
|
161
|
-
...(body ? { body: JSON.stringify(body) } : {}),
|
|
162
|
-
});
|
|
163
|
-
let json = null;
|
|
164
|
-
try {
|
|
165
|
-
json = await res.json();
|
|
166
|
-
} catch {
|
|
167
|
-
/* non-JSON */
|
|
168
|
-
}
|
|
169
|
-
return { status: res.status, json };
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
(async () => {
|
|
173
|
-
// product204/16 §2.3 — DEFAULT is the owner-scoped create path (private role
|
|
174
|
-
// owned by the caller, lands in Studio `/mine`); `--publish`/`--admin-catalog`
|
|
175
|
-
// is the EXPLICIT admin catalog path (publishes straight to the Marketplace).
|
|
176
|
-
const createPath = wantMine ? '/api/im/role-templates/mine' : '/api/im/role-templates';
|
|
177
|
-
const created = await api('POST', createPath, role);
|
|
178
|
-
if (created.status === 403) {
|
|
179
|
-
die(
|
|
180
|
-
wantMine
|
|
181
|
-
? 'create returned 403 — the API key does not resolve to a workspace user (auth failed).'
|
|
182
|
-
: 'create returned 403 — the API key does not map to an admin email (role create is admin-only). Use --mine for an owner-scoped private role.',
|
|
183
|
-
3,
|
|
184
|
-
);
|
|
185
|
-
}
|
|
186
|
-
if (created.status === 409) die(`role slug already exists (409). Use update or a new slug.`, 2);
|
|
187
|
-
if (created.status !== 201 || !created.json?.ok) {
|
|
188
|
-
die(`create failed (HTTP ${created.status}): ${created.json?.error || 'unknown error'}`);
|
|
189
|
-
}
|
|
190
|
-
const tpl = created.json.data;
|
|
191
|
-
const result = {
|
|
192
|
-
slug: tpl.slug,
|
|
193
|
-
agentType: tpl.agentType,
|
|
194
|
-
taskAuthority: tpl.taskAuthority,
|
|
195
|
-
requiredSkills: Array.isArray(role.requiredSkills) ? role.requiredSkills.length : 0,
|
|
196
|
-
applied: false,
|
|
197
|
-
};
|
|
198
|
-
|
|
199
|
-
if (wantApply) {
|
|
200
|
-
const apply = await api('POST', `/api/im/role-templates/${encodeURIComponent(tpl.slug)}/apply`, {
|
|
201
|
-
agentId,
|
|
202
|
-
...(workspaceId ? { workspaceId } : {}),
|
|
203
|
-
});
|
|
204
|
-
if (apply.status >= 200 && apply.status < 300 && apply.json?.ok !== false) {
|
|
205
|
-
result.applied = agentId;
|
|
206
|
-
} else if (apply.status === 403) {
|
|
207
|
-
result.applyError = '403 — need admin or the target agent workspace owner';
|
|
208
|
-
} else {
|
|
209
|
-
result.applyError = `HTTP ${apply.status}: ${apply.json?.error || 'apply failed'}`;
|
|
210
|
-
}
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
if (asJson) {
|
|
214
|
-
console.log(JSON.stringify(result, null, 2));
|
|
215
|
-
} else {
|
|
216
|
-
console.log(`[role-builder] ✓ ingested role ${result.slug}`);
|
|
217
|
-
console.log(` type: ${result.agentType} / authority=${result.taskAuthority}`);
|
|
218
|
-
console.log(` skills: ${result.requiredSkills}`);
|
|
219
|
-
console.log(` applied: ${result.applied}${result.applyError ? ` (${result.applyError})` : ''}`);
|
|
220
|
-
console.log(` verify: GET /api/im/role-templates/${result.slug}`);
|
|
221
|
-
}
|
|
222
|
-
if (result.applyError) process.exitCode = 5;
|
|
223
|
-
})().catch((err) => die(err?.message || String(err)));
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
|
+
import { mkdirSync, openSync, closeSync, unlinkSync } from 'node:fs';
|
|
4
|
+
import { dirname } from 'node:path';
|
|
3
5
|
import {
|
|
4
6
|
HarnessError,
|
|
5
7
|
invocationHash,
|
|
@@ -143,6 +145,18 @@ async function waitForTask(config, task, ledger) {
|
|
|
143
145
|
}
|
|
144
146
|
|
|
145
147
|
export async function runRoleWorkflow(config) {
|
|
148
|
+
mkdirSync(dirname(config.ledgerPath), { recursive: true });
|
|
149
|
+
const lockPath = `${config.ledgerPath}.lock`;
|
|
150
|
+
const lock = openSync(lockPath, 'wx', 0o600);
|
|
151
|
+
try {
|
|
152
|
+
return await runRoleWorkflowLocked(config);
|
|
153
|
+
} finally {
|
|
154
|
+
closeSync(lock);
|
|
155
|
+
unlinkSync(lockPath);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
async function runRoleWorkflowLocked(config) {
|
|
146
160
|
const acceptedHash = invocationHash(config);
|
|
147
161
|
const previous = readLedger(config.ledgerPath);
|
|
148
162
|
if (
|
|
@@ -150,7 +164,7 @@ export async function runRoleWorkflow(config) {
|
|
|
150
164
|
(previous.requestId !== config.requestId ||
|
|
151
165
|
previous.role !== config.role ||
|
|
152
166
|
previous.workspaceId !== config.workspaceId ||
|
|
153
|
-
|
|
167
|
+
previous.invocationHash !== acceptedHash)
|
|
154
168
|
) {
|
|
155
169
|
throw new HarnessError(
|
|
156
170
|
'local_validation',
|
|
@@ -123,7 +123,7 @@ export function loadHarnessConfig(argv, env = process.env) {
|
|
|
123
123
|
baseUrl.username ||
|
|
124
124
|
baseUrl.password ||
|
|
125
125
|
baseUrl.search ||
|
|
126
|
-
baseUrl.hash
|
|
126
|
+
baseUrl.hash || baseUrl.pathname !== '/'
|
|
127
127
|
) {
|
|
128
128
|
throw new HarnessError(
|
|
129
129
|
'local_validation',
|
|
@@ -151,8 +151,8 @@ export function loadHarnessConfig(argv, env = process.env) {
|
|
|
151
151
|
const requestId =
|
|
152
152
|
envOrArg(parsed, '--request-id', 'PRISMER_REQUEST_ID', env)?.trim() ||
|
|
153
153
|
`role-run-${randomUUID()}`;
|
|
154
|
-
if (requestId
|
|
155
|
-
throw new HarnessError('local_validation', 'INVALID_REQUEST_ID', 'request id
|
|
154
|
+
if (!/^[A-Za-z0-9][A-Za-z0-9_-]{0,190}$/.test(requestId)) {
|
|
155
|
+
throw new HarnessError('local_validation', 'INVALID_REQUEST_ID', 'request id must be a safe path component of at most 191 characters', 2);
|
|
156
156
|
}
|
|
157
157
|
|
|
158
158
|
const config = {
|
|
@@ -185,7 +185,7 @@ export function loadHarnessConfig(argv, env = process.env) {
|
|
|
185
185
|
|
|
186
186
|
export function writeLedger(path, value) {
|
|
187
187
|
mkdirSync(dirname(path), { recursive: true });
|
|
188
|
-
const temporary = `${path}.tmp`;
|
|
188
|
+
const temporary = `${path}.${process.pid}.tmp`;
|
|
189
189
|
writeFileSync(temporary, `${JSON.stringify(value, null, 2)}\n`, { mode: 0o600 });
|
|
190
190
|
renameSync(temporary, path);
|
|
191
191
|
}
|
|
@@ -209,6 +209,8 @@ export function invocationHash(config) {
|
|
|
209
209
|
return createHash('sha256')
|
|
210
210
|
.update(
|
|
211
211
|
JSON.stringify({
|
|
212
|
+
baseUrl: config.baseUrl,
|
|
213
|
+
credentialHash: createHash('sha256').update(config.apiKey).digest('hex'),
|
|
212
214
|
requestId: config.requestId,
|
|
213
215
|
role: config.role,
|
|
214
216
|
workspaceId: config.workspaceId,
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Prismer
|
|
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.
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# Resource License Boundaries
|
|
2
|
+
|
|
3
|
+
- Imported Anthropic authoring/evaluation resources retain Apache-2.0 in
|
|
4
|
+
`LICENSE.txt`, including its original copyright notice. Local fixes do not
|
|
5
|
+
replace that license.
|
|
6
|
+
- Prismer-specific workflow, `scripts/import-library.mjs`, and legacy
|
|
7
|
+
`references/skill-authoring/` / `references/skill-builder/` retain MIT from
|
|
8
|
+
`sdk/cloud/LICENSE`, reproduced as `LICENSE.prismer` (Copyright 2026 Prismer).
|
|
9
|
+
- `references/hermes-agent-skill-authoring/GUIDE.md` contains the full upstream
|
|
10
|
+
`skills/software-development/hermes-agent-skill-authoring/SKILL.md` at Hermes
|
|
11
|
+
revision `1a1f4a59e252e1dc0137e7b2e7bcc8b0381d19c4`, adapted for scope/path
|
|
12
|
+
safety and explicit authorization of git operations. Its MIT license,
|
|
13
|
+
Copyright 2025 Nous Research, is retained beside the guide as `LICENSE`.
|
|
14
|
+
The upstream skill has no additional resource files. No source upstream was
|
|
15
|
+
modified. Its skill identity is recorded in `metadata.nativeReplaces`.
|
|
16
|
+
|
|
17
|
+
Distribute these notices and nested license files with the corresponding
|
|
18
|
+
resources. The mixed-license frontmatter is not a relicensing of any source.
|
|
@@ -3,7 +3,7 @@ name: skill-creator
|
|
|
3
3
|
scope: common
|
|
4
4
|
category: authoring
|
|
5
5
|
description: Create, import, edit, validate, test, or publish a Prismer SS-01 Skill. Use whenever a user asks to turn a repeatable capability or external Skill repository into platform Skills, improve an existing Skill, or make Skills available in Studio, a workspace, or Marketplace. Follow the fixed author-to-readback workflow and use bundled scripts for deterministic repeated work; do not explore raw endpoints or compose ad-hoc CLI chains.
|
|
6
|
-
license: MIT
|
|
6
|
+
license: Apache-2.0 AND MIT; see NOTICE.md
|
|
7
7
|
compatibility:
|
|
8
8
|
- prismer-sdk
|
|
9
9
|
- hermes
|
|
@@ -12,6 +12,8 @@ compatibility:
|
|
|
12
12
|
- openclaw
|
|
13
13
|
metadata:
|
|
14
14
|
category: authoring
|
|
15
|
+
aliases: [skill-builder, skill-authoring]
|
|
16
|
+
nativeReplaces: [hermes-agent-skill-authoring]
|
|
15
17
|
allowed-tools:
|
|
16
18
|
- Read
|
|
17
19
|
- Write
|
|
@@ -21,6 +23,14 @@ allowed-tools:
|
|
|
21
23
|
|
|
22
24
|
# Skill Creator
|
|
23
25
|
|
|
26
|
+
Historical skill-builder and skill-authoring installs resolve to this entry.
|
|
27
|
+
For low-level legacy formats only, see references/skill-builder/GUIDE.md and
|
|
28
|
+
references/skill-authoring/GUIDE.md. The current workflow below is authoritative.
|
|
29
|
+
For Hermes in-repository conventions, read
|
|
30
|
+
`references/hermes-agent-skill-authoring/GUIDE.md` only when targeting a verified
|
|
31
|
+
Hermes checkout. It is a full MIT-licensed reference, not a second entrypoint.
|
|
32
|
+
The bundled Anthropic authoring resources retain Apache-2.0 in LICENSE.txt.
|
|
33
|
+
|
|
24
34
|
Choose one route and execute it directly. Do not inspect `cloud --help`, create
|
|
25
35
|
probe catalog objects, or call raw Skill endpoints first.
|
|
26
36
|
|
|
@@ -33,6 +43,15 @@ probe catalog objects, or call raw Skill endpoints first.
|
|
|
33
43
|
|
|
34
44
|
## Ownership boundary
|
|
35
45
|
|
|
46
|
+
Optional paid trigger/description evaluations require explicit budget approval
|
|
47
|
+
and `PRISMER_ALLOW_PAID_EVAL=1`. Trigger probes use isolated temporary skill
|
|
48
|
+
directories, Read/Skill only, 0.25 USD per query and a 300-call batch ceiling.
|
|
49
|
+
Use a current Claude CLI supporting `--bare` and budget flags; unsupported CLI,
|
|
50
|
+
timeout, auth failure, or missing terminal result is an error, not a negative
|
|
51
|
+
trigger. Do not bypass nested-session or authentication guards. Viewer HTML
|
|
52
|
+
is local; spreadsheet preview additionally uses its declared external SheetJS
|
|
53
|
+
script and is not guaranteed offline. Static feedback is downloaded explicitly.
|
|
54
|
+
|
|
36
55
|
Keep each concern in its proper layer:
|
|
37
56
|
|
|
38
57
|
- Product resource operations belong in the service/SDK/CLI.
|
|
@@ -16,12 +16,8 @@ import argparse
|
|
|
16
16
|
import base64
|
|
17
17
|
import json
|
|
18
18
|
import mimetypes
|
|
19
|
-
import os
|
|
20
19
|
import re
|
|
21
|
-
import signal
|
|
22
|
-
import subprocess
|
|
23
20
|
import sys
|
|
24
|
-
import time
|
|
25
21
|
import webbrowser
|
|
26
22
|
from functools import partial
|
|
27
23
|
from http.server import HTTPServer, BaseHTTPRequestHandler
|
|
@@ -276,7 +272,8 @@ def generate_html(
|
|
|
276
272
|
if benchmark:
|
|
277
273
|
embedded["benchmark"] = benchmark
|
|
278
274
|
|
|
279
|
-
|
|
275
|
+
# HTML parses closing script tags before JavaScript parses string literals.
|
|
276
|
+
data_json = json.dumps(embedded).replace('<', '\\u003c').replace('>', '\\u003e').replace('&', '\\u0026')
|
|
280
277
|
|
|
281
278
|
return template.replace("/*__EMBEDDED_DATA__*/", f"const EMBEDDED_DATA = {data_json};")
|
|
282
279
|
|
|
@@ -285,26 +282,6 @@ def generate_html(
|
|
|
285
282
|
# HTTP server (stdlib only, zero dependencies)
|
|
286
283
|
# ---------------------------------------------------------------------------
|
|
287
284
|
|
|
288
|
-
def _kill_port(port: int) -> None:
|
|
289
|
-
"""Kill any process listening on the given port."""
|
|
290
|
-
try:
|
|
291
|
-
result = subprocess.run(
|
|
292
|
-
["lsof", "-ti", f":{port}"],
|
|
293
|
-
capture_output=True, text=True, timeout=5,
|
|
294
|
-
)
|
|
295
|
-
for pid_str in result.stdout.strip().split("\n"):
|
|
296
|
-
if pid_str.strip():
|
|
297
|
-
try:
|
|
298
|
-
os.kill(int(pid_str.strip()), signal.SIGTERM)
|
|
299
|
-
except (ProcessLookupError, ValueError):
|
|
300
|
-
pass
|
|
301
|
-
if result.stdout.strip():
|
|
302
|
-
time.sleep(0.5)
|
|
303
|
-
except subprocess.TimeoutExpired:
|
|
304
|
-
pass
|
|
305
|
-
except FileNotFoundError:
|
|
306
|
-
print("Note: lsof not found, cannot check if port is in use", file=sys.stderr)
|
|
307
|
-
|
|
308
285
|
class ReviewHandler(BaseHTTPRequestHandler):
|
|
309
286
|
"""Serves the review HTML and handles feedback saves.
|
|
310
287
|
|
|
@@ -360,12 +337,26 @@ class ReviewHandler(BaseHTTPRequestHandler):
|
|
|
360
337
|
|
|
361
338
|
def do_POST(self) -> None:
|
|
362
339
|
if self.path == "/api/feedback":
|
|
363
|
-
|
|
340
|
+
origin = self.headers.get('Origin')
|
|
341
|
+
if origin and origin not in (f'http://localhost:{self.server.server_port}', f'http://127.0.0.1:{self.server.server_port}'):
|
|
342
|
+
self.send_error(403)
|
|
343
|
+
return
|
|
344
|
+
try:
|
|
345
|
+
length = int(self.headers.get('Content-Length', 0))
|
|
346
|
+
except ValueError:
|
|
347
|
+
self.send_error(400)
|
|
348
|
+
return
|
|
349
|
+
if not 0 < length <= 1024 * 1024:
|
|
350
|
+
self.send_error(413)
|
|
351
|
+
return
|
|
364
352
|
body = self.rfile.read(length)
|
|
365
353
|
try:
|
|
366
354
|
data = json.loads(body)
|
|
367
|
-
if not isinstance(data, dict) or
|
|
368
|
-
|
|
355
|
+
if (not isinstance(data, dict) or not isinstance(data.get('reviews'), list)
|
|
356
|
+
or data.get('status') not in ('in_progress', 'complete')
|
|
357
|
+
or any(not isinstance(r, dict) or not isinstance(r.get('run_id'), str)
|
|
358
|
+
or not isinstance(r.get('feedback'), str) for r in data['reviews'])):
|
|
359
|
+
raise ValueError('Invalid review payload')
|
|
369
360
|
self.feedback_path.write_text(json.dumps(data, indent=2) + "\n")
|
|
370
361
|
resp = b'{"ok":true}'
|
|
371
362
|
self.send_response(200)
|
|
@@ -435,14 +426,12 @@ def main() -> None:
|
|
|
435
426
|
print(f"\n Static viewer written to: {args.static}\n")
|
|
436
427
|
sys.exit(0)
|
|
437
428
|
|
|
438
|
-
# Kill any existing process on the target port
|
|
439
429
|
port = args.port
|
|
440
|
-
_kill_port(port)
|
|
441
430
|
handler = partial(ReviewHandler, workspace, skill_name, feedback_path, previous, benchmark_path)
|
|
442
431
|
try:
|
|
443
432
|
server = HTTPServer(("127.0.0.1", port), handler)
|
|
444
433
|
except OSError:
|
|
445
|
-
#
|
|
434
|
+
# Never signal an unrelated listener; let the OS select a free port.
|
|
446
435
|
server = HTTPServer(("127.0.0.1", 0), handler)
|
|
447
436
|
port = server.server_address[1]
|
|
448
437
|
|