jumpstart-mode 1.1.13 → 1.1.14
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/.agents/rules/jumpstart-framework.md +28 -0
- package/.cursor/rules/jumpstart-framework.mdc +31 -0
- package/.cursorrules +29 -23
- package/.github/ISSUE_TEMPLATE/agent-task.yml +66 -0
- package/.github/ISSUE_TEMPLATE/bug-report.yml +29 -0
- package/.github/ISSUE_TEMPLATE/feature-request.yml +34 -0
- package/.github/agents/jumpstart-adversary.agent.md +10 -0
- package/.github/agents/jumpstart-analyst.agent.md +40 -1
- package/.github/agents/jumpstart-architect.agent.md +53 -1
- package/.github/agents/jumpstart-autonav.agent.md +76 -0
- package/.github/agents/jumpstart-challenger.agent.md +34 -1
- package/.github/agents/jumpstart-developer.agent.md +48 -1
- package/.github/agents/jumpstart-devops.agent.md +11 -0
- package/.github/agents/jumpstart-diagram-verifier.agent.md +2 -0
- package/.github/agents/jumpstart-maintenance.agent.md +10 -0
- package/.github/agents/jumpstart-performance.agent.md +10 -0
- package/.github/agents/jumpstart-pitcrew.agent.md +2 -0
- package/.github/agents/jumpstart-pm.agent.md +41 -1
- package/.github/agents/jumpstart-qa.agent.md +10 -0
- package/.github/agents/jumpstart-quick-dev.agent.md +12 -0
- package/.github/agents/jumpstart-refactor.agent.md +9 -0
- package/.github/agents/jumpstart-requirements-extractor.agent.md +10 -0
- package/.github/agents/jumpstart-researcher.agent.md +9 -0
- package/.github/agents/jumpstart-retrospective.agent.md +10 -0
- package/.github/agents/jumpstart-reviewer.agent.md +9 -0
- package/.github/agents/jumpstart-scout.agent.md +32 -0
- package/.github/agents/jumpstart-scrum-master.agent.md +11 -0
- package/.github/agents/jumpstart-security.agent.md +10 -0
- package/.github/agents/jumpstart-tech-writer.agent.md +9 -0
- package/.github/agents/jumpstart-uiux-designer.agent.md +13 -1
- package/.github/agents/test agent.agent.md +0 -0
- package/.github/copilot-instructions.md +41 -0
- package/.github/hooks/README.md +90 -0
- package/.github/hooks/ambiguity-detector.js +84 -0
- package/.github/hooks/autonav.json +148 -0
- package/.github/hooks/block-agent-self-modification.js +72 -0
- package/.github/hooks/capture-plan.js +97 -0
- package/.github/hooks/dangerous-operation-escalator.js +92 -0
- package/.github/hooks/dependency-risk-precheck.js +53 -0
- package/.github/hooks/draft-changelog.js +137 -0
- package/.github/hooks/enforce-test-cochange.js +112 -0
- package/.github/hooks/inject-adr-context.js +136 -0
- package/.github/hooks/lib/common.js +293 -0
- package/.github/hooks/phase-boundary-guard.js +135 -0
- package/.github/hooks/phase-gate-status.js +91 -0
- package/.github/hooks/pre-compact.js +135 -0
- package/.github/hooks/prompt-classifier.js +66 -0
- package/.github/hooks/qa-log-capture.js +170 -0
- package/.github/hooks/retry-escalation.js +93 -0
- package/.github/hooks/schema-on-write-validator.js +105 -0
- package/.github/hooks/secrets-path-blocker.js +63 -0
- package/.github/hooks/session-analytics.js +159 -0
- package/.github/hooks/session-start.js +93 -0
- package/.github/hooks/simplicity-gate-guard.js +77 -0
- package/.github/hooks/skill-context-injector.js +185 -0
- package/.github/hooks/spec-drift-guard.js +97 -0
- package/.github/hooks/spec-graph-updater.js +94 -0
- package/.github/hooks/spec-traceability-validator.js +178 -0
- package/.github/hooks/timeline-warmup.js +86 -0
- package/.github/hooks/upstream-spec-guard.js +120 -0
- package/.github/hooks/workspace-fingerprint.js +95 -0
- package/.github/instructions/agents-spec-interaction.instructions.md +64 -0
- package/.github/instructions/agents.instructions.md +14 -0
- package/.github/instructions/hooks.instructions.md +14 -0
- package/.github/instructions/source.instructions.md +15 -0
- package/.github/instructions/specs.instructions.md +19 -0
- package/.github/instructions/testing.instructions.md +15 -0
- package/.github/prompts/jumpstart-autonav.prompt.md +19 -0
- package/.github/skills/acceptance-test-author/SKILL.md +246 -0
- package/.github/skills/acceptance-test-author/evals/evals.json +114 -0
- package/.github/skills/acceptance-test-author/references/ai-test-patterns.md +276 -0
- package/.github/skills/acceptance-test-author/references/gherkin-style-guide.md +285 -0
- package/.github/skills/acceptance-test-author/references/scenario-design-patterns.md +245 -0
- package/.github/skills/acceptance-test-author/references/traceability-template.md +73 -0
- package/.github/skills/acquire-codebase-knowledge/SKILL.md +174 -0
- package/.github/skills/acquire-codebase-knowledge/assets/templates/ARCHITECTURE.md +49 -0
- package/.github/skills/acquire-codebase-knowledge/assets/templates/CONCERNS.md +56 -0
- package/.github/skills/acquire-codebase-knowledge/assets/templates/CONVENTIONS.md +52 -0
- package/.github/skills/acquire-codebase-knowledge/assets/templates/INTEGRATIONS.md +48 -0
- package/.github/skills/acquire-codebase-knowledge/assets/templates/STACK.md +56 -0
- package/.github/skills/acquire-codebase-knowledge/assets/templates/STRUCTURE.md +44 -0
- package/.github/skills/acquire-codebase-knowledge/assets/templates/TESTING.md +57 -0
- package/.github/skills/acquire-codebase-knowledge/references/inquiry-checkpoints.md +70 -0
- package/.github/skills/acquire-codebase-knowledge/references/stack-detection.md +131 -0
- package/.github/skills/acquire-codebase-knowledge/scripts/scan.py +712 -0
- package/.github/skills/agent-approval-policy-spec/README.md +27 -0
- package/.github/skills/agent-approval-policy-spec/SKILL.md +138 -0
- package/.github/skills/agent-approval-policy-spec/evals/evals.json +29 -0
- package/.github/skills/agent-approval-policy-spec/examples/operations-approval-policy-example.md +21 -0
- package/.github/skills/agent-approval-policy-spec/examples/support-approval-policy-example.md +21 -0
- package/.github/skills/agent-approval-policy-spec/references/approval-policy-patterns.md +31 -0
- package/.github/skills/agent-approval-policy-spec/references/audit-field-minimum.md +20 -0
- package/.github/skills/agent-approval-policy-spec/references/decision-class-taxonomy.md +29 -0
- package/.github/skills/agent-approval-policy-spec/references/override-governance.md +23 -0
- package/.github/skills/agent-approval-policy-spec/templates/approval-policy.example.yaml +39 -0
- package/.github/skills/agent-approval-policy-spec/templates/approval-policy.schema.json +60 -0
- package/.github/skills/agent-approval-policy-spec/templates/decision-class-matrix.csv +4 -0
- package/.github/skills/agent-customization/SKILL.md +78 -0
- package/.github/skills/agent-customization/references/agents.md +111 -0
- package/.github/skills/agent-customization/references/hooks.md +96 -0
- package/.github/skills/agent-customization/references/instructions.md +71 -0
- package/.github/skills/agent-customization/references/prompts.md +80 -0
- package/.github/skills/agent-customization/references/skills.md +100 -0
- package/.github/skills/agent-customization/references/workspace-instructions.md +66 -0
- package/.github/skills/agent-prd-writer/SKILL.md +85 -0
- package/.github/skills/agent-prd-writer/evals/evals.json +17 -0
- package/.github/skills/agent-prd-writer/references/prd-pattern.md +21 -0
- package/.github/skills/agent-tool-catalog-designer/SKILL.md +107 -0
- package/.github/skills/agent-tool-catalog-designer/evals/evals.json +32 -0
- package/.github/skills/agent-tool-catalog-designer/examples/example-it-helpdesk-agent.md +57 -0
- package/.github/skills/agent-tool-catalog-designer/references/tool-design-patterns.md +60 -0
- package/.github/skills/agent-tool-catalog-designer/templates/tool-catalog.md +43 -0
- package/.github/skills/agent-tool-catalog-designer/templates/tool-spec.md +68 -0
- package/.github/skills/agent-workflow-state-machine/SKILL.md +172 -0
- package/.github/skills/agent-workflow-state-machine/evals/evals.json +44 -0
- package/.github/skills/agent-workflow-state-machine/examples/jumpstart-client-recap-example.md +55 -0
- package/.github/skills/agent-workflow-state-machine/references/guardrails-retries-approvals.md +75 -0
- package/.github/skills/agent-workflow-state-machine/references/state-machine-design-guide.md +77 -0
- package/.github/skills/agent-workflow-state-machine/templates/agent-workflow-state-machine.mmd +42 -0
- package/.github/skills/agent-workflow-state-machine/templates/agent-workflow-state-machine.yaml +113 -0
- package/.github/skills/agent-workflow-state-machine/templates/human-approval-matrix.md +15 -0
- package/.github/skills/agent-workflow-state-machine/templates/state-transition-table.csv +9 -0
- package/.github/skills/ai-cost-model-designer/SKILL.md +100 -0
- package/.github/skills/ai-cost-model-designer/evals/evals.json +31 -0
- package/.github/skills/ai-cost-model-designer/examples/example-support-copilot-cost-model.md +51 -0
- package/.github/skills/ai-cost-model-designer/references/cost-components.md +94 -0
- package/.github/skills/ai-cost-model-designer/references/cost-lever-catalog.md +44 -0
- package/.github/skills/ai-cost-model-designer/templates/cost-model.md +60 -0
- package/.github/skills/ai-team-orchestration/SKILL.md +148 -0
- package/.github/skills/ai-team-orchestration/references/anti-patterns.md +48 -0
- package/.github/skills/ai-team-orchestration/references/brainstorm-format.md +94 -0
- package/.github/skills/ai-team-orchestration/references/project-brief-template.md +147 -0
- package/.github/skills/ai-team-orchestration/references/sprint-plan-template.md +140 -0
- package/.github/skills/ai-use-case-readiness-assessor/SKILL.md +112 -0
- package/.github/skills/ai-use-case-readiness-assessor/evals/evals.json +47 -0
- package/.github/skills/ai-use-case-readiness-assessor/evals/files/readiness-board-strategy-agent.md +27 -0
- package/.github/skills/ai-use-case-readiness-assessor/evals/files/readiness-maintenance-copilot.md +32 -0
- package/.github/skills/ai-use-case-readiness-assessor/evals/files/readiness-prior-auth-triage.md +29 -0
- package/.github/skills/ai-use-case-readiness-assessor/examples/ai-readiness-examples.md +40 -0
- package/.github/skills/ai-use-case-readiness-assessor/references/output-template.md +65 -0
- package/.github/skills/ai-use-case-readiness-assessor/references/readiness-model.md +92 -0
- package/.github/skills/api-contract-test-generator/SKILL.md +76 -0
- package/.github/skills/api-contract-test-generator/evals/evals.json +74 -0
- package/.github/skills/api-contract-test-generator/examples/openapi-to-pytest-example.md +17 -0
- package/.github/skills/api-contract-test-generator/references/ci-gating.md +27 -0
- package/.github/skills/api-contract-test-generator/references/contract-test-strategy.md +26 -0
- package/.github/skills/api-contract-test-generator/references/test-case-taxonomy.md +29 -0
- package/.github/skills/api-contract-test-generator/scripts/assertion_runner.py +27 -0
- package/.github/skills/api-contract-test-generator/templates/contract-test-matrix.md +7 -0
- package/.github/skills/api-contract-test-generator/templates/dotnet-xunit-contract-suite.cs +54 -0
- package/.github/skills/api-contract-test-generator/templates/node-jest-contract-suite.ts +36 -0
- package/.github/skills/api-contract-test-generator/templates/pytest-contract-suite.py +33 -0
- package/.github/skills/api-contract-test-generator/templates/python-contract-suite.py +32 -0
- package/.github/skills/api-creator/SKILL.md +246 -0
- package/.github/skills/api-creator/evals/evals.json +97 -0
- package/.github/skills/api-creator/examples/agent-tool-api.md +38 -0
- package/.github/skills/api-creator/examples/multi-tenant-saas-api.md +30 -0
- package/.github/skills/api-creator/examples/restaurant-deals-api.md +40 -0
- package/.github/skills/api-creator/examples/square-integration-api.md +34 -0
- package/.github/skills/api-creator/examples/webhook-receiver-api.md +38 -0
- package/.github/skills/api-creator/references/agent-friendly-api-guide.md +53 -0
- package/.github/skills/api-creator/references/auth-guide.md +69 -0
- package/.github/skills/api-creator/references/error-model-guide.md +64 -0
- package/.github/skills/api-creator/references/fastapi-patterns.md +58 -0
- package/.github/skills/api-creator/references/openapi-guide.md +75 -0
- package/.github/skills/api-creator/references/pagination-guide.md +63 -0
- package/.github/skills/api-creator/references/production-readiness.md +53 -0
- package/.github/skills/api-creator/references/rest-design-guide.md +98 -0
- package/.github/skills/api-creator/references/webhook-guide.md +63 -0
- package/.github/skills/api-creator/scripts/assertion_runner.py +30 -0
- package/.github/skills/api-creator/templates/alembic-env.py +42 -0
- package/.github/skills/api-creator/templates/docker-compose.yml +26 -0
- package/.github/skills/api-creator/templates/fastapi-main.py +43 -0
- package/.github/skills/api-creator/templates/fastapi-repository.py +24 -0
- package/.github/skills/api-creator/templates/fastapi-route.py +30 -0
- package/.github/skills/api-creator/templates/fastapi-service.py +20 -0
- package/.github/skills/api-creator/templates/openapi-template.yaml +140 -0
- package/.github/skills/api-creator/templates/pydantic-schema.py +30 -0
- package/.github/skills/api-creator/templates/pytest-api-test.py +27 -0
- package/.github/skills/api-creator/templates/sqlmodel-model.py +27 -0
- package/.github/skills/api-reviewer/SKILL.md +76 -0
- package/.github/skills/api-reviewer/evals/evals.json +74 -0
- package/.github/skills/api-reviewer/examples/sample-review-output.md +22 -0
- package/.github/skills/api-reviewer/references/compatibility-checks.md +31 -0
- package/.github/skills/api-reviewer/references/review-checklist.md +41 -0
- package/.github/skills/api-reviewer/references/severity-model.md +23 -0
- package/.github/skills/api-reviewer/scripts/assertion_runner.py +27 -0
- package/.github/skills/api-reviewer/templates/api-review-report-template.md +28 -0
- package/.github/skills/api-version-migration/SKILL.md +80 -0
- package/.github/skills/api-version-migration/evals/evals.json +74 -0
- package/.github/skills/api-version-migration/examples/v1-to-v2-migration-example.md +24 -0
- package/.github/skills/api-version-migration/references/change-classification.md +29 -0
- package/.github/skills/api-version-migration/references/deprecation-policy.md +23 -0
- package/.github/skills/api-version-migration/references/migration-strategies.md +25 -0
- package/.github/skills/api-version-migration/scripts/assertion_runner.py +27 -0
- package/.github/skills/api-version-migration/templates/client-compatibility-matrix.md +4 -0
- package/.github/skills/api-version-migration/templates/migration-plan-template.md +26 -0
- package/.github/skills/architecture-blueprint-generator/SKILL.md +121 -0
- package/.github/skills/architecture-blueprint-generator/evals/evals.json +42 -0
- package/.github/skills/architecture-blueprint-generator/examples/blueprint-outline-example.md +25 -0
- package/.github/skills/architecture-blueprint-generator/examples/finding-style-example.md +29 -0
- package/.github/skills/architecture-blueprint-generator/references/analysis-checkpoints.md +61 -0
- package/.github/skills/architecture-blueprint-generator/references/decision-records.md +41 -0
- package/.github/skills/architecture-blueprint-generator/references/diagram-guidance.md +57 -0
- package/.github/skills/architecture-blueprint-generator/references/technology-patterns.md +83 -0
- package/.github/skills/architecture-blueprint-generator/references/workflow.md +81 -0
- package/.github/skills/architecture-blueprint-generator/templates/adr-template.md +31 -0
- package/.github/skills/architecture-blueprint-generator/templates/project-architecture-blueprint-template.md +114 -0
- package/.github/skills/atlassian-capture-tasks-from-meeting-notes/SKILL.md +679 -0
- package/.github/skills/atlassian-capture-tasks-from-meeting-notes/references/action-item-patterns.md +445 -0
- package/.github/skills/atlassian-generate-status-report/SKILL.md +335 -0
- package/.github/skills/atlassian-generate-status-report/references/jql-patterns.md +82 -0
- package/.github/skills/atlassian-generate-status-report/references/report-templates.md +120 -0
- package/.github/skills/atlassian-generate-status-report/scripts/jql_builder.py +225 -0
- package/.github/skills/atlassian-search-company-knowledge/SKILL.md +575 -0
- package/.github/skills/atlassian-spec-to-backlog/SKILL.md +543 -0
- package/.github/skills/atlassian-spec-to-backlog/references/breakdown-examples.md +327 -0
- package/.github/skills/atlassian-spec-to-backlog/references/epic-templates.md +401 -0
- package/.github/skills/atlassian-spec-to-backlog/references/ticket-writing-guide.md +354 -0
- package/.github/skills/atlassian-triage-issue/SKILL.md +700 -0
- package/.github/skills/atlassian-triage-issue/references/bug-report-templates.md +451 -0
- package/.github/skills/atlassian-triage-issue/references/search-patterns.md +261 -0
- package/.github/skills/automate-this/SKILL.md +309 -0
- package/.github/skills/automate-this/evals/evals.json +73 -0
- package/.github/skills/automate-this/examples/automation-examples.md +311 -0
- package/.github/skills/automate-this/references/automation-patterns.md +476 -0
- package/.github/skills/automate-this/references/environment-detection.md +170 -0
- package/.github/skills/automate-this/references/security-credentials.md +280 -0
- package/.github/skills/automate-this/references/video-extraction.md +160 -0
- package/.github/skills/automate-this/templates/automation-proposal.md +99 -0
- package/.github/skills/automate-this/templates/environment-fingerprint.md +63 -0
- package/.github/skills/automate-this/templates/process-reconstruction.md +59 -0
- package/.github/skills/azure-architecture-autopilot/README.md +188 -0
- package/.github/skills/azure-architecture-autopilot/SKILL.md +170 -0
- package/.github/skills/azure-architecture-autopilot/assets/06-architecture-diagram.png +0 -0
- package/.github/skills/azure-architecture-autopilot/assets/07-azure-portal-resources.png +0 -0
- package/.github/skills/azure-architecture-autopilot/assets/08-deployment-succeeded.png +0 -0
- package/.github/skills/azure-architecture-autopilot/references/ai-data.md +254 -0
- package/.github/skills/azure-architecture-autopilot/references/architecture-guidance-sources.md +117 -0
- package/.github/skills/azure-architecture-autopilot/references/azure-common-patterns.md +170 -0
- package/.github/skills/azure-architecture-autopilot/references/azure-dynamic-sources.md +93 -0
- package/.github/skills/azure-architecture-autopilot/references/bicep-generator.md +421 -0
- package/.github/skills/azure-architecture-autopilot/references/bicep-reviewer.md +144 -0
- package/.github/skills/azure-architecture-autopilot/references/phase0-scanner.md +475 -0
- package/.github/skills/azure-architecture-autopilot/references/phase1-advisor.md +922 -0
- package/.github/skills/azure-architecture-autopilot/references/phase4-deployer.md +318 -0
- package/.github/skills/azure-architecture-autopilot/references/service-gotchas.md +113 -0
- package/.github/skills/azure-architecture-autopilot/scripts/cli.py +153 -0
- package/.github/skills/azure-architecture-autopilot/scripts/generator.py +2038 -0
- package/.github/skills/azure-architecture-autopilot/scripts/icons.py +3200 -0
- package/.github/skills/azure-devops-delivery-builder/README.md +36 -0
- package/.github/skills/azure-devops-delivery-builder/SKILL.md +197 -0
- package/.github/skills/azure-devops-delivery-builder/evals/evals.json +64 -0
- package/.github/skills/azure-devops-delivery-builder/examples/fixtures/backlog-items-smoke.json +35 -0
- package/.github/skills/azure-devops-delivery-builder/examples/jumpstart-to-ado-backlog-example.md +59 -0
- package/.github/skills/azure-devops-delivery-builder/references/acceptance-criteria-and-quality.md +54 -0
- package/.github/skills/azure-devops-delivery-builder/references/ado-traceability-and-pipelines.md +37 -0
- package/.github/skills/azure-devops-delivery-builder/references/ai-work-item-patterns.md +43 -0
- package/.github/skills/azure-devops-delivery-builder/references/backlog-decomposition.md +47 -0
- package/.github/skills/azure-devops-delivery-builder/references/jumpstart-and-pod-alignment.md +41 -0
- package/.github/skills/azure-devops-delivery-builder/references/process-templates.md +61 -0
- package/.github/skills/azure-devops-delivery-builder/references/wiql-and-reporting.md +80 -0
- package/.github/skills/azure-devops-delivery-builder/scripts/generate_azure_devops_csv.py +138 -0
- package/.github/skills/azure-devops-delivery-builder/scripts/smoke_test_csv_tools.py +56 -0
- package/.github/skills/azure-devops-delivery-builder/scripts/validate_azure_boards_backlog.py +105 -0
- package/.github/skills/azure-devops-delivery-builder/templates/ado-import-template.csv +5 -0
- package/.github/skills/azure-devops-delivery-builder/templates/backlog-items-template.json +48 -0
- package/.github/skills/azure-devops-delivery-builder/templates/bug-template.md +27 -0
- package/.github/skills/azure-devops-delivery-builder/templates/epic-template.md +36 -0
- package/.github/skills/azure-devops-delivery-builder/templates/feature-template.md +33 -0
- package/.github/skills/azure-devops-delivery-builder/templates/spike-template.md +26 -0
- package/.github/skills/azure-devops-delivery-builder/templates/story-pbi-template.md +35 -0
- package/.github/skills/azure-devops-delivery-builder/templates/task-template.md +18 -0
- package/.github/skills/azure-devops-execution/README.md +22 -0
- package/.github/skills/azure-devops-execution/SKILL.md +48 -0
- package/.github/skills/azure-devops-execution/scripts/import_csv_to_ado.py +144 -0
- package/.github/skills/azure-devops-execution/scripts/run_wiql.py +59 -0
- package/.github/skills/azure-pricing/SKILL.md +189 -0
- package/.github/skills/azure-pricing/references/COPILOT-STUDIO-RATES.md +135 -0
- package/.github/skills/azure-pricing/references/COST-ESTIMATOR.md +142 -0
- package/.github/skills/azure-pricing/references/REGIONS.md +84 -0
- package/.github/skills/azure-pricing/references/SERVICE-NAMES.md +106 -0
- package/.github/skills/bias-and-anti-pattern-checker/SKILL.md +89 -0
- package/.github/skills/bias-and-anti-pattern-checker/evals/evals.json +17 -0
- package/.github/skills/bias-and-anti-pattern-checker/references/anti-pattern-catalog.md +79 -0
- package/.github/skills/bottom-up-estimation/SKILL.md +182 -0
- package/.github/skills/bottom-up-estimation/evals/evals.json +41 -0
- package/.github/skills/bottom-up-estimation/references/ai-pod-adjustment-guide.md +46 -0
- package/.github/skills/bottom-up-estimation/references/estimation-methodology.md +132 -0
- package/.github/skills/bottom-up-estimation/references/output-package-guide.md +45 -0
- package/.github/skills/bottom-up-estimation/references/pod-tier-mapping.md +30 -0
- package/.github/skills/bottom-up-estimation/references/pricing-conversion-guide.md +27 -0
- package/.github/skills/bottom-up-estimation/templates/estimate-package-template.md +117 -0
- package/.github/skills/bottom-up-estimation/templates/estimation-worksheet-template.csv +16 -0
- package/.github/skills/business-logic-extractor/SKILL.md +79 -0
- package/.github/skills/business-logic-extractor/evals/evals.json +33 -0
- package/.github/skills/business-logic-extractor/evals/files/intake-workflow-notes.md +30 -0
- package/.github/skills/business-logic-extractor/evals/files/process-narrative.md +3 -0
- package/.github/skills/business-logic-extractor/references/logic-pattern.md +46 -0
- package/.github/skills/change-management-readiness/SKILL.md +80 -0
- package/.github/skills/change-management-readiness/evals/evals.json +30 -0
- package/.github/skills/change-management-readiness/references/adoption-risk-rubric.md +86 -0
- package/.github/skills/change-management-readiness/templates/change-readiness-scorecard-template.md +58 -0
- package/.github/skills/cloud-design-patterns/SKILL.md +62 -0
- package/.github/skills/cloud-design-patterns/references/architecture-design.md +127 -0
- package/.github/skills/cloud-design-patterns/references/azure-service-mappings.md +13 -0
- package/.github/skills/cloud-design-patterns/references/best-practices.md +34 -0
- package/.github/skills/cloud-design-patterns/references/deployment-operational.md +91 -0
- package/.github/skills/cloud-design-patterns/references/event-driven.md +21 -0
- package/.github/skills/cloud-design-patterns/references/messaging-integration.md +127 -0
- package/.github/skills/cloud-design-patterns/references/performance.md +180 -0
- package/.github/skills/cloud-design-patterns/references/reliability-resilience.md +156 -0
- package/.github/skills/cloud-design-patterns/references/security.md +55 -0
- package/.github/skills/code-tour/SKILL.md +433 -0
- package/.github/skills/code-tour/references/codetour-schema.json +115 -0
- package/.github/skills/code-tour/references/examples.md +195 -0
- package/.github/skills/code-tour/scripts/generate_from_docs.py +286 -0
- package/.github/skills/code-tour/scripts/validate_tour.py +346 -0
- package/.github/skills/company-research/SKILL.md +228 -0
- package/.github/skills/company-research/evals/evals.json +23 -0
- package/.github/skills/company-research/examples/sample.md +98 -0
- package/.github/skills/company-research/references/jumpstart-company-research-workflow.md +65 -0
- package/.github/skills/company-research/templates/template.md +121 -0
- package/.github/skills/copilot-sdk/SKILL.md +102 -0
- package/.github/skills/copilot-sdk/evals/evals.json +29 -0
- package/.github/skills/copilot-sdk/examples/copilot-sdk-recipes.md +73 -0
- package/.github/skills/copilot-sdk/references/architecture-and-runtime.md +73 -0
- package/.github/skills/copilot-sdk/references/session-patterns.md +90 -0
- package/.github/skills/copilot-sdk/references/tools-and-mcp.md +79 -0
- package/.github/skills/copilot-sdk/references/troubleshooting.md +99 -0
- package/.github/skills/copilot-sdk/templates/copilot-sdk-design-template.md +51 -0
- package/.github/skills/copilot-sdk/templates/python-starter.py +42 -0
- package/.github/skills/copilot-sdk/templates/typescript-starter.ts +35 -0
- package/.github/skills/crafting-effective-readmes/README.md +180 -0
- package/.github/skills/crafting-effective-readmes/SKILL.md +78 -0
- package/.github/skills/crafting-effective-readmes/references/art-of-readme.md +536 -0
- package/.github/skills/crafting-effective-readmes/references/make-a-readme.md +119 -0
- package/.github/skills/crafting-effective-readmes/references/standard-readme-example-maximal.md +68 -0
- package/.github/skills/crafting-effective-readmes/references/standard-readme-example-minimal.md +21 -0
- package/.github/skills/crafting-effective-readmes/references/standard-readme-spec.md +242 -0
- package/.github/skills/crafting-effective-readmes/section-checklist.md +17 -0
- package/.github/skills/crafting-effective-readmes/style-guide.md +13 -0
- package/.github/skills/crafting-effective-readmes/templates/internal.md +106 -0
- package/.github/skills/crafting-effective-readmes/templates/oss.md +77 -0
- package/.github/skills/crafting-effective-readmes/templates/personal.md +51 -0
- package/.github/skills/crafting-effective-readmes/templates/xdg-config.md +71 -0
- package/.github/skills/crafting-effective-readmes/using-references.md +35 -0
- package/.github/skills/current-state-process-miner/SKILL.md +78 -0
- package/.github/skills/current-state-process-miner/evals/evals.json +42 -0
- package/.github/skills/current-state-process-miner/references/process-mining-workflow.md +73 -0
- package/.github/skills/current-state-process-miner/templates/as-is-process-map-template.md +81 -0
- package/.github/skills/data-readiness-assessor/SKILL.md +130 -0
- package/.github/skills/data-readiness-assessor/evals/evals.json +37 -0
- package/.github/skills/data-readiness-assessor/evals/files/data-readiness-fieldservice-copilot.md +40 -0
- package/.github/skills/data-readiness-assessor/evals/files/data-readiness-public-sector-permit-triage.md +40 -0
- package/.github/skills/data-readiness-assessor/examples/example-claims-rag-readiness.md +74 -0
- package/.github/skills/data-readiness-assessor/references/scoring-rubric.md +87 -0
- package/.github/skills/data-readiness-assessor/references/sensitivity-classification.md +44 -0
- package/.github/skills/data-readiness-assessor/templates/data-source-inventory.md +44 -0
- package/.github/skills/database-schema-designer/README.md +212 -0
- package/.github/skills/database-schema-designer/SKILL.md +687 -0
- package/.github/skills/database-schema-designer/assets/templates/migration-template.sql +60 -0
- package/.github/skills/database-schema-designer/references/schema-design-checklist.md +118 -0
- package/.github/skills/dependency-bottleneck-detector/README.md +77 -0
- package/.github/skills/dependency-bottleneck-detector/SKILL.md +307 -0
- package/.github/skills/dependency-bottleneck-detector/evals/evals.json +60 -0
- package/.github/skills/dependency-bottleneck-detector/references/dependency-taxonomy.md +351 -0
- package/.github/skills/dependency-bottleneck-detector/references/escalation-patterns.md +220 -0
- package/.github/skills/dependency-bottleneck-detector/references/proactive-detection.md +155 -0
- package/.github/skills/dependency-bottleneck-detector/references/unblock-strategies.md +274 -0
- package/.github/skills/dependency-bottleneck-detector/scripts/dependency_scan.py +175 -0
- package/.github/skills/dependency-bottleneck-detector/scripts/dependency_tracker.py +291 -0
- package/.github/skills/dependency-bottleneck-detector/scripts/escalation_timer.py +116 -0
- package/.github/skills/dependency-bottleneck-detector/templates/client-dependency-summary.md +71 -0
- package/.github/skills/dependency-bottleneck-detector/templates/dependency-bottleneck-report.md +143 -0
- package/.github/skills/dependency-bottleneck-detector/templates/dependency-inventory.md +88 -0
- package/.github/skills/dependency-bottleneck-detector/templates/escalation-email.md +155 -0
- package/.github/skills/dependency-bottleneck-detector/templates/unblock-action-plan.md +106 -0
- package/.github/skills/design-md-auditor/README.md +19 -0
- package/.github/skills/design-md-auditor/SKILL.md +68 -0
- package/.github/skills/design-md-auditor/evals/evals.json +23 -0
- package/.github/skills/design-md-auditor/references/ai-workflow-checks.md +23 -0
- package/.github/skills/design-md-auditor/references/audit-rubric.md +40 -0
- package/.github/skills/design-md-auditor/references/severity-model.md +33 -0
- package/.github/skills/design-md-auditor/templates/compliance-report-template.md +23 -0
- package/.github/skills/design-md-creator/README.md +49 -0
- package/.github/skills/design-md-creator/SKILL.md +146 -0
- package/.github/skills/design-md-creator/evals/evals.json +23 -0
- package/.github/skills/design-md-creator/evals/rubric.md +27 -0
- package/.github/skills/design-md-creator/examples/prompts.md +23 -0
- package/.github/skills/design-md-creator/references/accessibility-rules.md +35 -0
- package/.github/skills/design-md-creator/references/ai-ui-patterns.md +36 -0
- package/.github/skills/design-md-creator/references/anti-patterns.md +34 -0
- package/.github/skills/design-md-creator/references/component-standards.md +39 -0
- package/.github/skills/design-md-creator/references/design-md-structure.md +69 -0
- package/.github/skills/design-md-creator/references/design-review-checklist.md +32 -0
- package/.github/skills/design-md-creator/references/framework-implementation-notes.md +42 -0
- package/.github/skills/design-md-creator/references/responsive-design.md +32 -0
- package/.github/skills/design-md-creator/references/stitch-design-md-notes.md +36 -0
- package/.github/skills/design-md-creator/references/visual-language-guide.md +40 -0
- package/.github/skills/design-md-creator/scripts/generate_design_review.py +68 -0
- package/.github/skills/design-md-creator/scripts/inspect_design_md.py +63 -0
- package/.github/skills/design-md-creator/templates/DESIGN.enterprise-ai.md +92 -0
- package/.github/skills/design-md-creator/templates/DESIGN.power-platform.md +17 -0
- package/.github/skills/design-md-creator/templates/DESIGN.rag-chat.md +42 -0
- package/.github/skills/design-md-creator/templates/DESIGN.react.md +18 -0
- package/.github/skills/design-md-creator/templates/DESIGN.review-queue.md +41 -0
- package/.github/skills/design-md-creator/templates/DESIGN.vue.md +19 -0
- package/.github/skills/design-token-sync/README.md +20 -0
- package/.github/skills/design-token-sync/SKILL.md +54 -0
- package/.github/skills/design-token-sync/evals/evals.json +23 -0
- package/.github/skills/design-token-sync/references/framework-mappings.md +30 -0
- package/.github/skills/design-token-sync/references/token-taxonomy.md +42 -0
- package/.github/skills/design-token-sync/scripts/extract_design_tokens.py +52 -0
- package/.github/skills/design-token-sync/templates/tokens.css.md +16 -0
- package/.github/skills/design-token-sync/templates/tokens.design-system.json +48 -0
- package/.github/skills/devops-rollout-plan/SKILL.md +206 -0
- package/.github/skills/devops-rollout-plan/evals/evals.json +119 -0
- package/.github/skills/devops-rollout-plan/examples/azure-openai-agent-rollout.md +237 -0
- package/.github/skills/devops-rollout-plan/references/ai-agent-deployment.md +250 -0
- package/.github/skills/devops-rollout-plan/references/azure-safe-deployment.md +206 -0
- package/.github/skills/devops-rollout-plan/references/pod-delivery-context.md +206 -0
- package/.github/skills/devops-rollout-plan/templates/ai-agent-rollout-plan.md +326 -0
- package/.github/skills/devops-rollout-plan/templates/lightweight-rollout-plan.md +67 -0
- package/.github/skills/devops-rollout-plan/templates/standard-rollout-plan.md +340 -0
- package/.github/skills/discovery-depth-scorecard/SKILL.md +88 -0
- package/.github/skills/discovery-depth-scorecard/references/scoring-model.md +45 -0
- package/.github/skills/docx/LICENSE.txt +30 -0
- package/.github/skills/docx/SKILL.md +590 -0
- package/.github/skills/docx/scripts/__init__.py +1 -0
- package/.github/skills/docx/scripts/accept_changes.py +135 -0
- package/.github/skills/docx/scripts/comment.py +318 -0
- package/.github/skills/docx/scripts/office/helpers/__init__.py +0 -0
- package/.github/skills/docx/scripts/office/helpers/merge_runs.py +199 -0
- package/.github/skills/docx/scripts/office/helpers/simplify_redlines.py +197 -0
- package/.github/skills/docx/scripts/office/pack.py +159 -0
- package/.github/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
- package/.github/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
- package/.github/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
- package/.github/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
- package/.github/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
- package/.github/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
- package/.github/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
- package/.github/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
- package/.github/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
- package/.github/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
- package/.github/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
- package/.github/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
- package/.github/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
- package/.github/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
- package/.github/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
- package/.github/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
- package/.github/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
- package/.github/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
- package/.github/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
- package/.github/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
- package/.github/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
- package/.github/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
- package/.github/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
- package/.github/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
- package/.github/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
- package/.github/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
- package/.github/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
- package/.github/skills/docx/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
- package/.github/skills/docx/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
- package/.github/skills/docx/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
- package/.github/skills/docx/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
- package/.github/skills/docx/scripts/office/schemas/mce/mc.xsd +75 -0
- package/.github/skills/docx/scripts/office/schemas/microsoft/wml-2010.xsd +560 -0
- package/.github/skills/docx/scripts/office/schemas/microsoft/wml-2012.xsd +67 -0
- package/.github/skills/docx/scripts/office/schemas/microsoft/wml-2018.xsd +14 -0
- package/.github/skills/docx/scripts/office/schemas/microsoft/wml-cex-2018.xsd +20 -0
- package/.github/skills/docx/scripts/office/schemas/microsoft/wml-cid-2016.xsd +13 -0
- package/.github/skills/docx/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
- package/.github/skills/docx/scripts/office/schemas/microsoft/wml-symex-2015.xsd +8 -0
- package/.github/skills/docx/scripts/office/soffice.py +183 -0
- package/.github/skills/docx/scripts/office/unpack.py +132 -0
- package/.github/skills/docx/scripts/office/validate.py +111 -0
- package/.github/skills/docx/scripts/office/validators/__init__.py +15 -0
- package/.github/skills/docx/scripts/office/validators/base.py +847 -0
- package/.github/skills/docx/scripts/office/validators/docx.py +446 -0
- package/.github/skills/docx/scripts/office/validators/pptx.py +275 -0
- package/.github/skills/docx/scripts/office/validators/redlining.py +247 -0
- package/.github/skills/docx/scripts/templates/comments.xml +3 -0
- package/.github/skills/docx/scripts/templates/commentsExtended.xml +3 -0
- package/.github/skills/docx/scripts/templates/commentsExtensible.xml +3 -0
- package/.github/skills/docx/scripts/templates/commentsIds.xml +3 -0
- package/.github/skills/docx/scripts/templates/people.xml +3 -0
- package/.github/skills/dora-evaluation-report/README.md +49 -0
- package/.github/skills/dora-evaluation-report/SKILL.md +235 -0
- package/.github/skills/dora-evaluation-report/evals/evals.json +33 -0
- package/.github/skills/dora-evaluation-report/evals/files/sample-input.md +35 -0
- package/.github/skills/dora-evaluation-report/examples/product-team-dora-evaluation-example.md +36 -0
- package/.github/skills/dora-evaluation-report/references/dora-ai-capabilities-model.md +84 -0
- package/.github/skills/dora-evaluation-report/references/dora-assessment-method.md +99 -0
- package/.github/skills/dora-evaluation-report/references/dora-metrics-and-evidence.md +94 -0
- package/.github/skills/dora-evaluation-report/references/platform-and-team-health-guide.md +67 -0
- package/.github/skills/dora-evaluation-report/references/scoring-and-prioritization-model.md +71 -0
- package/.github/skills/dora-evaluation-report/templates/dora-30-60-90-roadmap-template.md +55 -0
- package/.github/skills/dora-evaluation-report/templates/dora-capability-scorecard-template.md +38 -0
- package/.github/skills/dora-evaluation-report/templates/dora-evaluation-report-template.md +150 -0
- package/.github/skills/dora-evaluation-report/templates/dora-evidence-register-template.csv +4 -0
- package/.github/skills/dora-evaluation-report/templates/dora-intake-questionnaire.md +49 -0
- package/.github/skills/dotnet-developer/SKILL.md +347 -0
- package/.github/skills/dotnet-developer/references/ai-integration-patterns.md +375 -0
- package/.github/skills/dotnet-developer/references/aspnet-core-api-patterns.md +380 -0
- package/.github/skills/dotnet-developer/references/authentication-authorization.md +296 -0
- package/.github/skills/dotnet-developer/references/azure-native-patterns.md +353 -0
- package/.github/skills/dotnet-developer/references/background-workers.md +342 -0
- package/.github/skills/dotnet-developer/references/ef-core-patterns.md +350 -0
- package/.github/skills/dotnet-developer/references/legacy-modernization.md +202 -0
- package/.github/skills/dotnet-developer/references/modern-dotnet-standards.md +235 -0
- package/.github/skills/dotnet-developer/references/observability.md +283 -0
- package/.github/skills/dotnet-developer/references/production-readiness.md +143 -0
- package/.github/skills/dotnet-developer/references/rag-document-workflows.md +372 -0
- package/.github/skills/dotnet-developer/references/security-checklist.md +262 -0
- package/.github/skills/dotnet-developer/references/testing-guide.md +354 -0
- package/.github/skills/dotnet-developer/scripts/inspect_dotnet_solution.py +353 -0
- package/.github/skills/dotnet-developer/templates/Dockerfile +55 -0
- package/.github/skills/dotnet-developer/templates/Program.controller-api.cs +141 -0
- package/.github/skills/dotnet-developer/templates/Program.minimal-api.cs +154 -0
- package/.github/skills/dotnet-developer/templates/ai-client-abstraction.cs +161 -0
- package/.github/skills/dotnet-developer/templates/appsettings.template.json +58 -0
- package/.github/skills/dotnet-developer/templates/azure-pipelines-dotnet.yml +164 -0
- package/.github/skills/dotnet-developer/templates/background-service.cs +151 -0
- package/.github/skills/dotnet-developer/templates/docker-compose.dotnet.yml +85 -0
- package/.github/skills/dotnet-developer/templates/entity-framework-dbcontext.cs +133 -0
- package/.github/skills/dotnet-developer/templates/fluentvalidation-validator.cs +107 -0
- package/.github/skills/dotnet-developer/templates/github-actions-dotnet.yml +140 -0
- package/.github/skills/dotnet-developer/templates/minimal-api-endpoints.cs +136 -0
- package/.github/skills/dotnet-developer/templates/options-pattern.cs +101 -0
- package/.github/skills/dotnet-developer/templates/service.cs +155 -0
- package/.github/skills/dotnet-developer/templates/xunit-api-test.cs +221 -0
- package/.github/skills/grill-me/SKILL.md +212 -0
- package/.github/skills/grill-me/evals/manual-eval-checklist.md +50 -0
- package/.github/skills/grill-me/examples/document-review-example.md +45 -0
- package/.github/skills/grill-me/references/decision-tree.md +165 -0
- package/.github/skills/grill-me/references/quality-bar.md +27 -0
- package/.github/skills/grill-me/references/question-pattern.md +39 -0
- package/.github/skills/grill-me/templates/grill-summary-template.md +39 -0
- package/.github/skills/grill-summary-to-proposal/SKILL.md +93 -0
- package/.github/skills/grill-summary-to-proposal/evals/manual-eval-checklist.md +39 -0
- package/.github/skills/grill-summary-to-proposal/examples/from-grill-summary-example.md +28 -0
- package/.github/skills/grill-summary-to-proposal/references/normalization-pattern.md +40 -0
- package/.github/skills/grill-summary-to-proposal/references/redline-patterns.md +53 -0
- package/.github/skills/grill-summary-to-proposal/templates/proposal-hardening-template.md +39 -0
- package/.github/skills/gtm-ai-gtm/SKILL.md +324 -0
- package/.github/skills/gtm-ai-gtm/evals/evals.json +42 -0
- package/.github/skills/gtm-ai-gtm/examples/enterprise-ai-teammate-positioning.md +31 -0
- package/.github/skills/gtm-ai-gtm/examples/jumpstart-to-pod-recommendation.md +33 -0
- package/.github/skills/gtm-ai-gtm/references/enterprise-ai-objections.md +80 -0
- package/.github/skills/gtm-ai-gtm/references/jumpstart-and-pod-alignment.md +72 -0
- package/.github/skills/gtm-ai-gtm/references/pricing-and-packaging.md +41 -0
- package/.github/skills/gtm-ai-gtm/templates/client-gtm-brief.md +40 -0
- package/.github/skills/gtm-ai-gtm/templates/jumpstart-to-pod-recommendation-matrix.md +36 -0
- package/.github/skills/gtm-enterprise-account-planning/SKILL.md +169 -0
- package/.github/skills/gtm-enterprise-account-planning/evals/evals.json +39 -0
- package/.github/skills/gtm-enterprise-account-planning/examples/example-account-plan.md +92 -0
- package/.github/skills/gtm-enterprise-account-planning/references/jumpstart-account-planning-guide.md +156 -0
- package/.github/skills/gtm-enterprise-account-planning/templates/account-plan-template.md +97 -0
- package/.github/skills/gtm-enterprise-account-planning/templates/mutual-action-plan-template.md +36 -0
- package/.github/skills/gtm-positioning-strategy/SKILL.md +164 -0
- package/.github/skills/gtm-positioning-strategy/evals/evals.json +38 -0
- package/.github/skills/gtm-positioning-strategy/examples/gtm-positioning-examples.md +60 -0
- package/.github/skills/gtm-positioning-strategy/references/jumpstart-pod-positioning.md +69 -0
- package/.github/skills/gtm-positioning-strategy/references/positioning-tests.md +65 -0
- package/.github/skills/gtm-positioning-strategy/references/word-choice-and-framing.md +65 -0
- package/.github/skills/gtm-positioning-strategy/references/workflow.md +92 -0
- package/.github/skills/gtm-positioning-strategy/templates/message-house-template.md +36 -0
- package/.github/skills/gtm-positioning-strategy/templates/positioning-recommendation-template.md +28 -0
- package/.github/skills/impediment-prioritization/SKILL.md +173 -0
- package/.github/skills/impediment-prioritization/evals/evals.json +23 -0
- package/.github/skills/impediment-prioritization/examples/impediment-prioritization-examples.md +53 -0
- package/.github/skills/impediment-prioritization/references/jumpstart-pod-mapping.md +74 -0
- package/.github/skills/impediment-prioritization/references/scoring-rubric.md +79 -0
- package/.github/skills/impediment-prioritization/references/workflow.md +95 -0
- package/.github/skills/impediment-prioritization/templates/jumpstart-pod-remediation-template.md +31 -0
- package/.github/skills/impediment-prioritization/templates/prioritized-impediments-template.md +18 -0
- package/.github/skills/integration-surface-mapper/SKILL.md +73 -0
- package/.github/skills/integration-surface-mapper/evals/evals.json +30 -0
- package/.github/skills/integration-surface-mapper/references/integration-pattern-catalog.md +74 -0
- package/.github/skills/integration-surface-mapper/templates/integration-surface-template.md +66 -0
- package/.github/skills/jira-delivery-builder/README.md +28 -0
- package/.github/skills/jira-delivery-builder/SKILL.md +184 -0
- package/.github/skills/jira-delivery-builder/evals/README.md +27 -0
- package/.github/skills/jira-delivery-builder/evals/eval-cases.md +65 -0
- package/.github/skills/jira-delivery-builder/references/acceptance-criteria-guide.md +32 -0
- package/.github/skills/jira-delivery-builder/references/ai-ticket-patterns.md +30 -0
- package/.github/skills/jira-delivery-builder/references/backlog-decomposition.md +30 -0
- package/.github/skills/jira-delivery-builder/references/csv-import-guide.md +36 -0
- package/.github/skills/jira-delivery-builder/references/definition-of-done.md +20 -0
- package/.github/skills/jira-delivery-builder/references/definition-of-ready.md +12 -0
- package/.github/skills/jira-delivery-builder/references/dependency-mapping.md +27 -0
- package/.github/skills/jira-delivery-builder/references/jira-issue-types.md +29 -0
- package/.github/skills/jira-delivery-builder/references/jira-reporting.md +28 -0
- package/.github/skills/jira-delivery-builder/references/jql-cheatsheet.md +25 -0
- package/.github/skills/jira-delivery-builder/references/source-traceability.md +27 -0
- package/.github/skills/jira-delivery-builder/references/story-writing-standards.md +30 -0
- package/.github/skills/jira-delivery-builder/scripts/convert_markdown_to_jira_csv.py +94 -0
- package/.github/skills/jira-delivery-builder/scripts/create_dependency_register.py +51 -0
- package/.github/skills/jira-delivery-builder/scripts/fixtures/README.md +39 -0
- package/.github/skills/jira-delivery-builder/scripts/fixtures/backlog.csv +5 -0
- package/.github/skills/jira-delivery-builder/scripts/fixtures/issues.json +26 -0
- package/.github/skills/jira-delivery-builder/scripts/fixtures/issues.md +23 -0
- package/.github/skills/jira-delivery-builder/scripts/generate_jira_csv.py +75 -0
- package/.github/skills/jira-delivery-builder/scripts/generate_jql_filters.py +43 -0
- package/.github/skills/jira-delivery-builder/scripts/split_large_stories.py +66 -0
- package/.github/skills/jira-delivery-builder/scripts/validate_jira_backlog.py +66 -0
- package/.github/skills/jira-delivery-builder/templates/ai-agent-story-template.md +32 -0
- package/.github/skills/jira-delivery-builder/templates/ai-rag-story-template.md +32 -0
- package/.github/skills/jira-delivery-builder/templates/backlog-quality-report.md +35 -0
- package/.github/skills/jira-delivery-builder/templates/bug-template.md +33 -0
- package/.github/skills/jira-delivery-builder/templates/dependency-register.md +5 -0
- package/.github/skills/jira-delivery-builder/templates/epic-template.md +31 -0
- package/.github/skills/jira-delivery-builder/templates/jira-csv-import-template.csv +5 -0
- package/.github/skills/jira-delivery-builder/templates/mvp-backlog-template.md +39 -0
- package/.github/skills/jira-delivery-builder/templates/review-queue-story-template.md +22 -0
- package/.github/skills/jira-delivery-builder/templates/spike-template.md +29 -0
- package/.github/skills/jira-delivery-builder/templates/sprint-readiness-report.md +26 -0
- package/.github/skills/jira-delivery-builder/templates/technical-task-template.md +34 -0
- package/.github/skills/jira-delivery-builder/templates/user-story-template.md +33 -0
- package/.github/skills/jira-delivery-operations/README.md +10 -0
- package/.github/skills/jira-delivery-operations/SKILL.md +70 -0
- package/.github/skills/jira-delivery-operations/evals/README.md +3 -0
- package/.github/skills/jira-delivery-operations/evals/eval-cases.md +13 -0
- package/.github/skills/jira-delivery-operations/references/operating-playbook.md +21 -0
- package/.github/skills/jira-delivery-operations/references/routing-matrix.md +9 -0
- package/.github/skills/jira-delivery-operations/templates/phase-checklist.md +25 -0
- package/.github/skills/jira-delivery-operations/templates/weekly-operations-cadence.md +7 -0
- package/.github/skills/jira-innovation-unit-normalizer/README.md +10 -0
- package/.github/skills/jira-innovation-unit-normalizer/SKILL.md +64 -0
- package/.github/skills/jira-innovation-unit-normalizer/evals/README.md +3 -0
- package/.github/skills/jira-innovation-unit-normalizer/evals/eval-cases.md +16 -0
- package/.github/skills/jira-innovation-unit-normalizer/references/complexity-mapping.md +21 -0
- package/.github/skills/jira-innovation-unit-normalizer/references/normalization-rules.md +13 -0
- package/.github/skills/jira-innovation-unit-normalizer/scripts/fixtures/README.md +7 -0
- package/.github/skills/jira-innovation-unit-normalizer/scripts/fixtures/sample-jira-backlog.csv +5 -0
- package/.github/skills/jira-innovation-unit-normalizer/scripts/normalize_jira_to_iu.py +48 -0
- package/.github/skills/jira-innovation-unit-normalizer/templates/jira-iu-backlog.csv +2 -0
- package/.github/skills/jira-innovation-unit-normalizer/templates/jira-iu-estimate.md +17 -0
- package/.github/skills/jira-pod-status-reporter/README.md +18 -0
- package/.github/skills/jira-pod-status-reporter/SKILL.md +82 -0
- package/.github/skills/jira-pod-status-reporter/evals/README.md +3 -0
- package/.github/skills/jira-pod-status-reporter/evals/eval-cases.md +21 -0
- package/.github/skills/jira-pod-status-reporter/references/pod-metrics.md +17 -0
- package/.github/skills/jira-pod-status-reporter/references/report-structure.md +24 -0
- package/.github/skills/jira-pod-status-reporter/references/risk-and-dependency-signals.md +13 -0
- package/.github/skills/jira-pod-status-reporter/scripts/fixtures/README.md +7 -0
- package/.github/skills/jira-pod-status-reporter/scripts/fixtures/sample-jira-status.csv +5 -0
- package/.github/skills/jira-pod-status-reporter/scripts/summarize_jira_backlog.py +39 -0
- package/.github/skills/jira-pod-status-reporter/templates/sprint-readiness-summary.md +24 -0
- package/.github/skills/jira-pod-status-reporter/templates/weekly-status-report.md +29 -0
- package/.github/skills/langfuse/SKILL.md +128 -0
- package/.github/skills/langfuse/references/cli.md +51 -0
- package/.github/skills/langfuse/references/instrumentation.md +140 -0
- package/.github/skills/langfuse/references/prompt-migration.md +234 -0
- package/.github/skills/langfuse/references/sdk-upgrade.md +181 -0
- package/.github/skills/langfuse/references/skill-feedback.md +52 -0
- package/.github/skills/langfuse/references/user-feedback.md +88 -0
- package/.github/skills/mcp-server-designer/SKILL.md +91 -0
- package/.github/skills/mcp-server-designer/evals/evals.json +29 -0
- package/.github/skills/mcp-server-designer/examples/example-finance-domain-mcp.md +63 -0
- package/.github/skills/mcp-server-designer/references/mcp-design-guide.md +95 -0
- package/.github/skills/mcp-server-designer/templates/mcp-server-design-template.md +115 -0
- package/.github/skills/memory-architecture-designer/SKILL.md +88 -0
- package/.github/skills/memory-architecture-designer/evals/evals.json +32 -0
- package/.github/skills/memory-architecture-designer/examples/example-multi-tenant-copilot-memory.md +46 -0
- package/.github/skills/memory-architecture-designer/references/memory-pattern-library.md +60 -0
- package/.github/skills/memory-architecture-designer/templates/memory-architecture-spec.md +55 -0
- package/.github/skills/migration-strategy-legacy-to-ai/SKILL.md +78 -0
- package/.github/skills/migration-strategy-legacy-to-ai/evals/evals.json +31 -0
- package/.github/skills/migration-strategy-legacy-to-ai/examples/example-ticket-routing-migration.md +51 -0
- package/.github/skills/migration-strategy-legacy-to-ai/references/migration-patterns-catalog.md +77 -0
- package/.github/skills/migration-strategy-legacy-to-ai/references/migration-patterns.md +54 -0
- package/.github/skills/migration-strategy-legacy-to-ai/templates/migration-plan.md +48 -0
- package/.github/skills/migration-strategy-legacy-to-ai/templates/migration-strategy-template.md +94 -0
- package/.github/skills/non-functional-requirements-elicitor/SKILL.md +79 -0
- package/.github/skills/non-functional-requirements-elicitor/evals/evals.json +31 -0
- package/.github/skills/non-functional-requirements-elicitor/references/nfr-catalog.md +97 -0
- package/.github/skills/non-functional-requirements-elicitor/templates/nfr-register-template.md +51 -0
- package/.github/skills/observability-design-for-ai/SKILL.md +93 -0
- package/.github/skills/observability-design-for-ai/evals/evals.json +32 -0
- package/.github/skills/observability-design-for-ai/examples/example-grounded-assistant-observability.md +53 -0
- package/.github/skills/observability-design-for-ai/references/telemetry-catalog.md +62 -0
- package/.github/skills/observability-design-for-ai/templates/observability-spec.md +50 -0
- package/.github/skills/observability-design-for-ai/templates/trace-schema.md +40 -0
- package/.github/skills/persona-empathy-map/SKILL.md +93 -0
- package/.github/skills/persona-empathy-map/evals/evals.json +17 -0
- package/.github/skills/persona-empathy-map/references/empathy-map-pattern.md +48 -0
- package/.github/skills/persona-journey-map-companion/README.md +11 -0
- package/.github/skills/persona-journey-map-companion/SKILL.md +55 -0
- package/.github/skills/persona-journey-map-companion/evals/evals.json +17 -0
- package/.github/skills/persona-journey-map-companion/examples/operations-journey-example.md +29 -0
- package/.github/skills/persona-journey-map-companion/templates/journey-map-template.md +29 -0
- package/.github/skills/php-developer/README.md +46 -0
- package/.github/skills/php-developer/SKILL.md +192 -0
- package/.github/skills/php-developer/evals/eval-rubric.md +27 -0
- package/.github/skills/php-developer/evals/evals.json +82 -0
- package/.github/skills/php-developer/references/ai-integration-patterns.md +38 -0
- package/.github/skills/php-developer/references/api-development.md +38 -0
- package/.github/skills/php-developer/references/ci-cd.md +29 -0
- package/.github/skills/php-developer/references/composer-dependency-management.md +49 -0
- package/.github/skills/php-developer/references/docker-local-dev.md +36 -0
- package/.github/skills/php-developer/references/laravel-patterns.md +46 -0
- package/.github/skills/php-developer/references/legacy-modernization.md +47 -0
- package/.github/skills/php-developer/references/php-modern-standards.md +43 -0
- package/.github/skills/php-developer/references/production-readiness.md +37 -0
- package/.github/skills/php-developer/references/security-checklist.md +48 -0
- package/.github/skills/php-developer/references/static-analysis.md +41 -0
- package/.github/skills/php-developer/references/symfony-patterns.md +42 -0
- package/.github/skills/php-developer/references/testing-guide.md +41 -0
- package/.github/skills/php-developer/scripts/__pycache__/composer_audit_summary.cpython-313.pyc +0 -0
- package/.github/skills/php-developer/scripts/__pycache__/detect_php_framework.cpython-313.pyc +0 -0
- package/.github/skills/php-developer/scripts/__pycache__/generate_refactor_backlog.cpython-313.pyc +0 -0
- package/.github/skills/php-developer/scripts/__pycache__/inspect_php_project.cpython-313.pyc +0 -0
- package/.github/skills/php-developer/scripts/__pycache__/legacy_risk_scan.cpython-313.pyc +0 -0
- package/.github/skills/php-developer/scripts/composer_audit_summary.py +50 -0
- package/.github/skills/php-developer/scripts/detect_php_framework.py +35 -0
- package/.github/skills/php-developer/scripts/generate_refactor_backlog.py +75 -0
- package/.github/skills/php-developer/scripts/inspect_php_project.py +102 -0
- package/.github/skills/php-developer/scripts/legacy_risk_scan.py +56 -0
- package/.github/skills/php-developer/templates/Dockerfile.php-fpm +22 -0
- package/.github/skills/php-developer/templates/composer.legacy-modernization.json +26 -0
- package/.github/skills/php-developer/templates/composer.modern.json +27 -0
- package/.github/skills/php-developer/templates/docker-compose.laravel.yml +40 -0
- package/.github/skills/php-developer/templates/docker-compose.symfony.yml +34 -0
- package/.github/skills/php-developer/templates/github-actions-php.yml +26 -0
- package/.github/skills/php-developer/templates/laravel-controller.php +30 -0
- package/.github/skills/php-developer/templates/laravel-form-request.php +26 -0
- package/.github/skills/php-developer/templates/laravel-service.php +26 -0
- package/.github/skills/php-developer/templates/legacy-characterization-test.php +18 -0
- package/.github/skills/php-developer/templates/pdo-repository.php +29 -0
- package/.github/skills/php-developer/templates/pest.php +6 -0
- package/.github/skills/php-developer/templates/phpstan.neon +11 -0
- package/.github/skills/php-developer/templates/phpunit.xml +17 -0
- package/.github/skills/php-developer/templates/symfony-controller.php +27 -0
- package/.github/skills/php-developer/templates/symfony-service.php +35 -0
- package/.github/skills/pilot-to-production-gate/SKILL.md +87 -0
- package/.github/skills/pilot-to-production-gate/evals/evals.json +30 -0
- package/.github/skills/pilot-to-production-gate/references/gate-criteria-rubric.md +116 -0
- package/.github/skills/pilot-to-production-gate/templates/pilot-to-production-gate-template.md +63 -0
- package/.github/skills/postgresql-pgvector/README.md +135 -0
- package/.github/skills/postgresql-pgvector/SKILL.md +298 -0
- package/.github/skills/postgresql-pgvector/evals/evals.json +106 -0
- package/.github/skills/postgresql-pgvector/references/fastapi-sqlmodel-patterns.md +255 -0
- package/.github/skills/postgresql-pgvector/references/hybrid-search.md +195 -0
- package/.github/skills/postgresql-pgvector/references/indexing-guide.md +204 -0
- package/.github/skills/postgresql-pgvector/references/multi-tenant-security.md +213 -0
- package/.github/skills/postgresql-pgvector/references/performance-tuning.md +249 -0
- package/.github/skills/postgresql-pgvector/references/production-checklist.md +125 -0
- package/.github/skills/postgresql-pgvector/references/rag-evaluation.md +180 -0
- package/.github/skills/postgresql-pgvector/references/retrieval-patterns.md +235 -0
- package/.github/skills/postgresql-pgvector/references/schema-patterns.md +217 -0
- package/.github/skills/postgresql-pgvector/scripts/benchmark_retrieval.py +149 -0
- package/.github/skills/postgresql-pgvector/scripts/check_embedding_dimensions.py +140 -0
- package/.github/skills/postgresql-pgvector/scripts/explain_query_plan.py +138 -0
- package/.github/skills/postgresql-pgvector/scripts/seed_sample_chunks.py +162 -0
- package/.github/skills/postgresql-pgvector/scripts/validate_pgvector.py +69 -0
- package/.github/skills/postgresql-pgvector/templates/alembic_pgvector_migration.py +170 -0
- package/.github/skills/postgresql-pgvector/templates/docker-compose.pgvector.yml +20 -0
- package/.github/skills/postgresql-pgvector/templates/eval_schema.sql +105 -0
- package/.github/skills/postgresql-pgvector/templates/fastapi_routes.py +223 -0
- package/.github/skills/postgresql-pgvector/templates/indexes.hnsw.sql +66 -0
- package/.github/skills/postgresql-pgvector/templates/indexes.hybrid-search.sql +71 -0
- package/.github/skills/postgresql-pgvector/templates/retrieval_service.py +258 -0
- package/.github/skills/postgresql-pgvector/templates/schema.basic-rag.sql +145 -0
- package/.github/skills/postgresql-pgvector/templates/schema.multi-tenant-rag.sql +186 -0
- package/.github/skills/postgresql-pgvector/templates/schema.rfp-retrieval.sql +139 -0
- package/.github/skills/postgresql-pgvector/templates/sqlmodel_models.py +207 -0
- package/.github/skills/pre-deployment-gotcha-review/README.md +84 -0
- package/.github/skills/pre-deployment-gotcha-review/SKILL.md +233 -0
- package/.github/skills/pre-deployment-gotcha-review/evals/evals.json +59 -0
- package/.github/skills/pre-deployment-gotcha-review/references/ai-agent-risk.md +104 -0
- package/.github/skills/pre-deployment-gotcha-review/references/api-gateway.md +81 -0
- package/.github/skills/pre-deployment-gotcha-review/references/authorization-access-control.md +77 -0
- package/.github/skills/pre-deployment-gotcha-review/references/data-readiness.md +103 -0
- package/.github/skills/pre-deployment-gotcha-review/references/delivery-commercial-risk.md +119 -0
- package/.github/skills/pre-deployment-gotcha-review/references/gotcha-taxonomy.md +292 -0
- package/.github/skills/pre-deployment-gotcha-review/references/identity-auth-mfa.md +94 -0
- package/.github/skills/pre-deployment-gotcha-review/references/legacy-onprem-access.md +92 -0
- package/.github/skills/pre-deployment-gotcha-review/references/mcp-extension-guide.md +102 -0
- package/.github/skills/pre-deployment-gotcha-review/references/operational-readiness.md +102 -0
- package/.github/skills/pre-deployment-gotcha-review/references/rag-document-identity-acl.md +117 -0
- package/.github/skills/pre-deployment-gotcha-review/references/review-methodology.md +159 -0
- package/.github/skills/pre-deployment-gotcha-review/references/security-compliance.md +108 -0
- package/.github/skills/pre-deployment-gotcha-review/scripts/build_citation_matrix.py +153 -0
- package/.github/skills/pre-deployment-gotcha-review/scripts/classify_gotchas.py +201 -0
- package/.github/skills/pre-deployment-gotcha-review/scripts/extract_document_claims.py +156 -0
- package/.github/skills/pre-deployment-gotcha-review/scripts/generate_question_backlog.py +213 -0
- package/.github/skills/pre-deployment-gotcha-review/scripts/validate_report_completeness.py +209 -0
- package/.github/skills/pre-deployment-gotcha-review/templates/assumption-register.md +38 -0
- package/.github/skills/pre-deployment-gotcha-review/templates/clarifying-questions.md +61 -0
- package/.github/skills/pre-deployment-gotcha-review/templates/gotcha-review-report.md +162 -0
- package/.github/skills/pre-deployment-gotcha-review/templates/mitigation-backlog.md +47 -0
- package/.github/skills/pre-deployment-gotcha-review/templates/readiness-rating.md +79 -0
- package/.github/skills/pre-deployment-gotcha-review/templates/source-citation-matrix.md +39 -0
- package/.github/skills/pre-deployment-gotcha-review/templates/unknown-unknowns-register.md +29 -0
- package/.github/skills/privacy-by-design-for-ai/SKILL.md +84 -0
- package/.github/skills/privacy-by-design-for-ai/evals/evals.json +32 -0
- package/.github/skills/privacy-by-design-for-ai/examples/example-eu-employee-assistant.md +53 -0
- package/.github/skills/privacy-by-design-for-ai/references/privacy-by-design-guide.md +95 -0
- package/.github/skills/privacy-by-design-for-ai/references/privacy-control-catalog.md +53 -0
- package/.github/skills/privacy-by-design-for-ai/templates/dpia-template.md +66 -0
- package/.github/skills/privacy-by-design-for-ai/templates/privacy-by-design-template.md +89 -0
- package/.github/skills/python-developer/SKILL.md +246 -0
- package/.github/skills/python-developer/evals/evals.json +162 -0
- package/.github/skills/python-developer/references/ai-integration-patterns.md +261 -0
- package/.github/skills/python-developer/references/background-jobs.md +199 -0
- package/.github/skills/python-developer/references/ci-cd.md +248 -0
- package/.github/skills/python-developer/references/cli-tools.md +185 -0
- package/.github/skills/python-developer/references/database-patterns.md +278 -0
- package/.github/skills/python-developer/references/docker-local-dev.md +241 -0
- package/.github/skills/python-developer/references/fastapi-patterns.md +311 -0
- package/.github/skills/python-developer/references/modern-python-standards.md +187 -0
- package/.github/skills/python-developer/references/observability.md +214 -0
- package/.github/skills/python-developer/references/production-readiness.md +103 -0
- package/.github/skills/python-developer/references/pydantic-settings.md +227 -0
- package/.github/skills/python-developer/references/rag-pipeline-patterns.md +307 -0
- package/.github/skills/python-developer/references/refactoring-guide.md +206 -0
- package/.github/skills/python-developer/references/security-checklist.md +195 -0
- package/.github/skills/python-developer/references/testing-guide.md +272 -0
- package/.github/skills/python-developer/scripts/check_security_basics.py +159 -0
- package/.github/skills/python-developer/scripts/inspect_python_project.py +181 -0
- package/.github/skills/python-developer/templates/Dockerfile +44 -0
- package/.github/skills/python-developer/templates/Makefile +62 -0
- package/.github/skills/python-developer/templates/docker-compose.fastapi.yml +70 -0
- package/.github/skills/python-developer/templates/github-actions-python.yml +134 -0
- package/.github/skills/python-developer/templates/health_routes.py +27 -0
- package/.github/skills/python-developer/templates/llm_client_protocol.py +114 -0
- package/.github/skills/python-developer/templates/main.fastapi.py +59 -0
- package/.github/skills/python-developer/templates/pyproject.cli.toml +40 -0
- package/.github/skills/python-developer/templates/pyproject.fastapi.toml +79 -0
- package/.github/skills/python-developer/templates/pyproject.package.toml +40 -0
- package/.github/skills/python-developer/templates/pytest_api_test.py +86 -0
- package/.github/skills/python-developer/templates/pytest_service_test.py +98 -0
- package/.github/skills/python-developer/templates/repository.py +43 -0
- package/.github/skills/python-developer/templates/service.py +48 -0
- package/.github/skills/python-developer/templates/settings.py +71 -0
- package/.github/skills/python-developer/templates/sqlmodel_model.py +40 -0
- package/.github/skills/python-developer/templates/typer_cli.py +93 -0
- package/.github/skills/quality-gates/SKILL.md +126 -0
- package/.github/skills/rag-architecture-designer/SKILL.md +104 -0
- package/.github/skills/rag-architecture-designer/evals/evals.json +32 -0
- package/.github/skills/rag-architecture-designer/examples/example-policy-copilot.md +75 -0
- package/.github/skills/rag-architecture-designer/references/pattern-catalog.md +82 -0
- package/.github/skills/rag-architecture-designer/templates/rag-architecture-spec.md +93 -0
- package/.github/skills/rag-architecture-designer/templates/rag-eval-plan.md +38 -0
- package/.github/skills/react-design-md-auditor/README.md +39 -0
- package/.github/skills/react-design-md-auditor/SKILL.md +96 -0
- package/.github/skills/react-design-md-auditor/evals/eval-cases.md +61 -0
- package/.github/skills/react-design-md-auditor/references/audit-rubric.md +46 -0
- package/.github/skills/react-design-md-auditor/references/react-specific-checks.md +48 -0
- package/.github/skills/react-design-md-auditor/references/severity-model.md +24 -0
- package/.github/skills/react-design-md-auditor/templates/compliance-report-template.md +59 -0
- package/.github/skills/react-developer/README.md +63 -0
- package/.github/skills/react-developer/SKILL.md +226 -0
- package/.github/skills/react-developer/evals/eval-rubric.md +62 -0
- package/.github/skills/react-developer/references/accessibility.md +20 -0
- package/.github/skills/react-developer/references/ai-ui-patterns.md +36 -0
- package/.github/skills/react-developer/references/api-integration.md +28 -0
- package/.github/skills/react-developer/references/ci-cd.md +24 -0
- package/.github/skills/react-developer/references/component-architecture.md +25 -0
- package/.github/skills/react-developer/references/deployment.md +17 -0
- package/.github/skills/react-developer/references/forms-validation.md +25 -0
- package/.github/skills/react-developer/references/nextjs-patterns.md +23 -0
- package/.github/skills/react-developer/references/performance.md +20 -0
- package/.github/skills/react-developer/references/project-structure.md +68 -0
- package/.github/skills/react-developer/references/react-modern-standards.md +33 -0
- package/.github/skills/react-developer/references/react-router-patterns.md +24 -0
- package/.github/skills/react-developer/references/review-queue-patterns.md +37 -0
- package/.github/skills/react-developer/references/security.md +18 -0
- package/.github/skills/react-developer/references/state-management.md +44 -0
- package/.github/skills/react-developer/references/styling-design-system.md +25 -0
- package/.github/skills/react-developer/references/tanstack-query.md +27 -0
- package/.github/skills/react-developer/references/testing.md +19 -0
- package/.github/skills/react-developer/scripts/__pycache__/check_accessibility_patterns.cpython-313.pyc +0 -0
- package/.github/skills/react-developer/scripts/__pycache__/detect_react_stack.cpython-313.pyc +0 -0
- package/.github/skills/react-developer/scripts/__pycache__/generate_component_map.cpython-313.pyc +0 -0
- package/.github/skills/react-developer/scripts/__pycache__/generate_frontend_backlog.cpython-313.pyc +0 -0
- package/.github/skills/react-developer/scripts/__pycache__/inspect_react_project.cpython-313.pyc +0 -0
- package/.github/skills/react-developer/scripts/check_accessibility_patterns.py +35 -0
- package/.github/skills/react-developer/scripts/detect_react_stack.py +50 -0
- package/.github/skills/react-developer/scripts/generate_component_map.py +33 -0
- package/.github/skills/react-developer/scripts/generate_frontend_backlog.py +53 -0
- package/.github/skills/react-developer/scripts/inspect_react_project.py +88 -0
- package/.github/skills/react-developer/templates/.env.example +2 -0
- package/.github/skills/react-developer/templates/.env.local.example +2 -0
- package/.github/skills/react-developer/templates/Dockerfile +12 -0
- package/.github/skills/react-developer/templates/agent-trace-viewer.tsx +27 -0
- package/.github/skills/react-developer/templates/api-client.ts +24 -0
- package/.github/skills/react-developer/templates/app-shell.css +9 -0
- package/.github/skills/react-developer/templates/app-shell.tsx +21 -0
- package/.github/skills/react-developer/templates/citation-panel.tsx +29 -0
- package/.github/skills/react-developer/templates/document-upload-page.tsx +11 -0
- package/.github/skills/react-developer/templates/evaluation-dashboard.tsx +27 -0
- package/.github/skills/react-developer/templates/github-actions-react.yml +34 -0
- package/.github/skills/react-developer/templates/main.tsx +13 -0
- package/.github/skills/react-developer/templates/nginx.conf +11 -0
- package/.github/skills/react-developer/templates/package.nextjs-ts.json +32 -0
- package/.github/skills/react-developer/templates/package.react-vite-ts.json +39 -0
- package/.github/skills/react-developer/templates/playwright.config.ts +15 -0
- package/.github/skills/react-developer/templates/rag-chat-view.tsx +34 -0
- package/.github/skills/react-developer/templates/react-hook-form-zod.tsx +51 -0
- package/.github/skills/react-developer/templates/retrieval-result-card.tsx +28 -0
- package/.github/skills/react-developer/templates/review-queue-page.tsx +39 -0
- package/.github/skills/react-developer/templates/router.tsx +20 -0
- package/.github/skills/react-developer/templates/tanstack-query-provider.tsx +8 -0
- package/.github/skills/react-developer/templates/tsconfig.json +16 -0
- package/.github/skills/react-developer/templates/vite.config.ts +12 -0
- package/.github/skills/react-developer/templates/vitest.config.ts +13 -0
- package/.github/skills/red-team-playbook-builder/SKILL.md +79 -0
- package/.github/skills/red-team-playbook-builder/evals/evals.json +32 -0
- package/.github/skills/red-team-playbook-builder/examples/example-sales-ops-redteam.md +34 -0
- package/.github/skills/red-team-playbook-builder/references/adversarial-pattern-library.md +63 -0
- package/.github/skills/red-team-playbook-builder/references/red-team-attack-catalog.md +98 -0
- package/.github/skills/red-team-playbook-builder/templates/red-team-playbook-template.md +64 -0
- package/.github/skills/red-team-playbook-builder/templates/red-team-playbook.md +45 -0
- package/.github/skills/reference-architecture-snapshotter/SKILL.md +53 -0
- package/.github/skills/reference-architecture-snapshotter/evals/evals.json +17 -0
- package/.github/skills/reference-architecture-snapshotter/examples/reference-architecture-example.md +17 -0
- package/.github/skills/reference-architecture-snapshotter/references/redaction-and-variant-rules.md +26 -0
- package/.github/skills/reference-architecture-snapshotter/scripts/snapshot_qa_check.py +30 -0
- package/.github/skills/reference-architecture-snapshotter/templates/reference-architecture-template.md +19 -0
- package/.github/skills/reference-story-matcher/SKILL.md +145 -0
- package/.github/skills/reference-story-matcher/evals/evals.json +41 -0
- package/.github/skills/reference-story-matcher/examples/example-reference-story-one-pager.md +61 -0
- package/.github/skills/reference-story-matcher/examples/prospect-profile-example.json +21 -0
- package/.github/skills/reference-story-matcher/references/case-study-catalog.json +281 -0
- package/.github/skills/reference-story-matcher/references/matching-workflow.md +82 -0
- package/.github/skills/reference-story-matcher/scripts/match_case_study.py +182 -0
- package/.github/skills/reference-story-matcher/templates/reference-story-one-pager-template.md +59 -0
- package/.github/skills/requirements/SKILL.md +96 -0
- package/.github/skills/roi-calculator-builder/SKILL.md +177 -0
- package/.github/skills/roi-calculator-builder/evals/evals.json +50 -0
- package/.github/skills/roi-calculator-builder/examples/example-knowledge-assistant-roi.md +142 -0
- package/.github/skills/roi-calculator-builder/references/ai-benefit-categories.md +101 -0
- package/.github/skills/roi-calculator-builder/references/ai-cost-categories.md +112 -0
- package/.github/skills/roi-calculator-builder/references/risk-adjusted-roi.md +76 -0
- package/.github/skills/roi-calculator-builder/references/roi-methodology.md +93 -0
- package/.github/skills/roi-calculator-builder/references/sensitivity-analysis-guide.md +72 -0
- package/.github/skills/roi-calculator-builder/templates/roi-model-template.md +132 -0
- package/.github/skills/roi-calculator-builder/templates/roi-worksheet-template.csv +31 -0
- package/.github/skills/scope-creep-detector/SKILL.md +75 -0
- package/.github/skills/scope-creep-detector/evals/evals.json +30 -0
- package/.github/skills/scope-creep-detector/references/scope-creep-patterns.md +85 -0
- package/.github/skills/scope-creep-detector/templates/scope-audit-template.md +43 -0
- package/.github/skills/scripts/README.md +93 -0
- package/.github/skills/scripts/__pycache__/assertion_core.cpython-312.pyc +0 -0
- package/.github/skills/scripts/assertion_core.py +55 -0
- package/.github/skills/skill-creator/LICENSE.txt +202 -0
- package/.github/skills/skill-creator/SKILL.md +506 -0
- package/.github/skills/skill-creator/agents/analyzer.md +274 -0
- package/.github/skills/skill-creator/agents/comparator.md +202 -0
- package/.github/skills/skill-creator/agents/grader.md +223 -0
- package/.github/skills/skill-creator/assets/eval_review.html +146 -0
- package/.github/skills/skill-creator/eval-viewer/generate_review.py +471 -0
- package/.github/skills/skill-creator/eval-viewer/viewer.html +1325 -0
- package/.github/skills/skill-creator/examples/copilot-sdk-wrapper/README.md +35 -0
- package/.github/skills/skill-creator/examples/copilot-sdk-wrapper/copilot_sdk_wrapper.mjs +93 -0
- package/.github/skills/skill-creator/examples/copilot-sdk-wrapper/package.json +8 -0
- package/.github/skills/skill-creator/references/schemas.md +430 -0
- package/.github/skills/skill-creator/scripts/__init__.py +0 -0
- package/.github/skills/skill-creator/scripts/aggregate_benchmark.py +401 -0
- package/.github/skills/skill-creator/scripts/generate_report.py +326 -0
- package/.github/skills/skill-creator/scripts/improve_description.py +256 -0
- package/.github/skills/skill-creator/scripts/package_skill.py +136 -0
- package/.github/skills/skill-creator/scripts/prompt_backend.py +145 -0
- package/.github/skills/skill-creator/scripts/quick_validate.py +103 -0
- package/.github/skills/skill-creator/scripts/run_eval.py +364 -0
- package/.github/skills/skill-creator/scripts/run_loop.py +339 -0
- package/.github/skills/skill-creator/scripts/utils.py +47 -0
- package/.github/skills/stitch-screen-to-design-md/README.md +17 -0
- package/.github/skills/stitch-screen-to-design-md/SKILL.md +50 -0
- package/.github/skills/stitch-screen-to-design-md/evals/evals.json +23 -0
- package/.github/skills/stitch-screen-to-design-md/references/stitch-mcp-flow.md +38 -0
- package/.github/skills/stitch-screen-to-design-md/references/synthesis-guide.md +34 -0
- package/.github/skills/stitch-screen-to-design-md/templates/design-from-stitch-template.md +49 -0
- package/.github/skills/success-metrics-designer/SKILL.md +84 -0
- package/.github/skills/success-metrics-designer/evals/evals.json +30 -0
- package/.github/skills/success-metrics-designer/references/kpi-pattern-library.md +79 -0
- package/.github/skills/success-metrics-designer/templates/success-metrics-template.md +65 -0
- package/.github/skills/task-clarifier/SKILL.md +85 -0
- package/.github/skills/task-clarifier/evals/evals.json +33 -0
- package/.github/skills/task-clarifier/evals/files/conflicting-next-step-notes.md +24 -0
- package/.github/skills/task-clarifier/evals/files/vague-seller-ask.md +18 -0
- package/.github/skills/task-clarifier/references/clarification-pattern.md +67 -0
- package/.github/skills/tool-differentiation/SKILL.md +81 -0
- package/.github/skills/tool-differentiation/evals/evals.json +17 -0
- package/.github/skills/tool-differentiation/references/comparison-matrix.md +50 -0
- package/.github/skills/ui-ux-pro-max/SKILL.md +266 -0
- package/.github/skills/ui-ux-pro-max/data/charts.csv +26 -0
- package/.github/skills/ui-ux-pro-max/data/colors.csv +97 -0
- package/.github/skills/ui-ux-pro-max/data/icons.csv +101 -0
- package/.github/skills/ui-ux-pro-max/data/landing.csv +31 -0
- package/.github/skills/ui-ux-pro-max/data/products.csv +97 -0
- package/.github/skills/ui-ux-pro-max/data/react-performance.csv +45 -0
- package/.github/skills/ui-ux-pro-max/data/stacks/astro.csv +54 -0
- package/.github/skills/ui-ux-pro-max/data/stacks/flutter.csv +53 -0
- package/.github/skills/ui-ux-pro-max/data/stacks/html-tailwind.csv +56 -0
- package/.github/skills/ui-ux-pro-max/data/stacks/jetpack-compose.csv +53 -0
- package/.github/skills/ui-ux-pro-max/data/stacks/nextjs.csv +53 -0
- package/.github/skills/ui-ux-pro-max/data/stacks/nuxt-ui.csv +51 -0
- package/.github/skills/ui-ux-pro-max/data/stacks/nuxtjs.csv +59 -0
- package/.github/skills/ui-ux-pro-max/data/stacks/react-native.csv +52 -0
- package/.github/skills/ui-ux-pro-max/data/stacks/react.csv +54 -0
- package/.github/skills/ui-ux-pro-max/data/stacks/shadcn.csv +61 -0
- package/.github/skills/ui-ux-pro-max/data/stacks/svelte.csv +54 -0
- package/.github/skills/ui-ux-pro-max/data/stacks/swiftui.csv +51 -0
- package/.github/skills/ui-ux-pro-max/data/stacks/vue.csv +50 -0
- package/.github/skills/ui-ux-pro-max/data/styles.csv +68 -0
- package/.github/skills/ui-ux-pro-max/data/typography.csv +58 -0
- package/.github/skills/ui-ux-pro-max/data/ui-reasoning.csv +101 -0
- package/.github/skills/ui-ux-pro-max/data/ux-guidelines.csv +100 -0
- package/.github/skills/ui-ux-pro-max/data/web-interface.csv +31 -0
- package/.github/skills/ui-ux-pro-max/scripts/core.py +253 -0
- package/.github/skills/ui-ux-pro-max/scripts/design_system.py +1067 -0
- package/.github/skills/ui-ux-pro-max/scripts/search.py +114 -0
- package/.github/skills/use-case-canvas-builder/SKILL.md +95 -0
- package/.github/skills/use-case-canvas-builder/references/canvas-pattern.md +106 -0
- package/.github/skills/use-case-dependency-mapper/SKILL.md +153 -0
- package/.github/skills/use-case-dependency-mapper/evals/evals.json +23 -0
- package/.github/skills/use-case-dependency-mapper/references/dependency-categories.md +201 -0
- package/.github/skills/use-case-prioritization/SKILL.md +79 -0
- package/.github/skills/use-case-prioritization/evals/evals.json +34 -0
- package/.github/skills/use-case-prioritization/evals/files/candidate-use-cases.md +43 -0
- package/.github/skills/use-case-prioritization/evals/files/workshop-output-notes.md +8 -0
- package/.github/skills/use-case-prioritization/references/matrix-pattern.md +52 -0
- package/.github/skills/user-persona-development/README.md +44 -0
- package/.github/skills/user-persona-development/SKILL.md +155 -0
- package/.github/skills/user-persona-development/evals/evals.json +23 -0
- package/.github/skills/user-persona-development/examples/approver-persona-example.md +26 -0
- package/.github/skills/user-persona-development/examples/executive-sponsor-persona-example.md +26 -0
- package/.github/skills/user-persona-development/examples/operations-persona-example.md +26 -0
- package/.github/skills/user-persona-development/examples/technical-operator-persona-example.md +26 -0
- package/.github/skills/user-persona-development/references/ai-solution-persona-considerations.md +46 -0
- package/.github/skills/user-persona-development/references/persona-field-guide.md +90 -0
- package/.github/skills/user-persona-development/references/persona-quality-checklist.md +38 -0
- package/.github/skills/user-persona-development/references/policy-defaults.md +37 -0
- package/.github/skills/user-persona-development/references/source-grounding-rules.md +37 -0
- package/.github/skills/user-persona-development/references/stakeholder-to-persona-rules.md +49 -0
- package/.github/skills/user-persona-development/scripts/validate_persona_fields.py +70 -0
- package/.github/skills/user-persona-development/templates/backlog-implications-template.md +12 -0
- package/.github/skills/user-persona-development/templates/change-management-implications-template.md +11 -0
- package/.github/skills/user-persona-development/templates/design-implications-template.md +12 -0
- package/.github/skills/user-persona-development/templates/persona-gap-analysis.md +20 -0
- package/.github/skills/user-persona-development/templates/persona-summary-table.md +13 -0
- package/.github/skills/user-persona-development/templates/persona-template.md +38 -0
- package/.github/skills/user-persona-quality-evaluator/README.md +12 -0
- package/.github/skills/user-persona-quality-evaluator/SKILL.md +58 -0
- package/.github/skills/user-persona-quality-evaluator/evals/evals.json +17 -0
- package/.github/skills/user-persona-quality-evaluator/references/scoring-rubric.md +42 -0
- package/.github/skills/vscode-github-custom-agent-builder/README.md +24 -0
- package/.github/skills/vscode-github-custom-agent-builder/SKILL.md +162 -0
- package/.github/skills/vscode-github-custom-agent-builder/evals/evals.json +57 -0
- package/.github/skills/vscode-github-custom-agent-builder/examples/broken-reviewer.agent.md +14 -0
- package/.github/skills/vscode-github-custom-agent-builder/examples/legacy-planner.chatmode.md +11 -0
- package/.github/skills/vscode-github-custom-agent-builder/references/agents.md +108 -0
- package/.github/skills/vscode-github-custom-agent-builder/references/claude-agent-format.md +33 -0
- package/.github/skills/vscode-github-custom-agent-builder/references/custom-agent-schema.md +43 -0
- package/.github/skills/vscode-github-custom-agent-builder/references/frontmatter-standard.md +53 -0
- package/.github/skills/vscode-github-custom-agent-builder/references/hooks.md +96 -0
- package/.github/skills/vscode-github-custom-agent-builder/references/instructions.md +71 -0
- package/.github/skills/vscode-github-custom-agent-builder/references/jumpstart-agent-patterns.md +44 -0
- package/.github/skills/vscode-github-custom-agent-builder/references/prompts.md +80 -0
- package/.github/skills/vscode-github-custom-agent-builder/references/schema-drift-policy.md +43 -0
- package/.github/skills/vscode-github-custom-agent-builder/references/skills.md +100 -0
- package/.github/skills/vscode-github-custom-agent-builder/references/validation-rules.md +40 -0
- package/.github/skills/vscode-github-custom-agent-builder/references/workspace-instructions.md +66 -0
- package/.github/skills/vscode-github-custom-agent-builder/scripts/_agent_frontmatter.py +117 -0
- package/.github/skills/vscode-github-custom-agent-builder/scripts/check_custom_agent_schema.py +149 -0
- package/.github/skills/vscode-github-custom-agent-builder/scripts/migrate_chatmode_to_agent.py +36 -0
- package/.github/skills/vscode-github-custom-agent-builder/scripts/normalize_agent_frontmatter.py +39 -0
- package/.github/skills/vscode-github-custom-agent-builder/scripts/validate_agents.py +125 -0
- package/.github/skills/vscode-github-custom-agent-builder/templates/agent-validation-report.md +35 -0
- package/.github/skills/vscode-github-custom-agent-builder/templates/claude-agent-template.md +10 -0
- package/.github/skills/vscode-github-custom-agent-builder/templates/github-copilot-agent-template.agent.md +35 -0
- package/.github/skills/vscode-github-custom-agent-builder/templates/implementer.agent.md +48 -0
- package/.github/skills/vscode-github-custom-agent-builder/templates/jumpstart-solution-design.agent.md +48 -0
- package/.github/skills/vscode-github-custom-agent-builder/templates/jumpstart-workbench.agent.md +50 -0
- package/.github/skills/vscode-github-custom-agent-builder/templates/orchestrator.agent.md +46 -0
- package/.github/skills/vscode-github-custom-agent-builder/templates/planner.agent.md +54 -0
- package/.github/skills/vscode-github-custom-agent-builder/templates/reviewer.agent.md +53 -0
- package/.github/skills/vscode-github-custom-agent-builder/templates/schema-drift-report.md +41 -0
- package/.github/skills/vscode-github-custom-agent-builder/templates/vscode-agent-frontmatter.yaml +13 -0
- package/.github/skills/vscode-github-custom-agent-builder/templates/vscode-agent-template.agent.md +43 -0
- package/.github/skills/vuejs-developer/README.md +17 -0
- package/.github/skills/vuejs-developer/SKILL.md +189 -0
- package/.github/skills/vuejs-developer/evals/eval-cases.md +31 -0
- package/.github/skills/vuejs-developer/evals/eval-plan.md +20 -0
- package/.github/skills/vuejs-developer/evals/eval-rubric.md +44 -0
- package/.github/skills/vuejs-developer/references/accessibility.md +23 -0
- package/.github/skills/vuejs-developer/references/ai-ui-patterns.md +27 -0
- package/.github/skills/vuejs-developer/references/api-integration.md +43 -0
- package/.github/skills/vuejs-developer/references/ci-cd.md +28 -0
- package/.github/skills/vuejs-developer/references/component-architecture.md +34 -0
- package/.github/skills/vuejs-developer/references/deployment.md +34 -0
- package/.github/skills/vuejs-developer/references/forms-validation.md +24 -0
- package/.github/skills/vuejs-developer/references/nuxt-patterns.md +21 -0
- package/.github/skills/vuejs-developer/references/performance.md +22 -0
- package/.github/skills/vuejs-developer/references/pinia-state-management.md +44 -0
- package/.github/skills/vuejs-developer/references/project-structure.md +46 -0
- package/.github/skills/vuejs-developer/references/review-queue-patterns.md +27 -0
- package/.github/skills/vuejs-developer/references/security.md +23 -0
- package/.github/skills/vuejs-developer/references/styling-design-system.md +25 -0
- package/.github/skills/vuejs-developer/references/testing.md +42 -0
- package/.github/skills/vuejs-developer/references/vue-router-patterns.md +45 -0
- package/.github/skills/vuejs-developer/references/vue3-modern-standards.md +55 -0
- package/.github/skills/vuejs-developer/scripts/check_accessibility_patterns.py +19 -0
- package/.github/skills/vuejs-developer/scripts/detect_vue_stack.py +28 -0
- package/.github/skills/vuejs-developer/scripts/generate_component_map.py +19 -0
- package/.github/skills/vuejs-developer/scripts/generate_frontend_backlog.py +18 -0
- package/.github/skills/vuejs-developer/scripts/inspect_vue_project.py +32 -0
- package/.github/skills/vuejs-developer/templates/.env.example +8 -0
- package/.github/skills/vuejs-developer/templates/.env.local.example +8 -0
- package/.github/skills/vuejs-developer/templates/Dockerfile +12 -0
- package/.github/skills/vuejs-developer/templates/api-client.ts +32 -0
- package/.github/skills/vuejs-developer/templates/base-button.vue +42 -0
- package/.github/skills/vuejs-developer/templates/base-modal.vue +59 -0
- package/.github/skills/vuejs-developer/templates/citation-panel.vue +25 -0
- package/.github/skills/vuejs-developer/templates/document-upload-view.vue +35 -0
- package/.github/skills/vuejs-developer/templates/github-actions-vue.yml +36 -0
- package/.github/skills/vuejs-developer/templates/main.ts +12 -0
- package/.github/skills/vuejs-developer/templates/nginx.conf +16 -0
- package/.github/skills/vuejs-developer/templates/package.vue-vite-ts.json +34 -0
- package/.github/skills/vuejs-developer/templates/pinia-store.ts +26 -0
- package/.github/skills/vuejs-developer/templates/playwright.config.ts +16 -0
- package/.github/skills/vuejs-developer/templates/rag-chat-view.vue +43 -0
- package/.github/skills/vuejs-developer/templates/retrieval-result-card.vue +36 -0
- package/.github/skills/vuejs-developer/templates/review-queue-view.vue +62 -0
- package/.github/skills/vuejs-developer/templates/router.ts +39 -0
- package/.github/skills/vuejs-developer/templates/tsconfig.json +19 -0
- package/.github/skills/vuejs-developer/templates/vite.config.ts +15 -0
- package/.github/skills/vuejs-developer/templates/vitest.config.ts +11 -0
- package/.github/skills/win-theme-extractor/SKILL.md +125 -0
- package/.github/skills/win-theme-extractor/evals/evals.json +37 -0
- package/.github/skills/win-theme-extractor/references/battlecard-to-theme-patterns.md +93 -0
- package/.github/skills/win-theme-extractor/references/proof-mapping-matrix.md +34 -0
- package/.github/skills/win-theme-extractor/references/win-theme-scorecard.md +45 -0
- package/.github/skills/work-breakdown-builder/SKILL.md +117 -0
- package/.github/skills/work-breakdown-builder/evals/evals.json +44 -0
- package/.github/skills/work-breakdown-builder/references/Cloud Infrastructure WBS Template.xlsx +0 -0
- package/.github/skills/work-breakdown-builder/references/mock-wbs-data.json +258 -0
- package/.github/skills/work-breakdown-builder/references/wbs-structure.md +67 -0
- package/.github/skills/work-breakdown-builder/scripts/create_wbs_workbook.py +242 -0
- package/.github/skills/xlsx/LICENSE.txt +30 -0
- package/.github/skills/xlsx/SKILL.md +292 -0
- package/.github/skills/xlsx/scripts/office/__pycache__/soffice.cpython-312.pyc +0 -0
- package/.github/skills/xlsx/scripts/office/helpers/__init__.py +0 -0
- package/.github/skills/xlsx/scripts/office/helpers/merge_runs.py +199 -0
- package/.github/skills/xlsx/scripts/office/helpers/simplify_redlines.py +197 -0
- package/.github/skills/xlsx/scripts/office/pack.py +159 -0
- package/.github/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
- package/.github/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
- package/.github/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
- package/.github/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
- package/.github/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
- package/.github/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
- package/.github/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
- package/.github/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
- package/.github/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
- package/.github/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
- package/.github/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
- package/.github/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
- package/.github/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
- package/.github/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
- package/.github/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
- package/.github/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
- package/.github/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
- package/.github/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
- package/.github/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
- package/.github/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
- package/.github/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
- package/.github/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
- package/.github/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
- package/.github/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
- package/.github/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
- package/.github/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
- package/.github/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
- package/.github/skills/xlsx/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
- package/.github/skills/xlsx/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
- package/.github/skills/xlsx/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
- package/.github/skills/xlsx/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
- package/.github/skills/xlsx/scripts/office/schemas/mce/mc.xsd +75 -0
- package/.github/skills/xlsx/scripts/office/schemas/microsoft/wml-2010.xsd +560 -0
- package/.github/skills/xlsx/scripts/office/schemas/microsoft/wml-2012.xsd +67 -0
- package/.github/skills/xlsx/scripts/office/schemas/microsoft/wml-2018.xsd +14 -0
- package/.github/skills/xlsx/scripts/office/schemas/microsoft/wml-cex-2018.xsd +20 -0
- package/.github/skills/xlsx/scripts/office/schemas/microsoft/wml-cid-2016.xsd +13 -0
- package/.github/skills/xlsx/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
- package/.github/skills/xlsx/scripts/office/schemas/microsoft/wml-symex-2015.xsd +8 -0
- package/.github/skills/xlsx/scripts/office/soffice.py +183 -0
- package/.github/skills/xlsx/scripts/office/unpack.py +132 -0
- package/.github/skills/xlsx/scripts/office/validate.py +111 -0
- package/.github/skills/xlsx/scripts/office/validators/__init__.py +15 -0
- package/.github/skills/xlsx/scripts/office/validators/base.py +847 -0
- package/.github/skills/xlsx/scripts/office/validators/docx.py +446 -0
- package/.github/skills/xlsx/scripts/office/validators/pptx.py +275 -0
- package/.github/skills/xlsx/scripts/office/validators/redlining.py +247 -0
- package/.github/skills/xlsx/scripts/recalc.py +184 -0
- package/.github/workflows/quality.yml +6 -4
- package/.github/workflows/release-readiness.yml +41 -0
- package/.github/workflows/security.yml +38 -0
- package/.github/workflows/spec-validation.yml +35 -0
- package/.github/workflows/traceability.yml +38 -0
- package/.jumpstart/agents/autonav.md +194 -0
- package/.jumpstart/agents/qa.md +1 -1
- package/.jumpstart/agents/scout.md +4 -0
- package/.jumpstart/compat/assistant-mapping.md +35 -14
- package/.jumpstart/config.yaml +13 -0
- package/.jumpstart/plugin/README.md +97 -0
- package/.jumpstart/plugin/plugin.json +36 -0
- package/.jumpstart/skills/acceptance-test-author/SKILL.md +246 -0
- package/.jumpstart/skills/acceptance-test-author/evals/evals.json +114 -0
- package/.jumpstart/skills/acceptance-test-author/references/ai-test-patterns.md +276 -0
- package/.jumpstart/skills/acceptance-test-author/references/gherkin-style-guide.md +285 -0
- package/.jumpstart/skills/acceptance-test-author/references/scenario-design-patterns.md +245 -0
- package/.jumpstart/skills/acceptance-test-author/references/traceability-template.md +73 -0
- package/.jumpstart/skills/acquire-codebase-knowledge/SKILL.md +174 -0
- package/.jumpstart/skills/acquire-codebase-knowledge/assets/templates/ARCHITECTURE.md +49 -0
- package/.jumpstart/skills/acquire-codebase-knowledge/assets/templates/CONCERNS.md +56 -0
- package/.jumpstart/skills/acquire-codebase-knowledge/assets/templates/CONVENTIONS.md +52 -0
- package/.jumpstart/skills/acquire-codebase-knowledge/assets/templates/INTEGRATIONS.md +48 -0
- package/.jumpstart/skills/acquire-codebase-knowledge/assets/templates/STACK.md +56 -0
- package/.jumpstart/skills/acquire-codebase-knowledge/assets/templates/STRUCTURE.md +44 -0
- package/.jumpstart/skills/acquire-codebase-knowledge/assets/templates/TESTING.md +57 -0
- package/.jumpstart/skills/acquire-codebase-knowledge/references/inquiry-checkpoints.md +70 -0
- package/.jumpstart/skills/acquire-codebase-knowledge/references/stack-detection.md +131 -0
- package/.jumpstart/skills/acquire-codebase-knowledge/scripts/scan.py +712 -0
- package/.jumpstart/skills/agent-approval-policy-spec/README.md +27 -0
- package/.jumpstart/skills/agent-approval-policy-spec/SKILL.md +138 -0
- package/.jumpstart/skills/agent-approval-policy-spec/evals/evals.json +29 -0
- package/.jumpstart/skills/agent-approval-policy-spec/examples/operations-approval-policy-example.md +21 -0
- package/.jumpstart/skills/agent-approval-policy-spec/examples/support-approval-policy-example.md +21 -0
- package/.jumpstart/skills/agent-approval-policy-spec/references/approval-policy-patterns.md +31 -0
- package/.jumpstart/skills/agent-approval-policy-spec/references/audit-field-minimum.md +20 -0
- package/.jumpstart/skills/agent-approval-policy-spec/references/decision-class-taxonomy.md +29 -0
- package/.jumpstart/skills/agent-approval-policy-spec/references/override-governance.md +23 -0
- package/.jumpstart/skills/agent-approval-policy-spec/templates/approval-policy.example.yaml +39 -0
- package/.jumpstart/skills/agent-approval-policy-spec/templates/approval-policy.schema.json +60 -0
- package/.jumpstart/skills/agent-approval-policy-spec/templates/decision-class-matrix.csv +4 -0
- package/.jumpstart/skills/agent-customization/SKILL.md +78 -0
- package/.jumpstart/skills/agent-customization/references/agents.md +111 -0
- package/.jumpstart/skills/agent-customization/references/hooks.md +96 -0
- package/.jumpstart/skills/agent-customization/references/instructions.md +71 -0
- package/.jumpstart/skills/agent-customization/references/prompts.md +80 -0
- package/.jumpstart/skills/agent-customization/references/skills.md +100 -0
- package/.jumpstart/skills/agent-customization/references/workspace-instructions.md +66 -0
- package/.jumpstart/skills/agent-prd-writer/SKILL.md +85 -0
- package/.jumpstart/skills/agent-prd-writer/evals/evals.json +17 -0
- package/.jumpstart/skills/agent-prd-writer/references/prd-pattern.md +21 -0
- package/.jumpstart/skills/agent-tool-catalog-designer/SKILL.md +107 -0
- package/.jumpstart/skills/agent-tool-catalog-designer/evals/evals.json +32 -0
- package/.jumpstart/skills/agent-tool-catalog-designer/examples/example-it-helpdesk-agent.md +57 -0
- package/.jumpstart/skills/agent-tool-catalog-designer/references/tool-design-patterns.md +60 -0
- package/.jumpstart/skills/agent-tool-catalog-designer/templates/tool-catalog.md +43 -0
- package/.jumpstart/skills/agent-tool-catalog-designer/templates/tool-spec.md +68 -0
- package/.jumpstart/skills/agent-workflow-state-machine/SKILL.md +172 -0
- package/.jumpstart/skills/agent-workflow-state-machine/evals/evals.json +44 -0
- package/.jumpstart/skills/agent-workflow-state-machine/examples/jumpstart-client-recap-example.md +55 -0
- package/.jumpstart/skills/agent-workflow-state-machine/references/guardrails-retries-approvals.md +75 -0
- package/.jumpstart/skills/agent-workflow-state-machine/references/state-machine-design-guide.md +77 -0
- package/.jumpstart/skills/agent-workflow-state-machine/templates/agent-workflow-state-machine.mmd +42 -0
- package/.jumpstart/skills/agent-workflow-state-machine/templates/agent-workflow-state-machine.yaml +113 -0
- package/.jumpstart/skills/agent-workflow-state-machine/templates/human-approval-matrix.md +15 -0
- package/.jumpstart/skills/agent-workflow-state-machine/templates/state-transition-table.csv +9 -0
- package/.jumpstart/skills/ai-cost-model-designer/SKILL.md +100 -0
- package/.jumpstart/skills/ai-cost-model-designer/evals/evals.json +31 -0
- package/.jumpstart/skills/ai-cost-model-designer/examples/example-support-copilot-cost-model.md +51 -0
- package/.jumpstart/skills/ai-cost-model-designer/references/cost-components.md +94 -0
- package/.jumpstart/skills/ai-cost-model-designer/references/cost-lever-catalog.md +44 -0
- package/.jumpstart/skills/ai-cost-model-designer/templates/cost-model.md +60 -0
- package/.jumpstart/skills/ai-team-orchestration/SKILL.md +148 -0
- package/.jumpstart/skills/ai-team-orchestration/references/anti-patterns.md +48 -0
- package/.jumpstart/skills/ai-team-orchestration/references/brainstorm-format.md +94 -0
- package/.jumpstart/skills/ai-team-orchestration/references/project-brief-template.md +147 -0
- package/.jumpstart/skills/ai-team-orchestration/references/sprint-plan-template.md +140 -0
- package/.jumpstart/skills/ai-use-case-readiness-assessor/SKILL.md +112 -0
- package/.jumpstart/skills/ai-use-case-readiness-assessor/evals/evals.json +47 -0
- package/.jumpstart/skills/ai-use-case-readiness-assessor/evals/files/readiness-board-strategy-agent.md +27 -0
- package/.jumpstart/skills/ai-use-case-readiness-assessor/evals/files/readiness-maintenance-copilot.md +32 -0
- package/.jumpstart/skills/ai-use-case-readiness-assessor/evals/files/readiness-prior-auth-triage.md +29 -0
- package/.jumpstart/skills/ai-use-case-readiness-assessor/examples/ai-readiness-examples.md +40 -0
- package/.jumpstart/skills/ai-use-case-readiness-assessor/references/output-template.md +65 -0
- package/.jumpstart/skills/ai-use-case-readiness-assessor/references/readiness-model.md +92 -0
- package/.jumpstart/skills/api-contract-test-generator/SKILL.md +76 -0
- package/.jumpstart/skills/api-contract-test-generator/evals/evals.json +74 -0
- package/.jumpstart/skills/api-contract-test-generator/examples/openapi-to-pytest-example.md +17 -0
- package/.jumpstart/skills/api-contract-test-generator/references/ci-gating.md +27 -0
- package/.jumpstart/skills/api-contract-test-generator/references/contract-test-strategy.md +26 -0
- package/.jumpstart/skills/api-contract-test-generator/references/test-case-taxonomy.md +29 -0
- package/.jumpstart/skills/api-contract-test-generator/scripts/assertion_runner.py +27 -0
- package/.jumpstart/skills/api-contract-test-generator/templates/contract-test-matrix.md +7 -0
- package/.jumpstart/skills/api-contract-test-generator/templates/dotnet-xunit-contract-suite.cs +54 -0
- package/.jumpstart/skills/api-contract-test-generator/templates/node-jest-contract-suite.ts +36 -0
- package/.jumpstart/skills/api-contract-test-generator/templates/pytest-contract-suite.py +33 -0
- package/.jumpstart/skills/api-contract-test-generator/templates/python-contract-suite.py +32 -0
- package/.jumpstart/skills/api-creator/SKILL.md +246 -0
- package/.jumpstart/skills/api-creator/evals/evals.json +97 -0
- package/.jumpstart/skills/api-creator/examples/agent-tool-api.md +38 -0
- package/.jumpstart/skills/api-creator/examples/multi-tenant-saas-api.md +30 -0
- package/.jumpstart/skills/api-creator/examples/restaurant-deals-api.md +40 -0
- package/.jumpstart/skills/api-creator/examples/square-integration-api.md +34 -0
- package/.jumpstart/skills/api-creator/examples/webhook-receiver-api.md +38 -0
- package/.jumpstart/skills/api-creator/references/agent-friendly-api-guide.md +53 -0
- package/.jumpstart/skills/api-creator/references/auth-guide.md +69 -0
- package/.jumpstart/skills/api-creator/references/error-model-guide.md +64 -0
- package/.jumpstart/skills/api-creator/references/fastapi-patterns.md +58 -0
- package/.jumpstart/skills/api-creator/references/openapi-guide.md +75 -0
- package/.jumpstart/skills/api-creator/references/pagination-guide.md +63 -0
- package/.jumpstart/skills/api-creator/references/production-readiness.md +53 -0
- package/.jumpstart/skills/api-creator/references/rest-design-guide.md +98 -0
- package/.jumpstart/skills/api-creator/references/webhook-guide.md +63 -0
- package/.jumpstart/skills/api-creator/scripts/assertion_runner.py +30 -0
- package/.jumpstart/skills/api-creator/templates/alembic-env.py +42 -0
- package/.jumpstart/skills/api-creator/templates/docker-compose.yml +26 -0
- package/.jumpstart/skills/api-creator/templates/fastapi-main.py +43 -0
- package/.jumpstart/skills/api-creator/templates/fastapi-repository.py +24 -0
- package/.jumpstart/skills/api-creator/templates/fastapi-route.py +30 -0
- package/.jumpstart/skills/api-creator/templates/fastapi-service.py +20 -0
- package/.jumpstart/skills/api-creator/templates/openapi-template.yaml +140 -0
- package/.jumpstart/skills/api-creator/templates/pydantic-schema.py +30 -0
- package/.jumpstart/skills/api-creator/templates/pytest-api-test.py +27 -0
- package/.jumpstart/skills/api-creator/templates/sqlmodel-model.py +27 -0
- package/.jumpstart/skills/api-design-principles/SKILL.md +528 -0
- package/.jumpstart/skills/api-design-principles/assets/api-design-checklist.md +155 -0
- package/.jumpstart/skills/api-design-principles/assets/rest-api-template.py +182 -0
- package/.jumpstart/skills/api-design-principles/references/graphql-schema-design.md +583 -0
- package/.jumpstart/skills/api-design-principles/references/rest-best-practices.md +408 -0
- package/.jumpstart/skills/api-reviewer/SKILL.md +76 -0
- package/.jumpstart/skills/api-reviewer/evals/evals.json +74 -0
- package/.jumpstart/skills/api-reviewer/examples/sample-review-output.md +22 -0
- package/.jumpstart/skills/api-reviewer/references/compatibility-checks.md +31 -0
- package/.jumpstart/skills/api-reviewer/references/review-checklist.md +41 -0
- package/.jumpstart/skills/api-reviewer/references/severity-model.md +23 -0
- package/.jumpstart/skills/api-reviewer/scripts/assertion_runner.py +27 -0
- package/.jumpstart/skills/api-reviewer/templates/api-review-report-template.md +28 -0
- package/.jumpstart/skills/api-version-migration/SKILL.md +80 -0
- package/.jumpstart/skills/api-version-migration/evals/evals.json +74 -0
- package/.jumpstart/skills/api-version-migration/examples/v1-to-v2-migration-example.md +24 -0
- package/.jumpstart/skills/api-version-migration/references/change-classification.md +29 -0
- package/.jumpstart/skills/api-version-migration/references/deprecation-policy.md +23 -0
- package/.jumpstart/skills/api-version-migration/references/migration-strategies.md +25 -0
- package/.jumpstart/skills/api-version-migration/scripts/assertion_runner.py +27 -0
- package/.jumpstart/skills/api-version-migration/templates/client-compatibility-matrix.md +4 -0
- package/.jumpstart/skills/api-version-migration/templates/migration-plan-template.md +26 -0
- package/.jumpstart/skills/architecture-blueprint-generator/SKILL.md +121 -0
- package/.jumpstart/skills/architecture-blueprint-generator/evals/evals.json +42 -0
- package/.jumpstart/skills/architecture-blueprint-generator/examples/blueprint-outline-example.md +25 -0
- package/.jumpstart/skills/architecture-blueprint-generator/examples/finding-style-example.md +29 -0
- package/.jumpstart/skills/architecture-blueprint-generator/references/analysis-checkpoints.md +61 -0
- package/.jumpstart/skills/architecture-blueprint-generator/references/decision-records.md +41 -0
- package/.jumpstart/skills/architecture-blueprint-generator/references/diagram-guidance.md +57 -0
- package/.jumpstart/skills/architecture-blueprint-generator/references/technology-patterns.md +83 -0
- package/.jumpstart/skills/architecture-blueprint-generator/references/workflow.md +81 -0
- package/.jumpstart/skills/architecture-blueprint-generator/templates/adr-template.md +31 -0
- package/.jumpstart/skills/architecture-blueprint-generator/templates/project-architecture-blueprint-template.md +114 -0
- package/.jumpstart/skills/architecture-patterns/SKILL.md +494 -0
- package/.jumpstart/skills/atlassian-capture-tasks-from-meeting-notes/SKILL.md +679 -0
- package/.jumpstart/skills/atlassian-capture-tasks-from-meeting-notes/references/action-item-patterns.md +445 -0
- package/.jumpstart/skills/atlassian-generate-status-report/SKILL.md +335 -0
- package/.jumpstart/skills/atlassian-generate-status-report/references/jql-patterns.md +82 -0
- package/.jumpstart/skills/atlassian-generate-status-report/references/report-templates.md +120 -0
- package/.jumpstart/skills/atlassian-generate-status-report/scripts/jql_builder.py +225 -0
- package/.jumpstart/skills/atlassian-search-company-knowledge/SKILL.md +575 -0
- package/.jumpstart/skills/atlassian-spec-to-backlog/SKILL.md +543 -0
- package/.jumpstart/skills/atlassian-spec-to-backlog/references/breakdown-examples.md +327 -0
- package/.jumpstart/skills/atlassian-spec-to-backlog/references/epic-templates.md +401 -0
- package/.jumpstart/skills/atlassian-spec-to-backlog/references/ticket-writing-guide.md +354 -0
- package/.jumpstart/skills/atlassian-triage-issue/SKILL.md +700 -0
- package/.jumpstart/skills/atlassian-triage-issue/references/bug-report-templates.md +451 -0
- package/.jumpstart/skills/atlassian-triage-issue/references/search-patterns.md +261 -0
- package/.jumpstart/skills/automate-this/SKILL.md +309 -0
- package/.jumpstart/skills/automate-this/evals/evals.json +73 -0
- package/.jumpstart/skills/automate-this/examples/automation-examples.md +311 -0
- package/.jumpstart/skills/automate-this/references/automation-patterns.md +476 -0
- package/.jumpstart/skills/automate-this/references/environment-detection.md +170 -0
- package/.jumpstart/skills/automate-this/references/security-credentials.md +280 -0
- package/.jumpstart/skills/automate-this/references/video-extraction.md +160 -0
- package/.jumpstart/skills/automate-this/templates/automation-proposal.md +99 -0
- package/.jumpstart/skills/automate-this/templates/environment-fingerprint.md +63 -0
- package/.jumpstart/skills/automate-this/templates/process-reconstruction.md +59 -0
- package/.jumpstart/skills/azure-architecture-autopilot/README.md +188 -0
- package/.jumpstart/skills/azure-architecture-autopilot/SKILL.md +170 -0
- package/.jumpstart/skills/azure-architecture-autopilot/assets/06-architecture-diagram.png +0 -0
- package/.jumpstart/skills/azure-architecture-autopilot/assets/07-azure-portal-resources.png +0 -0
- package/.jumpstart/skills/azure-architecture-autopilot/assets/08-deployment-succeeded.png +0 -0
- package/.jumpstart/skills/azure-architecture-autopilot/references/ai-data.md +254 -0
- package/.jumpstart/skills/azure-architecture-autopilot/references/architecture-guidance-sources.md +117 -0
- package/.jumpstart/skills/azure-architecture-autopilot/references/azure-common-patterns.md +170 -0
- package/.jumpstart/skills/azure-architecture-autopilot/references/azure-dynamic-sources.md +93 -0
- package/.jumpstart/skills/azure-architecture-autopilot/references/bicep-generator.md +421 -0
- package/.jumpstart/skills/azure-architecture-autopilot/references/bicep-reviewer.md +144 -0
- package/.jumpstart/skills/azure-architecture-autopilot/references/phase0-scanner.md +475 -0
- package/.jumpstart/skills/azure-architecture-autopilot/references/phase1-advisor.md +922 -0
- package/.jumpstart/skills/azure-architecture-autopilot/references/phase4-deployer.md +318 -0
- package/.jumpstart/skills/azure-architecture-autopilot/references/service-gotchas.md +113 -0
- package/.jumpstart/skills/azure-architecture-autopilot/scripts/cli.py +153 -0
- package/.jumpstart/skills/azure-architecture-autopilot/scripts/generator.py +2038 -0
- package/.jumpstart/skills/azure-architecture-autopilot/scripts/icons.py +3200 -0
- package/.jumpstart/skills/azure-devops-delivery-builder/README.md +36 -0
- package/.jumpstart/skills/azure-devops-delivery-builder/SKILL.md +197 -0
- package/.jumpstart/skills/azure-devops-delivery-builder/evals/evals.json +64 -0
- package/.jumpstart/skills/azure-devops-delivery-builder/examples/fixtures/backlog-items-smoke.json +35 -0
- package/.jumpstart/skills/azure-devops-delivery-builder/examples/jumpstart-to-ado-backlog-example.md +59 -0
- package/.jumpstart/skills/azure-devops-delivery-builder/references/acceptance-criteria-and-quality.md +54 -0
- package/.jumpstart/skills/azure-devops-delivery-builder/references/ado-traceability-and-pipelines.md +37 -0
- package/.jumpstart/skills/azure-devops-delivery-builder/references/ai-work-item-patterns.md +43 -0
- package/.jumpstart/skills/azure-devops-delivery-builder/references/backlog-decomposition.md +47 -0
- package/.jumpstart/skills/azure-devops-delivery-builder/references/jumpstart-and-pod-alignment.md +41 -0
- package/.jumpstart/skills/azure-devops-delivery-builder/references/process-templates.md +61 -0
- package/.jumpstart/skills/azure-devops-delivery-builder/references/wiql-and-reporting.md +80 -0
- package/.jumpstart/skills/azure-devops-delivery-builder/scripts/generate_azure_devops_csv.py +138 -0
- package/.jumpstart/skills/azure-devops-delivery-builder/scripts/smoke_test_csv_tools.py +56 -0
- package/.jumpstart/skills/azure-devops-delivery-builder/scripts/validate_azure_boards_backlog.py +105 -0
- package/.jumpstart/skills/azure-devops-delivery-builder/templates/ado-import-template.csv +5 -0
- package/.jumpstart/skills/azure-devops-delivery-builder/templates/backlog-items-template.json +48 -0
- package/.jumpstart/skills/azure-devops-delivery-builder/templates/bug-template.md +27 -0
- package/.jumpstart/skills/azure-devops-delivery-builder/templates/epic-template.md +36 -0
- package/.jumpstart/skills/azure-devops-delivery-builder/templates/feature-template.md +33 -0
- package/.jumpstart/skills/azure-devops-delivery-builder/templates/spike-template.md +26 -0
- package/.jumpstart/skills/azure-devops-delivery-builder/templates/story-pbi-template.md +35 -0
- package/.jumpstart/skills/azure-devops-delivery-builder/templates/task-template.md +18 -0
- package/.jumpstart/skills/azure-devops-execution/README.md +22 -0
- package/.jumpstart/skills/azure-devops-execution/SKILL.md +48 -0
- package/.jumpstart/skills/azure-devops-execution/scripts/import_csv_to_ado.py +144 -0
- package/.jumpstart/skills/azure-devops-execution/scripts/run_wiql.py +59 -0
- package/.jumpstart/skills/azure-pricing/SKILL.md +189 -0
- package/.jumpstart/skills/azure-pricing/references/COPILOT-STUDIO-RATES.md +135 -0
- package/.jumpstart/skills/azure-pricing/references/COST-ESTIMATOR.md +142 -0
- package/.jumpstart/skills/azure-pricing/references/REGIONS.md +84 -0
- package/.jumpstart/skills/azure-pricing/references/SERVICE-NAMES.md +106 -0
- package/.jumpstart/skills/bias-and-anti-pattern-checker/SKILL.md +89 -0
- package/.jumpstart/skills/bias-and-anti-pattern-checker/evals/evals.json +17 -0
- package/.jumpstart/skills/bias-and-anti-pattern-checker/references/anti-pattern-catalog.md +79 -0
- package/.jumpstart/skills/bottom-up-estimation/SKILL.md +182 -0
- package/.jumpstart/skills/bottom-up-estimation/evals/evals.json +41 -0
- package/.jumpstart/skills/bottom-up-estimation/references/ai-pod-adjustment-guide.md +46 -0
- package/.jumpstart/skills/bottom-up-estimation/references/estimation-methodology.md +132 -0
- package/.jumpstart/skills/bottom-up-estimation/references/output-package-guide.md +45 -0
- package/.jumpstart/skills/bottom-up-estimation/references/pod-tier-mapping.md +30 -0
- package/.jumpstart/skills/bottom-up-estimation/references/pricing-conversion-guide.md +27 -0
- package/.jumpstart/skills/bottom-up-estimation/templates/estimate-package-template.md +117 -0
- package/.jumpstart/skills/bottom-up-estimation/templates/estimation-worksheet-template.csv +16 -0
- package/.jumpstart/skills/business-logic-extractor/SKILL.md +79 -0
- package/.jumpstart/skills/business-logic-extractor/evals/evals.json +33 -0
- package/.jumpstart/skills/business-logic-extractor/evals/files/intake-workflow-notes.md +30 -0
- package/.jumpstart/skills/business-logic-extractor/evals/files/process-narrative.md +3 -0
- package/.jumpstart/skills/business-logic-extractor/references/logic-pattern.md +46 -0
- package/.jumpstart/skills/change-management-readiness/SKILL.md +80 -0
- package/.jumpstart/skills/change-management-readiness/evals/evals.json +30 -0
- package/.jumpstart/skills/change-management-readiness/references/adoption-risk-rubric.md +86 -0
- package/.jumpstart/skills/change-management-readiness/templates/change-readiness-scorecard-template.md +58 -0
- package/.jumpstart/skills/cloud-design-patterns/SKILL.md +62 -0
- package/.jumpstart/skills/cloud-design-patterns/references/architecture-design.md +127 -0
- package/.jumpstart/skills/cloud-design-patterns/references/azure-service-mappings.md +13 -0
- package/.jumpstart/skills/cloud-design-patterns/references/best-practices.md +34 -0
- package/.jumpstart/skills/cloud-design-patterns/references/deployment-operational.md +91 -0
- package/.jumpstart/skills/cloud-design-patterns/references/event-driven.md +21 -0
- package/.jumpstart/skills/cloud-design-patterns/references/messaging-integration.md +127 -0
- package/.jumpstart/skills/cloud-design-patterns/references/performance.md +180 -0
- package/.jumpstart/skills/cloud-design-patterns/references/reliability-resilience.md +156 -0
- package/.jumpstart/skills/cloud-design-patterns/references/security.md +55 -0
- package/.jumpstart/skills/code-tour/SKILL.md +433 -0
- package/.jumpstart/skills/code-tour/references/codetour-schema.json +115 -0
- package/.jumpstart/skills/code-tour/references/examples.md +195 -0
- package/.jumpstart/skills/code-tour/scripts/generate_from_docs.py +286 -0
- package/.jumpstart/skills/code-tour/scripts/validate_tour.py +346 -0
- package/.jumpstart/skills/company-research/SKILL.md +228 -0
- package/.jumpstart/skills/company-research/evals/evals.json +23 -0
- package/.jumpstart/skills/company-research/examples/sample.md +98 -0
- package/.jumpstart/skills/company-research/references/jumpstart-company-research-workflow.md +65 -0
- package/.jumpstart/skills/company-research/templates/template.md +121 -0
- package/.jumpstart/skills/copilot-sdk/SKILL.md +102 -0
- package/.jumpstart/skills/copilot-sdk/evals/evals.json +29 -0
- package/.jumpstart/skills/copilot-sdk/examples/copilot-sdk-recipes.md +73 -0
- package/.jumpstart/skills/copilot-sdk/references/architecture-and-runtime.md +73 -0
- package/.jumpstart/skills/copilot-sdk/references/session-patterns.md +90 -0
- package/.jumpstart/skills/copilot-sdk/references/tools-and-mcp.md +79 -0
- package/.jumpstart/skills/copilot-sdk/references/troubleshooting.md +99 -0
- package/.jumpstart/skills/copilot-sdk/templates/copilot-sdk-design-template.md +51 -0
- package/.jumpstart/skills/copilot-sdk/templates/python-starter.py +42 -0
- package/.jumpstart/skills/copilot-sdk/templates/typescript-starter.ts +35 -0
- package/.jumpstart/skills/cost-optimization/SKILL.md +295 -0
- package/.jumpstart/skills/cqrs-implementation/SKILL.md +554 -0
- package/.jumpstart/skills/crafting-effective-readmes/README.md +180 -0
- package/.jumpstart/skills/crafting-effective-readmes/SKILL.md +78 -0
- package/.jumpstart/skills/crafting-effective-readmes/references/art-of-readme.md +536 -0
- package/.jumpstart/skills/crafting-effective-readmes/references/make-a-readme.md +119 -0
- package/.jumpstart/skills/crafting-effective-readmes/references/standard-readme-example-maximal.md +68 -0
- package/.jumpstart/skills/crafting-effective-readmes/references/standard-readme-example-minimal.md +21 -0
- package/.jumpstart/skills/crafting-effective-readmes/references/standard-readme-spec.md +242 -0
- package/.jumpstart/skills/crafting-effective-readmes/section-checklist.md +17 -0
- package/.jumpstart/skills/crafting-effective-readmes/style-guide.md +13 -0
- package/.jumpstart/skills/crafting-effective-readmes/templates/internal.md +106 -0
- package/.jumpstart/skills/crafting-effective-readmes/templates/oss.md +77 -0
- package/.jumpstart/skills/crafting-effective-readmes/templates/personal.md +51 -0
- package/.jumpstart/skills/crafting-effective-readmes/templates/xdg-config.md +71 -0
- package/.jumpstart/skills/crafting-effective-readmes/using-references.md +35 -0
- package/.jumpstart/skills/current-state-process-miner/SKILL.md +78 -0
- package/.jumpstart/skills/current-state-process-miner/evals/evals.json +42 -0
- package/.jumpstart/skills/current-state-process-miner/references/process-mining-workflow.md +73 -0
- package/.jumpstart/skills/current-state-process-miner/templates/as-is-process-map-template.md +81 -0
- package/.jumpstart/skills/data-readiness-assessor/SKILL.md +130 -0
- package/.jumpstart/skills/data-readiness-assessor/evals/evals.json +37 -0
- package/.jumpstart/skills/data-readiness-assessor/evals/files/data-readiness-fieldservice-copilot.md +40 -0
- package/.jumpstart/skills/data-readiness-assessor/evals/files/data-readiness-public-sector-permit-triage.md +40 -0
- package/.jumpstart/skills/data-readiness-assessor/examples/example-claims-rag-readiness.md +74 -0
- package/.jumpstart/skills/data-readiness-assessor/references/scoring-rubric.md +87 -0
- package/.jumpstart/skills/data-readiness-assessor/references/sensitivity-classification.md +44 -0
- package/.jumpstart/skills/data-readiness-assessor/templates/data-source-inventory.md +44 -0
- package/.jumpstart/skills/database-schema-designer/README.md +212 -0
- package/.jumpstart/skills/database-schema-designer/SKILL.md +687 -0
- package/.jumpstart/skills/database-schema-designer/assets/templates/migration-template.sql +60 -0
- package/.jumpstart/skills/database-schema-designer/references/schema-design-checklist.md +118 -0
- package/.jumpstart/skills/dependency-bottleneck-detector/README.md +77 -0
- package/.jumpstart/skills/dependency-bottleneck-detector/SKILL.md +307 -0
- package/.jumpstart/skills/dependency-bottleneck-detector/evals/evals.json +60 -0
- package/.jumpstart/skills/dependency-bottleneck-detector/references/dependency-taxonomy.md +351 -0
- package/.jumpstart/skills/dependency-bottleneck-detector/references/escalation-patterns.md +220 -0
- package/.jumpstart/skills/dependency-bottleneck-detector/references/proactive-detection.md +155 -0
- package/.jumpstart/skills/dependency-bottleneck-detector/references/unblock-strategies.md +274 -0
- package/.jumpstart/skills/dependency-bottleneck-detector/scripts/dependency_scan.py +175 -0
- package/.jumpstart/skills/dependency-bottleneck-detector/scripts/dependency_tracker.py +291 -0
- package/.jumpstart/skills/dependency-bottleneck-detector/scripts/escalation_timer.py +116 -0
- package/.jumpstart/skills/dependency-bottleneck-detector/templates/client-dependency-summary.md +71 -0
- package/.jumpstart/skills/dependency-bottleneck-detector/templates/dependency-bottleneck-report.md +143 -0
- package/.jumpstart/skills/dependency-bottleneck-detector/templates/dependency-inventory.md +88 -0
- package/.jumpstart/skills/dependency-bottleneck-detector/templates/escalation-email.md +155 -0
- package/.jumpstart/skills/dependency-bottleneck-detector/templates/unblock-action-plan.md +106 -0
- package/.jumpstart/skills/design-md-auditor/README.md +19 -0
- package/.jumpstart/skills/design-md-auditor/SKILL.md +68 -0
- package/.jumpstart/skills/design-md-auditor/evals/evals.json +23 -0
- package/.jumpstart/skills/design-md-auditor/references/ai-workflow-checks.md +23 -0
- package/.jumpstart/skills/design-md-auditor/references/audit-rubric.md +40 -0
- package/.jumpstart/skills/design-md-auditor/references/severity-model.md +33 -0
- package/.jumpstart/skills/design-md-auditor/templates/compliance-report-template.md +23 -0
- package/.jumpstart/skills/design-md-creator/README.md +49 -0
- package/.jumpstart/skills/design-md-creator/SKILL.md +146 -0
- package/.jumpstart/skills/design-md-creator/evals/evals.json +23 -0
- package/.jumpstart/skills/design-md-creator/evals/rubric.md +27 -0
- package/.jumpstart/skills/design-md-creator/examples/prompts.md +23 -0
- package/.jumpstart/skills/design-md-creator/references/accessibility-rules.md +35 -0
- package/.jumpstart/skills/design-md-creator/references/ai-ui-patterns.md +36 -0
- package/.jumpstart/skills/design-md-creator/references/anti-patterns.md +34 -0
- package/.jumpstart/skills/design-md-creator/references/component-standards.md +39 -0
- package/.jumpstart/skills/design-md-creator/references/design-md-structure.md +69 -0
- package/.jumpstart/skills/design-md-creator/references/design-review-checklist.md +32 -0
- package/.jumpstart/skills/design-md-creator/references/framework-implementation-notes.md +42 -0
- package/.jumpstart/skills/design-md-creator/references/responsive-design.md +32 -0
- package/.jumpstart/skills/design-md-creator/references/stitch-design-md-notes.md +36 -0
- package/.jumpstart/skills/design-md-creator/references/visual-language-guide.md +40 -0
- package/.jumpstart/skills/design-md-creator/scripts/generate_design_review.py +68 -0
- package/.jumpstart/skills/design-md-creator/scripts/inspect_design_md.py +63 -0
- package/.jumpstart/skills/design-md-creator/templates/DESIGN.enterprise-ai.md +92 -0
- package/.jumpstart/skills/design-md-creator/templates/DESIGN.power-platform.md +17 -0
- package/.jumpstart/skills/design-md-creator/templates/DESIGN.rag-chat.md +42 -0
- package/.jumpstart/skills/design-md-creator/templates/DESIGN.react.md +18 -0
- package/.jumpstart/skills/design-md-creator/templates/DESIGN.review-queue.md +41 -0
- package/.jumpstart/skills/design-md-creator/templates/DESIGN.vue.md +19 -0
- package/.jumpstart/skills/design-token-sync/README.md +20 -0
- package/.jumpstart/skills/design-token-sync/SKILL.md +54 -0
- package/.jumpstart/skills/design-token-sync/evals/evals.json +23 -0
- package/.jumpstart/skills/design-token-sync/references/framework-mappings.md +30 -0
- package/.jumpstart/skills/design-token-sync/references/token-taxonomy.md +42 -0
- package/.jumpstart/skills/design-token-sync/scripts/extract_design_tokens.py +52 -0
- package/.jumpstart/skills/design-token-sync/templates/tokens.css.md +16 -0
- package/.jumpstart/skills/design-token-sync/templates/tokens.design-system.json +48 -0
- package/.jumpstart/skills/devops-rollout-plan/SKILL.md +206 -0
- package/.jumpstart/skills/devops-rollout-plan/evals/evals.json +119 -0
- package/.jumpstart/skills/devops-rollout-plan/examples/azure-openai-agent-rollout.md +237 -0
- package/.jumpstart/skills/devops-rollout-plan/references/ai-agent-deployment.md +250 -0
- package/.jumpstart/skills/devops-rollout-plan/references/azure-safe-deployment.md +206 -0
- package/.jumpstart/skills/devops-rollout-plan/references/pod-delivery-context.md +206 -0
- package/.jumpstart/skills/devops-rollout-plan/templates/ai-agent-rollout-plan.md +326 -0
- package/.jumpstart/skills/devops-rollout-plan/templates/lightweight-rollout-plan.md +67 -0
- package/.jumpstart/skills/devops-rollout-plan/templates/standard-rollout-plan.md +340 -0
- package/.jumpstart/skills/discovery-depth-scorecard/SKILL.md +88 -0
- package/.jumpstart/skills/discovery-depth-scorecard/references/scoring-model.md +45 -0
- package/.jumpstart/skills/docx/LICENSE.txt +30 -0
- package/.jumpstart/skills/docx/SKILL.md +590 -0
- package/.jumpstart/skills/docx/scripts/__init__.py +1 -0
- package/.jumpstart/skills/docx/scripts/accept_changes.py +135 -0
- package/.jumpstart/skills/docx/scripts/comment.py +318 -0
- package/.jumpstart/skills/docx/scripts/office/helpers/__init__.py +0 -0
- package/.jumpstart/skills/docx/scripts/office/helpers/merge_runs.py +199 -0
- package/.jumpstart/skills/docx/scripts/office/helpers/simplify_redlines.py +197 -0
- package/.jumpstart/skills/docx/scripts/office/pack.py +159 -0
- package/.jumpstart/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
- package/.jumpstart/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
- package/.jumpstart/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
- package/.jumpstart/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
- package/.jumpstart/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
- package/.jumpstart/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
- package/.jumpstart/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
- package/.jumpstart/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
- package/.jumpstart/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
- package/.jumpstart/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
- package/.jumpstart/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
- package/.jumpstart/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
- package/.jumpstart/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
- package/.jumpstart/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
- package/.jumpstart/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
- package/.jumpstart/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
- package/.jumpstart/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
- package/.jumpstart/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
- package/.jumpstart/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
- package/.jumpstart/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
- package/.jumpstart/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
- package/.jumpstart/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
- package/.jumpstart/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
- package/.jumpstart/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
- package/.jumpstart/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
- package/.jumpstart/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
- package/.jumpstart/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
- package/.jumpstart/skills/docx/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
- package/.jumpstart/skills/docx/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
- package/.jumpstart/skills/docx/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
- package/.jumpstart/skills/docx/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
- package/.jumpstart/skills/docx/scripts/office/schemas/mce/mc.xsd +75 -0
- package/.jumpstart/skills/docx/scripts/office/schemas/microsoft/wml-2010.xsd +560 -0
- package/.jumpstart/skills/docx/scripts/office/schemas/microsoft/wml-2012.xsd +67 -0
- package/.jumpstart/skills/docx/scripts/office/schemas/microsoft/wml-2018.xsd +14 -0
- package/.jumpstart/skills/docx/scripts/office/schemas/microsoft/wml-cex-2018.xsd +20 -0
- package/.jumpstart/skills/docx/scripts/office/schemas/microsoft/wml-cid-2016.xsd +13 -0
- package/.jumpstart/skills/docx/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
- package/.jumpstart/skills/docx/scripts/office/schemas/microsoft/wml-symex-2015.xsd +8 -0
- package/.jumpstart/skills/docx/scripts/office/soffice.py +183 -0
- package/.jumpstart/skills/docx/scripts/office/unpack.py +132 -0
- package/.jumpstart/skills/docx/scripts/office/validate.py +111 -0
- package/.jumpstart/skills/docx/scripts/office/validators/__init__.py +15 -0
- package/.jumpstart/skills/docx/scripts/office/validators/base.py +847 -0
- package/.jumpstart/skills/docx/scripts/office/validators/docx.py +446 -0
- package/.jumpstart/skills/docx/scripts/office/validators/pptx.py +275 -0
- package/.jumpstart/skills/docx/scripts/office/validators/redlining.py +247 -0
- package/.jumpstart/skills/docx/scripts/templates/comments.xml +3 -0
- package/.jumpstart/skills/docx/scripts/templates/commentsExtended.xml +3 -0
- package/.jumpstart/skills/docx/scripts/templates/commentsExtensible.xml +3 -0
- package/.jumpstart/skills/docx/scripts/templates/commentsIds.xml +3 -0
- package/.jumpstart/skills/docx/scripts/templates/people.xml +3 -0
- package/.jumpstart/skills/dora-evaluation-report/README.md +49 -0
- package/.jumpstart/skills/dora-evaluation-report/SKILL.md +235 -0
- package/.jumpstart/skills/dora-evaluation-report/evals/evals.json +33 -0
- package/.jumpstart/skills/dora-evaluation-report/evals/files/sample-input.md +35 -0
- package/.jumpstart/skills/dora-evaluation-report/examples/product-team-dora-evaluation-example.md +36 -0
- package/.jumpstart/skills/dora-evaluation-report/references/dora-ai-capabilities-model.md +84 -0
- package/.jumpstart/skills/dora-evaluation-report/references/dora-assessment-method.md +99 -0
- package/.jumpstart/skills/dora-evaluation-report/references/dora-metrics-and-evidence.md +94 -0
- package/.jumpstart/skills/dora-evaluation-report/references/platform-and-team-health-guide.md +67 -0
- package/.jumpstart/skills/dora-evaluation-report/references/scoring-and-prioritization-model.md +71 -0
- package/.jumpstart/skills/dora-evaluation-report/templates/dora-30-60-90-roadmap-template.md +55 -0
- package/.jumpstart/skills/dora-evaluation-report/templates/dora-capability-scorecard-template.md +38 -0
- package/.jumpstart/skills/dora-evaluation-report/templates/dora-evaluation-report-template.md +150 -0
- package/.jumpstart/skills/dora-evaluation-report/templates/dora-evidence-register-template.csv +4 -0
- package/.jumpstart/skills/dora-evaluation-report/templates/dora-intake-questionnaire.md +49 -0
- package/.jumpstart/skills/dotnet-developer/SKILL.md +347 -0
- package/.jumpstart/skills/dotnet-developer/references/ai-integration-patterns.md +375 -0
- package/.jumpstart/skills/dotnet-developer/references/aspnet-core-api-patterns.md +380 -0
- package/.jumpstart/skills/dotnet-developer/references/authentication-authorization.md +296 -0
- package/.jumpstart/skills/dotnet-developer/references/azure-native-patterns.md +353 -0
- package/.jumpstart/skills/dotnet-developer/references/background-workers.md +342 -0
- package/.jumpstart/skills/dotnet-developer/references/ef-core-patterns.md +350 -0
- package/.jumpstart/skills/dotnet-developer/references/legacy-modernization.md +202 -0
- package/.jumpstart/skills/dotnet-developer/references/modern-dotnet-standards.md +235 -0
- package/.jumpstart/skills/dotnet-developer/references/observability.md +283 -0
- package/.jumpstart/skills/dotnet-developer/references/production-readiness.md +143 -0
- package/.jumpstart/skills/dotnet-developer/references/rag-document-workflows.md +372 -0
- package/.jumpstart/skills/dotnet-developer/references/security-checklist.md +262 -0
- package/.jumpstart/skills/dotnet-developer/references/testing-guide.md +354 -0
- package/.jumpstart/skills/dotnet-developer/scripts/inspect_dotnet_solution.py +353 -0
- package/.jumpstart/skills/dotnet-developer/templates/Dockerfile +55 -0
- package/.jumpstart/skills/dotnet-developer/templates/Program.controller-api.cs +141 -0
- package/.jumpstart/skills/dotnet-developer/templates/Program.minimal-api.cs +154 -0
- package/.jumpstart/skills/dotnet-developer/templates/ai-client-abstraction.cs +161 -0
- package/.jumpstart/skills/dotnet-developer/templates/appsettings.template.json +58 -0
- package/.jumpstart/skills/dotnet-developer/templates/azure-pipelines-dotnet.yml +164 -0
- package/.jumpstart/skills/dotnet-developer/templates/background-service.cs +151 -0
- package/.jumpstart/skills/dotnet-developer/templates/docker-compose.dotnet.yml +85 -0
- package/.jumpstart/skills/dotnet-developer/templates/entity-framework-dbcontext.cs +133 -0
- package/.jumpstart/skills/dotnet-developer/templates/fluentvalidation-validator.cs +107 -0
- package/.jumpstart/skills/dotnet-developer/templates/github-actions-dotnet.yml +140 -0
- package/.jumpstart/skills/dotnet-developer/templates/minimal-api-endpoints.cs +136 -0
- package/.jumpstart/skills/dotnet-developer/templates/options-pattern.cs +101 -0
- package/.jumpstart/skills/dotnet-developer/templates/service.cs +155 -0
- package/.jumpstart/skills/dotnet-developer/templates/xunit-api-test.cs +221 -0
- package/.jumpstart/skills/event-store-design/SKILL.md +437 -0
- package/.jumpstart/skills/grill-me/SKILL.md +212 -0
- package/.jumpstart/skills/grill-me/evals/manual-eval-checklist.md +50 -0
- package/.jumpstart/skills/grill-me/examples/document-review-example.md +45 -0
- package/.jumpstart/skills/grill-me/references/decision-tree.md +165 -0
- package/.jumpstart/skills/grill-me/references/quality-bar.md +27 -0
- package/.jumpstart/skills/grill-me/references/question-pattern.md +39 -0
- package/.jumpstart/skills/grill-me/templates/grill-summary-template.md +39 -0
- package/.jumpstart/skills/grill-summary-to-proposal/SKILL.md +93 -0
- package/.jumpstart/skills/grill-summary-to-proposal/evals/manual-eval-checklist.md +39 -0
- package/.jumpstart/skills/grill-summary-to-proposal/examples/from-grill-summary-example.md +28 -0
- package/.jumpstart/skills/grill-summary-to-proposal/references/normalization-pattern.md +40 -0
- package/.jumpstart/skills/grill-summary-to-proposal/references/redline-patterns.md +53 -0
- package/.jumpstart/skills/grill-summary-to-proposal/templates/proposal-hardening-template.md +39 -0
- package/.jumpstart/skills/gtm-ai-gtm/SKILL.md +324 -0
- package/.jumpstart/skills/gtm-ai-gtm/evals/evals.json +42 -0
- package/.jumpstart/skills/gtm-ai-gtm/examples/enterprise-ai-teammate-positioning.md +31 -0
- package/.jumpstart/skills/gtm-ai-gtm/examples/jumpstart-to-pod-recommendation.md +33 -0
- package/.jumpstart/skills/gtm-ai-gtm/references/enterprise-ai-objections.md +80 -0
- package/.jumpstart/skills/gtm-ai-gtm/references/jumpstart-and-pod-alignment.md +72 -0
- package/.jumpstart/skills/gtm-ai-gtm/references/pricing-and-packaging.md +41 -0
- package/.jumpstart/skills/gtm-ai-gtm/templates/client-gtm-brief.md +40 -0
- package/.jumpstart/skills/gtm-ai-gtm/templates/jumpstart-to-pod-recommendation-matrix.md +36 -0
- package/.jumpstart/skills/gtm-enterprise-account-planning/SKILL.md +169 -0
- package/.jumpstart/skills/gtm-enterprise-account-planning/evals/evals.json +39 -0
- package/.jumpstart/skills/gtm-enterprise-account-planning/examples/example-account-plan.md +92 -0
- package/.jumpstart/skills/gtm-enterprise-account-planning/references/jumpstart-account-planning-guide.md +156 -0
- package/.jumpstart/skills/gtm-enterprise-account-planning/templates/account-plan-template.md +97 -0
- package/.jumpstart/skills/gtm-enterprise-account-planning/templates/mutual-action-plan-template.md +36 -0
- package/.jumpstart/skills/gtm-positioning-strategy/SKILL.md +164 -0
- package/.jumpstart/skills/gtm-positioning-strategy/evals/evals.json +38 -0
- package/.jumpstart/skills/gtm-positioning-strategy/examples/gtm-positioning-examples.md +60 -0
- package/.jumpstart/skills/gtm-positioning-strategy/references/jumpstart-pod-positioning.md +69 -0
- package/.jumpstart/skills/gtm-positioning-strategy/references/positioning-tests.md +65 -0
- package/.jumpstart/skills/gtm-positioning-strategy/references/word-choice-and-framing.md +65 -0
- package/.jumpstart/skills/gtm-positioning-strategy/references/workflow.md +92 -0
- package/.jumpstart/skills/gtm-positioning-strategy/templates/message-house-template.md +36 -0
- package/.jumpstart/skills/gtm-positioning-strategy/templates/positioning-recommendation-template.md +28 -0
- package/.jumpstart/skills/hybrid-cloud-networking/SKILL.md +241 -0
- package/.jumpstart/skills/impediment-prioritization/SKILL.md +173 -0
- package/.jumpstart/skills/impediment-prioritization/evals/evals.json +23 -0
- package/.jumpstart/skills/impediment-prioritization/examples/impediment-prioritization-examples.md +53 -0
- package/.jumpstart/skills/impediment-prioritization/references/jumpstart-pod-mapping.md +74 -0
- package/.jumpstart/skills/impediment-prioritization/references/scoring-rubric.md +79 -0
- package/.jumpstart/skills/impediment-prioritization/references/workflow.md +95 -0
- package/.jumpstart/skills/impediment-prioritization/templates/jumpstart-pod-remediation-template.md +31 -0
- package/.jumpstart/skills/impediment-prioritization/templates/prioritized-impediments-template.md +18 -0
- package/.jumpstart/skills/integration-surface-mapper/SKILL.md +73 -0
- package/.jumpstart/skills/integration-surface-mapper/evals/evals.json +30 -0
- package/.jumpstart/skills/integration-surface-mapper/references/integration-pattern-catalog.md +74 -0
- package/.jumpstart/skills/integration-surface-mapper/templates/integration-surface-template.md +66 -0
- package/.jumpstart/skills/istio-traffic-management/SKILL.md +327 -0
- package/.jumpstart/skills/jira-delivery-builder/README.md +28 -0
- package/.jumpstart/skills/jira-delivery-builder/SKILL.md +184 -0
- package/.jumpstart/skills/jira-delivery-builder/evals/README.md +27 -0
- package/.jumpstart/skills/jira-delivery-builder/evals/eval-cases.md +65 -0
- package/.jumpstart/skills/jira-delivery-builder/references/acceptance-criteria-guide.md +32 -0
- package/.jumpstart/skills/jira-delivery-builder/references/ai-ticket-patterns.md +30 -0
- package/.jumpstart/skills/jira-delivery-builder/references/backlog-decomposition.md +30 -0
- package/.jumpstart/skills/jira-delivery-builder/references/csv-import-guide.md +36 -0
- package/.jumpstart/skills/jira-delivery-builder/references/definition-of-done.md +20 -0
- package/.jumpstart/skills/jira-delivery-builder/references/definition-of-ready.md +12 -0
- package/.jumpstart/skills/jira-delivery-builder/references/dependency-mapping.md +27 -0
- package/.jumpstart/skills/jira-delivery-builder/references/jira-issue-types.md +29 -0
- package/.jumpstart/skills/jira-delivery-builder/references/jira-reporting.md +28 -0
- package/.jumpstart/skills/jira-delivery-builder/references/jql-cheatsheet.md +25 -0
- package/.jumpstart/skills/jira-delivery-builder/references/source-traceability.md +27 -0
- package/.jumpstart/skills/jira-delivery-builder/references/story-writing-standards.md +30 -0
- package/.jumpstart/skills/jira-delivery-builder/scripts/convert_markdown_to_jira_csv.py +94 -0
- package/.jumpstart/skills/jira-delivery-builder/scripts/create_dependency_register.py +51 -0
- package/.jumpstart/skills/jira-delivery-builder/scripts/fixtures/README.md +39 -0
- package/.jumpstart/skills/jira-delivery-builder/scripts/fixtures/backlog.csv +5 -0
- package/.jumpstart/skills/jira-delivery-builder/scripts/fixtures/issues.json +26 -0
- package/.jumpstart/skills/jira-delivery-builder/scripts/fixtures/issues.md +23 -0
- package/.jumpstart/skills/jira-delivery-builder/scripts/generate_jira_csv.py +75 -0
- package/.jumpstart/skills/jira-delivery-builder/scripts/generate_jql_filters.py +43 -0
- package/.jumpstart/skills/jira-delivery-builder/scripts/split_large_stories.py +66 -0
- package/.jumpstart/skills/jira-delivery-builder/scripts/validate_jira_backlog.py +66 -0
- package/.jumpstart/skills/jira-delivery-builder/templates/ai-agent-story-template.md +32 -0
- package/.jumpstart/skills/jira-delivery-builder/templates/ai-rag-story-template.md +32 -0
- package/.jumpstart/skills/jira-delivery-builder/templates/backlog-quality-report.md +35 -0
- package/.jumpstart/skills/jira-delivery-builder/templates/bug-template.md +33 -0
- package/.jumpstart/skills/jira-delivery-builder/templates/dependency-register.md +5 -0
- package/.jumpstart/skills/jira-delivery-builder/templates/epic-template.md +31 -0
- package/.jumpstart/skills/jira-delivery-builder/templates/jira-csv-import-template.csv +5 -0
- package/.jumpstart/skills/jira-delivery-builder/templates/mvp-backlog-template.md +39 -0
- package/.jumpstart/skills/jira-delivery-builder/templates/review-queue-story-template.md +22 -0
- package/.jumpstart/skills/jira-delivery-builder/templates/spike-template.md +29 -0
- package/.jumpstart/skills/jira-delivery-builder/templates/sprint-readiness-report.md +26 -0
- package/.jumpstart/skills/jira-delivery-builder/templates/technical-task-template.md +34 -0
- package/.jumpstart/skills/jira-delivery-builder/templates/user-story-template.md +33 -0
- package/.jumpstart/skills/jira-delivery-operations/README.md +10 -0
- package/.jumpstart/skills/jira-delivery-operations/SKILL.md +70 -0
- package/.jumpstart/skills/jira-delivery-operations/evals/README.md +3 -0
- package/.jumpstart/skills/jira-delivery-operations/evals/eval-cases.md +13 -0
- package/.jumpstart/skills/jira-delivery-operations/references/operating-playbook.md +21 -0
- package/.jumpstart/skills/jira-delivery-operations/references/routing-matrix.md +9 -0
- package/.jumpstart/skills/jira-delivery-operations/templates/phase-checklist.md +25 -0
- package/.jumpstart/skills/jira-delivery-operations/templates/weekly-operations-cadence.md +7 -0
- package/.jumpstart/skills/jira-innovation-unit-normalizer/README.md +10 -0
- package/.jumpstart/skills/jira-innovation-unit-normalizer/SKILL.md +64 -0
- package/.jumpstart/skills/jira-innovation-unit-normalizer/evals/README.md +3 -0
- package/.jumpstart/skills/jira-innovation-unit-normalizer/evals/eval-cases.md +16 -0
- package/.jumpstart/skills/jira-innovation-unit-normalizer/references/complexity-mapping.md +21 -0
- package/.jumpstart/skills/jira-innovation-unit-normalizer/references/normalization-rules.md +13 -0
- package/.jumpstart/skills/jira-innovation-unit-normalizer/scripts/fixtures/README.md +7 -0
- package/.jumpstart/skills/jira-innovation-unit-normalizer/scripts/fixtures/sample-jira-backlog.csv +5 -0
- package/.jumpstart/skills/jira-innovation-unit-normalizer/scripts/normalize_jira_to_iu.py +48 -0
- package/.jumpstart/skills/jira-innovation-unit-normalizer/templates/jira-iu-backlog.csv +2 -0
- package/.jumpstart/skills/jira-innovation-unit-normalizer/templates/jira-iu-estimate.md +17 -0
- package/.jumpstart/skills/jira-pod-status-reporter/README.md +18 -0
- package/.jumpstart/skills/jira-pod-status-reporter/SKILL.md +82 -0
- package/.jumpstart/skills/jira-pod-status-reporter/evals/README.md +3 -0
- package/.jumpstart/skills/jira-pod-status-reporter/evals/eval-cases.md +21 -0
- package/.jumpstart/skills/jira-pod-status-reporter/references/pod-metrics.md +17 -0
- package/.jumpstart/skills/jira-pod-status-reporter/references/report-structure.md +24 -0
- package/.jumpstart/skills/jira-pod-status-reporter/references/risk-and-dependency-signals.md +13 -0
- package/.jumpstart/skills/jira-pod-status-reporter/scripts/fixtures/README.md +7 -0
- package/.jumpstart/skills/jira-pod-status-reporter/scripts/fixtures/sample-jira-status.csv +5 -0
- package/.jumpstart/skills/jira-pod-status-reporter/scripts/summarize_jira_backlog.py +39 -0
- package/.jumpstart/skills/jira-pod-status-reporter/templates/sprint-readiness-summary.md +24 -0
- package/.jumpstart/skills/jira-pod-status-reporter/templates/weekly-status-report.md +29 -0
- package/.jumpstart/skills/langfuse/SKILL.md +128 -0
- package/.jumpstart/skills/langfuse/references/cli.md +51 -0
- package/.jumpstart/skills/langfuse/references/instrumentation.md +140 -0
- package/.jumpstart/skills/langfuse/references/prompt-migration.md +234 -0
- package/.jumpstart/skills/langfuse/references/sdk-upgrade.md +181 -0
- package/.jumpstart/skills/langfuse/references/skill-feedback.md +52 -0
- package/.jumpstart/skills/langfuse/references/user-feedback.md +88 -0
- package/.jumpstart/skills/linkerd-patterns/SKILL.md +311 -0
- package/.jumpstart/skills/mcp-server-designer/SKILL.md +91 -0
- package/.jumpstart/skills/mcp-server-designer/evals/evals.json +29 -0
- package/.jumpstart/skills/mcp-server-designer/examples/example-finance-domain-mcp.md +63 -0
- package/.jumpstart/skills/mcp-server-designer/references/mcp-design-guide.md +95 -0
- package/.jumpstart/skills/mcp-server-designer/templates/mcp-server-design-template.md +115 -0
- package/.jumpstart/skills/memory-architecture-designer/SKILL.md +88 -0
- package/.jumpstart/skills/memory-architecture-designer/evals/evals.json +32 -0
- package/.jumpstart/skills/memory-architecture-designer/examples/example-multi-tenant-copilot-memory.md +46 -0
- package/.jumpstart/skills/memory-architecture-designer/references/memory-pattern-library.md +60 -0
- package/.jumpstart/skills/memory-architecture-designer/templates/memory-architecture-spec.md +55 -0
- package/.jumpstart/skills/microservices-patterns/SKILL.md +595 -0
- package/.jumpstart/skills/migration-strategy-legacy-to-ai/SKILL.md +78 -0
- package/.jumpstart/skills/migration-strategy-legacy-to-ai/evals/evals.json +31 -0
- package/.jumpstart/skills/migration-strategy-legacy-to-ai/examples/example-ticket-routing-migration.md +51 -0
- package/.jumpstart/skills/migration-strategy-legacy-to-ai/references/migration-patterns-catalog.md +77 -0
- package/.jumpstart/skills/migration-strategy-legacy-to-ai/references/migration-patterns.md +54 -0
- package/.jumpstart/skills/migration-strategy-legacy-to-ai/templates/migration-plan.md +48 -0
- package/.jumpstart/skills/migration-strategy-legacy-to-ai/templates/migration-strategy-template.md +94 -0
- package/.jumpstart/skills/mtls-configuration/SKILL.md +349 -0
- package/.jumpstart/skills/multi-cloud-architecture/SKILL.md +181 -0
- package/.jumpstart/skills/non-functional-requirements-elicitor/SKILL.md +79 -0
- package/.jumpstart/skills/non-functional-requirements-elicitor/evals/evals.json +31 -0
- package/.jumpstart/skills/non-functional-requirements-elicitor/references/nfr-catalog.md +97 -0
- package/.jumpstart/skills/non-functional-requirements-elicitor/templates/nfr-register-template.md +51 -0
- package/.jumpstart/skills/observability-design-for-ai/SKILL.md +93 -0
- package/.jumpstart/skills/observability-design-for-ai/evals/evals.json +32 -0
- package/.jumpstart/skills/observability-design-for-ai/examples/example-grounded-assistant-observability.md +53 -0
- package/.jumpstart/skills/observability-design-for-ai/references/telemetry-catalog.md +62 -0
- package/.jumpstart/skills/observability-design-for-ai/templates/observability-spec.md +50 -0
- package/.jumpstart/skills/observability-design-for-ai/templates/trace-schema.md +40 -0
- package/.jumpstart/skills/persona-empathy-map/SKILL.md +93 -0
- package/.jumpstart/skills/persona-empathy-map/evals/evals.json +17 -0
- package/.jumpstart/skills/persona-empathy-map/references/empathy-map-pattern.md +48 -0
- package/.jumpstart/skills/persona-journey-map-companion/README.md +11 -0
- package/.jumpstart/skills/persona-journey-map-companion/SKILL.md +55 -0
- package/.jumpstart/skills/persona-journey-map-companion/evals/evals.json +17 -0
- package/.jumpstart/skills/persona-journey-map-companion/examples/operations-journey-example.md +29 -0
- package/.jumpstart/skills/persona-journey-map-companion/templates/journey-map-template.md +29 -0
- package/.jumpstart/skills/php-developer/README.md +46 -0
- package/.jumpstart/skills/php-developer/SKILL.md +192 -0
- package/.jumpstart/skills/php-developer/evals/eval-rubric.md +27 -0
- package/.jumpstart/skills/php-developer/evals/evals.json +82 -0
- package/.jumpstart/skills/php-developer/references/ai-integration-patterns.md +38 -0
- package/.jumpstart/skills/php-developer/references/api-development.md +38 -0
- package/.jumpstart/skills/php-developer/references/ci-cd.md +29 -0
- package/.jumpstart/skills/php-developer/references/composer-dependency-management.md +49 -0
- package/.jumpstart/skills/php-developer/references/docker-local-dev.md +36 -0
- package/.jumpstart/skills/php-developer/references/laravel-patterns.md +46 -0
- package/.jumpstart/skills/php-developer/references/legacy-modernization.md +47 -0
- package/.jumpstart/skills/php-developer/references/php-modern-standards.md +43 -0
- package/.jumpstart/skills/php-developer/references/production-readiness.md +37 -0
- package/.jumpstart/skills/php-developer/references/security-checklist.md +48 -0
- package/.jumpstart/skills/php-developer/references/static-analysis.md +41 -0
- package/.jumpstart/skills/php-developer/references/symfony-patterns.md +42 -0
- package/.jumpstart/skills/php-developer/references/testing-guide.md +41 -0
- package/.jumpstart/skills/php-developer/scripts/composer_audit_summary.py +50 -0
- package/.jumpstart/skills/php-developer/scripts/detect_php_framework.py +35 -0
- package/.jumpstart/skills/php-developer/scripts/generate_refactor_backlog.py +75 -0
- package/.jumpstart/skills/php-developer/scripts/inspect_php_project.py +102 -0
- package/.jumpstart/skills/php-developer/scripts/legacy_risk_scan.py +56 -0
- package/.jumpstart/skills/php-developer/templates/Dockerfile.php-fpm +22 -0
- package/.jumpstart/skills/php-developer/templates/composer.legacy-modernization.json +26 -0
- package/.jumpstart/skills/php-developer/templates/composer.modern.json +27 -0
- package/.jumpstart/skills/php-developer/templates/docker-compose.laravel.yml +40 -0
- package/.jumpstart/skills/php-developer/templates/docker-compose.symfony.yml +34 -0
- package/.jumpstart/skills/php-developer/templates/github-actions-php.yml +26 -0
- package/.jumpstart/skills/php-developer/templates/laravel-controller.php +30 -0
- package/.jumpstart/skills/php-developer/templates/laravel-form-request.php +26 -0
- package/.jumpstart/skills/php-developer/templates/laravel-service.php +26 -0
- package/.jumpstart/skills/php-developer/templates/legacy-characterization-test.php +18 -0
- package/.jumpstart/skills/php-developer/templates/pdo-repository.php +29 -0
- package/.jumpstart/skills/php-developer/templates/pest.php +6 -0
- package/.jumpstart/skills/php-developer/templates/phpstan.neon +11 -0
- package/.jumpstart/skills/php-developer/templates/phpunit.xml +17 -0
- package/.jumpstart/skills/php-developer/templates/symfony-controller.php +27 -0
- package/.jumpstart/skills/php-developer/templates/symfony-service.php +35 -0
- package/.jumpstart/skills/pilot-to-production-gate/SKILL.md +87 -0
- package/.jumpstart/skills/pilot-to-production-gate/evals/evals.json +30 -0
- package/.jumpstart/skills/pilot-to-production-gate/references/gate-criteria-rubric.md +116 -0
- package/.jumpstart/skills/pilot-to-production-gate/templates/pilot-to-production-gate-template.md +63 -0
- package/.jumpstart/skills/postgresql-pgvector/README.md +135 -0
- package/.jumpstart/skills/postgresql-pgvector/SKILL.md +298 -0
- package/.jumpstart/skills/postgresql-pgvector/evals/evals.json +106 -0
- package/.jumpstart/skills/postgresql-pgvector/references/fastapi-sqlmodel-patterns.md +255 -0
- package/.jumpstart/skills/postgresql-pgvector/references/hybrid-search.md +195 -0
- package/.jumpstart/skills/postgresql-pgvector/references/indexing-guide.md +204 -0
- package/.jumpstart/skills/postgresql-pgvector/references/multi-tenant-security.md +213 -0
- package/.jumpstart/skills/postgresql-pgvector/references/performance-tuning.md +249 -0
- package/.jumpstart/skills/postgresql-pgvector/references/production-checklist.md +125 -0
- package/.jumpstart/skills/postgresql-pgvector/references/rag-evaluation.md +180 -0
- package/.jumpstart/skills/postgresql-pgvector/references/retrieval-patterns.md +235 -0
- package/.jumpstart/skills/postgresql-pgvector/references/schema-patterns.md +217 -0
- package/.jumpstart/skills/postgresql-pgvector/scripts/benchmark_retrieval.py +149 -0
- package/.jumpstart/skills/postgresql-pgvector/scripts/check_embedding_dimensions.py +140 -0
- package/.jumpstart/skills/postgresql-pgvector/scripts/explain_query_plan.py +138 -0
- package/.jumpstart/skills/postgresql-pgvector/scripts/seed_sample_chunks.py +162 -0
- package/.jumpstart/skills/postgresql-pgvector/scripts/validate_pgvector.py +69 -0
- package/.jumpstart/skills/postgresql-pgvector/templates/alembic_pgvector_migration.py +170 -0
- package/.jumpstart/skills/postgresql-pgvector/templates/docker-compose.pgvector.yml +20 -0
- package/.jumpstart/skills/postgresql-pgvector/templates/eval_schema.sql +105 -0
- package/.jumpstart/skills/postgresql-pgvector/templates/fastapi_routes.py +223 -0
- package/.jumpstart/skills/postgresql-pgvector/templates/indexes.hnsw.sql +66 -0
- package/.jumpstart/skills/postgresql-pgvector/templates/indexes.hybrid-search.sql +71 -0
- package/.jumpstart/skills/postgresql-pgvector/templates/retrieval_service.py +258 -0
- package/.jumpstart/skills/postgresql-pgvector/templates/schema.basic-rag.sql +145 -0
- package/.jumpstart/skills/postgresql-pgvector/templates/schema.multi-tenant-rag.sql +186 -0
- package/.jumpstart/skills/postgresql-pgvector/templates/schema.rfp-retrieval.sql +139 -0
- package/.jumpstart/skills/postgresql-pgvector/templates/sqlmodel_models.py +207 -0
- package/.jumpstart/skills/pre-deployment-gotcha-review/README.md +84 -0
- package/.jumpstart/skills/pre-deployment-gotcha-review/SKILL.md +233 -0
- package/.jumpstart/skills/pre-deployment-gotcha-review/evals/evals.json +59 -0
- package/.jumpstart/skills/pre-deployment-gotcha-review/references/ai-agent-risk.md +104 -0
- package/.jumpstart/skills/pre-deployment-gotcha-review/references/api-gateway.md +81 -0
- package/.jumpstart/skills/pre-deployment-gotcha-review/references/authorization-access-control.md +77 -0
- package/.jumpstart/skills/pre-deployment-gotcha-review/references/data-readiness.md +103 -0
- package/.jumpstart/skills/pre-deployment-gotcha-review/references/delivery-commercial-risk.md +119 -0
- package/.jumpstart/skills/pre-deployment-gotcha-review/references/gotcha-taxonomy.md +292 -0
- package/.jumpstart/skills/pre-deployment-gotcha-review/references/identity-auth-mfa.md +94 -0
- package/.jumpstart/skills/pre-deployment-gotcha-review/references/legacy-onprem-access.md +92 -0
- package/.jumpstart/skills/pre-deployment-gotcha-review/references/mcp-extension-guide.md +102 -0
- package/.jumpstart/skills/pre-deployment-gotcha-review/references/operational-readiness.md +102 -0
- package/.jumpstart/skills/pre-deployment-gotcha-review/references/rag-document-identity-acl.md +117 -0
- package/.jumpstart/skills/pre-deployment-gotcha-review/references/review-methodology.md +159 -0
- package/.jumpstart/skills/pre-deployment-gotcha-review/references/security-compliance.md +108 -0
- package/.jumpstart/skills/pre-deployment-gotcha-review/scripts/build_citation_matrix.py +153 -0
- package/.jumpstart/skills/pre-deployment-gotcha-review/scripts/classify_gotchas.py +201 -0
- package/.jumpstart/skills/pre-deployment-gotcha-review/scripts/extract_document_claims.py +156 -0
- package/.jumpstart/skills/pre-deployment-gotcha-review/scripts/generate_question_backlog.py +213 -0
- package/.jumpstart/skills/pre-deployment-gotcha-review/scripts/validate_report_completeness.py +209 -0
- package/.jumpstart/skills/pre-deployment-gotcha-review/templates/assumption-register.md +38 -0
- package/.jumpstart/skills/pre-deployment-gotcha-review/templates/clarifying-questions.md +61 -0
- package/.jumpstart/skills/pre-deployment-gotcha-review/templates/gotcha-review-report.md +162 -0
- package/.jumpstart/skills/pre-deployment-gotcha-review/templates/mitigation-backlog.md +47 -0
- package/.jumpstart/skills/pre-deployment-gotcha-review/templates/readiness-rating.md +79 -0
- package/.jumpstart/skills/pre-deployment-gotcha-review/templates/source-citation-matrix.md +39 -0
- package/.jumpstart/skills/pre-deployment-gotcha-review/templates/unknown-unknowns-register.md +29 -0
- package/.jumpstart/skills/privacy-by-design-for-ai/SKILL.md +84 -0
- package/.jumpstart/skills/privacy-by-design-for-ai/evals/evals.json +32 -0
- package/.jumpstart/skills/privacy-by-design-for-ai/examples/example-eu-employee-assistant.md +53 -0
- package/.jumpstart/skills/privacy-by-design-for-ai/references/privacy-by-design-guide.md +95 -0
- package/.jumpstart/skills/privacy-by-design-for-ai/references/privacy-control-catalog.md +53 -0
- package/.jumpstart/skills/privacy-by-design-for-ai/templates/dpia-template.md +66 -0
- package/.jumpstart/skills/privacy-by-design-for-ai/templates/privacy-by-design-template.md +89 -0
- package/.jumpstart/skills/projection-patterns/SKILL.md +490 -0
- package/.jumpstart/skills/python-developer/SKILL.md +246 -0
- package/.jumpstart/skills/python-developer/evals/evals.json +162 -0
- package/.jumpstart/skills/python-developer/references/ai-integration-patterns.md +261 -0
- package/.jumpstart/skills/python-developer/references/background-jobs.md +199 -0
- package/.jumpstart/skills/python-developer/references/ci-cd.md +248 -0
- package/.jumpstart/skills/python-developer/references/cli-tools.md +185 -0
- package/.jumpstart/skills/python-developer/references/database-patterns.md +278 -0
- package/.jumpstart/skills/python-developer/references/docker-local-dev.md +241 -0
- package/.jumpstart/skills/python-developer/references/fastapi-patterns.md +311 -0
- package/.jumpstart/skills/python-developer/references/modern-python-standards.md +187 -0
- package/.jumpstart/skills/python-developer/references/observability.md +214 -0
- package/.jumpstart/skills/python-developer/references/production-readiness.md +103 -0
- package/.jumpstart/skills/python-developer/references/pydantic-settings.md +227 -0
- package/.jumpstart/skills/python-developer/references/rag-pipeline-patterns.md +307 -0
- package/.jumpstart/skills/python-developer/references/refactoring-guide.md +206 -0
- package/.jumpstart/skills/python-developer/references/security-checklist.md +195 -0
- package/.jumpstart/skills/python-developer/references/testing-guide.md +272 -0
- package/.jumpstart/skills/python-developer/scripts/check_security_basics.py +159 -0
- package/.jumpstart/skills/python-developer/scripts/inspect_python_project.py +181 -0
- package/.jumpstart/skills/python-developer/templates/Dockerfile +44 -0
- package/.jumpstart/skills/python-developer/templates/Makefile +62 -0
- package/.jumpstart/skills/python-developer/templates/docker-compose.fastapi.yml +70 -0
- package/.jumpstart/skills/python-developer/templates/github-actions-python.yml +134 -0
- package/.jumpstart/skills/python-developer/templates/health_routes.py +27 -0
- package/.jumpstart/skills/python-developer/templates/llm_client_protocol.py +114 -0
- package/.jumpstart/skills/python-developer/templates/main.fastapi.py +59 -0
- package/.jumpstart/skills/python-developer/templates/pyproject.cli.toml +40 -0
- package/.jumpstart/skills/python-developer/templates/pyproject.fastapi.toml +79 -0
- package/.jumpstart/skills/python-developer/templates/pyproject.package.toml +40 -0
- package/.jumpstart/skills/python-developer/templates/pytest_api_test.py +86 -0
- package/.jumpstart/skills/python-developer/templates/pytest_service_test.py +98 -0
- package/.jumpstart/skills/python-developer/templates/repository.py +43 -0
- package/.jumpstart/skills/python-developer/templates/service.py +48 -0
- package/.jumpstart/skills/python-developer/templates/settings.py +71 -0
- package/.jumpstart/skills/python-developer/templates/sqlmodel_model.py +40 -0
- package/.jumpstart/skills/python-developer/templates/typer_cli.py +93 -0
- package/.jumpstart/skills/rag-architecture-designer/SKILL.md +104 -0
- package/.jumpstart/skills/rag-architecture-designer/evals/evals.json +32 -0
- package/.jumpstart/skills/rag-architecture-designer/examples/example-policy-copilot.md +75 -0
- package/.jumpstart/skills/rag-architecture-designer/references/pattern-catalog.md +82 -0
- package/.jumpstart/skills/rag-architecture-designer/templates/rag-architecture-spec.md +93 -0
- package/.jumpstart/skills/rag-architecture-designer/templates/rag-eval-plan.md +38 -0
- package/.jumpstart/skills/react-design-md-auditor/README.md +39 -0
- package/.jumpstart/skills/react-design-md-auditor/SKILL.md +96 -0
- package/.jumpstart/skills/react-design-md-auditor/evals/eval-cases.md +61 -0
- package/.jumpstart/skills/react-design-md-auditor/references/audit-rubric.md +46 -0
- package/.jumpstart/skills/react-design-md-auditor/references/react-specific-checks.md +48 -0
- package/.jumpstart/skills/react-design-md-auditor/references/severity-model.md +24 -0
- package/.jumpstart/skills/react-design-md-auditor/templates/compliance-report-template.md +59 -0
- package/.jumpstart/skills/react-developer/README.md +63 -0
- package/.jumpstart/skills/react-developer/SKILL.md +226 -0
- package/.jumpstart/skills/react-developer/evals/eval-rubric.md +62 -0
- package/.jumpstart/skills/react-developer/references/accessibility.md +20 -0
- package/.jumpstart/skills/react-developer/references/ai-ui-patterns.md +36 -0
- package/.jumpstart/skills/react-developer/references/api-integration.md +28 -0
- package/.jumpstart/skills/react-developer/references/ci-cd.md +24 -0
- package/.jumpstart/skills/react-developer/references/component-architecture.md +25 -0
- package/.jumpstart/skills/react-developer/references/deployment.md +17 -0
- package/.jumpstart/skills/react-developer/references/forms-validation.md +25 -0
- package/.jumpstart/skills/react-developer/references/nextjs-patterns.md +23 -0
- package/.jumpstart/skills/react-developer/references/performance.md +20 -0
- package/.jumpstart/skills/react-developer/references/project-structure.md +68 -0
- package/.jumpstart/skills/react-developer/references/react-modern-standards.md +33 -0
- package/.jumpstart/skills/react-developer/references/react-router-patterns.md +24 -0
- package/.jumpstart/skills/react-developer/references/review-queue-patterns.md +37 -0
- package/.jumpstart/skills/react-developer/references/security.md +18 -0
- package/.jumpstart/skills/react-developer/references/state-management.md +44 -0
- package/.jumpstart/skills/react-developer/references/styling-design-system.md +25 -0
- package/.jumpstart/skills/react-developer/references/tanstack-query.md +27 -0
- package/.jumpstart/skills/react-developer/references/testing.md +19 -0
- package/.jumpstart/skills/react-developer/scripts/check_accessibility_patterns.py +35 -0
- package/.jumpstart/skills/react-developer/scripts/detect_react_stack.py +50 -0
- package/.jumpstart/skills/react-developer/scripts/generate_component_map.py +33 -0
- package/.jumpstart/skills/react-developer/scripts/generate_frontend_backlog.py +53 -0
- package/.jumpstart/skills/react-developer/scripts/inspect_react_project.py +88 -0
- package/.jumpstart/skills/react-developer/templates/.env.example +2 -0
- package/.jumpstart/skills/react-developer/templates/.env.local.example +2 -0
- package/.jumpstart/skills/react-developer/templates/Dockerfile +12 -0
- package/.jumpstart/skills/react-developer/templates/agent-trace-viewer.tsx +27 -0
- package/.jumpstart/skills/react-developer/templates/api-client.ts +24 -0
- package/.jumpstart/skills/react-developer/templates/app-shell.css +9 -0
- package/.jumpstart/skills/react-developer/templates/app-shell.tsx +21 -0
- package/.jumpstart/skills/react-developer/templates/citation-panel.tsx +29 -0
- package/.jumpstart/skills/react-developer/templates/document-upload-page.tsx +11 -0
- package/.jumpstart/skills/react-developer/templates/evaluation-dashboard.tsx +27 -0
- package/.jumpstart/skills/react-developer/templates/github-actions-react.yml +34 -0
- package/.jumpstart/skills/react-developer/templates/main.tsx +13 -0
- package/.jumpstart/skills/react-developer/templates/nginx.conf +11 -0
- package/.jumpstart/skills/react-developer/templates/package.nextjs-ts.json +32 -0
- package/.jumpstart/skills/react-developer/templates/package.react-vite-ts.json +39 -0
- package/.jumpstart/skills/react-developer/templates/playwright.config.ts +15 -0
- package/.jumpstart/skills/react-developer/templates/rag-chat-view.tsx +34 -0
- package/.jumpstart/skills/react-developer/templates/react-hook-form-zod.tsx +51 -0
- package/.jumpstart/skills/react-developer/templates/retrieval-result-card.tsx +28 -0
- package/.jumpstart/skills/react-developer/templates/review-queue-page.tsx +39 -0
- package/.jumpstart/skills/react-developer/templates/router.tsx +20 -0
- package/.jumpstart/skills/react-developer/templates/tanstack-query-provider.tsx +8 -0
- package/.jumpstart/skills/react-developer/templates/tsconfig.json +16 -0
- package/.jumpstart/skills/react-developer/templates/vite.config.ts +12 -0
- package/.jumpstart/skills/react-developer/templates/vitest.config.ts +13 -0
- package/.jumpstart/skills/red-team-playbook-builder/SKILL.md +79 -0
- package/.jumpstart/skills/red-team-playbook-builder/evals/evals.json +32 -0
- package/.jumpstart/skills/red-team-playbook-builder/examples/example-sales-ops-redteam.md +34 -0
- package/.jumpstart/skills/red-team-playbook-builder/references/adversarial-pattern-library.md +63 -0
- package/.jumpstart/skills/red-team-playbook-builder/references/red-team-attack-catalog.md +98 -0
- package/.jumpstart/skills/red-team-playbook-builder/templates/red-team-playbook-template.md +64 -0
- package/.jumpstart/skills/red-team-playbook-builder/templates/red-team-playbook.md +45 -0
- package/.jumpstart/skills/reference-architecture-snapshotter/SKILL.md +53 -0
- package/.jumpstart/skills/reference-architecture-snapshotter/evals/evals.json +17 -0
- package/.jumpstart/skills/reference-architecture-snapshotter/examples/reference-architecture-example.md +17 -0
- package/.jumpstart/skills/reference-architecture-snapshotter/references/redaction-and-variant-rules.md +26 -0
- package/.jumpstart/skills/reference-architecture-snapshotter/scripts/snapshot_qa_check.py +30 -0
- package/.jumpstart/skills/reference-architecture-snapshotter/templates/reference-architecture-template.md +19 -0
- package/.jumpstart/skills/reference-story-matcher/SKILL.md +145 -0
- package/.jumpstart/skills/reference-story-matcher/evals/evals.json +41 -0
- package/.jumpstart/skills/reference-story-matcher/examples/example-reference-story-one-pager.md +61 -0
- package/.jumpstart/skills/reference-story-matcher/examples/prospect-profile-example.json +21 -0
- package/.jumpstart/skills/reference-story-matcher/references/case-study-catalog.json +281 -0
- package/.jumpstart/skills/reference-story-matcher/references/matching-workflow.md +82 -0
- package/.jumpstart/skills/reference-story-matcher/scripts/match_case_study.py +182 -0
- package/.jumpstart/skills/reference-story-matcher/templates/reference-story-one-pager-template.md +59 -0
- package/.jumpstart/skills/roi-calculator-builder/SKILL.md +177 -0
- package/.jumpstart/skills/roi-calculator-builder/evals/evals.json +50 -0
- package/.jumpstart/skills/roi-calculator-builder/examples/example-knowledge-assistant-roi.md +142 -0
- package/.jumpstart/skills/roi-calculator-builder/references/ai-benefit-categories.md +101 -0
- package/.jumpstart/skills/roi-calculator-builder/references/ai-cost-categories.md +112 -0
- package/.jumpstart/skills/roi-calculator-builder/references/risk-adjusted-roi.md +76 -0
- package/.jumpstart/skills/roi-calculator-builder/references/roi-methodology.md +93 -0
- package/.jumpstart/skills/roi-calculator-builder/references/sensitivity-analysis-guide.md +72 -0
- package/.jumpstart/skills/roi-calculator-builder/templates/roi-model-template.md +132 -0
- package/.jumpstart/skills/roi-calculator-builder/templates/roi-worksheet-template.csv +31 -0
- package/.jumpstart/skills/saga-orchestration/SKILL.md +484 -0
- package/.jumpstart/skills/scope-creep-detector/SKILL.md +75 -0
- package/.jumpstart/skills/scope-creep-detector/evals/evals.json +30 -0
- package/.jumpstart/skills/scope-creep-detector/references/scope-creep-patterns.md +85 -0
- package/.jumpstart/skills/scope-creep-detector/templates/scope-audit-template.md +43 -0
- package/.jumpstart/skills/scripts/README.md +93 -0
- package/.jumpstart/skills/scripts/assertion_core.py +55 -0
- package/.jumpstart/skills/service-mesh-observability/SKILL.md +385 -0
- package/.jumpstart/skills/skill-creator/SKILL.md +28 -7
- package/.jumpstart/skills/skill-creator/examples/copilot-sdk-wrapper/README.md +35 -0
- package/.jumpstart/skills/skill-creator/examples/copilot-sdk-wrapper/copilot_sdk_wrapper.mjs +93 -0
- package/.jumpstart/skills/skill-creator/examples/copilot-sdk-wrapper/package.json +8 -0
- package/.jumpstart/skills/skill-creator/scripts/improve_description.py +41 -32
- package/.jumpstart/skills/skill-creator/scripts/prompt_backend.py +145 -0
- package/.jumpstart/skills/skill-creator/scripts/run_eval.py +169 -115
- package/.jumpstart/skills/skill-creator/scripts/run_loop.py +11 -0
- package/.jumpstart/skills/stitch-screen-to-design-md/README.md +17 -0
- package/.jumpstart/skills/stitch-screen-to-design-md/SKILL.md +50 -0
- package/.jumpstart/skills/stitch-screen-to-design-md/evals/evals.json +23 -0
- package/.jumpstart/skills/stitch-screen-to-design-md/references/stitch-mcp-flow.md +38 -0
- package/.jumpstart/skills/stitch-screen-to-design-md/references/synthesis-guide.md +34 -0
- package/.jumpstart/skills/stitch-screen-to-design-md/templates/design-from-stitch-template.md +49 -0
- package/.jumpstart/skills/success-metrics-designer/SKILL.md +84 -0
- package/.jumpstart/skills/success-metrics-designer/evals/evals.json +30 -0
- package/.jumpstart/skills/success-metrics-designer/references/kpi-pattern-library.md +79 -0
- package/.jumpstart/skills/success-metrics-designer/templates/success-metrics-template.md +65 -0
- package/.jumpstart/skills/task-clarifier/SKILL.md +85 -0
- package/.jumpstart/skills/task-clarifier/evals/evals.json +33 -0
- package/.jumpstart/skills/task-clarifier/evals/files/conflicting-next-step-notes.md +24 -0
- package/.jumpstart/skills/task-clarifier/evals/files/vague-seller-ask.md +18 -0
- package/.jumpstart/skills/task-clarifier/references/clarification-pattern.md +67 -0
- package/.jumpstart/skills/temporal-python-testing/SKILL.md +158 -0
- package/.jumpstart/skills/temporal-python-testing/resources/integration-testing.md +455 -0
- package/.jumpstart/skills/temporal-python-testing/resources/local-setup.md +553 -0
- package/.jumpstart/skills/temporal-python-testing/resources/replay-testing.md +462 -0
- package/.jumpstart/skills/temporal-python-testing/resources/unit-testing.md +328 -0
- package/.jumpstart/skills/terraform-module-library/SKILL.md +252 -0
- package/.jumpstart/skills/terraform-module-library/references/aws-modules.md +70 -0
- package/.jumpstart/skills/tool-differentiation/SKILL.md +81 -0
- package/.jumpstart/skills/tool-differentiation/evals/evals.json +17 -0
- package/.jumpstart/skills/tool-differentiation/references/comparison-matrix.md +50 -0
- package/.jumpstart/skills/use-case-canvas-builder/SKILL.md +95 -0
- package/.jumpstart/skills/use-case-canvas-builder/references/canvas-pattern.md +106 -0
- package/.jumpstart/skills/use-case-dependency-mapper/SKILL.md +153 -0
- package/.jumpstart/skills/use-case-dependency-mapper/evals/evals.json +23 -0
- package/.jumpstart/skills/use-case-dependency-mapper/references/dependency-categories.md +201 -0
- package/.jumpstart/skills/use-case-prioritization/SKILL.md +79 -0
- package/.jumpstart/skills/use-case-prioritization/evals/evals.json +34 -0
- package/.jumpstart/skills/use-case-prioritization/evals/files/candidate-use-cases.md +43 -0
- package/.jumpstart/skills/use-case-prioritization/evals/files/workshop-output-notes.md +8 -0
- package/.jumpstart/skills/use-case-prioritization/references/matrix-pattern.md +52 -0
- package/.jumpstart/skills/user-persona-development/README.md +44 -0
- package/.jumpstart/skills/user-persona-development/SKILL.md +155 -0
- package/.jumpstart/skills/user-persona-development/evals/evals.json +23 -0
- package/.jumpstart/skills/user-persona-development/examples/approver-persona-example.md +26 -0
- package/.jumpstart/skills/user-persona-development/examples/executive-sponsor-persona-example.md +26 -0
- package/.jumpstart/skills/user-persona-development/examples/operations-persona-example.md +26 -0
- package/.jumpstart/skills/user-persona-development/examples/technical-operator-persona-example.md +26 -0
- package/.jumpstart/skills/user-persona-development/references/ai-solution-persona-considerations.md +46 -0
- package/.jumpstart/skills/user-persona-development/references/persona-field-guide.md +90 -0
- package/.jumpstart/skills/user-persona-development/references/persona-quality-checklist.md +38 -0
- package/.jumpstart/skills/user-persona-development/references/policy-defaults.md +37 -0
- package/.jumpstart/skills/user-persona-development/references/source-grounding-rules.md +37 -0
- package/.jumpstart/skills/user-persona-development/references/stakeholder-to-persona-rules.md +49 -0
- package/.jumpstart/skills/user-persona-development/scripts/validate_persona_fields.py +70 -0
- package/.jumpstart/skills/user-persona-development/templates/backlog-implications-template.md +12 -0
- package/.jumpstart/skills/user-persona-development/templates/change-management-implications-template.md +11 -0
- package/.jumpstart/skills/user-persona-development/templates/design-implications-template.md +12 -0
- package/.jumpstart/skills/user-persona-development/templates/persona-gap-analysis.md +20 -0
- package/.jumpstart/skills/user-persona-development/templates/persona-summary-table.md +13 -0
- package/.jumpstart/skills/user-persona-development/templates/persona-template.md +38 -0
- package/.jumpstart/skills/user-persona-quality-evaluator/README.md +12 -0
- package/.jumpstart/skills/user-persona-quality-evaluator/SKILL.md +58 -0
- package/.jumpstart/skills/user-persona-quality-evaluator/evals/evals.json +17 -0
- package/.jumpstart/skills/user-persona-quality-evaluator/references/scoring-rubric.md +42 -0
- package/.jumpstart/skills/vscode-github-custom-agent-builder/README.md +24 -0
- package/.jumpstart/skills/vscode-github-custom-agent-builder/SKILL.md +162 -0
- package/.jumpstart/skills/vscode-github-custom-agent-builder/evals/evals.json +57 -0
- package/.jumpstart/skills/vscode-github-custom-agent-builder/examples/broken-reviewer.agent.md +14 -0
- package/.jumpstart/skills/vscode-github-custom-agent-builder/examples/legacy-planner.chatmode.md +11 -0
- package/.jumpstart/skills/vscode-github-custom-agent-builder/references/agents.md +108 -0
- package/.jumpstart/skills/vscode-github-custom-agent-builder/references/claude-agent-format.md +33 -0
- package/.jumpstart/skills/vscode-github-custom-agent-builder/references/custom-agent-schema.md +43 -0
- package/.jumpstart/skills/vscode-github-custom-agent-builder/references/frontmatter-standard.md +53 -0
- package/.jumpstart/skills/vscode-github-custom-agent-builder/references/hooks.md +96 -0
- package/.jumpstart/skills/vscode-github-custom-agent-builder/references/instructions.md +71 -0
- package/.jumpstart/skills/vscode-github-custom-agent-builder/references/jumpstart-agent-patterns.md +44 -0
- package/.jumpstart/skills/vscode-github-custom-agent-builder/references/prompts.md +80 -0
- package/.jumpstart/skills/vscode-github-custom-agent-builder/references/schema-drift-policy.md +43 -0
- package/.jumpstart/skills/vscode-github-custom-agent-builder/references/skills.md +100 -0
- package/.jumpstart/skills/vscode-github-custom-agent-builder/references/validation-rules.md +40 -0
- package/.jumpstart/skills/vscode-github-custom-agent-builder/references/workspace-instructions.md +66 -0
- package/.jumpstart/skills/vscode-github-custom-agent-builder/scripts/_agent_frontmatter.py +117 -0
- package/.jumpstart/skills/vscode-github-custom-agent-builder/scripts/check_custom_agent_schema.py +149 -0
- package/.jumpstart/skills/vscode-github-custom-agent-builder/scripts/migrate_chatmode_to_agent.py +36 -0
- package/.jumpstart/skills/vscode-github-custom-agent-builder/scripts/normalize_agent_frontmatter.py +39 -0
- package/.jumpstart/skills/vscode-github-custom-agent-builder/scripts/validate_agents.py +125 -0
- package/.jumpstart/skills/vscode-github-custom-agent-builder/templates/agent-validation-report.md +35 -0
- package/.jumpstart/skills/vscode-github-custom-agent-builder/templates/claude-agent-template.md +10 -0
- package/.jumpstart/skills/vscode-github-custom-agent-builder/templates/github-copilot-agent-template.agent.md +35 -0
- package/.jumpstart/skills/vscode-github-custom-agent-builder/templates/implementer.agent.md +48 -0
- package/.jumpstart/skills/vscode-github-custom-agent-builder/templates/jumpstart-solution-design.agent.md +48 -0
- package/.jumpstart/skills/vscode-github-custom-agent-builder/templates/jumpstart-workbench.agent.md +50 -0
- package/.jumpstart/skills/vscode-github-custom-agent-builder/templates/orchestrator.agent.md +46 -0
- package/.jumpstart/skills/vscode-github-custom-agent-builder/templates/planner.agent.md +54 -0
- package/.jumpstart/skills/vscode-github-custom-agent-builder/templates/reviewer.agent.md +53 -0
- package/.jumpstart/skills/vscode-github-custom-agent-builder/templates/schema-drift-report.md +41 -0
- package/.jumpstart/skills/vscode-github-custom-agent-builder/templates/vscode-agent-frontmatter.yaml +13 -0
- package/.jumpstart/skills/vscode-github-custom-agent-builder/templates/vscode-agent-template.agent.md +43 -0
- package/.jumpstart/skills/vuejs-developer/README.md +17 -0
- package/.jumpstart/skills/vuejs-developer/SKILL.md +189 -0
- package/.jumpstart/skills/vuejs-developer/evals/eval-cases.md +31 -0
- package/.jumpstart/skills/vuejs-developer/evals/eval-plan.md +20 -0
- package/.jumpstart/skills/vuejs-developer/evals/eval-rubric.md +44 -0
- package/.jumpstart/skills/vuejs-developer/references/accessibility.md +23 -0
- package/.jumpstart/skills/vuejs-developer/references/ai-ui-patterns.md +27 -0
- package/.jumpstart/skills/vuejs-developer/references/api-integration.md +43 -0
- package/.jumpstart/skills/vuejs-developer/references/ci-cd.md +28 -0
- package/.jumpstart/skills/vuejs-developer/references/component-architecture.md +34 -0
- package/.jumpstart/skills/vuejs-developer/references/deployment.md +34 -0
- package/.jumpstart/skills/vuejs-developer/references/forms-validation.md +24 -0
- package/.jumpstart/skills/vuejs-developer/references/nuxt-patterns.md +21 -0
- package/.jumpstart/skills/vuejs-developer/references/performance.md +22 -0
- package/.jumpstart/skills/vuejs-developer/references/pinia-state-management.md +44 -0
- package/.jumpstart/skills/vuejs-developer/references/project-structure.md +46 -0
- package/.jumpstart/skills/vuejs-developer/references/review-queue-patterns.md +27 -0
- package/.jumpstart/skills/vuejs-developer/references/security.md +23 -0
- package/.jumpstart/skills/vuejs-developer/references/styling-design-system.md +25 -0
- package/.jumpstart/skills/vuejs-developer/references/testing.md +42 -0
- package/.jumpstart/skills/vuejs-developer/references/vue-router-patterns.md +45 -0
- package/.jumpstart/skills/vuejs-developer/references/vue3-modern-standards.md +55 -0
- package/.jumpstart/skills/vuejs-developer/scripts/check_accessibility_patterns.py +19 -0
- package/.jumpstart/skills/vuejs-developer/scripts/detect_vue_stack.py +28 -0
- package/.jumpstart/skills/vuejs-developer/scripts/generate_component_map.py +19 -0
- package/.jumpstart/skills/vuejs-developer/scripts/generate_frontend_backlog.py +18 -0
- package/.jumpstart/skills/vuejs-developer/scripts/inspect_vue_project.py +32 -0
- package/.jumpstart/skills/vuejs-developer/templates/.env.example +8 -0
- package/.jumpstart/skills/vuejs-developer/templates/.env.local.example +8 -0
- package/.jumpstart/skills/vuejs-developer/templates/Dockerfile +12 -0
- package/.jumpstart/skills/vuejs-developer/templates/api-client.ts +32 -0
- package/.jumpstart/skills/vuejs-developer/templates/base-button.vue +42 -0
- package/.jumpstart/skills/vuejs-developer/templates/base-modal.vue +59 -0
- package/.jumpstart/skills/vuejs-developer/templates/citation-panel.vue +25 -0
- package/.jumpstart/skills/vuejs-developer/templates/document-upload-view.vue +35 -0
- package/.jumpstart/skills/vuejs-developer/templates/github-actions-vue.yml +36 -0
- package/.jumpstart/skills/vuejs-developer/templates/main.ts +12 -0
- package/.jumpstart/skills/vuejs-developer/templates/nginx.conf +16 -0
- package/.jumpstart/skills/vuejs-developer/templates/package.vue-vite-ts.json +34 -0
- package/.jumpstart/skills/vuejs-developer/templates/pinia-store.ts +26 -0
- package/.jumpstart/skills/vuejs-developer/templates/playwright.config.ts +16 -0
- package/.jumpstart/skills/vuejs-developer/templates/rag-chat-view.vue +43 -0
- package/.jumpstart/skills/vuejs-developer/templates/retrieval-result-card.vue +36 -0
- package/.jumpstart/skills/vuejs-developer/templates/review-queue-view.vue +62 -0
- package/.jumpstart/skills/vuejs-developer/templates/router.ts +39 -0
- package/.jumpstart/skills/vuejs-developer/templates/tsconfig.json +19 -0
- package/.jumpstart/skills/vuejs-developer/templates/vite.config.ts +15 -0
- package/.jumpstart/skills/vuejs-developer/templates/vitest.config.ts +11 -0
- package/.jumpstart/skills/win-theme-extractor/SKILL.md +125 -0
- package/.jumpstart/skills/win-theme-extractor/evals/evals.json +37 -0
- package/.jumpstart/skills/win-theme-extractor/references/battlecard-to-theme-patterns.md +93 -0
- package/.jumpstart/skills/win-theme-extractor/references/proof-mapping-matrix.md +34 -0
- package/.jumpstart/skills/win-theme-extractor/references/win-theme-scorecard.md +45 -0
- package/.jumpstart/skills/work-breakdown-builder/SKILL.md +117 -0
- package/.jumpstart/skills/work-breakdown-builder/evals/evals.json +44 -0
- package/.jumpstart/skills/work-breakdown-builder/references/Cloud Infrastructure WBS Template.xlsx +0 -0
- package/.jumpstart/skills/work-breakdown-builder/references/mock-wbs-data.json +258 -0
- package/.jumpstart/skills/work-breakdown-builder/references/wbs-structure.md +67 -0
- package/.jumpstart/skills/work-breakdown-builder/scripts/create_wbs_workbook.py +242 -0
- package/.jumpstart/skills/workflow-orchestration-patterns/SKILL.md +316 -0
- package/.jumpstart/skills/xlsx/LICENSE.txt +30 -0
- package/.jumpstart/skills/xlsx/SKILL.md +292 -0
- package/.jumpstart/skills/xlsx/scripts/office/helpers/__init__.py +0 -0
- package/.jumpstart/skills/xlsx/scripts/office/helpers/merge_runs.py +199 -0
- package/.jumpstart/skills/xlsx/scripts/office/helpers/simplify_redlines.py +197 -0
- package/.jumpstart/skills/xlsx/scripts/office/pack.py +159 -0
- package/.jumpstart/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
- package/.jumpstart/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
- package/.jumpstart/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
- package/.jumpstart/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
- package/.jumpstart/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
- package/.jumpstart/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
- package/.jumpstart/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
- package/.jumpstart/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
- package/.jumpstart/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
- package/.jumpstart/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
- package/.jumpstart/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
- package/.jumpstart/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
- package/.jumpstart/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
- package/.jumpstart/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
- package/.jumpstart/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
- package/.jumpstart/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
- package/.jumpstart/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
- package/.jumpstart/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
- package/.jumpstart/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
- package/.jumpstart/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
- package/.jumpstart/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
- package/.jumpstart/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
- package/.jumpstart/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
- package/.jumpstart/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
- package/.jumpstart/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
- package/.jumpstart/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
- package/.jumpstart/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
- package/.jumpstart/skills/xlsx/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
- package/.jumpstart/skills/xlsx/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
- package/.jumpstart/skills/xlsx/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
- package/.jumpstart/skills/xlsx/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
- package/.jumpstart/skills/xlsx/scripts/office/schemas/mce/mc.xsd +75 -0
- package/.jumpstart/skills/xlsx/scripts/office/schemas/microsoft/wml-2010.xsd +560 -0
- package/.jumpstart/skills/xlsx/scripts/office/schemas/microsoft/wml-2012.xsd +67 -0
- package/.jumpstart/skills/xlsx/scripts/office/schemas/microsoft/wml-2018.xsd +14 -0
- package/.jumpstart/skills/xlsx/scripts/office/schemas/microsoft/wml-cex-2018.xsd +20 -0
- package/.jumpstart/skills/xlsx/scripts/office/schemas/microsoft/wml-cid-2016.xsd +13 -0
- package/.jumpstart/skills/xlsx/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
- package/.jumpstart/skills/xlsx/scripts/office/schemas/microsoft/wml-symex-2015.xsd +8 -0
- package/.jumpstart/skills/xlsx/scripts/office/soffice.py +183 -0
- package/.jumpstart/skills/xlsx/scripts/office/unpack.py +132 -0
- package/.jumpstart/skills/xlsx/scripts/office/validate.py +111 -0
- package/.jumpstart/skills/xlsx/scripts/office/validators/__init__.py +15 -0
- package/.jumpstart/skills/xlsx/scripts/office/validators/base.py +847 -0
- package/.jumpstart/skills/xlsx/scripts/office/validators/docx.py +446 -0
- package/.jumpstart/skills/xlsx/scripts/office/validators/pptx.py +275 -0
- package/.jumpstart/skills/xlsx/scripts/office/validators/redlining.py +247 -0
- package/.jumpstart/skills/xlsx/scripts/recalc.py +184 -0
- package/.jumpstart/templates/codebase-context.md +1 -1
- package/.kiro/steering/jumpstart-framework.md +33 -0
- package/.windsurfrules +48 -0
- package/AGENTS.md +45 -0
- package/CLAUDE.md +40 -0
- package/README.md +77 -1059
- package/bin/cli.js +84 -4
- package/bin/copilot-observability-setup.js +270 -0
- package/bin/lib/context-chunker.js +4 -1
- package/bin/lib/framework-manifest.js +20 -1
- package/bin/lib/integrate.js +261 -0
- package/bin/lib/quickstart.js +2 -0
- package/copilot-observability/README.md +226 -0
- package/copilot-observability/config/redaction-rules.yml +19 -0
- package/copilot-observability/dashboard/app.py +246 -0
- package/copilot-observability/dashboard/queries.py +48 -0
- package/copilot-observability/data/processed/.gitkeep +0 -0
- package/copilot-observability/data/raw/.gitkeep +0 -0
- package/copilot-observability/docs/images/executive-summary.png +0 -0
- package/copilot-observability/docs/images/prompt-explorer.png +0 -0
- package/copilot-observability/docs/images/quality-tracking.png +0 -0
- package/copilot-observability/exports/.gitkeep +0 -0
- package/copilot-observability/requirements.txt +4 -0
- package/copilot-observability/scripts/apply_retention.py +35 -0
- package/copilot-observability/scripts/export_csv.py +42 -0
- package/copilot-observability/scripts/ingest_otel.py +394 -0
- package/copilot-observability/scripts/rate_session.py +52 -0
- package/copilot-observability/scripts/rebuild_daily_usage.py +75 -0
- package/copilot-observability/scripts/redact.py +102 -0
- package/copilot-observability/sql/schema.sql +94 -0
- package/copilot-observability/tests/fixtures/sample-copilot-otel.jsonl +1 -0
- package/copilot-observability/tests/test_ingest.py +121 -0
- package/package.json +7 -2
- package/.jumpstart/skills/linkedin/SKILL.md +0 -69
- package/.jumpstart/skills/skill-creator/references/output-patterns.md +0 -82
- package/.jumpstart/skills/skill-creator/references/workflows.md +0 -28
- package/.jumpstart/skills/skill-creator/scripts/init_skill.py +0 -303
- /package/{.jumpstart/skills/backend → .github/skills}/api-design-principles/SKILL.md +0 -0
- /package/{.jumpstart/skills/backend → .github/skills}/api-design-principles/assets/api-design-checklist.md +0 -0
- /package/{.jumpstart/skills/backend → .github/skills}/api-design-principles/assets/rest-api-template.py +0 -0
- /package/{.jumpstart/skills/backend → .github/skills}/api-design-principles/references/graphql-schema-design.md +0 -0
- /package/{.jumpstart/skills/backend → .github/skills}/api-design-principles/references/rest-best-practices.md +0 -0
- /package/{.jumpstart/skills/backend → .github/skills}/architecture-patterns/SKILL.md +0 -0
- /package/{.jumpstart/skills/cloud-infrastructure → .github/skills}/cost-optimization/SKILL.md +0 -0
- /package/{.jumpstart/skills/backend → .github/skills}/cqrs-implementation/SKILL.md +0 -0
- /package/{.jumpstart/skills/backend → .github/skills}/event-store-design/SKILL.md +0 -0
- /package/{.jumpstart/skills/cloud-infrastructure → .github/skills}/hybrid-cloud-networking/SKILL.md +0 -0
- /package/{.jumpstart/skills/cloud-infrastructure → .github/skills}/istio-traffic-management/SKILL.md +0 -0
- /package/{.jumpstart/skills/cloud-infrastructure → .github/skills}/linkerd-patterns/SKILL.md +0 -0
- /package/{.jumpstart/skills/backend → .github/skills}/microservices-patterns/SKILL.md +0 -0
- /package/{.jumpstart/skills/cloud-infrastructure → .github/skills}/mtls-configuration/SKILL.md +0 -0
- /package/{.jumpstart/skills/cloud-infrastructure → .github/skills}/multi-cloud-architecture/SKILL.md +0 -0
- /package/{.jumpstart/skills/backend → .github/skills}/projection-patterns/SKILL.md +0 -0
- /package/{.jumpstart/skills/backend → .github/skills}/saga-orchestration/SKILL.md +0 -0
- /package/{.jumpstart/skills/cloud-infrastructure → .github/skills}/service-mesh-observability/SKILL.md +0 -0
- /package/{.jumpstart/skills/backend → .github/skills}/temporal-python-testing/SKILL.md +0 -0
- /package/{.jumpstart/skills/backend → .github/skills}/temporal-python-testing/resources/integration-testing.md +0 -0
- /package/{.jumpstart/skills/backend → .github/skills}/temporal-python-testing/resources/local-setup.md +0 -0
- /package/{.jumpstart/skills/backend → .github/skills}/temporal-python-testing/resources/replay-testing.md +0 -0
- /package/{.jumpstart/skills/backend → .github/skills}/temporal-python-testing/resources/unit-testing.md +0 -0
- /package/{.jumpstart/skills/cloud-infrastructure → .github/skills}/terraform-module-library/SKILL.md +0 -0
- /package/{.jumpstart/skills/cloud-infrastructure → .github/skills}/terraform-module-library/references/aws-modules.md +0 -0
- /package/{.jumpstart/skills/backend → .github/skills}/workflow-orchestration-patterns/SKILL.md +0 -0
|
@@ -0,0 +1,2038 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
Azure Interactive Architecture Diagram Generator v3
|
|
4
|
+
Generates interactive HTML diagrams with Azure official icons (Base64 inline).
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import json
|
|
8
|
+
from datetime import datetime
|
|
9
|
+
|
|
10
|
+
from icons import get_icon_data_uri
|
|
11
|
+
|
|
12
|
+
_HAS_OFFICIAL_ICONS = True
|
|
13
|
+
# Azure service icons: SVG, colors + official icon key mapping
|
|
14
|
+
# icon: 48x48 viewBox SVG path (fallback)
|
|
15
|
+
# azure_icon_key: key in icons.py (official Azure icon)
|
|
16
|
+
SERVICE_ICONS = {
|
|
17
|
+
"openai": {
|
|
18
|
+
"icon_svg": '<circle cx="24" cy="24" r="18" fill="#0078D4"/><text x="24" y="30" text-anchor="middle" font-size="18" fill="white" font-weight="700">AI</text>',
|
|
19
|
+
"color": "#0078D4", "bg": "#E8F4FD", "category": "AI",
|
|
20
|
+
"azure_icon_key": "azure_openai"
|
|
21
|
+
},
|
|
22
|
+
"ai_foundry": {
|
|
23
|
+
"icon_svg": '<rect x="6" y="10" width="36" height="28" rx="4" fill="#0078D4"/><rect x="12" y="16" width="10" height="8" rx="2" fill="white" opacity="0.9"/><rect x="26" y="16" width="10" height="8" rx="2" fill="white" opacity="0.9"/><rect x="12" y="27" width="24" height="5" rx="2" fill="white" opacity="0.6"/>',
|
|
24
|
+
"color": "#0078D4", "bg": "#E8F4FD", "category": "AI",
|
|
25
|
+
"azure_icon_key": "ai_foundry"
|
|
26
|
+
},
|
|
27
|
+
"ai_hub": {
|
|
28
|
+
"icon_svg": '<rect x="6" y="10" width="36" height="28" rx="4" fill="#0078D4"/><circle cx="24" cy="24" r="8" fill="white" opacity="0.9"/><circle cx="24" cy="24" r="4" fill="#0078D4"/>',
|
|
29
|
+
"color": "#0078D4", "bg": "#E8F4FD", "category": "AI",
|
|
30
|
+
"azure_icon_key": "machine_learning"
|
|
31
|
+
},
|
|
32
|
+
"search": {
|
|
33
|
+
"icon_svg": '<circle cx="20" cy="20" r="12" fill="none" stroke="#0078D4" stroke-width="3.5"/><line x1="29" y1="29" x2="40" y2="40" stroke="#0078D4" stroke-width="3.5" stroke-linecap="round"/><circle cx="20" cy="20" r="5" fill="#0078D4" opacity="0.3"/>',
|
|
34
|
+
"color": "#0078D4", "bg": "#E8F4FD", "category": "AI",
|
|
35
|
+
"azure_icon_key": "cognitive_search"
|
|
36
|
+
},
|
|
37
|
+
"ai_search": {
|
|
38
|
+
"icon_svg": '<circle cx="20" cy="20" r="12" fill="none" stroke="#0078D4" stroke-width="3.5"/><line x1="29" y1="29" x2="40" y2="40" stroke="#0078D4" stroke-width="3.5" stroke-linecap="round"/><circle cx="20" cy="20" r="5" fill="#0078D4" opacity="0.3"/>',
|
|
39
|
+
"color": "#0078D4", "bg": "#E8F4FD", "category": "AI",
|
|
40
|
+
"azure_icon_key": "cognitive_search"
|
|
41
|
+
},
|
|
42
|
+
"aml": {
|
|
43
|
+
"icon_svg": '<rect x="6" y="8" width="36" height="32" rx="4" fill="#0078D4"/><path d="M14 32 L20 18 L26 26 L32 14" stroke="white" stroke-width="2.5" fill="none" stroke-linecap="round" stroke-linejoin="round"/>',
|
|
44
|
+
"color": "#0078D4", "bg": "#E8F4FD", "category": "AI",
|
|
45
|
+
"azure_icon_key": "machine_learning"
|
|
46
|
+
},
|
|
47
|
+
"storage": {
|
|
48
|
+
"icon_svg": '<rect x="8" y="8" width="32" height="8" rx="3" fill="#0078D4"/><rect x="8" y="20" width="32" height="8" rx="3" fill="#0078D4" opacity="0.7"/><rect x="8" y="32" width="32" height="8" rx="3" fill="#0078D4" opacity="0.4"/>',
|
|
49
|
+
"color": "#0078D4", "bg": "#E8F4FD", "category": "Data",
|
|
50
|
+
"azure_icon_key": "storage_accounts"
|
|
51
|
+
},
|
|
52
|
+
"adls": {
|
|
53
|
+
"icon_svg": '<rect x="8" y="8" width="32" height="8" rx="3" fill="#0078D4"/><rect x="8" y="20" width="32" height="8" rx="3" fill="#0078D4" opacity="0.7"/><rect x="8" y="32" width="32" height="8" rx="3" fill="#0078D4" opacity="0.4"/>',
|
|
54
|
+
"color": "#0078D4", "bg": "#E8F4FD", "category": "Data",
|
|
55
|
+
"azure_icon_key": "data_lake_storage_gen1"
|
|
56
|
+
},
|
|
57
|
+
"fabric": {
|
|
58
|
+
"icon_svg": '<polygon points="24,6 42,18 42,34 24,46 6,34 6,18" fill="#E8740C" opacity="0.9"/><text x="24" y="30" text-anchor="middle" font-size="14" fill="white" font-weight="700">F</text>',
|
|
59
|
+
"color": "#E8740C", "bg": "#FEF3E8", "category": "Data",
|
|
60
|
+
"azure_icon_key": "microsoft_fabric"
|
|
61
|
+
},
|
|
62
|
+
"synapse": {
|
|
63
|
+
"icon_svg": '<circle cx="24" cy="24" r="18" fill="#0078D4"/><path d="M15 24 L24 15 L33 24 L24 33 Z" fill="white" opacity="0.9"/>',
|
|
64
|
+
"color": "#0078D4", "bg": "#E8F4FD", "category": "Data",
|
|
65
|
+
"azure_icon_key": "azure_synapse_analytics"
|
|
66
|
+
},
|
|
67
|
+
"adf": {
|
|
68
|
+
"icon_svg": '<rect x="6" y="12" width="36" height="24" rx="4" fill="#0078D4"/><path d="M16 24 L28 24 M24 18 L30 24 L24 30" stroke="white" stroke-width="2.5" fill="none" stroke-linecap="round" stroke-linejoin="round"/>',
|
|
69
|
+
"color": "#0078D4", "bg": "#E8F4FD", "category": "Data",
|
|
70
|
+
"azure_icon_key": "data_factory"
|
|
71
|
+
},
|
|
72
|
+
"data_factory": {
|
|
73
|
+
"icon_svg": '<rect x="6" y="12" width="36" height="24" rx="4" fill="#0078D4"/><path d="M16 24 L28 24 M24 18 L30 24 L24 30" stroke="white" stroke-width="2.5" fill="none" stroke-linecap="round" stroke-linejoin="round"/>',
|
|
74
|
+
"color": "#0078D4", "bg": "#E8F4FD", "category": "Data",
|
|
75
|
+
"azure_icon_key": "data_factory"
|
|
76
|
+
},
|
|
77
|
+
"keyvault": {
|
|
78
|
+
"icon_svg": '<rect x="10" y="6" width="28" height="36" rx="4" fill="#E8A000"/><circle cx="24" cy="22" r="6" fill="white"/><rect x="22" y="26" width="4" height="10" rx="1" fill="white"/>',
|
|
79
|
+
"color": "#E8A000", "bg": "#FEF7E0", "category": "Security",
|
|
80
|
+
"azure_icon_key": "key_vaults"
|
|
81
|
+
},
|
|
82
|
+
"kv": {
|
|
83
|
+
"icon_svg": '<rect x="10" y="6" width="28" height="36" rx="4" fill="#E8A000"/><circle cx="24" cy="22" r="6" fill="white"/><rect x="22" y="26" width="4" height="10" rx="1" fill="white"/>',
|
|
84
|
+
"color": "#E8A000", "bg": "#FEF7E0", "category": "Security",
|
|
85
|
+
"azure_icon_key": "key_vaults"
|
|
86
|
+
},
|
|
87
|
+
"vnet": {
|
|
88
|
+
"icon_svg": '<rect x="6" y="6" width="36" height="36" rx="4" fill="none" stroke="#5C2D91" stroke-width="2.5"/><circle cx="16" cy="18" r="4" fill="#5C2D91"/><circle cx="32" cy="18" r="4" fill="#5C2D91"/><circle cx="24" cy="32" r="4" fill="#5C2D91"/><line x1="16" y1="18" x2="32" y2="18" stroke="#5C2D91" stroke-width="1.5"/><line x1="16" y1="18" x2="24" y2="32" stroke="#5C2D91" stroke-width="1.5"/><line x1="32" y1="18" x2="24" y2="32" stroke="#5C2D91" stroke-width="1.5"/>',
|
|
89
|
+
"color": "#5C2D91", "bg": "#F3EEF9", "category": "Network",
|
|
90
|
+
"azure_icon_key": "virtual_networks"
|
|
91
|
+
},
|
|
92
|
+
"pe": {
|
|
93
|
+
"icon_svg": '<circle cx="24" cy="24" r="14" fill="none" stroke="#5C2D91" stroke-width="2"/><circle cx="24" cy="24" r="6" fill="#5C2D91"/><line x1="24" y1="10" x2="24" y2="4" stroke="#5C2D91" stroke-width="2"/><line x1="24" y1="38" x2="24" y2="44" stroke="#5C2D91" stroke-width="2"/>',
|
|
94
|
+
"color": "#5C2D91", "bg": "#F3EEF9", "category": "Network",
|
|
95
|
+
"azure_icon_key": "private_endpoints"
|
|
96
|
+
},
|
|
97
|
+
"nsg": {
|
|
98
|
+
"icon_svg": '<rect x="8" y="8" width="32" height="32" rx="4" fill="#5C2D91"/><path d="M18 20 L24 14 L30 20 M18 28 L24 34 L30 28" stroke="white" stroke-width="2" fill="none"/>',
|
|
99
|
+
"color": "#5C2D91", "bg": "#F3EEF9", "category": "Network",
|
|
100
|
+
"azure_icon_key": "network_security_groups"
|
|
101
|
+
},
|
|
102
|
+
"acr": {
|
|
103
|
+
"icon_svg": '<rect x="8" y="10" width="32" height="28" rx="4" fill="#0078D4"/><rect x="14" y="16" width="20" height="16" rx="2" fill="white" opacity="0.3"/><text x="24" y="30" text-anchor="middle" font-size="12" fill="white" font-weight="600">ACR</text>',
|
|
104
|
+
"color": "#0078D4", "bg": "#E8F4FD", "category": "Compute"
|
|
105
|
+
},
|
|
106
|
+
"aks": {
|
|
107
|
+
"icon_svg": '<circle cx="24" cy="24" r="18" fill="#326CE5"/><text x="24" y="30" text-anchor="middle" font-size="16" fill="white" font-weight="700">K</text>',
|
|
108
|
+
"color": "#326CE5", "bg": "#EBF0FC", "category": "Compute",
|
|
109
|
+
"azure_icon_key": "kubernetes_services"
|
|
110
|
+
},
|
|
111
|
+
"appservice": {
|
|
112
|
+
"icon_svg": '<rect x="8" y="8" width="32" height="32" rx="6" fill="#0078D4"/><polygon points="24,14 34,34 14,34" fill="white" opacity="0.9"/>',
|
|
113
|
+
"color": "#0078D4", "bg": "#E8F4FD", "category": "Compute",
|
|
114
|
+
"azure_icon_key": "app_services"
|
|
115
|
+
},
|
|
116
|
+
"appinsights": {
|
|
117
|
+
"icon_svg": '<circle cx="24" cy="24" r="16" fill="#773ADC"/><path d="M16 28 L20 20 L24 24 L28 16 L32 22" stroke="white" stroke-width="2" fill="none" stroke-linecap="round"/>',
|
|
118
|
+
"color": "#773ADC", "bg": "#F0EAFA", "category": "Monitor",
|
|
119
|
+
"azure_icon_key": "application_insights"
|
|
120
|
+
},
|
|
121
|
+
"monitor": {
|
|
122
|
+
"icon_svg": '<rect x="6" y="10" width="36" height="24" rx="4" fill="#773ADC"/><path d="M14 28 L20 20 L26 24 L34 16" stroke="white" stroke-width="2" fill="none" stroke-linecap="round"/><rect x="14" y="36" width="20" height="3" rx="1" fill="#773ADC" opacity="0.5"/>',
|
|
123
|
+
"color": "#773ADC", "bg": "#F0EAFA", "category": "Monitor",
|
|
124
|
+
"azure_icon_key": "monitor"
|
|
125
|
+
},
|
|
126
|
+
"vm": {
|
|
127
|
+
"icon_svg": '<rect x="6" y="8" width="36" height="26" rx="3" fill="#0078D4"/><rect x="10" y="12" width="28" height="18" rx="1" fill="white" opacity="0.2"/><rect x="16" y="36" width="16" height="4" rx="1" fill="#0078D4"/>',
|
|
128
|
+
"color": "#0078D4", "bg": "#E8F4FD", "category": "Compute",
|
|
129
|
+
"azure_icon_key": "virtual_machine"
|
|
130
|
+
},
|
|
131
|
+
"bastion": {
|
|
132
|
+
"icon_svg": '<rect x="8" y="6" width="32" height="36" rx="4" fill="#5C2D91"/><rect x="14" y="12" width="20" height="14" rx="2" fill="white" opacity="0.3"/><circle cx="24" cy="34" r="4" fill="white" opacity="0.7"/>',
|
|
133
|
+
"color": "#5C2D91", "bg": "#F3EEF9", "category": "Network",
|
|
134
|
+
"azure_icon_key": "bastions"
|
|
135
|
+
},
|
|
136
|
+
"jumpbox": {
|
|
137
|
+
"icon_svg": '<rect x="8" y="8" width="32" height="32" rx="4" fill="#5C2D91"/><text x="24" y="30" text-anchor="middle" font-size="14" fill="white" font-weight="600">JB</text>',
|
|
138
|
+
"color": "#5C2D91", "bg": "#F3EEF9", "category": "Network",
|
|
139
|
+
"azure_icon_key": "virtual_machine"
|
|
140
|
+
},
|
|
141
|
+
"vpn": {
|
|
142
|
+
"icon_svg": '<rect x="6" y="12" width="36" height="24" rx="4" fill="#5C2D91"/><path d="M16 24 L24 16 L32 24 L24 32 Z" fill="white" opacity="0.8"/>',
|
|
143
|
+
"color": "#5C2D91", "bg": "#F3EEF9", "category": "Network",
|
|
144
|
+
"azure_icon_key": "virtual_network_gateways"
|
|
145
|
+
},
|
|
146
|
+
"user": {
|
|
147
|
+
"icon_svg": '<circle cx="24" cy="16" r="8" fill="#0078D4"/><path d="M10 42 Q10 30 24 30 Q38 30 38 42" fill="#0078D4"/>',
|
|
148
|
+
"color": "#0078D4", "bg": "#E8F4FD", "category": "External"
|
|
149
|
+
},
|
|
150
|
+
"app": {
|
|
151
|
+
"icon_svg": '<rect x="8" y="6" width="32" height="36" rx="6" fill="#666"/><rect x="14" y="12" width="20" height="20" rx="2" fill="white" opacity="0.3"/><circle cx="24" cy="40" r="2" fill="white" opacity="0.7"/>',
|
|
152
|
+
"color": "#666666", "bg": "#F5F5F5", "category": "External"
|
|
153
|
+
},
|
|
154
|
+
"default": {
|
|
155
|
+
"icon_svg": '<circle cx="24" cy="24" r="16" fill="#0078D4"/><text x="24" y="30" text-anchor="middle" font-size="14" fill="white" font-weight="600">?</text>',
|
|
156
|
+
"color": "#0078D4", "bg": "#E8F4FD", "category": "Azure"
|
|
157
|
+
},
|
|
158
|
+
"cdn": {
|
|
159
|
+
"icon_svg": '<circle cx="24" cy="24" r="18" fill="#0078D4"/><text x="24" y="28" text-anchor="middle" font-size="10" fill="white" font-weight="700">CDN</text>',
|
|
160
|
+
"color": "#0078D4", "bg": "#E8F4FD", "category": "Network",
|
|
161
|
+
"azure_icon_key": "cdn_profiles"
|
|
162
|
+
},
|
|
163
|
+
"event_hub": {
|
|
164
|
+
"icon_svg": '<rect x="6" y="6" width="36" height="36" rx="4" fill="#0078D4"/><text x="24" y="22" text-anchor="middle" font-size="8" fill="white" font-weight="700">Event</text><text x="24" y="33" text-anchor="middle" font-size="8" fill="white">Hub</text>',
|
|
165
|
+
"color": "#0078D4", "bg": "#E8F4FD", "category": "Integration",
|
|
166
|
+
"azure_icon_key": "event_hubs"
|
|
167
|
+
},
|
|
168
|
+
"redis": {
|
|
169
|
+
"icon_svg": '<rect x="6" y="6" width="36" height="36" rx="4" fill="#D83B01"/><text x="24" y="28" text-anchor="middle" font-size="10" fill="white" font-weight="700">Redis</text>',
|
|
170
|
+
"color": "#D83B01", "bg": "#FEF0E8", "category": "Data",
|
|
171
|
+
"azure_icon_key": "cache_redis"
|
|
172
|
+
},
|
|
173
|
+
"devops": {
|
|
174
|
+
"icon_svg": '<rect x="6" y="6" width="36" height="36" rx="4" fill="#0078D4"/><text x="24" y="22" text-anchor="middle" font-size="8" fill="white" font-weight="700">Dev</text><text x="24" y="33" text-anchor="middle" font-size="8" fill="white">Ops</text>',
|
|
175
|
+
"color": "#0078D4", "bg": "#E8F4FD", "category": "DevOps",
|
|
176
|
+
"azure_icon_key": "azure_devops"
|
|
177
|
+
},
|
|
178
|
+
"acr": {
|
|
179
|
+
"icon_svg": '<rect x="8" y="10" width="32" height="28" rx="4" fill="#0078D4"/><text x="24" y="28" text-anchor="middle" font-size="10" fill="white" font-weight="700">ACR</text>',
|
|
180
|
+
"color": "#0078D4", "bg": "#E8F4FD", "category": "Compute",
|
|
181
|
+
"azure_icon_key": "container_registries"
|
|
182
|
+
},
|
|
183
|
+
"container_registry": {
|
|
184
|
+
"icon_svg": '<rect x="8" y="10" width="32" height="28" rx="4" fill="#0078D4"/><text x="24" y="28" text-anchor="middle" font-size="10" fill="white" font-weight="700">ACR</text>',
|
|
185
|
+
"color": "#0078D4", "bg": "#E8F4FD", "category": "Compute",
|
|
186
|
+
"azure_icon_key": "container_registries"
|
|
187
|
+
},
|
|
188
|
+
"app_gateway": {
|
|
189
|
+
"icon_svg": '<rect x="6" y="6" width="36" height="36" rx="4" fill="#0078D4"/><text x="24" y="22" text-anchor="middle" font-size="8" fill="white" font-weight="700">App</text><text x="24" y="33" text-anchor="middle" font-size="8" fill="white">GW</text>',
|
|
190
|
+
"color": "#0078D4", "bg": "#E8F4FD", "category": "Network",
|
|
191
|
+
"azure_icon_key": "application_gateways"
|
|
192
|
+
},
|
|
193
|
+
"iot_hub": {
|
|
194
|
+
"icon_svg": '<rect x="6" y="6" width="36" height="36" rx="4" fill="#0078D4"/><text x="24" y="22" text-anchor="middle" font-size="8" fill="white" font-weight="700">IoT</text><text x="24" y="33" text-anchor="middle" font-size="8" fill="white">Hub</text>',
|
|
195
|
+
"color": "#0078D4", "bg": "#E8F4FD", "category": "IoT",
|
|
196
|
+
"azure_icon_key": "iot_hub"
|
|
197
|
+
},
|
|
198
|
+
"stream_analytics": {
|
|
199
|
+
"icon_svg": '<rect x="6" y="6" width="36" height="36" rx="4" fill="#0078D4"/><text x="24" y="22" text-anchor="middle" font-size="7" fill="white" font-weight="700">Stream</text><text x="24" y="33" text-anchor="middle" font-size="7" fill="white">Analytics</text>',
|
|
200
|
+
"color": "#0078D4", "bg": "#E8F4FD", "category": "Data",
|
|
201
|
+
"azure_icon_key": "stream_analytics_jobs"
|
|
202
|
+
},
|
|
203
|
+
"vpn_gateway": {
|
|
204
|
+
"icon_svg": '<rect x="6" y="12" width="36" height="24" rx="4" fill="#5C2D91"/><path d="M16 24 L24 16 L32 24 L24 32 Z" fill="white" opacity="0.8"/>',
|
|
205
|
+
"color": "#5C2D91", "bg": "#F3EEF9", "category": "Network",
|
|
206
|
+
"azure_icon_key": "virtual_network_gateways"
|
|
207
|
+
},
|
|
208
|
+
"front_door": {
|
|
209
|
+
"icon_svg": '<rect x="6" y="6" width="36" height="36" rx="4" fill="#0078D4"/><text x="24" y="22" text-anchor="middle" font-size="7" fill="white" font-weight="700">Front</text><text x="24" y="33" text-anchor="middle" font-size="7" fill="white">Door</text>',
|
|
210
|
+
"color": "#0078D4", "bg": "#E8F4FD", "category": "Network",
|
|
211
|
+
"azure_icon_key": "front_door_and_cdn_profiles"
|
|
212
|
+
},
|
|
213
|
+
"ai_hub": {
|
|
214
|
+
"icon_svg": '<rect x="6" y="10" width="36" height="28" rx="4" fill="#0078D4"/><circle cx="24" cy="24" r="8" fill="white" opacity="0.9"/><circle cx="24" cy="24" r="4" fill="#0078D4"/>',
|
|
215
|
+
"color": "#0078D4", "bg": "#E8F4FD", "category": "AI",
|
|
216
|
+
"azure_icon_key": "ai_studio"
|
|
217
|
+
},
|
|
218
|
+
"firewall": {
|
|
219
|
+
"icon_svg": '<rect x="6" y="6" width="36" height="36" rx="4" fill="#E8A000"/><text x="24" y="22" text-anchor="middle" font-size="7" fill="white" font-weight="700">Fire</text><text x="24" y="33" text-anchor="middle" font-size="7" fill="white">wall</text>',
|
|
220
|
+
"color": "#E8A000", "bg": "#FFF8E1", "category": "Network",
|
|
221
|
+
"azure_icon_key": "firewalls"
|
|
222
|
+
},
|
|
223
|
+
"document_intelligence": {
|
|
224
|
+
"icon_svg": '<rect x="6" y="6" width="36" height="36" rx="4" fill="#0078D4"/><text x="24" y="22" text-anchor="middle" font-size="9" fill="white" font-weight="700">Doc</text><text x="24" y="33" text-anchor="middle" font-size="9" fill="white">Intel</text>',
|
|
225
|
+
"color": "#0078D4", "bg": "#E8F4FD", "category": "AI",
|
|
226
|
+
"azure_icon_key": "form_recognizer"
|
|
227
|
+
},
|
|
228
|
+
"form_recognizer": {
|
|
229
|
+
"icon_svg": '<rect x="6" y="6" width="36" height="36" rx="4" fill="#0078D4"/><text x="24" y="22" text-anchor="middle" font-size="9" fill="white" font-weight="700">Doc</text><text x="24" y="33" text-anchor="middle" font-size="9" fill="white">Intel</text>',
|
|
230
|
+
"color": "#0078D4", "bg": "#E8F4FD", "category": "AI",
|
|
231
|
+
"azure_icon_key": "form_recognizer"
|
|
232
|
+
},
|
|
233
|
+
"databricks": {
|
|
234
|
+
"icon_svg": '<rect x="6" y="6" width="36" height="36" rx="6" fill="#FF3621"/><text x="24" y="30" text-anchor="middle" font-size="16" fill="white" font-weight="700">DB</text>',
|
|
235
|
+
"color": "#FF3621", "bg": "#FFF0EE", "category": "Data",
|
|
236
|
+
"azure_icon_key": "azure_databricks"
|
|
237
|
+
},
|
|
238
|
+
"sql_server": {
|
|
239
|
+
"icon_svg": '<rect x="6" y="6" width="36" height="36" rx="4" fill="#0078D4"/><text x="24" y="22" text-anchor="middle" font-size="11" fill="white" font-weight="700">SQL</text><rect x="12" y="28" width="24" height="8" rx="2" fill="white" opacity="0.3"/>',
|
|
240
|
+
"color": "#0078D4", "bg": "#E8F4FD", "category": "Data",
|
|
241
|
+
"azure_icon_key": "sql_server"
|
|
242
|
+
},
|
|
243
|
+
"sql_database": {
|
|
244
|
+
"icon_svg": '<rect x="6" y="6" width="36" height="36" rx="4" fill="#0078D4"/><text x="24" y="22" text-anchor="middle" font-size="11" fill="white" font-weight="700">SQL</text><rect x="12" y="28" width="24" height="8" rx="2" fill="white" opacity="0.3"/>',
|
|
245
|
+
"color": "#0078D4", "bg": "#E8F4FD", "category": "Data",
|
|
246
|
+
"azure_icon_key": "sql_database"
|
|
247
|
+
},
|
|
248
|
+
"cosmos_db": {
|
|
249
|
+
"icon_svg": '<circle cx="24" cy="24" r="18" fill="#0078D4"/><text x="24" y="22" text-anchor="middle" font-size="9" fill="white" font-weight="700">Cosmos</text><text x="24" y="33" text-anchor="middle" font-size="9" fill="white">DB</text>',
|
|
250
|
+
"color": "#0078D4", "bg": "#E8F4FD", "category": "Data",
|
|
251
|
+
"azure_icon_key": "azure_cosmos_db"
|
|
252
|
+
},
|
|
253
|
+
"app_service": {
|
|
254
|
+
"icon_svg": '<rect x="6" y="10" width="36" height="28" rx="6" fill="#0078D4"/><text x="24" y="28" text-anchor="middle" font-size="11" fill="white" font-weight="700">App</text>',
|
|
255
|
+
"color": "#0078D4", "bg": "#E8F4FD", "category": "Compute",
|
|
256
|
+
"azure_icon_key": "app_services"
|
|
257
|
+
},
|
|
258
|
+
"aks": {
|
|
259
|
+
"icon_svg": '<polygon points="24,4 44,20 38,44 10,44 4,20" fill="#326CE5" stroke="#fff" stroke-width="1"/><text x="24" y="30" text-anchor="middle" font-size="11" fill="white" font-weight="700">K8s</text>',
|
|
260
|
+
"color": "#326CE5", "bg": "#EBF0FA", "category": "Compute",
|
|
261
|
+
"azure_icon_key": "kubernetes_services"
|
|
262
|
+
},
|
|
263
|
+
"function_app": {
|
|
264
|
+
"icon_svg": '<polygon points="24,6 42,42 6,42" fill="#F0AD4E"/><text x="24" y="36" text-anchor="middle" font-size="14" fill="white" font-weight="700">ƒ</text>',
|
|
265
|
+
"color": "#F0AD4E", "bg": "#FFF8ED", "category": "Compute",
|
|
266
|
+
"azure_icon_key": "function_apps"
|
|
267
|
+
},
|
|
268
|
+
"synapse": {
|
|
269
|
+
"icon_svg": '<circle cx="24" cy="24" r="18" fill="#0078D4"/><text x="24" y="22" text-anchor="middle" font-size="8" fill="white" font-weight="700">Syn</text><text x="24" y="32" text-anchor="middle" font-size="8" fill="white">apse</text>',
|
|
270
|
+
"color": "#0078D4", "bg": "#E8F4FD", "category": "Data",
|
|
271
|
+
"azure_icon_key": "azure_synapse_analytics"
|
|
272
|
+
},
|
|
273
|
+
"log_analytics": {
|
|
274
|
+
"icon_svg": '<rect x="6" y="6" width="36" height="36" rx="4" fill="#5C2D91"/><text x="24" y="28" text-anchor="middle" font-size="10" fill="white" font-weight="700">Log</text>',
|
|
275
|
+
"color": "#5C2D91", "bg": "#F3EDF7", "category": "Monitoring",
|
|
276
|
+
"azure_icon_key": "log_analytics_workspaces"
|
|
277
|
+
},
|
|
278
|
+
"app_insights": {
|
|
279
|
+
"icon_svg": '<circle cx="24" cy="24" r="18" fill="#5C2D91"/><text x="24" y="28" text-anchor="middle" font-size="10" fill="white" font-weight="700">AI</text>',
|
|
280
|
+
"color": "#5C2D91", "bg": "#F3EDF7", "category": "Monitoring",
|
|
281
|
+
"azure_icon_key": "application_insights"
|
|
282
|
+
},
|
|
283
|
+
"nsg": {
|
|
284
|
+
"icon_svg": '<rect x="6" y="6" width="36" height="36" rx="4" fill="#E8A000"/><text x="24" y="28" text-anchor="middle" font-size="10" fill="white" font-weight="700">NSG</text>',
|
|
285
|
+
"color": "#E8A000", "bg": "#FFF8E1", "category": "Network",
|
|
286
|
+
"azure_icon_key": "network_security_groups"
|
|
287
|
+
},
|
|
288
|
+
"apim": {
|
|
289
|
+
"icon_svg": '<rect x="6" y="8" width="36" height="32" rx="4" fill="#0078D4"/><path d="M16 20 L32 20 M16 28 L32 28 M24 14 L24 34" stroke="white" stroke-width="2" fill="none" stroke-linecap="round"/>',
|
|
290
|
+
"color": "#0078D4", "bg": "#E8F4FD", "category": "Integration",
|
|
291
|
+
"azure_icon_key": "api_management_services"
|
|
292
|
+
},
|
|
293
|
+
"api_management": {
|
|
294
|
+
"icon_svg": '<rect x="6" y="8" width="36" height="32" rx="4" fill="#0078D4"/><path d="M16 20 L32 20 M16 28 L32 28 M24 14 L24 34" stroke="white" stroke-width="2" fill="none" stroke-linecap="round"/>',
|
|
295
|
+
"color": "#0078D4", "bg": "#E8F4FD", "category": "Integration",
|
|
296
|
+
"azure_icon_key": "api_management_services"
|
|
297
|
+
},
|
|
298
|
+
"service_bus": {
|
|
299
|
+
"icon_svg": '<rect x="6" y="10" width="36" height="28" rx="4" fill="#0078D4"/><path d="M14 24 L22 24 M26 24 L34 24" stroke="white" stroke-width="2.5" fill="none" stroke-linecap="round"/><circle cx="24" cy="24" r="4" fill="white"/>',
|
|
300
|
+
"color": "#0078D4", "bg": "#E8F4FD", "category": "Integration",
|
|
301
|
+
"azure_icon_key": "azure_service_bus"
|
|
302
|
+
},
|
|
303
|
+
"logic_apps": {
|
|
304
|
+
"icon_svg": '<rect x="6" y="8" width="36" height="32" rx="4" fill="#0078D4"/><path d="M14 18 L24 28 L34 18" stroke="white" stroke-width="2.5" fill="none" stroke-linecap="round" stroke-linejoin="round"/>',
|
|
305
|
+
"color": "#0078D4", "bg": "#E8F4FD", "category": "Integration",
|
|
306
|
+
"azure_icon_key": "logic_apps"
|
|
307
|
+
},
|
|
308
|
+
"logic_app": {
|
|
309
|
+
"icon_svg": '<rect x="6" y="8" width="36" height="32" rx="4" fill="#0078D4"/><path d="M14 18 L24 28 L34 18" stroke="white" stroke-width="2.5" fill="none" stroke-linecap="round" stroke-linejoin="round"/>',
|
|
310
|
+
"color": "#0078D4", "bg": "#E8F4FD", "category": "Integration",
|
|
311
|
+
"azure_icon_key": "logic_apps"
|
|
312
|
+
},
|
|
313
|
+
"event_grid": {
|
|
314
|
+
"icon_svg": '<rect x="6" y="8" width="36" height="32" rx="4" fill="#0078D4"/><circle cx="16" cy="18" r="3" fill="white"/><circle cx="32" cy="18" r="3" fill="white"/><circle cx="16" cy="30" r="3" fill="white"/><circle cx="32" cy="30" r="3" fill="white"/><line x1="16" y1="18" x2="32" y2="30" stroke="white" stroke-width="1.5"/><line x1="32" y1="18" x2="16" y2="30" stroke="white" stroke-width="1.5"/>',
|
|
315
|
+
"color": "#0078D4", "bg": "#E8F4FD", "category": "Integration",
|
|
316
|
+
"azure_icon_key": "event_grid_topics"
|
|
317
|
+
},
|
|
318
|
+
"container_apps": {
|
|
319
|
+
"icon_svg": '<rect x="6" y="8" width="36" height="32" rx="4" fill="#0078D4"/><rect x="12" y="14" width="10" height="10" rx="2" fill="white" opacity="0.9"/><rect x="26" y="14" width="10" height="10" rx="2" fill="white" opacity="0.9"/><rect x="12" y="28" width="24" height="6" rx="2" fill="white" opacity="0.6"/>',
|
|
320
|
+
"color": "#0078D4", "bg": "#E8F4FD", "category": "Compute",
|
|
321
|
+
"azure_icon_key": "container_apps_environments"
|
|
322
|
+
},
|
|
323
|
+
"container_app": {
|
|
324
|
+
"icon_svg": '<rect x="6" y="8" width="36" height="32" rx="4" fill="#0078D4"/><rect x="12" y="14" width="10" height="10" rx="2" fill="white" opacity="0.9"/><rect x="26" y="14" width="10" height="10" rx="2" fill="white" opacity="0.9"/><rect x="12" y="28" width="24" height="6" rx="2" fill="white" opacity="0.6"/>',
|
|
325
|
+
"color": "#0078D4", "bg": "#E8F4FD", "category": "Compute",
|
|
326
|
+
"azure_icon_key": "container_apps_environments"
|
|
327
|
+
},
|
|
328
|
+
"postgresql": {
|
|
329
|
+
"icon_svg": '<rect x="8" y="8" width="32" height="32" rx="4" fill="#0078D4"/><text x="24" y="28" text-anchor="middle" font-size="10" fill="white" font-weight="700">PG</text>',
|
|
330
|
+
"color": "#0078D4", "bg": "#E8F4FD", "category": "Data",
|
|
331
|
+
"azure_icon_key": "azure_database_postgresql_server"
|
|
332
|
+
},
|
|
333
|
+
"mysql": {
|
|
334
|
+
"icon_svg": '<rect x="8" y="8" width="32" height="32" rx="4" fill="#0078D4"/><text x="24" y="28" text-anchor="middle" font-size="10" fill="white" font-weight="700">My</text>',
|
|
335
|
+
"color": "#0078D4", "bg": "#E8F4FD", "category": "Data",
|
|
336
|
+
"azure_icon_key": "azure_database_mysql_server"
|
|
337
|
+
},
|
|
338
|
+
"load_balancer": {
|
|
339
|
+
"icon_svg": '<circle cx="24" cy="24" r="18" fill="#5C2D91"/><path d="M16 18 L32 18 M16 24 L32 24 M16 30 L32 30" stroke="white" stroke-width="2" fill="none" stroke-linecap="round"/>',
|
|
340
|
+
"color": "#5C2D91", "bg": "#F3EEF9", "category": "Network",
|
|
341
|
+
"azure_icon_key": "load_balancers"
|
|
342
|
+
},
|
|
343
|
+
"nat_gateway": {
|
|
344
|
+
"icon_svg": '<rect x="6" y="8" width="36" height="32" rx="4" fill="#5C2D91"/><text x="24" y="28" text-anchor="middle" font-size="10" fill="white" font-weight="700">NAT</text>',
|
|
345
|
+
"color": "#5C2D91", "bg": "#F3EEF9", "category": "Network",
|
|
346
|
+
"azure_icon_key": "nat"
|
|
347
|
+
},
|
|
348
|
+
"expressroute": {
|
|
349
|
+
"icon_svg": '<rect x="6" y="8" width="36" height="32" rx="4" fill="#5C2D91"/><path d="M14 24 L34 24" stroke="white" stroke-width="3" fill="none" stroke-linecap="round"/><circle cx="14" cy="24" r="4" fill="white"/><circle cx="34" cy="24" r="4" fill="white"/>',
|
|
350
|
+
"color": "#5C2D91", "bg": "#F3EEF9", "category": "Network",
|
|
351
|
+
"azure_icon_key": "expressroute_circuits"
|
|
352
|
+
},
|
|
353
|
+
"sentinel": {
|
|
354
|
+
"icon_svg": '<circle cx="24" cy="24" r="18" fill="#0078D4"/><path d="M24 12 L24 24 L32 28" stroke="white" stroke-width="2.5" fill="none" stroke-linecap="round" stroke-linejoin="round"/><circle cx="24" cy="24" r="3" fill="white"/>',
|
|
355
|
+
"color": "#0078D4", "bg": "#E8F4FD", "category": "Security",
|
|
356
|
+
"azure_icon_key": "azure_sentinel"
|
|
357
|
+
},
|
|
358
|
+
"data_explorer": {
|
|
359
|
+
"icon_svg": '<rect x="6" y="8" width="36" height="32" rx="4" fill="#0078D4"/><path d="M14 30 L20 18 L26 26 L34 14" stroke="white" stroke-width="2.5" fill="none" stroke-linecap="round" stroke-linejoin="round"/>',
|
|
360
|
+
"color": "#0078D4", "bg": "#E8F4FD", "category": "Data",
|
|
361
|
+
"azure_icon_key": "azure_data_explorer_clusters"
|
|
362
|
+
},
|
|
363
|
+
"kusto": {
|
|
364
|
+
"icon_svg": '<rect x="6" y="8" width="36" height="32" rx="4" fill="#0078D4"/><path d="M14 30 L20 18 L26 26 L34 14" stroke="white" stroke-width="2.5" fill="none" stroke-linecap="round" stroke-linejoin="round"/>',
|
|
365
|
+
"color": "#0078D4", "bg": "#E8F4FD", "category": "Data",
|
|
366
|
+
"azure_icon_key": "azure_data_explorer_clusters"
|
|
367
|
+
},
|
|
368
|
+
"signalr": {
|
|
369
|
+
"icon_svg": '<circle cx="24" cy="24" r="18" fill="#0078D4"/><path d="M16 20 Q24 12 32 20 M16 28 Q24 36 32 28" stroke="white" stroke-width="2" fill="none" stroke-linecap="round"/>',
|
|
370
|
+
"color": "#0078D4", "bg": "#E8F4FD", "category": "Integration",
|
|
371
|
+
"azure_icon_key": "signalr"
|
|
372
|
+
},
|
|
373
|
+
"notification_hub": {
|
|
374
|
+
"icon_svg": '<rect x="6" y="8" width="36" height="32" rx="4" fill="#0078D4"/><path d="M18 16 L24 12 L30 16 L30 28 L18 28 Z" stroke="white" stroke-width="2" fill="white" opacity="0.9"/><circle cx="24" cy="32" r="3" fill="white"/>',
|
|
375
|
+
"color": "#0078D4", "bg": "#E8F4FD", "category": "Integration",
|
|
376
|
+
"azure_icon_key": "notification_hubs"
|
|
377
|
+
},
|
|
378
|
+
"spring_apps": {
|
|
379
|
+
"icon_svg": '<circle cx="24" cy="24" r="18" fill="#6DB33F"/><text x="24" y="28" text-anchor="middle" font-size="10" fill="white" font-weight="700">🌱</text>',
|
|
380
|
+
"color": "#6DB33F", "bg": "#EFF8E8", "category": "Compute",
|
|
381
|
+
"azure_icon_key": "azure_spring_apps"
|
|
382
|
+
},
|
|
383
|
+
"static_web_app": {
|
|
384
|
+
"icon_svg": '<rect x="6" y="8" width="36" height="32" rx="4" fill="#0078D4"/><text x="24" y="28" text-anchor="middle" font-size="10" fill="white" font-weight="700">SWA</text>',
|
|
385
|
+
"color": "#0078D4", "bg": "#E8F4FD", "category": "Compute",
|
|
386
|
+
"azure_icon_key": "static_apps"
|
|
387
|
+
},
|
|
388
|
+
"digital_twins": {
|
|
389
|
+
"icon_svg": '<rect x="6" y="8" width="36" height="32" rx="4" fill="#0078D4"/><circle cx="18" cy="20" r="5" fill="white" opacity="0.9"/><circle cx="30" cy="20" r="5" fill="white" opacity="0.9"/><line x1="18" y1="25" x2="18" y2="34" stroke="white" stroke-width="2"/><line x1="30" y1="25" x2="30" y2="34" stroke="white" stroke-width="2"/>',
|
|
390
|
+
"color": "#0078D4", "bg": "#E8F4FD", "category": "IoT",
|
|
391
|
+
"azure_icon_key": "digital_twins"
|
|
392
|
+
},
|
|
393
|
+
"backup": {
|
|
394
|
+
"icon_svg": '<rect x="8" y="8" width="32" height="32" rx="4" fill="#0078D4"/><path d="M16 28 L24 16 L32 28 Z" stroke="white" stroke-width="2" fill="white" opacity="0.8"/>',
|
|
395
|
+
"color": "#0078D4", "bg": "#E8F4FD", "category": "Management",
|
|
396
|
+
"azure_icon_key": "backup_vault"
|
|
397
|
+
},
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
CONNECTION_STYLES = {
|
|
401
|
+
"api": {"color": "#0078D4", "dash": "0"},
|
|
402
|
+
"data": {"color": "#0F9D58", "dash": "0"},
|
|
403
|
+
"security": {"color": "#E8A000", "dash": "5,5"},
|
|
404
|
+
"private": {"color": "#5C2D91", "dash": "3,3"},
|
|
405
|
+
"network": {"color": "#5C2D91", "dash": "5,5"},
|
|
406
|
+
"default": {"color": "#999999", "dash": "0"},
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
|
|
410
|
+
_TYPE_ALIASES = {
|
|
411
|
+
# Azure ARM resource names → canonical diagram type
|
|
412
|
+
# Network
|
|
413
|
+
"private_endpoints": "pe", "private_endpoint": "pe",
|
|
414
|
+
"virtual_networks": "vnet", "virtual_network": "vnet",
|
|
415
|
+
"network_security_groups": "nsg", "network_security_group": "nsg",
|
|
416
|
+
"bastion_hosts": "bastion", "bastion_host": "bastion",
|
|
417
|
+
"application_gateways": "app_gateway", "application_gateway": "app_gateway",
|
|
418
|
+
"front_doors": "front_door", "front_door_and_cdn_profiles": "front_door",
|
|
419
|
+
"virtual_network_gateways": "vpn", "vpn_gateways": "vpn",
|
|
420
|
+
"load_balancers": "load_balancer",
|
|
421
|
+
"nat_gateways": "nat_gateway",
|
|
422
|
+
"expressroute_circuits": "expressroute",
|
|
423
|
+
"firewalls": "firewall",
|
|
424
|
+
"cdn_profiles": "cdn",
|
|
425
|
+
# Data
|
|
426
|
+
"data_factories": "adf", "data_factory": "adf",
|
|
427
|
+
"storage_accounts": "storage", "storage_account": "storage",
|
|
428
|
+
"data_lake": "adls", "adls_gen2": "adls", "data_lake_storage": "adls",
|
|
429
|
+
"fabric_capacities": "fabric", "fabric_capacity": "fabric", "microsoft_fabric": "fabric",
|
|
430
|
+
"synapse_workspaces": "synapse", "synapse_workspace": "synapse", "synapse_analytics": "synapse",
|
|
431
|
+
"cosmos": "cosmos_db", "cosmosdb": "cosmos_db", "documentdb": "cosmos_db",
|
|
432
|
+
"sql_databases": "sql_database", "sql_db": "sql_database",
|
|
433
|
+
"sql_servers": "sql_server",
|
|
434
|
+
"redis_caches": "redis", "redis_cache": "redis", "cache_redis": "redis",
|
|
435
|
+
"stream_analytics_jobs": "stream_analytics",
|
|
436
|
+
"databricks_workspaces": "databricks",
|
|
437
|
+
"data_explorer_clusters": "data_explorer", "azure_data_explorer": "data_explorer",
|
|
438
|
+
"postgresql_server": "postgresql", "postgresql_servers": "postgresql",
|
|
439
|
+
"mysql_server": "mysql", "mysql_servers": "mysql",
|
|
440
|
+
# AI
|
|
441
|
+
"cognitive_services": "ai_foundry", "ai_services": "ai_foundry", "foundry": "ai_foundry",
|
|
442
|
+
"azure_openai": "openai",
|
|
443
|
+
"cognitive_search": "search", "search_services": "search", "search_service": "search",
|
|
444
|
+
"machine_learning": "aml", "ml": "aml", "machine_learning_workspaces": "aml",
|
|
445
|
+
"form_recognizers": "document_intelligence",
|
|
446
|
+
"ai_studio": "ai_hub", "foundry_project": "ai_hub",
|
|
447
|
+
# Security
|
|
448
|
+
"key_vault": "keyvault", "key_vaults": "keyvault",
|
|
449
|
+
"sentinel": "sentinel", "azure_sentinel": "sentinel",
|
|
450
|
+
# Compute
|
|
451
|
+
"virtual_machines": "vm", "virtual_machine": "vm",
|
|
452
|
+
"app_services": "appservice", "web_apps": "appservice", "web_app": "appservice",
|
|
453
|
+
"function_apps": "function_app", "functions": "function_app",
|
|
454
|
+
"kubernetes_services": "aks", "managed_clusters": "aks", "kubernetes": "aks",
|
|
455
|
+
"container_registries": "acr",
|
|
456
|
+
"container_apps_environments": "container_apps",
|
|
457
|
+
"spring_apps": "spring_apps", "azure_spring_apps": "spring_apps",
|
|
458
|
+
"static_apps": "static_web_app", "static_web_apps": "static_web_app",
|
|
459
|
+
# Integration
|
|
460
|
+
"event_hubs": "event_hub",
|
|
461
|
+
"event_grid_topics": "event_grid", "event_grid_domains": "event_grid",
|
|
462
|
+
"api_management_services": "apim",
|
|
463
|
+
"service_bus_namespaces": "service_bus",
|
|
464
|
+
"logic_app": "logic_apps",
|
|
465
|
+
"notification_hubs": "notification_hub",
|
|
466
|
+
# Monitoring
|
|
467
|
+
"log_analytics_workspaces": "log_analytics",
|
|
468
|
+
"application_insights": "appinsights", "app_insight": "appinsights",
|
|
469
|
+
# IoT
|
|
470
|
+
"iot_hubs": "iot_hub",
|
|
471
|
+
# Management
|
|
472
|
+
"backup_vaults": "backup", "backup_vault": "backup",
|
|
473
|
+
}
|
|
474
|
+
|
|
475
|
+
def get_service_info(svc_type: str) -> dict:
|
|
476
|
+
t = svc_type.lower().replace("-", "_").replace(" ", "_")
|
|
477
|
+
t = _TYPE_ALIASES.get(t, t)
|
|
478
|
+
info = SERVICE_ICONS.get(t, SERVICE_ICONS["default"]).copy()
|
|
479
|
+
# Add official Azure icon data URI if available
|
|
480
|
+
azure_key = info.get("azure_icon_key", t)
|
|
481
|
+
icon_uri = get_icon_data_uri(azure_key)
|
|
482
|
+
info["icon_data_uri"] = icon_uri
|
|
483
|
+
return info
|
|
484
|
+
|
|
485
|
+
|
|
486
|
+
def generate_html(services: list, connections: list, title: str, vnet_info: str = "", hierarchy: list = None) -> str:
|
|
487
|
+
def _norm(t):
|
|
488
|
+
t = t.lower().replace("-", "_").replace(" ", "_")
|
|
489
|
+
return _TYPE_ALIASES.get(t, t)
|
|
490
|
+
|
|
491
|
+
nodes_js = json.dumps([{
|
|
492
|
+
"id": svc["id"],
|
|
493
|
+
"name": svc["name"],
|
|
494
|
+
"type": _norm(svc.get("type", "default")),
|
|
495
|
+
"sku": svc.get("sku", ""),
|
|
496
|
+
"private": svc.get("private", False),
|
|
497
|
+
"details": svc.get("details", []),
|
|
498
|
+
"subscription": svc.get("subscription", ""),
|
|
499
|
+
"resourceGroup": svc.get("resourceGroup", ""),
|
|
500
|
+
"icon_svg": get_service_info(svc.get("type", "default"))["icon_svg"],
|
|
501
|
+
"icon_data_uri": get_service_info(svc.get("type", "default")).get("icon_data_uri", ""),
|
|
502
|
+
"color": get_service_info(svc.get("type", "default"))["color"],
|
|
503
|
+
"bg": get_service_info(svc.get("type", "default"))["bg"],
|
|
504
|
+
"category": get_service_info(svc.get("type", "default"))["category"],
|
|
505
|
+
} for svc in services], ensure_ascii=False)
|
|
506
|
+
|
|
507
|
+
hierarchy_js = json.dumps(hierarchy or [], ensure_ascii=False)
|
|
508
|
+
|
|
509
|
+
edges_js = json.dumps([{
|
|
510
|
+
"from": conn["from"],
|
|
511
|
+
"to": conn["to"],
|
|
512
|
+
"label": conn.get("label", ""),
|
|
513
|
+
"type": conn.get("type", "default"),
|
|
514
|
+
"color": CONNECTION_STYLES.get(conn.get("type", "default"), CONNECTION_STYLES["default"])["color"],
|
|
515
|
+
"dash": CONNECTION_STYLES.get(conn.get("type", "default"), CONNECTION_STYLES["default"])["dash"],
|
|
516
|
+
} for conn in connections], ensure_ascii=False)
|
|
517
|
+
|
|
518
|
+
pe_count = sum(1 for s in services if _norm(s.get("type", "default")) == "pe")
|
|
519
|
+
svc_count = len(services) - pe_count
|
|
520
|
+
generated_at = datetime.now().strftime("%Y-%m-%d %H:%M")
|
|
521
|
+
vnet_info_js = json.dumps(vnet_info, ensure_ascii=False)
|
|
522
|
+
|
|
523
|
+
html = f"""<!DOCTYPE html>
|
|
524
|
+
<html lang="ko">
|
|
525
|
+
<head>
|
|
526
|
+
<meta charset="UTF-8">
|
|
527
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
528
|
+
<title>{title}</title>
|
|
529
|
+
<style>
|
|
530
|
+
@import url('https://fonts.googleapis.com/css2?family=Segoe+UI:wght@400;600;700&family=Inter:wght@400;500;600&display=swap');
|
|
531
|
+
* {{ box-sizing: border-box; margin: 0; padding: 0; }}
|
|
532
|
+
body {{ font-family: 'Segoe UI', 'Inter', -apple-system, sans-serif; background: #f3f2f1; color: #323130; }}
|
|
533
|
+
|
|
534
|
+
.header {{
|
|
535
|
+
background: white; border-bottom: 1px solid #edebe9;
|
|
536
|
+
padding: 12px 24px; display: flex; align-items: center; gap: 14px;
|
|
537
|
+
box-shadow: 0 1px 4px rgba(0,0,0,0.06);
|
|
538
|
+
}}
|
|
539
|
+
.header-icon {{
|
|
540
|
+
width: 32px; height: 32px; border-radius: 4px;
|
|
541
|
+
background: linear-gradient(135deg, #0078D4, #00BCF2);
|
|
542
|
+
display: flex; align-items: center; justify-content: center;
|
|
543
|
+
}}
|
|
544
|
+
.header-icon svg {{ width: 20px; height: 20px; }}
|
|
545
|
+
.header h1 {{ font-size: 15px; font-weight: 600; color: #201f1e; }}
|
|
546
|
+
.header .meta {{ font-size: 11px; color: #a19f9d; }}
|
|
547
|
+
.header-right {{ margin-left: auto; display: flex; gap: 16px; align-items: center; }}
|
|
548
|
+
.stat {{ font-size: 11px; color: #605e5c; }}
|
|
549
|
+
.stat b {{ color: #323130; }}
|
|
550
|
+
|
|
551
|
+
.container {{ display: flex; height: calc(100vh - 56px); }}
|
|
552
|
+
|
|
553
|
+
.canvas-area {{
|
|
554
|
+
flex: 1; position: relative; overflow: hidden;
|
|
555
|
+
background: white;
|
|
556
|
+
background-image:
|
|
557
|
+
linear-gradient(#faf9f8 1px, transparent 1px),
|
|
558
|
+
linear-gradient(90deg, #faf9f8 1px, transparent 1px);
|
|
559
|
+
background-size: 24px 24px;
|
|
560
|
+
}}
|
|
561
|
+
#canvas {{ position: absolute; top: 0; left: 0; width: 100%; height: 100%; }}
|
|
562
|
+
|
|
563
|
+
.toolbar {{
|
|
564
|
+
position: absolute; top: 10px; left: 10px;
|
|
565
|
+
display: flex; gap: 1px; z-index: 10;
|
|
566
|
+
background: white; border: 1px solid #edebe9; border-radius: 6px;
|
|
567
|
+
padding: 2px; box-shadow: 0 2px 8px rgba(0,0,0,0.08);
|
|
568
|
+
}}
|
|
569
|
+
.tool-btn {{
|
|
570
|
+
background: transparent; border: none; border-radius: 4px;
|
|
571
|
+
padding: 5px 10px; font-size: 11px; cursor: pointer; color: #605e5c;
|
|
572
|
+
font-family: inherit; transition: all 0.1s;
|
|
573
|
+
}}
|
|
574
|
+
.tool-btn:hover {{ background: #f3f2f1; color: #323130; }}
|
|
575
|
+
.tool-sep {{ width: 1px; background: #edebe9; margin: 3px 1px; }}
|
|
576
|
+
|
|
577
|
+
.zoom-indicator {{
|
|
578
|
+
position: absolute; top: 10px; right: 286px;
|
|
579
|
+
background: white; border: 1px solid #edebe9; border-radius: 4px;
|
|
580
|
+
padding: 3px 8px; font-size: 10px; color: #a19f9d; z-index: 10;
|
|
581
|
+
}}
|
|
582
|
+
|
|
583
|
+
/* ── Sidebar ── */
|
|
584
|
+
.sidebar {{
|
|
585
|
+
width: 272px; background: #faf9f8; border-left: 1px solid #edebe9;
|
|
586
|
+
overflow-y: auto; display: flex; flex-direction: column;
|
|
587
|
+
}}
|
|
588
|
+
.sidebar::-webkit-scrollbar {{ width: 3px; }}
|
|
589
|
+
.sidebar::-webkit-scrollbar-thumb {{ background: #c8c6c4; border-radius: 3px; }}
|
|
590
|
+
|
|
591
|
+
.sidebar-header {{
|
|
592
|
+
padding: 12px 14px; border-bottom: 1px solid #edebe9;
|
|
593
|
+
font-weight: 600; font-size: 12px; color: #605e5c;
|
|
594
|
+
position: sticky; top: 0; background: #faf9f8; z-index: 1;
|
|
595
|
+
}}
|
|
596
|
+
.cat-label {{
|
|
597
|
+
padding: 10px 14px 4px; font-size: 10px; color: #a19f9d;
|
|
598
|
+
font-weight: 600; text-transform: uppercase; letter-spacing: 0.5px;
|
|
599
|
+
}}
|
|
600
|
+
.service-card {{
|
|
601
|
+
margin: 2px 6px; border: 1px solid #edebe9; border-radius: 6px;
|
|
602
|
+
overflow: hidden; cursor: pointer; transition: all 0.1s;
|
|
603
|
+
background: white;
|
|
604
|
+
}}
|
|
605
|
+
.service-card:hover {{ border-color: #c8c6c4; box-shadow: 0 1px 4px rgba(0,0,0,0.06); }}
|
|
606
|
+
.service-card.selected {{ border-color: #0078D4; box-shadow: 0 0 0 1px #0078D4; }}
|
|
607
|
+
.service-card-header {{
|
|
608
|
+
padding: 7px 10px; display: flex; align-items: center; gap: 8px;
|
|
609
|
+
}}
|
|
610
|
+
.sc-icon {{ width: 28px; height: 28px; flex-shrink: 0; }}
|
|
611
|
+
.sc-icon svg {{ width: 28px; height: 28px; }}
|
|
612
|
+
.service-name {{ font-size: 12px; font-weight: 600; color: #323130; }}
|
|
613
|
+
.service-sku {{ font-size: 10px; color: #a19f9d; }}
|
|
614
|
+
.service-card-body {{ padding: 2px 10px 6px; }}
|
|
615
|
+
.service-detail {{ font-size: 10px; color: #605e5c; padding: 1px 0; }}
|
|
616
|
+
.service-detail::before {{ content: "› "; color: #a19f9d; }}
|
|
617
|
+
.private-badge {{
|
|
618
|
+
font-size: 9px; background: #f3eef9; color: #5C2D91;
|
|
619
|
+
border-radius: 3px; padding: 1px 5px; margin-left: auto;
|
|
620
|
+
border: 1px solid #e0d4f5;
|
|
621
|
+
}}
|
|
622
|
+
|
|
623
|
+
.legend {{
|
|
624
|
+
padding: 10px 14px; border-top: 1px solid #edebe9; margin-top: auto;
|
|
625
|
+
}}
|
|
626
|
+
.legend-title {{ font-size: 10px; font-weight: 600; color: #a19f9d; margin-bottom: 5px; }}
|
|
627
|
+
.legend-item {{ display: flex; align-items: center; gap: 6px; font-size: 10px; color: #605e5c; margin-bottom: 2px; }}
|
|
628
|
+
.legend-line {{ width: 18px; height: 2px; border-radius: 1px; }}
|
|
629
|
+
.legend-line-dash {{ width: 18px; height: 0; border-top: 2px dashed; }}
|
|
630
|
+
|
|
631
|
+
/* ── SVG styles ── */
|
|
632
|
+
.node {{ cursor: grab; pointer-events: all; }}
|
|
633
|
+
.node:active {{ cursor: grabbing; }}
|
|
634
|
+
.node .node-bg {{ pointer-events: all; }}
|
|
635
|
+
.node.selected .node-bg {{ stroke: #0078D4; stroke-width: 2.5; }}
|
|
636
|
+
.node.selected {{ filter: drop-shadow(0 0 6px rgba(0,120,212,0.4)); }}
|
|
637
|
+
|
|
638
|
+
/* ── Edge highlight on node select ── */
|
|
639
|
+
.edge-path {{ transition: opacity 0.2s, stroke-width 0.2s; }}
|
|
640
|
+
.edge-label {{ transition: opacity 0.2s; }}
|
|
641
|
+
.edge-path.highlight {{ opacity: 1 !important; stroke-width: 2.5 !important; filter: drop-shadow(0 0 4px rgba(0,120,212,0.5)); }}
|
|
642
|
+
.edge-path.dimmed {{ opacity: 0.1 !important; }}
|
|
643
|
+
.edge-label.highlight {{ opacity: 1 !important; font-weight: 700; }}
|
|
644
|
+
.edge-label.dimmed {{ opacity: 0.15 !important; }}
|
|
645
|
+
.edge-label-bg.highlight {{ stroke: #0078D4 !important; stroke-width: 1.5 !important; }}
|
|
646
|
+
.edge-label-bg.dimmed {{ opacity: 0.15 !important; }}
|
|
647
|
+
.node.dimmed {{ opacity: 0.25; transition: opacity 0.2s; }}
|
|
648
|
+
|
|
649
|
+
.subnet-rect {{
|
|
650
|
+
rx: 6; ry: 6;
|
|
651
|
+
}}
|
|
652
|
+
.subnet-label {{
|
|
653
|
+
font-size: 11px; font-weight: 600; font-family: 'Segoe UI', sans-serif;
|
|
654
|
+
}}
|
|
655
|
+
|
|
656
|
+
.status-bar {{
|
|
657
|
+
position: absolute; bottom: 10px; left: 10px;
|
|
658
|
+
background: white; border: 1px solid #edebe9; border-radius: 4px;
|
|
659
|
+
padding: 4px 10px; font-size: 10px; color: #a19f9d;
|
|
660
|
+
box-shadow: 0 1px 4px rgba(0,0,0,0.06);
|
|
661
|
+
}}
|
|
662
|
+
|
|
663
|
+
.tooltip {{
|
|
664
|
+
position: absolute; background: white; color: #323130;
|
|
665
|
+
border: 1px solid #edebe9; padding: 8px 12px;
|
|
666
|
+
border-radius: 6px; font-size: 11px; pointer-events: none;
|
|
667
|
+
white-space: nowrap; z-index: 100; display: none;
|
|
668
|
+
box-shadow: 0 4px 16px rgba(0,0,0,0.12);
|
|
669
|
+
}}
|
|
670
|
+
.tooltip strong {{ color: #201f1e; }}
|
|
671
|
+
.tooltip-detail {{ color: #605e5c; margin-top: 1px; font-size: 10px; }}
|
|
672
|
+
</style>
|
|
673
|
+
</head>
|
|
674
|
+
<body>
|
|
675
|
+
|
|
676
|
+
<div class="header">
|
|
677
|
+
<div class="header-icon">
|
|
678
|
+
<svg viewBox="0 0 24 24"><path d="M12 2L2 7v10l10 5 10-5V7L12 2z" fill="white" opacity="0.9"/></svg>
|
|
679
|
+
</div>
|
|
680
|
+
<div>
|
|
681
|
+
<h1>{title}</h1>
|
|
682
|
+
<div class="meta">Azure Architecture · {generated_at}</div>
|
|
683
|
+
</div>
|
|
684
|
+
<div class="header-right">
|
|
685
|
+
<div class="stat"><b>{svc_count}</b> Services</div>
|
|
686
|
+
<div class="stat"><b>{pe_count}</b> Private Endpoints</div>
|
|
687
|
+
<div class="stat"><b>{len(connections)}</b> Connections</div>
|
|
688
|
+
</div>
|
|
689
|
+
</div>
|
|
690
|
+
|
|
691
|
+
<div class="container">
|
|
692
|
+
<div class="canvas-area">
|
|
693
|
+
<div class="toolbar">
|
|
694
|
+
<button class="tool-btn" onclick="fitToScreen()">Fit</button>
|
|
695
|
+
<div class="tool-sep"></div>
|
|
696
|
+
<button class="tool-btn" onclick="zoomIn()">+</button>
|
|
697
|
+
<button class="tool-btn" onclick="zoomOut()">−</button>
|
|
698
|
+
<div class="tool-sep"></div>
|
|
699
|
+
<button class="tool-btn" onclick="resetZoom()">Reset</button>
|
|
700
|
+
<div class="tool-sep"></div>
|
|
701
|
+
<button class="tool-btn" onclick="downloadPNG()" title="Download PNG">📷 PNG</button>
|
|
702
|
+
</div>
|
|
703
|
+
<div class="zoom-indicator" id="zoom-level">100%</div>
|
|
704
|
+
<svg id="canvas">
|
|
705
|
+
<defs>
|
|
706
|
+
<marker id="arr" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="5" markerHeight="5" orient="auto-start-reverse">
|
|
707
|
+
<path d="M 0 0 L 10 5 L 0 10 z" fill="#0078D4" opacity="0.5"/>
|
|
708
|
+
</marker>
|
|
709
|
+
<marker id="arr-data" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="5" markerHeight="5" orient="auto-start-reverse">
|
|
710
|
+
<path d="M 0 0 L 10 5 L 0 10 z" fill="#0F9D58" opacity="0.5"/>
|
|
711
|
+
</marker>
|
|
712
|
+
<marker id="arr-sec" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="5" markerHeight="5" orient="auto-start-reverse">
|
|
713
|
+
<path d="M 0 0 L 10 5 L 0 10 z" fill="#E8A000" opacity="0.5"/>
|
|
714
|
+
</marker>
|
|
715
|
+
<marker id="arr-pe" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="5" markerHeight="5" orient="auto-start-reverse">
|
|
716
|
+
<path d="M 0 0 L 10 5 L 0 10 z" fill="#5C2D91" opacity="0.5"/>
|
|
717
|
+
</marker>
|
|
718
|
+
<filter id="shadow">
|
|
719
|
+
<feDropShadow dx="0" dy="1" stdDeviation="2" flood-opacity="0.08"/>
|
|
720
|
+
</filter>
|
|
721
|
+
</defs>
|
|
722
|
+
<g id="diagram-root"></g>
|
|
723
|
+
</svg>
|
|
724
|
+
<div id="tooltip" class="tooltip"></div>
|
|
725
|
+
<div class="status-bar">Drag nodes · Scroll to zoom · Drag empty space to pan</div>
|
|
726
|
+
</div>
|
|
727
|
+
|
|
728
|
+
<div class="sidebar">
|
|
729
|
+
<div class="sidebar-header">Resources</div>
|
|
730
|
+
<div id="service-list"></div>
|
|
731
|
+
<div class="legend">
|
|
732
|
+
<div class="legend-title">Connection Types</div>
|
|
733
|
+
<div class="legend-item"><div class="legend-line" style="background:#0078D4;"></div> API</div>
|
|
734
|
+
<div class="legend-item"><div class="legend-line" style="background:#0F9D58;"></div> Data</div>
|
|
735
|
+
<div class="legend-item"><div class="legend-line-dash" style="border-color:#E8A000;"></div> Security</div>
|
|
736
|
+
<div class="legend-item"><div class="legend-line-dash" style="border-color:#5C2D91;"></div> Private Endpoint</div>
|
|
737
|
+
</div>
|
|
738
|
+
</div>
|
|
739
|
+
</div>
|
|
740
|
+
|
|
741
|
+
<script>
|
|
742
|
+
const NODES = {nodes_js};
|
|
743
|
+
const EDGES = {edges_js};
|
|
744
|
+
const VNET_INFO = {vnet_info_js};
|
|
745
|
+
const HIERARCHY = {hierarchy_js};
|
|
746
|
+
|
|
747
|
+
// ── Node sizing ──
|
|
748
|
+
const SVC_W = 150, SVC_H = 100; // service node (icon above, name below)
|
|
749
|
+
const PE_W = 100, PE_H = 70; // pe node (smaller)
|
|
750
|
+
const GAP = 40;
|
|
751
|
+
|
|
752
|
+
// ── Layout: Category Group Box style ──
|
|
753
|
+
// Each category gets a labeled box, services arranged in a grid inside.
|
|
754
|
+
// Groups arranged in 2D: main service groups on top, bottom groups below.
|
|
755
|
+
// PE nodes in a separate PE subnet group.
|
|
756
|
+
|
|
757
|
+
const positions = {{}};
|
|
758
|
+
const useRgLayout = HIERARCHY.length > 0 && NODES.some(n => n.resourceGroup);
|
|
759
|
+
const peNodes = useRgLayout ? [] : NODES.filter(n => n.type === 'pe'); // RG mode: PE included in mainNodes
|
|
760
|
+
const mainNodes = useRgLayout ? NODES : NODES.filter(n => n.type !== 'pe');
|
|
761
|
+
|
|
762
|
+
// Group box layout parameters
|
|
763
|
+
const GROUP_PAD = 24;
|
|
764
|
+
const GROUP_TITLE_H = 28;
|
|
765
|
+
const GROUP_GAP = 50;
|
|
766
|
+
const COLS_PER_GROUP = 3;
|
|
767
|
+
const CELL_W = SVC_W + 70;
|
|
768
|
+
const CELL_H = SVC_H + 70;
|
|
769
|
+
|
|
770
|
+
function groupDimensions(nodeCount) {{
|
|
771
|
+
const cols = Math.min(nodeCount, COLS_PER_GROUP);
|
|
772
|
+
const rows = Math.ceil(nodeCount / COLS_PER_GROUP);
|
|
773
|
+
const w = cols * CELL_W + GROUP_PAD * 2;
|
|
774
|
+
const h = rows * CELL_H + GROUP_PAD + GROUP_TITLE_H;
|
|
775
|
+
return {{ w, h, cols, rows }};
|
|
776
|
+
}}
|
|
777
|
+
|
|
778
|
+
const groupBoxes = [];
|
|
779
|
+
|
|
780
|
+
// ── Layout strategy: RG-based (if HIERARCHY) or Category-based (default) ──
|
|
781
|
+
|
|
782
|
+
if (useRgLayout) {{
|
|
783
|
+
// ── RG-based layout: group by Subscription > ResourceGroup ──
|
|
784
|
+
let gx = 60, gy = 140;
|
|
785
|
+
let subStartX = 60;
|
|
786
|
+
const SUB_GAP = 80;
|
|
787
|
+
const RG_GAP = 60;
|
|
788
|
+
|
|
789
|
+
HIERARCHY.forEach((sub, subIdx) => {{
|
|
790
|
+
let rgX = gx;
|
|
791
|
+
let rgMaxH = 0;
|
|
792
|
+
|
|
793
|
+
const subRGs = sub.resourceGroups || [];
|
|
794
|
+
subRGs.forEach((rgName, rgIdx) => {{
|
|
795
|
+
const rgNodes = mainNodes.filter(n => n.subscription === sub.subscription && n.resourceGroup === rgName);
|
|
796
|
+
if (rgNodes.length === 0) return;
|
|
797
|
+
|
|
798
|
+
const dim = groupDimensions(rgNodes.length);
|
|
799
|
+
|
|
800
|
+
rgNodes.forEach((n, i) => {{
|
|
801
|
+
const col = i % dim.cols;
|
|
802
|
+
const row = Math.floor(i / dim.cols);
|
|
803
|
+
positions[n.id] = {{
|
|
804
|
+
x: rgX + GROUP_PAD + col * CELL_W + (CELL_W - SVC_W) / 2,
|
|
805
|
+
y: gy + GROUP_TITLE_H + row * CELL_H + (CELL_H - SVC_H) / 2
|
|
806
|
+
}};
|
|
807
|
+
}});
|
|
808
|
+
|
|
809
|
+
groupBoxes.push({{
|
|
810
|
+
cat: rgName, x: rgX, y: gy, w: dim.w, h: dim.h,
|
|
811
|
+
color: rgNodes[0]?.color || '#0078D4',
|
|
812
|
+
isRG: true, subscription: sub.subscription
|
|
813
|
+
}});
|
|
814
|
+
|
|
815
|
+
rgX += dim.w + RG_GAP;
|
|
816
|
+
rgMaxH = Math.max(rgMaxH, dim.h);
|
|
817
|
+
}});
|
|
818
|
+
|
|
819
|
+
// Next subscription row
|
|
820
|
+
if (subIdx < HIERARCHY.length - 1) {{
|
|
821
|
+
gy += rgMaxH + SUB_GAP;
|
|
822
|
+
gx = subStartX;
|
|
823
|
+
}}
|
|
824
|
+
}});
|
|
825
|
+
|
|
826
|
+
// Place unassigned main nodes (no subscription/RG) in a generic group
|
|
827
|
+
const unassigned = mainNodes.filter(n => !positions[n.id]);
|
|
828
|
+
if (unassigned.length > 0) {{
|
|
829
|
+
const allY = Object.values(positions).map(p => p.y);
|
|
830
|
+
const bottomY = allY.length > 0 ? Math.max(...allY) + SVC_H + GROUP_GAP : 140;
|
|
831
|
+
const dim = groupDimensions(unassigned.length);
|
|
832
|
+
unassigned.forEach((n, i) => {{
|
|
833
|
+
const col = i % dim.cols;
|
|
834
|
+
const row = Math.floor(i / dim.cols);
|
|
835
|
+
positions[n.id] = {{
|
|
836
|
+
x: 60 + GROUP_PAD + col * CELL_W + (CELL_W - SVC_W) / 2,
|
|
837
|
+
y: bottomY + GROUP_TITLE_H + row * CELL_H + (CELL_H - SVC_H) / 2
|
|
838
|
+
}};
|
|
839
|
+
}});
|
|
840
|
+
groupBoxes.push({{
|
|
841
|
+
cat: 'Other', x: 60, y: bottomY, w: dim.w, h: dim.h,
|
|
842
|
+
color: '#666'
|
|
843
|
+
}});
|
|
844
|
+
}}
|
|
845
|
+
|
|
846
|
+
}} else {{
|
|
847
|
+
// ── Category-based layout (original) ──
|
|
848
|
+
const bottomCategories = ['Network', 'External', 'Monitor', 'Monitoring'];
|
|
849
|
+
const catOrder = ['AI', 'Data', 'Security', 'Compute', 'Integration', 'DevOps', 'IoT', 'Azure'];
|
|
850
|
+
|
|
851
|
+
const catGroups = {{}};
|
|
852
|
+
mainNodes.forEach(n => {{
|
|
853
|
+
const cat = n.category || 'Azure';
|
|
854
|
+
if (!catGroups[cat]) catGroups[cat] = [];
|
|
855
|
+
catGroups[cat].push(n);
|
|
856
|
+
}});
|
|
857
|
+
|
|
858
|
+
// Dynamically include any categories not in catOrder or bottomCategories
|
|
859
|
+
const extraCats = Object.keys(catGroups).filter(cat => !catOrder.includes(cat) && !bottomCategories.includes(cat));
|
|
860
|
+
const fullCatOrder = [...catOrder, ...extraCats];
|
|
861
|
+
|
|
862
|
+
// ── Place main service groups in a flowing grid ──
|
|
863
|
+
const serviceGroups = fullCatOrder.filter(cat => catGroups[cat] && catGroups[cat].length > 0
|
|
864
|
+
&& !bottomCategories.includes(cat));
|
|
865
|
+
|
|
866
|
+
let gx = 60, gy = 140; // starting position for service groups
|
|
867
|
+
let rowMaxH = 0;
|
|
868
|
+
let rowStartX = 60;
|
|
869
|
+
const MAX_ROW_W = Math.max(1600, serviceGroups.length * 400); // wider to keep Security alongside AI/Data
|
|
870
|
+
|
|
871
|
+
serviceGroups.forEach(cat => {{
|
|
872
|
+
const nodes = catGroups[cat];
|
|
873
|
+
const dim = groupDimensions(nodes.length);
|
|
874
|
+
|
|
875
|
+
// Wrap to next row if too wide
|
|
876
|
+
if (gx + dim.w > rowStartX + MAX_ROW_W && gx > rowStartX) {{
|
|
877
|
+
gx = rowStartX;
|
|
878
|
+
gy += rowMaxH + GROUP_GAP;
|
|
879
|
+
rowMaxH = 0;
|
|
880
|
+
}}
|
|
881
|
+
|
|
882
|
+
// Place nodes inside group grid
|
|
883
|
+
nodes.forEach((n, i) => {{
|
|
884
|
+
const col = i % dim.cols;
|
|
885
|
+
const row = Math.floor(i / dim.cols);
|
|
886
|
+
positions[n.id] = {{
|
|
887
|
+
x: gx + GROUP_PAD + col * CELL_W + (CELL_W - SVC_W) / 2,
|
|
888
|
+
y: gy + GROUP_TITLE_H + row * CELL_H + (CELL_H - SVC_H) / 2
|
|
889
|
+
}};
|
|
890
|
+
}});
|
|
891
|
+
|
|
892
|
+
groupBoxes.push({{
|
|
893
|
+
cat, x: gx, y: gy, w: dim.w, h: dim.h,
|
|
894
|
+
color: nodes[0]?.color || '#0078D4'
|
|
895
|
+
}});
|
|
896
|
+
|
|
897
|
+
gx += dim.w + GROUP_GAP;
|
|
898
|
+
rowMaxH = Math.max(rowMaxH, dim.h);
|
|
899
|
+
}});
|
|
900
|
+
|
|
901
|
+
// ── Place bottom groups (Network, External, Monitor) ──
|
|
902
|
+
const bottomGroupY = gy + rowMaxH + GROUP_GAP + 20;
|
|
903
|
+
let bgx = 60;
|
|
904
|
+
bottomCategories.forEach(cat => {{
|
|
905
|
+
const nodes = catGroups[cat];
|
|
906
|
+
if (!nodes || nodes.length === 0) return;
|
|
907
|
+
const dim = groupDimensions(nodes.length);
|
|
908
|
+
|
|
909
|
+
nodes.forEach((n, i) => {{
|
|
910
|
+
const col = i % dim.cols;
|
|
911
|
+
const row = Math.floor(i / dim.cols);
|
|
912
|
+
positions[n.id] = {{
|
|
913
|
+
x: bgx + GROUP_PAD + col * CELL_W + (CELL_W - SVC_W) / 2,
|
|
914
|
+
y: bottomGroupY + GROUP_TITLE_H + row * CELL_H + (CELL_H - SVC_H) / 2
|
|
915
|
+
}};
|
|
916
|
+
}});
|
|
917
|
+
|
|
918
|
+
groupBoxes.push({{
|
|
919
|
+
cat, x: bgx, y: bottomGroupY, w: dim.w, h: dim.h,
|
|
920
|
+
color: nodes[0]?.color || '#666',
|
|
921
|
+
isBottom: true
|
|
922
|
+
}});
|
|
923
|
+
|
|
924
|
+
bgx += dim.w + GROUP_GAP;
|
|
925
|
+
}});
|
|
926
|
+
|
|
927
|
+
}} // end of else (category-based layout)
|
|
928
|
+
|
|
929
|
+
// ── PE nodes placement ──
|
|
930
|
+
if (useRgLayout) {{
|
|
931
|
+
// RG mode: PE nodes go inside their respective RG boxes
|
|
932
|
+
// PE positions are already set by the RG layout if they have subscription/resourceGroup
|
|
933
|
+
// For PEs without RG assignment, place them in a separate group
|
|
934
|
+
const unplacedPEs = peNodes.filter(pe => !positions[pe.id]);
|
|
935
|
+
if (unplacedPEs.length > 0) {{
|
|
936
|
+
// Find the rightmost RG box position
|
|
937
|
+
const allGbRight = groupBoxes.length > 0 ? Math.max(...groupBoxes.map(gb => gb.x + gb.w)) : 0;
|
|
938
|
+
const peStartX = allGbRight + GROUP_GAP;
|
|
939
|
+
const peStartY = 140;
|
|
940
|
+
const peCols = Math.min(unplacedPEs.length, 4);
|
|
941
|
+
const peCellW = PE_W + 50;
|
|
942
|
+
const peCellH = PE_H + 30;
|
|
943
|
+
const peBoxW = peCols * peCellW + GROUP_PAD * 2;
|
|
944
|
+
const peRows = Math.ceil(unplacedPEs.length / peCols);
|
|
945
|
+
const peBoxH = peRows * peCellH + GROUP_PAD + GROUP_TITLE_H;
|
|
946
|
+
|
|
947
|
+
unplacedPEs.forEach((pe, i) => {{
|
|
948
|
+
const col = i % peCols;
|
|
949
|
+
const row = Math.floor(i / peCols);
|
|
950
|
+
positions[pe.id] = {{
|
|
951
|
+
x: peStartX + GROUP_PAD + col * peCellW + (peCellW - PE_W) / 2,
|
|
952
|
+
y: peStartY + GROUP_TITLE_H + row * peCellH + (peCellH - PE_H) / 2
|
|
953
|
+
}};
|
|
954
|
+
}});
|
|
955
|
+
groupBoxes.push({{
|
|
956
|
+
cat: 'Private Endpoints', x: peStartX, y: peStartY, w: peBoxW, h: peBoxH,
|
|
957
|
+
color: '#5C2D91', isPE: true
|
|
958
|
+
}});
|
|
959
|
+
}}
|
|
960
|
+
}} else {{
|
|
961
|
+
// Category mode: PE nodes in separate group above service groups
|
|
962
|
+
const PE_Y = 40;
|
|
963
|
+
if (peNodes.length > 0) {{
|
|
964
|
+
const peCols = Math.min(peNodes.length, 6);
|
|
965
|
+
const peRows = Math.ceil(peNodes.length / peCols);
|
|
966
|
+
const peCellW = PE_W + 50;
|
|
967
|
+
const peCellH = PE_H + 30;
|
|
968
|
+
const peBoxW = peCols * peCellW + GROUP_PAD * 2;
|
|
969
|
+
const peBoxH = peRows * peCellH + GROUP_PAD + GROUP_TITLE_H;
|
|
970
|
+
|
|
971
|
+
peNodes.forEach((pe, i) => {{
|
|
972
|
+
const col = i % peCols;
|
|
973
|
+
const row = Math.floor(i / peCols);
|
|
974
|
+
positions[pe.id] = {{
|
|
975
|
+
x: 60 + GROUP_PAD + col * peCellW + (peCellW - PE_W) / 2,
|
|
976
|
+
y: PE_Y + GROUP_TITLE_H + row * peCellH + (peCellH - PE_H) / 2
|
|
977
|
+
}};
|
|
978
|
+
}});
|
|
979
|
+
|
|
980
|
+
groupBoxes.push({{
|
|
981
|
+
cat: 'Private Endpoints', x: 60, y: PE_Y, w: peBoxW, h: peBoxH,
|
|
982
|
+
color: '#5C2D91', isPE: true
|
|
983
|
+
}});
|
|
984
|
+
|
|
985
|
+
const peBottom = PE_Y + peBoxH + GROUP_GAP;
|
|
986
|
+
if (peBottom > 140) {{
|
|
987
|
+
const shift = peBottom - 140;
|
|
988
|
+
NODES.forEach(n => {{
|
|
989
|
+
if (n.type !== 'pe' && positions[n.id]) {{
|
|
990
|
+
positions[n.id].y += shift;
|
|
991
|
+
}}
|
|
992
|
+
}});
|
|
993
|
+
groupBoxes.forEach(gb => {{
|
|
994
|
+
if (!gb.isPE) gb.y += shift;
|
|
995
|
+
}});
|
|
996
|
+
}}
|
|
997
|
+
}}
|
|
998
|
+
}}
|
|
999
|
+
|
|
1000
|
+
// ── Node → Group mapping (for edge routing) ──
|
|
1001
|
+
const nodeGroupMap = {{}};
|
|
1002
|
+
groupBoxes.forEach((gb, idx) => {{
|
|
1003
|
+
NODES.forEach(n => {{
|
|
1004
|
+
const pos = positions[n.id];
|
|
1005
|
+
if (!pos) return;
|
|
1006
|
+
const nw = n.type === 'pe' ? PE_W : SVC_W;
|
|
1007
|
+
const nh = n.type === 'pe' ? PE_H : SVC_H;
|
|
1008
|
+
const ncx = pos.x + nw / 2;
|
|
1009
|
+
const ncy = pos.y + nh / 2;
|
|
1010
|
+
if (ncx >= gb.x && ncx <= gb.x + gb.w && ncy >= gb.y && ncy <= gb.y + gb.h) {{
|
|
1011
|
+
nodeGroupMap[n.id] = idx;
|
|
1012
|
+
}}
|
|
1013
|
+
}});
|
|
1014
|
+
}});
|
|
1015
|
+
// Routing corridor margins (outside all group boxes)
|
|
1016
|
+
const _rightMarginBase = groupBoxes.length > 0 ? Math.max(...groupBoxes.map(g => g.x + g.w)) + 40 : 800;
|
|
1017
|
+
const _leftMarginBase = groupBoxes.length > 0 ? Math.min(...groupBoxes.map(g => g.x)) - 40 : -40;
|
|
1018
|
+
|
|
1019
|
+
// ── State ──
|
|
1020
|
+
let dragging = null, dragOffX = 0, dragOffY = 0;
|
|
1021
|
+
let draggingGroup = null, groupDragNodes = []; // for RG/group box dragging
|
|
1022
|
+
let viewTransform = {{ x: 0, y: 0, scale: 1 }};
|
|
1023
|
+
let isPanning = false, panSX = 0, panSY = 0, panSTx = 0, panSTy = 0;
|
|
1024
|
+
let _routeCounter = 0;
|
|
1025
|
+
|
|
1026
|
+
// ── Bidirectional highlight ──
|
|
1027
|
+
let _selectedNodeId = null;
|
|
1028
|
+
|
|
1029
|
+
function selectNode(nodeId) {{
|
|
1030
|
+
const wasSelected = _selectedNodeId === nodeId;
|
|
1031
|
+
|
|
1032
|
+
// Clear all selections
|
|
1033
|
+
clearSelection();
|
|
1034
|
+
|
|
1035
|
+
// Toggle off if clicking same node
|
|
1036
|
+
if (wasSelected) {{ _selectedNodeId = null; return; }}
|
|
1037
|
+
|
|
1038
|
+
_selectedNodeId = nodeId;
|
|
1039
|
+
|
|
1040
|
+
// Highlight diagram node
|
|
1041
|
+
const svgNode = document.querySelector(`.node[data-id="${{nodeId}}"]`);
|
|
1042
|
+
if (svgNode) svgNode.classList.add('selected');
|
|
1043
|
+
// Highlight sidebar card
|
|
1044
|
+
const card = document.getElementById('card-' + nodeId);
|
|
1045
|
+
if (card) {{ card.classList.add('selected'); card.scrollIntoView({{ behavior: 'smooth', block: 'nearest' }}); }}
|
|
1046
|
+
|
|
1047
|
+
// Find connected edges (where this node is from or to)
|
|
1048
|
+
const connectedNodeIds = new Set([nodeId]);
|
|
1049
|
+
document.querySelectorAll('.edge-path').forEach(p => {{
|
|
1050
|
+
const f = p.getAttribute('data-from'), t = p.getAttribute('data-to');
|
|
1051
|
+
if (f === nodeId || t === nodeId) {{
|
|
1052
|
+
p.classList.add('highlight');
|
|
1053
|
+
connectedNodeIds.add(f);
|
|
1054
|
+
connectedNodeIds.add(t);
|
|
1055
|
+
}} else {{
|
|
1056
|
+
p.classList.add('dimmed');
|
|
1057
|
+
}}
|
|
1058
|
+
}});
|
|
1059
|
+
document.querySelectorAll('.edge-label').forEach(g => {{
|
|
1060
|
+
const f = g.getAttribute('data-from'), t = g.getAttribute('data-to');
|
|
1061
|
+
if (f === nodeId || t === nodeId) {{
|
|
1062
|
+
g.classList.add('highlight');
|
|
1063
|
+
g.querySelector('.edge-label-bg')?.classList.add('highlight');
|
|
1064
|
+
}} else {{
|
|
1065
|
+
g.classList.add('dimmed');
|
|
1066
|
+
g.querySelector('.edge-label-bg')?.classList.add('dimmed');
|
|
1067
|
+
}}
|
|
1068
|
+
}});
|
|
1069
|
+
// Dim unconnected nodes
|
|
1070
|
+
document.querySelectorAll('.node').forEach(n => {{
|
|
1071
|
+
const nid = n.getAttribute('data-id');
|
|
1072
|
+
if (!connectedNodeIds.has(nid)) n.classList.add('dimmed');
|
|
1073
|
+
}});
|
|
1074
|
+
}}
|
|
1075
|
+
|
|
1076
|
+
function clearSelection() {{
|
|
1077
|
+
_selectedNodeId = null;
|
|
1078
|
+
document.querySelectorAll('.node').forEach(n => {{ n.classList.remove('selected', 'dimmed'); }});
|
|
1079
|
+
document.querySelectorAll('.service-card').forEach(c => c.classList.remove('selected'));
|
|
1080
|
+
document.querySelectorAll('.edge-path').forEach(p => {{ p.classList.remove('highlight', 'dimmed'); }});
|
|
1081
|
+
document.querySelectorAll('.edge-label').forEach(g => {{ g.classList.remove('highlight', 'dimmed'); }});
|
|
1082
|
+
document.querySelectorAll('.edge-label-bg').forEach(r => {{ r.classList.remove('highlight', 'dimmed'); }});
|
|
1083
|
+
}}
|
|
1084
|
+
|
|
1085
|
+
function markerFor(type) {{
|
|
1086
|
+
if (type === 'data') return 'arr-data';
|
|
1087
|
+
if (type === 'security') return 'arr-sec';
|
|
1088
|
+
if (type === 'private') return 'arr-pe';
|
|
1089
|
+
return 'arr';
|
|
1090
|
+
}}
|
|
1091
|
+
|
|
1092
|
+
function renderDiagram() {{
|
|
1093
|
+
const root = document.getElementById('diagram-root');
|
|
1094
|
+
root.innerHTML = '';
|
|
1095
|
+
_routeCounter = 0; // reset stagger counter each render
|
|
1096
|
+
|
|
1097
|
+
// ── Draw VNet boundary (only in category-based layout, not RG layout) ──
|
|
1098
|
+
if (!useRgLayout) {{
|
|
1099
|
+
const privateGroups = groupBoxes.filter(gb => !gb.isBottom);
|
|
1100
|
+
const hasPrivateNodes = NODES.some(n => n.private && n.type !== 'pe');
|
|
1101
|
+
const hasVNetInfo = VNET_INFO && VNET_INFO.length > 0;
|
|
1102
|
+
const hasPeNodes = NODES.some(n => n.type === 'pe');
|
|
1103
|
+
const showVNet = hasPrivateNodes || hasVNetInfo || hasPeNodes;
|
|
1104
|
+
|
|
1105
|
+
if (privateGroups.length > 0 && showVNet) {{
|
|
1106
|
+
const vx = Math.min(...privateGroups.map(g => g.x)) - 16;
|
|
1107
|
+
const vy = Math.min(...privateGroups.map(g => g.y)) - 36;
|
|
1108
|
+
const vRight = Math.max(...privateGroups.map(g => g.x + g.w)) + 16;
|
|
1109
|
+
const vBottom = Math.max(...privateGroups.map(g => g.y + g.h)) + 16;
|
|
1110
|
+
|
|
1111
|
+
const vr = document.createElementNS('http://www.w3.org/2000/svg', 'rect');
|
|
1112
|
+
vr.setAttribute('x', vx); vr.setAttribute('y', vy);
|
|
1113
|
+
vr.setAttribute('width', vRight - vx); vr.setAttribute('height', vBottom - vy);
|
|
1114
|
+
vr.setAttribute('fill', '#f8f7ff'); vr.setAttribute('stroke', '#5C2D91');
|
|
1115
|
+
vr.setAttribute('stroke-width', '2'); vr.setAttribute('stroke-dasharray', '8,4');
|
|
1116
|
+
vr.setAttribute('rx', '12');
|
|
1117
|
+
root.appendChild(vr);
|
|
1118
|
+
|
|
1119
|
+
const vnetLabel = VNET_INFO ? `Virtual Network (${{VNET_INFO}})` : 'Virtual Network';
|
|
1120
|
+
const vl = document.createElementNS('http://www.w3.org/2000/svg', 'g');
|
|
1121
|
+
vl.setAttribute('class', 'vnet-boundary-label');
|
|
1122
|
+
vl.setAttribute('style', 'cursor: pointer;');
|
|
1123
|
+
vl.innerHTML = `<svg x="${{vx + 10}}" y="${{vy + 6}}" width="20" height="20" viewBox="0 0 48 48">
|
|
1124
|
+
<rect x="6" y="6" width="36" height="36" rx="4" fill="none" stroke="#5C2D91" stroke-width="3"/>
|
|
1125
|
+
<circle cx="16" cy="18" r="3" fill="#5C2D91"/><circle cx="32" cy="18" r="3" fill="#5C2D91"/><circle cx="24" cy="32" r="3" fill="#5C2D91"/>
|
|
1126
|
+
</svg>
|
|
1127
|
+
<text x="${{vx + 34}}" y="${{vy + 20}}" font-size="12" font-weight="600" fill="#5C2D91" font-family="Segoe UI, sans-serif">${{vnetLabel}}</text>`;
|
|
1128
|
+
root.appendChild(vl);
|
|
1129
|
+
|
|
1130
|
+
// Store VNet rect reference for highlight
|
|
1131
|
+
vr.setAttribute('id', 'vnet-rect');
|
|
1132
|
+
vl.addEventListener('click', () => {{ toggleVNetHighlight(); }});
|
|
1133
|
+
root.appendChild(vl);
|
|
1134
|
+
}}
|
|
1135
|
+
}} // end if(!useRgLayout) for VNet boundary
|
|
1136
|
+
|
|
1137
|
+
// ── Draw group boxes (category or RG — depends on layout mode) ──
|
|
1138
|
+
groupBoxes.forEach(gb => {{
|
|
1139
|
+
if (gb.isPE) {{
|
|
1140
|
+
// PE group — always draw with dashed style
|
|
1141
|
+
const gr = document.createElementNS('http://www.w3.org/2000/svg', 'rect');
|
|
1142
|
+
gr.setAttribute('x', gb.x); gr.setAttribute('y', gb.y);
|
|
1143
|
+
gr.setAttribute('width', gb.w); gr.setAttribute('height', gb.h);
|
|
1144
|
+
gr.setAttribute('rx', '8'); gr.setAttribute('fill', '#f3eef9');
|
|
1145
|
+
gr.setAttribute('stroke', '#d4b8ff'); gr.setAttribute('stroke-width', '1');
|
|
1146
|
+
gr.setAttribute('stroke-dasharray', '4,4');
|
|
1147
|
+
root.appendChild(gr);
|
|
1148
|
+
}} else {{
|
|
1149
|
+
// Service group (category or RG)
|
|
1150
|
+
const gr = document.createElementNS('http://www.w3.org/2000/svg', 'rect');
|
|
1151
|
+
gr.setAttribute('x', gb.x); gr.setAttribute('y', gb.y);
|
|
1152
|
+
gr.setAttribute('width', gb.w); gr.setAttribute('height', gb.h);
|
|
1153
|
+
gr.setAttribute('rx', '8');
|
|
1154
|
+
gr.setAttribute('fill', gb.isRG ? '#fafafa' : 'white');
|
|
1155
|
+
gr.setAttribute('stroke', gb.isRG ? gb.color : '#e1dfdd');
|
|
1156
|
+
gr.setAttribute('stroke-width', gb.isRG ? '1.5' : '1');
|
|
1157
|
+
if (gb.isRG) gr.setAttribute('stroke-dasharray', '6,3');
|
|
1158
|
+
root.appendChild(gr);
|
|
1159
|
+
}}
|
|
1160
|
+
|
|
1161
|
+
// Title bar
|
|
1162
|
+
const titleBar = document.createElementNS('http://www.w3.org/2000/svg', 'rect');
|
|
1163
|
+
titleBar.setAttribute('x', gb.x); titleBar.setAttribute('y', gb.y);
|
|
1164
|
+
titleBar.setAttribute('width', gb.w); titleBar.setAttribute('height', GROUP_TITLE_H);
|
|
1165
|
+
titleBar.setAttribute('rx', '8');
|
|
1166
|
+
titleBar.setAttribute('fill', gb.color);
|
|
1167
|
+
titleBar.setAttribute('opacity', '0.1');
|
|
1168
|
+
root.appendChild(titleBar);
|
|
1169
|
+
const titleFill = document.createElementNS('http://www.w3.org/2000/svg', 'rect');
|
|
1170
|
+
titleFill.setAttribute('x', gb.x); titleFill.setAttribute('y', gb.y + GROUP_TITLE_H - 8);
|
|
1171
|
+
titleFill.setAttribute('width', gb.w); titleFill.setAttribute('height', '8');
|
|
1172
|
+
titleFill.setAttribute('fill', gb.color); titleFill.setAttribute('opacity', '0.1');
|
|
1173
|
+
root.appendChild(titleFill);
|
|
1174
|
+
|
|
1175
|
+
// Color accent line
|
|
1176
|
+
const accent = document.createElementNS('http://www.w3.org/2000/svg', 'rect');
|
|
1177
|
+
accent.setAttribute('x', gb.x); accent.setAttribute('y', gb.y);
|
|
1178
|
+
accent.setAttribute('width', gb.w); accent.setAttribute('height', '3');
|
|
1179
|
+
accent.setAttribute('rx', '8'); accent.setAttribute('fill', gb.color);
|
|
1180
|
+
root.appendChild(accent);
|
|
1181
|
+
|
|
1182
|
+
// Group label — RG uses 📁, PE uses "Private Endpoints", category uses category name
|
|
1183
|
+
const label = document.createElementNS('http://www.w3.org/2000/svg', 'text');
|
|
1184
|
+
label.setAttribute('x', gb.x + 12); label.setAttribute('y', gb.y + 18);
|
|
1185
|
+
label.setAttribute('font-size', '11'); label.setAttribute('font-weight', '600');
|
|
1186
|
+
label.setAttribute('fill', gb.color); label.setAttribute('font-family', 'Segoe UI, sans-serif');
|
|
1187
|
+
label.textContent = gb.isRG ? `📁 ${{gb.cat}}` : gb.cat;
|
|
1188
|
+
root.appendChild(label);
|
|
1189
|
+
|
|
1190
|
+
// Make title bar draggable — drags all nodes inside
|
|
1191
|
+
titleBar.style.cursor = 'grab';
|
|
1192
|
+
const gbIdx = groupBoxes.indexOf(gb);
|
|
1193
|
+
titleBar.addEventListener('mousedown', e => {{
|
|
1194
|
+
if (e.button !== 0) return;
|
|
1195
|
+
e.stopPropagation(); e.preventDefault();
|
|
1196
|
+
draggingGroup = gbIdx;
|
|
1197
|
+
const svgPt = getSVGPoint(e);
|
|
1198
|
+
dragOffX = svgPt.x; dragOffY = svgPt.y;
|
|
1199
|
+
// Find all nodes inside this group box
|
|
1200
|
+
groupDragNodes = NODES.filter(n => {{
|
|
1201
|
+
const pos = positions[n.id];
|
|
1202
|
+
if (!pos) return false;
|
|
1203
|
+
const nw = n.type === 'pe' ? PE_W : SVC_W;
|
|
1204
|
+
const nh = n.type === 'pe' ? PE_H : SVC_H;
|
|
1205
|
+
const cx = pos.x + nw/2, cy = pos.y + nh/2;
|
|
1206
|
+
return cx >= gb.x && cx <= gb.x + gb.w && cy >= gb.y && cy <= gb.y + gb.h;
|
|
1207
|
+
}}).map(n => n.id);
|
|
1208
|
+
}});
|
|
1209
|
+
}});
|
|
1210
|
+
|
|
1211
|
+
// ── Draw Subscription boundaries (only if multiple subscriptions, rendered AFTER group boxes) ──
|
|
1212
|
+
if (HIERARCHY.length > 1 && useRgLayout) {{
|
|
1213
|
+
HIERARCHY.forEach((sub, subIdx) => {{
|
|
1214
|
+
// Find all RG boxes belonging to this subscription
|
|
1215
|
+
const subRgBoxes = groupBoxes.filter(gb => gb.isRG && gb.subscription === sub.subscription);
|
|
1216
|
+
if (subRgBoxes.length === 0) return;
|
|
1217
|
+
|
|
1218
|
+
const sx = Math.min(...subRgBoxes.map(gb => gb.x)) - 20;
|
|
1219
|
+
const sy = Math.min(...subRgBoxes.map(gb => gb.y)) - 40;
|
|
1220
|
+
const sRight = Math.max(...subRgBoxes.map(gb => gb.x + gb.w)) + 20;
|
|
1221
|
+
const sBottom = Math.max(...subRgBoxes.map(gb => gb.y + gb.h)) + 20;
|
|
1222
|
+
|
|
1223
|
+
const sr = document.createElementNS('http://www.w3.org/2000/svg', 'rect');
|
|
1224
|
+
sr.setAttribute('x', sx); sr.setAttribute('y', sy);
|
|
1225
|
+
sr.setAttribute('width', sRight - sx); sr.setAttribute('height', sBottom - sy);
|
|
1226
|
+
sr.setAttribute('fill', 'none'); sr.setAttribute('stroke', '#0078D4');
|
|
1227
|
+
sr.setAttribute('stroke-width', '2.5'); sr.setAttribute('stroke-dasharray', '12,4');
|
|
1228
|
+
sr.setAttribute('rx', '16'); sr.setAttribute('opacity', '0.7');
|
|
1229
|
+
root.appendChild(sr);
|
|
1230
|
+
|
|
1231
|
+
const sl = document.createElementNS('http://www.w3.org/2000/svg', 'text');
|
|
1232
|
+
sl.setAttribute('x', sx + 12); sl.setAttribute('y', sy + 16);
|
|
1233
|
+
sl.setAttribute('font-size', '12'); sl.setAttribute('font-weight', '700');
|
|
1234
|
+
sl.setAttribute('fill', '#0078D4'); sl.setAttribute('font-family', 'Segoe UI, sans-serif');
|
|
1235
|
+
sl.textContent = `📦 ${{sub.subscription}}`;
|
|
1236
|
+
root.appendChild(sl);
|
|
1237
|
+
}});
|
|
1238
|
+
}}
|
|
1239
|
+
|
|
1240
|
+
// ── Edge routing (obstacle-free) ──
|
|
1241
|
+
// Compute global bounds: the absolute bottom of ALL nodes
|
|
1242
|
+
function getGlobalBounds() {{
|
|
1243
|
+
let minY = Infinity, maxY = -Infinity;
|
|
1244
|
+
NODES.forEach(n => {{
|
|
1245
|
+
const pos = positions[n.id];
|
|
1246
|
+
if (!pos) return;
|
|
1247
|
+
const h = n.type === 'pe' ? PE_H : SVC_H;
|
|
1248
|
+
if (pos.y < minY) minY = pos.y;
|
|
1249
|
+
if (pos.y + h > maxY) maxY = pos.y + h;
|
|
1250
|
+
}});
|
|
1251
|
+
return {{ minY, maxY }};
|
|
1252
|
+
}}
|
|
1253
|
+
|
|
1254
|
+
function getNodeBox(node) {{
|
|
1255
|
+
const pos = positions[node.id];
|
|
1256
|
+
if (!pos) return null;
|
|
1257
|
+
const w = node.type === 'pe' ? PE_W : SVC_W;
|
|
1258
|
+
const h = node.type === 'pe' ? PE_H : SVC_H;
|
|
1259
|
+
return {{ x: pos.x, y: pos.y, w, h, cx: pos.x + w/2, cy: pos.y + h/2 }};
|
|
1260
|
+
}}
|
|
1261
|
+
|
|
1262
|
+
// Check if direct line between two nodes crosses ANY other node
|
|
1263
|
+
function hasObstacle(fromId, toId, x1, y1, x2, y2) {{
|
|
1264
|
+
for (const n of NODES) {{
|
|
1265
|
+
if (n.id === fromId || n.id === toId) continue;
|
|
1266
|
+
const pos = positions[n.id];
|
|
1267
|
+
if (!pos) continue;
|
|
1268
|
+
const w = n.type === 'pe' ? PE_W : SVC_W;
|
|
1269
|
+
const h = n.type === 'pe' ? PE_H : SVC_H;
|
|
1270
|
+
const pad = 6;
|
|
1271
|
+
const left = pos.x - pad, right = pos.x + w + pad;
|
|
1272
|
+
const top = pos.y - pad, bottom = pos.y + h + pad;
|
|
1273
|
+
// Liang-Barsky line clipping
|
|
1274
|
+
const dx = x2 - x1, dy = y2 - y1;
|
|
1275
|
+
let tmin = 0, tmax = 1;
|
|
1276
|
+
const edges = [[-dx, x1 - left], [dx, right - x1], [-dy, y1 - top], [dy, bottom - y1]];
|
|
1277
|
+
let hit = true;
|
|
1278
|
+
for (const [p, q] of edges) {{
|
|
1279
|
+
if (Math.abs(p) < 0.001) {{ if (q < 0) {{ hit = false; break; }} }}
|
|
1280
|
+
else {{
|
|
1281
|
+
const t = q / p;
|
|
1282
|
+
if (p < 0) {{ if (t > tmin) tmin = t; }}
|
|
1283
|
+
else {{ if (t < tmax) tmax = t; }}
|
|
1284
|
+
if (tmin > tmax) {{ hit = false; break; }}
|
|
1285
|
+
}}
|
|
1286
|
+
}}
|
|
1287
|
+
if (hit && tmin < tmax) return true;
|
|
1288
|
+
}}
|
|
1289
|
+
return false;
|
|
1290
|
+
}}
|
|
1291
|
+
|
|
1292
|
+
// Border point: exit/enter at edge of rectangle
|
|
1293
|
+
function borderExit(box, side) {{
|
|
1294
|
+
// side: 'top', 'bottom', 'left', 'right'
|
|
1295
|
+
if (side === 'top') return {{ x: box.cx, y: box.y }};
|
|
1296
|
+
if (side === 'bottom') return {{ x: box.cx, y: box.y + box.h }};
|
|
1297
|
+
if (side === 'left') return {{ x: box.x, y: box.cy }};
|
|
1298
|
+
if (side === 'right') return {{ x: box.x + box.w, y: box.cy }};
|
|
1299
|
+
}}
|
|
1300
|
+
|
|
1301
|
+
// Check if a line segment hits any group box (for edge routing)
|
|
1302
|
+
function hitsGroupBox(x1, y1, x2, y2, skipGroupIndices) {{
|
|
1303
|
+
for (let gi = 0; gi < groupBoxes.length; gi++) {{
|
|
1304
|
+
if (skipGroupIndices.includes(gi)) continue;
|
|
1305
|
+
const gb = groupBoxes[gi];
|
|
1306
|
+
const pad = 4;
|
|
1307
|
+
const left = gb.x - pad, right = gb.x + gb.w + pad;
|
|
1308
|
+
const top = gb.y - pad, bottom = gb.y + gb.h + pad;
|
|
1309
|
+
const dx = x2 - x1, dy = y2 - y1;
|
|
1310
|
+
let tmin = 0, tmax = 1;
|
|
1311
|
+
const edges = [[-dx, x1 - left], [dx, right - x1], [-dy, y1 - top], [dy, bottom - y1]];
|
|
1312
|
+
let hit = true;
|
|
1313
|
+
for (const [p, q] of edges) {{
|
|
1314
|
+
if (Math.abs(p) < 0.001) {{ if (q < 0) {{ hit = false; break; }} }}
|
|
1315
|
+
else {{
|
|
1316
|
+
const t = q / p;
|
|
1317
|
+
if (p < 0) {{ if (t > tmin) tmin = t; }}
|
|
1318
|
+
else {{ if (t < tmax) tmax = t; }}
|
|
1319
|
+
if (tmin > tmax) {{ hit = false; break; }}
|
|
1320
|
+
}}
|
|
1321
|
+
}}
|
|
1322
|
+
if (hit && tmin < tmax) return true;
|
|
1323
|
+
}}
|
|
1324
|
+
return false;
|
|
1325
|
+
}}
|
|
1326
|
+
|
|
1327
|
+
// Find gap between adjacent groups (same row)
|
|
1328
|
+
function findGapBetween(gi1, gi2) {{
|
|
1329
|
+
if (gi1 < 0 || gi2 < 0) return null;
|
|
1330
|
+
const g1 = groupBoxes[gi1], g2 = groupBoxes[gi2];
|
|
1331
|
+
// Same row: Y ranges overlap
|
|
1332
|
+
const yOverlap = g1.y < g2.y + g2.h && g2.y < g1.y + g1.h;
|
|
1333
|
+
if (!yOverlap) return null;
|
|
1334
|
+
// Gap between them
|
|
1335
|
+
if (g1.x + g1.w < g2.x) return {{ x: (g1.x + g1.w + g2.x) / 2 }};
|
|
1336
|
+
if (g2.x + g2.w < g1.x) return {{ x: (g2.x + g2.w + g1.x) / 2 }};
|
|
1337
|
+
return null;
|
|
1338
|
+
}}
|
|
1339
|
+
|
|
1340
|
+
// Build orthogonal path with rounded corners
|
|
1341
|
+
function buildOrthoPath(pts) {{
|
|
1342
|
+
let d = `M ${{pts[0].x}} ${{pts[0].y}}`;
|
|
1343
|
+
const radius = 6;
|
|
1344
|
+
for (let i = 1; i < pts.length - 1; i++) {{
|
|
1345
|
+
const prev = pts[i-1], curr = pts[i], next = pts[i+1];
|
|
1346
|
+
const dx1 = curr.x - prev.x, dy1 = curr.y - prev.y;
|
|
1347
|
+
const dx2 = next.x - curr.x, dy2 = next.y - curr.y;
|
|
1348
|
+
const len1 = Math.sqrt(dx1*dx1 + dy1*dy1);
|
|
1349
|
+
const len2 = Math.sqrt(dx2*dx2 + dy2*dy2);
|
|
1350
|
+
if (len1 < 1 || len2 < 1) {{ d += ` L ${{curr.x}} ${{curr.y}}`; continue; }}
|
|
1351
|
+
const r = Math.min(radius, len1/2, len2/2);
|
|
1352
|
+
const bx = curr.x - (dx1/len1)*r, by = curr.y - (dy1/len1)*r;
|
|
1353
|
+
const ax = curr.x + (dx2/len2)*r, ay = curr.y + (dy2/len2)*r;
|
|
1354
|
+
d += ` L ${{bx}} ${{by}} Q ${{curr.x}} ${{curr.y}} ${{ax}} ${{ay}}`;
|
|
1355
|
+
}}
|
|
1356
|
+
d += ` L ${{pts[pts.length-1].x}} ${{pts[pts.length-1].y}}`;
|
|
1357
|
+
return d;
|
|
1358
|
+
}}
|
|
1359
|
+
|
|
1360
|
+
// ── Obstacle avoidance: route edges around nodes ──
|
|
1361
|
+
function segHitsNode(x1, y1, x2, y2, pos, nw, nh, margin) {{
|
|
1362
|
+
const nx1 = pos.x - margin, ny1 = pos.y - margin;
|
|
1363
|
+
const nx2 = pos.x + nw + margin, ny2 = pos.y + nh + margin;
|
|
1364
|
+
if (Math.abs(x1 - x2) < 1) {{
|
|
1365
|
+
// Vertical segment
|
|
1366
|
+
const x = x1;
|
|
1367
|
+
const minY = Math.min(y1, y2), maxY = Math.max(y1, y2);
|
|
1368
|
+
return x > nx1 && x < nx2 && maxY > ny1 && minY < ny2;
|
|
1369
|
+
}} else {{
|
|
1370
|
+
// Horizontal segment
|
|
1371
|
+
const y = y1;
|
|
1372
|
+
const minX = Math.min(x1, x2), maxX = Math.max(x1, x2);
|
|
1373
|
+
return y > ny1 && y < ny2 && maxX > nx1 && minX < nx2;
|
|
1374
|
+
}}
|
|
1375
|
+
}}
|
|
1376
|
+
|
|
1377
|
+
function avoidNodes(pts, fromId, toId) {{
|
|
1378
|
+
const MARGIN = 25;
|
|
1379
|
+
let points = pts.map(p => ({{...p}}));
|
|
1380
|
+
// Save original anchors — these must NEVER move (they attach to nodes)
|
|
1381
|
+
const startAnchor = {{...points[0]}};
|
|
1382
|
+
const endAnchor = {{...points[points.length - 1]}};
|
|
1383
|
+
|
|
1384
|
+
for (let iter = 0; iter < 8; iter++) {{
|
|
1385
|
+
let found = false;
|
|
1386
|
+
|
|
1387
|
+
for (let i = 0; i < points.length - 1 && !found; i++) {{
|
|
1388
|
+
const p1 = points[i], p2 = points[i+1];
|
|
1389
|
+
|
|
1390
|
+
for (const node of NODES) {{
|
|
1391
|
+
if (node.id === fromId || node.id === toId) continue;
|
|
1392
|
+
const pos = positions[node.id];
|
|
1393
|
+
if (!pos) continue;
|
|
1394
|
+
const nw = node.type === 'pe' ? PE_W : SVC_W;
|
|
1395
|
+
const nh = node.type === 'pe' ? PE_H : SVC_H;
|
|
1396
|
+
|
|
1397
|
+
if (!segHitsNode(p1.x, p1.y, p2.x, p2.y, pos, nw, nh, MARGIN)) continue;
|
|
1398
|
+
|
|
1399
|
+
found = true;
|
|
1400
|
+
const isVert = Math.abs(p1.x - p2.x) < 1;
|
|
1401
|
+
const isFirst = (i === 0);
|
|
1402
|
+
const isLast = (i + 1 === points.length - 1);
|
|
1403
|
+
|
|
1404
|
+
if (points.length <= 2) {{
|
|
1405
|
+
// Straight line hitting a node: convert to 4-point detour (anchors preserved)
|
|
1406
|
+
if (isVert) {{
|
|
1407
|
+
const leftX = pos.x - MARGIN;
|
|
1408
|
+
const rightX = pos.x + nw + MARGIN;
|
|
1409
|
+
const detourX = Math.abs(p1.x - leftX) <= Math.abs(p1.x - rightX) ? leftX : rightX;
|
|
1410
|
+
points = [points[0], {{x: detourX, y: p1.y}}, {{x: detourX, y: p2.y}}, points[points.length-1]];
|
|
1411
|
+
}} else {{
|
|
1412
|
+
const topY = pos.y - MARGIN;
|
|
1413
|
+
const bottomY = pos.y + nh + MARGIN;
|
|
1414
|
+
const detourY = Math.abs(p1.y - topY) <= Math.abs(p1.y - bottomY) ? topY : bottomY;
|
|
1415
|
+
points = [points[0], {{x: p1.x, y: detourY}}, {{x: p2.x, y: detourY}}, points[points.length-1]];
|
|
1416
|
+
}}
|
|
1417
|
+
}} else if (isFirst) {{
|
|
1418
|
+
// First segment collides — keep points[0] (anchor), insert detour after it
|
|
1419
|
+
if (isVert) {{
|
|
1420
|
+
const leftX = pos.x - MARGIN;
|
|
1421
|
+
const rightX = pos.x + nw + MARGIN;
|
|
1422
|
+
const detourX = Math.abs(p1.x - leftX) <= Math.abs(p1.x - rightX) ? leftX : rightX;
|
|
1423
|
+
points.splice(1, 0, {{x: p1.x, y: p1.y}}, {{x: detourX, y: p1.y}});
|
|
1424
|
+
points[3] = {{x: detourX, y: p2.y}};
|
|
1425
|
+
}} else {{
|
|
1426
|
+
const topY = pos.y - MARGIN;
|
|
1427
|
+
const bottomY = pos.y + nh + MARGIN;
|
|
1428
|
+
const detourY = Math.abs(p1.y - topY) <= Math.abs(p1.y - bottomY) ? topY : bottomY;
|
|
1429
|
+
points.splice(1, 0, {{x: p1.x, y: detourY}});
|
|
1430
|
+
points[2] = {{x: p2.x, y: detourY}};
|
|
1431
|
+
}}
|
|
1432
|
+
}} else if (isLast) {{
|
|
1433
|
+
// Last segment collides — keep last point (anchor), insert detour before it
|
|
1434
|
+
if (isVert) {{
|
|
1435
|
+
const leftX = pos.x - MARGIN;
|
|
1436
|
+
const rightX = pos.x + nw + MARGIN;
|
|
1437
|
+
const detourX = Math.abs(p1.x - leftX) <= Math.abs(p1.x - rightX) ? leftX : rightX;
|
|
1438
|
+
points[i] = {{x: detourX, y: p1.y}};
|
|
1439
|
+
points.splice(i + 1, 0, {{x: detourX, y: p2.y}}, {{x: p2.x, y: p2.y}});
|
|
1440
|
+
}} else {{
|
|
1441
|
+
const topY = pos.y - MARGIN;
|
|
1442
|
+
const bottomY = pos.y + nh + MARGIN;
|
|
1443
|
+
const detourY = Math.abs(p1.y - topY) <= Math.abs(p1.y - bottomY) ? topY : bottomY;
|
|
1444
|
+
points[i] = {{x: p1.x, y: detourY}};
|
|
1445
|
+
points.splice(i + 1, 0, {{x: p2.x, y: detourY}});
|
|
1446
|
+
}}
|
|
1447
|
+
}} else {{
|
|
1448
|
+
// Middle segment: safe to push both endpoints
|
|
1449
|
+
if (isVert) {{
|
|
1450
|
+
const leftX = pos.x - MARGIN;
|
|
1451
|
+
const rightX = pos.x + nw + MARGIN;
|
|
1452
|
+
const newX = Math.abs(p1.x - leftX) <= Math.abs(p1.x - rightX) ? leftX : rightX;
|
|
1453
|
+
points[i] = {{ x: newX, y: p1.y }};
|
|
1454
|
+
points[i+1] = {{ x: newX, y: p2.y }};
|
|
1455
|
+
}} else {{
|
|
1456
|
+
const topY = pos.y - MARGIN;
|
|
1457
|
+
const bottomY = pos.y + nh + MARGIN;
|
|
1458
|
+
const newY = Math.abs(p1.y - topY) <= Math.abs(p1.y - bottomY) ? topY : bottomY;
|
|
1459
|
+
points[i] = {{ x: p1.x, y: newY }};
|
|
1460
|
+
points[i+1] = {{ x: p2.x, y: newY }};
|
|
1461
|
+
}}
|
|
1462
|
+
}}
|
|
1463
|
+
break;
|
|
1464
|
+
}}
|
|
1465
|
+
}}
|
|
1466
|
+
|
|
1467
|
+
if (!found) break;
|
|
1468
|
+
}}
|
|
1469
|
+
|
|
1470
|
+
// Restore anchors — guarantee lines always touch source/target nodes
|
|
1471
|
+
points[0] = startAnchor;
|
|
1472
|
+
points[points.length - 1] = endAnchor;
|
|
1473
|
+
|
|
1474
|
+
return points;
|
|
1475
|
+
}}
|
|
1476
|
+
|
|
1477
|
+
// ── Edges (rendered FIRST — nodes render on top, covering crossings) ──
|
|
1478
|
+
// Edge labels are collected and rendered AFTER nodes so they stay visible.
|
|
1479
|
+
// Orthogonal routing only: horizontal/vertical segments with right-angle turns.
|
|
1480
|
+
const _edgeLabels = [];
|
|
1481
|
+
EDGES.forEach(edge => {{
|
|
1482
|
+
const fn = NODES.find(n => n.id === edge.from);
|
|
1483
|
+
const tn = NODES.find(n => n.id === edge.to);
|
|
1484
|
+
if (!fn || !tn) return;
|
|
1485
|
+
const fromBox = getNodeBox(fn);
|
|
1486
|
+
const toBox = getNodeBox(tn);
|
|
1487
|
+
if (!fromBox || !toBox) return;
|
|
1488
|
+
|
|
1489
|
+
const isPeEdge = edge.type === 'private';
|
|
1490
|
+
const path = document.createElementNS('http://www.w3.org/2000/svg', 'path');
|
|
1491
|
+
let pts;
|
|
1492
|
+
|
|
1493
|
+
if (isPeEdge) {{
|
|
1494
|
+
// PE → orthogonal routing (also avoids nodes)
|
|
1495
|
+
const sx = fromBox.cx, sy = fromBox.y + fromBox.h;
|
|
1496
|
+
const ex = toBox.cx, ey = toBox.y;
|
|
1497
|
+
if (Math.abs(sx - ex) < 8) {{
|
|
1498
|
+
pts = [{{x: sx, y: sy}}, {{x: ex, y: ey}}];
|
|
1499
|
+
}} else {{
|
|
1500
|
+
const midY = (sy + ey) / 2;
|
|
1501
|
+
pts = [{{x: sx, y: sy}}, {{x: sx, y: midY}}, {{x: ex, y: midY}}, {{x: ex, y: ey}}];
|
|
1502
|
+
}}
|
|
1503
|
+
pts = avoidNodes(pts, edge.from, edge.to);
|
|
1504
|
+
}} else {{
|
|
1505
|
+
// Orthogonal routing: determine exit/entry sides
|
|
1506
|
+
const dx = toBox.cx - fromBox.cx;
|
|
1507
|
+
const dy = toBox.cy - fromBox.cy;
|
|
1508
|
+
let exitSide, entrySide;
|
|
1509
|
+
|
|
1510
|
+
if (Math.abs(dx) >= Math.abs(dy)) {{
|
|
1511
|
+
exitSide = dx >= 0 ? 'right' : 'left';
|
|
1512
|
+
entrySide = dx >= 0 ? 'left' : 'right';
|
|
1513
|
+
}} else {{
|
|
1514
|
+
exitSide = dy >= 0 ? 'bottom' : 'top';
|
|
1515
|
+
entrySide = dy >= 0 ? 'top' : 'bottom';
|
|
1516
|
+
}}
|
|
1517
|
+
|
|
1518
|
+
const sp = borderExit(fromBox, exitSide);
|
|
1519
|
+
const ep = borderExit(toBox, entrySide);
|
|
1520
|
+
const stagger = (_routeCounter % 5 - 2) * 6;
|
|
1521
|
+
_routeCounter++;
|
|
1522
|
+
|
|
1523
|
+
if (exitSide === 'right' || exitSide === 'left') {{
|
|
1524
|
+
if (Math.abs(sp.y - ep.y) < 8) {{
|
|
1525
|
+
pts = [sp, ep]; // straight horizontal
|
|
1526
|
+
}} else {{
|
|
1527
|
+
const midX = (sp.x + ep.x) / 2 + stagger;
|
|
1528
|
+
pts = [sp, {{x: midX, y: sp.y}}, {{x: midX, y: ep.y}}, ep];
|
|
1529
|
+
}}
|
|
1530
|
+
}} else {{
|
|
1531
|
+
if (Math.abs(sp.x - ep.x) < 8) {{
|
|
1532
|
+
pts = [sp, ep]; // straight vertical
|
|
1533
|
+
}} else {{
|
|
1534
|
+
const midY = (sp.y + ep.y) / 2 + stagger;
|
|
1535
|
+
pts = [sp, {{x: sp.x, y: midY}}, {{x: ep.x, y: midY}}, ep];
|
|
1536
|
+
}}
|
|
1537
|
+
}}
|
|
1538
|
+
|
|
1539
|
+
// Avoid intermediate nodes
|
|
1540
|
+
pts = avoidNodes(pts, edge.from, edge.to);
|
|
1541
|
+
}}
|
|
1542
|
+
|
|
1543
|
+
// Render path
|
|
1544
|
+
path.setAttribute('d', pts.length <= 2
|
|
1545
|
+
? `M ${{pts[0].x}} ${{pts[0].y}} L ${{pts[pts.length-1].x}} ${{pts[pts.length-1].y}}`
|
|
1546
|
+
: buildOrthoPath(pts));
|
|
1547
|
+
path.setAttribute('fill', 'none');
|
|
1548
|
+
path.setAttribute('stroke', isPeEdge ? '#5C2D91' : '#8a8886');
|
|
1549
|
+
path.setAttribute('stroke-width', isPeEdge ? '1' : '1.2');
|
|
1550
|
+
path.setAttribute('stroke-dasharray', edge.dash || '0');
|
|
1551
|
+
path.setAttribute('marker-end', `url(#${{markerFor(edge.type)}})`);
|
|
1552
|
+
path.setAttribute('opacity', isPeEdge ? '0.5' : '0.65');
|
|
1553
|
+
path.classList.add('edge-path');
|
|
1554
|
+
path.setAttribute('data-from', edge.from);
|
|
1555
|
+
path.setAttribute('data-to', edge.to);
|
|
1556
|
+
root.appendChild(path);
|
|
1557
|
+
|
|
1558
|
+
// Store label position for deferred rendering (after nodes)
|
|
1559
|
+
// Collision-aware: try each segment's midpoint, pick the first that doesn't overlap a node.
|
|
1560
|
+
if (edge.label) {{
|
|
1561
|
+
const bw = edge.label.length * 5.5 + 10;
|
|
1562
|
+
const bh = 14;
|
|
1563
|
+
|
|
1564
|
+
function labelHitsNode(lx, ly) {{
|
|
1565
|
+
return NODES.some(n => {{
|
|
1566
|
+
const p = positions[n.id];
|
|
1567
|
+
if (!p) return false;
|
|
1568
|
+
const nw = n.type === 'pe' ? PE_W : SVC_W;
|
|
1569
|
+
const nh = n.type === 'pe' ? PE_H : SVC_H;
|
|
1570
|
+
return lx + bw/2 > p.x && lx - bw/2 < p.x + nw
|
|
1571
|
+
&& ly + bh/2 > p.y && ly - bh/2 < p.y + nh;
|
|
1572
|
+
}});
|
|
1573
|
+
}}
|
|
1574
|
+
|
|
1575
|
+
// Collect candidate positions: midpoint of each segment
|
|
1576
|
+
const candidates = [];
|
|
1577
|
+
for (let s = 0; s < pts.length - 1; s++) {{
|
|
1578
|
+
const cx = (pts[s].x + pts[s+1].x) / 2;
|
|
1579
|
+
const cy = (pts[s].y + pts[s+1].y) / 2;
|
|
1580
|
+
// Prefer middle segments first, then outer ones
|
|
1581
|
+
const priority = Math.abs(s - (pts.length-2)/2);
|
|
1582
|
+
candidates.push({{ x: cx, y: cy, priority }});
|
|
1583
|
+
}}
|
|
1584
|
+
candidates.sort((a, b) => a.priority - b.priority);
|
|
1585
|
+
|
|
1586
|
+
// Pick first candidate that doesn't hit a node
|
|
1587
|
+
let chosen = candidates[0];
|
|
1588
|
+
for (const c of candidates) {{
|
|
1589
|
+
if (!labelHitsNode(c.x, c.y)) {{ chosen = c; break; }}
|
|
1590
|
+
}}
|
|
1591
|
+
|
|
1592
|
+
// If all candidates hit, offset the best one perpendicular to segment
|
|
1593
|
+
if (labelHitsNode(chosen.x, chosen.y)) {{
|
|
1594
|
+
// Try shifting up/down/left/right by 20px
|
|
1595
|
+
const offsets = [{{x:0,y:-20}},{{x:0,y:20}},{{x:-20,y:0}},{{x:20,y:0}}];
|
|
1596
|
+
for (const off of offsets) {{
|
|
1597
|
+
if (!labelHitsNode(chosen.x+off.x, chosen.y+off.y)) {{
|
|
1598
|
+
chosen = {{ x: chosen.x+off.x, y: chosen.y+off.y }};
|
|
1599
|
+
break;
|
|
1600
|
+
}}
|
|
1601
|
+
}}
|
|
1602
|
+
}}
|
|
1603
|
+
|
|
1604
|
+
_edgeLabels.push({{ label: edge.label, x: chosen.x, y: chosen.y, from: edge.from, to: edge.to }});
|
|
1605
|
+
}}
|
|
1606
|
+
}});
|
|
1607
|
+
|
|
1608
|
+
// ── Nodes (rendered LAST — on top of edges, covering crossing points) ──
|
|
1609
|
+
NODES.forEach(node => {{
|
|
1610
|
+
const pos = positions[node.id];
|
|
1611
|
+
if (!pos) return;
|
|
1612
|
+
const isPe = node.type === 'pe';
|
|
1613
|
+
const nw = isPe ? PE_W : SVC_W;
|
|
1614
|
+
const nh = isPe ? PE_H : SVC_H;
|
|
1615
|
+
const g = document.createElementNS('http://www.w3.org/2000/svg', 'g');
|
|
1616
|
+
g.setAttribute('class', 'node');
|
|
1617
|
+
g.setAttribute('data-id', node.id);
|
|
1618
|
+
g.setAttribute('transform', `translate(${{pos.x}},${{pos.y}})`);
|
|
1619
|
+
|
|
1620
|
+
// Card background — full clickable area
|
|
1621
|
+
const rect = document.createElementNS('http://www.w3.org/2000/svg', 'rect');
|
|
1622
|
+
rect.setAttribute('class', 'node-bg');
|
|
1623
|
+
rect.setAttribute('width', nw); rect.setAttribute('height', nh);
|
|
1624
|
+
rect.setAttribute('rx', '8'); rect.setAttribute('fill', 'white');
|
|
1625
|
+
rect.setAttribute('stroke', '#edebe9'); rect.setAttribute('stroke-width', '1');
|
|
1626
|
+
rect.setAttribute('filter', 'url(#shadow)');
|
|
1627
|
+
g.appendChild(rect);
|
|
1628
|
+
|
|
1629
|
+
// Color accent bar at top
|
|
1630
|
+
const accent = document.createElementNS('http://www.w3.org/2000/svg', 'rect');
|
|
1631
|
+
accent.setAttribute('width', nw); accent.setAttribute('height', '3');
|
|
1632
|
+
accent.setAttribute('rx', '8'); accent.setAttribute('fill', node.color);
|
|
1633
|
+
accent.setAttribute('opacity', '0.7');
|
|
1634
|
+
g.appendChild(accent);
|
|
1635
|
+
|
|
1636
|
+
// Icon — official Azure icon (data URI) preferred, fallback to SVG
|
|
1637
|
+
const iconSize = isPe ? 28 : 36;
|
|
1638
|
+
const iconX = (nw - iconSize) / 2;
|
|
1639
|
+
const iconY = isPe ? 10 : 12;
|
|
1640
|
+
if (node.icon_data_uri) {{
|
|
1641
|
+
// Official Azure icon (Base64 image)
|
|
1642
|
+
const iconImg = document.createElementNS('http://www.w3.org/2000/svg', 'image');
|
|
1643
|
+
iconImg.setAttribute('x', iconX); iconImg.setAttribute('y', iconY);
|
|
1644
|
+
iconImg.setAttribute('width', iconSize); iconImg.setAttribute('height', iconSize);
|
|
1645
|
+
iconImg.setAttributeNS('http://www.w3.org/1999/xlink', 'href', node.icon_data_uri);
|
|
1646
|
+
g.appendChild(iconImg);
|
|
1647
|
+
}} else {{
|
|
1648
|
+
// Fallback: built-in SVG text icon
|
|
1649
|
+
const iconG = document.createElementNS('http://www.w3.org/2000/svg', 'svg');
|
|
1650
|
+
iconG.setAttribute('x', iconX); iconG.setAttribute('y', iconY);
|
|
1651
|
+
iconG.setAttribute('width', iconSize); iconG.setAttribute('height', iconSize);
|
|
1652
|
+
iconG.setAttribute('viewBox', '0 0 48 48');
|
|
1653
|
+
iconG.innerHTML = node.icon_svg;
|
|
1654
|
+
g.appendChild(iconG);
|
|
1655
|
+
}}
|
|
1656
|
+
|
|
1657
|
+
// Name
|
|
1658
|
+
const name = document.createElementNS('http://www.w3.org/2000/svg', 'text');
|
|
1659
|
+
name.setAttribute('x', nw/2); name.setAttribute('y', isPe ? 52 : 60);
|
|
1660
|
+
name.setAttribute('text-anchor', 'middle');
|
|
1661
|
+
name.setAttribute('font-size', isPe ? '9' : '10');
|
|
1662
|
+
name.setAttribute('font-weight', '600'); name.setAttribute('fill', '#323130');
|
|
1663
|
+
name.setAttribute('font-family', 'Segoe UI, sans-serif');
|
|
1664
|
+
const maxC = isPe ? 14 : 20;
|
|
1665
|
+
name.textContent = node.name.length > maxC ? node.name.substring(0, maxC-1) + '..' : node.name;
|
|
1666
|
+
g.appendChild(name);
|
|
1667
|
+
|
|
1668
|
+
// SKU label
|
|
1669
|
+
if (!isPe && node.sku) {{
|
|
1670
|
+
const sku = document.createElementNS('http://www.w3.org/2000/svg', 'text');
|
|
1671
|
+
sku.setAttribute('x', nw/2); sku.setAttribute('y', 72);
|
|
1672
|
+
sku.setAttribute('text-anchor', 'middle');
|
|
1673
|
+
sku.setAttribute('font-size', '9'); sku.setAttribute('fill', '#a19f9d');
|
|
1674
|
+
sku.setAttribute('font-family', 'Segoe UI, sans-serif');
|
|
1675
|
+
sku.textContent = node.sku;
|
|
1676
|
+
g.appendChild(sku);
|
|
1677
|
+
}}
|
|
1678
|
+
|
|
1679
|
+
if (isPe && node.details.length > 0) {{
|
|
1680
|
+
const det = document.createElementNS('http://www.w3.org/2000/svg', 'text');
|
|
1681
|
+
det.setAttribute('x', nw/2); det.setAttribute('y', 63);
|
|
1682
|
+
det.setAttribute('text-anchor', 'middle');
|
|
1683
|
+
det.setAttribute('font-size', '8'); det.setAttribute('fill', '#a19f9d');
|
|
1684
|
+
det.setAttribute('font-family', 'Segoe UI, sans-serif');
|
|
1685
|
+
det.textContent = node.details[0];
|
|
1686
|
+
g.appendChild(det);
|
|
1687
|
+
}}
|
|
1688
|
+
|
|
1689
|
+
// Service type label below (not category — show actual service type name)
|
|
1690
|
+
if (!isPe) {{
|
|
1691
|
+
const TYPE_LABELS = {{
|
|
1692
|
+
'ai_foundry': 'AI Foundry', 'openai': 'Azure OpenAI', 'search': 'AI Search', 'ai_search': 'AI Search',
|
|
1693
|
+
'storage': 'Storage', 'adls': 'ADLS Gen2', 'keyvault': 'Key Vault', 'kv': 'Key Vault',
|
|
1694
|
+
'fabric': 'Fabric', 'databricks': 'Databricks', 'adf': 'Data Factory', 'data_factory': 'Data Factory',
|
|
1695
|
+
'sql_server': 'SQL Server', 'sql_database': 'SQL Database', 'cosmos_db': 'Cosmos DB',
|
|
1696
|
+
'vm': 'Virtual Machine', 'aks': 'AKS', 'app_service': 'App Service',
|
|
1697
|
+
'function_app': 'Function App', 'synapse': 'Synapse', 'vnet': 'VNet',
|
|
1698
|
+
'nsg': 'NSG', 'bastion': 'Bastion', 'pe': 'Private Endpoint',
|
|
1699
|
+
'log_analytics': 'Log Analytics', 'app_insights': 'App Insights',
|
|
1700
|
+
'monitor': 'Monitor', 'acr': 'Container Registry', 'container_registry': 'Container Registry',
|
|
1701
|
+
'document_intelligence': 'Doc Intelligence', 'form_recognizer': 'Doc Intelligence',
|
|
1702
|
+
'cdn': 'CDN', 'event_hub': 'Event Hub', 'redis': 'Redis Cache',
|
|
1703
|
+
'devops': 'Azure DevOps', 'app_gateway': 'App Gateway',
|
|
1704
|
+
'iot_hub': 'IoT Hub', 'stream_analytics': 'Stream Analytics',
|
|
1705
|
+
'vpn_gateway': 'VPN Gateway', 'front_door': 'Front Door',
|
|
1706
|
+
'ai_hub': 'AI Hub', 'firewall': 'Firewall',
|
|
1707
|
+
}};
|
|
1708
|
+
const typeLabel = TYPE_LABELS[node.type] || node.type;
|
|
1709
|
+
const cat = document.createElementNS('http://www.w3.org/2000/svg', 'text');
|
|
1710
|
+
cat.setAttribute('x', nw/2); cat.setAttribute('y', nh + 14);
|
|
1711
|
+
cat.setAttribute('text-anchor', 'middle');
|
|
1712
|
+
cat.setAttribute('font-size', '9'); cat.setAttribute('fill', node.color);
|
|
1713
|
+
cat.setAttribute('font-weight', '600');
|
|
1714
|
+
cat.setAttribute('font-family', 'Segoe UI, sans-serif');
|
|
1715
|
+
cat.textContent = typeLabel;
|
|
1716
|
+
g.appendChild(cat);
|
|
1717
|
+
}}
|
|
1718
|
+
|
|
1719
|
+
// Private badge on card
|
|
1720
|
+
if (node.private && !isPe) {{
|
|
1721
|
+
const badge = document.createElementNS('http://www.w3.org/2000/svg', 'g');
|
|
1722
|
+
const br = document.createElementNS('http://www.w3.org/2000/svg', 'rect');
|
|
1723
|
+
br.setAttribute('x', nw - 8); br.setAttribute('y', '4');
|
|
1724
|
+
br.setAttribute('width', '6'); br.setAttribute('height', '6');
|
|
1725
|
+
br.setAttribute('rx', '3'); br.setAttribute('fill', '#5C2D91');
|
|
1726
|
+
br.setAttribute('opacity', '0.6');
|
|
1727
|
+
badge.appendChild(br);
|
|
1728
|
+
g.appendChild(badge);
|
|
1729
|
+
}}
|
|
1730
|
+
|
|
1731
|
+
// ── Events: drag vs click separation ──
|
|
1732
|
+
let _dragStartX = 0, _dragStartY = 0, _didDrag = false;
|
|
1733
|
+
g.addEventListener('mousedown', e => {{
|
|
1734
|
+
if (e.button !== 0) return;
|
|
1735
|
+
dragging = node.id;
|
|
1736
|
+
_didDrag = false;
|
|
1737
|
+
_dragStartX = e.clientX; _dragStartY = e.clientY;
|
|
1738
|
+
const svgPt = getSVGPoint(e);
|
|
1739
|
+
dragOffX = svgPt.x - pos.x; dragOffY = svgPt.y - pos.y;
|
|
1740
|
+
e.stopPropagation(); e.preventDefault();
|
|
1741
|
+
}});
|
|
1742
|
+
g.addEventListener('mousemove', e => {{
|
|
1743
|
+
if (dragging === node.id) {{
|
|
1744
|
+
const dx = Math.abs(e.clientX - _dragStartX);
|
|
1745
|
+
const dy = Math.abs(e.clientY - _dragStartY);
|
|
1746
|
+
if (dx > 3 || dy > 3) _didDrag = true;
|
|
1747
|
+
}}
|
|
1748
|
+
}});
|
|
1749
|
+
g.addEventListener('mouseup', e => {{
|
|
1750
|
+
if (!_didDrag && dragging === node.id) {{
|
|
1751
|
+
selectNode(node.id);
|
|
1752
|
+
}}
|
|
1753
|
+
}});
|
|
1754
|
+
g.addEventListener('mouseenter', e => {{
|
|
1755
|
+
const tt = document.getElementById('tooltip');
|
|
1756
|
+
const dets = node.details.map(d => `<div class="tooltip-detail">› ${{d}}</div>`).join('');
|
|
1757
|
+
tt.style.display = 'block';
|
|
1758
|
+
tt.innerHTML = `<strong>${{node.name}}</strong>${{node.sku ? `<div class="tooltip-detail">SKU: ${{node.sku}}</div>` : ''}}${{dets}}`;
|
|
1759
|
+
}});
|
|
1760
|
+
g.addEventListener('mousemove', e => {{
|
|
1761
|
+
const tt = document.getElementById('tooltip');
|
|
1762
|
+
tt.style.left = (e.clientX+12)+'px'; tt.style.top = (e.clientY-8)+'px';
|
|
1763
|
+
}});
|
|
1764
|
+
g.addEventListener('mouseleave', () => {{ document.getElementById('tooltip').style.display = 'none'; }});
|
|
1765
|
+
|
|
1766
|
+
root.appendChild(g);
|
|
1767
|
+
}});
|
|
1768
|
+
|
|
1769
|
+
// ── Edge labels (rendered AFTER nodes — always visible on top) ──
|
|
1770
|
+
_edgeLabels.forEach(el => {{
|
|
1771
|
+
const g = document.createElementNS('http://www.w3.org/2000/svg', 'g');
|
|
1772
|
+
g.classList.add('edge-label');
|
|
1773
|
+
g.setAttribute('data-from', el.from);
|
|
1774
|
+
g.setAttribute('data-to', el.to);
|
|
1775
|
+
const r = document.createElementNS('http://www.w3.org/2000/svg', 'rect');
|
|
1776
|
+
r.classList.add('edge-label-bg');
|
|
1777
|
+
const t = document.createElementNS('http://www.w3.org/2000/svg', 'text');
|
|
1778
|
+
const bw = el.label.length * 5.5 + 10;
|
|
1779
|
+
r.setAttribute('x', el.x-bw/2); r.setAttribute('y', el.y-7);
|
|
1780
|
+
r.setAttribute('width', bw); r.setAttribute('height', 14);
|
|
1781
|
+
r.setAttribute('rx', '3'); r.setAttribute('fill', 'white');
|
|
1782
|
+
r.setAttribute('stroke', '#d2d0ce'); r.setAttribute('stroke-width', '0.5');
|
|
1783
|
+
r.setAttribute('opacity', '0.95');
|
|
1784
|
+
t.setAttribute('x', el.x); t.setAttribute('y', el.y+3);
|
|
1785
|
+
t.setAttribute('text-anchor', 'middle'); t.setAttribute('font-size', '8');
|
|
1786
|
+
t.setAttribute('fill', '#605e5c'); t.setAttribute('font-family', 'Segoe UI, sans-serif');
|
|
1787
|
+
t.textContent = el.label;
|
|
1788
|
+
g.appendChild(r); g.appendChild(t);
|
|
1789
|
+
root.appendChild(g);
|
|
1790
|
+
}});
|
|
1791
|
+
|
|
1792
|
+
}}
|
|
1793
|
+
|
|
1794
|
+
function getSVGPoint(e) {{
|
|
1795
|
+
const svg = document.getElementById('canvas');
|
|
1796
|
+
const pt = svg.createSVGPoint();
|
|
1797
|
+
pt.x = e.clientX; pt.y = e.clientY;
|
|
1798
|
+
return pt.matrixTransform(document.getElementById('diagram-root').getScreenCTM().inverse());
|
|
1799
|
+
}}
|
|
1800
|
+
|
|
1801
|
+
document.getElementById('canvas').addEventListener('mousemove', e => {{
|
|
1802
|
+
if (dragging) {{
|
|
1803
|
+
const p = getSVGPoint(e);
|
|
1804
|
+
positions[dragging].x = p.x - dragOffX;
|
|
1805
|
+
positions[dragging].y = p.y - dragOffY;
|
|
1806
|
+
renderDiagram();
|
|
1807
|
+
}} else if (draggingGroup !== null) {{
|
|
1808
|
+
const p = getSVGPoint(e);
|
|
1809
|
+
const dx = p.x - dragOffX;
|
|
1810
|
+
const dy = p.y - dragOffY;
|
|
1811
|
+
dragOffX = p.x; dragOffY = p.y;
|
|
1812
|
+
// Move all nodes in the group
|
|
1813
|
+
groupDragNodes.forEach(nid => {{
|
|
1814
|
+
if (positions[nid]) {{
|
|
1815
|
+
positions[nid].x += dx;
|
|
1816
|
+
positions[nid].y += dy;
|
|
1817
|
+
}}
|
|
1818
|
+
}});
|
|
1819
|
+
// Also move the group box itself
|
|
1820
|
+
const gb = groupBoxes[draggingGroup];
|
|
1821
|
+
if (gb) {{ gb.x += dx; gb.y += dy; }}
|
|
1822
|
+
renderDiagram();
|
|
1823
|
+
}}
|
|
1824
|
+
}});
|
|
1825
|
+
document.addEventListener('mouseup', () => {{ dragging = null; draggingGroup = null; groupDragNodes = []; }});
|
|
1826
|
+
|
|
1827
|
+
// ── Pan & Zoom ──
|
|
1828
|
+
function applyTransform() {{
|
|
1829
|
+
document.getElementById('diagram-root').setAttribute('transform',
|
|
1830
|
+
`translate(${{viewTransform.x}},${{viewTransform.y}}) scale(${{viewTransform.scale}})`);
|
|
1831
|
+
document.getElementById('zoom-level').textContent = Math.round(viewTransform.scale * 100) + '%';
|
|
1832
|
+
}}
|
|
1833
|
+
function fitToScreen() {{
|
|
1834
|
+
const svg = document.getElementById('canvas');
|
|
1835
|
+
const root = document.getElementById('diagram-root');
|
|
1836
|
+
root.setAttribute('transform', '');
|
|
1837
|
+
const bbox = root.getBBox();
|
|
1838
|
+
if (!bbox.width || !bbox.height) return;
|
|
1839
|
+
const w = svg.clientWidth, h = svg.clientHeight;
|
|
1840
|
+
const s = Math.min((w-60)/bbox.width, (h-60)/bbox.height, 1.5);
|
|
1841
|
+
if (s <= 0) return;
|
|
1842
|
+
viewTransform.scale = s;
|
|
1843
|
+
viewTransform.x = (w - bbox.width*s)/2 - bbox.x*s;
|
|
1844
|
+
viewTransform.y = (h - bbox.height*s)/2 - bbox.y*s;
|
|
1845
|
+
applyTransform();
|
|
1846
|
+
}}
|
|
1847
|
+
function zoomIn() {{ viewTransform.scale *= 1.25; applyTransform(); }}
|
|
1848
|
+
function zoomOut() {{ viewTransform.scale *= 0.8; applyTransform(); }}
|
|
1849
|
+
function resetZoom() {{ viewTransform = {{x:0,y:0,scale:1}}; applyTransform(); }}
|
|
1850
|
+
|
|
1851
|
+
function downloadPNG() {{
|
|
1852
|
+
const svg = document.getElementById('canvas');
|
|
1853
|
+
const bbox = svg.getBBox();
|
|
1854
|
+
const pad = 40;
|
|
1855
|
+
const w = Math.ceil(bbox.width + bbox.x + pad * 2);
|
|
1856
|
+
const h = Math.ceil(bbox.height + bbox.y + pad * 2);
|
|
1857
|
+
|
|
1858
|
+
const clone = svg.cloneNode(true);
|
|
1859
|
+
clone.setAttribute('width', w);
|
|
1860
|
+
clone.setAttribute('height', h);
|
|
1861
|
+
clone.setAttribute('viewBox', `${{-pad}} ${{-pad}} ${{w}} ${{h}}`);
|
|
1862
|
+
clone.querySelector('#viewport')?.removeAttribute('transform');
|
|
1863
|
+
|
|
1864
|
+
// Inline all computed styles
|
|
1865
|
+
const allEls = clone.querySelectorAll('*');
|
|
1866
|
+
const origEls = svg.querySelectorAll('*');
|
|
1867
|
+
allEls.forEach((el, i) => {{
|
|
1868
|
+
if (origEls[i]) {{
|
|
1869
|
+
const cs = window.getComputedStyle(origEls[i]);
|
|
1870
|
+
['fill','stroke','stroke-width','font-size','font-family','font-weight',
|
|
1871
|
+
'text-anchor','opacity','fill-opacity','stroke-opacity','stroke-dasharray'].forEach(p => {{
|
|
1872
|
+
const v = cs.getPropertyValue(p);
|
|
1873
|
+
if (v) el.style.setProperty(p, v);
|
|
1874
|
+
}});
|
|
1875
|
+
}}
|
|
1876
|
+
}});
|
|
1877
|
+
|
|
1878
|
+
const serializer = new XMLSerializer();
|
|
1879
|
+
const svgStr = serializer.serializeToString(clone);
|
|
1880
|
+
const svgBlob = new Blob([svgStr], {{type: 'image/svg+xml;charset=utf-8'}});
|
|
1881
|
+
const url = URL.createObjectURL(svgBlob);
|
|
1882
|
+
|
|
1883
|
+
const img = new Image();
|
|
1884
|
+
img.onload = () => {{
|
|
1885
|
+
const canvas = document.createElement('canvas');
|
|
1886
|
+
const scale = 2;
|
|
1887
|
+
canvas.width = w * scale;
|
|
1888
|
+
canvas.height = h * scale;
|
|
1889
|
+
const ctx = canvas.getContext('2d');
|
|
1890
|
+
ctx.scale(scale, scale);
|
|
1891
|
+
ctx.fillStyle = '#ffffff';
|
|
1892
|
+
ctx.fillRect(0, 0, w, h);
|
|
1893
|
+
ctx.drawImage(img, 0, 0, w, h);
|
|
1894
|
+
URL.revokeObjectURL(url);
|
|
1895
|
+
|
|
1896
|
+
canvas.toBlob(blob => {{
|
|
1897
|
+
const a = document.createElement('a');
|
|
1898
|
+
a.href = URL.createObjectURL(blob);
|
|
1899
|
+
a.download = (document.title || 'azure-architecture') + '.png';
|
|
1900
|
+
a.click();
|
|
1901
|
+
URL.revokeObjectURL(a.href);
|
|
1902
|
+
}}, 'image/png');
|
|
1903
|
+
}};
|
|
1904
|
+
img.src = url;
|
|
1905
|
+
}}
|
|
1906
|
+
|
|
1907
|
+
document.getElementById('canvas').addEventListener('wheel', e => {{
|
|
1908
|
+
e.preventDefault();
|
|
1909
|
+
const f = e.deltaY < 0 ? 1.1 : 0.9;
|
|
1910
|
+
const rect = document.getElementById('canvas').getBoundingClientRect();
|
|
1911
|
+
const mx = e.clientX - rect.left, my = e.clientY - rect.top;
|
|
1912
|
+
const os = viewTransform.scale, ns = os * f;
|
|
1913
|
+
viewTransform.x = mx - (mx - viewTransform.x) * (ns/os);
|
|
1914
|
+
viewTransform.y = my - (my - viewTransform.y) * (ns/os);
|
|
1915
|
+
viewTransform.scale = ns;
|
|
1916
|
+
applyTransform();
|
|
1917
|
+
}}, {{ passive: false }});
|
|
1918
|
+
|
|
1919
|
+
document.getElementById('canvas').addEventListener('mousedown', e => {{
|
|
1920
|
+
if (e.target.closest('.node')) return;
|
|
1921
|
+
// Clear selection when clicking on empty canvas area
|
|
1922
|
+
if (_selectedNodeId && !e.target.closest('.node')) clearSelection();
|
|
1923
|
+
isPanning = true;
|
|
1924
|
+
panSX = e.clientX; panSY = e.clientY;
|
|
1925
|
+
panSTx = viewTransform.x; panSTy = viewTransform.y;
|
|
1926
|
+
document.getElementById('canvas').style.cursor = 'grabbing';
|
|
1927
|
+
e.preventDefault();
|
|
1928
|
+
}});
|
|
1929
|
+
document.addEventListener('mousemove', e => {{
|
|
1930
|
+
if (isPanning) {{
|
|
1931
|
+
viewTransform.x = panSTx + (e.clientX - panSX);
|
|
1932
|
+
viewTransform.y = panSTy + (e.clientY - panSY);
|
|
1933
|
+
applyTransform();
|
|
1934
|
+
}}
|
|
1935
|
+
}});
|
|
1936
|
+
document.addEventListener('mouseup', () => {{
|
|
1937
|
+
if (isPanning) {{ isPanning = false; document.getElementById('canvas').style.cursor = ''; }}
|
|
1938
|
+
}});
|
|
1939
|
+
|
|
1940
|
+
// ── Sidebar ──
|
|
1941
|
+
function buildSidebar() {{
|
|
1942
|
+
const list = document.getElementById('service-list');
|
|
1943
|
+
const byCat = {{}};
|
|
1944
|
+
NODES.forEach(n => {{ if (!byCat[n.category]) byCat[n.category] = []; byCat[n.category].push(n); }});
|
|
1945
|
+
Object.entries(byCat).forEach(([cat, nodes]) => {{
|
|
1946
|
+
const cd = document.createElement('div');
|
|
1947
|
+
cd.className = 'cat-label'; cd.textContent = cat;
|
|
1948
|
+
list.appendChild(cd);
|
|
1949
|
+
nodes.forEach(node => {{
|
|
1950
|
+
const card = document.createElement('div');
|
|
1951
|
+
card.className = 'service-card'; card.id = 'card-' + node.id;
|
|
1952
|
+
card.innerHTML = `
|
|
1953
|
+
<div class="service-card-header">
|
|
1954
|
+
<div class="sc-icon">${{node.icon_data_uri ? `<img src="${{node.icon_data_uri}}" width="28" height="28" style="object-fit:contain;">` : `<svg viewBox="0 0 48 48">${{node.icon_svg}}</svg>`}}</div>
|
|
1955
|
+
<div>
|
|
1956
|
+
<div class="service-name">${{node.name}}</div>
|
|
1957
|
+
<div class="service-sku">${{node.sku || node.type}}</div>
|
|
1958
|
+
</div>
|
|
1959
|
+
${{node.private ? '<span class="private-badge">Private</span>' : ''}}
|
|
1960
|
+
</div>
|
|
1961
|
+
${{node.details.length > 0 ? `<div class="service-card-body">${{node.details.map(d => `<div class="service-detail">${{d}}</div>`).join('')}}</div>` : ''}}
|
|
1962
|
+
`;
|
|
1963
|
+
card.addEventListener('click', () => {{
|
|
1964
|
+
selectNode(node.id);
|
|
1965
|
+
}});
|
|
1966
|
+
list.appendChild(card);
|
|
1967
|
+
}});
|
|
1968
|
+
}});
|
|
1969
|
+
}}
|
|
1970
|
+
|
|
1971
|
+
// ── VNet highlight toggle ──
|
|
1972
|
+
let _vnetHighlighted = false;
|
|
1973
|
+
function toggleVNetHighlight() {{
|
|
1974
|
+
_vnetHighlighted = !_vnetHighlighted;
|
|
1975
|
+
const vr = document.getElementById('vnet-rect');
|
|
1976
|
+
if (!vr) return;
|
|
1977
|
+
if (_vnetHighlighted) {{
|
|
1978
|
+
vr.setAttribute('stroke-width', '4');
|
|
1979
|
+
vr.setAttribute('stroke', '#5C2D91');
|
|
1980
|
+
vr.setAttribute('fill', '#f0eaf8');
|
|
1981
|
+
}} else {{
|
|
1982
|
+
vr.setAttribute('stroke-width', '2');
|
|
1983
|
+
vr.setAttribute('stroke', '#5C2D91');
|
|
1984
|
+
vr.setAttribute('fill', '#f8f7ff');
|
|
1985
|
+
}}
|
|
1986
|
+
// Also toggle sidebar card
|
|
1987
|
+
const card = document.getElementById('card-vnet-boundary');
|
|
1988
|
+
if (card) card.classList.toggle('selected', _vnetHighlighted);
|
|
1989
|
+
}}
|
|
1990
|
+
|
|
1991
|
+
renderDiagram();
|
|
1992
|
+
buildSidebar();
|
|
1993
|
+
|
|
1994
|
+
// ── VNet sidebar card (added dynamically if VNet boundary exists) ──
|
|
1995
|
+
if (VNET_INFO || NODES.some(n => n.private && n.type !== 'pe') || NODES.some(n => n.type === 'pe')) {{
|
|
1996
|
+
const list = document.getElementById('service-list');
|
|
1997
|
+
// Insert at the top
|
|
1998
|
+
const catLabel = document.createElement('div');
|
|
1999
|
+
catLabel.className = 'cat-label'; catLabel.textContent = 'NETWORK';
|
|
2000
|
+
const card = document.createElement('div');
|
|
2001
|
+
card.className = 'service-card'; card.id = 'card-vnet-boundary';
|
|
2002
|
+
const vnetIcon = '<rect x="6" y="6" width="36" height="36" rx="4" fill="none" stroke="#5C2D91" stroke-width="3"/><circle cx="16" cy="18" r="3" fill="#5C2D91"/><circle cx="32" cy="18" r="3" fill="#5C2D91"/><circle cx="24" cy="32" r="3" fill="#5C2D91"/>';
|
|
2003
|
+
const vnetDetails = VNET_INFO ? VNET_INFO.split('|').map(s => s.trim()) : [];
|
|
2004
|
+
card.innerHTML = `
|
|
2005
|
+
<div class="service-card-header">
|
|
2006
|
+
<div class="sc-icon"><svg viewBox="0 0 48 48">${{vnetIcon}}</svg></div>
|
|
2007
|
+
<div>
|
|
2008
|
+
<div class="service-name">Virtual Network</div>
|
|
2009
|
+
<div class="service-sku">vnet</div>
|
|
2010
|
+
</div>
|
|
2011
|
+
<span class="private-badge">Private</span>
|
|
2012
|
+
</div>
|
|
2013
|
+
${{vnetDetails.length > 0 ? `<div class="service-card-body">${{vnetDetails.map(d => `<div class="service-detail">${{d}}</div>`).join('')}}</div>` : ''}}
|
|
2014
|
+
`;
|
|
2015
|
+
card.addEventListener('click', () => {{ toggleVNetHighlight(); }});
|
|
2016
|
+
list.insertBefore(card, list.firstChild);
|
|
2017
|
+
list.insertBefore(catLabel, list.firstChild);
|
|
2018
|
+
}}
|
|
2019
|
+
setTimeout(fitToScreen, 100);
|
|
2020
|
+
</script>
|
|
2021
|
+
</body>
|
|
2022
|
+
</html>"""
|
|
2023
|
+
return html
|
|
2024
|
+
|
|
2025
|
+
def generate_diagram(services, connections, title="Azure Architecture", vnet_info="", hierarchy=None):
|
|
2026
|
+
"""Generate an interactive Azure architecture diagram as an HTML string.
|
|
2027
|
+
|
|
2028
|
+
Args:
|
|
2029
|
+
services: list of dicts with keys id, name, type, sku, private, details, etc.
|
|
2030
|
+
connections: list of dicts with keys from, to, label, type.
|
|
2031
|
+
title: diagram title string.
|
|
2032
|
+
vnet_info: VNet CIDR info string.
|
|
2033
|
+
hierarchy: optional subscription/RG hierarchy list.
|
|
2034
|
+
|
|
2035
|
+
Returns:
|
|
2036
|
+
HTML string containing the interactive diagram.
|
|
2037
|
+
"""
|
|
2038
|
+
return generate_html(services, connections, title, vnet_info=vnet_info, hierarchy=hierarchy)
|