artifact-chain-assistant 0.8.0
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/plugins/marketplace.json +20 -0
- package/.claude-plugin/marketplace.json +20 -0
- package/.claude-plugin/plugin.json +11 -0
- package/.codex-plugin/plugin.json +27 -0
- package/.github/ISSUE_TEMPLATE/bug_report.yml +26 -0
- package/.github/ISSUE_TEMPLATE/feature_request.yml +19 -0
- package/.github/pull_request_template.md +14 -0
- package/.github/workflows/ci.yml +23 -0
- package/CHANGELOG.md +196 -0
- package/CODE_OF_CONDUCT.md +11 -0
- package/CONTRIBUTING.md +24 -0
- package/EXTENDED-ARTIFACT-CATALOG.md +312 -0
- package/EXTENDED-ARTIFACT-CATALOG.zh-CN.md +289 -0
- package/INSTALL.md +1340 -0
- package/LICENSE +186 -0
- package/NOTICE +18 -0
- package/README.md +426 -0
- package/README.zh-CN.md +409 -0
- package/SECURITY.md +19 -0
- package/adapters/claude/.claude-plugin/plugin.json +11 -0
- package/adapters/claude/EXTENDED-ARTIFACT-CATALOG.md +312 -0
- package/adapters/claude/EXTENDED-ARTIFACT-CATALOG.zh-CN.md +289 -0
- package/adapters/claude/INSTALL.md +1340 -0
- package/adapters/claude/agent-methods/catalog.yaml +260 -0
- package/adapters/claude/bin/version-lock-audit.sh +21 -0
- package/adapters/claude/bin/version-lock-refresh.sh +21 -0
- package/adapters/claude/commands/version-lock-audit.md +9 -0
- package/adapters/claude/commands/version-lock-refresh.md +9 -0
- package/adapters/claude/compatibility.json +9 -0
- package/adapters/claude/hooks/hooks.json +16 -0
- package/adapters/claude/hooks/version-lock-stop.mjs +77 -0
- package/adapters/claude/schemas/artifact-workflow-profile.schema.json +72 -0
- package/adapters/claude/scripts/batch-merge.mjs +276 -0
- package/adapters/claude/scripts/batch-split.mjs +184 -0
- package/adapters/claude/scripts/check-workflow-profile.mjs +64 -0
- package/adapters/claude/scripts/doctor.mjs +44 -0
- package/adapters/claude/scripts/lib/artifact-graph-runtime.mjs +189 -0
- package/adapters/claude/scripts/lib/compatibility-policy.mjs +435 -0
- package/adapters/claude/scripts/lib/inline-yaml-parser.mjs +216 -0
- package/adapters/claude/scripts/lib/method-registry-version.mjs +7 -0
- package/adapters/claude/scripts/lib/workflow-profile.mjs +645 -0
- package/adapters/claude/scripts/run-artifact-workflow.mjs +366 -0
- package/adapters/claude/skills/artifact-audit/SKILL.md +80 -0
- package/adapters/claude/skills/artifact-batch/SKILL.md +115 -0
- package/adapters/claude/skills/artifact-chain-bootstrap/SKILL.md +343 -0
- package/adapters/claude/skills/artifact-chain-maintainer/SKILL.md +167 -0
- package/adapters/claude/skills/artifact-generate/SKILL.md +89 -0
- package/adapters/claude/skills/artifact-repair/SKILL.md +124 -0
- package/adapters/claude/skills/artifact-review/SKILL.md +122 -0
- package/adapters/claude/skills/artifact-workflow-worker/SKILL.md +90 -0
- package/adapters/claude/skills/prd-feature/SKILL.md +68 -0
- package/adapters/claude/skills/prd-feature/author/SKILL.md +92 -0
- package/adapters/claude/skills/prd-feature/references/compose.md +43 -0
- package/adapters/claude/skills/prd-feature/references/inspect.md +94 -0
- package/adapters/claude/skills/prd-feature/references/validate.md +65 -0
- package/adapters/claude/skills/prd-feature/repair/SKILL.md +135 -0
- package/adapters/claude/skills/prd-feature/review/SKILL.md +134 -0
- package/adapters/claude/skills/scenario-script/SKILL.md +76 -0
- package/adapters/claude/skills/scenario-script/author/SKILL.md +111 -0
- package/adapters/claude/skills/scenario-script/references/compose.md +43 -0
- package/adapters/claude/skills/scenario-script/references/inspect.md +105 -0
- package/adapters/claude/skills/scenario-script/references/validate.md +72 -0
- package/adapters/claude/skills/scenario-script/repair/SKILL.md +135 -0
- package/adapters/claude/skills/scenario-script/review/SKILL.md +137 -0
- package/adapters/claude/skills/where-am-i/SKILL.md +233 -0
- package/adapters/claude/templates/README.md +159 -0
- package/adapters/claude/templates/core/decision/review-checklist.md +35 -0
- package/adapters/claude/templates/core/decision/starter.md +66 -0
- package/adapters/claude/templates/core/design/review-checklist.md +41 -0
- package/adapters/claude/templates/core/design/starter.md +84 -0
- package/adapters/claude/templates/core/e2e_test/review-checklist.md +43 -0
- package/adapters/claude/templates/core/e2e_test/starter.md +70 -0
- package/adapters/claude/templates/core/feature/review-checklist.md +29 -0
- package/adapters/claude/templates/core/feature/starter.md +43 -0
- package/adapters/claude/templates/core/scenario/review-checklist.md +29 -0
- package/adapters/claude/templates/core/scenario/starter.md +57 -0
- package/adapters/claude/templates/core/test/review-checklist.md +37 -0
- package/adapters/claude/templates/core/test/starter.md +70 -0
- package/adapters/claude/templates/extended/ADOPTION-GUIDE.md +263 -0
- package/adapters/claude/templates/extended/README.md +261 -0
- package/adapters/claude/templates/extended/agent/agent_skill/review-checklist.md +51 -0
- package/adapters/claude/templates/extended/agent/agent_skill/starter.md +133 -0
- package/adapters/claude/templates/extended/agent/hook_policy/review-checklist.md +58 -0
- package/adapters/claude/templates/extended/agent/hook_policy/starter.md +134 -0
- package/adapters/claude/templates/extended/agent/prompt_packet/review-checklist.md +54 -0
- package/adapters/claude/templates/extended/agent/prompt_packet/starter.md +106 -0
- package/adapters/claude/templates/extended/contracts/api_contract/review-checklist.md +43 -0
- package/adapters/claude/templates/extended/contracts/api_contract/starter.md +92 -0
- package/adapters/claude/templates/extended/contracts/batch_job_contract/review-checklist.md +82 -0
- package/adapters/claude/templates/extended/contracts/batch_job_contract/starter.md +158 -0
- package/adapters/claude/templates/extended/contracts/cli_contract/review-checklist.md +43 -0
- package/adapters/claude/templates/extended/contracts/cli_contract/starter.md +93 -0
- package/adapters/claude/templates/extended/contracts/data_contract/review-checklist.md +45 -0
- package/adapters/claude/templates/extended/contracts/data_contract/starter.md +88 -0
- package/adapters/claude/templates/extended/contracts/integration_contract/review-checklist.md +77 -0
- package/adapters/claude/templates/extended/contracts/integration_contract/starter.md +158 -0
- package/adapters/claude/templates/extended/contracts/ipc_contract/review-checklist.md +78 -0
- package/adapters/claude/templates/extended/contracts/ipc_contract/starter.md +214 -0
- package/adapters/claude/templates/extended/contracts/report_contract/review-checklist.md +61 -0
- package/adapters/claude/templates/extended/contracts/report_contract/starter.md +97 -0
- package/adapters/claude/templates/extended/contracts/ui_contract/review-checklist.md +70 -0
- package/adapters/claude/templates/extended/contracts/ui_contract/starter.md +150 -0
- package/adapters/claude/templates/extended/domain/database_migration/review-checklist.md +51 -0
- package/adapters/claude/templates/extended/domain/database_migration/starter.md +115 -0
- package/adapters/claude/templates/extended/domain/domain_model/review-checklist.md +43 -0
- package/adapters/claude/templates/extended/domain/domain_model/starter.md +83 -0
- package/adapters/claude/templates/extended/governance/oss_compliance/review-checklist.md +51 -0
- package/adapters/claude/templates/extended/governance/oss_compliance/starter.md +84 -0
- package/adapters/claude/templates/extended/governance/publish_skill/review-checklist.md +58 -0
- package/adapters/claude/templates/extended/governance/publish_skill/starter.md +172 -0
- package/adapters/claude/templates/extended/governance/release_policy/review-checklist.md +57 -0
- package/adapters/claude/templates/extended/governance/release_policy/starter.md +131 -0
- package/adapters/claude/templates/extended/ops/deployment_manifest/review-checklist.md +51 -0
- package/adapters/claude/templates/extended/ops/deployment_manifest/starter.md +117 -0
- package/adapters/claude/templates/extended/ops/migration_plan/review-checklist.md +63 -0
- package/adapters/claude/templates/extended/ops/migration_plan/starter.md +117 -0
- package/adapters/claude/templates/extended/ops/performance_budget/review-checklist.md +50 -0
- package/adapters/claude/templates/extended/ops/performance_budget/starter.md +117 -0
- package/adapters/claude/templates/extended/ops/runbook/review-checklist.md +51 -0
- package/adapters/claude/templates/extended/ops/runbook/starter.md +101 -0
- package/adapters/claude/templates/extended/ops/security_review/review-checklist.md +56 -0
- package/adapters/claude/templates/extended/ops/security_review/starter.md +125 -0
- package/adapters/codex/.codex-plugin/plugin.json +27 -0
- package/adapters/codex/EXTENDED-ARTIFACT-CATALOG.md +312 -0
- package/adapters/codex/EXTENDED-ARTIFACT-CATALOG.zh-CN.md +289 -0
- package/adapters/codex/INSTALL.md +1340 -0
- package/adapters/codex/agent-methods/catalog.yaml +260 -0
- package/adapters/codex/compatibility.json +9 -0
- package/adapters/codex/schemas/artifact-workflow-profile.schema.json +72 -0
- package/adapters/codex/scripts/batch-merge.mjs +276 -0
- package/adapters/codex/scripts/batch-split.mjs +184 -0
- package/adapters/codex/scripts/check-workflow-profile.mjs +64 -0
- package/adapters/codex/scripts/doctor.mjs +44 -0
- package/adapters/codex/scripts/lib/artifact-graph-runtime.mjs +189 -0
- package/adapters/codex/scripts/lib/compatibility-policy.mjs +435 -0
- package/adapters/codex/scripts/lib/inline-yaml-parser.mjs +216 -0
- package/adapters/codex/scripts/lib/method-registry-version.mjs +7 -0
- package/adapters/codex/scripts/lib/workflow-profile.mjs +645 -0
- package/adapters/codex/scripts/run-artifact-workflow.mjs +366 -0
- package/adapters/codex/skills/artifact-audit/SKILL.md +80 -0
- package/adapters/codex/skills/artifact-batch/SKILL.md +115 -0
- package/adapters/codex/skills/artifact-chain-bootstrap/SKILL.md +343 -0
- package/adapters/codex/skills/artifact-chain-maintainer/SKILL.md +167 -0
- package/adapters/codex/skills/artifact-generate/SKILL.md +89 -0
- package/adapters/codex/skills/artifact-repair/SKILL.md +124 -0
- package/adapters/codex/skills/artifact-review/SKILL.md +122 -0
- package/adapters/codex/skills/artifact-workflow-worker/SKILL.md +90 -0
- package/adapters/codex/skills/prd-feature/SKILL.md +68 -0
- package/adapters/codex/skills/prd-feature/author/SKILL.md +92 -0
- package/adapters/codex/skills/prd-feature/references/compose.md +43 -0
- package/adapters/codex/skills/prd-feature/references/inspect.md +94 -0
- package/adapters/codex/skills/prd-feature/references/validate.md +65 -0
- package/adapters/codex/skills/prd-feature/repair/SKILL.md +135 -0
- package/adapters/codex/skills/prd-feature/review/SKILL.md +134 -0
- package/adapters/codex/skills/scenario-script/SKILL.md +76 -0
- package/adapters/codex/skills/scenario-script/author/SKILL.md +111 -0
- package/adapters/codex/skills/scenario-script/references/compose.md +43 -0
- package/adapters/codex/skills/scenario-script/references/inspect.md +105 -0
- package/adapters/codex/skills/scenario-script/references/validate.md +72 -0
- package/adapters/codex/skills/scenario-script/repair/SKILL.md +135 -0
- package/adapters/codex/skills/scenario-script/review/SKILL.md +137 -0
- package/adapters/codex/skills/where-am-i/SKILL.md +233 -0
- package/adapters/codex/templates/README.md +159 -0
- package/adapters/codex/templates/core/decision/review-checklist.md +35 -0
- package/adapters/codex/templates/core/decision/starter.md +66 -0
- package/adapters/codex/templates/core/design/review-checklist.md +41 -0
- package/adapters/codex/templates/core/design/starter.md +84 -0
- package/adapters/codex/templates/core/e2e_test/review-checklist.md +43 -0
- package/adapters/codex/templates/core/e2e_test/starter.md +70 -0
- package/adapters/codex/templates/core/feature/review-checklist.md +29 -0
- package/adapters/codex/templates/core/feature/starter.md +43 -0
- package/adapters/codex/templates/core/scenario/review-checklist.md +29 -0
- package/adapters/codex/templates/core/scenario/starter.md +57 -0
- package/adapters/codex/templates/core/test/review-checklist.md +37 -0
- package/adapters/codex/templates/core/test/starter.md +70 -0
- package/adapters/codex/templates/extended/ADOPTION-GUIDE.md +263 -0
- package/adapters/codex/templates/extended/README.md +261 -0
- package/adapters/codex/templates/extended/agent/agent_skill/review-checklist.md +51 -0
- package/adapters/codex/templates/extended/agent/agent_skill/starter.md +133 -0
- package/adapters/codex/templates/extended/agent/hook_policy/review-checklist.md +58 -0
- package/adapters/codex/templates/extended/agent/hook_policy/starter.md +134 -0
- package/adapters/codex/templates/extended/agent/prompt_packet/review-checklist.md +54 -0
- package/adapters/codex/templates/extended/agent/prompt_packet/starter.md +106 -0
- package/adapters/codex/templates/extended/contracts/api_contract/review-checklist.md +43 -0
- package/adapters/codex/templates/extended/contracts/api_contract/starter.md +92 -0
- package/adapters/codex/templates/extended/contracts/batch_job_contract/review-checklist.md +82 -0
- package/adapters/codex/templates/extended/contracts/batch_job_contract/starter.md +158 -0
- package/adapters/codex/templates/extended/contracts/cli_contract/review-checklist.md +43 -0
- package/adapters/codex/templates/extended/contracts/cli_contract/starter.md +93 -0
- package/adapters/codex/templates/extended/contracts/data_contract/review-checklist.md +45 -0
- package/adapters/codex/templates/extended/contracts/data_contract/starter.md +88 -0
- package/adapters/codex/templates/extended/contracts/integration_contract/review-checklist.md +77 -0
- package/adapters/codex/templates/extended/contracts/integration_contract/starter.md +158 -0
- package/adapters/codex/templates/extended/contracts/ipc_contract/review-checklist.md +78 -0
- package/adapters/codex/templates/extended/contracts/ipc_contract/starter.md +214 -0
- package/adapters/codex/templates/extended/contracts/report_contract/review-checklist.md +61 -0
- package/adapters/codex/templates/extended/contracts/report_contract/starter.md +97 -0
- package/adapters/codex/templates/extended/contracts/ui_contract/review-checklist.md +70 -0
- package/adapters/codex/templates/extended/contracts/ui_contract/starter.md +150 -0
- package/adapters/codex/templates/extended/domain/database_migration/review-checklist.md +51 -0
- package/adapters/codex/templates/extended/domain/database_migration/starter.md +115 -0
- package/adapters/codex/templates/extended/domain/domain_model/review-checklist.md +43 -0
- package/adapters/codex/templates/extended/domain/domain_model/starter.md +83 -0
- package/adapters/codex/templates/extended/governance/oss_compliance/review-checklist.md +51 -0
- package/adapters/codex/templates/extended/governance/oss_compliance/starter.md +84 -0
- package/adapters/codex/templates/extended/governance/publish_skill/review-checklist.md +58 -0
- package/adapters/codex/templates/extended/governance/publish_skill/starter.md +172 -0
- package/adapters/codex/templates/extended/governance/release_policy/review-checklist.md +57 -0
- package/adapters/codex/templates/extended/governance/release_policy/starter.md +131 -0
- package/adapters/codex/templates/extended/ops/deployment_manifest/review-checklist.md +51 -0
- package/adapters/codex/templates/extended/ops/deployment_manifest/starter.md +117 -0
- package/adapters/codex/templates/extended/ops/migration_plan/review-checklist.md +63 -0
- package/adapters/codex/templates/extended/ops/migration_plan/starter.md +117 -0
- package/adapters/codex/templates/extended/ops/performance_budget/review-checklist.md +50 -0
- package/adapters/codex/templates/extended/ops/performance_budget/starter.md +117 -0
- package/adapters/codex/templates/extended/ops/runbook/review-checklist.md +51 -0
- package/adapters/codex/templates/extended/ops/runbook/starter.md +101 -0
- package/adapters/codex/templates/extended/ops/security_review/review-checklist.md +56 -0
- package/adapters/codex/templates/extended/ops/security_review/starter.md +125 -0
- package/agent-methods/catalog.yaml +260 -0
- package/compatibility.json +9 -0
- package/package.json +85 -0
- package/runtime/claude/version-lock-stop.mjs +77 -0
- package/schemas/artifact-workflow-profile.schema.json +72 -0
- package/scripts/batch-merge.mjs +276 -0
- package/scripts/batch-split.mjs +184 -0
- package/scripts/build-adapters.mjs +195 -0
- package/scripts/build-runtime-bundles.mjs +134 -0
- package/scripts/check-compatibility.mjs +19 -0
- package/scripts/check-method-registry.mjs +461 -0
- package/scripts/check-templates.mjs +348 -0
- package/scripts/check-workflow-profile.mjs +64 -0
- package/scripts/doctor.mjs +44 -0
- package/scripts/install-git-hooks.mjs +21 -0
- package/scripts/lib/artifact-graph-runtime.mjs +189 -0
- package/scripts/lib/compatibility-policy.mjs +435 -0
- package/scripts/lib/inline-yaml-parser.mjs +216 -0
- package/scripts/lib/method-registry-version.mjs +7 -0
- package/scripts/lib/workflow-profile.mjs +645 -0
- package/scripts/run-artifact-workflow.mjs +366 -0
- package/scripts/sync-skills.mjs +149 -0
- package/skills-src/artifact-audit/SKILL.md +80 -0
- package/skills-src/artifact-batch/SKILL.md +115 -0
- package/skills-src/artifact-chain-bootstrap/SKILL.md +343 -0
- package/skills-src/artifact-chain-maintainer/SKILL.md +167 -0
- package/skills-src/artifact-generate/SKILL.md +89 -0
- package/skills-src/artifact-repair/SKILL.md +124 -0
- package/skills-src/artifact-review/SKILL.md +122 -0
- package/skills-src/artifact-workflow-worker/SKILL.md +90 -0
- package/skills-src/prd-feature/SKILL.md +68 -0
- package/skills-src/prd-feature/author/SKILL.md +92 -0
- package/skills-src/prd-feature/references/compose.md +43 -0
- package/skills-src/prd-feature/references/inspect.md +94 -0
- package/skills-src/prd-feature/references/validate.md +65 -0
- package/skills-src/prd-feature/repair/SKILL.md +135 -0
- package/skills-src/prd-feature/review/SKILL.md +134 -0
- package/skills-src/scenario-script/SKILL.md +76 -0
- package/skills-src/scenario-script/author/SKILL.md +111 -0
- package/skills-src/scenario-script/references/compose.md +43 -0
- package/skills-src/scenario-script/references/inspect.md +105 -0
- package/skills-src/scenario-script/references/validate.md +72 -0
- package/skills-src/scenario-script/repair/SKILL.md +135 -0
- package/skills-src/scenario-script/review/SKILL.md +137 -0
- package/skills-src/where-am-i/SKILL.md.tpl +233 -0
- package/templates/README.md +159 -0
- package/templates/claude/marketplace.json.tpl +20 -0
- package/templates/claude/plugin.json.tpl +11 -0
- package/templates/claude/settings.json.tpl +16 -0
- package/templates/codex/marketplace.json.tpl +20 -0
- package/templates/codex/plugin.json.tpl +27 -0
- package/templates/core/decision/review-checklist.md +35 -0
- package/templates/core/decision/starter.md +66 -0
- package/templates/core/design/review-checklist.md +41 -0
- package/templates/core/design/starter.md +84 -0
- package/templates/core/e2e_test/review-checklist.md +43 -0
- package/templates/core/e2e_test/starter.md +70 -0
- package/templates/core/feature/review-checklist.md +29 -0
- package/templates/core/feature/starter.md +43 -0
- package/templates/core/scenario/review-checklist.md +29 -0
- package/templates/core/scenario/starter.md +57 -0
- package/templates/core/test/review-checklist.md +37 -0
- package/templates/core/test/starter.md +70 -0
- package/templates/extended/ADOPTION-GUIDE.md +263 -0
- package/templates/extended/README.md +261 -0
- package/templates/extended/agent/agent_skill/review-checklist.md +51 -0
- package/templates/extended/agent/agent_skill/starter.md +133 -0
- package/templates/extended/agent/hook_policy/review-checklist.md +58 -0
- package/templates/extended/agent/hook_policy/starter.md +134 -0
- package/templates/extended/agent/prompt_packet/review-checklist.md +54 -0
- package/templates/extended/agent/prompt_packet/starter.md +106 -0
- package/templates/extended/contracts/api_contract/review-checklist.md +43 -0
- package/templates/extended/contracts/api_contract/starter.md +92 -0
- package/templates/extended/contracts/batch_job_contract/review-checklist.md +82 -0
- package/templates/extended/contracts/batch_job_contract/starter.md +158 -0
- package/templates/extended/contracts/cli_contract/review-checklist.md +43 -0
- package/templates/extended/contracts/cli_contract/starter.md +93 -0
- package/templates/extended/contracts/data_contract/review-checklist.md +45 -0
- package/templates/extended/contracts/data_contract/starter.md +88 -0
- package/templates/extended/contracts/integration_contract/review-checklist.md +77 -0
- package/templates/extended/contracts/integration_contract/starter.md +158 -0
- package/templates/extended/contracts/ipc_contract/review-checklist.md +78 -0
- package/templates/extended/contracts/ipc_contract/starter.md +214 -0
- package/templates/extended/contracts/report_contract/review-checklist.md +61 -0
- package/templates/extended/contracts/report_contract/starter.md +97 -0
- package/templates/extended/contracts/ui_contract/review-checklist.md +70 -0
- package/templates/extended/contracts/ui_contract/starter.md +150 -0
- package/templates/extended/domain/database_migration/review-checklist.md +51 -0
- package/templates/extended/domain/database_migration/starter.md +115 -0
- package/templates/extended/domain/domain_model/review-checklist.md +43 -0
- package/templates/extended/domain/domain_model/starter.md +83 -0
- package/templates/extended/governance/oss_compliance/review-checklist.md +51 -0
- package/templates/extended/governance/oss_compliance/starter.md +84 -0
- package/templates/extended/governance/publish_skill/review-checklist.md +58 -0
- package/templates/extended/governance/publish_skill/starter.md +172 -0
- package/templates/extended/governance/release_policy/review-checklist.md +57 -0
- package/templates/extended/governance/release_policy/starter.md +131 -0
- package/templates/extended/ops/deployment_manifest/review-checklist.md +51 -0
- package/templates/extended/ops/deployment_manifest/starter.md +117 -0
- package/templates/extended/ops/migration_plan/review-checklist.md +63 -0
- package/templates/extended/ops/migration_plan/starter.md +117 -0
- package/templates/extended/ops/performance_budget/review-checklist.md +50 -0
- package/templates/extended/ops/performance_budget/starter.md +117 -0
- package/templates/extended/ops/runbook/review-checklist.md +51 -0
- package/templates/extended/ops/runbook/starter.md +101 -0
- package/templates/extended/ops/security_review/review-checklist.md +56 -0
- package/templates/extended/ops/security_review/starter.md +125 -0
- package/templates/git-hooks/pre-commit.sh +43 -0
- package/templates/git-hooks/pre-push.sh +22 -0
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
// @feature ACA16 @scenario S-50
|
|
2
|
+
// Self-contained, fail-closed YAML subset parser for artifact workflow profiles.
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Parse the deterministic YAML subset accepted by artifact-workflow-profile.
|
|
6
|
+
* Blocks may use any positive child indentation, but every sibling in one block
|
|
7
|
+
* must use the exact same indentation. Sequences contain scalar values only.
|
|
8
|
+
*
|
|
9
|
+
* @param {string} source
|
|
10
|
+
* @returns {object|null}
|
|
11
|
+
*/
|
|
12
|
+
export function parseMinimalYaml(source) {
|
|
13
|
+
if (typeof source !== 'string') {
|
|
14
|
+
throw new TypeError('parseMinimalYaml expects a string');
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
const lines = preprocess(source);
|
|
18
|
+
if (lines.length === 0) return null;
|
|
19
|
+
if (lines[0].indent !== 0) {
|
|
20
|
+
throw yamlError(lines[0], 'invalid top-level indentation');
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
const parsed = parseBlock(lines, 0, 0);
|
|
24
|
+
if (parsed.next !== lines.length) {
|
|
25
|
+
throw yamlError(lines[parsed.next], 'unexpected indentation');
|
|
26
|
+
}
|
|
27
|
+
if (Array.isArray(parsed.value)) {
|
|
28
|
+
throw yamlError(lines[0], 'top-level sequence is not supported');
|
|
29
|
+
}
|
|
30
|
+
return parsed.value;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
function preprocess(source) {
|
|
34
|
+
const result = [];
|
|
35
|
+
const rawLines = source.replaceAll('\r\n', '\n').replaceAll('\r', '\n').split('\n');
|
|
36
|
+
|
|
37
|
+
for (let index = 0; index < rawLines.length; index += 1) {
|
|
38
|
+
const raw = rawLines[index];
|
|
39
|
+
if (/^[ ]*$/.test(raw) || /^[ ]*#/.test(raw)) continue;
|
|
40
|
+
|
|
41
|
+
const leading = raw.match(/^[\t ]*/)?.[0] ?? '';
|
|
42
|
+
if (leading.includes('\t')) {
|
|
43
|
+
throw new Error(`Unsupported YAML: tab indentation at line ${index + 1}`);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
const text = raw.slice(leading.length);
|
|
47
|
+
if (text === '---') {
|
|
48
|
+
throw new Error(`Unsupported YAML: multi-document separator --- at line ${index + 1}`);
|
|
49
|
+
}
|
|
50
|
+
if (text === '...') {
|
|
51
|
+
throw new Error(`Unsupported YAML: document end marker ... at line ${index + 1}`);
|
|
52
|
+
}
|
|
53
|
+
result.push({ line: index + 1, indent: leading.length, text });
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
return result;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
function parseBlock(lines, index, indent) {
|
|
60
|
+
const first = lines[index];
|
|
61
|
+
if (!first || first.indent !== indent) {
|
|
62
|
+
throw yamlError(first, 'invalid block indentation');
|
|
63
|
+
}
|
|
64
|
+
return first.text.startsWith('-')
|
|
65
|
+
? parseSequence(lines, index, indent)
|
|
66
|
+
: parseMapping(lines, index, indent);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// Prototype pollution keys that must never appear as mapping keys.
|
|
70
|
+
const PROTOTYPE_POLLUTION_KEYS = new Set(['__proto__', 'prototype', 'constructor']);
|
|
71
|
+
|
|
72
|
+
function parseMapping(lines, start, indent) {
|
|
73
|
+
const value = Object.create(null);
|
|
74
|
+
let index = start;
|
|
75
|
+
|
|
76
|
+
while (index < lines.length) {
|
|
77
|
+
const line = lines[index];
|
|
78
|
+
if (line.indent < indent) break;
|
|
79
|
+
if (line.indent > indent) {
|
|
80
|
+
throw yamlError(line, `unexpected indentation; expected ${indent} spaces`);
|
|
81
|
+
}
|
|
82
|
+
if (line.text.startsWith('-')) {
|
|
83
|
+
throw yamlError(line, 'mixed mapping and sequence block');
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
const entry = parseMappingEntry(line);
|
|
87
|
+
if (Object.prototype.hasOwnProperty.call(value, entry.key)) {
|
|
88
|
+
throw yamlError(line, `duplicate key "${entry.key}"`);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
if (entry.rawValue !== '') {
|
|
92
|
+
value[entry.key] = parseScalar(entry.rawValue, line);
|
|
93
|
+
index += 1;
|
|
94
|
+
continue;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
const child = lines[index + 1];
|
|
98
|
+
if (!child || child.indent <= indent) {
|
|
99
|
+
throw yamlError(line, `key "${entry.key}" requires a nested block`);
|
|
100
|
+
}
|
|
101
|
+
const parsedChild = parseBlock(lines, index + 1, child.indent);
|
|
102
|
+
value[entry.key] = parsedChild.value;
|
|
103
|
+
index = parsedChild.next;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
return { value, next: index };
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
function parseSequence(lines, start, indent) {
|
|
110
|
+
const value = [];
|
|
111
|
+
let index = start;
|
|
112
|
+
|
|
113
|
+
while (index < lines.length) {
|
|
114
|
+
const line = lines[index];
|
|
115
|
+
if (line.indent < indent) break;
|
|
116
|
+
if (line.indent > indent) {
|
|
117
|
+
throw yamlError(line, `unexpected indentation; expected ${indent} spaces`);
|
|
118
|
+
}
|
|
119
|
+
if (!line.text.startsWith('-')) {
|
|
120
|
+
throw yamlError(line, 'mixed sequence and mapping block');
|
|
121
|
+
}
|
|
122
|
+
if (!line.text.startsWith('- ')) {
|
|
123
|
+
throw yamlError(line, 'sequence items must use "- <scalar>"');
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
const rawValue = line.text.slice(2).trim();
|
|
127
|
+
if (rawValue === '') {
|
|
128
|
+
throw yamlError(line, 'empty or nested sequence items are not supported');
|
|
129
|
+
}
|
|
130
|
+
if (looksLikeMappingEntry(rawValue)) {
|
|
131
|
+
throw yamlError(line, 'mapping sequence items are not supported');
|
|
132
|
+
}
|
|
133
|
+
value.push(parseScalar(rawValue, line));
|
|
134
|
+
index += 1;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
return { value, next: index };
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
function parseMappingEntry(line) {
|
|
141
|
+
if (/^["']/.test(line.text) || line.text.startsWith('?')) {
|
|
142
|
+
throw yamlError(line, 'complex key is not supported');
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
const separator = line.text.indexOf(':');
|
|
146
|
+
if (separator <= 0) {
|
|
147
|
+
throw yamlError(line, `unparseable mapping entry: ${line.text}`);
|
|
148
|
+
}
|
|
149
|
+
const key = line.text.slice(0, separator).trim();
|
|
150
|
+
if (!/^[A-Za-z0-9_.-]+$/.test(key)) {
|
|
151
|
+
throw yamlError(line, `unsupported mapping key "${key}"`);
|
|
152
|
+
}
|
|
153
|
+
if (PROTOTYPE_POLLUTION_KEYS.has(key)) {
|
|
154
|
+
throw yamlError(line, `prototype pollution key "${key}" is not allowed`);
|
|
155
|
+
}
|
|
156
|
+
return { key, rawValue: line.text.slice(separator + 1).trim() };
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
function looksLikeMappingEntry(value) {
|
|
160
|
+
return /^[A-Za-z0-9_.-]+\s*:/.test(value);
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
function parseScalar(raw, line) {
|
|
164
|
+
rejectUnsupportedScalar(raw, line);
|
|
165
|
+
|
|
166
|
+
if (raw === '{}') return Object.create(null);
|
|
167
|
+
if (raw === '[]') return [];
|
|
168
|
+
if (raw === 'true') return true;
|
|
169
|
+
if (raw === 'false') return false;
|
|
170
|
+
if (raw === 'null') return null;
|
|
171
|
+
if (/^-?\d+$/.test(raw)) return Number.parseInt(raw, 10);
|
|
172
|
+
|
|
173
|
+
if (raw.startsWith('"') || raw.endsWith('"')) {
|
|
174
|
+
if (!(raw.startsWith('"') && raw.endsWith('"'))) {
|
|
175
|
+
throw yamlError(line, 'unterminated double-quoted scalar');
|
|
176
|
+
}
|
|
177
|
+
try {
|
|
178
|
+
return JSON.parse(raw);
|
|
179
|
+
} catch {
|
|
180
|
+
throw yamlError(line, 'invalid double-quoted scalar');
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
if (raw.startsWith("'") || raw.endsWith("'")) {
|
|
185
|
+
if (!(raw.startsWith("'") && raw.endsWith("'"))) {
|
|
186
|
+
throw yamlError(line, 'unterminated single-quoted scalar');
|
|
187
|
+
}
|
|
188
|
+
const body = raw.slice(1, -1);
|
|
189
|
+
if (/(^|[^'])'(?!')/.test(body)) {
|
|
190
|
+
throw yamlError(line, 'invalid single-quoted scalar');
|
|
191
|
+
}
|
|
192
|
+
return body.replaceAll("''", "'");
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
if (/^[\[\]{},]/.test(raw)) {
|
|
196
|
+
throw yamlError(line, 'flow collections are not supported');
|
|
197
|
+
}
|
|
198
|
+
return raw;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
function rejectUnsupportedScalar(raw, line) {
|
|
202
|
+
if (/^(?:&|\*)\S/.test(raw) || /(?:^|\s)(?:&|\*)\S/.test(raw)) {
|
|
203
|
+
throw yamlError(line, 'anchor or alias is not supported');
|
|
204
|
+
}
|
|
205
|
+
if (/^(?:!|!!)/.test(raw)) {
|
|
206
|
+
throw yamlError(line, 'tag is not supported');
|
|
207
|
+
}
|
|
208
|
+
if (raw === '|' || raw === '>' || /^[|>]\d?[+-]?$/.test(raw)) {
|
|
209
|
+
throw yamlError(line, 'block scalar is not supported');
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
function yamlError(line, message) {
|
|
214
|
+
const suffix = line ? ` at line ${line.line}` : '';
|
|
215
|
+
return new Error(`Unsupported YAML: ${message}${suffix}`);
|
|
216
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export function validateCatalogPackageVersion(catalog, packageJson) {
|
|
2
|
+
const catalogVersion = catalog?.catalog?.version;
|
|
3
|
+
const packageVersion = packageJson?.version;
|
|
4
|
+
return catalogVersion === packageVersion
|
|
5
|
+
? []
|
|
6
|
+
: [`catalog.version ${String(catalogVersion)} must equal package version ${String(packageVersion)}`];
|
|
7
|
+
}
|