@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,272 @@
|
|
|
1
|
+
"""Offline regression gates for the resource audit (unittest, no account access)."""
|
|
2
|
+
import contextlib
|
|
3
|
+
import importlib.util
|
|
4
|
+
import io
|
|
5
|
+
import json
|
|
6
|
+
import os
|
|
7
|
+
from pathlib import Path
|
|
8
|
+
import subprocess
|
|
9
|
+
import sys
|
|
10
|
+
import tempfile
|
|
11
|
+
import unittest
|
|
12
|
+
from unittest.mock import patch
|
|
13
|
+
|
|
14
|
+
from docx import Document
|
|
15
|
+
from docx.oxml import OxmlElement
|
|
16
|
+
from openpyxl import Workbook, load_workbook
|
|
17
|
+
from openpyxl.worksheet.datavalidation import DataValidation
|
|
18
|
+
from openpyxl.worksheet.table import Table
|
|
19
|
+
from PIL import Image
|
|
20
|
+
from pptx import Presentation
|
|
21
|
+
from pptx.chart.data import CategoryChartData
|
|
22
|
+
from pptx.enum.chart import XL_CHART_TYPE
|
|
23
|
+
from pypdf import PdfReader, PdfWriter
|
|
24
|
+
from reportlab.pdfgen.canvas import Canvas
|
|
25
|
+
|
|
26
|
+
ROOT = Path(__file__).resolve().parents[1] / 'references'
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def module(kind, name):
|
|
30
|
+
path = ROOT / kind / 'scripts' / (name + '.py')
|
|
31
|
+
sys.path.insert(0, str(path.parent))
|
|
32
|
+
spec = importlib.util.spec_from_file_location(name, path)
|
|
33
|
+
result = importlib.util.module_from_spec(spec)
|
|
34
|
+
spec.loader.exec_module(result)
|
|
35
|
+
return result
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
class ResourceRegression(unittest.TestCase):
|
|
39
|
+
def test_pdf_rasterizer_runtime_fallback_and_boundaries(self):
|
|
40
|
+
raster = module('pdf', '_raster')
|
|
41
|
+
with patch.object(raster, 'available_backends', return_value=['pypdfium2', 'pdftoppm']), patch.object(raster, '_via_pdfium', side_effect=RuntimeError('renderer unavailable')), patch.object(raster, '_via_pdftoppm', return_value='image') as fallback:
|
|
42
|
+
self.assertEqual(raster.rasterize_page('fake.pdf', 1), 'image')
|
|
43
|
+
fallback.assert_called_once()
|
|
44
|
+
with self.assertRaises(ValueError): raster.rasterize_page('fake.pdf', 0)
|
|
45
|
+
with self.assertRaises(ValueError): raster.rasterize_page('fake.pdf', 1, dpi=100000)
|
|
46
|
+
|
|
47
|
+
def test_docx_existing_generic_comment_part_persists_deletion(self):
|
|
48
|
+
from docx.opc.part import Part
|
|
49
|
+
from docx.opc.packuri import PackURI
|
|
50
|
+
from docx.opc.constants import RELATIONSHIP_TYPE as RT
|
|
51
|
+
comments = module('docx', 'docx_comments')
|
|
52
|
+
d = Document(); d.add_paragraph('text')
|
|
53
|
+
blob = f'<w:comments xmlns:w="{comments.W}"><w:comment w:id="0"><w:p><w:r><w:t>old</w:t></w:r></w:p></w:comment></w:comments>'.encode()
|
|
54
|
+
part = Part(PackURI('/word/comments.xml'), comments.COMMENTS_CT, blob, d.part.package)
|
|
55
|
+
d.part.relate_to(part, RT.COMMENTS)
|
|
56
|
+
self.assertTrue(comments.delete_comment(d, '0'))
|
|
57
|
+
path = self.dir / 'comments.docx'; d.save(path)
|
|
58
|
+
self.assertEqual(comments.list_comments(Document(path)), [])
|
|
59
|
+
|
|
60
|
+
def test_pdf_unicode_requires_explicit_font_and_empty_split_rejected(self):
|
|
61
|
+
create = module('pdf', 'pdf_create')
|
|
62
|
+
with contextlib.redirect_stderr(io.StringIO()):
|
|
63
|
+
self.assertNotEqual(create.build_pdf({'elements': [{'type': 'paragraph', 'text': '\u4e2d\u6587'}]}, str(self.dir / 'bad.pdf')), 0)
|
|
64
|
+
self.assertFalse((self.dir / 'bad.pdf').exists())
|
|
65
|
+
split = module('pdf', 'pdf_split')
|
|
66
|
+
with self.assertRaises(ValueError): split.parse_pages(' , ', 2)
|
|
67
|
+
|
|
68
|
+
def test_xlsx_table_partial_column_change_fails_before_output(self):
|
|
69
|
+
w = Workbook(); s = w.active
|
|
70
|
+
s.append(['first', 'second']); s.append([1, 2]); s.add_table(Table(displayName='T', ref='A1:B2'))
|
|
71
|
+
src = self.dir / 'table.xlsx'; dest = self.dir / 'edited.xlsx'; w.save(src)
|
|
72
|
+
result = self.cli('xlsx', 'xlsx_restructure', src, '--delete-cols', 'A', '--out', dest)
|
|
73
|
+
self.assertNotEqual(result.returncode, 0)
|
|
74
|
+
self.assertFalse(dest.exists())
|
|
75
|
+
self.assertIn('table', result.stderr.lower())
|
|
76
|
+
|
|
77
|
+
def test_xlsx_insert_table_column_keeps_schema_and_filter_consistent(self):
|
|
78
|
+
w = Workbook(); s = w.active
|
|
79
|
+
s.append(['first', 'second']); s.append([1, 2]); s.add_table(Table(displayName='T', ref='A1:B2'))
|
|
80
|
+
src = self.dir / 'table.xlsx'; dest = self.dir / 'edited.xlsx'; w.save(src)
|
|
81
|
+
result = self.cli('xlsx', 'xlsx_restructure', src, '--insert-cols', 'B', '--out', dest)
|
|
82
|
+
self.assertEqual(result.returncode, 0, result.stderr)
|
|
83
|
+
s = load_workbook(dest).active; t = s.tables['T']
|
|
84
|
+
self.assertEqual(t.ref, 'A1:C2'); self.assertEqual(t.autoFilter.ref, t.ref)
|
|
85
|
+
self.assertEqual([c.name for c in t.tableColumns], [s.cell(1, i).value for i in range(1, 4)])
|
|
86
|
+
self.assertEqual(len(t.tableColumns), 3)
|
|
87
|
+
|
|
88
|
+
def setUp(self):
|
|
89
|
+
self.tmp = tempfile.TemporaryDirectory()
|
|
90
|
+
self.addCleanup(self.tmp.cleanup)
|
|
91
|
+
self.dir = Path(self.tmp.name)
|
|
92
|
+
|
|
93
|
+
def cli(self, kind, name, *args):
|
|
94
|
+
return subprocess.run([sys.executable, '-B', str(ROOT / kind / 'scripts' / (name + '.py')),
|
|
95
|
+
*map(str, args)], capture_output=True, text=True, timeout=20)
|
|
96
|
+
|
|
97
|
+
def test_docx_replacement_terminates_without_rescanning_new_text(self):
|
|
98
|
+
code = "from docx import Document; from docx_common import replace_in_paragraph; p=Document().add_paragraph('x x'); assert replace_in_paragraph(p,'x','xx')==2; assert p.text=='xx xx'"
|
|
99
|
+
try:
|
|
100
|
+
result = subprocess.run([sys.executable, '-B', '-c', code], timeout=2,
|
|
101
|
+
env={**os.environ, 'PYTHONPATH': str(ROOT / 'docx/scripts')}, capture_output=True)
|
|
102
|
+
except subprocess.TimeoutExpired:
|
|
103
|
+
self.fail('replacement rescans generated text and does not terminate')
|
|
104
|
+
self.assertEqual(result.returncode, 0, result.stderr)
|
|
105
|
+
|
|
106
|
+
def test_docx_accepted_text_and_namespace_independent_revision_detection(self):
|
|
107
|
+
d = Document(); p = d.add_paragraph('before ')
|
|
108
|
+
ins = OxmlElement('w:ins'); r = OxmlElement('w:r'); t = OxmlElement('w:t')
|
|
109
|
+
t.text = 'inserted'; r.append(t); ins.append(r); p._p.append(ins)
|
|
110
|
+
reader = module('docx', 'docx_read')
|
|
111
|
+
self.assertEqual(reader.extract_text(d)['body'], ['before inserted'])
|
|
112
|
+
p._p.remove(ins); p._p.append(OxmlElement('w:moveFrom'))
|
|
113
|
+
dest = self.dir / 'move.docx'; d.save(dest)
|
|
114
|
+
self.assertTrue(reader.detect_revisions(dest)['has_tracked_changes'])
|
|
115
|
+
|
|
116
|
+
def test_docx_structural_revision_is_not_silently_resolved(self):
|
|
117
|
+
d = Document(); p = d.add_paragraph('text')
|
|
118
|
+
props = p._p.get_or_add_pPr(); props.append(OxmlElement('w:del'))
|
|
119
|
+
revision = module('docx', 'docx_revisions')
|
|
120
|
+
self.assertEqual(revision.resolve(d, True), 0)
|
|
121
|
+
self.assertIsNotNone(props.find(revision.q('del')))
|
|
122
|
+
|
|
123
|
+
def test_docx_validator_keeps_relationship_source_parts_separate(self):
|
|
124
|
+
image = self.dir / 'tiny.png'; Image.new('RGB', (3, 3), 'red').save(image)
|
|
125
|
+
d = Document(); d.add_picture(str(image)); d.sections[0].header.paragraphs[0].add_run().add_picture(str(image))
|
|
126
|
+
path = self.dir / 'doc.docx'; d.save(path)
|
|
127
|
+
for seed in range(5):
|
|
128
|
+
code = f"from docx_validate import validate; import json; print(json.dumps(validate({str(path)!r})))"
|
|
129
|
+
p = subprocess.run([sys.executable, '-B', '-c', code], capture_output=True, text=True,
|
|
130
|
+
env={**os.environ, 'PYTHONPATH': str(ROOT / 'docx/scripts'), 'PYTHONHASHSEED': str(seed)})
|
|
131
|
+
self.assertTrue(json.loads(p.stdout)['ok'], p.stdout)
|
|
132
|
+
|
|
133
|
+
def test_pdf_flatten_removes_fields_and_widgets_but_retains_value(self):
|
|
134
|
+
src = self.dir / 'form.pdf'; out = self.dir / 'flat.pdf'; fields = self.dir / 'values.json'
|
|
135
|
+
c = Canvas(str(src)); c.acroForm.textfield(name='name', x=20, y=700, width=100, height=20); c.showPage(); c.save()
|
|
136
|
+
fields.write_text('{"name":"Alice"}')
|
|
137
|
+
p = self.cli('pdf', 'pdf_fill_form', src, '--fields-json', fields, '-o', out, '--flatten')
|
|
138
|
+
self.assertEqual(p.returncode, 0, p.stderr)
|
|
139
|
+
doc = PdfReader(out)
|
|
140
|
+
self.assertFalse(doc.get_fields())
|
|
141
|
+
self.assertFalse(doc.pages[0].get('/Annots'))
|
|
142
|
+
self.assertIn('Alice', doc.pages[0].extract_text())
|
|
143
|
+
|
|
144
|
+
def test_pdf_attachment_names_cannot_overwrite_existing_or_drop_duplicates(self):
|
|
145
|
+
src = self.dir / 'attachments.pdf'; dest = self.dir / 'out'; dest.mkdir()
|
|
146
|
+
(dest / 'same.txt').write_bytes(b'existing')
|
|
147
|
+
writer = PdfWriter(); writer.add_blank_page(100, 100)
|
|
148
|
+
writer.add_attachment('same.txt', b'first'); writer.add_attachment('same.txt', b'second'); writer.write(src)
|
|
149
|
+
result = self.cli('pdf', 'pdf_meta', src, '--extract-attachments', dest)
|
|
150
|
+
self.assertEqual(result.returncode, 0, result.stderr)
|
|
151
|
+
self.assertEqual((dest / 'same.txt').read_bytes(), b'existing')
|
|
152
|
+
self.assertEqual({p.read_bytes() for p in dest.iterdir()}, {b'existing', b'first', b'second'})
|
|
153
|
+
|
|
154
|
+
def test_csv_literal_mode_does_not_create_formulas(self):
|
|
155
|
+
source = self.dir / 'in.csv'; out = self.dir / 'out.xlsx'; source.write_text('value\n=1+1\n')
|
|
156
|
+
self.assertEqual(self.cli('xlsx', 'csv_to_xlsx', source, out, '--no-infer').returncode, 0)
|
|
157
|
+
self.assertEqual(load_workbook(out).active['A2'].data_type, 's')
|
|
158
|
+
|
|
159
|
+
def test_xlsx_formula_token_types_and_whole_column_ranges(self):
|
|
160
|
+
rw = module('xlsx', 'xlsx_restructure').RefRewriter('Sheet1', 'cols', 1, 1, False)
|
|
161
|
+
for source, expected in [('=SUM(B:B)', '=SUM(C:C)'), ('=SUM(Table1[A1])', '=SUM(Table1[A1])'),
|
|
162
|
+
('="A1"&A1', '="A1"&B1'), ('=SUM(1:2)', '=SUM(1:2)'),
|
|
163
|
+
("='[other.xlsx]Sheet1'!A1", "='[other.xlsx]Sheet1'!A1")]:
|
|
164
|
+
self.assertEqual(rw.rewrite(source, 'Sheet1'), expected)
|
|
165
|
+
|
|
166
|
+
def test_xlsx_column_dimensions_survive_shift(self):
|
|
167
|
+
src = self.dir / 'in.xlsx'; w = Workbook(); w.active.column_dimensions['B'].width = 24; w.save(src)
|
|
168
|
+
p = self.cli('xlsx', 'xlsx_restructure', src, '--insert-cols', 'B')
|
|
169
|
+
self.assertEqual(p.returncode, 0, p.stderr)
|
|
170
|
+
self.assertEqual(load_workbook(src).active.column_dimensions['C'].width, 24)
|
|
171
|
+
|
|
172
|
+
def test_xlsx_full_delete_removes_validation_table_and_dimension(self):
|
|
173
|
+
src = self.dir / 'in.xlsx'; w = Workbook(); s = w.active
|
|
174
|
+
s.append(['name']); s.append(['value']); s.add_table(Table(displayName='Items', ref='A1:A2'))
|
|
175
|
+
dv = DataValidation(type='whole'); dv.add('A1:A2'); s.add_data_validation(dv); s.row_dimensions[1].height = 30; w.save(src)
|
|
176
|
+
p = self.cli('xlsx', 'xlsx_restructure', src, '--delete-rows', '1:2')
|
|
177
|
+
self.assertEqual(p.returncode, 0, p.stderr); s = load_workbook(src).active
|
|
178
|
+
self.assertFalse(s.tables); self.assertFalse(s.data_validations.dataValidation); self.assertNotIn(1, s.row_dimensions)
|
|
179
|
+
|
|
180
|
+
def test_pptx_mixed_runs_and_group_text_are_all_replaced(self):
|
|
181
|
+
prs = Presentation(); s = prs.slides.add_slide(prs.slide_layouts[6])
|
|
182
|
+
tf = s.shapes.add_group_shape().shapes.add_textbox(0, 0, 1000000, 1000000).text_frame
|
|
183
|
+
for value in ['foo ', 'f', 'oo']: tf.paragraphs[0].add_run().text = value
|
|
184
|
+
self.assertEqual(module('powerpoint', 'pptx_edit').replace_text(prs, 'foo', 'bar'), 2)
|
|
185
|
+
self.assertEqual(tf.text, 'bar bar')
|
|
186
|
+
|
|
187
|
+
def test_pptx_copy_preserves_background(self):
|
|
188
|
+
prs = Presentation(); s = prs.slides.add_slide(prs.slide_layouts[6]); edit = module('powerpoint', 'pptx_edit')
|
|
189
|
+
edit.set_background(s, 'FF0000'); edit.duplicate_slide(prs, 0)
|
|
190
|
+
self.assertEqual(prs.slides[1].background.fill.type, s.background.fill.type)
|
|
191
|
+
|
|
192
|
+
def test_pptx_grouped_chart_copy_is_refused(self):
|
|
193
|
+
prs = Presentation(); s = prs.slides.add_slide(prs.slide_layouts[6]); data = CategoryChartData()
|
|
194
|
+
data.categories = ['A']; data.add_series('S', [1])
|
|
195
|
+
chart = s.shapes.add_chart(XL_CHART_TYPE.COLUMN_CLUSTERED, 0, 0, 1000000, 1000000, data)
|
|
196
|
+
s.shapes.add_group_shape([chart])
|
|
197
|
+
with self.assertRaises(SystemExit): module('powerpoint', 'pptx_edit').duplicate_slide(prs, 0)
|
|
198
|
+
|
|
199
|
+
def test_render_returns_only_current_generation(self):
|
|
200
|
+
out = self.dir / 'render'; out.mkdir(); (out / 'slide-99.png').write_bytes(b'stale')
|
|
201
|
+
renderer = module('powerpoint', 'pptx_render')
|
|
202
|
+
def fake_run(cmd, **kwargs):
|
|
203
|
+
if '--outdir' in cmd: (Path(cmd[cmd.index('--outdir') + 1]) / 'deck.pdf').write_bytes(b'pdf')
|
|
204
|
+
else: Path(cmd[-1] + '-1.png').write_bytes(b'current')
|
|
205
|
+
return subprocess.CompletedProcess(cmd, 0, '', '')
|
|
206
|
+
with patch.object(renderer, 'find_tools', return_value=('soffice', 'pdftoppm', [])), patch.object(renderer.subprocess, 'run', side_effect=fake_run):
|
|
207
|
+
result = renderer.render('deck.pptx', str(out), 'slide', 100)
|
|
208
|
+
self.assertEqual(len(result['files']), 1)
|
|
209
|
+
self.assertEqual(Path(result['files'][0]).read_bytes(), b'current')
|
|
210
|
+
|
|
211
|
+
def test_pdf_reverse_and_empty_ranges_are_errors(self):
|
|
212
|
+
for name in ('pdf_page_image', 'pdf_stamp'):
|
|
213
|
+
helper = module('pdf', name)
|
|
214
|
+
for value in ('3-1', '', '0-0'):
|
|
215
|
+
with self.assertRaises(ValueError): helper.parse_pages(value, 3)
|
|
216
|
+
|
|
217
|
+
def test_docx_strict_template_failure_does_not_publish(self):
|
|
218
|
+
src = self.dir / 'in.docx'; out = self.dir / 'out.docx'; values = self.dir / 'values.json'
|
|
219
|
+
d = Document(); d.add_paragraph('{{missing}}'); d.save(src); values.write_text('{}')
|
|
220
|
+
self.assertNotEqual(self.cli('docx', 'docx_template', src, values, out, '--strict').returncode, 0)
|
|
221
|
+
self.assertFalse(out.exists())
|
|
222
|
+
|
|
223
|
+
def test_docx_linked_headers_are_not_modified_twice(self):
|
|
224
|
+
d = Document(); d.sections[0].header.paragraphs[0].text = 'x'; d.add_section()
|
|
225
|
+
common = module('docx', 'docx_common')
|
|
226
|
+
for paragraph in common.iter_all_paragraphs(d): common.replace_in_paragraph(paragraph, 'x', 'xx')
|
|
227
|
+
self.assertEqual(d.sections[0].header.paragraphs[0].text, 'xx')
|
|
228
|
+
|
|
229
|
+
def test_table_append_cannot_overwrite_cells_or_leave_stale_filter(self):
|
|
230
|
+
w = Workbook(); s = w.active; s.append(['name']); s.append(['first'])
|
|
231
|
+
table = Table(displayName='Items', ref='A1:A2'); s.add_table(table)
|
|
232
|
+
src = self.dir / 'table.xlsx'; w.save(src); s = load_workbook(src).active
|
|
233
|
+
edit = module('xlsx', 'xlsx_edit'); s['A3'] = 'existing'
|
|
234
|
+
with self.assertRaises(ValueError): edit.table_append(s, 'Items', ['second'])
|
|
235
|
+
s['A3'] = None; edit.table_append(s, 'Items', ['second'])
|
|
236
|
+
self.assertEqual(s.tables['Items'].autoFilter.ref, 'A1:A3')
|
|
237
|
+
|
|
238
|
+
def test_pymupdf_page_selection_applies_to_tables(self):
|
|
239
|
+
import types
|
|
240
|
+
helper = module('pdf', 'extract_pymupdf'); visited = []
|
|
241
|
+
class Page:
|
|
242
|
+
def __init__(self, number): self.number = number
|
|
243
|
+
def find_tables(self): visited.append(self.number); return types.SimpleNamespace(tables=[])
|
|
244
|
+
with patch.dict(sys.modules, {'pymupdf': types.SimpleNamespace(open=lambda p: [Page(0), Page(1)])}):
|
|
245
|
+
helper.extract_tables('fake.pdf', pages=[1])
|
|
246
|
+
self.assertEqual(visited, [1])
|
|
247
|
+
|
|
248
|
+
def test_marker_json_renderer_and_pil_image_output(self):
|
|
249
|
+
import types
|
|
250
|
+
helper = module('pdf', 'extract_marker'); options = []
|
|
251
|
+
class Config:
|
|
252
|
+
def __init__(self, config): options.append(config)
|
|
253
|
+
def generate_config_dict(self): return options[-1]
|
|
254
|
+
def get_renderer(self): return 'renderer'
|
|
255
|
+
def get_processors(self): return []
|
|
256
|
+
def get_llm_service(self): return None
|
|
257
|
+
rendered = types.SimpleNamespace(model_dump=lambda: {'children': [{'text': 'hello'}]})
|
|
258
|
+
def converter(**kwargs):
|
|
259
|
+
self.assertEqual(kwargs.get('renderer'), 'renderer')
|
|
260
|
+
return lambda path: rendered
|
|
261
|
+
modules = {'marker.converters.pdf': types.SimpleNamespace(PdfConverter=converter),
|
|
262
|
+
'marker.models': types.SimpleNamespace(create_model_dict=lambda: {}),
|
|
263
|
+
'marker.config.parser': types.SimpleNamespace(ConfigParser=Config),
|
|
264
|
+
'marker.output': types.SimpleNamespace(text_from_rendered=lambda obj: ('', 'json', {'image.png': Image.new('RGB', (3, 3))}))}
|
|
265
|
+
output = io.StringIO()
|
|
266
|
+
with patch.dict(sys.modules, modules), contextlib.redirect_stdout(output): helper.convert('fake.pdf', str(self.dir), 'json')
|
|
267
|
+
self.assertEqual(json.loads(output.getvalue())['children'][0]['text'], 'hello')
|
|
268
|
+
self.assertTrue((self.dir / 'image.png').exists())
|
|
269
|
+
|
|
270
|
+
|
|
271
|
+
if __name__ == '__main__':
|
|
272
|
+
unittest.main()
|
|
@@ -38,7 +38,7 @@ metadata:
|
|
|
38
38
|
- risk-coverage-3plus # cast covers ≥3 risk dimensions (capital/tech/market/org/compliance)
|
|
39
39
|
- grounding-substring # every quote is a substring of a real search snippet (code-checked)
|
|
40
40
|
- brief-boundary # no persona asserts company facts beyond the Brief
|
|
41
|
-
- honest-degradation # ungroundable
|
|
41
|
+
- honest-degradation # ungroundable candidates are dropped; never fabricate quotes
|
|
42
42
|
---
|
|
43
43
|
|
|
44
44
|
# Persona Generator
|
|
@@ -163,7 +163,7 @@ the cloud `/api/im/councils/plan` handler after you hand over the cast.
|
|
|
163
163
|
allowed only for *structural* checks (two people on one position? invented
|
|
164
164
|
names? missing insider view?), never for factual ones.
|
|
165
165
|
|
|
166
|
-
### Step 3 —
|
|
166
|
+
### Step 3 — Handle grounding failures (current searched-only contract)
|
|
167
167
|
|
|
168
168
|
> ⚠️ This tiering is applied by the cloud grounding step, not by you — it is
|
|
169
169
|
> shown here so you understand what happens to your candidates. You never set
|
|
@@ -176,13 +176,13 @@ The criterion is "**can it be found by search?**" — programmatically checkable
|
|
|
176
176
|
| Condition | Strategy | `groundingSource` |
|
|
177
177
|
| --- | --- | --- |
|
|
178
178
|
| Name + topic co-occur in one sentence of a snippet | Use its verbatim substring as the quote | `searched` |
|
|
179
|
-
| Not searchable,
|
|
180
|
-
|
|
|
179
|
+
| Not searchable, including user-material-only candidates | Returned in `droppedCast[]`; propose a different verifiable candidate or ask for a changed roster | not accepted |
|
|
180
|
+
| No candidate can be verified | Stop the proposal and explain the missing evidence; do not fabricate personas | not accepted |
|
|
181
181
|
|
|
182
|
-
`
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
182
|
+
`user_materials` and `role_label` are not current accepted fallback tiers.
|
|
183
|
+
Do not set either yourself or claim the cloud accepted them. A conceptual
|
|
184
|
+
role-label discussion can be separately requested, but is not this real-agent
|
|
185
|
+
council workflow. Never fabricate quotes to keep a famous name.
|
|
186
186
|
|
|
187
187
|
### Step 4 — Icon acquisition (cloud-executed; you only reference the result)
|
|
188
188
|
|
|
@@ -263,7 +263,7 @@ below are eval judgements (semantic classification):
|
|
|
263
263
|
| Risk coverage | cast covers ≥3 of: capital / tech / market / org / compliance |
|
|
264
264
|
| Grounding real | every quote is a snippet substring + same-sentence co-occurrence (code check) |
|
|
265
265
|
| Brief boundary | no persona asserts company facts beyond the Brief |
|
|
266
|
-
| Honest degradation | unsearchable → `
|
|
266
|
+
| Honest degradation | unsearchable → `droppedCast[]`, substitute or stop; never fabricate a quote |
|
|
267
267
|
|
|
268
268
|
## Promote escape hatch
|
|
269
269
|
|
|
@@ -3,6 +3,7 @@ name: pkf-svg
|
|
|
3
3
|
scope: common
|
|
4
4
|
description: 'Design controlled SVG, visual widgets, topology and Visual Core explainers with semantic color, safe geometry, accessibility, and bounded complexity. Use for an explicitly supported SVG/widget surface or to plan PKF visuals. PKF v1.1 has no production inline-SVG authoring surface (diagrams are Mermaid, data charts are d3); v1.2 controlled prismer-svg (pkf209 D19) is activated for PKF source authoring within the frozen validator whitelist.'
|
|
5
5
|
metadata:
|
|
6
|
+
nativeReplaces: [architecture-diagram]
|
|
6
7
|
aliases:
|
|
7
8
|
- pkf-visual
|
|
8
9
|
---
|
|
@@ -251,3 +252,7 @@ Light mode = 50 fill + 600 stroke + 800 title; dark = 800 fill + 200 stroke
|
|
|
251
252
|
- Color has semantic meaning plus a text cue; each visual group remains ≤2?
|
|
252
253
|
- One reading direction, boundary anchors, no clipping, stable peer rhythm?
|
|
253
254
|
- Unsafe tags/attributes/external references absent; fallback remains readable?
|
|
255
|
+
|
|
256
|
+
## Architecture diagram resource pack
|
|
257
|
+
|
|
258
|
+
Read [the architecture method](references/architecture-diagram/GUIDE.md) and adapt [its standalone HTML template](references/architecture-diagram/templates/template.html) for explicit architecture artifact requests. Preserve semantic boundaries, readable labels and legends outside all system boundaries. This HTML asset is not inline PKF: for PKF, use the native whitelist and geometry above, not HTML/defs/markers. Choose light/dark according to the existing project, use local fonts, and verify every connection and boundary before delivery.
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: architecture-diagram
|
|
3
|
+
description: "Dark-themed SVG architecture/cloud/infra diagrams as HTML."
|
|
4
|
+
version: 1.0.0
|
|
5
|
+
author: Cocoon AI (hello@cocoon-ai.com), ported by Hermes Agent
|
|
6
|
+
license: MIT
|
|
7
|
+
dependencies: []
|
|
8
|
+
platforms: [linux, macos, windows]
|
|
9
|
+
metadata:
|
|
10
|
+
hermes:
|
|
11
|
+
tags: [architecture, diagrams, SVG, HTML, visualization, infrastructure, cloud]
|
|
12
|
+
related_skills: [concept-diagrams, excalidraw]
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
# Architecture Diagram Skill
|
|
16
|
+
|
|
17
|
+
Generate professional, dark-themed technical architecture diagrams as standalone HTML files with inline SVG graphics. No external tools, no API keys, no rendering libraries — just write the HTML file and open it in a browser.
|
|
18
|
+
|
|
19
|
+
## Scope
|
|
20
|
+
|
|
21
|
+
**Best suited for:**
|
|
22
|
+
- Software system architecture (frontend / backend / database layers)
|
|
23
|
+
- Cloud infrastructure (VPC, regions, subnets, managed services)
|
|
24
|
+
- Microservice / service-mesh topology
|
|
25
|
+
- Database + API map, deployment diagrams
|
|
26
|
+
- Anything with a tech-infra subject that fits a dark, grid-backed aesthetic
|
|
27
|
+
|
|
28
|
+
**Look elsewhere first for:**
|
|
29
|
+
- Physics, chemistry, math, biology, or other scientific subjects
|
|
30
|
+
- Physical objects (vehicles, hardware, anatomy, cross-sections)
|
|
31
|
+
- Floor plans, narrative journeys, educational / textbook-style visuals
|
|
32
|
+
- Hand-drawn whiteboard sketches (consider `excalidraw`)
|
|
33
|
+
- Animated explainers (consider an animation skill)
|
|
34
|
+
|
|
35
|
+
If a more specialized skill is available for the subject, prefer that. If none fits, this skill can also serve as a general SVG diagram fallback — the output will just carry the dark tech aesthetic described below.
|
|
36
|
+
|
|
37
|
+
Based on [Cocoon AI's architecture-diagram-generator](https://github.com/Cocoon-AI/architecture-diagram-generator) (MIT).
|
|
38
|
+
|
|
39
|
+
## Workflow
|
|
40
|
+
|
|
41
|
+
1. User describes their system architecture (components, connections, technologies)
|
|
42
|
+
2. Generate the HTML file following the design system below
|
|
43
|
+
3. Save with `write_file` to a `.html` file (e.g. `~/architecture-diagram.html`)
|
|
44
|
+
4. User opens in any browser — works offline, no dependencies
|
|
45
|
+
|
|
46
|
+
### Output Location
|
|
47
|
+
|
|
48
|
+
Save diagrams to a user-specified path, or default to the current working directory:
|
|
49
|
+
```
|
|
50
|
+
./[project-name]-architecture.html
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
### Preview
|
|
54
|
+
|
|
55
|
+
After saving, suggest the user open it:
|
|
56
|
+
```bash
|
|
57
|
+
# macOS
|
|
58
|
+
open ./my-architecture.html
|
|
59
|
+
# Linux
|
|
60
|
+
xdg-open ./my-architecture.html
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
## Design System & Visual Language
|
|
64
|
+
|
|
65
|
+
### Color Palette (Semantic Mapping)
|
|
66
|
+
|
|
67
|
+
Use specific `rgba` fills and hex strokes to categorize components:
|
|
68
|
+
|
|
69
|
+
| Component Type | Fill (rgba) | Stroke (Hex) |
|
|
70
|
+
| :--- | :--- | :--- |
|
|
71
|
+
| **Frontend** | `rgba(8, 51, 68, 0.4)` | `#22d3ee` (cyan-400) |
|
|
72
|
+
| **Backend** | `rgba(6, 78, 59, 0.4)` | `#34d399` (emerald-400) |
|
|
73
|
+
| **Database** | `rgba(76, 29, 149, 0.4)` | `#a78bfa` (violet-400) |
|
|
74
|
+
| **AWS/Cloud** | `rgba(120, 53, 15, 0.3)` | `#fbbf24` (amber-400) |
|
|
75
|
+
| **Security** | `rgba(136, 19, 55, 0.4)` | `#fb7185` (rose-400) |
|
|
76
|
+
| **Message Bus** | `rgba(251, 146, 60, 0.3)` | `#fb923c` (orange-400) |
|
|
77
|
+
| **External** | `rgba(30, 41, 59, 0.5)` | `#94a3b8` (slate-400) |
|
|
78
|
+
|
|
79
|
+
### Typography & Background
|
|
80
|
+
- **Font:** local ui-monospace; use a licensed bundled font if exact typography is required.
|
|
81
|
+
- **Sizes:** minimum 11px in the diagram coordinate system. Keep a scrollable unscaled diagram on narrow screens; verify label width.
|
|
82
|
+
- **Background:** choose the existing product's light or dark theme; the supplied standalone example uses a dark diagram canvas with a system-theme page.
|
|
83
|
+
|
|
84
|
+
```svg
|
|
85
|
+
<!-- Background Grid Pattern -->
|
|
86
|
+
<pattern id="grid" width="40" height="40" patternUnits="userSpaceOnUse">
|
|
87
|
+
<path d="M 40 0 L 0 0 0 40" fill="none" stroke="#1e293b" stroke-width="0.5"/>
|
|
88
|
+
</pattern>
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
## Technical Implementation Details
|
|
92
|
+
|
|
93
|
+
### Component Rendering
|
|
94
|
+
Components are rounded rectangles (`rx="6"`) with 1.5px strokes. To prevent arrows from showing through semi-transparent fills, use a **double-rect masking technique**:
|
|
95
|
+
1. Draw an opaque background rect (`#0f172a`)
|
|
96
|
+
2. Draw the semi-transparent styled rect on top
|
|
97
|
+
|
|
98
|
+
### Connection Rules
|
|
99
|
+
- **Z-Order:** Draw arrows *early* in the SVG (after the grid) so they render behind component boxes
|
|
100
|
+
- **Arrowheads:** Defined via SVG markers
|
|
101
|
+
- **Security Flows:** Use dashed lines in rose color (`#fb7185`)
|
|
102
|
+
- **Boundaries:**
|
|
103
|
+
- *Security Groups:* Dashed (`4,4`), rose color
|
|
104
|
+
- *Regions:* Large dashed (`8,4`), amber color, `rx="12"`
|
|
105
|
+
|
|
106
|
+
### Spacing & Layout Logic
|
|
107
|
+
- **Standard Height:** 60px (Services); 80-120px (Large components)
|
|
108
|
+
- **Vertical Gap:** Minimum 40px between components
|
|
109
|
+
- **Message Buses:** Must be placed *in the gap* between services, not overlapping them
|
|
110
|
+
- **Legend Placement:** **CRITICAL.** Must be placed outside all boundary boxes. Calculate the lowest Y-coordinate of all boundaries and place the legend at least 20px below it.
|
|
111
|
+
|
|
112
|
+
## Document Structure
|
|
113
|
+
|
|
114
|
+
The generated HTML file follows a four-part layout:
|
|
115
|
+
1. **Header:** Title with an optional static category indicator and subtitle
|
|
116
|
+
2. **Main SVG:** A readable, horizontally scrollable diagram surface
|
|
117
|
+
3. **Summary Cards:** A grid of three cards below the diagram for high-level details
|
|
118
|
+
4. **Footer:** Minimal metadata
|
|
119
|
+
|
|
120
|
+
### Info Card Pattern
|
|
121
|
+
```html
|
|
122
|
+
<div class="card">
|
|
123
|
+
<div class="card-header">
|
|
124
|
+
<div class="card-dot cyan"></div>
|
|
125
|
+
<h3>Title</h3>
|
|
126
|
+
</div>
|
|
127
|
+
<ul>
|
|
128
|
+
<li>• Item one</li>
|
|
129
|
+
<li>• Item two</li>
|
|
130
|
+
</ul>
|
|
131
|
+
</div>
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
## Output Requirements
|
|
135
|
+
- **Single File:** One self-contained `.html` file
|
|
136
|
+
- **No External Dependencies:** All CSS and SVG must be inline (except Google Fonts)
|
|
137
|
+
- **No JavaScript:** Use pure CSS for any animations (like pulsing dots)
|
|
138
|
+
- **Compatibility:** Must render correctly in any modern web browser
|
|
139
|
+
|
|
140
|
+
## Template Reference
|
|
141
|
+
|
|
142
|
+
Load the full HTML template for the exact structure, CSS, and SVG component examples:
|
|
143
|
+
|
|
144
|
+
```
|
|
145
|
+
skill_view(name="architecture-diagram", file_path="templates/template.html")
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
The template contains working examples of every component type (frontend, backend, database, cloud, security), arrow styles (standard, dashed, curved), security groups, region boundaries, and the legend — use it as your structural reference when generating diagrams.
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 Nous Research
|
|
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,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 Nous Research
|
|
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,7 @@
|
|
|
1
|
+
# Resource provenance
|
|
2
|
+
|
|
3
|
+
Imported from hermes-agent skills/creative/architecture-diagram at 1a1f4a59e252e1dc0137e7b2e7bcc8b0381d19c4.
|
|
4
|
+
|
|
5
|
+
Prismer receiver: pkf-svg. Native replacement: architecture-diagram; this is not an alias. Preserve all source resources at their relative paths; merge packs live under references/architecture-diagram/. Source file hashes and content review: docs/bugfix223/audit-creative-media-coverage.json. Local corrections and remaining live acceptance: docs/bugfix223/implementation-creative.md.
|
|
6
|
+
|
|
7
|
+
LICENSE.hermes preserves Nous Research MIT terms. External libraries, fonts, services and media have separate licenses; no third-party binary assets were included.
|