codika 3.0.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/LICENSE +21 -0
- package/README.md +68 -0
- package/dist/cli/commands/completion.d.ts +15 -0
- package/dist/cli/commands/completion.d.ts.map +1 -0
- package/dist/cli/commands/completion.js +810 -0
- package/dist/cli/commands/completion.js.map +1 -0
- package/dist/cli/commands/config/clear.d.ts +12 -0
- package/dist/cli/commands/config/clear.d.ts.map +1 -0
- package/dist/cli/commands/config/clear.js +35 -0
- package/dist/cli/commands/config/clear.js.map +1 -0
- package/dist/cli/commands/config/index.d.ts +15 -0
- package/dist/cli/commands/config/index.d.ts.map +1 -0
- package/dist/cli/commands/config/index.js +21 -0
- package/dist/cli/commands/config/index.js.map +1 -0
- package/dist/cli/commands/config/set.d.ts +41 -0
- package/dist/cli/commands/config/set.d.ts.map +1 -0
- package/dist/cli/commands/config/set.js +185 -0
- package/dist/cli/commands/config/set.js.map +1 -0
- package/dist/cli/commands/config/show.d.ts +12 -0
- package/dist/cli/commands/config/show.d.ts.map +1 -0
- package/dist/cli/commands/config/show.js +45 -0
- package/dist/cli/commands/config/show.js.map +1 -0
- package/dist/cli/commands/deploy/documents.d.ts +12 -0
- package/dist/cli/commands/deploy/documents.d.ts.map +1 -0
- package/dist/cli/commands/deploy/documents.js +217 -0
- package/dist/cli/commands/deploy/documents.js.map +1 -0
- package/dist/cli/commands/deploy/index.d.ts +14 -0
- package/dist/cli/commands/deploy/index.d.ts.map +1 -0
- package/dist/cli/commands/deploy/index.js +21 -0
- package/dist/cli/commands/deploy/index.js.map +1 -0
- package/dist/cli/commands/deploy/process-data-ingestion.d.ts +13 -0
- package/dist/cli/commands/deploy/process-data-ingestion.d.ts.map +1 -0
- package/dist/cli/commands/deploy/process-data-ingestion.js +226 -0
- package/dist/cli/commands/deploy/process-data-ingestion.js.map +1 -0
- package/dist/cli/commands/deploy/use-case.d.ts +9 -0
- package/dist/cli/commands/deploy/use-case.d.ts.map +1 -0
- package/dist/cli/commands/deploy/use-case.js +212 -0
- package/dist/cli/commands/deploy/use-case.js.map +1 -0
- package/dist/cli/commands/get/execution.d.ts +9 -0
- package/dist/cli/commands/get/execution.d.ts.map +1 -0
- package/dist/cli/commands/get/execution.js +159 -0
- package/dist/cli/commands/get/execution.js.map +1 -0
- package/dist/cli/commands/get/index.d.ts +13 -0
- package/dist/cli/commands/get/index.d.ts.map +1 -0
- package/dist/cli/commands/get/index.js +20 -0
- package/dist/cli/commands/get/index.js.map +1 -0
- package/dist/cli/commands/get/skills.d.ts +15 -0
- package/dist/cli/commands/get/skills.d.ts.map +1 -0
- package/dist/cli/commands/get/skills.js +135 -0
- package/dist/cli/commands/get/skills.js.map +1 -0
- package/dist/cli/commands/get/use-case.d.ts +9 -0
- package/dist/cli/commands/get/use-case.d.ts.map +1 -0
- package/dist/cli/commands/get/use-case.js +186 -0
- package/dist/cli/commands/get/use-case.js.map +1 -0
- package/dist/cli/commands/init.d.ts +14 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +347 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/integration/delete.d.ts +13 -0
- package/dist/cli/commands/integration/delete.d.ts.map +1 -0
- package/dist/cli/commands/integration/delete.js +140 -0
- package/dist/cli/commands/integration/delete.js.map +1 -0
- package/dist/cli/commands/integration/index.d.ts +13 -0
- package/dist/cli/commands/integration/index.d.ts.map +1 -0
- package/dist/cli/commands/integration/index.js +20 -0
- package/dist/cli/commands/integration/index.js.map +1 -0
- package/dist/cli/commands/integration/list.d.ts +13 -0
- package/dist/cli/commands/integration/list.d.ts.map +1 -0
- package/dist/cli/commands/integration/list.js +129 -0
- package/dist/cli/commands/integration/list.js.map +1 -0
- package/dist/cli/commands/integration/set.d.ts +13 -0
- package/dist/cli/commands/integration/set.d.ts.map +1 -0
- package/dist/cli/commands/integration/set.js +253 -0
- package/dist/cli/commands/integration/set.js.map +1 -0
- package/dist/cli/commands/list/executions.d.ts +12 -0
- package/dist/cli/commands/list/executions.d.ts.map +1 -0
- package/dist/cli/commands/list/executions.js +168 -0
- package/dist/cli/commands/list/executions.js.map +1 -0
- package/dist/cli/commands/list/index.d.ts +11 -0
- package/dist/cli/commands/list/index.d.ts.map +1 -0
- package/dist/cli/commands/list/index.js +14 -0
- package/dist/cli/commands/list/index.js.map +1 -0
- package/dist/cli/commands/logout.d.ts +12 -0
- package/dist/cli/commands/logout.d.ts.map +1 -0
- package/dist/cli/commands/logout.js +58 -0
- package/dist/cli/commands/logout.js.map +1 -0
- package/dist/cli/commands/project/create.d.ts +8 -0
- package/dist/cli/commands/project/create.d.ts.map +1 -0
- package/dist/cli/commands/project/create.js +109 -0
- package/dist/cli/commands/project/create.js.map +1 -0
- package/dist/cli/commands/project/index.d.ts +12 -0
- package/dist/cli/commands/project/index.d.ts.map +1 -0
- package/dist/cli/commands/project/index.js +15 -0
- package/dist/cli/commands/project/index.js.map +1 -0
- package/dist/cli/commands/publish.d.ts +12 -0
- package/dist/cli/commands/publish.d.ts.map +1 -0
- package/dist/cli/commands/publish.js +152 -0
- package/dist/cli/commands/publish.js.map +1 -0
- package/dist/cli/commands/redeploy.d.ts +11 -0
- package/dist/cli/commands/redeploy.d.ts.map +1 -0
- package/dist/cli/commands/redeploy.js +166 -0
- package/dist/cli/commands/redeploy.js.map +1 -0
- package/dist/cli/commands/status.d.ts +63 -0
- package/dist/cli/commands/status.d.ts.map +1 -0
- package/dist/cli/commands/status.js +290 -0
- package/dist/cli/commands/status.js.map +1 -0
- package/dist/cli/commands/trigger.d.ts +8 -0
- package/dist/cli/commands/trigger.d.ts.map +1 -0
- package/dist/cli/commands/trigger.js +247 -0
- package/dist/cli/commands/trigger.js.map +1 -0
- package/dist/cli/commands/use.d.ts +13 -0
- package/dist/cli/commands/use.d.ts.map +1 -0
- package/dist/cli/commands/use.js +92 -0
- package/dist/cli/commands/use.js.map +1 -0
- package/dist/cli/commands/verify/index.d.ts +13 -0
- package/dist/cli/commands/verify/index.d.ts.map +1 -0
- package/dist/cli/commands/verify/index.js +18 -0
- package/dist/cli/commands/verify/index.js.map +1 -0
- package/dist/cli/commands/verify/use-case.d.ts +23 -0
- package/dist/cli/commands/verify/use-case.d.ts.map +1 -0
- package/dist/cli/commands/verify/use-case.js +94 -0
- package/dist/cli/commands/verify/use-case.js.map +1 -0
- package/dist/cli/commands/verify/workflow.d.ts +22 -0
- package/dist/cli/commands/verify/workflow.d.ts.map +1 -0
- package/dist/cli/commands/verify/workflow.js +82 -0
- package/dist/cli/commands/verify/workflow.js.map +1 -0
- package/dist/cli/commands/whoami.d.ts +13 -0
- package/dist/cli/commands/whoami.d.ts.map +1 -0
- package/dist/cli/commands/whoami.js +126 -0
- package/dist/cli/commands/whoami.js.map +1 -0
- package/dist/cli/index.d.ts +24 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +90 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/templates/claude-md-template.d.ts +12 -0
- package/dist/cli/templates/claude-md-template.d.ts.map +1 -0
- package/dist/cli/templates/claude-md-template.js +162 -0
- package/dist/cli/templates/claude-md-template.js.map +1 -0
- package/dist/cli/templates/config-template.d.ts +18 -0
- package/dist/cli/templates/config-template.d.ts.map +1 -0
- package/dist/cli/templates/config-template.js +350 -0
- package/dist/cli/templates/config-template.js.map +1 -0
- package/dist/cli/templates/skill-templates.d.ts +24 -0
- package/dist/cli/templates/skill-templates.d.ts.map +1 -0
- package/dist/cli/templates/skill-templates.js +117 -0
- package/dist/cli/templates/skill-templates.js.map +1 -0
- package/dist/cli/templates/slug.d.ts +9 -0
- package/dist/cli/templates/slug.d.ts.map +1 -0
- package/dist/cli/templates/slug.js +17 -0
- package/dist/cli/templates/slug.js.map +1 -0
- package/dist/cli/templates/workflow-templates.d.ts +693 -0
- package/dist/cli/templates/workflow-templates.d.ts.map +1 -0
- package/dist/cli/templates/workflow-templates.js +516 -0
- package/dist/cli/templates/workflow-templates.js.map +1 -0
- package/dist/cli/utils/output.d.ts +65 -0
- package/dist/cli/utils/output.d.ts.map +1 -0
- package/dist/cli/utils/output.js +188 -0
- package/dist/cli/utils/output.js.map +1 -0
- package/dist/cli/utils/validation-output.d.ts +21 -0
- package/dist/cli/utils/validation-output.d.ts.map +1 -0
- package/dist/cli/utils/validation-output.js +204 -0
- package/dist/cli/utils/validation-output.js.map +1 -0
- package/dist/data/integration-fields.d.ts +27 -0
- package/dist/data/integration-fields.d.ts.map +1 -0
- package/dist/data/integration-fields.js +361 -0
- package/dist/data/integration-fields.js.map +1 -0
- package/dist/index.d.ts +25 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +39 -0
- package/dist/index.js.map +1 -0
- package/dist/types/process-types.d.ts +740 -0
- package/dist/types/process-types.d.ts.map +1 -0
- package/dist/types/process-types.js +22 -0
- package/dist/types/process-types.js.map +1 -0
- package/dist/utils/config.d.ts +127 -0
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/config.js +315 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/data-ingestion-deploy-client.d.ts +53 -0
- package/dist/utils/data-ingestion-deploy-client.d.ts.map +1 -0
- package/dist/utils/data-ingestion-deploy-client.js +63 -0
- package/dist/utils/data-ingestion-deploy-client.js.map +1 -0
- package/dist/utils/data-ingestion-deployer.d.ts +78 -0
- package/dist/utils/data-ingestion-deployer.d.ts.map +1 -0
- package/dist/utils/data-ingestion-deployer.js +119 -0
- package/dist/utils/data-ingestion-deployer.js.map +1 -0
- package/dist/utils/deploy-client.d.ts +55 -0
- package/dist/utils/deploy-client.d.ts.map +1 -0
- package/dist/utils/deploy-client.js +73 -0
- package/dist/utils/deploy-client.js.map +1 -0
- package/dist/utils/deployment-archiver.d.ts +110 -0
- package/dist/utils/deployment-archiver.d.ts.map +1 -0
- package/dist/utils/deployment-archiver.js +158 -0
- package/dist/utils/deployment-archiver.js.map +1 -0
- package/dist/utils/document-deploy-client.d.ts +41 -0
- package/dist/utils/document-deploy-client.d.ts.map +1 -0
- package/dist/utils/document-deploy-client.js +46 -0
- package/dist/utils/document-deploy-client.js.map +1 -0
- package/dist/utils/encryption.d.ts +85 -0
- package/dist/utils/encryption.d.ts.map +1 -0
- package/dist/utils/encryption.js +162 -0
- package/dist/utils/encryption.js.map +1 -0
- package/dist/utils/execution-client.d.ts +71 -0
- package/dist/utils/execution-client.d.ts.map +1 -0
- package/dist/utils/execution-client.js +56 -0
- package/dist/utils/execution-client.js.map +1 -0
- package/dist/utils/integration-client.d.ts +134 -0
- package/dist/utils/integration-client.d.ts.map +1 -0
- package/dist/utils/integration-client.js +109 -0
- package/dist/utils/integration-client.js.map +1 -0
- package/dist/utils/list-executions-client.d.ts +47 -0
- package/dist/utils/list-executions-client.d.ts.map +1 -0
- package/dist/utils/list-executions-client.js +50 -0
- package/dist/utils/list-executions-client.js.map +1 -0
- package/dist/utils/metadata-client.d.ts +90 -0
- package/dist/utils/metadata-client.d.ts.map +1 -0
- package/dist/utils/metadata-client.js +66 -0
- package/dist/utils/metadata-client.js.map +1 -0
- package/dist/utils/project-client.d.ts +70 -0
- package/dist/utils/project-client.d.ts.map +1 -0
- package/dist/utils/project-client.js +63 -0
- package/dist/utils/project-client.js.map +1 -0
- package/dist/utils/project-json.d.ts +71 -0
- package/dist/utils/project-json.d.ts.map +1 -0
- package/dist/utils/project-json.js +129 -0
- package/dist/utils/project-json.js.map +1 -0
- package/dist/utils/publish-client.d.ts +53 -0
- package/dist/utils/publish-client.d.ts.map +1 -0
- package/dist/utils/publish-client.js +64 -0
- package/dist/utils/publish-client.js.map +1 -0
- package/dist/utils/redeploy-client.d.ts +39 -0
- package/dist/utils/redeploy-client.d.ts.map +1 -0
- package/dist/utils/redeploy-client.js +51 -0
- package/dist/utils/redeploy-client.js.map +1 -0
- package/dist/utils/skill-parser.d.ts +52 -0
- package/dist/utils/skill-parser.d.ts.map +1 -0
- package/dist/utils/skill-parser.js +127 -0
- package/dist/utils/skill-parser.js.map +1 -0
- package/dist/utils/skills-client.d.ts +39 -0
- package/dist/utils/skills-client.d.ts.map +1 -0
- package/dist/utils/skills-client.js +32 -0
- package/dist/utils/skills-client.js.map +1 -0
- package/dist/utils/trigger-client.d.ts +78 -0
- package/dist/utils/trigger-client.d.ts.map +1 -0
- package/dist/utils/trigger-client.js +81 -0
- package/dist/utils/trigger-client.js.map +1 -0
- package/dist/utils/use-case-deployer.d.ts +93 -0
- package/dist/utils/use-case-deployer.d.ts.map +1 -0
- package/dist/utils/use-case-deployer.js +270 -0
- package/dist/utils/use-case-deployer.js.map +1 -0
- package/dist/utils/version-manager.d.ts +63 -0
- package/dist/utils/version-manager.d.ts.map +1 -0
- package/dist/utils/version-manager.js +91 -0
- package/dist/utils/version-manager.js.map +1 -0
- package/dist/utils/workflow-encoding.d.ts +26 -0
- package/dist/utils/workflow-encoding.d.ts.map +1 -0
- package/dist/utils/workflow-encoding.js +41 -0
- package/dist/utils/workflow-encoding.js.map +1 -0
- package/dist/validation/fixer.d.ts +56 -0
- package/dist/validation/fixer.d.ts.map +1 -0
- package/dist/validation/fixer.js +168 -0
- package/dist/validation/fixer.js.map +1 -0
- package/dist/validation/rules/codika-init-required.d.ts +18 -0
- package/dist/validation/rules/codika-init-required.d.ts.map +1 -0
- package/dist/validation/rules/codika-init-required.js +70 -0
- package/dist/validation/rules/codika-init-required.js.map +1 -0
- package/dist/validation/rules/codika-submit-result.d.ts +22 -0
- package/dist/validation/rules/codika-submit-result.d.ts.map +1 -0
- package/dist/validation/rules/codika-submit-result.js +144 -0
- package/dist/validation/rules/codika-submit-result.js.map +1 -0
- package/dist/validation/rules/error-branch-required.d.ts +24 -0
- package/dist/validation/rules/error-branch-required.d.ts.map +1 -0
- package/dist/validation/rules/error-branch-required.js +103 -0
- package/dist/validation/rules/error-branch-required.js.map +1 -0
- package/dist/validation/rules/index.d.ts +18 -0
- package/dist/validation/rules/index.d.ts.map +1 -0
- package/dist/validation/rules/index.js +28 -0
- package/dist/validation/rules/index.js.map +1 -0
- package/dist/validation/rules/schedule-webhook-convergence.d.ts +24 -0
- package/dist/validation/rules/schedule-webhook-convergence.d.ts.map +1 -0
- package/dist/validation/rules/schedule-webhook-convergence.js +129 -0
- package/dist/validation/rules/schedule-webhook-convergence.js.map +1 -0
- package/dist/validation/rules/subworkflow-min-params.d.ts +21 -0
- package/dist/validation/rules/subworkflow-min-params.d.ts.map +1 -0
- package/dist/validation/rules/subworkflow-min-params.js +84 -0
- package/dist/validation/rules/subworkflow-min-params.js.map +1 -0
- package/dist/validation/runner.d.ts +43 -0
- package/dist/validation/runner.d.ts.map +1 -0
- package/dist/validation/runner.js +335 -0
- package/dist/validation/runner.js.map +1 -0
- package/dist/validation/types.d.ts +155 -0
- package/dist/validation/types.d.ts.map +1 -0
- package/dist/validation/types.js +8 -0
- package/dist/validation/types.js.map +1 -0
- package/dist/validation/use-case-scripts/calledby-consistency.d.ts +23 -0
- package/dist/validation/use-case-scripts/calledby-consistency.d.ts.map +1 -0
- package/dist/validation/use-case-scripts/calledby-consistency.js +236 -0
- package/dist/validation/use-case-scripts/calledby-consistency.js.map +1 -0
- package/dist/validation/use-case-scripts/config-exports.d.ts +17 -0
- package/dist/validation/use-case-scripts/config-exports.d.ts.map +1 -0
- package/dist/validation/use-case-scripts/config-exports.js +93 -0
- package/dist/validation/use-case-scripts/config-exports.js.map +1 -0
- package/dist/validation/use-case-scripts/custom-integration-schema.d.ts +21 -0
- package/dist/validation/use-case-scripts/custom-integration-schema.d.ts.map +1 -0
- package/dist/validation/use-case-scripts/custom-integration-schema.js +378 -0
- package/dist/validation/use-case-scripts/custom-integration-schema.js.map +1 -0
- package/dist/validation/use-case-scripts/index.d.ts +27 -0
- package/dist/validation/use-case-scripts/index.d.ts.map +1 -0
- package/dist/validation/use-case-scripts/index.js +52 -0
- package/dist/validation/use-case-scripts/index.js.map +1 -0
- package/dist/validation/use-case-scripts/integration-inheritance.d.ts +35 -0
- package/dist/validation/use-case-scripts/integration-inheritance.d.ts.map +1 -0
- package/dist/validation/use-case-scripts/integration-inheritance.js +348 -0
- package/dist/validation/use-case-scripts/integration-inheritance.js.map +1 -0
- package/dist/validation/use-case-scripts/schema-types.d.ts +21 -0
- package/dist/validation/use-case-scripts/schema-types.d.ts.map +1 -0
- package/dist/validation/use-case-scripts/schema-types.js +134 -0
- package/dist/validation/use-case-scripts/schema-types.js.map +1 -0
- package/dist/validation/use-case-scripts/skill-consistency.d.ts +21 -0
- package/dist/validation/use-case-scripts/skill-consistency.d.ts.map +1 -0
- package/dist/validation/use-case-scripts/skill-consistency.js +180 -0
- package/dist/validation/use-case-scripts/skill-consistency.js.map +1 -0
- package/dist/validation/use-case-scripts/subworkflow-references.d.ts +22 -0
- package/dist/validation/use-case-scripts/subworkflow-references.d.ts.map +1 -0
- package/dist/validation/use-case-scripts/subworkflow-references.js +139 -0
- package/dist/validation/use-case-scripts/subworkflow-references.js.map +1 -0
- package/dist/validation/use-case-scripts/trigger-type-consistency.d.ts +25 -0
- package/dist/validation/use-case-scripts/trigger-type-consistency.d.ts.map +1 -0
- package/dist/validation/use-case-scripts/trigger-type-consistency.js +265 -0
- package/dist/validation/use-case-scripts/trigger-type-consistency.js.map +1 -0
- package/dist/validation/use-case-scripts/trigger-types.d.ts +20 -0
- package/dist/validation/use-case-scripts/trigger-types.d.ts.map +1 -0
- package/dist/validation/use-case-scripts/trigger-types.js +177 -0
- package/dist/validation/use-case-scripts/trigger-types.js.map +1 -0
- package/dist/validation/use-case-scripts/triggers-required.d.ts +23 -0
- package/dist/validation/use-case-scripts/triggers-required.d.ts.map +1 -0
- package/dist/validation/use-case-scripts/triggers-required.js +111 -0
- package/dist/validation/use-case-scripts/triggers-required.js.map +1 -0
- package/dist/validation/use-case-scripts/webhook-path-consistency.d.ts +28 -0
- package/dist/validation/use-case-scripts/webhook-path-consistency.d.ts.map +1 -0
- package/dist/validation/use-case-scripts/webhook-path-consistency.js +288 -0
- package/dist/validation/use-case-scripts/webhook-path-consistency.js.map +1 -0
- package/dist/validation/use-case-scripts/workflow-imports.d.ts +16 -0
- package/dist/validation/use-case-scripts/workflow-imports.d.ts.map +1 -0
- package/dist/validation/use-case-scripts/workflow-imports.js +206 -0
- package/dist/validation/use-case-scripts/workflow-imports.js.map +1 -0
- package/dist/validation/workflow-scripts/credential-placeholders.d.ts +21 -0
- package/dist/validation/workflow-scripts/credential-placeholders.d.ts.map +1 -0
- package/dist/validation/workflow-scripts/credential-placeholders.js +278 -0
- package/dist/validation/workflow-scripts/credential-placeholders.js.map +1 -0
- package/dist/validation/workflow-scripts/db-always-output.d.ts +16 -0
- package/dist/validation/workflow-scripts/db-always-output.d.ts.map +1 -0
- package/dist/validation/workflow-scripts/db-always-output.js +95 -0
- package/dist/validation/workflow-scripts/db-always-output.js.map +1 -0
- package/dist/validation/workflow-scripts/exec-workflow-wait.d.ts +15 -0
- package/dist/validation/workflow-scripts/exec-workflow-wait.d.ts.map +1 -0
- package/dist/validation/workflow-scripts/exec-workflow-wait.js +85 -0
- package/dist/validation/workflow-scripts/exec-workflow-wait.js.map +1 -0
- package/dist/validation/workflow-scripts/index.d.ts +31 -0
- package/dist/validation/workflow-scripts/index.d.ts.map +1 -0
- package/dist/validation/workflow-scripts/index.js +58 -0
- package/dist/validation/workflow-scripts/index.js.map +1 -0
- package/dist/validation/workflow-scripts/instparm-quoting.d.ts +21 -0
- package/dist/validation/workflow-scripts/instparm-quoting.d.ts.map +1 -0
- package/dist/validation/workflow-scripts/instparm-quoting.js +59 -0
- package/dist/validation/workflow-scripts/instparm-quoting.js.map +1 -0
- package/dist/validation/workflow-scripts/llm-model-id.d.ts +17 -0
- package/dist/validation/workflow-scripts/llm-model-id.d.ts.map +1 -0
- package/dist/validation/workflow-scripts/llm-model-id.js +171 -0
- package/dist/validation/workflow-scripts/llm-model-id.js.map +1 -0
- package/dist/validation/workflow-scripts/llm-output-access.d.ts +23 -0
- package/dist/validation/workflow-scripts/llm-output-access.d.ts.map +1 -0
- package/dist/validation/workflow-scripts/llm-output-access.js +274 -0
- package/dist/validation/workflow-scripts/llm-output-access.js.map +1 -0
- package/dist/validation/workflow-scripts/merge-before-terminal.d.ts +20 -0
- package/dist/validation/workflow-scripts/merge-before-terminal.d.ts.map +1 -0
- package/dist/validation/workflow-scripts/merge-before-terminal.js +87 -0
- package/dist/validation/workflow-scripts/merge-before-terminal.js.map +1 -0
- package/dist/validation/workflow-scripts/placeholder-syntax.d.ts +29 -0
- package/dist/validation/workflow-scripts/placeholder-syntax.d.ts.map +1 -0
- package/dist/validation/workflow-scripts/placeholder-syntax.js +154 -0
- package/dist/validation/workflow-scripts/placeholder-syntax.js.map +1 -0
- package/dist/validation/workflow-scripts/retry-backoff.d.ts +16 -0
- package/dist/validation/workflow-scripts/retry-backoff.d.ts.map +1 -0
- package/dist/validation/workflow-scripts/retry-backoff.js +197 -0
- package/dist/validation/workflow-scripts/retry-backoff.js.map +1 -0
- package/dist/validation/workflow-scripts/webhook-id.d.ts +17 -0
- package/dist/validation/workflow-scripts/webhook-id.d.ts.map +1 -0
- package/dist/validation/workflow-scripts/webhook-id.js +79 -0
- package/dist/validation/workflow-scripts/webhook-id.js.map +1 -0
- package/dist/validation/workflow-scripts/workflow-format.d.ts +16 -0
- package/dist/validation/workflow-scripts/workflow-format.d.ts.map +1 -0
- package/dist/validation/workflow-scripts/workflow-format.js +51 -0
- package/dist/validation/workflow-scripts/workflow-format.js.map +1 -0
- package/dist/validation/workflow-scripts/workflow-sanitization.d.ts +21 -0
- package/dist/validation/workflow-scripts/workflow-sanitization.d.ts.map +1 -0
- package/dist/validation/workflow-scripts/workflow-sanitization.js +78 -0
- package/dist/validation/workflow-scripts/workflow-sanitization.js.map +1 -0
- package/dist/validation/workflow-scripts/workflow-settings.d.ts +19 -0
- package/dist/validation/workflow-scripts/workflow-settings.d.ts.map +1 -0
- package/dist/validation/workflow-scripts/workflow-settings.js +131 -0
- package/dist/validation/workflow-scripts/workflow-settings.js.map +1 -0
- package/package.json +64 -0
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Script: SKILL-CONSISTENCY
|
|
3
|
+
*
|
|
4
|
+
* Validates skill files in the skills/ directory follow the Claude Agent Skills format:
|
|
5
|
+
* - Each subdirectory must contain a SKILL.md file
|
|
6
|
+
* - SKILL.md must have valid YAML frontmatter (name, description, workflowTemplateId)
|
|
7
|
+
* - name must follow Claude spec: max 64 chars, lowercase+numbers+hyphens, no reserved words
|
|
8
|
+
* - description must be non-empty, max 1024 chars
|
|
9
|
+
* - workflowTemplateId must reference an existing workflow
|
|
10
|
+
* - No duplicate names or workflowTemplateIds
|
|
11
|
+
*
|
|
12
|
+
* Skills folder is optional — no error if missing.
|
|
13
|
+
*/
|
|
14
|
+
import { existsSync, readdirSync, readFileSync, statSync } from 'fs';
|
|
15
|
+
import { join, basename } from 'path';
|
|
16
|
+
import { parseSkillFrontmatter } from '../../utils/skill-parser.js';
|
|
17
|
+
export const metadata = {
|
|
18
|
+
id: 'SKILL-CONSISTENCY',
|
|
19
|
+
name: 'skill_consistency',
|
|
20
|
+
severity: 'must',
|
|
21
|
+
description: 'Skill files must follow Claude Agent Skills format with valid frontmatter and workflow references',
|
|
22
|
+
details: 'Each skill directory must contain a SKILL.md with name, description, and workflowTemplateId in YAML frontmatter',
|
|
23
|
+
category: 'skills',
|
|
24
|
+
};
|
|
25
|
+
const MAX_NAME_LENGTH = 64;
|
|
26
|
+
const MAX_DESCRIPTION_LENGTH = 1024;
|
|
27
|
+
const NAME_PATTERN = /^[a-z0-9-]+$/;
|
|
28
|
+
const RESERVED_WORDS = ['anthropic', 'claude'];
|
|
29
|
+
/**
|
|
30
|
+
* Check skill consistency across the use case
|
|
31
|
+
*/
|
|
32
|
+
export async function checkSkillConsistency(useCasePath) {
|
|
33
|
+
const findings = [];
|
|
34
|
+
const skillsPath = join(useCasePath, 'skills');
|
|
35
|
+
// Skills folder is optional
|
|
36
|
+
if (!existsSync(skillsPath)) {
|
|
37
|
+
return findings;
|
|
38
|
+
}
|
|
39
|
+
// Collect known workflow template IDs from workflows/ folder
|
|
40
|
+
const workflowsPath = join(useCasePath, 'workflows');
|
|
41
|
+
const knownTemplateIds = existsSync(workflowsPath)
|
|
42
|
+
? readdirSync(workflowsPath)
|
|
43
|
+
.filter(f => f.endsWith('.json'))
|
|
44
|
+
.map(f => basename(f, '.json'))
|
|
45
|
+
: [];
|
|
46
|
+
const entries = readdirSync(skillsPath);
|
|
47
|
+
const seenNames = new Set();
|
|
48
|
+
const seenWorkflowIds = new Set();
|
|
49
|
+
for (const entry of entries) {
|
|
50
|
+
const entryPath = join(skillsPath, entry);
|
|
51
|
+
// Only check directories
|
|
52
|
+
if (!statSync(entryPath).isDirectory()) {
|
|
53
|
+
continue;
|
|
54
|
+
}
|
|
55
|
+
const skillMdPath = join(entryPath, 'SKILL.md');
|
|
56
|
+
const relativePath = `skills/${entry}/SKILL.md`;
|
|
57
|
+
// SKILL-STRUCTURE: Directory must contain SKILL.md
|
|
58
|
+
if (!existsSync(skillMdPath)) {
|
|
59
|
+
findings.push({
|
|
60
|
+
rule: 'SKILL-STRUCTURE',
|
|
61
|
+
severity: 'must',
|
|
62
|
+
path: entryPath,
|
|
63
|
+
message: `${relativePath}: skill directory '${entry}' is missing a SKILL.md file`,
|
|
64
|
+
});
|
|
65
|
+
continue;
|
|
66
|
+
}
|
|
67
|
+
const content = readFileSync(skillMdPath, 'utf-8');
|
|
68
|
+
const { frontmatter } = parseSkillFrontmatter(content);
|
|
69
|
+
// SKILL-FRONTMATTER: Must have valid frontmatter
|
|
70
|
+
if (!frontmatter.name && !frontmatter.description && !frontmatter.workflowTemplateId) {
|
|
71
|
+
findings.push({
|
|
72
|
+
rule: 'SKILL-FRONTMATTER',
|
|
73
|
+
severity: 'must',
|
|
74
|
+
path: skillMdPath,
|
|
75
|
+
message: `${relativePath}: missing or empty YAML frontmatter`,
|
|
76
|
+
});
|
|
77
|
+
continue;
|
|
78
|
+
}
|
|
79
|
+
// SKILL-NAME-FORMAT: name validation (Claude spec)
|
|
80
|
+
if (!frontmatter.name) {
|
|
81
|
+
findings.push({
|
|
82
|
+
rule: 'SKILL-NAME-FORMAT',
|
|
83
|
+
severity: 'must',
|
|
84
|
+
path: skillMdPath,
|
|
85
|
+
message: `${relativePath}: missing required 'name' in frontmatter`,
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
if (frontmatter.name.length > MAX_NAME_LENGTH) {
|
|
90
|
+
findings.push({
|
|
91
|
+
rule: 'SKILL-NAME-FORMAT',
|
|
92
|
+
severity: 'must',
|
|
93
|
+
path: skillMdPath,
|
|
94
|
+
message: `${relativePath}: name '${frontmatter.name}' exceeds ${MAX_NAME_LENGTH} characters`,
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
if (!NAME_PATTERN.test(frontmatter.name)) {
|
|
98
|
+
findings.push({
|
|
99
|
+
rule: 'SKILL-NAME-FORMAT',
|
|
100
|
+
severity: 'must',
|
|
101
|
+
path: skillMdPath,
|
|
102
|
+
message: `${relativePath}: name '${frontmatter.name}' must contain only lowercase letters, numbers, and hyphens`,
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
for (const reserved of RESERVED_WORDS) {
|
|
106
|
+
if (frontmatter.name.includes(reserved)) {
|
|
107
|
+
findings.push({
|
|
108
|
+
rule: 'SKILL-NAME-FORMAT',
|
|
109
|
+
severity: 'must',
|
|
110
|
+
path: skillMdPath,
|
|
111
|
+
message: `${relativePath}: name '${frontmatter.name}' contains reserved word '${reserved}'`,
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
// SKILL-DUPLICATE: Check for duplicate names
|
|
116
|
+
if (seenNames.has(frontmatter.name)) {
|
|
117
|
+
findings.push({
|
|
118
|
+
rule: 'SKILL-DUPLICATE',
|
|
119
|
+
severity: 'must',
|
|
120
|
+
path: skillMdPath,
|
|
121
|
+
message: `${relativePath}: duplicate skill name '${frontmatter.name}'`,
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
seenNames.add(frontmatter.name);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
// SKILL-DESCRIPTION: description validation
|
|
129
|
+
if (!frontmatter.description) {
|
|
130
|
+
findings.push({
|
|
131
|
+
rule: 'SKILL-DESCRIPTION',
|
|
132
|
+
severity: 'should',
|
|
133
|
+
path: skillMdPath,
|
|
134
|
+
message: `${relativePath}: missing 'description' in frontmatter`,
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
else if (frontmatter.description.length > MAX_DESCRIPTION_LENGTH) {
|
|
138
|
+
findings.push({
|
|
139
|
+
rule: 'SKILL-DESCRIPTION',
|
|
140
|
+
severity: 'must',
|
|
141
|
+
path: skillMdPath,
|
|
142
|
+
message: `${relativePath}: description exceeds ${MAX_DESCRIPTION_LENGTH} characters`,
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
// SKILL-WORKFLOW-REF: workflowTemplateId validation
|
|
146
|
+
if (!frontmatter.workflowTemplateId) {
|
|
147
|
+
findings.push({
|
|
148
|
+
rule: 'SKILL-WORKFLOW-REF',
|
|
149
|
+
severity: 'must',
|
|
150
|
+
path: skillMdPath,
|
|
151
|
+
message: `${relativePath}: missing required 'workflowTemplateId' in frontmatter`,
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
else {
|
|
155
|
+
if (knownTemplateIds.length > 0 && !knownTemplateIds.includes(frontmatter.workflowTemplateId)) {
|
|
156
|
+
findings.push({
|
|
157
|
+
rule: 'SKILL-WORKFLOW-REF',
|
|
158
|
+
severity: 'must',
|
|
159
|
+
path: skillMdPath,
|
|
160
|
+
message: `${relativePath}: workflowTemplateId '${frontmatter.workflowTemplateId}' does not match any workflow file`,
|
|
161
|
+
raw_details: `Known workflows: ${knownTemplateIds.join(', ')}`,
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
// SKILL-DUPLICATE: Check for duplicate workflowTemplateIds
|
|
165
|
+
if (seenWorkflowIds.has(frontmatter.workflowTemplateId)) {
|
|
166
|
+
findings.push({
|
|
167
|
+
rule: 'SKILL-DUPLICATE',
|
|
168
|
+
severity: 'must',
|
|
169
|
+
path: skillMdPath,
|
|
170
|
+
message: `${relativePath}: duplicate workflowTemplateId '${frontmatter.workflowTemplateId}'`,
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
else {
|
|
174
|
+
seenWorkflowIds.add(frontmatter.workflowTemplateId);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
return findings;
|
|
179
|
+
}
|
|
180
|
+
//# sourceMappingURL=skill-consistency.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-consistency.js","sourceRoot":"","sources":["../../../src/validation/use-case-scripts/skill-consistency.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SUBWKFL-REFERENCES Validation Script
|
|
3
|
+
*
|
|
4
|
+
* Validates that all SUBWKFL_ placeholders in workflow files
|
|
5
|
+
* reference existing workflowTemplateId values defined in config.ts
|
|
6
|
+
*
|
|
7
|
+
* @see .guides/specific/placeholder-patterns.md - "Sub-Workflow References (SUBWKFL)"
|
|
8
|
+
*/
|
|
9
|
+
import type { Finding, RuleMetadata } from '../types.js';
|
|
10
|
+
export declare const RULE_ID = "SUBWKFL-REFERENCES";
|
|
11
|
+
export declare const metadata: RuleMetadata & {
|
|
12
|
+
guideRef: {
|
|
13
|
+
path: string;
|
|
14
|
+
section: string;
|
|
15
|
+
};
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* Validates that all SUBWKFL_ placeholders reference existing template IDs
|
|
19
|
+
*/
|
|
20
|
+
export declare function checkSubworkflowReferences(useCasePath: string): Promise<Finding[]>;
|
|
21
|
+
export default checkSubworkflowReferences;
|
|
22
|
+
//# sourceMappingURL=subworkflow-references.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subworkflow-references.d.ts","sourceRoot":"","sources":["../../../src/validation/use-case-scripts/subworkflow-references.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEzD,eAAO,MAAM,OAAO,uBAAuB,CAAC;AAE5C,eAAO,MAAM,QAAQ,EAAE,YAAY,GAAG;IAAE,QAAQ,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAA;CAYlF,CAAC;AAuCF;;GAEG;AACH,wBAAsB,0BAA0B,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAuFxF;AAED,eAAe,0BAA0B,CAAC"}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SUBWKFL-REFERENCES Validation Script
|
|
3
|
+
*
|
|
4
|
+
* Validates that all SUBWKFL_ placeholders in workflow files
|
|
5
|
+
* reference existing workflowTemplateId values defined in config.ts
|
|
6
|
+
*
|
|
7
|
+
* @see .guides/specific/placeholder-patterns.md - "Sub-Workflow References (SUBWKFL)"
|
|
8
|
+
*/
|
|
9
|
+
import { readFileSync, readdirSync, existsSync } from 'fs';
|
|
10
|
+
import { join } from 'path';
|
|
11
|
+
export const RULE_ID = 'SUBWKFL-REFERENCES';
|
|
12
|
+
export const metadata = {
|
|
13
|
+
id: RULE_ID,
|
|
14
|
+
name: 'subworkflow_references',
|
|
15
|
+
severity: 'must',
|
|
16
|
+
description: 'SUBWKFL placeholders must reference existing workflow template IDs',
|
|
17
|
+
details: 'Each {{SUBWKFL_<TEMPLATE_ID>_LFKWBUS}} placeholder must reference a workflowTemplateId defined in config.ts',
|
|
18
|
+
fixable: false,
|
|
19
|
+
category: 'references',
|
|
20
|
+
guideRef: {
|
|
21
|
+
path: 'specific/placeholder-patterns.md',
|
|
22
|
+
section: 'Sub-Workflow References (SUBWKFL)',
|
|
23
|
+
},
|
|
24
|
+
};
|
|
25
|
+
// Regex to find SUBWKFL placeholders
|
|
26
|
+
const SUBWKFL_PATTERN = /\{\{SUBWKFL_([a-zA-Z0-9_-]+)_LFKWBUS\}\}/g;
|
|
27
|
+
// Regex to extract workflowTemplateId from config.ts
|
|
28
|
+
const TEMPLATE_ID_PATTERN = /workflowTemplateId:\s*['"]([^'"]+)['"]/g;
|
|
29
|
+
/**
|
|
30
|
+
* Extracts all workflowTemplateId values from config.ts content
|
|
31
|
+
*/
|
|
32
|
+
function extractTemplateIds(configContent) {
|
|
33
|
+
const templateIds = [];
|
|
34
|
+
let match;
|
|
35
|
+
while ((match = TEMPLATE_ID_PATTERN.exec(configContent)) !== null) {
|
|
36
|
+
templateIds.push(match[1]);
|
|
37
|
+
}
|
|
38
|
+
return templateIds;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Extracts all SUBWKFL_ references from workflow content
|
|
42
|
+
*/
|
|
43
|
+
function extractSubworkflowReferences(content) {
|
|
44
|
+
const references = [];
|
|
45
|
+
let match;
|
|
46
|
+
// Reset regex state
|
|
47
|
+
SUBWKFL_PATTERN.lastIndex = 0;
|
|
48
|
+
while ((match = SUBWKFL_PATTERN.exec(content)) !== null) {
|
|
49
|
+
references.push(match[1]);
|
|
50
|
+
}
|
|
51
|
+
return references;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Validates that all SUBWKFL_ placeholders reference existing template IDs
|
|
55
|
+
*/
|
|
56
|
+
export async function checkSubworkflowReferences(useCasePath) {
|
|
57
|
+
const findings = [];
|
|
58
|
+
// Check if config.ts exists
|
|
59
|
+
const configPath = join(useCasePath, 'config.ts');
|
|
60
|
+
if (!existsSync(configPath)) {
|
|
61
|
+
findings.push({
|
|
62
|
+
rule: RULE_ID,
|
|
63
|
+
severity: 'must',
|
|
64
|
+
path: useCasePath,
|
|
65
|
+
message: 'Cannot find config.ts in use-case folder',
|
|
66
|
+
raw_details: 'Ensure config.ts exists in the use-case root folder',
|
|
67
|
+
guideRef: metadata.guideRef,
|
|
68
|
+
});
|
|
69
|
+
return findings;
|
|
70
|
+
}
|
|
71
|
+
// Read config.ts and extract template IDs
|
|
72
|
+
let configContent;
|
|
73
|
+
try {
|
|
74
|
+
configContent = readFileSync(configPath, 'utf-8');
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
findings.push({
|
|
78
|
+
rule: RULE_ID,
|
|
79
|
+
severity: 'must',
|
|
80
|
+
path: configPath,
|
|
81
|
+
message: 'Cannot read config.ts',
|
|
82
|
+
raw_details: 'Ensure config.ts is readable',
|
|
83
|
+
guideRef: metadata.guideRef,
|
|
84
|
+
});
|
|
85
|
+
return findings;
|
|
86
|
+
}
|
|
87
|
+
const templateIds = extractTemplateIds(configContent);
|
|
88
|
+
// Check workflows folder
|
|
89
|
+
const workflowsPath = join(useCasePath, 'workflows');
|
|
90
|
+
if (!existsSync(workflowsPath)) {
|
|
91
|
+
// No workflows folder - nothing to validate
|
|
92
|
+
return findings;
|
|
93
|
+
}
|
|
94
|
+
// Get all workflow JSON files
|
|
95
|
+
let workflowFiles;
|
|
96
|
+
try {
|
|
97
|
+
workflowFiles = readdirSync(workflowsPath)
|
|
98
|
+
.filter(f => f.endsWith('.json'))
|
|
99
|
+
.map(f => join(workflowsPath, f));
|
|
100
|
+
}
|
|
101
|
+
catch {
|
|
102
|
+
findings.push({
|
|
103
|
+
rule: RULE_ID,
|
|
104
|
+
severity: 'must',
|
|
105
|
+
path: workflowsPath,
|
|
106
|
+
message: 'Cannot read workflows folder',
|
|
107
|
+
raw_details: 'Ensure workflows folder is readable',
|
|
108
|
+
guideRef: metadata.guideRef,
|
|
109
|
+
});
|
|
110
|
+
return findings;
|
|
111
|
+
}
|
|
112
|
+
// Check each workflow file for SUBWKFL_ references
|
|
113
|
+
for (const workflowFile of workflowFiles) {
|
|
114
|
+
let content;
|
|
115
|
+
try {
|
|
116
|
+
content = readFileSync(workflowFile, 'utf-8');
|
|
117
|
+
}
|
|
118
|
+
catch {
|
|
119
|
+
continue; // Skip unreadable files
|
|
120
|
+
}
|
|
121
|
+
const references = extractSubworkflowReferences(content);
|
|
122
|
+
// Validate each reference
|
|
123
|
+
for (const ref of references) {
|
|
124
|
+
if (!templateIds.includes(ref)) {
|
|
125
|
+
findings.push({
|
|
126
|
+
rule: RULE_ID,
|
|
127
|
+
severity: 'must',
|
|
128
|
+
path: workflowFile,
|
|
129
|
+
message: `SUBWKFL placeholder references unknown template ID: "${ref}"`,
|
|
130
|
+
raw_details: `The placeholder {{SUBWKFL_${ref}_LFKWBUS}} references a template ID that doesn't exist in config.ts. Available template IDs: ${templateIds.join(', ') || '(none)'}`,
|
|
131
|
+
guideRef: metadata.guideRef,
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
return findings;
|
|
137
|
+
}
|
|
138
|
+
export default checkSubworkflowReferences;
|
|
139
|
+
//# sourceMappingURL=subworkflow-references.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subworkflow-references.js","sourceRoot":"","sources":["../../../src/validation/use-case-scripts/subworkflow-references.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TRIGGER-TYPE-CONSISTENCY Validation Script
|
|
3
|
+
*
|
|
4
|
+
* Validates that the trigger type declared in config.ts matches the actual
|
|
5
|
+
* trigger node type found in the corresponding workflow JSON file.
|
|
6
|
+
*
|
|
7
|
+
* For example, if config.ts declares type: 'http', the workflow must contain
|
|
8
|
+
* a webhook node, not a scheduleTrigger or a service-specific trigger node.
|
|
9
|
+
*
|
|
10
|
+
* @see .guides/specific/third-party-triggers.md - "Config.ts for Third-Party Triggered Workflows"
|
|
11
|
+
*/
|
|
12
|
+
import type { Finding, RuleMetadata } from '../types.js';
|
|
13
|
+
export declare const RULE_ID = "TRIGGER-TYPE-CONSISTENCY";
|
|
14
|
+
export declare const metadata: RuleMetadata & {
|
|
15
|
+
guideRef: {
|
|
16
|
+
path: string;
|
|
17
|
+
section: string;
|
|
18
|
+
};
|
|
19
|
+
};
|
|
20
|
+
/**
|
|
21
|
+
* Validates that trigger types in config.ts match the workflow trigger nodes.
|
|
22
|
+
*/
|
|
23
|
+
export declare function checkTriggerTypeConsistency(useCasePath: string): Promise<Finding[]>;
|
|
24
|
+
export default checkTriggerTypeConsistency;
|
|
25
|
+
//# sourceMappingURL=trigger-type-consistency.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trigger-type-consistency.d.ts","sourceRoot":"","sources":["../../../src/validation/use-case-scripts/trigger-type-consistency.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEzD,eAAO,MAAM,OAAO,6BAA6B,CAAC;AAElD,eAAO,MAAM,QAAQ,EAAE,YAAY,GAAG;IAAE,QAAQ,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAA;CAclF,CAAC;AAqMF;;GAEG;AACH,wBAAsB,2BAA2B,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAmFzF;AAED,eAAe,2BAA2B,CAAC"}
|
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TRIGGER-TYPE-CONSISTENCY Validation Script
|
|
3
|
+
*
|
|
4
|
+
* Validates that the trigger type declared in config.ts matches the actual
|
|
5
|
+
* trigger node type found in the corresponding workflow JSON file.
|
|
6
|
+
*
|
|
7
|
+
* For example, if config.ts declares type: 'http', the workflow must contain
|
|
8
|
+
* a webhook node, not a scheduleTrigger or a service-specific trigger node.
|
|
9
|
+
*
|
|
10
|
+
* @see .guides/specific/third-party-triggers.md - "Config.ts for Third-Party Triggered Workflows"
|
|
11
|
+
*/
|
|
12
|
+
import { readFileSync, readdirSync, existsSync } from 'fs';
|
|
13
|
+
import { join, basename } from 'path';
|
|
14
|
+
export const RULE_ID = 'TRIGGER-TYPE-CONSISTENCY';
|
|
15
|
+
export const metadata = {
|
|
16
|
+
id: RULE_ID,
|
|
17
|
+
name: 'trigger_type_consistency',
|
|
18
|
+
severity: 'must',
|
|
19
|
+
description: 'Config trigger type must match the actual trigger node in the workflow',
|
|
20
|
+
details: 'The trigger type in config.ts (http, schedule, subworkflow, service_event) must be consistent ' +
|
|
21
|
+
'with the trigger node found in the workflow JSON. A mismatch causes runtime failures.',
|
|
22
|
+
fixable: false,
|
|
23
|
+
category: 'triggers',
|
|
24
|
+
guideRef: {
|
|
25
|
+
path: 'specific/third-party-triggers.md',
|
|
26
|
+
section: 'Config.ts for Third-Party Triggered Workflows',
|
|
27
|
+
},
|
|
28
|
+
};
|
|
29
|
+
const GUIDE_REF = {
|
|
30
|
+
path: 'specific/third-party-triggers.md',
|
|
31
|
+
section: 'Config.ts for Third-Party Triggered Workflows',
|
|
32
|
+
};
|
|
33
|
+
/**
|
|
34
|
+
* Known trigger node types and their categories
|
|
35
|
+
*/
|
|
36
|
+
const WEBHOOK_NODE = 'n8n-nodes-base.webhook';
|
|
37
|
+
const SCHEDULE_NODE = 'n8n-nodes-base.scheduleTrigger';
|
|
38
|
+
const EXECUTE_WORKFLOW_TRIGGER_NODE = 'n8n-nodes-base.executeWorkflowTrigger';
|
|
39
|
+
/**
|
|
40
|
+
* Determines the trigger category from an n8n node type string.
|
|
41
|
+
*/
|
|
42
|
+
function categorizeNodeType(nodeType) {
|
|
43
|
+
if (nodeType === WEBHOOK_NODE)
|
|
44
|
+
return 'webhook';
|
|
45
|
+
if (nodeType === SCHEDULE_NODE)
|
|
46
|
+
return 'schedule';
|
|
47
|
+
if (nodeType.toLowerCase().includes('executeworkflowtrigger'))
|
|
48
|
+
return 'subworkflow';
|
|
49
|
+
// Any other node whose type contains "Trigger" (case-insensitive) is a service trigger
|
|
50
|
+
if (/trigger/i.test(nodeType))
|
|
51
|
+
return 'service_trigger';
|
|
52
|
+
return 'unknown';
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Determines the primary trigger category for a workflow.
|
|
56
|
+
* Non-webhook triggers take precedence over webhook triggers
|
|
57
|
+
* (a workflow might have both a service trigger and a webhook).
|
|
58
|
+
*/
|
|
59
|
+
function getPrimaryTriggerCategory(triggers) {
|
|
60
|
+
if (triggers.length === 0)
|
|
61
|
+
return null;
|
|
62
|
+
// Prefer non-webhook, non-unknown triggers
|
|
63
|
+
const primary = triggers.find(t => t.category !== 'webhook' && t.category !== 'unknown');
|
|
64
|
+
if (primary)
|
|
65
|
+
return primary;
|
|
66
|
+
// Fall back to webhook
|
|
67
|
+
const webhook = triggers.find(t => t.category === 'webhook');
|
|
68
|
+
if (webhook)
|
|
69
|
+
return webhook;
|
|
70
|
+
return triggers[0];
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Extracts trigger type declarations from config.ts per workflow.
|
|
74
|
+
*/
|
|
75
|
+
function extractConfigTriggerTypes(configContent) {
|
|
76
|
+
const results = [];
|
|
77
|
+
const templateIdPattern = /workflowTemplateId:\s*['"]([^'"]+)['"]/g;
|
|
78
|
+
let templateMatch;
|
|
79
|
+
while ((templateMatch = templateIdPattern.exec(configContent)) !== null) {
|
|
80
|
+
const templateId = templateMatch[1];
|
|
81
|
+
const templateIdEndPos = templateMatch.index + templateMatch[0].length;
|
|
82
|
+
// Find the end of this workflow block
|
|
83
|
+
const nextTemplatePattern = /workflowTemplateId:/g;
|
|
84
|
+
nextTemplatePattern.lastIndex = templateIdEndPos;
|
|
85
|
+
const nextMatch = nextTemplatePattern.exec(configContent);
|
|
86
|
+
const blockEnd = nextMatch ? nextMatch.index : configContent.length;
|
|
87
|
+
const workflowBlock = configContent.slice(templateMatch.index, blockEnd);
|
|
88
|
+
// Find triggers array in this block
|
|
89
|
+
const triggersMatch = workflowBlock.match(/triggers:\s*\[([\s\S]*?)\]/);
|
|
90
|
+
if (!triggersMatch)
|
|
91
|
+
continue;
|
|
92
|
+
const triggersContent = triggersMatch[1];
|
|
93
|
+
if (triggersContent.trim().length === 0)
|
|
94
|
+
continue;
|
|
95
|
+
// Extract trigger type values
|
|
96
|
+
const triggerTypes = [];
|
|
97
|
+
const typePattern = /type:\s*['"]([^'"]+)['"]/g;
|
|
98
|
+
let typeMatch;
|
|
99
|
+
typePattern.lastIndex = 0;
|
|
100
|
+
while ((typeMatch = typePattern.exec(triggersContent)) !== null) {
|
|
101
|
+
triggerTypes.push(typeMatch[1]);
|
|
102
|
+
}
|
|
103
|
+
if (triggerTypes.length > 0) {
|
|
104
|
+
results.push({ workflowTemplateId: templateId, triggerTypes });
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
return results;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Extracts trigger nodes from a workflow JSON.
|
|
111
|
+
*/
|
|
112
|
+
function extractWorkflowTriggers(workflowContent) {
|
|
113
|
+
const triggers = [];
|
|
114
|
+
try {
|
|
115
|
+
const workflow = JSON.parse(workflowContent);
|
|
116
|
+
for (const node of workflow.nodes || []) {
|
|
117
|
+
const category = categorizeNodeType(node.type || '');
|
|
118
|
+
if (category !== 'unknown') {
|
|
119
|
+
triggers.push({
|
|
120
|
+
nodeType: node.type,
|
|
121
|
+
nodeName: node.name || node.type,
|
|
122
|
+
category,
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
catch {
|
|
128
|
+
// Invalid JSON — other validators handle this
|
|
129
|
+
}
|
|
130
|
+
return triggers;
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Checks whether a config trigger type is compatible with the detected workflow trigger.
|
|
134
|
+
* Returns an error message if incompatible, null if compatible.
|
|
135
|
+
*/
|
|
136
|
+
function checkCompatibility(configType, primaryTrigger) {
|
|
137
|
+
const { category } = primaryTrigger;
|
|
138
|
+
switch (configType) {
|
|
139
|
+
case 'http':
|
|
140
|
+
// http config type requires a webhook node
|
|
141
|
+
if (category !== 'webhook') {
|
|
142
|
+
return `Config declares type 'http' but the workflow's primary trigger is a ${category} node (${primaryTrigger.nodeType}). ` +
|
|
143
|
+
`Use type: '${suggestConfigType(category)}' instead.`;
|
|
144
|
+
}
|
|
145
|
+
return null;
|
|
146
|
+
case 'schedule':
|
|
147
|
+
// schedule config type requires a scheduleTrigger node
|
|
148
|
+
if (category !== 'schedule') {
|
|
149
|
+
return `Config declares type 'schedule' but the workflow's primary trigger is a ${category} node (${primaryTrigger.nodeType}). ` +
|
|
150
|
+
`Use type: '${suggestConfigType(category)}' instead.`;
|
|
151
|
+
}
|
|
152
|
+
return null;
|
|
153
|
+
case 'subworkflow':
|
|
154
|
+
// subworkflow config type requires an executeWorkflowTrigger node
|
|
155
|
+
if (category !== 'subworkflow') {
|
|
156
|
+
return `Config declares type 'subworkflow' but the workflow's primary trigger is a ${category} node (${primaryTrigger.nodeType}). ` +
|
|
157
|
+
`Use type: '${suggestConfigType(category)}' instead.`;
|
|
158
|
+
}
|
|
159
|
+
return null;
|
|
160
|
+
case 'service_event':
|
|
161
|
+
// service_event is flexible — it should NOT be used with webhook, schedule, or subworkflow
|
|
162
|
+
if (category === 'webhook' || category === 'schedule' || category === 'subworkflow') {
|
|
163
|
+
return `Config declares type 'service_event' but the workflow's primary trigger is a ${category} node (${primaryTrigger.nodeType}). ` +
|
|
164
|
+
`Use type: '${suggestConfigType(category)}' instead.`;
|
|
165
|
+
}
|
|
166
|
+
return null;
|
|
167
|
+
default:
|
|
168
|
+
// Unknown config type — don't validate
|
|
169
|
+
return null;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Suggests the correct config type for a given trigger category.
|
|
174
|
+
*/
|
|
175
|
+
function suggestConfigType(category) {
|
|
176
|
+
switch (category) {
|
|
177
|
+
case 'webhook': return 'http';
|
|
178
|
+
case 'schedule': return 'schedule';
|
|
179
|
+
case 'subworkflow': return 'subworkflow';
|
|
180
|
+
case 'service_trigger': return 'service_event';
|
|
181
|
+
default: return 'service_event';
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Validates that trigger types in config.ts match the workflow trigger nodes.
|
|
186
|
+
*/
|
|
187
|
+
export async function checkTriggerTypeConsistency(useCasePath) {
|
|
188
|
+
const findings = [];
|
|
189
|
+
const configPath = join(useCasePath, 'config.ts');
|
|
190
|
+
if (!existsSync(configPath)) {
|
|
191
|
+
return findings;
|
|
192
|
+
}
|
|
193
|
+
let configContent;
|
|
194
|
+
try {
|
|
195
|
+
configContent = readFileSync(configPath, 'utf-8');
|
|
196
|
+
}
|
|
197
|
+
catch {
|
|
198
|
+
return findings;
|
|
199
|
+
}
|
|
200
|
+
const configTriggers = extractConfigTriggerTypes(configContent);
|
|
201
|
+
if (configTriggers.length === 0) {
|
|
202
|
+
return findings;
|
|
203
|
+
}
|
|
204
|
+
// Check workflows folder
|
|
205
|
+
const workflowsPath = join(useCasePath, 'workflows');
|
|
206
|
+
if (!existsSync(workflowsPath)) {
|
|
207
|
+
return findings;
|
|
208
|
+
}
|
|
209
|
+
// Read all workflow files
|
|
210
|
+
let workflowFiles;
|
|
211
|
+
try {
|
|
212
|
+
workflowFiles = readdirSync(workflowsPath)
|
|
213
|
+
.filter(f => f.endsWith('.json'))
|
|
214
|
+
.map(f => join(workflowsPath, f));
|
|
215
|
+
}
|
|
216
|
+
catch {
|
|
217
|
+
return findings;
|
|
218
|
+
}
|
|
219
|
+
// Build a map of templateId -> workflow triggers
|
|
220
|
+
const workflowTriggerMap = new Map();
|
|
221
|
+
for (const workflowFile of workflowFiles) {
|
|
222
|
+
const templateId = basename(workflowFile, '.json');
|
|
223
|
+
let content;
|
|
224
|
+
try {
|
|
225
|
+
content = readFileSync(workflowFile, 'utf-8');
|
|
226
|
+
}
|
|
227
|
+
catch {
|
|
228
|
+
continue;
|
|
229
|
+
}
|
|
230
|
+
workflowTriggerMap.set(templateId, extractWorkflowTriggers(content));
|
|
231
|
+
}
|
|
232
|
+
// Validate each config workflow's trigger types against workflow nodes
|
|
233
|
+
for (const configInfo of configTriggers) {
|
|
234
|
+
const workflowTriggers = workflowTriggerMap.get(configInfo.workflowTemplateId);
|
|
235
|
+
if (!workflowTriggers || workflowTriggers.length === 0) {
|
|
236
|
+
// No workflow file or no trigger nodes — other rules handle this
|
|
237
|
+
continue;
|
|
238
|
+
}
|
|
239
|
+
const primaryTrigger = getPrimaryTriggerCategory(workflowTriggers);
|
|
240
|
+
if (!primaryTrigger)
|
|
241
|
+
continue;
|
|
242
|
+
for (const configType of configInfo.triggerTypes) {
|
|
243
|
+
const error = checkCompatibility(configType, primaryTrigger);
|
|
244
|
+
if (error) {
|
|
245
|
+
findings.push({
|
|
246
|
+
rule: RULE_ID,
|
|
247
|
+
severity: 'must',
|
|
248
|
+
path: configPath,
|
|
249
|
+
message: `Trigger type mismatch in workflow "${configInfo.workflowTemplateId}": ${error}`,
|
|
250
|
+
raw_details: `The config.ts trigger type '${configType}' does not match the workflow's actual trigger node.\n\n` +
|
|
251
|
+
`Workflow trigger node: ${primaryTrigger.nodeType} (${primaryTrigger.nodeName})\n` +
|
|
252
|
+
`Detected category: ${primaryTrigger.category}\n` +
|
|
253
|
+
`Config trigger type: ${configType}\n\n` +
|
|
254
|
+
`Update the trigger type in config.ts to match the workflow's trigger node.\n\n` +
|
|
255
|
+
`See documentation:\n` +
|
|
256
|
+
`- .guides/${GUIDE_REF.path} > "${GUIDE_REF.section}"`,
|
|
257
|
+
guideRef: GUIDE_REF,
|
|
258
|
+
});
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
return findings;
|
|
263
|
+
}
|
|
264
|
+
export default checkTriggerTypeConsistency;
|
|
265
|
+
//# sourceMappingURL=trigger-type-consistency.js.map
|