diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 45936ce..5dae377 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -41,7 +41,9 @@ jobs: echo "::remove-matcher owner=tsc::" npm run verify - name: Consume candidate package through all documentation examples - run: npm run docs:examples -- --evidence .tmp/docs/candidate.json + env: + FLOWKIT_DOCS_EVIDENCE: .tmp/docs/candidate.json + run: npm run docs:examples - name: Keep documentation consumer evidence if: always() uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6 diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index c839992..1a8c29d 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -12,7 +12,7 @@ on: inputs: packageReleaseCommit: { description: 'Original v1.0.0 package commit (40 hex)', required: true, type: string } docsCommit: { description: 'Reviewed documentation commit (40 hex)', required: true, type: string } - version: { description: 'Exact public version', default: '1.0.0', required: true, type: string } + version: { description: 'Exact private package version', default: '1.0.0', required: true, type: string } releaseRunId: { description: 'Original publish workflow run ID', required: true, type: string } releaseRunAttempt: { description: 'Original pack/publish attempt', required: true, type: string } @@ -39,6 +39,7 @@ jobs: permissions: contents: read actions: read + packages: read steps: - name: Checkout original package source uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803 # v6 @@ -57,6 +58,8 @@ jobs: with: node-version: '24.22.1' package-manager-cache: false + registry-url: 'https://npm.pkg.github.com' + scope: '@devcodex-labs' - name: Check exact original checkout working-directory: package-source run: node --input-type=module -e 'import{execFileSync}from"node:child_process";import assert from"node:assert/strict";assert.match(process.env.PACKAGE_COMMIT,/^[a-f0-9]{40}$/);assert.equal(execFileSync("git",["rev-parse","HEAD"],{encoding:"utf8"}).trim(),process.env.PACKAGE_COMMIT);' @@ -85,21 +88,25 @@ jobs: repository: devcodex-labs/flowkit run-id: ${{ inputs.releaseRunId }} - name: Verify immutable candidate and allowed docs repair + env: + NODE_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }} working-directory: package-source run: | node scripts/docs/release-identity.mjs verify --metadata .tmp/source-metadata.json --record .tmp/identity/release-record.json --release-dir .tmp/release --docs-root ../docs-source --out .tmp/docs/deployment-identity.json - node scripts/release.mjs verify --tag v1.0.0 - npm run docs:public-package -- --version 1.0.0 --manifest .tmp/release/release.json --evidence .tmp/docs/public-package.json + node scripts/release.mjs verify --tag "v${RELEASE_VERSION}" + npm run docs:private-package -- --version "$RELEASE_VERSION" --manifest .tmp/release/release.json --evidence .tmp/docs/public-package.json - run: npm ci --ignore-scripts --no-audit --no-fund working-directory: docs-source - run: npm --prefix website ci --ignore-scripts --no-audit --no-fund working-directory: docs-source - - name: Verify repaired tutorials against original public package and build site + - name: Verify repaired tutorials against original private package and build site + env: + NODE_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }} working-directory: docs-source run: | npm run build npm run docs:check - npm run docs:examples -- --registry-version 1.0.0 --manifest ../package-source/.tmp/release/release.json --evidence .tmp/docs/public-consumer.json + npm run docs:examples -- --registry-version "$RELEASE_VERSION" --manifest ../package-source/.tmp/release/release.json --evidence .tmp/docs/public-consumer.json npm run docs:build node --input-type=module -e 'import{readFileSync,writeFileSync}from"node:fs";import{createHash}from"node:crypto";const i=JSON.parse(readFileSync("../package-source/.tmp/docs/deployment-identity.json"));i.websiteLockSha256=createHash("sha256").update(readFileSync("website/package-lock.json")).digest("hex");writeFileSync(".tmp/docs/site-build.json",JSON.stringify(i,null,2));' - uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6 @@ -121,6 +128,8 @@ jobs: path: docs-source/website/doc_build deploy: + # The site may be public; keep deployment gated by explicit release authorization. + if: ${{ vars.FLOWKIT_ENABLE_PAGES_DEPLOY == 'true' }} needs: build runs-on: ubuntu-24.04 permissions: diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index a063b26..fafb3e0 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -1,4 +1,4 @@ -name: Publish npm +name: Publish GitHub Packages on: push: @@ -8,7 +8,7 @@ permissions: contents: read concurrency: - group: npm-${{ github.ref }} + group: github-packages-${{ github.ref }} cancel-in-progress: false jobs: @@ -35,6 +35,8 @@ jobs: pack: needs: checks + outputs: + version: ${{ steps.release_meta.outputs.version }} runs-on: ubuntu-24.04 timeout-minutes: 10 steps: @@ -52,7 +54,9 @@ jobs: RELEASE_TAG: ${{ github.ref_name }} run: npm run release:pack -- --tag "$RELEASE_TAG" - name: Consume the exact candidate bytes - run: npm run docs:examples -- --package .tmp/release/devcodex-flowkit-1.0.0.tgz --evidence .tmp/docs/release-candidate.json + run: | + TARBALL="$(node --input-type=module -e 'import{readFileSync}from"node:fs";console.log(".tmp/release/"+JSON.parse(readFileSync(".tmp/release/release.json","utf8")).filename)')" + npm run docs:examples -- --package "$TARBALL" --evidence .tmp/docs/release-candidate.json - uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6 id: npm-artifact with: @@ -64,15 +68,19 @@ jobs: include-hidden-files: true retention-days: 90 - name: Record immutable package release identity + id: release_meta env: + RELEASE_TAG: ${{ github.ref_name }} PACKAGE_COMMIT: ${{ github.sha }} DOCS_COMMIT: ${{ github.sha }} - RELEASE_VERSION: '1.0.0' RELEASE_RUN_ID: ${{ github.run_id }} RELEASE_RUN_ATTEMPT: ${{ github.run_attempt }} NPM_ARTIFACT_ID: ${{ steps.npm-artifact.outputs.artifact-id }} NPM_ARTIFACT_DIGEST: ${{ steps.npm-artifact.outputs.artifact-digest }} - run: node scripts/docs/release-identity.mjs create --release-dir .tmp/release --out .tmp/release-identity/release-record.json + run: | + export RELEASE_VERSION="${RELEASE_TAG#v}" + echo "version=$RELEASE_VERSION" >> "$GITHUB_OUTPUT" + node scripts/docs/release-identity.mjs create --release-dir .tmp/release --out .tmp/release-identity/release-record.json - uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6 with: name: release-identity-${{ github.run_attempt }} @@ -82,12 +90,14 @@ jobs: retention-days: 90 publish: + # Publishing requires explicit owner approval of the proprietary license. + if: ${{ vars.FLOWKIT_ENABLE_PACKAGE_PUBLISH == 'true' }} needs: pack runs-on: ubuntu-24.04 timeout-minutes: 10 permissions: contents: read - id-token: write + packages: write steps: - uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803 # v6 with: @@ -96,9 +106,9 @@ jobs: with: node-version: '24.22.1' package-manager-cache: false + registry-url: 'https://npm.pkg.github.com' + scope: '@devcodex-labs' - run: npm ci --ignore-scripts --no-audit --no-fund - - name: Select the documented OIDC-capable npm CLI - run: npm install --global npm@11.5.1 --ignore-scripts --no-audit --no-fund - uses: actions/download-artifact@37930b1c2abaa49bbe596cd826c3c89aef350131 # v7 with: name: npm-release-${{ github.run_attempt }} @@ -110,13 +120,19 @@ jobs: run: | node scripts/release.mjs verify --tag "$RELEASE_TAG" node --input-type=module -e 'import {readFileSync,appendFileSync} from "node:fs"; const m=JSON.parse(readFileSync(".tmp/release/release.json","utf8")); appendFileSync(process.env.GITHUB_OUTPUT, `dist_tag=${m.npmTag}\n`);' - - name: Publish the verified tarball through npm trusted publishing + - name: Publish verified tarball to private GitHub Packages env: + NODE_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }} NPM_DIST_TAG: ${{ steps.artifact.outputs.dist_tag }} - run: npm publish .tmp/release/*.tgz --access public --registry=https://registry.npmjs.org/ --tag "$NPM_DIST_TAG" + run: npm publish .tmp/release/*.tgz --registry=https://npm.pkg.github.com/ --tag "$NPM_DIST_TAG" - public-consumer: + private-consumer: needs: publish + permissions: + contents: read + packages: read + env: + NODE_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }} runs-on: ubuntu-24.04 timeout-minutes: 15 steps: @@ -127,34 +143,53 @@ jobs: with: node-version: '24.22.1' package-manager-cache: false + registry-url: 'https://npm.pkg.github.com' + scope: '@devcodex-labs' - run: npm ci --ignore-scripts --no-audit --no-fund - uses: actions/download-artifact@37930b1c2abaa49bbe596cd826c3c89aef350131 # v7 with: name: npm-release-${{ github.run_attempt }} path: .tmp/release - - run: node scripts/release.mjs verify --tag v1.0.0 - - run: npm run docs:public-package -- --version 1.0.0 --manifest .tmp/release/release.json --evidence .tmp/docs/public-package.json - - run: npm run docs:examples -- --registry-version 1.0.0 --manifest .tmp/release/release.json --evidence .tmp/docs/public-consumer.json + - name: Verify published GitHub Package stays private + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: node scripts/docs/check-package-privacy.mjs + - name: Verify original package and private registry + env: + RELEASE_TAG: ${{ github.ref_name }} + run: | + VERSION="${RELEASE_TAG#v}" + node scripts/release.mjs verify --tag "$RELEASE_TAG" + npm run docs:private-package -- --version "$VERSION" --manifest .tmp/release/release.json --evidence .tmp/docs/private-package.json + - name: Run consumer examples against the exact private version + env: + RELEASE_TAG: ${{ github.ref_name }} + run: | + VERSION="${RELEASE_TAG#v}" + npm run docs:examples -- --registry-version "$VERSION" --manifest .tmp/release/release.json --evidence .tmp/docs/private-consumer.json - uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6 if: always() with: - name: public-package-evidence-${{ github.run_attempt }} + name: private-package-evidence-${{ github.run_attempt }} path: .tmp/docs/*.json include-hidden-files: true if-no-files-found: ignore retention-days: 90 docs: - needs: public-consumer + # Public documentation is approved; deploying remains an explicit release action. + if: ${{ vars.FLOWKIT_ENABLE_PAGES_DEPLOY == 'true' }} + needs: [pack, private-consumer] permissions: contents: read actions: read + packages: read pages: write id-token: write uses: ./.github/workflows/docs.yml with: packageReleaseCommit: ${{ github.sha }} docsCommit: ${{ github.sha }} - version: '1.0.0' + version: ${{ needs.pack.outputs.version }} releaseRunId: ${{ github.run_id }} releaseRunAttempt: ${{ github.run_attempt }} diff --git a/.gitignore b/.gitignore index 6636ab9..af2df8d 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,4 @@ dist/ *.tgz website/doc_build/ website/.rspress/ +.npmrc diff --git a/.npmrc.example b/.npmrc.example new file mode 100644 index 0000000..dfac82f --- /dev/null +++ b/.npmrc.example @@ -0,0 +1,2 @@ +@devcodex-labs:registry=https://npm.pkg.github.com +//npm.pkg.github.com/:_authToken=${NODE_AUTH_TOKEN} diff --git a/CHANGELOG.md b/CHANGELOG.md index 04574ec..0bee9ed 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,14 +2,15 @@ ## 1.0.0 -FlowKit 的首个正式版本。 +FlowKit v1.0.0 发布候选(实际发布状态以 GitHub Packages 记录和 Git Tag 为准)。 - 用 JavaScript / TypeScript 字面量 DSL 定义工作流,支持 Agent、业务动作、验证、并行、条件、循环、人工审批和终点。 - 静态检查流程结构、数据声明、Skill 引用及受限条件表达式,输出可读 JavaScript 和 Mermaid。 - 提供 run、compile、compileSource、check、evalWhen、isControlSignal,以及 compile/check 命令行。 +- 可选 capability-graph Provider 与宿主动作适配:仅负责能力声明、查询约束及显式动作绑定,不内置第二套 Runtime。 - 通过宿主 Runtime 执行业务;支持本地和受限制的 HTTPS Skill、结果校验与重试、跟踪、取消信号及 AOT 一致性检查。 -- 提供详细中文文档、完整确定性示例和 MIT 许可证。 +- 提供详细中文文档、完整确定性示例和专有授权。 需要 Node.js 22.13.0 或更高版本。FlowKit 不内置模型服务、Schema 校验器或持久化审批服务;这些能力由宿主提供。并行分支共享状态,any 汇合不会取消其他分支;AOT 部署仍需保留原始源码和对应 Skill。 -[文档](https://devcodex-labs.github.io/flowkit/) · [npm](https://www.npmjs.com/package/@devcodex/flowkit) · [许可证](LICENSE) +[文档](https://devcodex-labs.github.io/flowkit/) · GitHub Packages(私有,需授权) · [许可证](LICENSE) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 1932030..afb9fa0 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,6 +1,6 @@ # 参与贡献 -感谢你为 FlowKit 提供可复现的问题、文档改进和实现修复。完整流程见[中文贡献文档](https://devcodex-labs.github.io/flowkit/community/contributing.html)。 +FlowKit 为私有专有项目,仅允许经过授权的协作者提交问题、文档改进和实现修复。完整流程见[中文贡献文档](https://devcodex-labs.github.io/flowkit/community/contributing.html)。 SDK 使用 Node >=22.13.0;同时开发文档站使用 Node >=24。在仓库根目录执行: @@ -15,6 +15,6 @@ npm run docs:build 使用 `npm run docs:dev` 编辑站点。示例主源位于 `examples/docs/`;修改后运行 `npm run docs:sync` 同步 README,再验证消费者。页面使用完整可执行文件、准确输出、错误恢复和相关链接;不要复制私有模块或提交临时日志。 -PR 说明具体问题、修复后行为、实际验证及未验证范围。公开接口或能力变化先讨论契约和必要性。生成产物使用 `npm run build` 与 `npm run update:goldens` 更新,不手改 header。发布由维护者按[发布说明](https://devcodex-labs.github.io/flowkit/maintainers/releasing.html)执行。 +PR 说明具体问题、修复后行为、实际验证及未验证范围。对外公开接口或能力变化先讨论契约和必要性。生成产物使用 `npm run build` 与 `npm run update:goldens` 更新,不手改 header。发布由维护者按[发布说明](https://devcodex-labs.github.io/flowkit/maintainers/releasing.html)执行。 -问题报告请附 Node/npm/系统、FlowKit 版本、最小 workflow/host/Skill、配置、命令与退出码、期望和实际结果。删除密钥、用户数据和不必要业务内容。项目使用 [MIT](LICENSE) 许可证。 +问题报告请附 Node/npm/系统、FlowKit 版本、最小 workflow/host/Skill、配置、命令与退出码、期望和实际结果。删除密钥、用户数据和不必要业务内容。项目使用 [专有授权协议](LICENSE),访问私有仓库不自动取得再分发权利。 diff --git a/LICENSE b/LICENSE index 98ee028..11ebecb 100644 --- a/LICENSE +++ b/LICENSE @@ -1,21 +1,48 @@ -MIT License - -Copyright (c) 2026 devcodex-labs - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. +FlowKit Proprietary Software License +Copyright (c) 2026 devcodex-labs. All rights reserved. + +1. Ownership. FlowKit's source code, software libraries, executable +distributions, build artifacts, and associated documentation are proprietary +to devcodex-labs and its licensors. This document grants no open-source +license and no right to redistribute FlowKit. + +2. Internal authorized use. FlowKit is developed for operation by +devcodex-labs and its expressly authorized internal contributors, +contractors, and deployment environments. Any access to the private source +repository or internal GitHub Packages registry is limited to the scope of +permission expressly granted by the rights holder. Repository or package +access alone is not a license to redistribute or offer the software. + +3. Restrictions. Unless the rights holder has given prior written +permission or applicable law requires otherwise, you may not redistribute, +publish, sublicense, sell, lease, transfer, or provide copies of FlowKit to +third parties, or remove its proprietary notices. Modification and +derivative distribution outside the permitted internal work are prohibited +except to the extent these restrictions are unenforceable by law. + +4. Hosted services and generated workflows. The rights holder may operate +FlowKit as the internal engine of a hosted API, MCP service, or paid workflow +design service without distributing FlowKit to service users. Using such a +service, reading its public documentation, or receiving a generated workflow +does not grant any right to install or copy FlowKit. Customer access, +service fees, and the ownership and usage rights of customer inputs and +generated workflow definitions, JavaScript, or other outputs are matters +for separate service terms. This software license does not itself decide +those output rights or grant access to any hosted service. + +5. Third-party components. Dependencies and third-party content remain +subject to their respective licenses. This document does not supersede +those licenses. + +6. No warranty. To the fullest extent permitted by applicable law, +FlowKit is provided "AS IS", without warranties of any kind, express or +implied. The rights holder is not liable for indirect, incidental, +special, consequential, or punitive damages arising from use of the +software, to the extent permitted by law. + +7. Separate written agreements. Any duly authorized written agreement +with devcodex-labs expressly governing a recipient's software rights +takes precedence over this notice where the terms conflict. + +For permission to use, develop, or distribute FlowKit outside the +authorized internal operation, contact the rights holder. diff --git a/README.md b/README.md index 6636cf1..c52a4d3 100644 --- a/README.md +++ b/README.md @@ -1,34 +1,45 @@ # FlowKit -**v1.0.0 · Node.js >=22.13.0 · MIT** +**v1.0.0 · Node.js >=22.13.0 · 专有授权 · 私有 GitHub Packages** 用 JavaScript / TypeScript DSL 定义工作流,静态检查流程结构,生成可读 JavaScript 与 Mermaid,并通过你提供的宿主 Runtime 执行 Agent、业务动作、验证和人工审批。 -[中文文档](https://devcodex-labs.github.io/flowkit/) · [快速开始](https://devcodex-labs.github.io/flowkit/guide/quick-start.html) · [示例](https://github.com/devcodex-labs/flowkit/tree/main/examples) +[公开文档](https://devcodex-labs.github.io/flowkit/) · [工作流示例](https://devcodex-labs.github.io/flowkit/examples/index.html) · [内部示例源码](https://github.com/devcodex-labs/flowkit/tree/main/examples) ## 适用场景 适合需要条件分支、并行处理、校验重试、循环修复或人工决策的多步骤任务。模型调用、业务接口、Schema 校验器及人工交互由宿主提供。FlowKit 不内置持久化审批服务或跨进程恢复;并行分支共享状态,any 汇合不会取消其他分支。 -## 安装 +## 运营定位 -在空目录创建项目,逐行执行(PowerShell / Bash 均可): +FlowKit 是 **私有、内部部署的商业产品基础设施**。未来可通过 MCP 服务、托管 API 或付费工作流设计产品向客户提供能力,**不向客户分发 FlowKit npm 安装包或源码**。目前这些商业服务属于规划方向,尚未作为本仓库的现成服务发布。客户使用服务和取得生成工作流的权利,应由单独的服务条款约定。 + +## 内部安装(仅维护者) + +以下命令仅供拥有仓库或内部部署权限的维护者使用;公开文档读者和未来付费客户**无需安装 FlowKit**。先为 GitHub Packages 配置 `@devcodex-labs` Registry,使用具备 `read:packages` 权限的 GitHub PAT (classic),由环境变量 `NODE_AUTH_TOKEN` 提供,不把真实令牌提交到仓库。创建项目中的 `.npmrc`: + +```ini +@devcodex-labs:registry=https://npm.pkg.github.com +//npm.pkg.github.com/:_authToken=${NODE_AUTH_TOKEN} +``` + +然后逐行执行(PowerShell / Bash 均可): ```sh npm init -y npm pkg set type=module -npm install --save-exact @devcodex/flowkit@1.0.0 +npm install --save-exact @devcodex-labs/flowkit@1.0.0 ``` -## 第一个工作流 +## 内部开发示例:第一个工作流 -创建以下两个文件。示例不需要模型密钥,也不依赖源码仓库。 +以下是供内部开发与审查使用的最小示例,公开读者可以阅读其流程,但不获得安装包或源码访问权。示例不需要模型密钥,也不依赖源码仓库。创建以下两个文件。 **sample.workflow.js** ```js -import { defineWorkflow, action, terminal } from '@devcodex/flowkit/dsl'; +import { defineWorkflow, action, terminal } from '@devcodex-labs/flowkit/dsl'; export default defineWorkflow({ id: 'hello-flowkit', version: '1.0.0', name: '第一个工作流', @@ -42,7 +53,7 @@ export default defineWorkflow({ **host.mjs** ```js -import { run, isControlSignal } from '@devcodex/flowkit'; +import { run, isControlSignal } from '@devcodex-labs/flowkit'; import { fileURLToPath } from 'node:url'; const runtime = { @@ -82,12 +93,14 @@ node host.mjs ## 公开接口 -SDK 根入口提供 `run`、`compile`、`compileSource`、`check`、`evalWhen`、`isControlSignal`。DSL 从 `@devcodex/flowkit/dsl` 导入。CLI 提供 `compile` / `check`;运行流程使用 SDK。避免导入包内私有路径。 +能力图谱可选适配由 `@devcodex-labs/flowkit/capability-graph` 导出 `flowkitProvider` 和 `createCapabilityGraphActionAdapter`,它不内置模型或执行引擎;参见[能力声明](https://devcodex-labs.github.io/flowkit/guide/capability-provider.html)与[宿主消费示例](https://devcodex-labs.github.io/flowkit/examples/capability-graph.html)。 + +SDK 根入口提供 `run`、`compile`、`compileSource`、`check`、`evalWhen`、`isControlSignal`。DSL 从 `@devcodex-labs/flowkit/dsl` 导入。CLI 提供 `compile` / `check`;运行流程使用 SDK。避免导入包内私有路径。 工作流源文件必须以 `.workflow.js` 或 `.workflow.ts` 结尾。AOT 部署保留原始源码、编译产物及所需 Skill;一致性校验不能替代对宿主代码和产物来源的信任。 -## 贡献与许可 +## 内部开发与许可 从仓库开发:`npm ci`,再运行 `npm run verify`。文档站位于 `website/`,其开发环境为 Node >=24,依赖与 SDK 分开安装。贡献入口见[贡献说明](https://github.com/devcodex-labs/flowkit/blob/main/CONTRIBUTING.md)。 -FlowKit 使用 [MIT 许可证](https://github.com/devcodex-labs/flowkit/blob/main/LICENSE),Copyright (c) 2026 devcodex-labs。首个正式版本为 v1.0.0;[更新记录](https://github.com/devcodex-labs/flowkit/blob/main/CHANGELOG.md)说明能力与限制。 +FlowKit 是仅供内部部署的私有专有软件,公开文档并不授予安装权;当前使用 [专有授权协议](https://github.com/devcodex-labs/flowkit/blob/main/LICENSE),Copyright (c) 2026 devcodex-labs。仓库当前版本为 v1.0.0,实际包发行以 GitHub Packages 记录为准;[更新记录](https://github.com/devcodex-labs/flowkit/blob/main/CHANGELOG.md)说明能力与限制。 diff --git a/docs/releasing.md b/docs/releasing.md index 04b2862..5bfe7c6 100644 --- a/docs/releasing.md +++ b/docs/releasing.md @@ -2,7 +2,7 @@ # CI与发布维护 -FlowKit v1.0.0的详细中文说明已集中到[文档站](https://devcodex-labs.github.io/flowkit/)。此页保留旧链接锚点,避免已有引用失效。 +FlowKit 私有 GitHub Packages 发行的详细中文说明已集中到[文档站](https://devcodex-labs.github.io/flowkit/)。此页保留旧链接锚点,避免已有引用失效。 ## 内容入口 @@ -23,7 +23,7 @@ FlowKit v1.0.0的详细中文说明已集中到[文档站](https://devcodex-labs 阅读[准备候选](https://devcodex-labs.github.io/flowkit/maintainers/releasing.html)。 -### 发布与公开消费 +### 发布与私有包消费 阅读[发布与公开消费](https://devcodex-labs.github.io/flowkit/maintainers/releasing.html)。 diff --git a/examples/README.md b/examples/README.md index 7613260..bd4a09f 100644 --- a/examples/README.md +++ b/examples/README.md @@ -1,6 +1,6 @@ # FlowKit 示例 -初次使用请从[中文快速开始](https://devcodex-labs.github.io/flowkit/guide/quick-start.html)进入。用户教程主源位于 [docs/](docs/),使用公开的 `@devcodex/flowkit@1.0.0` 入口;下面保留原有三个仓库回归示例的命令与说明。 +初次使用请从[中文快速开始](https://devcodex-labs.github.io/flowkit/guide/quick-start.html)进入。用户教程主源位于 [docs/](docs/),使用公开的 `@devcodex-labs/flowkit@1.0.0` 入口;下面保留原有三个仓库回归示例的命令与说明。 ## 用户教程 @@ -73,7 +73,7 @@ Skill bytes require reviewing and updating their DSL integrity first. Use the existing SDK in a Node ESM script at the repository root: ```js -import { compile } from '@devcodex/flowkit'; +import { compile } from '@devcodex-labs/flowkit'; for (const file of ['examples/editorial.workflow.js', 'examples/shared-join.workflow.ts', 'examples/remote.workflow.js']) { const result = await compile(file, { projectRoot: 'examples', remoteSkillHosts: ['skills.example.test'], diff --git a/examples/demo.mjs b/examples/demo.mjs index 748c2eb..95bc4bc 100644 --- a/examples/demo.mjs +++ b/examples/demo.mjs @@ -1,6 +1,6 @@ import { readFile } from 'node:fs/promises'; import { fileURLToPath, pathToFileURL } from 'node:url'; -import { run } from '@devcodex/flowkit'; +import { run } from '@devcodex-labs/flowkit'; import { createRuntime, validateExample } from './host.mjs'; import { exampleAgent } from './agent.mjs'; diff --git a/examples/docs/aot/deploy.mjs b/examples/docs/aot/deploy.mjs index feabf58..7155f1f 100644 --- a/examples/docs/aot/deploy.mjs +++ b/examples/docs/aot/deploy.mjs @@ -1,4 +1,4 @@ -import { compile } from '@devcodex/flowkit'; +import { compile } from '@devcodex-labs/flowkit'; import { mkdir, copyFile } from 'node:fs/promises'; import { fileURLToPath } from 'node:url'; import path from 'node:path'; diff --git a/examples/docs/aot/host.mjs b/examples/docs/aot/host.mjs index 5194b6b..e063e23 100644 --- a/examples/docs/aot/host.mjs +++ b/examples/docs/aot/host.mjs @@ -1,4 +1,4 @@ -import { run, isControlSignal } from '@devcodex/flowkit'; +import { run, isControlSignal } from '@devcodex-labs/flowkit'; import { fileURLToPath } from 'node:url'; const result = await run(fileURLToPath(new URL('./sample.compiled.mjs', import.meta.url)), { isControlSignal, diff --git a/examples/docs/aot/package.json b/examples/docs/aot/package.json index 537bd77..d89df89 100644 --- a/examples/docs/aot/package.json +++ b/examples/docs/aot/package.json @@ -2,6 +2,6 @@ "private": true, "type": "module", "dependencies": { - "@devcodex/flowkit": "1.0.0" + "@devcodex-labs/flowkit": "1.0.0" } } diff --git a/examples/docs/aot/sample.workflow.js b/examples/docs/aot/sample.workflow.js index d5e4947..79e1de0 100644 --- a/examples/docs/aot/sample.workflow.js +++ b/examples/docs/aot/sample.workflow.js @@ -1,4 +1,4 @@ -import { defineWorkflow, node, terminal } from '@devcodex/flowkit/dsl'; +import { defineWorkflow, node, terminal } from '@devcodex-labs/flowkit/dsl'; export default defineWorkflow({ id: 'aot-demo', version: '1.0.0', name: '完整部署', nodes: [ node('draft', { name: '读取本地指令', skill: 'skills/writer.md', output: { type: 'object', properties: { draft: { type: 'string' } }, required: ['draft'] }, next: 'done' }), terminal('done', { name: '完成', status: 'succeeded' }), diff --git a/examples/docs/aot/verify.mjs b/examples/docs/aot/verify.mjs index 6150d83..c23c414 100644 --- a/examples/docs/aot/verify.mjs +++ b/examples/docs/aot/verify.mjs @@ -1,6 +1,6 @@ import assert from 'node:assert/strict'; import { readFile, writeFile, unlink } from 'node:fs/promises'; -import { run, compile, isControlSignal } from '@devcodex/flowkit'; +import { run, compile, isControlSignal } from '@devcodex-labs/flowkit'; await import('./deploy.mjs'); const runtime = { isControlSignal, async runAgent(step) { return { draft: step.instruction.trim() }; }, validateResult(schema, value) { return typeof value?.draft === 'string' ? [] : ['draft']; } }; const file = 'deployment/sample.compiled.mjs', source = 'deployment/sample.workflow.js'; diff --git a/examples/docs/cancellation/host.mjs b/examples/docs/cancellation/host.mjs index 8a808b9..3134345 100644 --- a/examples/docs/cancellation/host.mjs +++ b/examples/docs/cancellation/host.mjs @@ -1,4 +1,4 @@ -import { run, isControlSignal } from '@devcodex/flowkit'; +import { run, isControlSignal } from '@devcodex-labs/flowkit'; import { fileURLToPath } from 'node:url'; export async function scenario(mode = 'cancel') { const controller = new AbortController(); let cleaned = false; diff --git a/examples/docs/cancellation/package.json b/examples/docs/cancellation/package.json index 537bd77..d89df89 100644 --- a/examples/docs/cancellation/package.json +++ b/examples/docs/cancellation/package.json @@ -2,6 +2,6 @@ "private": true, "type": "module", "dependencies": { - "@devcodex/flowkit": "1.0.0" + "@devcodex-labs/flowkit": "1.0.0" } } diff --git a/examples/docs/cancellation/sample.workflow.js b/examples/docs/cancellation/sample.workflow.js index f480dd8..12b2631 100644 --- a/examples/docs/cancellation/sample.workflow.js +++ b/examples/docs/cancellation/sample.workflow.js @@ -1,4 +1,4 @@ -import { defineWorkflow, action, terminal } from '@devcodex/flowkit/dsl'; +import { defineWorkflow, action, terminal } from '@devcodex-labs/flowkit/dsl'; export default defineWorkflow({ id: 'cancel-demo', version: '1.0.0', name: '取消操作', nodes: [ action('work', { name: '等待业务结果', action: 'wait', next: 'done' }), terminal('done', { name: '完成', status: 'succeeded' }), diff --git a/examples/docs/capability-graph/host.mjs b/examples/docs/capability-graph/host.mjs new file mode 100644 index 0000000..e959c71 --- /dev/null +++ b/examples/docs/capability-graph/host.mjs @@ -0,0 +1,38 @@ +import { run, isControlSignal } from '@devcodex-labs/flowkit'; +import { createCapabilityGraphActionAdapter, flowkitProvider } from '@devcodex-labs/flowkit/capability-graph'; +import { CapabilityGraph } from '@devcodex/capability-graph'; +import { fileURLToPath } from 'node:url'; + +export const demoProvider = { + schemaVersion: 1, providerId: 'demo', name: 'Demo actions', version: '1', + capabilities: [{ + id: 'greet', name: 'Greet', description: 'Write a greeting into workflow state.', + appliesTo: { all: [{ field: 'runtime', op: 'eq', value: 'node' }] }, + relations: { requires: ['tooling::ready'] }, + }], +}; +export const toolingProvider = { + schemaVersion: 1, providerId: 'tooling', name: 'Host prerequisites', version: '1', + capabilities: [{ id: 'ready', name: 'Ready', description: 'The host has confirmed the required greeting implementation.' }], +}; + +const entry = fileURLToPath(new URL('./sample.workflow.js', import.meta.url)); +export async function executeDemo({ allowedProviders = ['flowkit', 'demo', 'tooling'], context = { facts: { runtime: 'node' } } } = {}) { + const graph = await CapabilityGraph.open({ providers: [{ definition: flowkitProvider }, { definition: demoProvider }, { definition: toolingProvider }], allowedProviders }); + try { + const adapter = createCapabilityGraphActionAdapter({ + graph, getContext: () => context, + bindings: { + greet: { capabilityId: 'demo::greet', async execute({ ctx, resolution }) { + // Graph does not execute requires. This host has explicitly provided the required implementation. + if (!resolution.nodes.some(item => item.capability.id === 'tooling::ready')) throw new Error('Missing host prerequisite'); + ctx.state.message = `你好,${ctx.state.name}!`; + } }, + }, + }); + return await run(entry, { isControlSignal, ...adapter }, { name: 'FlowKit' }); + } finally { await graph.close(); } +} +if (process.argv[1] && process.argv[1].endsWith('host.mjs')) { + console.log(JSON.stringify(await executeDemo())); +} diff --git a/examples/docs/capability-graph/package.json b/examples/docs/capability-graph/package.json new file mode 100644 index 0000000..f9ec9b6 --- /dev/null +++ b/examples/docs/capability-graph/package.json @@ -0,0 +1 @@ +{"type":"module","private":true} diff --git a/examples/docs/capability-graph/sample.workflow.js b/examples/docs/capability-graph/sample.workflow.js new file mode 100644 index 0000000..ff4f41d --- /dev/null +++ b/examples/docs/capability-graph/sample.workflow.js @@ -0,0 +1,9 @@ +import { defineWorkflow, action, terminal } from '@devcodex-labs/flowkit/dsl'; + +export default defineWorkflow({ + id: 'graph-backed-action', version: '1.0.0', name: '能力图谱约束动作执行', + nodes: [ + action('greet', { name: '执行受控问候', action: 'greet', writes: ['message'], next: 'done' }), + terminal('done', { name: '完成', status: 'succeeded' }), + ], +}); diff --git a/examples/docs/capability-graph/verify.mjs b/examples/docs/capability-graph/verify.mjs new file mode 100644 index 0000000..9032dbe --- /dev/null +++ b/examples/docs/capability-graph/verify.mjs @@ -0,0 +1,30 @@ +import assert from 'node:assert/strict'; +import { CapabilityGraph, GraphError } from '@devcodex/capability-graph'; +import { createCapabilityGraphActionAdapter, flowkitProvider } from '@devcodex-labs/flowkit/capability-graph'; +import { executeDemo, demoProvider, toolingProvider } from './host.mjs'; + +const graph = await CapabilityGraph.open({ + providers: [{ definition: flowkitProvider }, { definition: demoProvider }, { definition: toolingProvider }], + allowedProviders: ['flowkit', 'demo', 'tooling'], +}); +try { + const catalog = await graph.listCatalog(); + assert(catalog.items.some(item => item.id === 'flowkit::compile-workflow')); + const compile = await graph.resolve({ ids: ['flowkit::render-mermaid'] }); + assert.deepEqual(compile.selected, ['flowkit::render-mermaid']); + assert(compile.nodes.some(item => item.capability.id === 'flowkit::compile-workflow')); + const resolved = await graph.resolve({ ids: ['demo::greet'], context: { facts: { runtime: 'node' } } }); + assert.equal(resolved.meta.completeness, 'complete'); + assert(resolved.nodes.some(item => item.capability.id === 'tooling::ready')); + const unknown = await graph.getCapabilities({ ids: ['demo::greet'] }); + assert.equal(unknown.items[0].applicability.status, 'unknown'); + await assert.rejects(graph.match({ input: 'greet' }), error => error instanceof GraphError && error.code === 'CG_MODEL_NOT_CONFIGURED'); +} finally { await graph.close(); } + +assert.equal((await executeDemo()).status, 'succeeded'); +await assert.rejects(executeDemo({ context: { facts: { runtime: 'bun' } } }), error => error.code === 'FK_CG_NOT_APPLICABLE'); +await assert.rejects(executeDemo({ context: {} }), error => error.code === 'FK_CG_NOT_APPLICABLE'); +await assert.rejects(executeDemo({ allowedProviders: ['demo'] }), error => error.code === 'FK_CG_DEPENDENCIES_INCOMPLETE'); +await assert.rejects(executeDemo({ allowedProviders: ['tooling'] }), error => error instanceof GraphError && error.code === 'CG_ACCESS_DENIED'); +const adapter = createCapabilityGraphActionAdapter({ graph: { resolve: async () => { throw new Error('Unexpected call'); } }, bindings: {} }); +await assert.rejects(adapter.runAction('greet', 'Greeting', {}), error => error.code === 'FK_CG_BINDING_MISSING'); diff --git a/examples/docs/conditional-routing/host.mjs b/examples/docs/conditional-routing/host.mjs index b753e55..791d2e4 100644 --- a/examples/docs/conditional-routing/host.mjs +++ b/examples/docs/conditional-routing/host.mjs @@ -1,4 +1,4 @@ -import { run, evalWhen, isControlSignal } from '@devcodex/flowkit'; +import { run, evalWhen, isControlSignal } from '@devcodex-labs/flowkit'; import { fileURLToPath } from 'node:url'; export async function scenario(urgent = false, extension = 'js') { const file = fileURLToPath(new URL(`./sample.workflow.${extension}`, import.meta.url)); diff --git a/examples/docs/conditional-routing/package.json b/examples/docs/conditional-routing/package.json index 537bd77..d89df89 100644 --- a/examples/docs/conditional-routing/package.json +++ b/examples/docs/conditional-routing/package.json @@ -2,6 +2,6 @@ "private": true, "type": "module", "dependencies": { - "@devcodex/flowkit": "1.0.0" + "@devcodex-labs/flowkit": "1.0.0" } } diff --git a/examples/docs/conditional-routing/sample.workflow.js b/examples/docs/conditional-routing/sample.workflow.js index 9c52829..fdb524d 100644 --- a/examples/docs/conditional-routing/sample.workflow.js +++ b/examples/docs/conditional-routing/sample.workflow.js @@ -1,4 +1,4 @@ -import { defineWorkflow, condition, action, terminal } from '@devcodex/flowkit/dsl'; +import { defineWorkflow, condition, action, terminal } from '@devcodex-labs/flowkit/dsl'; export default defineWorkflow({ id: 'routing', version: '1.0.0', name: '条件分流', nodes: [ diff --git a/examples/docs/conditional-routing/sample.workflow.ts b/examples/docs/conditional-routing/sample.workflow.ts index c66d72a..60b4e21 100644 --- a/examples/docs/conditional-routing/sample.workflow.ts +++ b/examples/docs/conditional-routing/sample.workflow.ts @@ -1,4 +1,4 @@ -import { defineWorkflow, condition, action, terminal } from '@devcodex/flowkit/dsl'; +import { defineWorkflow, condition, action, terminal } from '@devcodex-labs/flowkit/dsl'; export default defineWorkflow({ id: 'routing', version: '1.0.0', name: '条件分流', nodes: [ diff --git a/examples/docs/host-integration/host.mjs b/examples/docs/host-integration/host.mjs index 2142a0a..2b7188f 100644 --- a/examples/docs/host-integration/host.mjs +++ b/examples/docs/host-integration/host.mjs @@ -1,4 +1,4 @@ -import { run, isControlSignal } from '@devcodex/flowkit'; +import { run, isControlSignal } from '@devcodex-labs/flowkit'; import { fileURLToPath } from 'node:url'; const file = fileURLToPath(new URL('./sample.workflow.js', import.meta.url)); export async function scenario() { diff --git a/examples/docs/host-integration/package.json b/examples/docs/host-integration/package.json index 537bd77..d89df89 100644 --- a/examples/docs/host-integration/package.json +++ b/examples/docs/host-integration/package.json @@ -2,6 +2,6 @@ "private": true, "type": "module", "dependencies": { - "@devcodex/flowkit": "1.0.0" + "@devcodex-labs/flowkit": "1.0.0" } } diff --git a/examples/docs/host-integration/sample.workflow.js b/examples/docs/host-integration/sample.workflow.js index 882bca3..e014ca4 100644 --- a/examples/docs/host-integration/sample.workflow.js +++ b/examples/docs/host-integration/sample.workflow.js @@ -1,4 +1,4 @@ -import { defineWorkflow, node, action, human, terminal } from '@devcodex/flowkit/dsl'; +import { defineWorkflow, node, action, human, terminal } from '@devcodex-labs/flowkit/dsl'; export default defineWorkflow({ id: 'host-integration', version: '1.0.0', name: '接入宿主', nodes: [ diff --git a/examples/docs/human-approval/host.mjs b/examples/docs/human-approval/host.mjs index 085e3f2..880879d 100644 --- a/examples/docs/human-approval/host.mjs +++ b/examples/docs/human-approval/host.mjs @@ -1,4 +1,4 @@ -import { run, isControlSignal } from '@devcodex/flowkit'; +import { run, isControlSignal } from '@devcodex-labs/flowkit'; import { fileURLToPath } from 'node:url'; export async function scenario(decisions = [false, true]) { const events = []; let cursor = 0; diff --git a/examples/docs/human-approval/package.json b/examples/docs/human-approval/package.json index 537bd77..d89df89 100644 --- a/examples/docs/human-approval/package.json +++ b/examples/docs/human-approval/package.json @@ -2,6 +2,6 @@ "private": true, "type": "module", "dependencies": { - "@devcodex/flowkit": "1.0.0" + "@devcodex-labs/flowkit": "1.0.0" } } diff --git a/examples/docs/human-approval/sample.workflow.js b/examples/docs/human-approval/sample.workflow.js index 2465d7a..f21b6ad 100644 --- a/examples/docs/human-approval/sample.workflow.js +++ b/examples/docs/human-approval/sample.workflow.js @@ -1,4 +1,4 @@ -import { defineWorkflow, action, human, terminal } from '@devcodex/flowkit/dsl'; +import { defineWorkflow, action, human, terminal } from '@devcodex-labs/flowkit/dsl'; export default defineWorkflow({ id: 'approval', version: '1.0.0', name: '审批与修订', nodes: [ action('draft', { name: '准备稿件', action: 'draft', writes: ['draft'], next: 'approval' }), human('approval', { name: '批准稿件', onApprove: 'done', onReject: 'revise' }), diff --git a/examples/docs/manifest.json b/examples/docs/manifest.json index 24bced9..02e7e7f 100644 --- a/examples/docs/manifest.json +++ b/examples/docs/manifest.json @@ -264,6 +264,37 @@ "types": [ "consumer.ts" ] + }, + { + "id": "E13", + "directory": "capability-graph", + "files": [ + "host.mjs", + "package.json", + "sample.workflow.js", + "verify.mjs" + ], + "workflows": [ + "sample.workflow.js" + ], + "scenarios": [ + { + "entry": "host.mjs", + "args": [], + "expected": { + "status": "succeeded", + "terminal": "done", + "state": { + "name": "FlowKit", + "message": "你好,FlowKit!" + } + } + } + ], + "verify": "verify.mjs", + "dependencies": [ + "@devcodex/capability-graph@2.1.1" + ] } ] } diff --git a/examples/docs/parallel-review/all.workflow.js b/examples/docs/parallel-review/all.workflow.js index d15f77d..3a5e162 100644 --- a/examples/docs/parallel-review/all.workflow.js +++ b/examples/docs/parallel-review/all.workflow.js @@ -1,4 +1,4 @@ -import { defineWorkflow, parallel, action, verification, terminal } from '@devcodex/flowkit/dsl'; +import { defineWorkflow, parallel, action, verification, terminal } from '@devcodex-labs/flowkit/dsl'; export default defineWorkflow({ id: 'parallel-all', version: '1.0.0', name: '等待所有检查', nodes: [ diff --git a/examples/docs/parallel-review/any.workflow.js b/examples/docs/parallel-review/any.workflow.js index ad1cd74..b13ce04 100644 --- a/examples/docs/parallel-review/any.workflow.js +++ b/examples/docs/parallel-review/any.workflow.js @@ -1,4 +1,4 @@ -import { defineWorkflow, parallel, action, verification, terminal } from '@devcodex/flowkit/dsl'; +import { defineWorkflow, parallel, action, verification, terminal } from '@devcodex-labs/flowkit/dsl'; export default defineWorkflow({ id: 'parallel-any', version: '1.0.0', name: '等待一个完成', nodes: [ diff --git a/examples/docs/parallel-review/host.mjs b/examples/docs/parallel-review/host.mjs index d4934a4..2ba472f 100644 --- a/examples/docs/parallel-review/host.mjs +++ b/examples/docs/parallel-review/host.mjs @@ -1,4 +1,4 @@ -import { run, isControlSignal } from '@devcodex/flowkit'; +import { run, isControlSignal } from '@devcodex-labs/flowkit'; import { fileURLToPath } from 'node:url'; export async function scenario(strategy = 'all', reject = false) { const events = []; let release; diff --git a/examples/docs/parallel-review/package.json b/examples/docs/parallel-review/package.json index 537bd77..d89df89 100644 --- a/examples/docs/parallel-review/package.json +++ b/examples/docs/parallel-review/package.json @@ -2,6 +2,6 @@ "private": true, "type": "module", "dependencies": { - "@devcodex/flowkit": "1.0.0" + "@devcodex-labs/flowkit": "1.0.0" } } diff --git a/examples/docs/quick-start/host.mjs b/examples/docs/quick-start/host.mjs index aeb53bc..90eaa99 100644 --- a/examples/docs/quick-start/host.mjs +++ b/examples/docs/quick-start/host.mjs @@ -1,4 +1,4 @@ -import { run, isControlSignal } from '@devcodex/flowkit'; +import { run, isControlSignal } from '@devcodex-labs/flowkit'; import { fileURLToPath } from 'node:url'; const runtime = { diff --git a/examples/docs/quick-start/package.json b/examples/docs/quick-start/package.json index 537bd77..d89df89 100644 --- a/examples/docs/quick-start/package.json +++ b/examples/docs/quick-start/package.json @@ -2,6 +2,6 @@ "private": true, "type": "module", "dependencies": { - "@devcodex/flowkit": "1.0.0" + "@devcodex-labs/flowkit": "1.0.0" } } diff --git a/examples/docs/quick-start/sample.workflow.js b/examples/docs/quick-start/sample.workflow.js index 1da1341..217db72 100644 --- a/examples/docs/quick-start/sample.workflow.js +++ b/examples/docs/quick-start/sample.workflow.js @@ -1,4 +1,4 @@ -import { defineWorkflow, action, terminal } from '@devcodex/flowkit/dsl'; +import { defineWorkflow, action, terminal } from '@devcodex-labs/flowkit/dsl'; export default defineWorkflow({ id: 'hello-flowkit', version: '1.0.0', name: '第一个工作流', diff --git a/examples/docs/remote-skills/host.mjs b/examples/docs/remote-skills/host.mjs index 6e47893..047ee6c 100644 --- a/examples/docs/remote-skills/host.mjs +++ b/examples/docs/remote-skills/host.mjs @@ -1,4 +1,4 @@ -import { run, isControlSignal } from '@devcodex/flowkit'; +import { run, isControlSignal } from '@devcodex-labs/flowkit'; import { readFile } from 'node:fs/promises'; import { fileURLToPath } from 'node:url'; export async function scenario(mode = 'ok') { diff --git a/examples/docs/remote-skills/package.json b/examples/docs/remote-skills/package.json index 537bd77..d89df89 100644 --- a/examples/docs/remote-skills/package.json +++ b/examples/docs/remote-skills/package.json @@ -2,6 +2,6 @@ "private": true, "type": "module", "dependencies": { - "@devcodex/flowkit": "1.0.0" + "@devcodex-labs/flowkit": "1.0.0" } } diff --git a/examples/docs/remote-skills/sample.workflow.js b/examples/docs/remote-skills/sample.workflow.js index fba7f77..f0a7b16 100644 --- a/examples/docs/remote-skills/sample.workflow.js +++ b/examples/docs/remote-skills/sample.workflow.js @@ -1,4 +1,4 @@ -import { defineWorkflow, node, terminal } from '@devcodex/flowkit/dsl'; +import { defineWorkflow, node, terminal } from '@devcodex-labs/flowkit/dsl'; export default defineWorkflow({ id: 'remote-skills', version: '1.0.0', name: '远程 Skill', nodes: [ node('first', { name: '第一次建议', skill: 'https://skills.example.test/advice.md', integrity: 'sha256-O0rz52STZdJhvL/QvjjU8DTwd/MoUiHJl8lHGwEHUf4=', output: { type: 'object', properties: { advice: { type: 'string' } }, required: ['advice'] }, next: 'second' }), node('second', { name: '再次建议', skill: 'https://skills.example.test/advice.md', integrity: 'sha256-O0rz52STZdJhvL/QvjjU8DTwd/MoUiHJl8lHGwEHUf4=', output: { type: 'object', properties: { advice: { type: 'string' } }, required: ['advice'] }, next: 'done' }), diff --git a/examples/docs/remote-skills/verify.mjs b/examples/docs/remote-skills/verify.mjs index d3a4fe3..c329998 100644 --- a/examples/docs/remote-skills/verify.mjs +++ b/examples/docs/remote-skills/verify.mjs @@ -1,5 +1,5 @@ import assert from 'node:assert/strict'; -import { compile } from '@devcodex/flowkit'; +import { compile } from '@devcodex-labs/flowkit'; import { scenario } from './host.mjs'; assert.equal((await scenario()).requests, 1); // 同一次执行两个节点共享默认 loader 的成功缓存。 assert.equal((await scenario()).requests, 1); // 新运行重新建立 loader。 diff --git a/examples/docs/run-cache/host.mjs b/examples/docs/run-cache/host.mjs index 88f3d7c..2e649c4 100644 --- a/examples/docs/run-cache/host.mjs +++ b/examples/docs/run-cache/host.mjs @@ -1,4 +1,4 @@ -import { run, isControlSignal } from '@devcodex/flowkit'; +import { run, isControlSignal } from '@devcodex-labs/flowkit'; import { fileURLToPath } from 'node:url'; export const file = fileURLToPath(new URL('./sample.workflow.js', import.meta.url)); export const runtime = { diff --git a/examples/docs/run-cache/package.json b/examples/docs/run-cache/package.json index 537bd77..d89df89 100644 --- a/examples/docs/run-cache/package.json +++ b/examples/docs/run-cache/package.json @@ -2,6 +2,6 @@ "private": true, "type": "module", "dependencies": { - "@devcodex/flowkit": "1.0.0" + "@devcodex-labs/flowkit": "1.0.0" } } diff --git a/examples/docs/run-cache/sample.workflow.js b/examples/docs/run-cache/sample.workflow.js index a3a15a5..b5062bd 100644 --- a/examples/docs/run-cache/sample.workflow.js +++ b/examples/docs/run-cache/sample.workflow.js @@ -1,4 +1,4 @@ -import { defineWorkflow, node, terminal } from '@devcodex/flowkit/dsl'; +import { defineWorkflow, node, terminal } from '@devcodex-labs/flowkit/dsl'; export default defineWorkflow({ id: 'cache-demo', version: '1.0.0', name: '重复运行', nodes: [ node('answer', { name: '读取指令', skill: 'skills/instruction.md', inputs: ['count'], output: { type: 'object', properties: { count: { type: 'number' }, instruction: { type: 'string' } }, required: ['count', 'instruction'] }, retries: 0, next: 'done' }), terminal('done', { name: '完成', status: 'succeeded' }), diff --git a/examples/docs/run-cache/verify.mjs b/examples/docs/run-cache/verify.mjs index eb6c83a..5e5e9ac 100644 --- a/examples/docs/run-cache/verify.mjs +++ b/examples/docs/run-cache/verify.mjs @@ -1,6 +1,6 @@ import assert from 'node:assert/strict'; import { readFile, writeFile, unlink } from 'node:fs/promises'; -import { run, check } from '@devcodex/flowkit'; +import { run, check } from '@devcodex-labs/flowkit'; import { file, runtime } from './host.mjs'; const skill = new URL('./skills/instruction.md', import.meta.url), original = await readFile(skill), source = await readFile(file); try { diff --git a/examples/docs/sdk-options/api.mjs b/examples/docs/sdk-options/api.mjs index c246d92..a1e399a 100644 --- a/examples/docs/sdk-options/api.mjs +++ b/examples/docs/sdk-options/api.mjs @@ -1,4 +1,4 @@ -import { compile, compileSource, check, run, evalWhen, isControlSignal } from '@devcodex/flowkit'; +import { compile, compileSource, check, run, evalWhen, isControlSignal } from '@devcodex-labs/flowkit'; import { readFile } from 'node:fs/promises'; const source = 'sample.workflow.js'; const compiled = await compile(source, { trace: true }); diff --git a/examples/docs/sdk-options/consumer.ts b/examples/docs/sdk-options/consumer.ts index 36b5b70..717489b 100644 --- a/examples/docs/sdk-options/consumer.ts +++ b/examples/docs/sdk-options/consumer.ts @@ -1,5 +1,5 @@ -import type { Runtime, RunResult, FlowkitOptions, AgentStep, Diagnostic, Ctx } from '@devcodex/flowkit'; -import { run, isControlSignal } from '@devcodex/flowkit'; +import type { Runtime, RunResult, FlowkitOptions, AgentStep, Diagnostic, Ctx } from '@devcodex-labs/flowkit'; +import { run, isControlSignal } from '@devcodex-labs/flowkit'; const runtime: Runtime = { isControlSignal, async runAction(action, name, ctx) { ctx.state.saved = true; } }; const options: FlowkitOptions = { trace: true, runId: 'typed-run' }; const result: RunResult = await run('sample.workflow.js', runtime, {}, options); diff --git a/examples/docs/sdk-options/package.json b/examples/docs/sdk-options/package.json index 537bd77..d89df89 100644 --- a/examples/docs/sdk-options/package.json +++ b/examples/docs/sdk-options/package.json @@ -2,6 +2,6 @@ "private": true, "type": "module", "dependencies": { - "@devcodex/flowkit": "1.0.0" + "@devcodex-labs/flowkit": "1.0.0" } } diff --git a/examples/docs/sdk-options/sample.workflow.js b/examples/docs/sdk-options/sample.workflow.js index c164845..110a033 100644 --- a/examples/docs/sdk-options/sample.workflow.js +++ b/examples/docs/sdk-options/sample.workflow.js @@ -1,4 +1,4 @@ -import { defineWorkflow, action, terminal } from '@devcodex/flowkit/dsl'; +import { defineWorkflow, action, terminal } from '@devcodex-labs/flowkit/dsl'; export default defineWorkflow({ id: 'sdk-options', version: '1.0.0', name: 'SDK 与选项', nodes: [ action('save', { name: '保存结果', action: 'save', writes: ['saved'], next: 'done' }), terminal('done', { name: '完成', status: 'succeeded' }), diff --git a/examples/docs/sdk-options/verify.mjs b/examples/docs/sdk-options/verify.mjs index d9999e7..d161f53 100644 --- a/examples/docs/sdk-options/verify.mjs +++ b/examples/docs/sdk-options/verify.mjs @@ -3,7 +3,7 @@ import { readFile, writeFile, unlink, readdir, mkdir, stat } from 'node:fs/promi import { spawnSync } from 'node:child_process'; import { createRequire } from 'node:module'; import path from 'node:path'; -import { compile, compileSource, check, run, evalWhen, isControlSignal } from '@devcodex/flowkit'; +import { compile, compileSource, check, run, evalWhen, isControlSignal } from '@devcodex-labs/flowkit'; const source = await readFile('sample.workflow.js', 'utf8'); await compile('sample.workflow.js'); const before = await stat('sample.compiled.mjs'); assert.deepEqual(await check('sample.workflow.js'), []); assert.equal((await stat('sample.compiled.mjs')).mtimeMs, before.mtimeMs); @@ -23,7 +23,7 @@ assert.equal(initial.saved, undefined); assert.equal(initial.nested.value, 2); a assert.equal(evalWhen(observed, 'saved && nested.value === 2'), true); assert.equal(isControlSignal({ control: true }), true); await assert.rejects(run('sample.workflow.js', runtime, {}, { unknown: true }), TypeError); const dumps = (await readdir('dump')).filter(file => file.endsWith('.run.mjs')); assert.ok(dumps.length); assert.ok((await readFile(path.join('dump', dumps[0]), 'utf8')).includes('export')); -const require = createRequire(import.meta.url), packageFile = require.resolve('@devcodex/flowkit/package.json'); +const require = createRequire(import.meta.url), packageFile = require.resolve('@devcodex-labs/flowkit/package.json'); const metadata = JSON.parse(await readFile(packageFile, 'utf8')), bin = path.resolve(path.dirname(packageFile), metadata.bin.flowkit); function cli(args) { return spawnSync(process.execPath, [bin, ...args], { encoding: 'utf8', timeout: 30000 }); } assert.equal(cli(['compile', 'sample.workflow.js', '--trace', '--no-mermaid']).status, 0); diff --git a/examples/docs/validation-retries/host.mjs b/examples/docs/validation-retries/host.mjs index 8550571..00a12ea 100644 --- a/examples/docs/validation-retries/host.mjs +++ b/examples/docs/validation-retries/host.mjs @@ -1,4 +1,4 @@ -import { run, isControlSignal } from '@devcodex/flowkit'; +import { run, isControlSignal } from '@devcodex-labs/flowkit'; import { fileURLToPath } from 'node:url'; export async function scenario(exhaust = false) { const attempts = [], initial = {}; diff --git a/examples/docs/validation-retries/package.json b/examples/docs/validation-retries/package.json index 537bd77..d89df89 100644 --- a/examples/docs/validation-retries/package.json +++ b/examples/docs/validation-retries/package.json @@ -2,6 +2,6 @@ "private": true, "type": "module", "dependencies": { - "@devcodex/flowkit": "1.0.0" + "@devcodex-labs/flowkit": "1.0.0" } } diff --git a/examples/docs/validation-retries/sample.workflow.js b/examples/docs/validation-retries/sample.workflow.js index a7f0883..bd1bf11 100644 --- a/examples/docs/validation-retries/sample.workflow.js +++ b/examples/docs/validation-retries/sample.workflow.js @@ -1,4 +1,4 @@ -import { defineWorkflow, action, node, terminal } from '@devcodex/flowkit/dsl'; +import { defineWorkflow, action, node, terminal } from '@devcodex-labs/flowkit/dsl'; export default defineWorkflow({ id: 'retries', version: '1.0.0', name: '结果纠正', nodes: [ action('observe', { name: '观察运行状态', action: 'observe', next: 'answer' }), node('answer', { name: '生成结果', skill: 'skills/result.md', output: { type: 'object', properties: { answer: { type: 'string' } }, required: ['answer'] }, next: 'done' }), diff --git a/examples/docs/verification-repair/host.mjs b/examples/docs/verification-repair/host.mjs index 22a3069..97ba9a5 100644 --- a/examples/docs/verification-repair/host.mjs +++ b/examples/docs/verification-repair/host.mjs @@ -1,4 +1,4 @@ -import { run, isControlSignal } from '@devcodex/flowkit'; +import { run, isControlSignal } from '@devcodex-labs/flowkit'; import { fileURLToPath } from 'node:url'; export async function scenario(target = 1, file = 'sample.workflow.js') { const events = []; diff --git a/examples/docs/verification-repair/package.json b/examples/docs/verification-repair/package.json index 537bd77..d89df89 100644 --- a/examples/docs/verification-repair/package.json +++ b/examples/docs/verification-repair/package.json @@ -2,6 +2,6 @@ "private": true, "type": "module", "dependencies": { - "@devcodex/flowkit": "1.0.0" + "@devcodex-labs/flowkit": "1.0.0" } } diff --git a/examples/docs/verification-repair/sample.workflow.js b/examples/docs/verification-repair/sample.workflow.js index af490bb..b30c622 100644 --- a/examples/docs/verification-repair/sample.workflow.js +++ b/examples/docs/verification-repair/sample.workflow.js @@ -1,4 +1,4 @@ -import { defineWorkflow, loop, verification, action, terminal } from '@devcodex/flowkit/dsl'; +import { defineWorkflow, loop, verification, action, terminal } from '@devcodex-labs/flowkit/dsl'; export default defineWorkflow({ id: 'repair', version: '1.0.0', name: '校验与修复', nodes: [ diff --git a/examples/editorial.compiled.mjs b/examples/editorial.compiled.mjs index be7c453..929304b 100644 --- a/examples/editorial.compiled.mjs +++ b/examples/editorial.compiled.mjs @@ -1,7 +1,7 @@ // @generated by flowkit compiler — DO NOT EDIT // workflow: editorial@1.0.0(Editorial approval) // source: editorial.workflow.js -// sourceHash: sha256:bf1015cfd71b940a9dea9bc15743a67d716e7225ed900f9f1b16fdc722b2b74c · bodyHash: sha256:a711bb6c2b0b491bf32ea3692a0bff6d64b2d15740eb37bb62e7f0357471f1e4 +// sourceHash: sha256:d85d218e0363c96af76a3c432c83113224b1bf4aaea292c93451521a91f11e8c · bodyHash: sha256:a711bb6c2b0b491bf32ea3692a0bff6d64b2d15740eb37bb62e7f0357471f1e4 // compiler: flowkit@1.0.0 · options: trace=off // evalWhen reads own ctx.state paths; strict booleans and short circuit; ! has lower precedence than comparison. // runAgent receives one step; schema -> checkStep -> verify; own-key commit only after success; retries share reasons and control signals are rethrown. diff --git a/examples/editorial.workflow.js b/examples/editorial.workflow.js index 736b834..a6d3877 100644 --- a/examples/editorial.workflow.js +++ b/examples/editorial.workflow.js @@ -1,4 +1,4 @@ -import { defineWorkflow, node, action, parallel, condition, loop, verification, human, terminal } from '@devcodex/flowkit/dsl'; +import { defineWorkflow, node, action, parallel, condition, loop, verification, human, terminal } from '@devcodex-labs/flowkit/dsl'; export default defineWorkflow({ id: 'editorial', version: '1.0.0', name: 'Editorial approval', diff --git a/examples/host.mjs b/examples/host.mjs index 5839cca..b73b779 100644 --- a/examples/host.mjs +++ b/examples/host.mjs @@ -1,4 +1,4 @@ -import { evalWhen, isControlSignal } from '@devcodex/flowkit'; +import { evalWhen, isControlSignal } from '@devcodex-labs/flowkit'; /** Bind real model, JSON Schema, approval and business services at the host boundary. */ export function createRuntime({ agent, validate, approve, verify, act, trace }) { diff --git a/examples/manifest.json b/examples/manifest.json index d8cb74a..3fd826b 100644 --- a/examples/manifest.json +++ b/examples/manifest.json @@ -40,13 +40,13 @@ "files": [ { "path": "editorial.workflow.js", - "bytes": 2318, - "sha256": "bf1015cfd71b940a9dea9bc15743a67d716e7225ed900f9f1b16fdc722b2b74c" + "bytes": 2323, + "sha256": "d85d218e0363c96af76a3c432c83113224b1bf4aaea292c93451521a91f11e8c" }, { "path": "editorial.compiled.mjs", "bytes": 8621, - "sha256": "13dfceb4aa23fcaf9456c2ee0e08b526f9412f57b04046657bcc265330c93a2f" + "sha256": "9bcd7649e7b8287d06fc12a8dd5229756d09950778223b557673facbf7d93611" }, { "path": "editorial.mmd", @@ -55,13 +55,13 @@ }, { "path": "shared-join.workflow.ts", - "bytes": 637, - "sha256": "c208b7f933ae599486e4f873fbc55816dd725b4175444966a87cf60c919fcfd6" + "bytes": 642, + "sha256": "0d0edeba0f6efba74eac863bbeb99068362a66f26c66464e11a3ef2064277547" }, { "path": "shared-join.compiled.mjs", "bytes": 1302, - "sha256": "af686de6d35e58dee52e368522e33f3ab515059e23ca7fa6b38f17c86a87167a" + "sha256": "efe191558ea98c5a5b38c9e4479ab80e942e9fc6739663d8eabbb3307de836b5" }, { "path": "shared-join.mmd", @@ -70,13 +70,13 @@ }, { "path": "remote.workflow.js", - "bytes": 1138, - "sha256": "853eec8cc993addc97832a401c246ee9984ed5b103af4fa53155eed94e5a57bc" + "bytes": 1143, + "sha256": "a5a5f874342752d1afed9a7c0c3c2584be89210cf38170eb7ed2dfc717431d37" }, { "path": "remote.compiled.mjs", "bytes": 5567, - "sha256": "a949699d179355995ddc6407bf221f3b18c07a55dabb42530bd8c804ca9def36" + "sha256": "9765a4a0b710eced7277618fd153e3f506451808c78c51a108e1795dfbc1ad78" }, { "path": "remote.mmd", @@ -100,13 +100,13 @@ }, { "path": "host.mjs", - "bytes": 2068, - "sha256": "15edb0ff001ce0bfe6e923456b7f3500e7a0a7929f6293d89eefd49363cd4ebc" + "bytes": 2073, + "sha256": "4c586c45dbb73dcd4a191eaaaade402a66f2f37b22b5c8503241d4f6db978d74" }, { "path": "demo.mjs", - "bytes": 2382, - "sha256": "68b20b032e0fea0e2c16b5a18c01f93991925fb15fb2510bc8110d803667652f" + "bytes": 2387, + "sha256": "772152a04456daa760cdfbf35c273c68363ce34dba13b135314747aeb5389772" }, { "path": "agent.mjs", diff --git a/examples/remote.compiled.mjs b/examples/remote.compiled.mjs index bd0948f..3e6bd02 100644 --- a/examples/remote.compiled.mjs +++ b/examples/remote.compiled.mjs @@ -1,7 +1,7 @@ // @generated by flowkit compiler — DO NOT EDIT // workflow: remote-review@1.0.0(Remote object reviewers) // source: remote.workflow.js -// sourceHash: sha256:853eec8cc993addc97832a401c246ee9984ed5b103af4fa53155eed94e5a57bc · bodyHash: sha256:123461a67a8d0a1c27e9848021c9799d2e5c3dbf90a694cd042582c8f67cb70d +// sourceHash: sha256:a5a5f874342752d1afed9a7c0c3c2584be89210cf38170eb7ed2dfc717431d37 · bodyHash: sha256:123461a67a8d0a1c27e9848021c9799d2e5c3dbf90a694cd042582c8f67cb70d // compiler: flowkit@1.0.0 · options: trace=off // runAgent receives one step; schema -> checkStep -> verify; own-key commit only after success; retries share reasons and control signals are rethrown. Remote Skills: https://skills.example.test/style.md (integrity: sha256-GVdESIiHGUAdgUwF8wkh3HmX5deMlNBOUtZXJWVTaW4=); https://skills.example.test/fact.md (integrity: sha256-fV11WZrr2/bGq4tr8OR83tj29m/FKwzao9ga6FHx7wg=). // all uses Promise.all first rejection; late results are not cancelled. diff --git a/examples/remote.workflow.js b/examples/remote.workflow.js index ba0fcbe..c9884a8 100644 --- a/examples/remote.workflow.js +++ b/examples/remote.workflow.js @@ -1,4 +1,4 @@ -import { defineWorkflow, parallel, node, terminal } from '@devcodex/flowkit/dsl'; +import { defineWorkflow, parallel, node, terminal } from '@devcodex-labs/flowkit/dsl'; export default defineWorkflow({ id: 'remote-review', version: '1.0.0', name: 'Remote object reviewers', diff --git a/examples/shared-join.compiled.mjs b/examples/shared-join.compiled.mjs index 7b1bfb3..5d06adc 100644 --- a/examples/shared-join.compiled.mjs +++ b/examples/shared-join.compiled.mjs @@ -1,7 +1,7 @@ // @generated by flowkit compiler — DO NOT EDIT // workflow: shared-join@1.0.0(Shared join) // source: shared-join.workflow.ts -// sourceHash: sha256:c208b7f933ae599486e4f873fbc55816dd725b4175444966a87cf60c919fcfd6 · bodyHash: sha256:06e6a5c5409b2ade96f890af93f2d3346e2f3525ac7d8fbce920d8f8d758d173 +// sourceHash: sha256:0d0edeba0f6efba74eac863bbeb99068362a66f26c66464e11a3ef2064277547 · bodyHash: sha256:06e6a5c5409b2ade96f890af93f2d3346e2f3525ac7d8fbce920d8f8d758d173 // compiler: flowkit@1.0.0 · options: trace=off // evalWhen reads own ctx.state paths; strict booleans and short circuit; ! has lower precedence than comparison. // runAction resolve means success; other errors reject; control signals are rethrown. diff --git a/examples/shared-join.workflow.ts b/examples/shared-join.workflow.ts index 17b2a38..ee2fa7f 100644 --- a/examples/shared-join.workflow.ts +++ b/examples/shared-join.workflow.ts @@ -1,4 +1,4 @@ -import { defineWorkflow, action, condition, terminal } from '@devcodex/flowkit/dsl'; +import { defineWorkflow, action, condition, terminal } from '@devcodex-labs/flowkit/dsl'; export default defineWorkflow({ id: 'shared-join', version: '1.0.0', name: 'Shared join', diff --git a/package-lock.json b/package-lock.json index 75e5cf5..93dce14 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,13 +1,13 @@ { - "name": "@devcodex/flowkit", + "name": "@devcodex-labs/flowkit", "version": "1.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "@devcodex/flowkit", + "name": "@devcodex-labs/flowkit", "version": "1.0.0", - "license": "MIT", + "license": "SEE LICENSE IN LICENSE", "dependencies": { "acorn": "8.19.0" }, diff --git a/package.json b/package.json index dc37591..bb5d6f0 100644 --- a/package.json +++ b/package.json @@ -1,24 +1,50 @@ { - "name": "@devcodex/flowkit", + "name": "@devcodex-labs/flowkit", "version": "1.0.0", "private": false, - "license": "MIT", + "license": "SEE LICENSE IN LICENSE", "homepage": "https://devcodex-labs.github.io/flowkit/", "description": "Compile declarative workflows into readable JavaScript and execute them with a host Runtime", - "repository": { "type": "git", "url": "git+https://github.com/devcodex-labs/flowkit.git" }, - "publishConfig": { "access": "public", "registry": "https://registry.npmjs.org/" }, + "repository": { + "type": "git", + "url": "git+https://github.com/devcodex-labs/flowkit.git" + }, + "publishConfig": { + "registry": "https://npm.pkg.github.com/" + }, "type": "module", - "engines": { "node": ">=22.13.0" }, - "bin": { "flowkit": "./dist/cli.mjs" }, + "engines": { + "node": ">=22.13.0" + }, + "bin": { + "flowkit": "./dist/cli.mjs" + }, "exports": { - ".": { "types": "./dist/compiler-api.d.ts", "import": "./dist/index.mjs", "default": "./dist/index.mjs" }, - "./dsl": { "types": "./dist/dsl.d.ts", "import": "./dist/dsl.mjs", "default": "./dist/dsl.mjs" }, + ".": { + "types": "./dist/compiler-api.d.ts", + "import": "./dist/index.mjs", + "default": "./dist/index.mjs" + }, + "./dsl": { + "types": "./dist/dsl.d.ts", + "import": "./dist/dsl.mjs", + "default": "./dist/dsl.mjs" + }, + "./capability-graph": { + "types": "./dist/capability-graph.d.ts", + "import": "./dist/integrations/capability-graph.mjs", + "default": "./dist/integrations/capability-graph.mjs" + }, "./package.json": "./package.json" }, - "files": ["dist", "README.md", "LICENSE"], + "files": [ + "dist", + "README.md", + "LICENSE" + ], "scripts": { "build": "node scripts/build.mjs", - "test": "node --test tests/dsl.test.mjs tests/contracts.test.mjs tests/compiler/*.test.mjs tests/when/*.test.mjs tests/runtime/*.test.mjs tests/cli/*.test.mjs tests/package/*.test.mjs", + "test": "node --test tests/dsl.test.mjs tests/contracts.test.mjs tests/compiler/*.test.mjs tests/when/*.test.mjs tests/runtime/*.test.mjs tests/cli/*.test.mjs tests/integrations/*.test.mjs tests/package/*.test.mjs", "test:types": "node scripts/test-types.mjs", "check:package": "node scripts/check-package.mjs", "test:package": "node scripts/test-package.mjs", @@ -32,8 +58,13 @@ "docs:check": "npm --prefix website run check", "docs:sync": "node scripts/docs/sync-readme.mjs", "docs:examples": "node scripts/docs/verify-examples.mjs", - "docs:public-package": "node scripts/docs/check-public-package.mjs" + "docs:private-package": "node scripts/docs/check-public-package.mjs" + }, + "dependencies": { + "acorn": "8.19.0" }, - "dependencies": { "acorn": "8.19.0" }, - "devDependencies": { "typescript": "5.0.4", "tar": "7.5.22" } + "devDependencies": { + "typescript": "5.0.4", + "tar": "7.5.22" + } } diff --git a/scripts/check-package.mjs b/scripts/check-package.mjs index 235a1d3..27318e8 100644 --- a/scripts/check-package.mjs +++ b/scripts/check-package.mjs @@ -47,7 +47,7 @@ function imports(text, declaration) { export async function validatePackage(root, packedPaths) { const pkg = JSON.parse(await readFile(path.join(root, 'package.json'), 'utf8')); const lock = JSON.parse(await readFile(path.join(root, 'package-lock.json'), 'utf8')); - assert.equal(pkg.name, '@devcodex/flowkit'); assert.equal(typeof pkg.private, 'boolean'); assert.equal(pkg.type, 'module'); + assert.equal(pkg.name, '@devcodex-labs/flowkit'); assert.equal(typeof pkg.private, 'boolean'); assert.equal(pkg.type, 'module'); assert.equal(pkg.engines.node, '>=22.13.0'); assert.deepEqual(pkg.dependencies, { acorn: '8.19.0' }); assert.deepEqual(pkg.bin, { flowkit: './dist/cli.mjs' }); assert.deepEqual(Object.keys(lock.packages[''].bin), ['flowkit']); @@ -55,8 +55,8 @@ export async function validatePackage(root, packedPaths) { assert.deepEqual(lock.packages[''].dependencies, pkg.dependencies); assert.equal(lock.version, pkg.version); assert.equal(lock.packages[''].name, pkg.name); assert.equal(lock.packages[''].version, pkg.version); assert.deepEqual(pkg.files, ['dist', 'README.md', 'LICENSE']); - assert.deepEqual(Object.keys(pkg.exports), ['.', './dsl', './package.json']); - for (const [key, types, module] of [['.', './dist/compiler-api.d.ts', './dist/index.mjs'], ['./dsl', './dist/dsl.d.ts', './dist/dsl.mjs']]) { + assert.deepEqual(Object.keys(pkg.exports), ['.', './dsl', './capability-graph', './package.json']); + for (const [key, types, module] of [['.', './dist/compiler-api.d.ts', './dist/index.mjs'], ['./dsl', './dist/dsl.d.ts', './dist/dsl.mjs'], ['./capability-graph', './dist/capability-graph.d.ts', './dist/integrations/capability-graph.mjs']]) { assert.deepEqual(Object.keys(pkg.exports[key]), ['types', 'import', 'default']); assert.deepEqual(pkg.exports[key], { types, import: module, default: module }); } diff --git a/scripts/docs/check-package-privacy.mjs b/scripts/docs/check-package-privacy.mjs new file mode 100644 index 0000000..3ed75bb --- /dev/null +++ b/scripts/docs/check-package-privacy.mjs @@ -0,0 +1,28 @@ +import assert from 'node:assert/strict'; + +/** Verify actual GitHub Packages metadata, not merely the repository visibility. */ +export async function checkPrivatePackage({ token = process.env.GITHUB_TOKEN, fetchImpl = globalThis.fetch } = {}) { + if (!token || typeof token !== 'string') throw new Error('GITHUB_TOKEN required to verify package privacy'); + const base = 'https://api.github.com/orgs/devcodex-labs/packages/npm/'; + // The Packages API may expose the npm package under its scoped or unscoped name. + const candidates = ['%40devcodex-labs%2Fflowkit', 'flowkit']; + for (const name of candidates) { + const response = await fetchImpl(base + name, { + headers: { Authorization: `Bearer ${token}`, Accept: 'application/vnd.github+json', 'X-GitHub-Api-Version': '2026-03-10' }, + signal: AbortSignal.timeout(30000), + }); + if (response.status === 404) continue; + if (!response.ok) throw new Error(`GitHub Package metadata request failed: HTTP ${response.status}`); + const pkg = await response.json(); + assert.equal(pkg.owner?.login?.toLowerCase(), 'devcodex-labs', 'Wrong package owner'); + assert.equal(pkg.package_type, 'npm', 'Wrong package type'); + assert.ok(['@devcodex-labs/flowkit', 'flowkit'].includes(pkg.name), 'Wrong npm package identity'); + assert.equal(pkg.visibility, 'private', 'GitHub Package must be private before documenting a release'); + return { package: pkg.name, visibility: pkg.visibility, verified: true }; + } + throw new Error('Private GitHub Package metadata is unavailable for the expected package'); +} +if (process.argv[1] && import.meta.url === new URL('file://' + process.argv[1].replaceAll('\\', '/')).href) { + const result = await checkPrivatePackage(); + console.log(JSON.stringify(result)); +} diff --git a/scripts/docs/check-package-privacy.test.mjs b/scripts/docs/check-package-privacy.test.mjs new file mode 100644 index 0000000..e2510e7 --- /dev/null +++ b/scripts/docs/check-package-privacy.test.mjs @@ -0,0 +1,19 @@ +import test from 'node:test'; +import assert from 'node:assert/strict'; +import { checkPrivatePackage } from './check-package-privacy.mjs'; +const pkg = { name: '@devcodex-labs/flowkit', package_type: 'npm', owner: { login: 'devcodex-labs' }, visibility: 'private' }; +const response = (status, value) => ({ status, ok: status >= 200 && status < 300, json: async () => value }); +test('package privacy check accepts verified private scoped npm identity', async () => { + const urls = []; + const result = await checkPrivatePackage({ token: 'fixture', fetchImpl: async url => { urls.push(url); return response(200, pkg); } }); + assert.equal(result.verified, true); assert.equal(result.visibility, 'private'); + assert(urls[0].includes('%2Fflowkit')); +}); +test('privacy check tries both API package-name encodings and fails closed', async () => { + let calls = 0; + const result = await checkPrivatePackage({ token: 'fixture', fetchImpl: async () => ++calls === 1 ? response(404) : response(200, { ...pkg, name: 'flowkit' }) }); + assert.equal(result.visibility, 'private'); assert.equal(calls, 2); + await assert.rejects(checkPrivatePackage({ token: 'fixture', fetchImpl: async () => response(200, { ...pkg, visibility: 'public' }) }), /private/); + await assert.rejects(checkPrivatePackage({ token: 'fixture', fetchImpl: async () => response(404) }), /unavailable/); + await assert.rejects(checkPrivatePackage({ token: '', fetchImpl: async () => response(200, pkg) }), /GITHUB_TOKEN/); +}); diff --git a/scripts/docs/check-public-package.mjs b/scripts/docs/check-public-package.mjs index 32320aa..c57ad42 100644 --- a/scripts/docs/check-public-package.mjs +++ b/scripts/docs/check-public-package.mjs @@ -6,18 +6,19 @@ import { runProcess } from '../validation-process.mjs'; import { verifyRegistryBytes, archiveFiles, sha256 } from './package-proof.mjs'; const args = {}; for (let i = 2; i < process.argv.length; i += 2) { const key = process.argv[i]; assert.ok(['--version', '--manifest', '--evidence'].includes(key) && process.argv[i + 1] && !args[key]); args[key] = process.argv[i + 1]; } -assert.equal(args['--version'], '1.0.0'); assert.ok(args['--manifest']); assert.ok(process.env.npm_execpath, 'Use npm run docs:public-package'); +assert.ok(/^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?$/.test(args['--version'] ?? '')); assert.ok(args['--manifest']); assert.ok(process.env.npm_execpath, 'Use npm run docs:private-package'); const manifest = JSON.parse(await readFile(args['--manifest'], 'utf8')); assert.equal(manifest.version, args['--version']); -const base = await realpath(tmpdir()), temporary = await mkdtemp(path.join(base, 'flowkit-public-')); +const base = await realpath(tmpdir()), temporary = await mkdtemp(path.join(base, 'flowkit-private-')); let evidence; -async function npm(parameters) { const r = await runProcess(process.execPath, [process.env.npm_execpath, ...parameters, '--registry=https://registry.npmjs.org/', '--cache', path.join(temporary, 'cache')], { cwd: temporary, timeout: 120000, maxBuffer: 2 * 1024 * 1024 }); if (r.error) throw r.error; return r; } +async function npm(parameters) { const r = await runProcess(process.execPath, [process.env.npm_execpath, ...parameters, '--registry=https://npm.pkg.github.com/', '--cache', path.join(temporary, 'cache')], { cwd: temporary, timeout: 120000, maxBuffer: 2 * 1024 * 1024 }); if (r.error) throw r.error; return r; } try { - const spec = `@devcodex/flowkit@${args['--version']}`; + if (!process.env.NODE_AUTH_TOKEN) throw new Error('Private package verification requires NODE_AUTH_TOKEN'); + const spec = `@devcodex-labs/flowkit@${args['--version']}`; let metadata; for (let attempt = 1; attempt <= 5; attempt++) { const r = await npm(['view', spec, '--json', '--prefer-online']); if (r.status === 0) { metadata = JSON.parse(r.stdout); break; } - if (!/E404/.test(r.stderr + r.stdout) || attempt === 5) throw new Error(`Exact public version unavailable: ${r.stderr || r.stdout}`); + if (!/E404/.test(r.stderr + r.stdout) || attempt === 5) throw new Error(`Exact private package version unavailable: ${r.stderr || r.stdout}`); await new Promise(resolve => setTimeout(resolve, 15000)); } const packed = await npm(['pack', spec, '--json', '--ignore-scripts', '--pack-destination', temporary]); assert.equal(packed.status, 0, packed.stderr); @@ -25,10 +26,10 @@ try { const bytes = await readFile(path.join(temporary, info[0].filename)); verifyRegistryBytes(bytes, metadata, manifest); const archive = await archiveFiles(bytes), pkg = JSON.parse(archive.get('package.json').toString('utf8')); assert.equal(pkg.name, metadata.name); assert.equal(pkg.version, metadata.version); - evidence = { passed: true, node: process.version, platform: process.platform, version: pkg.version, registry: 'https://registry.npmjs.org/', integrity: metadata.dist.integrity, tarballSha256: sha256(bytes), manifestSha256: sha256(await readFile(args['--manifest'])) }; + evidence = { passed: true, node: process.version, platform: process.platform, version: pkg.version, registry: 'https://npm.pkg.github.com/', integrity: metadata.dist.integrity, tarballSha256: sha256(bytes), manifestSha256: sha256(await readFile(args['--manifest'])) }; } catch (error) { evidence = { passed: false, error: error.message }; process.exitCode = 1; } finally { - assert.equal(path.dirname(temporary), base); assert.ok(path.basename(temporary).startsWith('flowkit-public-')); await rm(temporary, { recursive: true, force: true }); + assert.equal(path.dirname(temporary), base); assert.ok(path.basename(temporary).startsWith('flowkit-private-')); await rm(temporary, { recursive: true, force: true }); if (args['--evidence']) { await mkdir(path.dirname(path.resolve(args['--evidence'])), { recursive: true }); await writeFile(args['--evidence'], JSON.stringify(evidence, null, 2) + '\n'); } console.log(JSON.stringify(evidence)); } diff --git a/scripts/docs/package-proof.mjs b/scripts/docs/package-proof.mjs index 65b067d..1633000 100644 --- a/scripts/docs/package-proof.mjs +++ b/scripts/docs/package-proof.mjs @@ -6,7 +6,7 @@ import path from 'node:path'; import { Parser } from 'tar'; export const sha256 = bytes => createHash('sha256').update(bytes).digest('hex'); export function verifyRegistryBytes(bytes, metadata, manifest) { - assert.equal(metadata.name, '@devcodex/flowkit'); assert.equal(metadata.version, manifest.version); + assert.equal(metadata.name, '@devcodex-labs/flowkit'); assert.equal(metadata.version, manifest.version); assert.equal(manifest.name, metadata.name); assert.equal(sha256(bytes), manifest.sha256, 'Public tarball differs from reviewed candidate'); const match = /^(sha256|sha384|sha512)-([A-Za-z0-9+/]+={0,2})$/.exec(metadata.dist?.integrity ?? ''); assert.ok(match, 'Missing supported registry dist.integrity'); diff --git a/scripts/docs/release-identity.mjs b/scripts/docs/release-identity.mjs index de16f3f..f7b2aec 100644 --- a/scripts/docs/release-identity.mjs +++ b/scripts/docs/release-identity.mjs @@ -7,7 +7,7 @@ import { sha256 } from './package-proof.mjs'; export const repository = 'devcodex-labs/flowkit'; const workflow = '.github/workflows/publish.yml'; export function validateInputs(input) { - assert.equal(input.repository, repository); assert.equal(input.version, '1.0.0'); + assert.equal(input.repository, repository); assert.match(String(input.version), /^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-[0-9A-Za-z.-]+)?$/); for (const key of ['packageReleaseCommit', 'docsCommit']) assert.match(input[key], /^[0-9a-f]{40}$/, key); for (const key of ['releaseRunId', 'releaseRunAttempt']) assert.match(String(input[key]), /^[1-9]\d*$/, key); } @@ -37,7 +37,7 @@ export function validateRecord(input, metadata, record, manifestBytes, tarballBy assert.equal(record.workflow, workflow); assert.equal(record.tag, `v${input.version}`); const artifact = selected['npm-release']; assert.equal(String(record.npmArtifactId), String(artifact.id)); assert.equal(record.npmArtifactDigest, artifact.digest); assert.equal(record.manifestSha256, sha256(manifestBytes)); assert.equal(record.tarballSha256, sha256(tarballBytes)); - assert.equal(manifest.sha256, record.tarballSha256); assert.equal(manifest.version, input.version); assert.equal(manifest.tag, record.tag); assert.equal(manifest.name, '@devcodex/flowkit'); + assert.equal(manifest.sha256, record.tarballSha256); assert.equal(manifest.version, input.version); assert.equal(manifest.tag, record.tag); assert.equal(manifest.name, '@devcodex-labs/flowkit'); return selected; } export function validateRepairPaths(files) { @@ -82,7 +82,7 @@ export async function main(args) { } else if (operation === 'verify') { const metadata = JSON.parse(await readFile(flags['--metadata'], 'utf8')), record = JSON.parse(await readFile(flags['--record'], 'utf8')); const bytes = await readFile(path.join(flags['--release-dir'], 'release.json')), manifest = JSON.parse(bytes); - assert.equal(manifest.filename, 'devcodex-flowkit-1.0.0.tgz'); + assert.equal(manifest.filename, `devcodex-labs-flowkit-${input.version}.tgz`); validateRecord(input, metadata, record, bytes, await readFile(path.join(flags['--release-dir'], manifest.filename))); const changed = await validateDocsCommit(flags['--docs-root'], input); const result = { passed: true, ...input, changed, manifestSha256: sha256(bytes), tarballSha256: manifest.sha256 }; diff --git a/scripts/docs/release-identity.test.mjs b/scripts/docs/release-identity.test.mjs index d1555f2..8f208b3 100644 --- a/scripts/docs/release-identity.test.mjs +++ b/scripts/docs/release-identity.test.mjs @@ -9,7 +9,7 @@ import { validateRecord, validateSourceMetadata, validateRepairPaths, validateDo import { sha256, verifyRegistryBytes } from './package-proof.mjs'; function fixture() { const input = { repository: 'devcodex-labs/flowkit', packageReleaseCommit: 'a'.repeat(40), docsCommit: 'a'.repeat(40), version: '1.0.0', releaseRunId: '100', releaseRunAttempt: '2' }; - const tarball = Buffer.from('reviewed bytes'), manifest = Buffer.from(JSON.stringify({ name: '@devcodex/flowkit', version: '1.0.0', tag: 'v1.0.0', sha256: sha256(tarball) })); + const tarball = Buffer.from('reviewed bytes'), manifest = Buffer.from(JSON.stringify({ name: '@devcodex-labs/flowkit', version: '1.0.0', tag: 'v1.0.0', sha256: sha256(tarball) })); const artifact = (name, id) => ({ id, name: `${name}-2`, expired: false, expires_at: new Date(Date.now() + 86400000).toISOString(), digest: `sha256:${'b'.repeat(64)}`, workflow_run: { id: 100, head_sha: input.packageReleaseCommit } }); const metadata = { run: { id: 100, run_attempt: 2, repository: { full_name: input.repository }, head_repository: { full_name: input.repository }, path: '.github/workflows/publish.yml', event: 'push', head_branch: 'v1.0.0', head_sha: input.packageReleaseCommit, conclusion: null }, jobs: ['pack', 'publish'].map(name => ({ name, conclusion: 'success', run_id: 100, head_sha: input.packageReleaseCommit })), artifacts: [artifact('npm-release', 1), artifact('release-identity', 2)] }; const record = { schemaVersion: 'FlowkitReleaseIdentityV1', ...input, workflow: metadata.run.path, tag: 'v1.0.0', npmArtifactId: '1', npmArtifactDigest: metadata.artifacts[0].digest, manifestSha256: sha256(manifest), tarballSha256: sha256(tarball) }; diff --git a/scripts/docs/verify-examples.mjs b/scripts/docs/verify-examples.mjs index 6ad6a52..06fa736 100644 --- a/scripts/docs/verify-examples.mjs +++ b/scripts/docs/verify-examples.mjs @@ -14,6 +14,7 @@ for (let i = 2; i < process.argv.length; i += 2) { assert.ok(!Object.hasOwn(options, key), `Duplicate: ${key}`); options[key] = process.argv[i + 1]; } assert.ok(!(options['--package'] && options['--registry-version']), 'Select one package source'); +if (!options['--evidence'] && process.env.FLOWKIT_DOCS_EVIDENCE) options['--evidence'] = process.env.FLOWKIT_DOCS_EVIDENCE; const npm = process.env.npm_execpath; assert.ok(npm, 'Use npm run docs:examples'); const pkg = JSON.parse(await readFile(path.join(root, 'package.json'), 'utf8')); const manifest = JSON.parse(await readFile(path.join(root, 'examples/docs/manifest.json'), 'utf8')); @@ -31,9 +32,9 @@ try { let source = options['--package'] ? path.resolve(options['--package']) : undefined; let tarball; if (options['--registry-version']) { - assert.equal(options['--registry-version'], pkg.version, 'Public consumer version must match docs'); - source = `@devcodex/flowkit@${pkg.version}`; - const packed = JSON.parse(await execute('public-pack', [npm, 'pack', source, '--json', '--ignore-scripts', '--registry=https://registry.npmjs.org/', '--cache', path.join(temporary, 'pack-cache'), '--pack-destination', temporary], temporary)); + assert.equal(options['--registry-version'], pkg.version, 'Private consumer version must match docs'); + source = `@devcodex-labs/flowkit@${pkg.version}`; + const packed = JSON.parse(await execute('private-pack', [npm, 'pack', source, '--json', '--ignore-scripts', '--registry=https://npm.pkg.github.com/', '--cache', path.join(temporary, 'pack-cache'), '--pack-destination', temporary], temporary)); tarball = path.join(temporary, packed[0].filename); } else if (!source) { const packed = JSON.parse(await execute('candidate-pack', [npm, 'pack', '--json', '--ignore-scripts', '--pack-destination', temporary], root)); @@ -47,13 +48,15 @@ try { const consumer = path.join(temporary, 'consumer'); await mkdir(consumer); await writeFile(path.join(consumer, 'package.json'), JSON.stringify({ private: true, type: 'module' })); await execute('install', [npm, 'install', '--ignore-scripts', '--no-audit', '--no-fund', '--save-exact', '--registry=https://registry.npmjs.org/', '--cache', path.join(temporary, 'install-cache'), source, 'typescript@5.0.4', '@types/node@22.13.0'], consumer); - const installed = path.join(consumer, 'node_modules/@devcodex/flowkit'); + const installed = path.join(consumer, 'node_modules/@devcodex-labs/flowkit'); assert.ok(!(await lstat(installed)).isSymbolicLink()); assert.equal(path.resolve(await realpath(installed)), path.resolve(installed)); const actual = JSON.parse(await readFile(path.join(installed, 'package.json'), 'utf8')); assert.equal(actual.name, pkg.name); assert.equal(actual.version, pkg.version); const installedProof = await verifyInstalledArchive(installed, await readFile(tarball)); const selected = manifest.cases.filter(item => !options['--case'] || item.id === options['--case']); assert.ok(selected.length, 'Unknown or empty case selection'); + const extra = [...new Set(selected.flatMap(item => item.dependencies ?? []))]; + if (extra.length) await execute('install-optional-graph', [npm, 'install', '--no-save', '--ignore-scripts', '--no-audit', '--no-fund', '--registry=https://registry.npmjs.org/', ...extra], consumer); for (const item of selected) { assert.match(item.directory, /^[a-z][a-z-]*$/); const directory = path.join(consumer, item.directory); await mkdir(directory); @@ -82,7 +85,7 @@ try { const deployment = path.join(temporary, 'deployment'); await mkdir(path.join(deployment, 'skills'), { recursive: true }); for (const file of ['package.json', 'host.mjs', 'sample.workflow.js', 'sample.compiled.mjs', 'sample.mmd', 'skills/writer.md']) await copyFile(path.join(directory, 'deployment', file), path.join(deployment, file)); await execute('E08:independent-install', [npm, 'install', '--ignore-scripts', '--no-audit', '--no-fund', '--save-exact', '--registry=https://registry.npmjs.org/', '--cache', path.join(temporary, 'deployment-cache'), source], deployment); - const deployedPackage = path.join(deployment, 'node_modules/@devcodex/flowkit'); + const deployedPackage = path.join(deployment, 'node_modules/@devcodex-labs/flowkit'); assert.ok(!(await lstat(deployedPackage)).isSymbolicLink()); await verifyInstalledArchive(deployedPackage, await readFile(tarball)); await execute('E08:independent-run', ['host.mjs'], deployment); const deployedSource = path.join(deployment, 'sample.workflow.js'); diff --git a/scripts/package-files.mjs b/scripts/package-files.mjs index b94eb5c..7aaf66a 100644 --- a/scripts/package-files.mjs +++ b/scripts/package-files.mjs @@ -4,6 +4,8 @@ export const packageFiles = [ ['src/cli.mjs', 'dist/cli.mjs'], ...['arguments', 'config', 'main'].map(name => [`src/cli/${name}.mjs`, `dist/cli/${name}.mjs`]), ['src/dsl.mjs', 'dist/dsl.mjs'], + ['src/integrations/capability-graph.mjs', 'dist/integrations/capability-graph.mjs'], + ['types/capability-graph.d.ts', 'dist/capability-graph.d.ts'], ...['contracts', 'control', 'skill-ref'].map(name => [`src/shared/${name}.mjs`, `dist/shared/${name}.mjs`]), ...['source', 'extract', 'validate', 'skill-check', 'analyze', 'graph-algorithms', 'graph', 'dataflow', 'values', 'paths', 'mermaid', 'emit-plan', 'helpers', 'emit', 'compile', 'api', 'output'].map(name => [`src/compiler/${name}.mjs`, `dist/compiler/${name}.mjs`]), ...['parser', 'evaluate'].map(name => [`src/when/${name}.mjs`, `dist/when/${name}.mjs`]), diff --git a/scripts/release.mjs b/scripts/release.mjs index a52b7f0..26bf61b 100644 --- a/scripts/release.mjs +++ b/scripts/release.mjs @@ -9,7 +9,7 @@ import { packageFiles } from './package-files.mjs'; import { validatePackage } from './check-package.mjs'; import { runProcess } from './validation-process.mjs'; -const registry = 'https://registry.npmjs.org/'; +const registry = 'https://npm.pkg.github.com/'; const repository = 'git+https://github.com/devcodex-labs/flowkit.git'; const digest = bytes => createHash('sha256').update(bytes).digest('hex'); const json = async file => JSON.parse(await readFile(file, 'utf8')); @@ -21,7 +21,7 @@ export async function assessRelease(root, tag) { const issues = []; const require = (condition, field, message) => { if (!condition) issues.push({ field, message }); }; const validVersion = isSemVer(pkg.version) && !pkg.version.includes('+'); - require(pkg.name === '@devcodex/flowkit', 'name', 'Unexpected package name'); + require(pkg.name === '@devcodex-labs/flowkit', 'name', 'Unexpected package name'); require(validVersion, 'version', 'Use a SemVer release version without build metadata'); require(typeof tag === 'string' && tag === `v${pkg.version}`, 'tag', 'Tag must equal v plus the package version'); require(pkg.private === false, 'private', 'A release candidate must explicitly set private:false'); @@ -35,7 +35,7 @@ export async function assessRelease(root, tag) { const heading = new RegExp(`^## \\[?${String(pkg.version).replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}\\]?(?:\\s|$)`, 'm'); require(validVersion && heading.test(changelog), 'CHANGELOG', 'Add release notes headed by the exact package version'); require(pkg.repository?.type === 'git' && pkg.repository?.url === repository, 'repository', 'Repository metadata must identify devcodex-labs/flowkit'); - require(pkg.publishConfig?.access === 'public' && pkg.publishConfig?.registry === registry, 'publishConfig', 'Use public access and the npmjs registry explicitly'); + require(pkg.publishConfig?.registry === registry && !Object.hasOwn(pkg.publishConfig, 'access'), 'publishConfig', 'Publish only to private GitHub Packages; do not set public access'); return { schemaVersion: 1, ready: issues.length === 0, name: pkg.name, version: pkg.version, tag, npmTag: validVersion && pkg.version.includes('-') ? 'next' : 'latest', issues }; } @@ -52,7 +52,7 @@ async function outputDirectory(root, create = false) { return path.join(root, '.tmp/release'); } -const filenameFor = version => `devcodex-flowkit-${version}.tgz`; +const filenameFor = version => `devcodex-labs-flowkit-${version}.tgz`; const members = () => ['package.json', 'README.md', 'LICENSE', ...packageFiles.map(([, output]) => output)].sort(); async function ready(root, tag) { const assessment = await assessRelease(root, tag); diff --git a/scripts/test-package.mjs b/scripts/test-package.mjs index 7be9105..44a5189 100644 --- a/scripts/test-package.mjs +++ b/scripts/test-package.mjs @@ -25,7 +25,7 @@ try { const tarball = path.join(temporary, packed.filename), consumer = path.join(temporary, 'consumer workspace'); await mkdir(consumer); await writeFile(path.join(consumer, 'package.json'), JSON.stringify({ private: true, type: 'module' })); await execute('install', [npm, 'install', '--ignore-scripts', '--no-audit', '--no-fund', '--save-exact', tarball, 'typescript@5.7.3', '@types/node@22.13.0'], consumer); - const installed = path.join(consumer, 'node_modules/@devcodex/flowkit'); + const installed = path.join(consumer, 'node_modules/@devcodex-labs/flowkit'); assert.ok((await lstat(installed)).isDirectory() && !(await lstat(installed)).isSymbolicLink()); assert.equal(path.resolve(await realpath(installed)), path.resolve(installed), 'Consumer package must be an installed copy'); async function files(directory, prefix = '') { diff --git a/scripts/test-types.mjs b/scripts/test-types.mjs index 0d49bdd..572a6d5 100644 --- a/scripts/test-types.mjs +++ b/scripts/test-types.mjs @@ -10,7 +10,7 @@ const compilerArgs = ['--noEmit', '--strict', '--target', 'ES2022', '--lib', 'ES const scratch = path.join(root, '.tmp/types'); await mkdir(scratch, { recursive: true }); const nodes = Array.from({ length: 499 }, (_, i) => `action('step-${i}', { name: '动作${i}', action: 'save', next: '${i === 498 ? 'done' : `step-${i + 1}`}' })`); -const large = `import {defineWorkflow,action,terminal} from '@devcodex/flowkit/dsl';\ndefineWorkflow({id:'large',version:'1.0.0',name:'规模',nodes:[\n${nodes.join(',\n')},\nterminal('done',{name:'完成',status:'succeeded'})]});\n`; +const large = `import {defineWorkflow,action,terminal} from '@devcodex-labs/flowkit/dsl';\ndefineWorkflow({id:'large',version:'1.0.0',name:'规模',nodes:[\n${nodes.join(',\n')},\nterminal('done',{name:'完成',status:'succeeded'})]});\n`; await writeFile(path.join(scratch, '500-valid.ts'), large); await writeFile(path.join(scratch, '500-invalid.ts'), large.replace("next: 'done'", "next: 'missing-node'")); const runs = []; diff --git a/src/compiler/extract.mjs b/src/compiler/extract.mjs index ff63b92..7bb641e 100644 --- a/src/compiler/extract.mjs +++ b/src/compiler/extract.mjs @@ -138,8 +138,8 @@ export function extractWorkflow(snapshot) { let exported; for (const statement of program.body) { if (statement.type === 'ImportDeclaration') { - if (statement.source.value !== '@devcodex/flowkit/dsl' || statement.specifiers.length === 0 || statement.attributes?.length) { - fail('Only named imports from @devcodex/flowkit/dsl are supported', statement); + if (statement.source.value !== '@devcodex-labs/flowkit/dsl' || statement.specifiers.length === 0 || statement.attributes?.length) { + fail('Only named imports from @devcodex-labs/flowkit/dsl are supported', statement); } for (const specifier of statement.specifiers) { const name = specifier.imported?.name; diff --git a/src/integrations/capability-graph.mjs b/src/integrations/capability-graph.mjs new file mode 100644 index 0000000..4f8dbcf --- /dev/null +++ b/src/integrations/capability-graph.mjs @@ -0,0 +1,61 @@ +/** + * Optional host-side capability-graph bridge. No model, MCP server or second + * workflow runtime is created by FlowKit. + */ +export const flowkitProvider = Object.freeze({ + schemaVersion: 1, providerId: 'flowkit', name: 'FlowKit', version: '1.0.0', + description: 'Compile declarative JavaScript/TypeScript workflows and run them with an explicit host Runtime.', + capabilities: [ + { id: 'define-workflow', name: 'Define workflow', description: 'Declare eight supported node kinds using the FlowKit DSL.', whenToUse: 'A host needs a statically analyzable workflow definition.', usage: { instructions: 'Import defineWorkflow and DSL constructors from @devcodex-labs/flowkit/dsl. The input must be literal JS/TS DSL.' } }, + { id: 'compile-workflow', name: 'Compile workflow', description: 'Statically validate a workflow and emit executable JavaScript and optional Mermaid.', whenToUse: 'An application needs a verified compiled workflow.', usage: { instructions: 'Call compile or compileSource from @devcodex-labs/flowkit; inspect diagnostics before using artifacts.' }, relations: { requires: ['define-workflow'] } }, + { id: 'check-workflow', name: 'Check workflow', description: 'Check source and compare an existing compiled JavaScript artifact without writing.', whenToUse: 'An application needs a read-only definition and artifact check.', usage: { instructions: 'Call check from @devcodex-labs/flowkit; absence of compiled output is not an error and Mermaid is not compared.' }, relations: { requires: ['define-workflow'] } }, + { id: 'run-workflow', name: 'Run workflow', description: 'Execute a verified workflow using a caller-provided host Runtime.', whenToUse: 'A host has authorized the workflow and supplied its business methods.', usage: { instructions: 'Call run from @devcodex-labs/flowkit with an explicit Runtime. FlowKit does not supply a model or persistent approvals.' }, relations: { requires: ['define-workflow'] } }, + { id: 'render-mermaid', name: 'Render Mermaid', description: 'Produce a Mermaid diagram from the validated control-flow definition.', whenToUse: 'A caller needs a view of the workflow graph.', usage: { instructions: 'Use compile/compileSource with mermaid enabled; the diagram is visualization, not execution.' }, relations: { requires: ['compile-workflow'] } }, + ], +}); + +function adapterError(code, message) { + return Object.assign(new Error(message), { code }); +} + +/** + * Graph performs discovery, authorization, applicability and dependency resolution. + * The explicitly bound host callback is the only component that performs actions. + * Resolving a dependency does not execute that dependency. + * + * @param {{ graph: { resolve: Function }, bindings: Record, getContext?: Function }} options + */ +export function createCapabilityGraphActionAdapter({ graph, bindings, getContext = () => ({}) } = {}) { + if (!graph || typeof graph.resolve !== 'function') throw new TypeError('graph.resolve must be a function'); + if (!bindings || typeof bindings !== 'object' || Array.isArray(bindings)) throw new TypeError('bindings must be an object'); + if (typeof getContext !== 'function') throw new TypeError('getContext must be a function'); + const table = new Map(); + for (const key of Object.keys(bindings)) { + const descriptor = Object.getOwnPropertyDescriptor(bindings, key); + if (!descriptor || !Object.hasOwn(descriptor, 'value')) throw new TypeError('bindings must not contain accessors'); + const binding = descriptor.value; + if (!binding || typeof binding.capabilityId !== 'string' || !/^[a-z][a-z0-9._-]*::[a-z][a-z0-9._-]*$/.test(binding.capabilityId) || typeof binding.execute !== 'function') { + throw new TypeError(`Invalid capability binding: ${key}`); + } + table.set(key, { capabilityId: binding.capabilityId, execute: binding.execute }); + } + return { + async runAction(action, name, ctx) { + const binding = table.get(action); + if (!binding) throw adapterError('FK_CG_BINDING_MISSING', `No Graph binding for action: ${action}`); + const context = getContext(ctx); + if (!context || typeof context !== 'object' || Array.isArray(context)) throw new TypeError('getContext must return Graph MatchContext'); + // Let GraphError (including permission and invalid context) propagate unchanged. + const result = await graph.resolve({ ids: [binding.capabilityId], context, relations: ['requires'] }); + if (!result || result.meta?.completeness !== 'complete' || !Array.isArray(result.unresolved) || result.unresolved.length || !Array.isArray(result.nodes)) { + throw adapterError('FK_CG_DEPENDENCIES_INCOMPLETE', 'Capability dependencies are incomplete'); + } + const root = result.nodes.find(item => item.capability?.id === binding.capabilityId); + if (!root) throw adapterError('FK_CG_DEPENDENCIES_INCOMPLETE', 'Selected capability is missing from the resolved graph'); + for (const item of result.nodes) if (item.applicability?.status !== 'applicable') { + throw adapterError('FK_CG_NOT_APPLICABLE', `Capability is not applicable: ${item.capability?.id ?? 'unknown'}`); + } + await binding.execute({ action, name, ctx, resolution: result, capability: root.capability }); + }, + }; +} diff --git a/tests/cli/cli.test.mjs b/tests/cli/cli.test.mjs index 2ce65ac..75923ad 100644 --- a/tests/cli/cli.test.mjs +++ b/tests/cli/cli.test.mjs @@ -2,7 +2,7 @@ import test from 'node:test'; import assert from 'node:assert/strict'; import { readFile, writeFile, readdir, mkdir, stat, access, symlink, rmdir } from 'node:fs/promises'; import path from 'node:path'; -import * as api from '@devcodex/flowkit'; +import * as api from '@devcodex-labs/flowkit'; import { workspace, definition, end, entry, diagnostics, configurationError } from './support.mjs'; const remote = (host = 'example.test') => `node('n',{name:'N',skill:'https://${host}/a.md',output:{type:'object'},next:'done'})`; @@ -178,5 +178,5 @@ test('bin metadata, lockfile and built entry agree, preserve shebang and add no assert.ok(['./dist/cli.mjs', 'dist/cli.mjs'].includes(lock.packages[''].bin.flowkit)); const source = await readFile(new URL('../../src/cli.mjs', import.meta.url)); const built = await readFile(entry); assert.deepEqual(built, source); assert.ok(built.toString().startsWith('#!/usr/bin/env node\n')); - await assert.rejects(import('@devcodex/flowkit/cli'), { code: 'ERR_PACKAGE_PATH_NOT_EXPORTED' }); + await assert.rejects(import('@devcodex-labs/flowkit/cli'), { code: 'ERR_PACKAGE_PATH_NOT_EXPORTED' }); }); diff --git a/tests/cli/support.mjs b/tests/cli/support.mjs index 66c1abb..6209613 100644 --- a/tests/cli/support.mjs +++ b/tests/cli/support.mjs @@ -7,7 +7,7 @@ import path from 'node:path'; export const entry = fileURLToPath(new URL('../../dist/cli.mjs', import.meta.url)); export const end = "terminal('done',{name:'Done',status:'succeeded'})"; -export const definition = nodes => "import {defineWorkflow,node,action,terminal} from '@devcodex/flowkit/dsl';\nexport default defineWorkflow({id:'cli',version:'1.0.0',name:'CLI',nodes:[" + nodes.join(',') + ']});\n'; +export const definition = nodes => "import {defineWorkflow,node,action,terminal} from '@devcodex-labs/flowkit/dsl';\nexport default defineWorkflow({id:'cli',version:'1.0.0',name:'CLI',nodes:[" + nodes.join(',') + ']});\n'; export async function workspace(t, nodes = [end]) { const base = path.resolve(tmpdir()); const directory = await mkdtemp(path.join(base, 'flowkit-cli-')); diff --git a/tests/compiler/acceptance-errors.test.mjs b/tests/compiler/acceptance-errors.test.mjs index b6b4e65..829e710 100644 --- a/tests/compiler/acceptance-errors.test.mjs +++ b/tests/compiler/acceptance-errors.test.mjs @@ -3,13 +3,13 @@ import assert from 'node:assert/strict'; import { mkdtemp, mkdir, writeFile, readFile, rm, symlink, readdir } from 'node:fs/promises'; import { tmpdir } from 'node:os'; import path from 'node:path'; -import { compileSource, check, run, evalWhen, isControlSignal } from '@devcodex/flowkit'; +import { compileSource, check, run, evalWhen, isControlSignal } from '@devcodex-labs/flowkit'; import { validateExample } from '../../examples/host.mjs'; const directory = new URL('../fixtures/errors/', import.meta.url); const catalog = JSON.parse(await readFile(new URL('../fixtures/contract-codes.json', import.meta.url))); const files = (await readdir(directory)).filter(file => file.endsWith('.json')).sort(); -const header = "import {defineWorkflow,action,terminal} from '@devcodex/flowkit/dsl';\n"; +const header = "import {defineWorkflow,action,terminal} from '@devcodex-labs/flowkit/dsl';\n"; function materialize(spec) { if (!spec.chainLength) return spec.source; const nodes = Array.from({ length: spec.chainLength - 1 }, (_, i) => `action('n-${i}',{name:'N ${i}',action:'save',next:'${i === spec.chainLength - 2 ? 'done' : `n-${i + 1}`}'})`); diff --git a/tests/compiler/api.test.mjs b/tests/compiler/api.test.mjs index 8a234e5..3cfc727 100644 --- a/tests/compiler/api.test.mjs +++ b/tests/compiler/api.test.mjs @@ -8,9 +8,9 @@ import { tmpdir } from 'node:os'; import path from 'node:path'; import { createHash } from 'node:crypto'; import { spawnSync } from 'node:child_process'; -import * as api from '@devcodex/flowkit'; +import * as api from '@devcodex-labs/flowkit'; -const source = name => `import {defineWorkflow,terminal} from '@devcodex/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'${name ?? 'Demo'}',nodes:[terminal('done',{name:'Done',status:'succeeded'})]});\n`; +const source = name => `import {defineWorkflow,terminal} from '@devcodex-labs/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'${name ?? 'Demo'}',nodes:[terminal('done',{name:'Done',status:'succeeded'})]});\n`; const hash = bytes => createHash('sha256').update(bytes).digest('hex'); async function workspace(t) { const base = path.resolve(tmpdir()); @@ -38,7 +38,7 @@ async function snapshot(directory) { test('package root exposes implemented compiler functions and runtime helpers while blocking deep imports', async () => { assert.deepEqual(Object.keys(api), ['check', 'compile', 'compileSource', 'evalWhen', 'isControlSignal', 'run']); - await assert.rejects(import('@devcodex/flowkit/compiler/api'), { code: 'ERR_PACKAGE_PATH_NOT_EXPORTED' }); + await assert.rejects(import('@devcodex-labs/flowkit/compiler/api'), { code: 'ERR_PACKAGE_PATH_NOT_EXPORTED' }); }); test('the README quick-start module compiles unchanged through the public API', async t => { @@ -59,7 +59,7 @@ import fsSync from 'node:fs'; import {syncBuiltinESMExports} from 'node:module'; import {mkdir,writeFile,readFile,stat} from 'node:fs/promises'; import path from 'node:path'; -const api=await import(${JSON.stringify(import.meta.resolve('@devcodex/flowkit'))}); +const api=await import(${JSON.stringify(import.meta.resolve('@devcodex-labs/flowkit'))}); const base=process.argv[1],project=path.join(base,'project'); await mkdir(path.join(project,'nested'),{recursive:true}); await mkdir(path.join(project,'skills'));await writeFile(path.join(project,'skills/a.md'),'instruction'); @@ -71,7 +71,7 @@ await assert.rejects(stat(path.join(base,'source.compiled.mjs')),{code:'ENOENT'} await writeFile(artifact,first.code+' '); process.chdir(project);const checking=api.check('nested/source.workflow.js',{outDir:'.'});process.chdir(base); const differences=await checking;assert.deepEqual(differences.map(d=>d.code),['FK_R001']);assert.equal(differences[0].file,artifact); -const agent="import {defineWorkflow,node,terminal} from '@devcodex/flowkit/dsl';export default defineWorkflow({id:'agent',version:'1.0.0',name:'Agent',nodes:[node('n',{name:'N',skill:'skills/a.md',output:{type:'object'},next:'done'}),terminal('done',{name:'Done',status:'succeeded'})]});"; +const agent="import {defineWorkflow,node,terminal} from '@devcodex-labs/flowkit/dsl';export default defineWorkflow({id:'agent',version:'1.0.0',name:'Agent',nodes:[node('n',{name:'N',skill:'skills/a.md',output:{type:'object'},next:'done'}),terminal('done',{name:'Done',status:'succeeded'})]});"; await writeFile(path.join(project,'nested/agent.workflow.js'),agent); // Simulate no package.json ancestors so the fallback is independent of the test machine. const originalStat=fsSync.statSync; @@ -141,7 +141,7 @@ test('warnings permit writing without fetching remote Skills or running source/c const directory = await workspace(t); const filename = path.join(directory, 'remote.workflow.js'); await writeFile(path.join(directory, 'flowkit.config.mjs'), "throw new Error('API must not execute configuration');"); - const remote = "import {defineWorkflow,node,terminal} from '@devcodex/flowkit/dsl';export default defineWorkflow({id:'remote',version:'1.0.0',name:'Remote',nodes:[node('n',{name:'N',skill:'https://example.test/skill.md',output:{type:'object'},next:'done'}),terminal('done',{name:'Done',status:'succeeded'})]});"; + const remote = "import {defineWorkflow,node,terminal} from '@devcodex-labs/flowkit/dsl';export default defineWorkflow({id:'remote',version:'1.0.0',name:'Remote',nodes:[node('n',{name:'N',skill:'https://example.test/skill.md',output:{type:'object'},next:'done'}),terminal('done',{name:'Done',status:'succeeded'})]});"; const result = await api.compileSource(remote, { filename, remoteSkillHosts: ['example.test'], fetch: () => assert.fail('No network') }); assert.deepEqual(result.diagnostics.map(item => item.code), ['FK_C059']); assert.ok(result.code.length); assert.ok((await stat(path.join(directory, 'remote.compiled.mjs'))).isFile()); @@ -215,7 +215,7 @@ test('check compares the ancestor outDir and carries compile warnings alongside await api.compile(file, { outDir: directory }); assert.deepEqual(await api.check(file, { outDir: directory }), []); assert.deepEqual(await api.check(file), []); - const remote = "import {defineWorkflow,node,terminal} from '@devcodex/flowkit/dsl';export default defineWorkflow({id:'remote',version:'1.0.0',name:'Remote',nodes:[node('n',{name:'N',skill:'https://example.test/skill.md',output:{type:'object'},next:'done'}),terminal('done',{name:'Done',status:'succeeded'})]});"; + const remote = "import {defineWorkflow,node,terminal} from '@devcodex-labs/flowkit/dsl';export default defineWorkflow({id:'remote',version:'1.0.0',name:'Remote',nodes:[node('n',{name:'N',skill:'https://example.test/skill.md',output:{type:'object'},next:'done'}),terminal('done',{name:'Done',status:'succeeded'})]});"; await writeFile(file, remote); assert.deepEqual((await api.check(file, { outDir: directory, remoteSkillHosts: ['example.test'] })).map(item => item.code), ['FK_C059', 'FK_R001']); }); diff --git a/tests/compiler/dataflow.test.mjs b/tests/compiler/dataflow.test.mjs index be49e73..450b960 100644 --- a/tests/compiler/dataflow.test.mjs +++ b/tests/compiler/dataflow.test.mjs @@ -2,7 +2,7 @@ import test from 'node:test'; import assert from 'node:assert/strict'; import { analyzeSource } from '../../src/compiler/analyze.mjs'; -const imports="import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl';"; +const imports="import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl';"; const end="terminal('done',{name:'Done',status:'succeeded'})"; const agent=(id,next,inputs=[],properties={})=>`node('${id}',{name:'${id}',agent:'writer',inputs:${JSON.stringify(inputs)},output:{type:'object',properties:${JSON.stringify(properties)}},next:'${next}'})`; const analyze=nodes=>analyzeSource(`${imports}\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[${nodes.join(',')}]});`,{filename:'data.workflow.js',skillCheck:false}); diff --git a/tests/compiler/emit.test.mjs b/tests/compiler/emit.test.mjs index fba3d1a..2335965 100644 --- a/tests/compiler/emit.test.mjs +++ b/tests/compiler/emit.test.mjs @@ -5,7 +5,7 @@ import { compileToText } from '../../src/compiler/compile.mjs'; import { createSourceSnapshot } from '../../src/compiler/source.mjs'; import { evalWhen } from '../../src/when/evaluate.mjs'; -const imports="import {defineWorkflow,node,action,parallel,condition,verification,loop,human,terminal} from '@devcodex/flowkit/dsl';"; +const imports="import {defineWorkflow,node,action,parallel,condition,verification,loop,human,terminal} from '@devcodex-labs/flowkit/dsl';"; const end=(id='done')=>`terminal('${id}',{name:'${id}',status:'succeeded'})`; const action=(id,next)=>`action('${id}',{name:'${id}',action:'${id}',next:'${next}'})`; async function compile(nodes,options={}) { diff --git a/tests/compiler/extract.test.mjs b/tests/compiler/extract.test.mjs index 27837a1..497dc78 100644 --- a/tests/compiler/extract.test.mjs +++ b/tests/compiler/extract.test.mjs @@ -4,7 +4,7 @@ import { createHash } from 'node:crypto'; import { createSourceSnapshot, createCompileContext } from '../../src/compiler/source.mjs'; import { extractWorkflow } from '../../src/compiler/extract.mjs'; -const imports = "import {defineWorkflow as wf, node, action, verification, parallel, condition, loop, human, terminal as end} from '@devcodex/flowkit/dsl';\n"; +const imports = "import {defineWorkflow as wf, node, action, verification, parallel, condition, loop, human, terminal as end} from '@devcodex-labs/flowkit/dsl';\n"; const source = (nodes, extras = '') => `${imports}export default wf({id:'demo',version:'1.0.0',name:'示例',nodes:[${nodes}]${extras}});`; const extract = (text, ext = 'js') => extractWorkflow(createSourceSnapshot(text, `fixtures/demo.workflow.${ext}`)); @@ -48,9 +48,9 @@ test('rejects executable and nonliteral syntax without executing side effects', source("end('done',{name:'End',status:'succeeded'})").replace('export default', 'const x = 1; export default'), source("{id:'done',name:'End',type:'terminal',status:'succeeded'}"), source("end('done',{name:'End',status:'succeeded'})", ',extra:{nested:node(\'x\',{})}'), - "import * as dsl from '@devcodex/flowkit/dsl'; export default dsl.defineWorkflow({});", - "import dsl from '@devcodex/flowkit/dsl'; export default dsl({});", - source("end('done',{name:'End',status:'succeeded'})").replace('@devcodex/flowkit/dsl', 'node:fs'), + "import * as dsl from '@devcodex-labs/flowkit/dsl'; export default dsl.defineWorkflow({});", + "import dsl from '@devcodex-labs/flowkit/dsl'; export default dsl({});", + source("end('done',{name:'End',status:'succeeded'})").replace('@devcodex-labs/flowkit/dsl', 'node:fs'), source("end('done',{name:'End',status:'succeeded'}),,"), ]; for (const text of bad) { diff --git a/tests/compiler/format.test.mjs b/tests/compiler/format.test.mjs index f9bcdea..03cd563 100644 --- a/tests/compiler/format.test.mjs +++ b/tests/compiler/format.test.mjs @@ -7,7 +7,7 @@ import { compilationPaths } from '../../src/compiler/paths.mjs'; import { analyzeSource } from '../../src/compiler/analyze.mjs'; import { checkMermaidIds, renderMermaid } from '../../src/compiler/mermaid.mjs'; -const analyze = nodes => analyzeSource(`import {defineWorkflow,node,action,parallel,verification,loop,human,terminal,condition} from '@devcodex/flowkit/dsl';export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[${nodes.join(',')}]});`, +const analyze = nodes => analyzeSource(`import {defineWorkflow,node,action,parallel,verification,loop,human,terminal,condition} from '@devcodex-labs/flowkit/dsl';export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[${nodes.join(',')}]});`, { filename:'format.workflow.js', skillCheck:false }); const end="terminal('done',{name:'Done',status:'succeeded'})"; diff --git a/tests/compiler/generated-contract.test.mjs b/tests/compiler/generated-contract.test.mjs index e7ad3d1..12bbef6 100644 --- a/tests/compiler/generated-contract.test.mjs +++ b/tests/compiler/generated-contract.test.mjs @@ -5,7 +5,7 @@ import { compileToText } from '../../src/compiler/compile.mjs'; import { createSourceSnapshot } from '../../src/compiler/source.mjs'; import { evalWhen } from '../../src/when/evaluate.mjs'; -const imports="import {defineWorkflow,node,action,parallel,condition,verification,loop,human,terminal} from '@devcodex/flowkit/dsl';"; +const imports="import {defineWorkflow,node,action,parallel,condition,verification,loop,human,terminal} from '@devcodex-labs/flowkit/dsl';"; const end="terminal('done',{name:'Done',status:'succeeded'})"; const text=nodes=>`${imports}\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[${nodes.join(',')}]});\n`; const compile=async(nodes,options={})=>{ diff --git a/tests/compiler/graph.test.mjs b/tests/compiler/graph.test.mjs index 92517d6..1007258 100644 --- a/tests/compiler/graph.test.mjs +++ b/tests/compiler/graph.test.mjs @@ -3,7 +3,7 @@ import assert from 'node:assert/strict'; import { analyzeSource } from '../../src/compiler/analyze.mjs'; import { EXIT } from '../../src/compiler/graph-algorithms.mjs'; -const imports = "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl';"; +const imports = "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl';"; const end = (id='done') => `terminal('${id}',{name:'${id}',status:'succeeded'})`; const action = (id,next,extra='') => `action('${id}',{name:'${id}',action:'save',next:'${next}'${extra}})`; const analyze = nodes => analyzeSource(`${imports}\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[${nodes.join(',')}]});`, diff --git a/tests/compiler/skills.test.mjs b/tests/compiler/skills.test.mjs index 9e9b4f7..e649c31 100644 --- a/tests/compiler/skills.test.mjs +++ b/tests/compiler/skills.test.mjs @@ -8,7 +8,7 @@ import { validIntegrity } from '../../src/compiler/skill-check.mjs'; function source(fields) { const entries = Object.entries(fields).map(([key, value]) => `${JSON.stringify(key)}:${JSON.stringify(value)}`).join(','); - return `import {defineWorkflow,node,terminal} from '@devcodex/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[node('n',{name:'N',output:{type:'object'},next:'done',${entries}}),terminal('done',{name:'Done',status:'succeeded'})]});`; + return `import {defineWorkflow,node,terminal} from '@devcodex-labs/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[node('n',{name:'N',output:{type:'object'},next:'done',${entries}}),terminal('done',{name:'Done',status:'succeeded'})]});`; } const analyze = (fields, options = {}) => analyzeSource(source(fields), { filename: 'demo.workflow.js', skillCheck: false, ...options, diff --git a/tests/compiler/validate.test.mjs b/tests/compiler/validate.test.mjs index c394617..e97e797 100644 --- a/tests/compiler/validate.test.mjs +++ b/tests/compiler/validate.test.mjs @@ -5,7 +5,7 @@ import { extractWorkflow } from '../../src/compiler/extract.mjs'; import { isSemVer, validateFields } from '../../src/compiler/validate.mjs'; import { ERROR_CATALOG } from '../../src/shared/contracts.mjs'; -const header = "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl';\n"; +const header = "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl';\n"; const terminal = "terminal('done',{name:'Done',status:'succeeded'})"; const definition = (nodes = terminal, fields = "id:'demo',version:'1.0.0',name:'Demo'") => `${header}export default defineWorkflow({${fields},nodes:[${nodes}]});`; diff --git a/tests/contracts.test.mjs b/tests/contracts.test.mjs index 4d5dd8e..830256e 100644 --- a/tests/contracts.test.mjs +++ b/tests/contracts.test.mjs @@ -33,6 +33,6 @@ test('字段、类型和目录边界固定且不可改写', async () => { assert.equal(typeof pkg.private, 'boolean'); assert.equal(pkg.type, 'module'); assert.equal(pkg.engines.node, '>=22.13.0'); - assert.deepEqual(Object.keys(pkg.exports), ['.', './dsl', './package.json']); + assert.deepEqual(Object.keys(pkg.exports), ['.', './dsl', './capability-graph', './package.json']); assert.deepEqual(pkg.dependencies, { acorn: '8.19.0' }); }); diff --git a/tests/dsl.test.mjs b/tests/dsl.test.mjs index 88a7f99..158240e 100644 --- a/tests/dsl.test.mjs +++ b/tests/dsl.test.mjs @@ -109,8 +109,8 @@ test('不执行getter,拒绝循环、函数与非字面数据', () => { }); test('built DSL and compiler entries are consumable while internal modules stay private', async () => { - const built = await import('@devcodex/flowkit/dsl'); + const built = await import('@devcodex-labs/flowkit/dsl'); assert.equal(built.terminal('ok', { name: '完成', status: 'succeeded' }).type, 'terminal'); - await assert.rejects(import('@devcodex/flowkit/src/shared/contracts.mjs'), { code: 'ERR_PACKAGE_PATH_NOT_EXPORTED' }); - assert.deepEqual(Object.keys(await import('@devcodex/flowkit')), ['check', 'compile', 'compileSource', 'evalWhen', 'isControlSignal', 'run']); + await assert.rejects(import('@devcodex-labs/flowkit/src/shared/contracts.mjs'), { code: 'ERR_PACKAGE_PATH_NOT_EXPORTED' }); + assert.deepEqual(Object.keys(await import('@devcodex-labs/flowkit')), ['check', 'compile', 'compileSource', 'evalWhen', 'isControlSignal', 'run']); }); diff --git a/tests/fixtures/errors/FK_C001.json b/tests/fixtures/errors/FK_C001.json index c02590c..76aeda9 100644 --- a/tests/fixtures/errors/FK_C001.json +++ b/tests/fixtures/errors/FK_C001.json @@ -2,11 +2,11 @@ "code": "FK_C001", "kind": "compile", "invalid": { - "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl';\nexport default defineWorkflow({id:'Bad',version:'1.0.0',name:'Demo',nodes:[terminal('done',{name:'done',status:'succeeded'})]});\n", + "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl';\nexport default defineWorkflow({id:'Bad',version:'1.0.0',name:'Demo',nodes:[terminal('done',{name:'done',status:'succeeded'})]});\n", "options": {} }, "valid": { - "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[terminal('done',{name:'done',status:'succeeded'})]});\n", + "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[terminal('done',{name:'done',status:'succeeded'})]});\n", "options": {} } } diff --git a/tests/fixtures/errors/FK_C002.json b/tests/fixtures/errors/FK_C002.json index 25b2044..2875a78 100644 --- a/tests/fixtures/errors/FK_C002.json +++ b/tests/fixtures/errors/FK_C002.json @@ -2,11 +2,11 @@ "code": "FK_C002", "kind": "compile", "invalid": { - "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'01.0.0',name:'Demo',nodes:[terminal('done',{name:'done',status:'succeeded'})]});\n", + "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'01.0.0',name:'Demo',nodes:[terminal('done',{name:'done',status:'succeeded'})]});\n", "options": {} }, "valid": { - "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[terminal('done',{name:'done',status:'succeeded'})]});\n", + "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[terminal('done',{name:'done',status:'succeeded'})]});\n", "options": {} } } diff --git a/tests/fixtures/errors/FK_C003.json b/tests/fixtures/errors/FK_C003.json index 47af9ee..bca6e9e 100644 --- a/tests/fixtures/errors/FK_C003.json +++ b/tests/fixtures/errors/FK_C003.json @@ -2,11 +2,11 @@ "code": "FK_C003", "kind": "compile", "invalid": { - "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'bad*/',nodes:[terminal('done',{name:'done',status:'succeeded'})]});\n", + "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'bad*/',nodes:[terminal('done',{name:'done',status:'succeeded'})]});\n", "options": {} }, "valid": { - "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[terminal('done',{name:'done',status:'succeeded'})]});\n", + "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[terminal('done',{name:'done',status:'succeeded'})]});\n", "options": {} } } diff --git a/tests/fixtures/errors/FK_C004.json b/tests/fixtures/errors/FK_C004.json index a8c6139..1f65ffc 100644 --- a/tests/fixtures/errors/FK_C004.json +++ b/tests/fixtures/errors/FK_C004.json @@ -2,11 +2,11 @@ "code": "FK_C004", "kind": "compile", "invalid": { - "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[]});\n", + "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[]});\n", "options": {} }, "valid": { - "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[terminal('done',{name:'done',status:'succeeded'})]});\n", + "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[terminal('done',{name:'done',status:'succeeded'})]});\n", "options": {} } } diff --git a/tests/fixtures/errors/FK_C006.json b/tests/fixtures/errors/FK_C006.json index 38637f7..8f2b07f 100644 --- a/tests/fixtures/errors/FK_C006.json +++ b/tests/fixtures/errors/FK_C006.json @@ -2,11 +2,11 @@ "code": "FK_C006", "kind": "compile", "invalid": { - "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',extra:1,nodes:[terminal('done',{name:'done',status:'succeeded'})]});\n", + "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',extra:1,nodes:[terminal('done',{name:'done',status:'succeeded'})]});\n", "options": {} }, "valid": { - "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[terminal('done',{name:'done',status:'succeeded'})]});\n", + "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[terminal('done',{name:'done',status:'succeeded'})]});\n", "options": {} } } diff --git a/tests/fixtures/errors/FK_C007.json b/tests/fixtures/errors/FK_C007.json index 207b691..0925cef 100644 --- a/tests/fixtures/errors/FK_C007.json +++ b/tests/fixtures/errors/FK_C007.json @@ -2,11 +2,11 @@ "code": "FK_C007", "kind": "compile", "invalid": { - "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[...[]]});\n", + "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[...[]]});\n", "options": {} }, "valid": { - "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[terminal('done',{name:'done',status:'succeeded'})]});\n", + "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[terminal('done',{name:'done',status:'succeeded'})]});\n", "options": {} } } diff --git a/tests/fixtures/errors/FK_C010.json b/tests/fixtures/errors/FK_C010.json index 7b7f1c7..02bbf6c 100644 --- a/tests/fixtures/errors/FK_C010.json +++ b/tests/fixtures/errors/FK_C010.json @@ -2,11 +2,11 @@ "code": "FK_C010", "kind": "compile", "invalid": { - "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[terminal('Bad',{name:'Done',status:'succeeded'})]});\n", + "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[terminal('Bad',{name:'Done',status:'succeeded'})]});\n", "options": {} }, "valid": { - "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[terminal('done',{name:'done',status:'succeeded'})]});\n", + "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[terminal('done',{name:'done',status:'succeeded'})]});\n", "options": {} } } diff --git a/tests/fixtures/errors/FK_C011.json b/tests/fixtures/errors/FK_C011.json index 72147da..890e05e 100644 --- a/tests/fixtures/errors/FK_C011.json +++ b/tests/fixtures/errors/FK_C011.json @@ -2,11 +2,11 @@ "code": "FK_C011", "kind": "compile", "invalid": { - "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[terminal('done',{name:'done',status:'succeeded'}),terminal('done',{name:'done',status:'succeeded'})]});\n", + "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[terminal('done',{name:'done',status:'succeeded'}),terminal('done',{name:'done',status:'succeeded'})]});\n", "options": {} }, "valid": { - "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[terminal('done',{name:'done',status:'succeeded'})]});\n", + "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[terminal('done',{name:'done',status:'succeeded'})]});\n", "options": {} } } diff --git a/tests/fixtures/errors/FK_C012.json b/tests/fixtures/errors/FK_C012.json index 187efeb..8392e17 100644 --- a/tests/fixtures/errors/FK_C012.json +++ b/tests/fixtures/errors/FK_C012.json @@ -2,11 +2,11 @@ "code": "FK_C012", "kind": "compile", "invalid": { - "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[terminal('done',{name:'bad*/',status:'succeeded'})]});\n", + "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[terminal('done',{name:'bad*/',status:'succeeded'})]});\n", "options": {} }, "valid": { - "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[terminal('done',{name:'done',status:'succeeded'})]});\n", + "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[terminal('done',{name:'done',status:'succeeded'})]});\n", "options": {} } } diff --git a/tests/fixtures/errors/FK_C013.json b/tests/fixtures/errors/FK_C013.json index 2c97fbf..6e929c0 100644 --- a/tests/fixtures/errors/FK_C013.json +++ b/tests/fixtures/errors/FK_C013.json @@ -2,11 +2,11 @@ "code": "FK_C013", "kind": "compile", "invalid": { - "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[terminal('done',{name:'done',status:'succeeded'}),terminal('other',{name:'done',status:'succeeded'})]});\n", + "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[terminal('done',{name:'done',status:'succeeded'}),terminal('other',{name:'done',status:'succeeded'})]});\n", "options": {} }, "valid": { - "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[terminal('done',{name:'done',status:'succeeded'})]});\n", + "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[terminal('done',{name:'done',status:'succeeded'})]});\n", "options": {} } } diff --git a/tests/fixtures/errors/FK_C014.json b/tests/fixtures/errors/FK_C014.json index 2f3adf8..22893c1 100644 --- a/tests/fixtures/errors/FK_C014.json +++ b/tests/fixtures/errors/FK_C014.json @@ -2,11 +2,11 @@ "code": "FK_C014", "kind": "compile", "invalid": { - "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[terminal('done',{name:'Done',type:'agent',status:'succeeded'})]});\n", + "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[terminal('done',{name:'Done',type:'agent',status:'succeeded'})]});\n", "options": {} }, "valid": { - "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[terminal('done',{name:'done',status:'succeeded'})]});\n", + "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[terminal('done',{name:'done',status:'succeeded'})]});\n", "options": {} } } diff --git a/tests/fixtures/errors/FK_C015.json b/tests/fixtures/errors/FK_C015.json index 9244d92..fd0dcdb 100644 --- a/tests/fixtures/errors/FK_C015.json +++ b/tests/fixtures/errors/FK_C015.json @@ -2,11 +2,11 @@ "code": "FK_C015", "kind": "compile", "invalid": { - "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[action('a',{name:'a',action:'save',next:'missing'}),terminal('done',{name:'done',status:'succeeded'})]});\n", + "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[action('a',{name:'a',action:'save',next:'missing'}),terminal('done',{name:'done',status:'succeeded'})]});\n", "options": {} }, "valid": { - "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[action('a',{name:'a',action:'save',next:'done'}),terminal('done',{name:'done',status:'succeeded'})]});\n", + "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[action('a',{name:'a',action:'save',next:'done'}),terminal('done',{name:'done',status:'succeeded'})]});\n", "options": {} } } diff --git a/tests/fixtures/errors/FK_C016.json b/tests/fixtures/errors/FK_C016.json index 75577c2..d940a4f 100644 --- a/tests/fixtures/errors/FK_C016.json +++ b/tests/fixtures/errors/FK_C016.json @@ -2,11 +2,11 @@ "code": "FK_C016", "kind": "compile", "invalid": { - "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[action('a',{name:'a',action:'save'}),terminal('done',{name:'done',status:'succeeded'})]});\n", + "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[action('a',{name:'a',action:'save'}),terminal('done',{name:'done',status:'succeeded'})]});\n", "options": {} }, "valid": { - "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[action('a',{name:'a',action:'save',next:'done'}),terminal('done',{name:'done',status:'succeeded'})]});\n", + "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[action('a',{name:'a',action:'save',next:'done'}),terminal('done',{name:'done',status:'succeeded'})]});\n", "options": {} } } diff --git a/tests/fixtures/errors/FK_C017.json b/tests/fixtures/errors/FK_C017.json index 8ba1cc2..ff1823a 100644 --- a/tests/fixtures/errors/FK_C017.json +++ b/tests/fixtures/errors/FK_C017.json @@ -2,11 +2,11 @@ "code": "FK_C017", "kind": "compile", "invalid": { - "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[terminal('done',{name:'done',status:'succeeded'}),terminal('unused',{name:'unused',status:'succeeded'})]});\n", + "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[terminal('done',{name:'done',status:'succeeded'}),terminal('unused',{name:'unused',status:'succeeded'})]});\n", "options": {} }, "valid": { - "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[terminal('done',{name:'done',status:'succeeded'})]});\n", + "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[terminal('done',{name:'done',status:'succeeded'})]});\n", "options": {} } } diff --git a/tests/fixtures/errors/FK_C018.json b/tests/fixtures/errors/FK_C018.json index 0d9bc49..283946a 100644 --- a/tests/fixtures/errors/FK_C018.json +++ b/tests/fixtures/errors/FK_C018.json @@ -2,11 +2,11 @@ "code": "FK_C018", "kind": "compile", "invalid": { - "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[terminal('done',{name:'Done',status:'succeeded',extra:1})]});\n", + "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[terminal('done',{name:'Done',status:'succeeded',extra:1})]});\n", "options": {} }, "valid": { - "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[terminal('done',{name:'done',status:'succeeded'})]});\n", + "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[terminal('done',{name:'done',status:'succeeded'})]});\n", "options": {} } } diff --git a/tests/fixtures/errors/FK_C019.json b/tests/fixtures/errors/FK_C019.json index 543a9cb..f94c199 100644 --- a/tests/fixtures/errors/FK_C019.json +++ b/tests/fixtures/errors/FK_C019.json @@ -2,11 +2,11 @@ "code": "FK_C019", "kind": "compile", "invalid": { - "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[action('a',{name:'a',action:'save',next:'done',writes:null}),terminal('done',{name:'done',status:'succeeded'})]});\n", + "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[action('a',{name:'a',action:'save',next:'done',writes:null}),terminal('done',{name:'done',status:'succeeded'})]});\n", "options": {} }, "valid": { - "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[action('a',{name:'a',action:'save',next:'done',writes:[]}),terminal('done',{name:'done',status:'succeeded'})]});\n", + "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[action('a',{name:'a',action:'save',next:'done',writes:[]}),terminal('done',{name:'done',status:'succeeded'})]});\n", "options": {} } } diff --git a/tests/fixtures/errors/FK_C020.json b/tests/fixtures/errors/FK_C020.json index e26941c..7087f00 100644 --- a/tests/fixtures/errors/FK_C020.json +++ b/tests/fixtures/errors/FK_C020.json @@ -2,11 +2,11 @@ "code": "FK_C020", "kind": "compile", "invalid": { - "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[parallel('p',{name:'P',branches:['a'],join:{strategy:'any',next:'done'}}),action('a',{name:'a',action:'save'}),action('b',{name:'b',action:'save'}),terminal('done',{name:'done',status:'succeeded'})]});\n", + "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[parallel('p',{name:'P',branches:['a'],join:{strategy:'any',next:'done'}}),action('a',{name:'a',action:'save'}),action('b',{name:'b',action:'save'}),terminal('done',{name:'done',status:'succeeded'})]});\n", "options": {} }, "valid": { - "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[parallel('p',{name:'P',branches:['a','b'],join:{strategy:'any',next:'done'}}),action('a',{name:'a',action:'save'}),action('b',{name:'b',action:'save'}),terminal('done',{name:'done',status:'succeeded'})]});\n", + "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[parallel('p',{name:'P',branches:['a','b'],join:{strategy:'any',next:'done'}}),action('a',{name:'a',action:'save'}),action('b',{name:'b',action:'save'}),terminal('done',{name:'done',status:'succeeded'})]});\n", "options": {} } } diff --git a/tests/fixtures/errors/FK_C021.json b/tests/fixtures/errors/FK_C021.json index efd7793..7549cad 100644 --- a/tests/fixtures/errors/FK_C021.json +++ b/tests/fixtures/errors/FK_C021.json @@ -2,11 +2,11 @@ "code": "FK_C021", "kind": "compile", "invalid": { - "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[parallel('p',{name:'P',branches:['a','b'],join:{strategy:'any',next:'done'}}),action('a',{name:'a',action:'save',next:'done'}),action('b',{name:'b',action:'save'}),terminal('done',{name:'done',status:'succeeded'})]});\n", + "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[parallel('p',{name:'P',branches:['a','b'],join:{strategy:'any',next:'done'}}),action('a',{name:'a',action:'save',next:'done'}),action('b',{name:'b',action:'save'}),terminal('done',{name:'done',status:'succeeded'})]});\n", "options": {} }, "valid": { - "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[parallel('p',{name:'P',branches:['a','b'],join:{strategy:'any',next:'done'}}),action('a',{name:'a',action:'save'}),action('b',{name:'b',action:'save'}),terminal('done',{name:'done',status:'succeeded'})]});\n", + "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[parallel('p',{name:'P',branches:['a','b'],join:{strategy:'any',next:'done'}}),action('a',{name:'a',action:'save'}),action('b',{name:'b',action:'save'}),terminal('done',{name:'done',status:'succeeded'})]});\n", "options": {} } } diff --git a/tests/fixtures/errors/FK_C022.json b/tests/fixtures/errors/FK_C022.json index b50ea5a..4032e98 100644 --- a/tests/fixtures/errors/FK_C022.json +++ b/tests/fixtures/errors/FK_C022.json @@ -2,11 +2,11 @@ "code": "FK_C022", "kind": "compile", "invalid": { - "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[parallel('p',{name:'P',branches:['a','b'],join:{strategy:'any',next:'done'}}),terminal('a',{name:'a',status:'succeeded'}),action('b',{name:'b',action:'save'}),terminal('done',{name:'done',status:'succeeded'})]});\n", + "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[parallel('p',{name:'P',branches:['a','b'],join:{strategy:'any',next:'done'}}),terminal('a',{name:'a',status:'succeeded'}),action('b',{name:'b',action:'save'}),terminal('done',{name:'done',status:'succeeded'})]});\n", "options": {} }, "valid": { - "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[parallel('p',{name:'P',branches:['a','b'],join:{strategy:'any',next:'done'}}),action('a',{name:'a',action:'save'}),action('b',{name:'b',action:'save'}),terminal('done',{name:'done',status:'succeeded'})]});\n", + "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[parallel('p',{name:'P',branches:['a','b'],join:{strategy:'any',next:'done'}}),action('a',{name:'a',action:'save'}),action('b',{name:'b',action:'save'}),terminal('done',{name:'done',status:'succeeded'})]});\n", "options": {} } } diff --git a/tests/fixtures/errors/FK_C023.json b/tests/fixtures/errors/FK_C023.json index 5f3fc7d..efb9934 100644 --- a/tests/fixtures/errors/FK_C023.json +++ b/tests/fixtures/errors/FK_C023.json @@ -2,11 +2,11 @@ "code": "FK_C023", "kind": "compile", "invalid": { - "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[parallel('p',{name:'P',branches:['a','b'],join:{strategy:'all',next:'done'}}),action('a',{name:'a',action:'save'}),action('b',{name:'b',action:'save'}),terminal('done',{name:'done',status:'succeeded'})]});\n", + "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[parallel('p',{name:'P',branches:['a','b'],join:{strategy:'all',next:'done'}}),action('a',{name:'a',action:'save'}),action('b',{name:'b',action:'save'}),terminal('done',{name:'done',status:'succeeded'})]});\n", "options": {} }, "valid": { - "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[parallel('p',{name:'P',branches:['a','b'],join:{strategy:'any',next:'done'}}),action('a',{name:'a',action:'save'}),action('b',{name:'b',action:'save'}),terminal('done',{name:'done',status:'succeeded'})]});\n", + "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[parallel('p',{name:'P',branches:['a','b'],join:{strategy:'any',next:'done'}}),action('a',{name:'a',action:'save'}),action('b',{name:'b',action:'save'}),terminal('done',{name:'done',status:'succeeded'})]});\n", "options": {} } } diff --git a/tests/fixtures/errors/FK_C024.json b/tests/fixtures/errors/FK_C024.json index 7efe78a..9b8591f 100644 --- a/tests/fixtures/errors/FK_C024.json +++ b/tests/fixtures/errors/FK_C024.json @@ -2,11 +2,11 @@ "code": "FK_C024", "kind": "compile", "invalid": { - "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[parallel('p',{name:'P',branches:['a','b'],join:{strategy:'any',next:'a'}}),action('a',{name:'a',action:'save'}),action('b',{name:'b',action:'save'}),terminal('done',{name:'done',status:'succeeded'})]});\n", + "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[parallel('p',{name:'P',branches:['a','b'],join:{strategy:'any',next:'a'}}),action('a',{name:'a',action:'save'}),action('b',{name:'b',action:'save'}),terminal('done',{name:'done',status:'succeeded'})]});\n", "options": {} }, "valid": { - "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[parallel('p',{name:'P',branches:['a','b'],join:{strategy:'any',next:'done'}}),action('a',{name:'a',action:'save'}),action('b',{name:'b',action:'save'}),terminal('done',{name:'done',status:'succeeded'})]});\n", + "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[parallel('p',{name:'P',branches:['a','b'],join:{strategy:'any',next:'done'}}),action('a',{name:'a',action:'save'}),action('b',{name:'b',action:'save'}),terminal('done',{name:'done',status:'succeeded'})]});\n", "options": {} } } diff --git a/tests/fixtures/errors/FK_C025.json b/tests/fixtures/errors/FK_C025.json index 0d38467..bd18740 100644 --- a/tests/fixtures/errors/FK_C025.json +++ b/tests/fixtures/errors/FK_C025.json @@ -2,11 +2,11 @@ "code": "FK_C025", "kind": "compile", "invalid": { - "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[parallel('p',{name:'P',branches:['a','b'],join:{strategy:'any',next:'done'}}),verification('a',{name:'a',verifier:'check',onSuccess:'done',onFailure:'done'}),action('b',{name:'b',action:'save'}),terminal('done',{name:'done',status:'succeeded'})]});\n", + "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[parallel('p',{name:'P',branches:['a','b'],join:{strategy:'any',next:'done'}}),verification('a',{name:'a',verifier:'check',onSuccess:'done',onFailure:'done'}),action('b',{name:'b',action:'save'}),terminal('done',{name:'done',status:'succeeded'})]});\n", "options": {} }, "valid": { - "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[parallel('p',{name:'P',branches:['a','b'],join:{strategy:'any',next:'done'}}),verification('a',{name:'a',verifier:'check'}),action('b',{name:'b',action:'save'}),terminal('done',{name:'done',status:'succeeded'})]});\n", + "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[parallel('p',{name:'P',branches:['a','b'],join:{strategy:'any',next:'done'}}),verification('a',{name:'a',verifier:'check'}),action('b',{name:'b',action:'save'}),terminal('done',{name:'done',status:'succeeded'})]});\n", "options": {} } } diff --git a/tests/fixtures/errors/FK_C026.json b/tests/fixtures/errors/FK_C026.json index b625b2f..cff334f 100644 --- a/tests/fixtures/errors/FK_C026.json +++ b/tests/fixtures/errors/FK_C026.json @@ -2,11 +2,11 @@ "code": "FK_C026", "kind": "compile", "invalid": { - "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[parallel('p',{name:'P',branches:['a','b'],join:{strategy:'any',next:'done'}}),action('a',{name:'a',action:'save',writes:['x']}),action('b',{name:'b',action:'save',writes:['x']}),terminal('done',{name:'done',status:'succeeded'})]});\n", + "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[parallel('p',{name:'P',branches:['a','b'],join:{strategy:'any',next:'done'}}),action('a',{name:'a',action:'save',writes:['x']}),action('b',{name:'b',action:'save',writes:['x']}),terminal('done',{name:'done',status:'succeeded'})]});\n", "options": {} }, "valid": { - "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[parallel('p',{name:'P',branches:['a','b'],join:{strategy:'any',next:'done'}}),action('a',{name:'a',action:'save',writes:['x']}),action('b',{name:'b',action:'save',writes:['y']}),terminal('done',{name:'done',status:'succeeded'})]});\n", + "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[parallel('p',{name:'P',branches:['a','b'],join:{strategy:'any',next:'done'}}),action('a',{name:'a',action:'save',writes:['x']}),action('b',{name:'b',action:'save',writes:['y']}),terminal('done',{name:'done',status:'succeeded'})]});\n", "options": {} } } diff --git a/tests/fixtures/errors/FK_C030.json b/tests/fixtures/errors/FK_C030.json index ced8213..58aa2f8 100644 --- a/tests/fixtures/errors/FK_C030.json +++ b/tests/fixtures/errors/FK_C030.json @@ -2,11 +2,11 @@ "code": "FK_C030", "kind": "compile", "invalid": { - "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[condition('c',{name:'C',branches:[]}),terminal('done',{name:'done',status:'succeeded'})]});\n", + "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[condition('c',{name:'C',branches:[]}),terminal('done',{name:'done',status:'succeeded'})]});\n", "options": {} }, "valid": { - "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[condition('c',{name:'C',branches:[{when:\"flag\",next:'done'},{when:'true',next:'done'}]}),terminal('done',{name:'done',status:'succeeded'})]});\n", + "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[condition('c',{name:'C',branches:[{when:\"flag\",next:'done'},{when:'true',next:'done'}]}),terminal('done',{name:'done',status:'succeeded'})]});\n", "options": {} } } diff --git a/tests/fixtures/errors/FK_C031.json b/tests/fixtures/errors/FK_C031.json index ab9f189..3440392 100644 --- a/tests/fixtures/errors/FK_C031.json +++ b/tests/fixtures/errors/FK_C031.json @@ -2,11 +2,11 @@ "code": "FK_C031", "kind": "compile", "invalid": { - "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[condition('c',{name:'C',branches:[{when:'flag',next:'done'}]}),terminal('done',{name:'done',status:'succeeded'})]});\n", + "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[condition('c',{name:'C',branches:[{when:'flag',next:'done'}]}),terminal('done',{name:'done',status:'succeeded'})]});\n", "options": {} }, "valid": { - "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[condition('c',{name:'C',branches:[{when:\"flag\",next:'done'},{when:'true',next:'done'}]}),terminal('done',{name:'done',status:'succeeded'})]});\n", + "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[condition('c',{name:'C',branches:[{when:\"flag\",next:'done'},{when:'true',next:'done'}]}),terminal('done',{name:'done',status:'succeeded'})]});\n", "options": {} } } diff --git a/tests/fixtures/errors/FK_C032.json b/tests/fixtures/errors/FK_C032.json index b2e3067..a0652eb 100644 --- a/tests/fixtures/errors/FK_C032.json +++ b/tests/fixtures/errors/FK_C032.json @@ -2,11 +2,11 @@ "code": "FK_C032", "kind": "compile", "invalid": { - "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[condition('c',{name:'C',branches:[{when:\"flag &&\",next:'done'},{when:'true',next:'done'}]}),terminal('done',{name:'done',status:'succeeded'})]});\n", + "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[condition('c',{name:'C',branches:[{when:\"flag &&\",next:'done'},{when:'true',next:'done'}]}),terminal('done',{name:'done',status:'succeeded'})]});\n", "options": {} }, "valid": { - "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[condition('c',{name:'C',branches:[{when:\"flag\",next:'done'},{when:'true',next:'done'}]}),terminal('done',{name:'done',status:'succeeded'})]});\n", + "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[condition('c',{name:'C',branches:[{when:\"flag\",next:'done'},{when:'true',next:'done'}]}),terminal('done',{name:'done',status:'succeeded'})]});\n", "options": {} } } diff --git a/tests/fixtures/errors/FK_C033.json b/tests/fixtures/errors/FK_C033.json index 29205a2..284e7eb 100644 --- a/tests/fixtures/errors/FK_C033.json +++ b/tests/fixtures/errors/FK_C033.json @@ -2,11 +2,11 @@ "code": "FK_C033", "kind": "compile", "invalid": { - "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[condition('c',{name:'C',branches:[{when:\"fn()\",next:'done'},{when:'true',next:'done'}]}),terminal('done',{name:'done',status:'succeeded'})]});\n", + "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[condition('c',{name:'C',branches:[{when:\"fn()\",next:'done'},{when:'true',next:'done'}]}),terminal('done',{name:'done',status:'succeeded'})]});\n", "options": {} }, "valid": { - "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[condition('c',{name:'C',branches:[{when:\"flag\",next:'done'},{when:'true',next:'done'}]}),terminal('done',{name:'done',status:'succeeded'})]});\n", + "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[condition('c',{name:'C',branches:[{when:\"flag\",next:'done'},{when:'true',next:'done'}]}),terminal('done',{name:'done',status:'succeeded'})]});\n", "options": {} } } diff --git a/tests/fixtures/errors/FK_C034.json b/tests/fixtures/errors/FK_C034.json index 375a4c9..9f94c7a 100644 --- a/tests/fixtures/errors/FK_C034.json +++ b/tests/fixtures/errors/FK_C034.json @@ -2,11 +2,11 @@ "code": "FK_C034", "kind": "compile", "invalid": { - "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[condition('c',{name:'C',branches:[{when:\"true\\n\",next:'done'},{when:'true',next:'done'}]}),terminal('done',{name:'done',status:'succeeded'})]});\n", + "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[condition('c',{name:'C',branches:[{when:\"true\\n\",next:'done'},{when:'true',next:'done'}]}),terminal('done',{name:'done',status:'succeeded'})]});\n", "options": {} }, "valid": { - "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[condition('c',{name:'C',branches:[{when:\"flag\",next:'done'},{when:'true',next:'done'}]}),terminal('done',{name:'done',status:'succeeded'})]});\n", + "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[condition('c',{name:'C',branches:[{when:\"flag\",next:'done'},{when:'true',next:'done'}]}),terminal('done',{name:'done',status:'succeeded'})]});\n", "options": {} } } diff --git a/tests/fixtures/errors/FK_C040.json b/tests/fixtures/errors/FK_C040.json index 75baf6d..22e8d8c 100644 --- a/tests/fixtures/errors/FK_C040.json +++ b/tests/fixtures/errors/FK_C040.json @@ -2,11 +2,11 @@ "code": "FK_C040", "kind": "compile", "invalid": { - "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[loop('l',{name:'L',maxIterations:0,body:'v',onSuccess:'done',onMaxExceeded:'failed'}),verification('v',{name:'V',verifier:'check',onSuccess:'l',onFailure:'repair'}),action('repair',{name:'repair',action:'save',next:'v'}),terminal('done',{name:'done',status:'succeeded'}),terminal('failed',{name:'failed',status:'succeeded'})]});\n", + "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[loop('l',{name:'L',maxIterations:0,body:'v',onSuccess:'done',onMaxExceeded:'failed'}),verification('v',{name:'V',verifier:'check',onSuccess:'l',onFailure:'repair'}),action('repair',{name:'repair',action:'save',next:'v'}),terminal('done',{name:'done',status:'succeeded'}),terminal('failed',{name:'failed',status:'succeeded'})]});\n", "options": {} }, "valid": { - "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[loop('l',{name:'L',maxIterations:3,body:'v',onSuccess:'done',onMaxExceeded:'failed'}),verification('v',{name:'V',verifier:'check',onSuccess:'l',onFailure:'repair'}),action('repair',{name:'repair',action:'save',next:'v'}),terminal('done',{name:'done',status:'succeeded'}),terminal('failed',{name:'failed',status:'succeeded'})]});\n", + "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[loop('l',{name:'L',maxIterations:3,body:'v',onSuccess:'done',onMaxExceeded:'failed'}),verification('v',{name:'V',verifier:'check',onSuccess:'l',onFailure:'repair'}),action('repair',{name:'repair',action:'save',next:'v'}),terminal('done',{name:'done',status:'succeeded'}),terminal('failed',{name:'failed',status:'succeeded'})]});\n", "options": {} } } diff --git a/tests/fixtures/errors/FK_C041.json b/tests/fixtures/errors/FK_C041.json index 2f72db9..9a1f8df 100644 --- a/tests/fixtures/errors/FK_C041.json +++ b/tests/fixtures/errors/FK_C041.json @@ -2,11 +2,11 @@ "code": "FK_C041", "kind": "compile", "invalid": { - "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[loop('l',{name:'L',maxIterations:3,body:'v',onSuccess:'done',onMaxExceeded:'failed'}),action('v',{name:'v',action:'save',next:'repair'}),action('repair',{name:'repair',action:'save',next:'v'}),terminal('done',{name:'done',status:'succeeded'}),terminal('failed',{name:'failed',status:'succeeded'})]});\n", + "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[loop('l',{name:'L',maxIterations:3,body:'v',onSuccess:'done',onMaxExceeded:'failed'}),action('v',{name:'v',action:'save',next:'repair'}),action('repair',{name:'repair',action:'save',next:'v'}),terminal('done',{name:'done',status:'succeeded'}),terminal('failed',{name:'failed',status:'succeeded'})]});\n", "options": {} }, "valid": { - "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[loop('l',{name:'L',maxIterations:3,body:'v',onSuccess:'done',onMaxExceeded:'failed'}),verification('v',{name:'V',verifier:'check',onSuccess:'l',onFailure:'repair'}),action('repair',{name:'repair',action:'save',next:'v'}),terminal('done',{name:'done',status:'succeeded'}),terminal('failed',{name:'failed',status:'succeeded'})]});\n", + "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[loop('l',{name:'L',maxIterations:3,body:'v',onSuccess:'done',onMaxExceeded:'failed'}),verification('v',{name:'V',verifier:'check',onSuccess:'l',onFailure:'repair'}),action('repair',{name:'repair',action:'save',next:'v'}),terminal('done',{name:'done',status:'succeeded'}),terminal('failed',{name:'failed',status:'succeeded'})]});\n", "options": {} } } diff --git a/tests/fixtures/errors/FK_C042.json b/tests/fixtures/errors/FK_C042.json index 334bb91..dc18df1 100644 --- a/tests/fixtures/errors/FK_C042.json +++ b/tests/fixtures/errors/FK_C042.json @@ -2,11 +2,11 @@ "code": "FK_C042", "kind": "compile", "invalid": { - "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[loop('l',{name:'L',maxIterations:3,body:'v',onSuccess:'done',onMaxExceeded:'failed'}),verification('v',{name:'V',verifier:'check',onSuccess:'l',onFailure:'repair'}),action('repair',{name:'repair',action:'save',next:'done'}),terminal('done',{name:'done',status:'succeeded'}),terminal('failed',{name:'failed',status:'succeeded'})]});\n", + "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[loop('l',{name:'L',maxIterations:3,body:'v',onSuccess:'done',onMaxExceeded:'failed'}),verification('v',{name:'V',verifier:'check',onSuccess:'l',onFailure:'repair'}),action('repair',{name:'repair',action:'save',next:'done'}),terminal('done',{name:'done',status:'succeeded'}),terminal('failed',{name:'failed',status:'succeeded'})]});\n", "options": {} }, "valid": { - "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[loop('l',{name:'L',maxIterations:3,body:'v',onSuccess:'done',onMaxExceeded:'failed'}),verification('v',{name:'V',verifier:'check',onSuccess:'l',onFailure:'repair'}),action('repair',{name:'repair',action:'save',next:'v'}),terminal('done',{name:'done',status:'succeeded'}),terminal('failed',{name:'failed',status:'succeeded'})]});\n", + "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[loop('l',{name:'L',maxIterations:3,body:'v',onSuccess:'done',onMaxExceeded:'failed'}),verification('v',{name:'V',verifier:'check',onSuccess:'l',onFailure:'repair'}),action('repair',{name:'repair',action:'save',next:'v'}),terminal('done',{name:'done',status:'succeeded'}),terminal('failed',{name:'failed',status:'succeeded'})]});\n", "options": {} } } diff --git a/tests/fixtures/errors/FK_C043.json b/tests/fixtures/errors/FK_C043.json index 582a475..4e1a19b 100644 --- a/tests/fixtures/errors/FK_C043.json +++ b/tests/fixtures/errors/FK_C043.json @@ -2,11 +2,11 @@ "code": "FK_C043", "kind": "compile", "invalid": { - "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[loop('l',{name:'L',maxIterations:3,body:'v',onSuccess:'done',onMaxExceeded:'failed'}),verification('v',{name:'V',verifier:'check',onSuccess:'l',onFailure:'repair'}),parallel('repair',{name:'Repair',branches:['a','b'],join:{strategy:'any',next:'v'}}),terminal('done',{name:'done',status:'succeeded'}),terminal('failed',{name:'failed',status:'succeeded'}),action('a',{name:'a',action:'save'}),action('b',{name:'b',action:'save'})]});\n", + "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[loop('l',{name:'L',maxIterations:3,body:'v',onSuccess:'done',onMaxExceeded:'failed'}),verification('v',{name:'V',verifier:'check',onSuccess:'l',onFailure:'repair'}),parallel('repair',{name:'Repair',branches:['a','b'],join:{strategy:'any',next:'v'}}),terminal('done',{name:'done',status:'succeeded'}),terminal('failed',{name:'failed',status:'succeeded'}),action('a',{name:'a',action:'save'}),action('b',{name:'b',action:'save'})]});\n", "options": {} }, "valid": { - "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[loop('l',{name:'L',maxIterations:3,body:'v',onSuccess:'done',onMaxExceeded:'failed'}),verification('v',{name:'V',verifier:'check',onSuccess:'l',onFailure:'repair'}),action('repair',{name:'repair',action:'save',next:'v'}),terminal('done',{name:'done',status:'succeeded'}),terminal('failed',{name:'failed',status:'succeeded'})]});\n", + "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[loop('l',{name:'L',maxIterations:3,body:'v',onSuccess:'done',onMaxExceeded:'failed'}),verification('v',{name:'V',verifier:'check',onSuccess:'l',onFailure:'repair'}),action('repair',{name:'repair',action:'save',next:'v'}),terminal('done',{name:'done',status:'succeeded'}),terminal('failed',{name:'failed',status:'succeeded'})]});\n", "options": {} } } diff --git a/tests/fixtures/errors/FK_C044.json b/tests/fixtures/errors/FK_C044.json index f520adf..4a577d1 100644 --- a/tests/fixtures/errors/FK_C044.json +++ b/tests/fixtures/errors/FK_C044.json @@ -2,11 +2,11 @@ "code": "FK_C044", "kind": "compile", "invalid": { - "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[action('start',{name:'start',action:'save',next:'v'}),loop('l',{name:'L',maxIterations:3,body:'v',onSuccess:'done',onMaxExceeded:'failed'}),verification('v',{name:'V',verifier:'check',onSuccess:'l',onFailure:'repair'}),action('repair',{name:'repair',action:'save',next:'v'}),terminal('done',{name:'done',status:'succeeded'}),terminal('failed',{name:'failed',status:'succeeded'})]});\n", + "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[action('start',{name:'start',action:'save',next:'v'}),loop('l',{name:'L',maxIterations:3,body:'v',onSuccess:'done',onMaxExceeded:'failed'}),verification('v',{name:'V',verifier:'check',onSuccess:'l',onFailure:'repair'}),action('repair',{name:'repair',action:'save',next:'v'}),terminal('done',{name:'done',status:'succeeded'}),terminal('failed',{name:'failed',status:'succeeded'})]});\n", "options": {} }, "valid": { - "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[action('start',{name:'start',action:'save',next:'l'}),loop('l',{name:'L',maxIterations:3,body:'v',onSuccess:'done',onMaxExceeded:'failed'}),verification('v',{name:'V',verifier:'check',onSuccess:'l',onFailure:'repair'}),action('repair',{name:'repair',action:'save',next:'v'}),terminal('done',{name:'done',status:'succeeded'}),terminal('failed',{name:'failed',status:'succeeded'})]});\n", + "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[action('start',{name:'start',action:'save',next:'l'}),loop('l',{name:'L',maxIterations:3,body:'v',onSuccess:'done',onMaxExceeded:'failed'}),verification('v',{name:'V',verifier:'check',onSuccess:'l',onFailure:'repair'}),action('repair',{name:'repair',action:'save',next:'v'}),terminal('done',{name:'done',status:'succeeded'}),terminal('failed',{name:'failed',status:'succeeded'})]});\n", "options": {} } } diff --git a/tests/fixtures/errors/FK_C045.json b/tests/fixtures/errors/FK_C045.json index cfe5b03..d92e0c0 100644 --- a/tests/fixtures/errors/FK_C045.json +++ b/tests/fixtures/errors/FK_C045.json @@ -2,11 +2,11 @@ "code": "FK_C045", "kind": "compile", "invalid": { - "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[loop('l',{name:'L',maxIterations:3,body:'v',onSuccess:'done',onMaxExceeded:'failed'}),verification('v',{name:'V',verifier:'check',onSuccess:'l',onFailure:'repair'}),loop('repair',{name:'Repair',maxIterations:2,body:'v',onSuccess:'done',onMaxExceeded:'failed'}),terminal('done',{name:'done',status:'succeeded'}),terminal('failed',{name:'failed',status:'succeeded'})]});\n", + "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[loop('l',{name:'L',maxIterations:3,body:'v',onSuccess:'done',onMaxExceeded:'failed'}),verification('v',{name:'V',verifier:'check',onSuccess:'l',onFailure:'repair'}),loop('repair',{name:'Repair',maxIterations:2,body:'v',onSuccess:'done',onMaxExceeded:'failed'}),terminal('done',{name:'done',status:'succeeded'}),terminal('failed',{name:'failed',status:'succeeded'})]});\n", "options": {} }, "valid": { - "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[loop('l',{name:'L',maxIterations:3,body:'v',onSuccess:'done',onMaxExceeded:'failed'}),verification('v',{name:'V',verifier:'check',onSuccess:'l',onFailure:'repair'}),action('repair',{name:'repair',action:'save',next:'v'}),terminal('done',{name:'done',status:'succeeded'}),terminal('failed',{name:'failed',status:'succeeded'})]});\n", + "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[loop('l',{name:'L',maxIterations:3,body:'v',onSuccess:'done',onMaxExceeded:'failed'}),verification('v',{name:'V',verifier:'check',onSuccess:'l',onFailure:'repair'}),action('repair',{name:'repair',action:'save',next:'v'}),terminal('done',{name:'done',status:'succeeded'}),terminal('failed',{name:'failed',status:'succeeded'})]});\n", "options": {} } } diff --git a/tests/fixtures/errors/FK_C046.json b/tests/fixtures/errors/FK_C046.json index a392770..7742047 100644 --- a/tests/fixtures/errors/FK_C046.json +++ b/tests/fixtures/errors/FK_C046.json @@ -2,11 +2,11 @@ "code": "FK_C046", "kind": "compile", "invalid": { - "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[loop('l',{name:'L',maxIterations:3,body:'v',onSuccess:'done',onMaxExceeded:'failed'}),verification('v',{name:'V',verifier:'check',onSuccess:'l',onFailure:'repair'}),human('repair',{name:'Repair',onApprove:'v',onReject:'repair'}),terminal('done',{name:'done',status:'succeeded'}),terminal('failed',{name:'failed',status:'succeeded'})]});\n", + "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[loop('l',{name:'L',maxIterations:3,body:'v',onSuccess:'done',onMaxExceeded:'failed'}),verification('v',{name:'V',verifier:'check',onSuccess:'l',onFailure:'repair'}),human('repair',{name:'Repair',onApprove:'v',onReject:'repair'}),terminal('done',{name:'done',status:'succeeded'}),terminal('failed',{name:'failed',status:'succeeded'})]});\n", "options": {} }, "valid": { - "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[loop('l',{name:'L',maxIterations:3,body:'v',onSuccess:'done',onMaxExceeded:'failed'}),verification('v',{name:'V',verifier:'check',onSuccess:'l',onFailure:'repair'}),action('repair',{name:'repair',action:'save',next:'v'}),terminal('done',{name:'done',status:'succeeded'}),terminal('failed',{name:'failed',status:'succeeded'})]});\n", + "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[loop('l',{name:'L',maxIterations:3,body:'v',onSuccess:'done',onMaxExceeded:'failed'}),verification('v',{name:'V',verifier:'check',onSuccess:'l',onFailure:'repair'}),action('repair',{name:'repair',action:'save',next:'v'}),terminal('done',{name:'done',status:'succeeded'}),terminal('failed',{name:'failed',status:'succeeded'})]});\n", "options": {} } } diff --git a/tests/fixtures/errors/FK_C047.json b/tests/fixtures/errors/FK_C047.json index 3a4ccbd..b905743 100644 --- a/tests/fixtures/errors/FK_C047.json +++ b/tests/fixtures/errors/FK_C047.json @@ -2,11 +2,11 @@ "code": "FK_C047", "kind": "compile", "invalid": { - "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[loop('l',{name:'L',maxIterations:3,body:'v',onSuccess:'done',onMaxExceeded:'failed'}),verification('v',{name:'V',verifier:'check',onSuccess:'l',onFailure:'repair'}),action('repair',{name:'repair',action:'save',next:'l'}),terminal('done',{name:'done',status:'succeeded'}),terminal('failed',{name:'failed',status:'succeeded'})]});\n", + "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[loop('l',{name:'L',maxIterations:3,body:'v',onSuccess:'done',onMaxExceeded:'failed'}),verification('v',{name:'V',verifier:'check',onSuccess:'l',onFailure:'repair'}),action('repair',{name:'repair',action:'save',next:'l'}),terminal('done',{name:'done',status:'succeeded'}),terminal('failed',{name:'failed',status:'succeeded'})]});\n", "options": {} }, "valid": { - "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[loop('l',{name:'L',maxIterations:3,body:'v',onSuccess:'done',onMaxExceeded:'failed'}),verification('v',{name:'V',verifier:'check',onSuccess:'l',onFailure:'repair'}),action('repair',{name:'repair',action:'save',next:'v'}),terminal('done',{name:'done',status:'succeeded'}),terminal('failed',{name:'failed',status:'succeeded'})]});\n", + "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[loop('l',{name:'L',maxIterations:3,body:'v',onSuccess:'done',onMaxExceeded:'failed'}),verification('v',{name:'V',verifier:'check',onSuccess:'l',onFailure:'repair'}),action('repair',{name:'repair',action:'save',next:'v'}),terminal('done',{name:'done',status:'succeeded'}),terminal('failed',{name:'failed',status:'succeeded'})]});\n", "options": {} } } diff --git a/tests/fixtures/errors/FK_C050.json b/tests/fixtures/errors/FK_C050.json index a3890d8..1ef1ca4 100644 --- a/tests/fixtures/errors/FK_C050.json +++ b/tests/fixtures/errors/FK_C050.json @@ -2,11 +2,11 @@ "code": "FK_C050", "kind": "compile", "invalid": { - "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[node('n',{name:'N',output:{type:'object'},next:'done'}),terminal('done',{name:'done',status:'succeeded'})]});\n", + "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[node('n',{name:'N',output:{type:'object'},next:'done'}),terminal('done',{name:'done',status:'succeeded'})]});\n", "options": {} }, "valid": { - "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[node('n',{name:'N',skill:'skills/writer.md',output:{type:'object'},next:'done'}),terminal('done',{name:'done',status:'succeeded'})]});\n", + "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[node('n',{name:'N',skill:'skills/writer.md',output:{type:'object'},next:'done'}),terminal('done',{name:'done',status:'succeeded'})]});\n", "options": {} } } diff --git a/tests/fixtures/errors/FK_C051.json b/tests/fixtures/errors/FK_C051.json index 4bfe967..21e3d23 100644 --- a/tests/fixtures/errors/FK_C051.json +++ b/tests/fixtures/errors/FK_C051.json @@ -2,11 +2,11 @@ "code": "FK_C051", "kind": "compile", "invalid": { - "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[node('n',{name:'N',skill:'skills/missing.md',output:{type:'object'},next:'done'}),terminal('done',{name:'done',status:'succeeded'})]});\n", + "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[node('n',{name:'N',skill:'skills/missing.md',output:{type:'object'},next:'done'}),terminal('done',{name:'done',status:'succeeded'})]});\n", "options": {} }, "valid": { - "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[node('n',{name:'N',skill:'skills/writer.md',output:{type:'object'},next:'done'}),terminal('done',{name:'done',status:'succeeded'})]});\n", + "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[node('n',{name:'N',skill:'skills/writer.md',output:{type:'object'},next:'done'}),terminal('done',{name:'done',status:'succeeded'})]});\n", "options": {} } } diff --git a/tests/fixtures/errors/FK_C052.json b/tests/fixtures/errors/FK_C052.json index cea1e47..98c3bde 100644 --- a/tests/fixtures/errors/FK_C052.json +++ b/tests/fixtures/errors/FK_C052.json @@ -2,11 +2,11 @@ "code": "FK_C052", "kind": "compile", "invalid": { - "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[node('n',{name:'N',skill:'skills\\\\writer.md',output:{type:'object'},next:'done'}),terminal('done',{name:'done',status:'succeeded'})]});\n", + "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[node('n',{name:'N',skill:'skills\\\\writer.md',output:{type:'object'},next:'done'}),terminal('done',{name:'done',status:'succeeded'})]});\n", "options": {} }, "valid": { - "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[node('n',{name:'N',skill:'skills/writer.md',output:{type:'object'},next:'done'}),terminal('done',{name:'done',status:'succeeded'})]});\n", + "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[node('n',{name:'N',skill:'skills/writer.md',output:{type:'object'},next:'done'}),terminal('done',{name:'done',status:'succeeded'})]});\n", "options": {} } } diff --git a/tests/fixtures/errors/FK_C053.json b/tests/fixtures/errors/FK_C053.json index bf004aa..dd47718 100644 --- a/tests/fixtures/errors/FK_C053.json +++ b/tests/fixtures/errors/FK_C053.json @@ -2,11 +2,11 @@ "code": "FK_C053", "kind": "compile", "invalid": { - "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[condition('c',{name:'C',branches:[{when:'flag',next:'write'},{when:'true',next:'read'}]}),action('write',{name:'write',action:'save',next:'done',writes:['x']}),node('read',{name:'N',agent:'writer',output:{type:'object'},next:'done',inputs:['x']}),terminal('done',{name:'done',status:'succeeded'})]});\n", + "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[condition('c',{name:'C',branches:[{when:'flag',next:'write'},{when:'true',next:'read'}]}),action('write',{name:'write',action:'save',next:'done',writes:['x']}),node('read',{name:'N',agent:'writer',output:{type:'object'},next:'done',inputs:['x']}),terminal('done',{name:'done',status:'succeeded'})]});\n", "options": {} }, "valid": { - "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[condition('c',{name:'C',branches:[{when:'flag',next:'write'},{when:'true',next:'write'}]}),action('write',{name:'write',action:'save',next:'read',writes:['x']}),node('read',{name:'N',agent:'writer',output:{type:'object'},next:'done',inputs:['x']}),terminal('done',{name:'done',status:'succeeded'})]});\n", + "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[condition('c',{name:'C',branches:[{when:'flag',next:'write'},{when:'true',next:'write'}]}),action('write',{name:'write',action:'save',next:'read',writes:['x']}),node('read',{name:'N',agent:'writer',output:{type:'object'},next:'done',inputs:['x']}),terminal('done',{name:'done',status:'succeeded'})]});\n", "options": {} } } diff --git a/tests/fixtures/errors/FK_C054.json b/tests/fixtures/errors/FK_C054.json index bcd28ec..c9f1ecc 100644 --- a/tests/fixtures/errors/FK_C054.json +++ b/tests/fixtures/errors/FK_C054.json @@ -2,11 +2,11 @@ "code": "FK_C054", "kind": "compile", "invalid": { - "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[node('n',{name:'N',agent:'writer',output:{type:'array'},next:'done'}),terminal('done',{name:'done',status:'succeeded'})]});\n", + "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[node('n',{name:'N',agent:'writer',output:{type:'array'},next:'done'}),terminal('done',{name:'done',status:'succeeded'})]});\n", "options": {} }, "valid": { - "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[node('n',{name:'N',skill:'skills/writer.md',output:{type:'object'},next:'done'}),terminal('done',{name:'done',status:'succeeded'})]});\n", + "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[node('n',{name:'N',skill:'skills/writer.md',output:{type:'object'},next:'done'}),terminal('done',{name:'done',status:'succeeded'})]});\n", "options": {} } } diff --git a/tests/fixtures/errors/FK_C055.json b/tests/fixtures/errors/FK_C055.json index e4f7d89..6819a13 100644 --- a/tests/fixtures/errors/FK_C055.json +++ b/tests/fixtures/errors/FK_C055.json @@ -2,11 +2,11 @@ "code": "FK_C055", "kind": "compile", "invalid": { - "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[node('n',{name:'N',agent:'writer',output:{type:'object'},next:'done',retries:11}),terminal('done',{name:'done',status:'succeeded'})]});\n", + "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[node('n',{name:'N',agent:'writer',output:{type:'object'},next:'done',retries:11}),terminal('done',{name:'done',status:'succeeded'})]});\n", "options": {} }, "valid": { - "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[node('n',{name:'N',skill:'skills/writer.md',output:{type:'object'},next:'done'}),terminal('done',{name:'done',status:'succeeded'})]});\n", + "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[node('n',{name:'N',skill:'skills/writer.md',output:{type:'object'},next:'done'}),terminal('done',{name:'done',status:'succeeded'})]});\n", "options": {} } } diff --git a/tests/fixtures/errors/FK_C056.json b/tests/fixtures/errors/FK_C056.json index 4c3cdac..d294ab6 100644 --- a/tests/fixtures/errors/FK_C056.json +++ b/tests/fixtures/errors/FK_C056.json @@ -2,11 +2,11 @@ "code": "FK_C056", "kind": "compile", "invalid": { - "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[action('a',{name:'a',action:'save',next:'done',writes:['x','x']}),terminal('done',{name:'done',status:'succeeded'})]});\n", + "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[action('a',{name:'a',action:'save',next:'done',writes:['x','x']}),terminal('done',{name:'done',status:'succeeded'})]});\n", "options": {} }, "valid": { - "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[action('a',{name:'a',action:'save',next:'done',writes:['x']}),terminal('done',{name:'done',status:'succeeded'})]});\n", + "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[action('a',{name:'a',action:'save',next:'done',writes:['x']}),terminal('done',{name:'done',status:'succeeded'})]});\n", "options": {} } } diff --git a/tests/fixtures/errors/FK_C057.json b/tests/fixtures/errors/FK_C057.json index e8c6ea3..9e2b4ea 100644 --- a/tests/fixtures/errors/FK_C057.json +++ b/tests/fixtures/errors/FK_C057.json @@ -2,11 +2,11 @@ "code": "FK_C057", "kind": "compile", "invalid": { - "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[node('n',{name:'N',skill:'https://skills.example.test/style.md',integrity:'sha256-GVdESIiHGUAdgUwF8wkh3HmX5deMlNBOUtZXJWVTaW4=',output:{type:'object'},next:'done'}),terminal('done',{name:'done',status:'succeeded'})]});\n", + "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[node('n',{name:'N',skill:'https://skills.example.test/style.md',integrity:'sha256-GVdESIiHGUAdgUwF8wkh3HmX5deMlNBOUtZXJWVTaW4=',output:{type:'object'},next:'done'}),terminal('done',{name:'done',status:'succeeded'})]});\n", "options": {} }, "valid": { - "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[node('n',{name:'N',skill:'https://skills.example.test/style.md',integrity:'sha256-GVdESIiHGUAdgUwF8wkh3HmX5deMlNBOUtZXJWVTaW4=',output:{type:'object'},next:'done'}),terminal('done',{name:'done',status:'succeeded'})]});\n", + "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[node('n',{name:'N',skill:'https://skills.example.test/style.md',integrity:'sha256-GVdESIiHGUAdgUwF8wkh3HmX5deMlNBOUtZXJWVTaW4=',output:{type:'object'},next:'done'}),terminal('done',{name:'done',status:'succeeded'})]});\n", "options": { "remoteSkillHosts": [ "skills.example.test" diff --git a/tests/fixtures/errors/FK_C058.json b/tests/fixtures/errors/FK_C058.json index 33e723e..3652629 100644 --- a/tests/fixtures/errors/FK_C058.json +++ b/tests/fixtures/errors/FK_C058.json @@ -2,7 +2,7 @@ "code": "FK_C058", "kind": "compile", "invalid": { - "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[node('n',{name:'N',skill:'https://skills.example.test/style.md',integrity:'',output:{type:'object'},next:'done'}),terminal('done',{name:'done',status:'succeeded'})]});\n", + "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[node('n',{name:'N',skill:'https://skills.example.test/style.md',integrity:'',output:{type:'object'},next:'done'}),terminal('done',{name:'done',status:'succeeded'})]});\n", "options": { "remoteSkillHosts": [ "skills.example.test" @@ -10,7 +10,7 @@ } }, "valid": { - "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[node('n',{name:'N',skill:'https://skills.example.test/style.md',integrity:'sha256-GVdESIiHGUAdgUwF8wkh3HmX5deMlNBOUtZXJWVTaW4=',output:{type:'object'},next:'done'}),terminal('done',{name:'done',status:'succeeded'})]});\n", + "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[node('n',{name:'N',skill:'https://skills.example.test/style.md',integrity:'sha256-GVdESIiHGUAdgUwF8wkh3HmX5deMlNBOUtZXJWVTaW4=',output:{type:'object'},next:'done'}),terminal('done',{name:'done',status:'succeeded'})]});\n", "options": { "remoteSkillHosts": [ "skills.example.test" diff --git a/tests/fixtures/errors/FK_C059.json b/tests/fixtures/errors/FK_C059.json index f6c55b6..a8b7ec9 100644 --- a/tests/fixtures/errors/FK_C059.json +++ b/tests/fixtures/errors/FK_C059.json @@ -2,7 +2,7 @@ "code": "FK_C059", "kind": "compile", "invalid": { - "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[node('n',{name:'N',skill:'https://skills.example.test/style.md',output:{type:'object'},next:'done'}),terminal('done',{name:'done',status:'succeeded'})]});\n", + "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[node('n',{name:'N',skill:'https://skills.example.test/style.md',output:{type:'object'},next:'done'}),terminal('done',{name:'done',status:'succeeded'})]});\n", "options": { "remoteSkillHosts": [ "skills.example.test" @@ -10,7 +10,7 @@ } }, "valid": { - "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[node('n',{name:'N',skill:'https://skills.example.test/style.md',integrity:'sha256-GVdESIiHGUAdgUwF8wkh3HmX5deMlNBOUtZXJWVTaW4=',output:{type:'object'},next:'done'}),terminal('done',{name:'done',status:'succeeded'})]});\n", + "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[node('n',{name:'N',skill:'https://skills.example.test/style.md',integrity:'sha256-GVdESIiHGUAdgUwF8wkh3HmX5deMlNBOUtZXJWVTaW4=',output:{type:'object'},next:'done'}),terminal('done',{name:'done',status:'succeeded'})]});\n", "options": { "remoteSkillHosts": [ "skills.example.test" diff --git a/tests/fixtures/errors/FK_C060.json b/tests/fixtures/errors/FK_C060.json index d17c5e1..ddbe982 100644 --- a/tests/fixtures/errors/FK_C060.json +++ b/tests/fixtures/errors/FK_C060.json @@ -2,11 +2,11 @@ "code": "FK_C060", "kind": "compile", "invalid": { - "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[human('h',{name:'H',onApprove:'done',onReject:'repair'}),action('repair',{name:'repair',action:'save',next:'done'}),terminal('done',{name:'done',status:'succeeded'})]});\n", + "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[human('h',{name:'H',onApprove:'done',onReject:'repair'}),action('repair',{name:'repair',action:'save',next:'done'}),terminal('done',{name:'done',status:'succeeded'})]});\n", "options": {} }, "valid": { - "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[human('h',{name:'H',onApprove:'done',onReject:'repair'}),action('repair',{name:'repair',action:'save',next:'h'}),terminal('done',{name:'done',status:'succeeded'})]});\n", + "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[human('h',{name:'H',onApprove:'done',onReject:'repair'}),action('repair',{name:'repair',action:'save',next:'h'}),terminal('done',{name:'done',status:'succeeded'})]});\n", "options": {} } } diff --git a/tests/fixtures/errors/FK_C061.json b/tests/fixtures/errors/FK_C061.json index d31b69e..42d4202 100644 --- a/tests/fixtures/errors/FK_C061.json +++ b/tests/fixtures/errors/FK_C061.json @@ -2,11 +2,11 @@ "code": "FK_C061", "kind": "compile", "invalid": { - "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[human('h',{name:'H',onApprove:'done',onReject:'repair'}),condition('repair',{name:'Repair',branches:[{when:'true',next:'h'}]}),terminal('done',{name:'done',status:'succeeded'})]});\n", + "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[human('h',{name:'H',onApprove:'done',onReject:'repair'}),condition('repair',{name:'Repair',branches:[{when:'true',next:'h'}]}),terminal('done',{name:'done',status:'succeeded'})]});\n", "options": {} }, "valid": { - "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[human('h',{name:'H',onApprove:'done',onReject:'repair'}),action('repair',{name:'repair',action:'save',next:'h'}),terminal('done',{name:'done',status:'succeeded'})]});\n", + "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[human('h',{name:'H',onApprove:'done',onReject:'repair'}),action('repair',{name:'repair',action:'save',next:'h'}),terminal('done',{name:'done',status:'succeeded'})]});\n", "options": {} } } diff --git a/tests/fixtures/errors/FK_C070.json b/tests/fixtures/errors/FK_C070.json index e71e3c9..f209255 100644 --- a/tests/fixtures/errors/FK_C070.json +++ b/tests/fixtures/errors/FK_C070.json @@ -2,11 +2,11 @@ "code": "FK_C070", "kind": "compile", "invalid": { - "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[terminal('done',{name:'Done',status:'ok'})]});\n", + "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[terminal('done',{name:'Done',status:'ok'})]});\n", "options": {} }, "valid": { - "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[terminal('done',{name:'done',status:'succeeded'})]});\n", + "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[terminal('done',{name:'done',status:'succeeded'})]});\n", "options": {} } } diff --git a/tests/fixtures/errors/FK_C080.json b/tests/fixtures/errors/FK_C080.json index 8c51ac4..a6a420b 100644 --- a/tests/fixtures/errors/FK_C080.json +++ b/tests/fixtures/errors/FK_C080.json @@ -2,11 +2,11 @@ "code": "FK_C080", "kind": "compile", "invalid": { - "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[action('a',{name:'a',action:'save',next:'a'})]});\n", + "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[action('a',{name:'a',action:'save',next:'a'})]});\n", "options": {} }, "valid": { - "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[action('a',{name:'a',action:'save',next:'done'}),terminal('done',{name:'done',status:'succeeded'})]});\n", + "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[action('a',{name:'a',action:'save',next:'done'}),terminal('done',{name:'done',status:'succeeded'})]});\n", "options": {} } } diff --git a/tests/fixtures/errors/FK_C090.json b/tests/fixtures/errors/FK_C090.json index b070a1d..9bc9a8e 100644 --- a/tests/fixtures/errors/FK_C090.json +++ b/tests/fixtures/errors/FK_C090.json @@ -2,11 +2,11 @@ "code": "FK_C090", "kind": "compile", "invalid": { - "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[action('a-0',{name:'a-0',action:'save',next:'a0'}),action('a0',{name:'a0',action:'save',next:'done'}),terminal('done',{name:'done',status:'succeeded'})]});\n", + "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[action('a-0',{name:'a-0',action:'save',next:'a0'}),action('a0',{name:'a0',action:'save',next:'done'}),terminal('done',{name:'done',status:'succeeded'})]});\n", "options": {} }, "valid": { - "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[action('a-0',{name:'a-0',action:'save',next:'b0'}),action('b0',{name:'b0',action:'save',next:'done'}),terminal('done',{name:'done',status:'succeeded'})]});\n", + "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[action('a-0',{name:'a-0',action:'save',next:'b0'}),action('b0',{name:'b0',action:'save',next:'done'}),terminal('done',{name:'done',status:'succeeded'})]});\n", "options": {} } } diff --git a/tests/fixtures/errors/FK_R001.json b/tests/fixtures/errors/FK_R001.json index 3fe052b..ffefa57 100644 --- a/tests/fixtures/errors/FK_R001.json +++ b/tests/fixtures/errors/FK_R001.json @@ -2,7 +2,7 @@ "code": "FK_R001", "kind": "runtime", "invalid": { - "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[terminal('done',{name:'done',status:'succeeded'})]});\n", + "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[terminal('done',{name:'done',status:'succeeded'})]});\n", "mode": "stale-artifact", "options": { "skillCheck": false, @@ -12,7 +12,7 @@ } }, "valid": { - "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[terminal('done',{name:'done',status:'succeeded'})]});\n", + "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[terminal('done',{name:'done',status:'succeeded'})]});\n", "mode": "stale-artifact", "options": { "skillCheck": false, diff --git a/tests/fixtures/errors/FK_R002.json b/tests/fixtures/errors/FK_R002.json index acded2e..69f6a68 100644 --- a/tests/fixtures/errors/FK_R002.json +++ b/tests/fixtures/errors/FK_R002.json @@ -2,7 +2,7 @@ "code": "FK_R002", "kind": "runtime", "invalid": { - "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[human('h',{name:'H',onApprove:'done',onReject:'repair'}),action('repair',{name:'repair',action:'save',next:'h'}),terminal('done',{name:'done',status:'succeeded'})]});\n", + "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[human('h',{name:'H',onApprove:'done',onReject:'repair'}),action('repair',{name:'repair',action:'save',next:'h'}),terminal('done',{name:'done',status:'succeeded'})]});\n", "mode": "human-return", "options": { "skillCheck": false, @@ -12,7 +12,7 @@ } }, "valid": { - "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[human('h',{name:'H',onApprove:'done',onReject:'repair'}),action('repair',{name:'repair',action:'save',next:'h'}),terminal('done',{name:'done',status:'succeeded'})]});\n", + "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[human('h',{name:'H',onApprove:'done',onReject:'repair'}),action('repair',{name:'repair',action:'save',next:'h'}),terminal('done',{name:'done',status:'succeeded'})]});\n", "mode": "human-return", "options": { "skillCheck": false, diff --git a/tests/fixtures/errors/FK_R003.json b/tests/fixtures/errors/FK_R003.json index eccfa5a..eacfc5f 100644 --- a/tests/fixtures/errors/FK_R003.json +++ b/tests/fixtures/errors/FK_R003.json @@ -3,7 +3,7 @@ "kind": "runtime", "reservedProbe": "v1 never emits this code; both branches are legal absence probes, not an invented trigger", "invalid": { - "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[terminal('done',{name:'done',status:'succeeded'})]});\n", + "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[terminal('done',{name:'done',status:'succeeded'})]});\n", "mode": "reserved", "options": { "skillCheck": false, @@ -13,7 +13,7 @@ } }, "valid": { - "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[terminal('done',{name:'done',status:'succeeded'})]});\n", + "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[terminal('done',{name:'done',status:'succeeded'})]});\n", "mode": "reserved", "options": { "skillCheck": false, diff --git a/tests/fixtures/errors/FK_R004.json b/tests/fixtures/errors/FK_R004.json index 884797b..9ba9f9a 100644 --- a/tests/fixtures/errors/FK_R004.json +++ b/tests/fixtures/errors/FK_R004.json @@ -2,7 +2,7 @@ "code": "FK_R004", "kind": "runtime", "invalid": { - "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[node('n',{name:'N',agent:'writer',output:{type:'object'},next:'done'}),terminal('done',{name:'done',status:'succeeded'})]});\n", + "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[node('n',{name:'N',agent:'writer',output:{type:'object'},next:'done'}),terminal('done',{name:'done',status:'succeeded'})]});\n", "mode": "agent-schema", "options": { "skillCheck": false, @@ -12,7 +12,7 @@ } }, "valid": { - "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[node('n',{name:'N',agent:'writer',output:{type:'object'},next:'done'}),terminal('done',{name:'done',status:'succeeded'})]});\n", + "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[node('n',{name:'N',agent:'writer',output:{type:'object'},next:'done'}),terminal('done',{name:'done',status:'succeeded'})]});\n", "mode": "agent-schema", "options": { "skillCheck": false, diff --git a/tests/fixtures/errors/FK_R010.json b/tests/fixtures/errors/FK_R010.json index 08d706c..2c691a9 100644 --- a/tests/fixtures/errors/FK_R010.json +++ b/tests/fixtures/errors/FK_R010.json @@ -2,7 +2,7 @@ "code": "FK_R010", "kind": "runtime", "invalid": { - "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[node('n',{name:'N',agent:'writer',output:{type:'object'},next:'done'}),terminal('done',{name:'done',status:'succeeded'})]});\n", + "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[node('n',{name:'N',agent:'writer',output:{type:'object'},next:'done'}),terminal('done',{name:'done',status:'succeeded'})]});\n", "mode": "missing-skill", "options": { "skillCheck": false, @@ -12,7 +12,7 @@ } }, "valid": { - "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[node('n',{name:'N',agent:'writer',output:{type:'object'},next:'done'}),terminal('done',{name:'done',status:'succeeded'})]});\n", + "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[node('n',{name:'N',agent:'writer',output:{type:'object'},next:'done'}),terminal('done',{name:'done',status:'succeeded'})]});\n", "mode": "missing-skill", "options": { "skillCheck": false, diff --git a/tests/fixtures/errors/FK_R011.json b/tests/fixtures/errors/FK_R011.json index 540fca0..984ace0 100644 --- a/tests/fixtures/errors/FK_R011.json +++ b/tests/fixtures/errors/FK_R011.json @@ -2,7 +2,7 @@ "code": "FK_R011", "kind": "runtime", "invalid": { - "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[node('n',{name:'N',agent:'writer',output:{type:'object'},next:'done'}),terminal('done',{name:'done',status:'succeeded'})]});\n", + "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[node('n',{name:'N',agent:'writer',output:{type:'object'},next:'done'}),terminal('done',{name:'done',status:'succeeded'})]});\n", "mode": "escaping-skill", "options": { "skillCheck": false, @@ -12,7 +12,7 @@ } }, "valid": { - "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[node('n',{name:'N',agent:'writer',output:{type:'object'},next:'done'}),terminal('done',{name:'done',status:'succeeded'})]});\n", + "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[node('n',{name:'N',agent:'writer',output:{type:'object'},next:'done'}),terminal('done',{name:'done',status:'succeeded'})]});\n", "mode": "escaping-skill", "options": { "skillCheck": false, diff --git a/tests/fixtures/errors/FK_R012.json b/tests/fixtures/errors/FK_R012.json index 70dd6bf..9654a38 100644 --- a/tests/fixtures/errors/FK_R012.json +++ b/tests/fixtures/errors/FK_R012.json @@ -2,7 +2,7 @@ "code": "FK_R012", "kind": "runtime", "invalid": { - "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[node('n',{name:'N',skill:'https://skills.example.test/style.md',integrity:'sha256-GVdESIiHGUAdgUwF8wkh3HmX5deMlNBOUtZXJWVTaW4=',output:{type:'object'},next:'done'}),terminal('done',{name:'done',status:'succeeded'})]});\n", + "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[node('n',{name:'N',skill:'https://skills.example.test/style.md',integrity:'sha256-GVdESIiHGUAdgUwF8wkh3HmX5deMlNBOUtZXJWVTaW4=',output:{type:'object'},next:'done'}),terminal('done',{name:'done',status:'succeeded'})]});\n", "mode": "cross-origin", "options": { "skillCheck": false, @@ -12,7 +12,7 @@ } }, "valid": { - "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[node('n',{name:'N',skill:'https://skills.example.test/style.md',integrity:'sha256-GVdESIiHGUAdgUwF8wkh3HmX5deMlNBOUtZXJWVTaW4=',output:{type:'object'},next:'done'}),terminal('done',{name:'done',status:'succeeded'})]});\n", + "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[node('n',{name:'N',skill:'https://skills.example.test/style.md',integrity:'sha256-GVdESIiHGUAdgUwF8wkh3HmX5deMlNBOUtZXJWVTaW4=',output:{type:'object'},next:'done'}),terminal('done',{name:'done',status:'succeeded'})]});\n", "mode": "cross-origin", "options": { "skillCheck": false, diff --git a/tests/fixtures/errors/FK_R013.json b/tests/fixtures/errors/FK_R013.json index 829d1a9..1f43f09 100644 --- a/tests/fixtures/errors/FK_R013.json +++ b/tests/fixtures/errors/FK_R013.json @@ -2,7 +2,7 @@ "code": "FK_R013", "kind": "runtime", "invalid": { - "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[node('n',{name:'N',skill:'https://skills.example.test/style.md',integrity:'sha256-GVdESIiHGUAdgUwF8wkh3HmX5deMlNBOUtZXJWVTaW4=',output:{type:'object'},next:'done'}),terminal('done',{name:'done',status:'succeeded'})]});\n", + "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[node('n',{name:'N',skill:'https://skills.example.test/style.md',integrity:'sha256-GVdESIiHGUAdgUwF8wkh3HmX5deMlNBOUtZXJWVTaW4=',output:{type:'object'},next:'done'}),terminal('done',{name:'done',status:'succeeded'})]});\n", "mode": "digest-mismatch", "options": { "skillCheck": false, @@ -12,7 +12,7 @@ } }, "valid": { - "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[node('n',{name:'N',skill:'https://skills.example.test/style.md',integrity:'sha256-GVdESIiHGUAdgUwF8wkh3HmX5deMlNBOUtZXJWVTaW4=',output:{type:'object'},next:'done'}),terminal('done',{name:'done',status:'succeeded'})]});\n", + "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[node('n',{name:'N',skill:'https://skills.example.test/style.md',integrity:'sha256-GVdESIiHGUAdgUwF8wkh3HmX5deMlNBOUtZXJWVTaW4=',output:{type:'object'},next:'done'}),terminal('done',{name:'done',status:'succeeded'})]});\n", "mode": "digest-mismatch", "options": { "skillCheck": false, diff --git a/tests/fixtures/errors/FK_R014.json b/tests/fixtures/errors/FK_R014.json index a5408b0..08fea70 100644 --- a/tests/fixtures/errors/FK_R014.json +++ b/tests/fixtures/errors/FK_R014.json @@ -2,7 +2,7 @@ "code": "FK_R014", "kind": "runtime", "invalid": { - "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[node('n',{name:'N',agent:'writer',output:{type:'object'},next:'done'}),terminal('done',{name:'done',status:'succeeded'})]});\n", + "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[node('n',{name:'N',agent:'writer',output:{type:'object'},next:'done'}),terminal('done',{name:'done',status:'succeeded'})]});\n", "mode": "invalid-utf8", "options": { "skillCheck": false, @@ -12,7 +12,7 @@ } }, "valid": { - "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[node('n',{name:'N',agent:'writer',output:{type:'object'},next:'done'}),terminal('done',{name:'done',status:'succeeded'})]});\n", + "source": "import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl';\nexport default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[node('n',{name:'N',agent:'writer',output:{type:'object'},next:'done'}),terminal('done',{name:'done',status:'succeeded'})]});\n", "mode": "invalid-utf8", "options": { "skillCheck": false, diff --git a/tests/integrations/capability-graph.test.mjs b/tests/integrations/capability-graph.test.mjs new file mode 100644 index 0000000..bef27d1 --- /dev/null +++ b/tests/integrations/capability-graph.test.mjs @@ -0,0 +1,46 @@ +import test from 'node:test'; +import assert from 'node:assert/strict'; +import { flowkitProvider, createCapabilityGraphActionAdapter } from '../../src/integrations/capability-graph.mjs'; + +const resolved = status => ({ + nodes: [ + { capability: { id: 'demo::greet' }, applicability: { status } }, + { capability: { id: 'demo::ready' }, applicability: { status: 'applicable' } }, + ], + unresolved: [], meta: { completeness: 'complete' }, +}); + +test('Provider declares real public capabilities with stable graph IDs', () => { + assert.equal(flowkitProvider.providerId, 'flowkit'); + assert.equal(flowkitProvider.schemaVersion, 1); + assert.equal(new Set(flowkitProvider.capabilities.map(item => item.id)).size, flowkitProvider.capabilities.length); + assert(flowkitProvider.capabilities.some(item => item.id === 'run-workflow')); +}); +test('host binding resolves capability and dependencies before executing', async () => { + const calls = [], ctx = { state: {} }; + const graph = { async resolve(q) { calls.push(q); return resolved('applicable'); } }; + const adapter = createCapabilityGraphActionAdapter({ graph, getContext: () => ({ facts: { runtime: 'node' } }), + bindings: { greet: { capabilityId: 'demo::greet', async execute({ ctx, resolution }) { assert.equal(resolution.nodes.length, 2); ctx.state.message = 'ok'; } } } }); + await adapter.runAction('greet', 'Greeting', ctx); + assert.equal(ctx.state.message, 'ok'); assert.deepEqual(calls[0].relations, ['requires']); + assert.deepEqual(calls[0].context.facts, { runtime: 'node' }); +}); +test('missing binding, incomplete dependencies and unknown applicability fail closed', async () => { + let executed = false; + const binding = { greet: { capabilityId: 'demo::greet', execute() { executed = true; } } }; + const absent = createCapabilityGraphActionAdapter({ graph: { resolve: async () => resolved('applicable') }, bindings: binding }); + await assert.rejects(absent.runAction('missing', 'Missing', {}), { code: 'FK_CG_BINDING_MISSING' }); + const unknown = createCapabilityGraphActionAdapter({ graph: { resolve: async () => resolved('unknown') }, bindings: binding }); + await assert.rejects(unknown.runAction('greet', 'Greeting', {}), { code: 'FK_CG_NOT_APPLICABLE' }); + const partial = createCapabilityGraphActionAdapter({ graph: { resolve: async () => ({ ...resolved('applicable'), unresolved: [{ reason: 'target_unavailable' }] }) }, bindings: binding }); + await assert.rejects(partial.runAction('greet', 'Greeting', {}), { code: 'FK_CG_DEPENDENCIES_INCOMPLETE' }); + assert.equal(executed, false); +}); +test('Graph errors remain exact and invalid bindings are rejected', async () => { + const failure = Object.assign(new Error('denied'), { code: 'CG_ACCESS_DENIED' }); + const adapter = createCapabilityGraphActionAdapter({ graph: { resolve: async () => { throw failure; } }, + bindings: { greet: { capabilityId: 'demo::greet', execute() {} } } }); + await assert.rejects(adapter.runAction('greet', 'Greeting', {}), e => e === failure); + assert.throws(() => createCapabilityGraphActionAdapter({ graph: {}, bindings: {} }), /graph.resolve/); + assert.throws(() => createCapabilityGraphActionAdapter({ graph: { resolve() {} }, bindings: { bad: { capabilityId: '../unsafe', execute() {} } } }), /Invalid capability binding/); +}); diff --git a/tests/package/consumer-dom.ts b/tests/package/consumer-dom.ts index b42dfe9..eed3ed4 100644 --- a/tests/package/consumer-dom.ts +++ b/tests/package/consumer-dom.ts @@ -1,5 +1,5 @@ -import { compile, run, isControlSignal } from '@devcodex/flowkit'; -import type { FlowkitOptions, RunResult } from '@devcodex/flowkit'; +import { compile, run, isControlSignal } from '@devcodex-labs/flowkit'; +import type { FlowkitOptions, RunResult } from '@devcodex-labs/flowkit'; const options: FlowkitOptions = { fetch, signal: new AbortController().signal }; const result: Promise = run('sample.workflow.ts', { isControlSignal }, {}, options); void [compile('sample.workflow.ts'), result]; diff --git a/tests/package/consumer-invalid.ts b/tests/package/consumer-invalid.ts index 936c1e9..2da299e 100644 --- a/tests/package/consumer-invalid.ts +++ b/tests/package/consumer-invalid.ts @@ -1,4 +1,4 @@ -import { defineWorkflow, action } from '@devcodex/flowkit/dsl'; -import { main } from '@devcodex/flowkit/cli'; +import { defineWorkflow, action } from '@devcodex-labs/flowkit/dsl'; +import { main } from '@devcodex-labs/flowkit/cli'; defineWorkflow({ id: 'invalid', version: '1.0.0', name: 'Invalid', nodes: [action('a', { name: 'A', action: 'save', next: 'missing' })] }); void main; diff --git a/tests/package/consumer.cjs b/tests/package/consumer.cjs index 5ea9774..26b82bf 100644 --- a/tests/package/consumer.cjs +++ b/tests/package/consumer.cjs @@ -1,7 +1,7 @@ const assert = require('node:assert/strict'); (async () => { - const api = await import('@devcodex/flowkit'); - const dsl = await import('@devcodex/flowkit/dsl'); + const api = await import('@devcodex-labs/flowkit'); + const dsl = await import('@devcodex-labs/flowkit/dsl'); assert.equal(Object.keys(api).length, 6); assert.equal(Object.keys(dsl).length, 9); assert.deepEqual(await api.check('sample.workflow.ts', { trace: true, mermaid: false }), []); assert.equal((await api.run('sample.compiled.mjs', { isControlSignal: api.isControlSignal, runAgent: async () => ({}), validateResult: () => [], runAction: async () => {} })).terminal, 'done'); diff --git a/tests/package/consumer.mjs b/tests/package/consumer.mjs index 3133aee..423b251 100644 --- a/tests/package/consumer.mjs +++ b/tests/package/consumer.mjs @@ -2,18 +2,18 @@ import assert from 'node:assert/strict'; import { readFile, writeFile, mkdir, stat } from 'node:fs/promises'; import { fileURLToPath } from 'node:url'; import path from 'node:path'; -import * as api from '@devcodex/flowkit'; -import * as dsl from '@devcodex/flowkit/dsl'; -import pkg from '@devcodex/flowkit/package.json' with { type: 'json' }; +import * as api from '@devcodex-labs/flowkit'; +import * as dsl from '@devcodex-labs/flowkit/dsl'; +import pkg from '@devcodex-labs/flowkit/package.json' with { type: 'json' }; assert.deepEqual(Object.keys(api), ['check', 'compile', 'compileSource', 'evalWhen', 'isControlSignal', 'run']); -assert.equal(Object.keys(dsl).length, 9); assert.equal(pkg.name, '@devcodex/flowkit'); -const resolved = fileURLToPath(import.meta.resolve('@devcodex/flowkit')); -assert.ok(resolved.startsWith(path.resolve('node_modules/@devcodex/flowkit') + path.sep)); -for (const name of ['@devcodex/flowkit/dist/index.mjs', '@devcodex/flowkit/cli', '@devcodex/flowkit/runtime/run', '@devcodex/flowkit/testing']) await assert.rejects(import(name), { code: 'ERR_PACKAGE_PATH_NOT_EXPORTED' }); +assert.equal(Object.keys(dsl).length, 9); assert.equal(pkg.name, '@devcodex-labs/flowkit'); +const resolved = fileURLToPath(import.meta.resolve('@devcodex-labs/flowkit')); +assert.ok(resolved.startsWith(path.resolve('node_modules/@devcodex-labs/flowkit') + path.sep)); +for (const name of ['@devcodex-labs/flowkit/dist/index.mjs', '@devcodex-labs/flowkit/cli', '@devcodex-labs/flowkit/runtime/run', '@devcodex-labs/flowkit/testing']) await assert.rejects(import(name), { code: 'ERR_PACKAGE_PATH_NOT_EXPORTED' }); const definition = dsl.defineWorkflow({ id: 'installed', version: '1.0.0', name: 'Installed', nodes: [dsl.terminal('done', { name: 'Done', status: 'succeeded' })] }); assert.ok(Object.isFrozen(definition.nodes[0])); await mkdir('skills'); await writeFile('skills/a.md', 'Installed Skill.'); -const source = `import {defineWorkflow,node,action,terminal} from '@devcodex/flowkit/dsl'; +const source = `import {defineWorkflow,node,action,terminal} from '@devcodex-labs/flowkit/dsl'; export default defineWorkflow({id:'installed',version:'1.0.0',name:'Installed',nodes:[node('n',{name:'N',skill:'skills/a.md',output:{type:'object'},next:'save'}),action('save',{name:'Save',action:'save',next:'done'}),terminal('done',{name:'Done',status:'succeeded'})]} as const);\n`; await writeFile('sample.workflow.ts', source); const output = await api.compile('sample.workflow.ts', { trace: true, mermaid: false }); assert.deepEqual(output.diagnostics, []); diff --git a/tests/package/consumer.ts b/tests/package/consumer.ts index ed48926..3d70a65 100644 --- a/tests/package/consumer.ts +++ b/tests/package/consumer.ts @@ -1,7 +1,7 @@ import { readFile } from 'node:fs/promises'; -import { compile, run, isControlSignal } from '@devcodex/flowkit'; -import type { Runtime, RunResult, FlowkitOptions } from '@devcodex/flowkit'; -import { defineWorkflow, action, terminal } from '@devcodex/flowkit/dsl'; +import { compile, run, isControlSignal } from '@devcodex-labs/flowkit'; +import type { Runtime, RunResult, FlowkitOptions } from '@devcodex-labs/flowkit'; +import { defineWorkflow, action, terminal } from '@devcodex-labs/flowkit/dsl'; const definition = defineWorkflow({ id: 'typed', version: '1.0.0', name: 'Typed', nodes: [action('a', { name: 'A', action: 'save', next: 'done' }), terminal('done', { name: 'Done', status: 'succeeded' })] }); const host: Runtime = { isControlSignal }; const options: FlowkitOptions = { fetch, signal: new AbortController().signal }; diff --git a/tests/package/package.test.mjs b/tests/package/package.test.mjs index 306170d..f1ca3cf 100644 --- a/tests/package/package.test.mjs +++ b/tests/package/package.test.mjs @@ -92,7 +92,7 @@ test('validation timeout terminates a waiting shell and its child before tempora if (!stopped && process.platform === 'linux') { // A killed child may await reaping by the WSL init process; a zombie cannot run or hold file handles. try { stopped = /^State:\s+Z\b/m.test(await readFile(`/proc/${pid}/status`, 'utf8')); } - catch (error) { if (error.code !== 'ENOENT') throw error; stopped = true; } + catch (error) { if (!['ENOENT', 'ESRCH'].includes(error.code)) throw error; stopped = true; } } assert.equal(stopped, true, 'The validation child is still running'); await rm(directory, { recursive: true }); await assert.rejects(access(directory), { code: 'ENOENT' }); diff --git a/tests/package/release.test.mjs b/tests/package/release.test.mjs index ca4135e..982702a 100644 --- a/tests/package/release.test.mjs +++ b/tests/package/release.test.mjs @@ -23,7 +23,7 @@ async function fixture(t) { await mkdir(path.dirname(path.join(root, file)), {recursive:true}); await copyFile(path.join(repository, file), path.join(root, file)); } const pkg = JSON.parse(await readFile(path.join(root,'package.json'))); - Object.assign(pkg, {private:false,version:tag.slice(1),license:'MIT'}); + Object.assign(pkg, {private:false,version:tag.slice(1),license:'SEE LICENSE IN LICENSE'}); const lock = JSON.parse(await readFile(path.join(root,'package-lock.json'))); lock.version=pkg.version; lock.packages[''].version=pkg.version; await writeFile(path.join(root,'package.json'),JSON.stringify(pkg,null,2)); await writeFile(path.join(root,'package-lock.json'),JSON.stringify(lock)); await writeFile(path.join(root,'LICENSE'),'Synthetic fixture license, not a project license decision.'); @@ -34,14 +34,14 @@ async function syntheticArtifact(root) { // This fixture builds a real gzip/tar archive; integration separately uses actual npm pack. await build(root); const directory=path.join(root,'.tmp/release');await mkdir(directory,{recursive:true}); - const filename=`devcodex-flowkit-${tag.slice(1)}.tgz`; + const filename=`devcodex-labs-flowkit-${tag.slice(1)}.tgz`; const files=[];for(const member of ['package.json','README.md','LICENSE',...packageFiles.map(([,output])=>output)]){ const source=packageFiles.find(([,output])=>output===member)?.[0]??member; files.push({path:member,sha256:digest(await readFile(path.join(root,source)))}); } await createTar({cwd:root,file:path.join(directory,filename),prefix:'package',gzip:true,portable:true},files.map(file=>file.path)); const bytes=await readFile(path.join(directory,filename)); - const manifest={schemaVersion:1,name:'@devcodex/flowkit',version:tag.slice(1),tag,npmTag:'next',filename,sha256:digest(bytes),files}; + const manifest={schemaVersion:1,name:'@devcodex-labs/flowkit',version:tag.slice(1),tag,npmTag:'next',filename,sha256:digest(bytes),files}; await writeFile(path.join(directory,'release.json'),JSON.stringify(manifest)); return {directory,filename,manifest,bytes}; } diff --git a/tests/runtime/dump.test.mjs b/tests/runtime/dump.test.mjs index 282aaa0..6ec16c8 100644 --- a/tests/runtime/dump.test.mjs +++ b/tests/runtime/dump.test.mjs @@ -9,7 +9,7 @@ import crypto from 'node:crypto'; import { EventEmitter } from 'node:events'; import { fileURLToPath } from 'node:url'; import path from 'node:path'; -import * as api from '@devcodex/flowkit'; +import * as api from '@devcodex-labs/flowkit'; import { hashPrefixCollision, loadDumpWorkflow } from '../../src/runtime/dump.mjs'; import { fixture, end, host, settled } from './support.mjs'; @@ -21,7 +21,7 @@ function probe(operation, config) { "import assert from 'node:assert/strict'; import fs from 'node:fs/promises'; import path from 'node:path';", "import {register,syncBuiltinESMExports} from 'node:module'; import module from 'node:module';", "import {MessageChannel,MessagePort,Worker} from 'node:worker_threads'; import {pathToFileURL} from 'node:url';", - "import * as api from '@devcodex/flowkit';", + "import * as api from '@devcodex-labs/flowkit';", 'import {dumpChannel} from ' + JSON.stringify(new URL('../../dist/runtime/dump-channel.mjs', import.meta.url).href) + ';', 'const operation = ' + operation.toString() + '; await operation(' + JSON.stringify(config) + ');', ].join('\n'); diff --git a/tests/runtime/golden.test.mjs b/tests/runtime/golden.test.mjs index 91cac4e..4197fb3 100644 --- a/tests/runtime/golden.test.mjs +++ b/tests/runtime/golden.test.mjs @@ -4,7 +4,7 @@ import { readFile, mkdtemp, mkdir, writeFile, rm } from 'node:fs/promises'; import { createHash } from 'node:crypto'; import { tmpdir } from 'node:os'; import path from 'node:path'; -import { compile, run, check, evalWhen, isControlSignal } from '@devcodex/flowkit'; +import { compile, run, check, evalWhen, isControlSignal } from '@devcodex-labs/flowkit'; import { demo } from '../../examples/demo.mjs'; import { createRuntime, validateExample } from '../../examples/host.mjs'; import { exampleAgent } from '../../examples/agent.mjs'; diff --git a/tests/runtime/run.test.mjs b/tests/runtime/run.test.mjs index 0a7dbe2..a2c2135 100644 --- a/tests/runtime/run.test.mjs +++ b/tests/runtime/run.test.mjs @@ -6,7 +6,7 @@ import { syncBuiltinESMExports } from 'node:module'; import { spawnSync } from 'node:child_process'; import { fileURLToPath } from 'node:url'; import path from 'node:path'; -import * as api from '@devcodex/flowkit'; +import * as api from '@devcodex-labs/flowkit'; import { fixture, source, end, host, settled } from './support.mjs'; const codeIs = code => error => error.code === code; @@ -94,7 +94,7 @@ test('run rejects invalid extensions and options before filesystem work or busin test('public run fixes source, inferred root and relative dump before an asynchronous cwd change', async t => { const f = await fixture(t, [act, end()]); const other = path.join(f.directory, 'other'); await mkdir(other); - const code = "import assert from 'node:assert/strict';import fs from 'node:fs/promises';import path from 'node:path';import {run,isControlSignal} from '@devcodex/flowkit';" + + const code = "import assert from 'node:assert/strict';import fs from 'node:fs/promises';import path from 'node:path';import {run,isControlSignal} from '@devcodex-labs/flowkit';" + "const directory=process.argv[1];process.chdir(directory);const running=run('./source.workflow.js',{isControlSignal,runAction:async()=>{}},{},{dump:'debug'});process.chdir(path.join(directory,'other'));assert.equal((await running).terminal,'done');assert.equal((await fs.readdir(path.join(directory,'debug'))).length,1);assert.deepEqual(await fs.readdir(process.cwd()),[]);"; const child = spawnSync(process.execPath, ['--input-type=module', '-e', code, f.directory], { cwd: fileURLToPath(new URL('../../', import.meta.url)), encoding: 'utf8', timeout: 10000 }); assert.equal(child.error, undefined); assert.equal(child.status, 0, child.stderr); diff --git a/tests/runtime/source.test.mjs b/tests/runtime/source.test.mjs index 5aae38b..b6e8b43 100644 --- a/tests/runtime/source.test.mjs +++ b/tests/runtime/source.test.mjs @@ -6,7 +6,7 @@ import fsSync from 'node:fs'; import { syncBuiltinESMExports } from 'node:module'; import { spawnSync } from 'node:child_process'; import path from 'node:path'; -import * as api from '@devcodex/flowkit'; +import * as api from '@devcodex-labs/flowkit'; import { executeSource } from '../../src/runtime/source.mjs'; import { loadWorkflowText } from '../../src/runtime/load.mjs'; import { fixture, source, end, host, settled } from './support.mjs'; @@ -19,7 +19,7 @@ test('public helpers expose strict own-state evaluation and the control marker w assert.equal(api.evalWhen({ state: Object.create({ inherited: true }) }, 'inherited === null'), false); assert.throws(() => api.evalWhen({ state: { value: 1 } }, 'value'), { code: 'FK_R002' }); assert.throws(() => api.evalWhen({ state: {} }, 'call()'), { code: 'FK_C033' }); - await assert.rejects(import('@devcodex/flowkit/runtime/source'), { code: 'ERR_PACKAGE_PATH_NOT_EXPORTED' }); + await assert.rejects(import('@devcodex-labs/flowkit/runtime/source'), { code: 'ERR_PACKAGE_PATH_NOT_EXPORTED' }); }); test('compile errors select the first error after warnings and precede state cloning or business calls', async t => { diff --git a/tests/runtime/support.mjs b/tests/runtime/support.mjs index fddad7f..e904ba5 100644 --- a/tests/runtime/support.mjs +++ b/tests/runtime/support.mjs @@ -2,10 +2,10 @@ import assert from 'node:assert/strict'; import { mkdtemp, writeFile, rm } from 'node:fs/promises'; import { tmpdir } from 'node:os'; import path from 'node:path'; -import { evalWhen, isControlSignal } from '@devcodex/flowkit'; +import { evalWhen, isControlSignal } from '@devcodex-labs/flowkit'; import { executeSource } from '../../src/runtime/source.mjs'; -const imports = "import {defineWorkflow,node,action,condition,verification,loop,human,parallel,terminal} from '@devcodex/flowkit/dsl';"; +const imports = "import {defineWorkflow,node,action,condition,verification,loop,human,parallel,terminal} from '@devcodex-labs/flowkit/dsl';"; export const end = (id = 'done', status = 'succeeded') => `terminal('${id}',{name:'${id}',status:'${status}'})`; export const source = nodes => `${imports}\nexport default defineWorkflow({id:'runtime',version:'1.0.0',name:'Runtime',nodes:[${nodes.join(',')}]});\n`; export const host = methods => ({ isControlSignal, evalWhen, ...methods }); diff --git a/tests/types/capability-graph.ts b/tests/types/capability-graph.ts new file mode 100644 index 0000000..29827dd --- /dev/null +++ b/tests/types/capability-graph.ts @@ -0,0 +1,13 @@ +import { flowkitProvider, createCapabilityGraphActionAdapter } from '../../types/capability-graph.js'; +import type { GraphResolver, GraphContext, GraphActionBinding, GraphResolution } from '../../types/capability-graph.js'; +const provider: { providerId: string; version: string; capabilities: { id: string; name: string; description: string }[] } = flowkitProvider; +const context: GraphContext = { facts: { runtime: 'node', 'runtime.version': '22.13.0' } }; +const result: GraphResolution = { nodes: [{ capability: { id: 'demo::greet' }, applicability: { status: 'applicable' } }], unresolved: [], meta: { completeness: 'complete' } }; +const graph: GraphResolver = { async resolve(query) { const ids: string[] = query.ids; void ids; return result; } }; +const binding: GraphActionBinding = { capabilityId: 'demo::greet', async execute({ action, resolution }) { const id: string = resolution.nodes[0].capability.id; void [action,id]; } }; +const adapter = createCapabilityGraphActionAdapter({ graph, bindings: { greet: binding }, getContext: () => context }); +const execution: Promise = adapter.runAction('greet', 'Greeting', { state: {} }); +void [provider, execution]; +// @ts-expect-error Graph binding requires a capability ID +const invalid: GraphActionBinding = { execute() {} }; +void invalid; diff --git a/tests/types/compiler-api.ts b/tests/types/compiler-api.ts index e2cdf03..36e1925 100644 --- a/tests/types/compiler-api.ts +++ b/tests/types/compiler-api.ts @@ -1,5 +1,5 @@ -import { run, compile, compileSource, check, evalWhen, isControlSignal } from '@devcodex/flowkit'; -import type { CompileResult, Diagnostic, FlowkitOptions, Ctx } from '@devcodex/flowkit'; +import { run, compile, compileSource, check, evalWhen, isControlSignal } from '@devcodex-labs/flowkit'; +import type { CompileResult, Diagnostic, FlowkitOptions, Ctx } from '@devcodex-labs/flowkit'; const options: FlowkitOptions = { trace: false, mermaid: true, skillCheck: false }; const compiled: Promise = compile('sample.workflow.ts', options); @@ -15,7 +15,7 @@ const boolean: boolean = evalWhen(ctx, 'true'); const control: boolean = isControlSignal(null); void [boolean, control]; // @ts-expect-error Internal modules are not public subpaths. -import { writeArtifacts } from '@devcodex/flowkit/compiler/output'; +import { writeArtifacts } from '@devcodex-labs/flowkit/compiler/output'; // @ts-expect-error compileSource requires a filename. compileSource('', {}); // @ts-expect-error filename is not a compile option. diff --git a/tests/types/dsl.ts b/tests/types/dsl.ts index 590052b..9f796a9 100644 --- a/tests/types/dsl.ts +++ b/tests/types/dsl.ts @@ -1,5 +1,5 @@ -import { defineWorkflow, node, action, verification, parallel, condition, loop, human, terminal } from '@devcodex/flowkit/dsl'; -import type { DslNode } from '@devcodex/flowkit/dsl'; +import { defineWorkflow, node, action, verification, parallel, condition, loop, human, terminal } from '@devcodex-labs/flowkit/dsl'; +import type { DslNode } from '@devcodex-labs/flowkit/dsl'; const flow = defineWorkflow({ id: 'all-nodes', version: '1.0.0', name: '全节点', nodes: [ node('write', { name: '撰写', agent: 'writer', output: { type: 'object', properties: { text: { type: 'string' } }, $defs: { ok: true } }, next: 'gate' }), diff --git a/tests/types/tsconfig.json b/tests/types/tsconfig.json index 9d80f81..d212f4c 100644 --- a/tests/types/tsconfig.json +++ b/tests/types/tsconfig.json @@ -3,10 +3,19 @@ "noEmit": true, "strict": true, "target": "ES2022", - "lib": ["ES2022", "DOM"], + "lib": [ + "ES2022", + "DOM" + ], "module": "NodeNext", "moduleResolution": "NodeNext", "skipLibCheck": false }, - "files": ["dsl.ts", "public-contract.ts", "compiler-api.ts", "../../src/internal.d.ts"] + "files": [ + "dsl.ts", + "public-contract.ts", + "compiler-api.ts", + "../../src/internal.d.ts", + "capability-graph.ts" + ] } diff --git a/types/capability-graph.d.ts b/types/capability-graph.d.ts new file mode 100644 index 0000000..c99b752 --- /dev/null +++ b/types/capability-graph.d.ts @@ -0,0 +1,39 @@ +/** Optional SDK bridge; the host supplies a Graph instance. */ +export interface GraphContext { facts?: Record; notes?: string } +export interface GraphResolvedNode { + capability: { id: string }; + applicability: { status: 'applicable' | 'inapplicable' | 'unknown' }; +} +export interface GraphResolution { + nodes: GraphResolvedNode[]; + unresolved: unknown[]; + meta: { completeness: 'complete' | 'partial' }; +} +export interface GraphResolver { + resolve(query: { ids: string[]; context?: GraphContext; relations?: 'requires'[] }): Promise; +} +export interface GraphActionBinding { + capabilityId: string; + execute(args: { action: string; name: string; ctx: unknown; resolution: GraphResolution; capability: GraphResolvedNode['capability'] }): void | Promise; +} +export interface FlowkitCapabilityDeclaration { + id: string; + name: string; + description: string; + whenToUse?: string; + usage?: { instructions?: string }; + relations?: { requires?: string[] }; +} +export declare const flowkitProvider: { + schemaVersion: 1; + providerId: 'flowkit'; + name: 'FlowKit'; + version: string; + description: string; + capabilities: FlowkitCapabilityDeclaration[]; +}; +export declare function createCapabilityGraphActionAdapter(options: { + graph: GraphResolver; + bindings: Record; + getContext?: (ctx: unknown) => GraphContext; +}): { runAction(action: string, name: string, ctx: unknown): Promise }; diff --git a/website/content/community/changelog.mdx b/website/content/community/changelog.mdx index 6f00692..42c131d 100644 --- a/website/content/community/changelog.mdx +++ b/website/content/community/changelog.mdx @@ -2,17 +2,18 @@ ## 1.0.0 -FlowKit 的首个正式版本。 +FlowKit v1.0.0 发布候选(实际发布状态以 GitHub Packages 记录和 Git Tag 为准)。 - 用 JavaScript / TypeScript 字面量 DSL 定义工作流,支持 Agent、业务动作、验证、并行、条件、循环、人工审批和终点。 - 静态检查流程结构、数据声明、Skill 引用及受限条件表达式,输出可读 JavaScript 和 Mermaid。 - 提供 run、compile、compileSource、check、evalWhen、isControlSignal,以及 compile/check 命令行。 +- 可选 capability-graph Provider 与宿主动作适配:仅负责能力声明、查询约束及显式动作绑定,不内置第二套 Runtime。 - 通过宿主 Runtime 执行业务;支持本地和受限制的 HTTPS Skill、结果校验与重试、跟踪、取消信号及 AOT 一致性检查。 -- 提供详细中文文档、完整确定性示例和 MIT 许可证。 +- 提供详细中文文档、完整确定性示例和专有授权。 需要 Node.js 22.13.0 或更高版本。FlowKit 不内置模型服务、Schema 校验器或持久化审批服务;这些能力由宿主提供。并行分支共享状态,any 汇合不会取消其他分支;AOT 部署仍需保留原始源码和对应 Skill。 -[文档](https://devcodex-labs.github.io/flowkit/) · [npm](https://www.npmjs.com/package/@devcodex/flowkit) · [许可证](https://github.com/devcodex-labs/flowkit/blob/main/LICENSE) +[文档](https://devcodex-labs.github.io/flowkit/) · GitHub Packages(私有,需授权) · [许可证](https://github.com/devcodex-labs/flowkit/blob/main/LICENSE) ## 选择下一步 diff --git a/website/content/community/compatibility.mdx b/website/content/community/compatibility.mdx index 5455e0d..173a4c7 100644 --- a/website/content/community/compatibility.mdx +++ b/website/content/community/compatibility.mdx @@ -10,7 +10,7 @@ | TypeScript声明 | TypeScript 5.0+,使用const类型参数 | | 文档站开发 | Node >=24,website独立依赖与锁文件 | | 文档语言 | 简体中文;当前没有英文翻译版本 | -| 许可证 | MIT | +| 授权 | 专有授权;详见 LICENSE,包由 GitHub Packages 私有分发 | ## 自动检查的环境 @@ -26,6 +26,12 @@ FlowKit提供静态DSL编译、图和数据声明检查、可读生成代码、M ## 版本与升级 -首个正式开源版本为1.0.0。消费者建议精确安装并提交锁文件,先在独立环境运行自己的关键流程,再升级生产。工作流自己的version与包版本独立。升级后重新compile/check,旧产物的版本、生成逻辑或选项可能不同,不应直接继续手工拼接使用。 +仓库当前版本为1.0.0,实际发布状态须核对 Git Tag 与 GitHub Packages。消费者建议精确安装并提交锁文件,先在独立环境运行自己的关键流程,再升级生产。工作流自己的version与包版本独立。升级后重新compile/check,旧产物的版本、生成逻辑或选项可能不同,不应直接继续手工拼接使用。 报告兼容问题时提供实际Node/npm/系统版本、包版本和最小复现,见[问题定位](/troubleshooting/index)。当前能力清单见[发布记录](/community/changelog)。 + +## capability-graph 兼容性 + +可选 Provider 与宿主动作适配使用独立的 `@devcodex/capability-graph` v2.1.1 SDK 契约。核心六个 SDK 与八类 DSL 节点不变;Graph 的 Provider schemaVersion、声明版本、结果 revision 不等于 FlowKit 版本。Graph 可能与 Node 20 兼容,但 FlowKit 仍要求 Node >=22.13.0;消费者按两者要求取交集。 + +文档站已获批准公开展示;FlowKit 源码仓库与 GitHub Packages 安装包仍是私有的。站点公开不代表源码开源或授予包下载权限;GitHub Pages 实际可用性和发布授权需在部署时单独核查。 diff --git a/website/content/community/contributing.mdx b/website/content/community/contributing.mdx index ba9b310..a0b61a6 100644 --- a/website/content/community/contributing.mdx +++ b/website/content/community/contributing.mdx @@ -1,10 +1,10 @@ # 参与贡献 -FlowKit是采用MIT许可证的开源项目。欢迎提交可复现的问题、改进中文说明、补充真实使用例和修复实现。先说明要解决的具体用户问题,避免仅因个人风格重写大量无关代码。 +FlowKit 是 devcodex-labs 的私有专有项目,仅允许经过授权的协作者提交可复现的问题、文档改进与实现修复。先说明要解决的具体用户问题,避免仅因个人风格重写大量无关代码。 ## 本地准备 -克隆[仓库](https://github.com/devcodex-labs/flowkit),进入根目录。SDK支持Node >=22.13.0;同时开发文档站时使用Node >=24。根包和website各有独立锁文件,分别安装。 +在获授权后克隆[私有仓库](https://github.com/devcodex-labs/flowkit),进入根目录。SDK支持Node >=22.13.0;同时开发文档站时使用Node >=24。根包和website各有独立锁文件,分别安装。 ```sh npm ci --ignore-scripts --no-audit --no-fund diff --git a/website/content/community/license.mdx b/website/content/community/license.mdx index c26aa31..fd30827 100644 --- a/website/content/community/license.mdx +++ b/website/content/community/license.mdx @@ -1,10 +1,12 @@ -# 开源许可证 +# 授权与使用 -FlowKit v1.0.0使用MIT许可证,版权声明为Copyright (c) 2026 devcodex-labs。根package.json的license字段、仓库LICENSE与发布包内LICENSE保持一致。下面直接包含仓库许可证全文。 +本文档站可公开阅读,但 FlowKit 源码及内部 npm 包仍为专有软件,并通过 **GitHub Packages 私有仓库** 管理。未来客户通过 MCP、托管 API 或工作流设计服务使用能力,**不安装或获得 FlowKit 软件副本**。客户服务与生成工作流的权益由独立服务条款约定。公开展示文档不意味着授予软件复制、修改、再发布或商业使用许可。源代码和二进制包不再以 MIT 作为当前发行授权。获得包的读取权限不自动赋予复制、再分发、再授权或商业转售的权利;具体使用权限以所有者授予的许可和以下协议为准。 ```text file="../../../LICENSE" title="LICENSE" ``` -许可证原文保持标准英文法律文本;站点说明与导航为中文。第三方依赖各自保留其许可证,安装包与锁文件可用于识别具体版本。 +这是 FlowKit 项目的许可,不替换 acorn、TypeScript、Rspress 等第三方依赖各自的许可证。若需要额外权利或公开分发,须与权利人另行取得书面授权。 -提交改动前阅读[参与贡献](/community/contributing);项目源代码及许可证文件可在[GitHub仓库](https://github.com/devcodex-labs/flowkit)查看。 +如果此前某个版本曾依 MIT 对外分发,本次变更**不追溯撤销**此前已合法授予的权利。旧版本的历史事实以可验证的原始发布记录为准。 + +继续阅读[私有包安装](/guide/installation)、[兼容范围](/community/compatibility)和[发布维护](/maintainers/releasing)。 diff --git a/website/content/dsl/index.mdx b/website/content/dsl/index.mdx index c8b8196..4283706 100644 --- a/website/content/dsl/index.mdx +++ b/website/content/dsl/index.mdx @@ -1,6 +1,6 @@ # DSL 总览 -从 `@devcodex/flowkit/dsl` 导入构造器。v1.0.0 公开9个构造器:defineWorkflow 组织工作流,另外8个创建节点。DSL 描述控制流和数据契约,业务执行位于 Runtime。 +从 `@devcodex-labs/flowkit/dsl` 导入构造器。v1.0.0 公开9个构造器:defineWorkflow 组织工作流,另外8个创建节点。DSL 描述控制流和数据契约,业务执行位于 Runtime。 | 构造器 | 节点 type | 用途 | 参考 | |---|---|---|---| diff --git a/website/content/examples/capability-graph.mdx b/website/content/examples/capability-graph.mdx new file mode 100644 index 0000000..ccf640c --- /dev/null +++ b/website/content/examples/capability-graph.mdx @@ -0,0 +1,38 @@ +# capability-graph 宿主消费示例 + +本示例使用 **独立的** `@devcodex/capability-graph@2.1.1`。FlowKit 不内置 Graph 服务或模型客户端,不改变 `agent`(Skill 路径映射)语义。只有宿主显式绑定的 `action` 会执行。 + +## 完整文件 + +```js file="../../../examples/docs/capability-graph/sample.workflow.js" title="sample.workflow.js" +``` + +```js file="../../../examples/docs/capability-graph/host.mjs" title="host.mjs" +``` + +```js file="../../../examples/docs/capability-graph/verify.mjs" title="verify.mjs" +``` + +## 运行命令 + +在有权限访问 FlowKit GitHub Packages 的消费者项目中安装包(见[私有包安装](/guide/installation)),并安装公开的 Graph 依赖: + +```sh +npm install --save-exact @devcodex/capability-graph@2.1.1 +npx --no-install flowkit compile sample.workflow.js +npx --no-install flowkit check sample.workflow.js +node host.mjs +node verify.mjs +``` + +`host.mjs` 预期返回 `status: succeeded`、`terminal: done`,状态中包含 `message: "你好,FlowKit!"`。 + +## 何时允许执行? + +宿主先对明确的 `demo::greet` 进行 `resolve({ids, context, relations:['requires']})`,要求 `meta.completeness === 'complete'`,`unresolved` 为空且全部节点 `applicability.status === 'applicable'`,随后才调用宿主显式注册的执行函数。 + +图谱的 `requires` 仅声明前置能力,**不会自动执行依赖**。本示例的 `tooling::ready` 是宿主事先具备的实现,真正的前置工作和业务授权仍由宿主验证。Graph 对访问控制失败会原样抛出 `GraphError`;FlowKit 适配器在绑定缺失、依赖不全、适用性未知/不适用时分别抛出 `FK_CG_BINDING_MISSING`、`FK_CG_DEPENDENCIES_INCOMPLETE`、`FK_CG_NOT_APPLICABLE`。 + +`verify.mjs` 覆盖成功、依赖解析、未知环境、不适用、跨 Provider 未授权和缺少绑定。Graph 的 `match()` 需要显式的 `ModelExecutor`,本示例不额外调用模型。 + +继续阅读[FlowKit Provider 能力声明](/guide/capability-provider)、[宿主接入](/guide/host-integration)和[SDK 参考](/reference/sdk)。 diff --git a/website/content/examples/index.mdx b/website/content/examples/index.mdx index 60ce0ee..9a22e3f 100644 --- a/website/content/examples/index.mdx +++ b/website/content/examples/index.mdx @@ -1,6 +1,6 @@ # 选择示例 -这些示例围绕具体任务组织。每个场景页都提供完整文件、依赖安装、命令、预期结果和失败恢复;从最接近你的需求的一项开始。示例使用公开包入口,不要求导入源码仓库内部模块。 +这些示例围绕具体任务组织,供公开阅读和内部测试复现。各场景包含完整文件、命令、预期结果和失败恢复;**运行示例仅限拥有私有包权限的内部维护者**,付费服务用户无需安装 FlowKit。示例使用包的公开导出入口,不通过内部源码路径导入。 ## 按任务选择 @@ -19,6 +19,8 @@ | 理解多次运行和缓存 | [run的完整例子](/reference/sdk#run) | state浅复制 | | 调用全部SDK并观察trace/dump | [跟踪与运行记录](/guide/observability) | SDK与文件产物 | +[capability-graph 双向集成](/examples/capability-graph) 作为 E13 示例,演示 Provider 声明和宿主明确绑定动作;需要单独安装 Graph SDK。 + ## 示例的依赖和边界 运行环境为Node >=22.13.0,FlowKit精确版本1.0.0,消费者package.json设置type:module。JavaScript例不需要模型密钥;TS类型演练另装TypeScript 5.0+。每个目录独立保留自己的package.json,避免项目根查找受到仓库上层目录影响。 @@ -27,10 +29,10 @@ ## 文件从哪里来 -教程代码与仓库[examples/docs](https://github.com/devcodex-labs/flowkit/tree/main/examples/docs)中的主源保持一致。主源的verify.mjs保存成功、失败与恢复断言,manifest列出12组消费者案例。站点构建直接包含主源文件,README最小例从同一来源同步。 +教程代码与仓库私有目录 `examples/docs` 中的主源保持一致。该目录仅向有权限的维护者开放;公开读者可以直接阅读本站嵌入的代码。主源的verify.mjs保存成功、失败与恢复断言,manifest 列出 E01–E13 共 13 组内部验证用例。站点构建直接包含主源文件,README最小例从同一来源同步。 ## 推荐运行方式 -先在空目录按页面复制文件并安装确切版本,避免把已有业务项目改坏。执行成功路径后再尝试页面明确给出的失败变体,每次恢复原设置并复验。只看compile成功还不够:检查产物、运行结果、状态字段、事件顺序和退出码。 +内部维护者可以在空目录按页面复制文件并安装精确版本,避免影响已有业务项目。执行成功路径后再尝试页面明确给出的失败变体,每次恢复原设置并复验。只看compile成功还不够:检查产物、运行结果、状态字段、事件顺序和退出码。 -维护仓库时可执行`npm run build`及`npm run docs:examples`:它在临时目录真实安装候选tarball,用独立消费者运行所有案例。这个本地候选验证不等于公开npm包或线上站点已经通过验证。遇到差异从[问题定位](/troubleshooting/index)开始。 +维护仓库时可执行`npm run build`及`npm run docs:examples`:它在临时目录真实安装候选tarball,用独立消费者运行所有案例。这个本地候选验证不等于私有 GitHub Packages 包或线上站点已经通过验证。遇到差异从[问题定位](/troubleshooting/index)开始。 diff --git a/website/content/guide/cancellation.mdx b/website/content/guide/cancellation.mdx index 7f74405..1782a49 100644 --- a/website/content/guide/cancellation.mdx +++ b/website/content/guide/cancellation.mdx @@ -7,7 +7,7 @@ Runtime 必须提供 `isControlSignal(err)`。公开同名函数识别带 `control: true` 的控制标记;宿主也可以按自身约定扩展判定。控制信号与普通失败分开传播,避免把主动取消误当成 Agent 可重试的生成失败。 ```js -import { isControlSignal } from '@devcodex/flowkit'; +import { isControlSignal } from '@devcodex-labs/flowkit'; console.log(isControlSignal({ control: true, kind: 'cancel' })); // true console.log(isControlSignal(new Error('网络失败'))); // false ``` diff --git a/website/content/guide/capability-provider.mdx b/website/content/guide/capability-provider.mdx new file mode 100644 index 0000000..e4c80ec --- /dev/null +++ b/website/content/guide/capability-provider.mdx @@ -0,0 +1,38 @@ +# 向 capability-graph 声明 FlowKit 能力 + +FlowKit 通过 `@devcodex-labs/flowkit/capability-graph` 导出 `flowkitProvider`。它是一份满足 `capability-graph` Provider Schema v1 的**静态能力声明**,不是额外的执行器。 + +## 已声明的能力 + +| ID | 含义 | +|---|---| +| `flowkit::define-workflow` | 使用静态 JS/TS DSL 定义工作流 | +| `flowkit::compile-workflow` | 编译生成可执行 JS 与 Mermaid | +| `flowkit::check-workflow` | 检查定义及已有编译产物 | +| `flowkit::run-workflow` | 由显式提供的宿主 Runtime 执行 | +| `flowkit::render-mermaid` | 生成工作流可视化 | + +## 用 Graph 查询 + +```js +import { CapabilityGraph } from '@devcodex/capability-graph'; +import { flowkitProvider } from '@devcodex-labs/flowkit/capability-graph'; + +const graph = await CapabilityGraph.open({ providers: [{ definition: flowkitProvider }] }); +try { + const catalog = await graph.listCatalog(); + const details = await graph.getCapabilities({ ids: ['flowkit::run-workflow'] }); + const result = await graph.resolve({ ids: ['flowkit::render-mermaid'] }); + console.log(catalog.items.length, details.items.length, result.meta.completeness); +} finally { + await graph.close(); +} +``` + +Graph 的 `requires` 表示能力前置关系(例如 `render-mermaid` 需要 `compile-workflow`),**不决定工作流执行顺序**。FlowKit 自己的 `src/compiler/graph.mjs` 负责控制流图检查,与 Capability Graph 能力声明系统不是同一种图。 + +## 版本、权限与限制 + +此 Provider 声明版本随 FlowKit 包版本维护,不等于 Graph SDK 版本,也不等于 Graph 的结果 `revision`。`allowedProviders` 限定可见来源;`getCapabilities`、`resolve` 只读声明,不执行业务动作。FlowKit 的 `agent` 参数仍表示 Skill 映射,而非 Graph 能力 ID。 + +如需将已解析能力绑定到业务操作,参见[宿主消费示例](/examples/capability-graph)。所有模型、动作权限和外部 IO 均由宿主提供。 diff --git a/website/content/guide/compile-artifacts.mdx b/website/content/guide/compile-artifacts.mdx index cd376ae..6d302e6 100644 --- a/website/content/guide/compile-artifacts.mdx +++ b/website/content/guide/compile-artifacts.mdx @@ -46,8 +46,8 @@ check 每次重新编译源码。若 compiled 文件存在,就逐字节比较 ## 从文本编译 ```js -import { compileSource } from '@devcodex/flowkit'; -const text = "import { defineWorkflow, terminal } from '@devcodex/flowkit/dsl';\nexport default defineWorkflow({ id: 'demo', version: '1.0.0', name: '演示', nodes: [terminal('done', { name: '完成', status: 'succeeded' })] });"; +import { compileSource } from '@devcodex-labs/flowkit'; +const text = "import { defineWorkflow, terminal } from '@devcodex-labs/flowkit/dsl';\nexport default defineWorkflow({ id: 'demo', version: '1.0.0', name: '演示', nodes: [terminal('done', { name: '完成', status: 'succeeded' })] });"; const result = await compileSource(text, { filename: 'virtual.workflow.js' }); console.log(result.diagnostics); ``` diff --git a/website/content/guide/conditions.mdx b/website/content/guide/conditions.mdx index ed4cf2c..47ec346 100644 --- a/website/content/guide/conditions.mdx +++ b/website/content/guide/conditions.mdx @@ -3,7 +3,7 @@ condition 的 when 是一段受限表达式字符串,用来读取 state 并返回 boolean。它不执行 JavaScript,也不调用宿主函数。Runtime 中显式提供公开的 `evalWhen`,即可采用 FlowKit 的默认语义。 ```js -import { run, evalWhen, isControlSignal } from '@devcodex/flowkit'; +import { run, evalWhen, isControlSignal } from '@devcodex-labs/flowkit'; const runtime = { evalWhen, isControlSignal /* 以及工作流需要的业务方法 */ }; ``` @@ -27,7 +27,7 @@ const runtime = { evalWhen, isControlSignal /* 以及工作流需要的业务方 **比较运算先于取反,不能照搬 JavaScript 的 `!` 优先级。** `!a === b` 在这里表示 `!(a === b)`。当 state 为 `{ a: 1, b: 2 }` 时,两者都返回 true;写成 `(!a) === b` 则会因为数字不是 boolean 而抛出 `FK_R002`。建议把需要取反的整个条件放进括号: ```js -import { evalWhen, isControlSignal } from '@devcodex/flowkit'; +import { evalWhen, isControlSignal } from '@devcodex-labs/flowkit'; const ctx = { runtime: { isControlSignal }, state: { a: 1, b: 2 } }; console.log(evalWhen(ctx, '!(a === b)')); // true ``` @@ -41,7 +41,7 @@ console.log(evalWhen(ctx, '!(a === b)')); // true `&&` 和 `||` 短路。例如 `false && score > 0` 不求值右侧,`true || score > 0` 同理。推荐使用明确的存在性布尔键,或者由宿主把可选输入归一成可比较类型;表达式没有通用的 typeof/可选链/函数调用机制。 ```js -import { evalWhen, isControlSignal } from '@devcodex/flowkit'; +import { evalWhen, isControlSignal } from '@devcodex-labs/flowkit'; const ctx = { runtime: { isControlSignal }, state: { ready: true, score: 90 } }; console.log(evalWhen(ctx, 'ready && score >= 80')); // true ``` diff --git a/website/content/guide/host-integration.mdx b/website/content/guide/host-integration.mdx index aaaf76b..b026f5b 100644 --- a/website/content/guide/host-integration.mdx +++ b/website/content/guide/host-integration.mdx @@ -50,3 +50,7 @@ isControlSignal 始终必需。Agent 需要 runAgent 和 validateResult;action 同一文件可多次调用 run。每次都有新 state/Ctx/默认 Skill loader;成功编译和加载的 DSL 可能命中进程内缓存,业务结果不会被缓存。Skill 文件改变会在下一次运行重新读取。完整缓存键、失败分类和长期进程边界见 [run](/reference/sdk#run)。 遇到本地 Skill 缺失先核对 projectRoot 和实际文件;输出不合 Schema 看 reasons;审批返回字符串会触发 FK_R002。修复后依次复验 compile、check、run,并确认事件顺序和结果状态。 + +## 使用 capability-graph 检查并绑定能力 + +若宿主需要 Provider 目录、适用性或跨 Provider 依赖检查,可使用[capability-graph 宿主消费示例](/examples/capability-graph)中的可选动作适配器。FlowKit 自身只负责执行工作流,不会自动执行 Graph 的 `requires` 依赖;宿主必须显式绑定被授权的动作。普通 `runAgent`/Skill 映射规则保持不变。 diff --git a/website/content/guide/installation.mdx b/website/content/guide/installation.mdx index 1875af5..d8e2bb1 100644 --- a/website/content/guide/installation.mdx +++ b/website/content/guide/installation.mdx @@ -1,11 +1,13 @@ -# 安装与环境 +# 内部安装与环境 -本页从一个空目录安装 FlowKit v1.0.0,确认导入和命令行可用。使用 SDK 不需要克隆 FlowKit 仓库,也不需要安装文档站依赖。 +**本页只针对 FlowKit 项目维护者及内部部署人员,不是面向客户的产品安装教程。** FlowKit 不向未来付费用户分发软件包;他们将通过计划中的 MCP、托管 API 或工作流设计服务使用能力。公开读者无需创建令牌或安装包。 + +下面从一个空目录安装内部私有 FlowKit v1.0.0,验证 SDK 与 CLI。实际在 GitHub Packages 中是否已经发布该版本,须以 Registry 记录为准。 ## 前置条件 - Node.js **22.13.0 或更高版本**,包含 npm。 -- 一个可写的本地目录,以及访问 npm registry 的网络连接。 +- 一个可写的本地目录、可访问 GitHub Packages 的网络连接和项目所有者授予的读取权限。 - 示例宿主使用 `.mjs`,工作流使用 `.workflow.js`;它们遵循 ESM 导入方式。 先检查实际环境: @@ -19,6 +21,15 @@ Node 版本低于最低要求时,先升级并确认终端正在使用新版本 ## 创建项目并精确安装 +FlowKit 只在内部通过 **GitHub Packages 私有 npm Registry** 管理安装包。维护者须具备该包的读取权限,并使用具有 `read:packages` 的 GitHub Personal Access Token(classic)。在消费者目录创建 `.npmrc`(不要提交凭据),内容如下: + +```ini +@devcodex-labs:registry=https://npm.pkg.github.com +//npm.pkg.github.com/:_authToken=${NODE_AUTH_TOKEN} +``` + +在 PowerShell 中执行 `$env:NODE_AUTH_TOKEN = "你的令牌"`,在 Bash 中执行 `export NODE_AUTH_TOKEN="你的令牌"`,令牌只应通过安全的本地环境或密钥管理注入。若组织启用了 SSO,需确认令牌已获授权。**不要将真实令牌写入代码、截图或日志。** + 以下命令可用于 PowerShell 和常见 POSIX shell;每行分别执行。 ```sh @@ -26,27 +37,27 @@ mkdir flowkit-demo cd flowkit-demo npm init -y npm pkg set type=module -npm install --save-exact @devcodex/flowkit@1.0.0 +npm install --save-exact @devcodex-labs/flowkit@1.0.0 ``` -`--save-exact` 让 package.json 保存明确版本。保留 npm 生成的 package-lock.json,在其他机器上用 `npm ci` 安装一致的依赖。 +`@devcodex-labs/flowkit` 是内部私有包,不对外提供安装。`--save-exact` 让 package.json 保存明确版本。保留 npm 生成的 package-lock.json,在其他机器上用 `npm ci` 安装一致的依赖。 确认包身份: ```sh -node --input-type=module -e "import p from '@devcodex/flowkit/package.json' with {type:'json'}; console.log(p.name, p.version)" +node --input-type=module -e "import p from '@devcodex-labs/flowkit/package.json' with {type:'json'}; console.log(p.name, p.version)" ``` -预期为 `@devcodex/flowkit 1.0.0`。如果显示其他版本,检查当前目录的 package.json、lock 文件和 `npm ls @devcodex/flowkit`,不要仅根据全局安装结果判断。 +预期为 `@devcodex-labs/flowkit 1.0.0`。如果显示其他版本,检查当前目录的 package.json、lock 文件和 `npm ls @devcodex-labs/flowkit`,不要仅根据全局安装结果判断。 ## 公开导入入口 ```js -import { run, compile, compileSource, check, evalWhen, isControlSignal } from '@devcodex/flowkit'; -import { defineWorkflow, node, action, verification, parallel, condition, loop, human, terminal } from '@devcodex/flowkit/dsl'; +import { run, compile, compileSource, check, evalWhen, isControlSignal } from '@devcodex-labs/flowkit'; +import { defineWorkflow, node, action, verification, parallel, condition, loop, human, terminal } from '@devcodex-labs/flowkit/dsl'; ``` -根入口提供 SDK,`/dsl` 提供定义构造器。不要从包的内部 `src` 或 `dist` 子路径导入。安装后的 `flowkit` 可执行命令只有 `compile` 和 `check`;执行工作流由宿主调用 SDK 的 `run`。 +根入口提供 SDK,`/dsl` 提供定义构造器,`/capability-graph` 提供可选 Provider 与宿主绑定适配器(使用时另行安装 `@devcodex/capability-graph`)。不要从包的内部 `src` 或 `dist` 子路径导入。安装后的 `flowkit` 可执行命令只有 `compile` 和 `check`;执行工作流由宿主调用 SDK 的 `run`。 ## 准备文件目录 @@ -66,9 +77,9 @@ flowkit-demo/ | 现象 | 检查与处理 | |---|---| | 找不到 `node` / `npm` | 在新终端检查 PATH,确认安装的 Node 版本;先让版本命令可执行 | -| registry 超时或无法访问 | 检查网络和 `npm config get registry`;公共包地址为 registry.npmjs.org | +| registry 超时或无法访问 | 检查网络和 `npm config get registry`;FlowKit 的 scoped registry 应为 npm.pkg.github.com;检查令牌、SSO、包权限和组织 Scope | | `ERR_MODULE_NOT_FOUND` | 在有 package.json 的消费者目录安装,确认 host 文件位于该项目内 | -| `ERR_PACKAGE_PATH_NOT_EXPORTED` | 改用上面的三个公开入口,不访问内部文件 | +| `ERR_PACKAGE_PATH_NOT_EXPORTED` | 改用上面的三个受支持入口,不访问内部文件 | | CLI 命令不存在 | 在已安装包的目录使用 `npx --no-install flowkit ...`;此写法不会偷偷下载其他版本 | | 版本不存在或安装内容不匹配 | 保留错误与registry信息,核查精确版本;不要把未成功的安装当成可运行环境 | diff --git a/website/content/guide/introduction.mdx b/website/content/guide/introduction.mdx index 59eedbb..207c64d 100644 --- a/website/content/guide/introduction.mdx +++ b/website/content/guide/introduction.mdx @@ -1,6 +1,6 @@ # 项目介绍 -FlowKit 是面向 Node.js 的工作流编排工具。你用 JavaScript / TypeScript DSL 描述节点和连接关系,编译器检查流程结构,再通过宿主 Runtime 执行 Agent、业务动作、验证和人工审批。 +FlowKit 是供项目所有者内部运营的 Node.js 工作流基础设施。内部开发者使用 JavaScript / TypeScript DSL 描述节点和连接关系,编译器检查流程结构,再通过宿主 Runtime 执行 Agent、业务动作、验证和人工审批。代码、安装包和运行环境不作为面向客户的分发产品。 本文帮助你判断适用场景、理解各部分职责,并选择第一条学习路径。 @@ -45,6 +45,16 @@ FlowKit 是面向 Node.js 的工作流编排工具。你用 JavaScript / TypeScr 状态以浅复制开始;嵌套对象仍可能与初始输入共享引用,并行分支使用同一份运行状态。`any` 返回不代表其他分支已停止。审批等待、持久化和重启后的恢复由宿主设计,不能依赖一个未提供的内置服务。 +## capability-graph 的两个接入方向 + +FlowKit 可通过 `@devcodex-labs/flowkit/capability-graph` 提供静态 Provider 声明,供外部宿主发现能力;也能在宿主层使用 Graph SDK 解析能力、检查适用性与前置依赖,再通过显式绑定的动作执行。Graph 不负责工作流步骤排序、执行或持久化。[Provider 声明](/guide/capability-provider)与[真实宿主示例](/examples/capability-graph)分别验证这两条路径。 + +目前核心实现以 JS/TS DSL 为输入,不提供自然语言直接生成工作流的公共 API。模型若参与生成 DSL,其生成、审查与授权流程由宿主负责,不能把该组合写成 FlowKit 内置能力。 + +## 商业服务方向与现阶段边界 + +计划中的对外形式包括 MCP、托管 API 或专门的付费工作流设计服务。FlowKit 会作为运营方掌控的内部引擎,客户不需要安装 FlowKit。这些服务入口、用户认证、计费、输出授权与产品界面**目前尚未在 FlowKit 核心实现中交付**,不得把规划当作可用功能。 + ## 从哪里开始 -先阅读[安装与环境](/guide/installation),再按[第一个工作流](/guide/quick-start)完成两个文件的例子。你应先观察到实际成功状态、终点和写入值,再把动作替换为自己的业务函数。 +公开读者可从[工作流模型](/guide/workflow-model)和[示例](/examples/index)了解技术能力。获得内部开发权限的维护者可按[内部安装与环境](/guide/installation)和[第一个工作流](/guide/quick-start)复现代码。 diff --git a/website/content/guide/javascript-typescript.mdx b/website/content/guide/javascript-typescript.mdx index 382925c..1d2d82a 100644 --- a/website/content/guide/javascript-typescript.mdx +++ b/website/content/guide/javascript-typescript.mdx @@ -4,7 +4,7 @@ FlowKit v1.0.0 使用同一套 DSL 编译 JavaScript 与 TypeScript。选择你 ## 文件名与入口 -工作流必须以 `.workflow.js` 或 `.workflow.ts` 结尾,并从 `@devcodex/flowkit/dsl` 导入构造器,默认导出 `defineWorkflow(...)`。宿主可以是普通 `.mjs`,从 `@devcodex/flowkit` 调用 SDK。这两个入口都属于公开接口,不需要导入 dist 内部文件。 +工作流必须以 `.workflow.js` 或 `.workflow.ts` 结尾,并从 `@devcodex-labs/flowkit/dsl` 导入构造器,默认导出 `defineWorkflow(...)`。宿主可以是普通 `.mjs`,从 `@devcodex-labs/flowkit` 调用 SDK。这两个入口都属于公开接口,不需要导入 dist 内部文件。 下面是同一个条件分流流程的两种写法。分别保存到同一消费者目录时,注意它们生成的 `sample.compiled.mjs` 同名;逐个编译验证,或者使用不同基础文件名保存两个产物。 diff --git a/website/content/guide/quick-start.mdx b/website/content/guide/quick-start.mdx index ebf5652..2662259 100644 --- a/website/content/guide/quick-start.mdx +++ b/website/content/guide/quick-start.mdx @@ -2,11 +2,11 @@ import { Mermaid } from '../../components/Mermaid'; # 第一个工作流 -本教程完成一个不需要模型密钥的流程:宿主生成问候,FlowKit 进入成功终点,返回最终状态。你会依次创建两个文件、编译、检查并运行;所有命令均在消费者项目根目录执行。 +本教程是**内部开发验证用例**,公开读者可以阅读流程但不需要获得安装权限。它完成一个不需要模型密钥的流程:宿主生成问候,FlowKit 进入成功终点,返回最终状态。你会依次创建两个文件、编译、检查并运行;所有命令均在消费者项目根目录执行。 ## 1. 准备环境 -先按[安装与环境](/guide/installation)安装 `@devcodex/flowkit@1.0.0`。确认 Node >=22.13.0,package.json 包含 `"type": "module"`。开始时无需 Skill 文件或额外环境变量。 +先配置私有 GitHub Packages 访问令牌,再按[安装与环境](/guide/installation)安装 `@devcodex-labs/flowkit@1.0.0`。确认 Node >=22.13.0,package.json 包含 `"type": "module"`。开始时无需 Skill 文件或额外环境变量。 ```text flowkit-demo/ diff --git a/website/content/index.mdx b/website/content/index.mdx index 8ff9f3f..ea33377 100644 --- a/website/content/index.mdx +++ b/website/content/index.mdx @@ -3,11 +3,11 @@ pageType: home hero: name: FlowKit text: 把业务步骤写成清晰的工作流 - tagline: 用 JavaScript / TypeScript 定义流程,通过宿主 Runtime 连接 Agent、业务操作和人工审批。首个正式版本 v1.0.0 · MIT + tagline: 用 JavaScript / TypeScript 定义流程,通过宿主 Runtime 连接 Agent、业务操作和人工审批。v1.0.0 · 专有授权 · 私有分发 actions: - theme: brand - text: 快速开始 - link: /guide/quick-start + text: 了解 FlowKit + link: /guide/introduction - theme: alt text: 查看示例 link: /examples/index @@ -33,7 +33,7 @@ import { Mermaid } from '../components/Mermaid'; ```js file="../../examples/docs/quick-start/sample.workflow.js" title="sample.workflow.js" ``` -完整的宿主、安装命令和预期输出见[快速开始](/guide/quick-start)。第一次使用不需要模型密钥。 +完整的宿主实现和预期输出见[内部开发示例](/guide/quick-start)。该示例供技术说明与内部验证使用,公开读者不需要安装包或模型密钥。 ## 适合你的任务吗 @@ -41,4 +41,12 @@ import { Mermaid } from '../components/Mermaid'; FlowKit 是进程内编排工具。它不内置工作流数据库、跨进程恢复、审批界面或模型服务。并行分支共享状态;选择 `any` 汇合不会自动取消其他分支。先从小流程验证业务边界,再增加节点。 -[项目介绍](/guide/introduction) · [安装与环境](/guide/installation) · [GitHub](https://github.com/devcodex-labs/flowkit) · [MIT 许可证](https://github.com/devcodex-labs/flowkit/blob/main/LICENSE) +[项目介绍](/guide/introduction) · [安装与环境](/guide/installation) · [授权与使用](/community/license) + +需要能力发现或跨 Provider 依赖判断时,可选用[FlowKit Provider 声明](/guide/capability-provider)与[capability-graph 宿主示例](/examples/capability-graph);它们不改变现有 DSL 的控制流执行契约。 + +## 对外服务方向 + +FlowKit 是私有工作流基础设施,拟通过 **MCP 服务、托管 API 或付费工作流设计产品** 对外提供工作流能力,而不是向付费客户交付 npm 包。以上是计划中的商业化方向,**目前未提供可直接购买或调用的正式服务**。 + +本站文档允许公开阅读;FlowKit 源代码、软件包和内部部署环境仍为私有。公开技术示例不等于开放源码,也不授予安装或分发权利。未来客户取得的生成工作流产物使用权,将由单独的产品服务条款明确。 diff --git a/website/content/maintainers/releasing.mdx b/website/content/maintainers/releasing.mdx index c310e0f..0547dad 100644 --- a/website/content/maintainers/releasing.mdx +++ b/website/content/maintainers/releasing.mdx @@ -1,87 +1,51 @@ # 发布维护 -本页面向维护者,说明v1.0.0候选、npm发布、公开消费与文档站部署的顺序。普通用户只需按[安装](/guide/installation)使用包,不需要运行发布命令。 +此页仅供具有仓库与 GitHub Packages 发布权限的内部维护者使用。FlowKit 是内部运营的专有基础设施,未来客户通过托管 MCP/API 或付费工作流设计服务使用能力,不向客户提供 npm 包。内部软件包只发布至 **GitHub Packages 私有 npm Registry**,不再向 npmjs 发布。包名为 `@devcodex-labs/flowkit`,Registry 为 `https://npm.pkg.github.com/`。 -## 不可跳过的顺序 +## 不可跳过的流程 -候选包与站点检查通过 → 发布同一候选tarball → 验证公开npm精确版本 → 独立安装运行全部教程 → 构建对应提交的站点 → GitHub Pages部署 → 线上复验。构建或dry run成功不等于发布成功。 +冻结 Commit 与版本 → 运行 CI(SDK/类型/12+E13 文档消费者)→ 核查候选 tarball 与 SHA256 → 通过 `publish.yml` 发布到 GitHub Packages → 用有读取权限的身份读取已发布精确版本 → 比对 Registry 下载包与已审阅 tarball → 构建并验证站点 → 依据批准的站点可见性策略部署。 -首个正式版本为1.0.0。package.json、package-lock、LICENSE、CHANGELOG、README和生成示例必须一致。SDK与站点有独立锁文件,发布候选不能依赖移动的main或未记录的本机缓存。 +**本页为操作规范,不表示候选版本已经发布。** 当前 `main` 的源码版本不等同于 Registry 已有版本;不能移动现有 Tag 或以重新打包代替原始发行字节。 -## 准备可审阅的候选 +## 准备候选 -在仓库根目录、Node >=24环境执行: +在 Node >=24 和获授权的工作区执行: ```sh npm ci --ignore-scripts --no-audit --no-fund npm --prefix website ci --ignore-scripts --no-audit --no-fund npm run verify npm run docs:check -npm run docs:examples -- --evidence .tmp/docs/candidate.json +npm run docs:examples npm run docs:build -npm run docs:preview -- --host 127.0.0.1 --port 4173 -``` - -在/flowkit/实际检查首页、教程、参考、搜索、错误深链、代码复制、移动布局和404。示例主源变化时先docs:sync;版本/生成逻辑变化时才build及update:goldens,审阅生成差异后重跑对应检查。 - -## 固定最终包字节 - -```sh npm run release:check -- --tag v1.0.0 npm run release:pack -- --tag v1.0.0 node scripts/release.mjs verify --tag v1.0.0 -npm run docs:examples -- --package .tmp/release/devcodex-flowkit-1.0.0.tgz --manifest .tmp/release/release.json --evidence .tmp/docs/release-candidate.json -``` - -release目录必须恰有tgz和release.json两个文件。脚本将tarball的SHA256、成员列表及每个文件字节与源码绑定。有旧候选时先记录和移出原证据,不覆盖不明文件,也不在下载后重新pack替换字节。最后消费的必须是实际待发布tarball。 - -## CI和npm发布 - -ci.yml保留Ubuntu/Windows×Node22.13.0/24.22.1四环境原验证,追加教程消费者;独立网站任务进行类型、内容、检查器测试和生产构建。publish.yml在tag触发后先preflight和CI,再pack一次、消费同一包、下载核对,然后使用npm trusted publishing发布。 - -GitHub仓库的npm OIDC、Pages来源、github-pages环境保护和所需权限须由维护者在真正发布前核实。workflow文件存在不代表这些远端设置已经生效。发布tag/push、npm写入与Pages部署需要项目维护者明确批准。 - -## 发布后验证公开包 - -```sh -npm run docs:public-package -- --version 1.0.0 --manifest .tmp/release/release.json --evidence .tmp/docs/public-package.json -npm run docs:examples -- --registry-version 1.0.0 --manifest .tmp/release/release.json --evidence .tmp/docs/public-consumer.json ``` -第一个命令从registry读取精确版本元数据、下载实际tgz,核对name/version/dist.integrity和候选SHA256。只有版本尚不可见的E404会有限重试,最多5次、间隔15秒;完整测试失败不被当作传播延迟掩盖。 - -第二个命令使用新的临时安装目录/cache,精确安装公开1.0.0,核对安装文件和下载tarball字节,并运行12组教程和TS检查。只看npm view、latest或版本字符串不够。任一失败都阻止文档部署。 - -## 双提交与原发布身份 - -docs.yml的自动和手动入口都需要五个输入:packageReleaseCommit、docsCommit、version、releaseRunId、releaseRunAttempt。两个commit必须是40位SHA;version为1.0.0。正常首发两个commit相同,手动重试也不默认取main。 - -原pack任务上传两份按attempt区分的artifact:`npm-release-`包含原tgz和release.json;`release-identity-`包含release-record.json。记录绑定仓库、publish.yml、run/attempt、tag/version、原包commit、npm artifact ID/digest、manifest/tgz SHA256。attempt后缀避免同一run重跑覆盖原身份。 - -文档任务通过Actions API核对原run的仓库、工作流、tag、head_sha、attempt和pack/publish已成功的job,再下载具体artifact ID。自动调用时run尚未结束,所以不要求整个run成功;手动可恢复“npm成功而文档失败”的run。缺失、过期、错run/commit或替换manifest均拒绝部署。 - -两份artifact请求保留90天,实际期限受仓库策略限制。发布交付时同时归档原字节、hash和实际到期时间。过期后不能重新pack冒充原候选;需要项目方提供原归档并确认来源,准备单独的恢复步骤。当前入口会保持失败,不自动猜测来源。 - -## npm已成功但文档需修复 +版本应与 package、lock、CHANGELOG 与 Tag 一致。此步骤只准备候选,不执行真实发布。检查 `.tmp/release/` 仅包含按白名单生成的 tarball 和 release.json,记录包 SHA256、成员、原 Commit 与构建环境。 -保留packageReleaseCommit、v1.0.0 tag及原tgz不变,指定经过审阅且获准部署的后继docsCommit。差异只允许website/、docs/、examples/docs/、scripts/docs/及.github/workflows/docs.yml;README、包元数据、LICENSE、src/types和其他包构建源不得变化。 +## GitHub Packages 权限和发布 -原包在原提交的隔离checkout核验,文档在docsCommit构建;修复后的教程仍消费原公开包。通过祖先关系/路径白名单/原包字节校验后,重新检查受影响读者任务和站点,再部署。超出白名单需重新评估变更范围,不能移动旧tag或重发不可变1.0.0。 +发布必须先经授权确认 LICENSE 草案和具体发布版本,再将仓库变量 `FLOWKIT_ENABLE_PACKAGE_PUBLISH` 设置为 `true`;默认关闭以防误发布。发布工作流只允许使用 `packages:write` 的 `GITHUB_TOKEN` 与正确的组织 Scope,配置 `actions/setup-node` 的 `registry-url: https://npm.pkg.github.com`。发布命令不得出现 `--access public` 或 `registry.npmjs.org`。首次发布后通过 `scripts/docs/check-package-privacy.mjs` 核实包的 **Private** 可见性及 Actions 访问授权;GitHub 仓库 Private 并不自动证明包权限正确。 -## 部署证据与失败处理 +消费方配置 scoped `.npmrc`,令牌由环境变量注入。仓库外消费者通常需要有 `read:packages` 的 PAT (classic);Actions 从本仓库读取私有包可在适当授权下使用 `GITHUB_TOKEN`。不要在 GitHub Pages、日志或 GitHub Actions Artifact 中保存 Token。完整配置见[安装](/guide/installation)。 -站点产物名称为 `github-pages--`。build作业输出实际名称,deploy沿用该输出选择唯一产物。原包的releaseRunId/releaseRunAttempt保持原发布身份,不跟随站点重跑改变。 +## 不可变发布与文档部署证据 -恢复时区分三条路径: +`publish.yml` 的 preflight/CI/pack/publish/private-consumer 阶段必须全部成功;`docs.yml` 应核验原发布 Run/Attempt、`packageReleaseCommit`、`docsCommit`、Tag、tarball SHA256 与产物身份。原包与文档源可以是不同 Commit,但文档修订必须满足原白名单和祖先关系,不能借修订文档偷改已发布包。 -- 新建workflow_dispatch:新的docs run生成新名称;仍须通过原包身份、公开消费和文档提交检查。 -- 同一个docs run重新执行build/upload:新build attempt生成不同名称,不覆盖前次产物;deploy使用这次build的输出。 -- 仅重试deploy:沿用已成功build的输出名称,不能按当前deploy attempt重新计算。要求原站点产物仍存在且未过期;当前上传动作默认保留1天。产物过期或被删除时,重新构建,或新建dispatch;原包证据也必须仍满足上文的身份和期限要求。 +从私有 Registry 执行 `docs:private-package`,必须验证确切版本的 `dist.integrity`、tarball 哈希、包名和版本,再运行全部教程消费者用例,不能把无访问权限的 `404` 当作包不存在或发布成功。 -这些配置描述支持的恢复流程;维护者仍须在真实Actions中核对每次选中的artifact名称、来源和部署结果。 +**公开文档站已获项目负责人批准**,目标地址为 GitHub Pages `/flowkit/`;FlowKit 仓库和 GitHub Packages 仍保持私有。自动部署前须核对实际 Pages 权限、环境保护和公开内容边界。网站的搜索索引和 sitemap 公开,但不得包含凭据、私有源码、内部资料或要求未授权访问者打开私有仓库的无说明链接。 -仅deploy job拥有pages:write/id-token:write,使用github-pages环境;构建和PR不部署。site-build.json绑定两个commit、包hash和website锁hash。上传并部署后实查首页、快速开始、SDK、错误锚点、资源、中文lang、canonical/sitemap及搜索,再在新消费者目录跑公开包关键路径。 +## 失败与恢复 -npm失败或公开包不可用:停止站点,先查registry实际状态,避免盲目重复发布。站点失败:保留npm事实,按同提交重试或允许的文档修复通道处理。首发没有上一版本可回退时,准备修复候选;不伪称已经回退成功。线上故障的下线、回退和重新部署按维护者实际授权执行。 +- 候选验证失败:不发布,不改原 Tag,不用跳过失败测试代替修复 +- Registry 发布失败:先查实际版本与权限,避免对不可变版本重复发布 +- Registry 消费失败:核查 token/scope/组织权限与下载字节,不只依赖 `npm view` +- 文档构建失败:保留原发布身份、tarball 与 Artifact,按允许的文档修复范围重建 +- Artifact 过期:需要找回可验证原始字节,不能重包冒充原已发布产物 -工作流依赖使用固定commit SHA。Pages动作和Actions身份读取方式依据[upload-pages-artifact](https://github.com/actions/upload-pages-artifact)、[deploy-pages](https://github.com/actions/deploy-pages)及[Actions API](https://docs.github.com/en/rest/actions/workflow-runs)维护;升级时重新核对第一方契约并运行身份正反例。 +可通过 `npm run docs:check` 与 `npm run docs:build` 验证站点;站点公开已获确认,但**上线仍是单独的发布动作**:只有通过站点披露审查、权限核对与维护者批准后,才将仓库变量 `FLOWKIT_ENABLE_PAGES_DEPLOY` 设为 `true` 并部署。默认情况下文档发布任务不会部署 Pages。第三方依赖与其许可证不会因 FlowKit 改为专有软件而改变。 diff --git a/website/content/reference/cli.mdx b/website/content/reference/cli.mdx index d56bd6b..bca0ae0 100644 --- a/website/content/reference/cli.mdx +++ b/website/content/reference/cli.mdx @@ -1,6 +1,6 @@ # 命令行 -安装 `@devcodex/flowkit@1.0.0` 后得到flowkit命令。v1.0.0只有compile和check;运行工作流请创建宿主并调用SDK run,没有flowkit run子命令。 +安装 `@devcodex-labs/flowkit@1.0.0` 后得到flowkit命令。v1.0.0只有compile和check;运行工作流请创建宿主并调用SDK run,没有flowkit run子命令。 ## 两个命令 diff --git a/website/content/reference/options.mdx b/website/content/reference/options.mdx index 8d720e4..98dd19d 100644 --- a/website/content/reference/options.mdx +++ b/website/content/reference/options.mdx @@ -71,3 +71,7 @@ string,默认关闭。相对路径基于调用时cwd,保存生成的运行 filename仅为compileSource专用必需字段,不属于上面11项。其他调用和flowkit.config.mjs拒绝它。未知键、Symbol键或不符类型会直接拒绝,不静默忽略。 CLI只加载当前调用目录的flowkit.config.mjs,先校验完整配置,再将命令行覆盖项浅合并。配置本身错误时,即使同名参数会覆盖它仍失败。布尔false能覆盖true,remoteSkillHosts按整数组替换。示例配置与命令见[命令行](/reference/cli)。 + +## capability-graph 不占用核心配置项 + +Graph 的 Provider、`allowedProviders`、`context` 和模型适配由宿主管理,不属于这 11 个 FlowKit SDK 选项;请勿将图谱配置写入 `flowkit.config.mjs` 试图绕过未知键校验。详见[宿主消费示例](/examples/capability-graph)。 diff --git a/website/content/reference/runtime.mdx b/website/content/reference/runtime.mdx index 5baeb9e..5153588 100644 --- a/website/content/reference/runtime.mdx +++ b/website/content/reference/runtime.mdx @@ -56,3 +56,7 @@ checkStep只得到id/name/attempt这一较小的step对象,而不是完整Agen 方法缺失或返回类型错误,先核对上表与公开类型。checkStep返回false不是“通过”,应改为null;runHuman返回字符串不是批准,应改为boolean或规范对象;verification返回对象应提取真正boolean。validateResult错误形状不保证被包装为统一FK错误,宿主必须遵守契约。 完整声明与所有字段见[TypeScript类型](/reference/types),重试与传播细节见[结果校验与重试](/guide/validation-retries)。 + +## 可选 Graph 宿主绑定 + +`createCapabilityGraphActionAdapter({ graph, bindings, getContext })` 返回一个 `runAction`,可由现有 Runtime 显式组合。它在调用业务函数前检查 Graph 的权限(由 Graph SDK 执行)、依赖完整性和所有已解析节点的适用性。其缺少绑定/不完整依赖/不适用错误码分别为 `FK_CG_BINDING_MISSING`、`FK_CG_DEPENDENCIES_INCOMPLETE`、`FK_CG_NOT_APPLICABLE`,不属于内建的 61 个 `FK_C`/`FK_R` 编译运行诊断码。参考[完整示例](/examples/capability-graph)。 diff --git a/website/content/reference/sdk.mdx b/website/content/reference/sdk.mdx index 9141e42..dbd1e1f 100644 --- a/website/content/reference/sdk.mdx +++ b/website/content/reference/sdk.mdx @@ -1,6 +1,6 @@ # SDK API -FlowKit v1.0.0 根入口 `@devcodex/flowkit` 公开六个函数。构造工作流使用另一个入口 `@devcodex/flowkit/dsl`。直接 SDK 不自动加载 flowkit.config.mjs;请显式传 options。 +FlowKit v1.0.0 根入口 `@devcodex-labs/flowkit` 公开六个函数。构造工作流使用另一个入口 `@devcodex-labs/flowkit/dsl`。直接 SDK 不自动加载 flowkit.config.mjs;请显式传 options。 ## run:执行工作流 {#run} @@ -96,3 +96,7 @@ isControlSignal(err: unknown): boolean ``` 所有options的适用性见[配置参考](/reference/options),宿主签名见[Runtime契约](/reference/runtime),返回字段见[类型参考](/reference/types)。 + +## 可选 capability-graph 子入口 + +`@devcodex-labs/flowkit/capability-graph` 单独导出 `flowkitProvider` 和 `createCapabilityGraphActionAdapter`。它不是根 SDK 六个公开函数的一部分;不自动安装或启动 capability-graph,也不接管宿主 Runtime。详见[能力声明](/guide/capability-provider)和[宿主集成](/examples/capability-graph)。 diff --git a/website/content/reference/types.mdx b/website/content/reference/types.mdx index e93a859..0846b04 100644 --- a/website/content/reference/types.mdx +++ b/website/content/reference/types.mdx @@ -1,6 +1,6 @@ # TypeScript 类型 -公开类型与运行时函数位于两个入口:根入口提供SDK/Runtime类型,`@devcodex/flowkit/dsl`提供DSL类型和构造器。使用TypeScript 5.0+;不要通过dist内部路径导入声明。 +公开类型与运行时函数位于两个入口:根入口提供SDK/Runtime类型,`@devcodex-labs/flowkit/dsl`提供DSL类型和构造器。使用TypeScript 5.0+;不要通过dist内部路径导入声明。 ## SDK 类型索引 @@ -65,3 +65,7 @@ npx tsc --noEmit --strict --skipLibCheck --target ES2022 --module NodeNext --mod ## 遇到类型错误时 先核对入口、TypeScript版本和ESM设置;再查看是否多写字段、后继不存在、并行成员带next或联合类型不满足。避免用any或忽略诊断掩盖真实契约问题。完整JS/TS等价例见[JavaScript与TypeScript](/guide/javascript-typescript)。 + +## Graph 适配器类型 + +`@devcodex-labs/flowkit/capability-graph` 另带 `GraphResolver`、`GraphContext`、`GraphResolution`、`GraphActionBinding` 等结构化 TypeScript 类型。Graph 实例由宿主注入,FlowKit 不把 Graph SDK 添加为强制依赖。参见[Provider 说明](/guide/capability-provider)。 diff --git a/website/content/troubleshooting/compiler.mdx b/website/content/troubleshooting/compiler.mdx index 5e78c47..4ca630f 100644 --- a/website/content/troubleshooting/compiler.mdx +++ b/website/content/troubleshooting/compiler.mdx @@ -7,7 +7,7 @@ 每条的错误与修复源码来自同版本独立诊断用例。把需要的源码保存为case.workflow.js,在已安装FlowKit的ESM目录运行compile/check。涉及agent映射的用例先创建skills/writer.md,写入任意合法UTF-8说明;涉及远程URL只做静态检查,不会联网。条目给出的options需传给SDK,CLI支持的对应参数见命令行页。 ```js -import { compile } from '@devcodex/flowkit'; +import { compile } from '@devcodex-labs/flowkit'; const result = await compile('case.workflow.js', { /* 使用条目中的options */ }); console.log(result.diagnostics); ``` @@ -25,14 +25,14 @@ console.log(result.diagnostics); 错误源码(保存为case.workflow.js): ```js -import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl'; +import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl'; export default defineWorkflow({id:'Bad',version:'1.0.0',name:'Demo',nodes:[terminal('done',{name:'done',status:'succeeded'})]}); ``` 修复后的完整源码: ```js -import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl'; +import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl'; export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[terminal('done',{name:'done',status:'succeeded'})]}); ``` @@ -61,14 +61,14 @@ export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[term 错误源码(保存为case.workflow.js): ```js -import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl'; +import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl'; export default defineWorkflow({id:'demo',version:'01.0.0',name:'Demo',nodes:[terminal('done',{name:'done',status:'succeeded'})]}); ``` 修复后的完整源码: ```js -import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl'; +import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl'; export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[terminal('done',{name:'done',status:'succeeded'})]}); ``` @@ -97,14 +97,14 @@ export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[term 错误源码(保存为case.workflow.js): ```js -import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl'; +import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl'; export default defineWorkflow({id:'demo',version:'1.0.0',name:'bad*/',nodes:[terminal('done',{name:'done',status:'succeeded'})]}); ``` 修复后的完整源码: ```js -import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl'; +import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl'; export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[terminal('done',{name:'done',status:'succeeded'})]}); ``` @@ -133,14 +133,14 @@ export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[term 错误源码(保存为case.workflow.js): ```js -import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl'; +import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl'; export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[]}); ``` 修复后的完整源码: ```js -import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl'; +import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl'; export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[terminal('done',{name:'done',status:'succeeded'})]}); ``` @@ -193,14 +193,14 @@ export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[term 错误源码(保存为case.workflow.js): ```js -import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl'; +import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl'; export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',extra:1,nodes:[terminal('done',{name:'done',status:'succeeded'})]}); ``` 修复后的完整源码: ```js -import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl'; +import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl'; export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[terminal('done',{name:'done',status:'succeeded'})]}); ``` @@ -229,14 +229,14 @@ export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[term 错误源码(保存为case.workflow.js): ```js -import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl'; +import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl'; export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[...[]]}); ``` 修复后的完整源码: ```js -import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl'; +import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl'; export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[terminal('done',{name:'done',status:'succeeded'})]}); ``` @@ -267,14 +267,14 @@ export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[term 错误源码(保存为case.workflow.js): ```js -import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl'; +import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl'; export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[terminal('Bad',{name:'Done',status:'succeeded'})]}); ``` 修复后的完整源码: ```js -import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl'; +import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl'; export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[terminal('done',{name:'done',status:'succeeded'})]}); ``` @@ -303,14 +303,14 @@ export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[term 错误源码(保存为case.workflow.js): ```js -import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl'; +import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl'; export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[terminal('done',{name:'done',status:'succeeded'}),terminal('done',{name:'done',status:'succeeded'})]}); ``` 修复后的完整源码: ```js -import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl'; +import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl'; export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[terminal('done',{name:'done',status:'succeeded'})]}); ``` @@ -339,14 +339,14 @@ export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[term 错误源码(保存为case.workflow.js): ```js -import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl'; +import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl'; export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[terminal('done',{name:'bad*/',status:'succeeded'})]}); ``` 修复后的完整源码: ```js -import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl'; +import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl'; export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[terminal('done',{name:'done',status:'succeeded'})]}); ``` @@ -375,14 +375,14 @@ export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[term 错误源码(保存为case.workflow.js): ```js -import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl'; +import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl'; export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[terminal('done',{name:'done',status:'succeeded'}),terminal('other',{name:'done',status:'succeeded'})]}); ``` 修复后的完整源码: ```js -import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl'; +import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl'; export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[terminal('done',{name:'done',status:'succeeded'})]}); ``` @@ -411,14 +411,14 @@ export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[term 错误源码(保存为case.workflow.js): ```js -import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl'; +import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl'; export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[terminal('done',{name:'Done',type:'agent',status:'succeeded'})]}); ``` 修复后的完整源码: ```js -import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl'; +import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl'; export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[terminal('done',{name:'done',status:'succeeded'})]}); ``` @@ -447,14 +447,14 @@ export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[term 错误源码(保存为case.workflow.js): ```js -import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl'; +import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl'; export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[action('a',{name:'a',action:'save',next:'missing'}),terminal('done',{name:'done',status:'succeeded'})]}); ``` 修复后的完整源码: ```js -import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl'; +import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl'; export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[action('a',{name:'a',action:'save',next:'done'}),terminal('done',{name:'done',status:'succeeded'})]}); ``` @@ -483,14 +483,14 @@ export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[acti 错误源码(保存为case.workflow.js): ```js -import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl'; +import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl'; export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[action('a',{name:'a',action:'save'}),terminal('done',{name:'done',status:'succeeded'})]}); ``` 修复后的完整源码: ```js -import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl'; +import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl'; export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[action('a',{name:'a',action:'save',next:'done'}),terminal('done',{name:'done',status:'succeeded'})]}); ``` @@ -519,14 +519,14 @@ export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[acti 错误源码(保存为case.workflow.js): ```js -import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl'; +import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl'; export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[terminal('done',{name:'done',status:'succeeded'}),terminal('unused',{name:'unused',status:'succeeded'})]}); ``` 修复后的完整源码: ```js -import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl'; +import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl'; export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[terminal('done',{name:'done',status:'succeeded'})]}); ``` @@ -555,14 +555,14 @@ export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[term 错误源码(保存为case.workflow.js): ```js -import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl'; +import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl'; export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[terminal('done',{name:'Done',status:'succeeded',extra:1})]}); ``` 修复后的完整源码: ```js -import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl'; +import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl'; export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[terminal('done',{name:'done',status:'succeeded'})]}); ``` @@ -591,14 +591,14 @@ export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[term 错误源码(保存为case.workflow.js): ```js -import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl'; +import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl'; export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[action('a',{name:'a',action:'save',next:'done',writes:null}),terminal('done',{name:'done',status:'succeeded'})]}); ``` 修复后的完整源码: ```js -import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl'; +import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl'; export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[action('a',{name:'a',action:'save',next:'done',writes:[]}),terminal('done',{name:'done',status:'succeeded'})]}); ``` @@ -629,14 +629,14 @@ export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[acti 错误源码(保存为case.workflow.js): ```js -import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl'; +import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl'; export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[parallel('p',{name:'P',branches:['a'],join:{strategy:'any',next:'done'}}),action('a',{name:'a',action:'save'}),action('b',{name:'b',action:'save'}),terminal('done',{name:'done',status:'succeeded'})]}); ``` 修复后的完整源码: ```js -import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl'; +import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl'; export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[parallel('p',{name:'P',branches:['a','b'],join:{strategy:'any',next:'done'}}),action('a',{name:'a',action:'save'}),action('b',{name:'b',action:'save'}),terminal('done',{name:'done',status:'succeeded'})]}); ``` @@ -665,14 +665,14 @@ export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[para 错误源码(保存为case.workflow.js): ```js -import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl'; +import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl'; export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[parallel('p',{name:'P',branches:['a','b'],join:{strategy:'any',next:'done'}}),action('a',{name:'a',action:'save',next:'done'}),action('b',{name:'b',action:'save'}),terminal('done',{name:'done',status:'succeeded'})]}); ``` 修复后的完整源码: ```js -import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl'; +import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl'; export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[parallel('p',{name:'P',branches:['a','b'],join:{strategy:'any',next:'done'}}),action('a',{name:'a',action:'save'}),action('b',{name:'b',action:'save'}),terminal('done',{name:'done',status:'succeeded'})]}); ``` @@ -701,14 +701,14 @@ export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[para 错误源码(保存为case.workflow.js): ```js -import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl'; +import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl'; export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[parallel('p',{name:'P',branches:['a','b'],join:{strategy:'any',next:'done'}}),terminal('a',{name:'a',status:'succeeded'}),action('b',{name:'b',action:'save'}),terminal('done',{name:'done',status:'succeeded'})]}); ``` 修复后的完整源码: ```js -import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl'; +import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl'; export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[parallel('p',{name:'P',branches:['a','b'],join:{strategy:'any',next:'done'}}),action('a',{name:'a',action:'save'}),action('b',{name:'b',action:'save'}),terminal('done',{name:'done',status:'succeeded'})]}); ``` @@ -737,14 +737,14 @@ export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[para 错误源码(保存为case.workflow.js): ```js -import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl'; +import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl'; export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[parallel('p',{name:'P',branches:['a','b'],join:{strategy:'all',next:'done'}}),action('a',{name:'a',action:'save'}),action('b',{name:'b',action:'save'}),terminal('done',{name:'done',status:'succeeded'})]}); ``` 修复后的完整源码: ```js -import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl'; +import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl'; export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[parallel('p',{name:'P',branches:['a','b'],join:{strategy:'any',next:'done'}}),action('a',{name:'a',action:'save'}),action('b',{name:'b',action:'save'}),terminal('done',{name:'done',status:'succeeded'})]}); ``` @@ -773,14 +773,14 @@ export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[para 错误源码(保存为case.workflow.js): ```js -import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl'; +import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl'; export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[parallel('p',{name:'P',branches:['a','b'],join:{strategy:'any',next:'a'}}),action('a',{name:'a',action:'save'}),action('b',{name:'b',action:'save'}),terminal('done',{name:'done',status:'succeeded'})]}); ``` 修复后的完整源码: ```js -import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl'; +import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl'; export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[parallel('p',{name:'P',branches:['a','b'],join:{strategy:'any',next:'done'}}),action('a',{name:'a',action:'save'}),action('b',{name:'b',action:'save'}),terminal('done',{name:'done',status:'succeeded'})]}); ``` @@ -809,14 +809,14 @@ export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[para 错误源码(保存为case.workflow.js): ```js -import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl'; +import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl'; export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[parallel('p',{name:'P',branches:['a','b'],join:{strategy:'any',next:'done'}}),verification('a',{name:'a',verifier:'check',onSuccess:'done',onFailure:'done'}),action('b',{name:'b',action:'save'}),terminal('done',{name:'done',status:'succeeded'})]}); ``` 修复后的完整源码: ```js -import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl'; +import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl'; export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[parallel('p',{name:'P',branches:['a','b'],join:{strategy:'any',next:'done'}}),verification('a',{name:'a',verifier:'check'}),action('b',{name:'b',action:'save'}),terminal('done',{name:'done',status:'succeeded'})]}); ``` @@ -845,14 +845,14 @@ export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[para 错误源码(保存为case.workflow.js): ```js -import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl'; +import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl'; export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[parallel('p',{name:'P',branches:['a','b'],join:{strategy:'any',next:'done'}}),action('a',{name:'a',action:'save',writes:['x']}),action('b',{name:'b',action:'save',writes:['x']}),terminal('done',{name:'done',status:'succeeded'})]}); ``` 修复后的完整源码: ```js -import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl'; +import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl'; export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[parallel('p',{name:'P',branches:['a','b'],join:{strategy:'any',next:'done'}}),action('a',{name:'a',action:'save',writes:['x']}),action('b',{name:'b',action:'save',writes:['y']}),terminal('done',{name:'done',status:'succeeded'})]}); ``` @@ -883,14 +883,14 @@ export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[para 错误源码(保存为case.workflow.js): ```js -import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl'; +import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl'; export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[condition('c',{name:'C',branches:[]}),terminal('done',{name:'done',status:'succeeded'})]}); ``` 修复后的完整源码: ```js -import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl'; +import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl'; export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[condition('c',{name:'C',branches:[{when:"flag",next:'done'},{when:'true',next:'done'}]}),terminal('done',{name:'done',status:'succeeded'})]}); ``` @@ -919,14 +919,14 @@ export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[cond 错误源码(保存为case.workflow.js): ```js -import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl'; +import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl'; export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[condition('c',{name:'C',branches:[{when:'flag',next:'done'}]}),terminal('done',{name:'done',status:'succeeded'})]}); ``` 修复后的完整源码: ```js -import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl'; +import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl'; export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[condition('c',{name:'C',branches:[{when:"flag",next:'done'},{when:'true',next:'done'}]}),terminal('done',{name:'done',status:'succeeded'})]}); ``` @@ -955,14 +955,14 @@ export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[cond 错误源码(保存为case.workflow.js): ```js -import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl'; +import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl'; export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[condition('c',{name:'C',branches:[{when:"flag &&",next:'done'},{when:'true',next:'done'}]}),terminal('done',{name:'done',status:'succeeded'})]}); ``` 修复后的完整源码: ```js -import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl'; +import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl'; export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[condition('c',{name:'C',branches:[{when:"flag",next:'done'},{when:'true',next:'done'}]}),terminal('done',{name:'done',status:'succeeded'})]}); ``` @@ -991,14 +991,14 @@ export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[cond 错误源码(保存为case.workflow.js): ```js -import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl'; +import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl'; export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[condition('c',{name:'C',branches:[{when:"fn()",next:'done'},{when:'true',next:'done'}]}),terminal('done',{name:'done',status:'succeeded'})]}); ``` 修复后的完整源码: ```js -import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl'; +import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl'; export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[condition('c',{name:'C',branches:[{when:"flag",next:'done'},{when:'true',next:'done'}]}),terminal('done',{name:'done',status:'succeeded'})]}); ``` @@ -1027,14 +1027,14 @@ export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[cond 错误源码(保存为case.workflow.js): ```js -import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl'; +import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl'; export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[condition('c',{name:'C',branches:[{when:"true\n",next:'done'},{when:'true',next:'done'}]}),terminal('done',{name:'done',status:'succeeded'})]}); ``` 修复后的完整源码: ```js -import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl'; +import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl'; export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[condition('c',{name:'C',branches:[{when:"flag",next:'done'},{when:'true',next:'done'}]}),terminal('done',{name:'done',status:'succeeded'})]}); ``` @@ -1065,14 +1065,14 @@ export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[cond 错误源码(保存为case.workflow.js): ```js -import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl'; +import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl'; export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[loop('l',{name:'L',maxIterations:0,body:'v',onSuccess:'done',onMaxExceeded:'failed'}),verification('v',{name:'V',verifier:'check',onSuccess:'l',onFailure:'repair'}),action('repair',{name:'repair',action:'save',next:'v'}),terminal('done',{name:'done',status:'succeeded'}),terminal('failed',{name:'failed',status:'succeeded'})]}); ``` 修复后的完整源码: ```js -import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl'; +import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl'; export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[loop('l',{name:'L',maxIterations:3,body:'v',onSuccess:'done',onMaxExceeded:'failed'}),verification('v',{name:'V',verifier:'check',onSuccess:'l',onFailure:'repair'}),action('repair',{name:'repair',action:'save',next:'v'}),terminal('done',{name:'done',status:'succeeded'}),terminal('failed',{name:'failed',status:'succeeded'})]}); ``` @@ -1101,14 +1101,14 @@ export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[loop 错误源码(保存为case.workflow.js): ```js -import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl'; +import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl'; export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[loop('l',{name:'L',maxIterations:3,body:'v',onSuccess:'done',onMaxExceeded:'failed'}),action('v',{name:'v',action:'save',next:'repair'}),action('repair',{name:'repair',action:'save',next:'v'}),terminal('done',{name:'done',status:'succeeded'}),terminal('failed',{name:'failed',status:'succeeded'})]}); ``` 修复后的完整源码: ```js -import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl'; +import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl'; export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[loop('l',{name:'L',maxIterations:3,body:'v',onSuccess:'done',onMaxExceeded:'failed'}),verification('v',{name:'V',verifier:'check',onSuccess:'l',onFailure:'repair'}),action('repair',{name:'repair',action:'save',next:'v'}),terminal('done',{name:'done',status:'succeeded'}),terminal('failed',{name:'failed',status:'succeeded'})]}); ``` @@ -1137,14 +1137,14 @@ export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[loop 错误源码(保存为case.workflow.js): ```js -import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl'; +import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl'; export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[loop('l',{name:'L',maxIterations:3,body:'v',onSuccess:'done',onMaxExceeded:'failed'}),verification('v',{name:'V',verifier:'check',onSuccess:'l',onFailure:'repair'}),action('repair',{name:'repair',action:'save',next:'done'}),terminal('done',{name:'done',status:'succeeded'}),terminal('failed',{name:'failed',status:'succeeded'})]}); ``` 修复后的完整源码: ```js -import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl'; +import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl'; export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[loop('l',{name:'L',maxIterations:3,body:'v',onSuccess:'done',onMaxExceeded:'failed'}),verification('v',{name:'V',verifier:'check',onSuccess:'l',onFailure:'repair'}),action('repair',{name:'repair',action:'save',next:'v'}),terminal('done',{name:'done',status:'succeeded'}),terminal('failed',{name:'failed',status:'succeeded'})]}); ``` @@ -1173,14 +1173,14 @@ export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[loop 错误源码(保存为case.workflow.js): ```js -import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl'; +import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl'; export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[loop('l',{name:'L',maxIterations:3,body:'v',onSuccess:'done',onMaxExceeded:'failed'}),verification('v',{name:'V',verifier:'check',onSuccess:'l',onFailure:'repair'}),parallel('repair',{name:'Repair',branches:['a','b'],join:{strategy:'any',next:'v'}}),terminal('done',{name:'done',status:'succeeded'}),terminal('failed',{name:'failed',status:'succeeded'}),action('a',{name:'a',action:'save'}),action('b',{name:'b',action:'save'})]}); ``` 修复后的完整源码: ```js -import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl'; +import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl'; export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[loop('l',{name:'L',maxIterations:3,body:'v',onSuccess:'done',onMaxExceeded:'failed'}),verification('v',{name:'V',verifier:'check',onSuccess:'l',onFailure:'repair'}),action('repair',{name:'repair',action:'save',next:'v'}),terminal('done',{name:'done',status:'succeeded'}),terminal('failed',{name:'failed',status:'succeeded'})]}); ``` @@ -1209,14 +1209,14 @@ export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[loop 错误源码(保存为case.workflow.js): ```js -import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl'; +import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl'; export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[action('start',{name:'start',action:'save',next:'v'}),loop('l',{name:'L',maxIterations:3,body:'v',onSuccess:'done',onMaxExceeded:'failed'}),verification('v',{name:'V',verifier:'check',onSuccess:'l',onFailure:'repair'}),action('repair',{name:'repair',action:'save',next:'v'}),terminal('done',{name:'done',status:'succeeded'}),terminal('failed',{name:'failed',status:'succeeded'})]}); ``` 修复后的完整源码: ```js -import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl'; +import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl'; export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[action('start',{name:'start',action:'save',next:'l'}),loop('l',{name:'L',maxIterations:3,body:'v',onSuccess:'done',onMaxExceeded:'failed'}),verification('v',{name:'V',verifier:'check',onSuccess:'l',onFailure:'repair'}),action('repair',{name:'repair',action:'save',next:'v'}),terminal('done',{name:'done',status:'succeeded'}),terminal('failed',{name:'failed',status:'succeeded'})]}); ``` @@ -1245,14 +1245,14 @@ export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[acti 错误源码(保存为case.workflow.js): ```js -import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl'; +import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl'; export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[loop('l',{name:'L',maxIterations:3,body:'v',onSuccess:'done',onMaxExceeded:'failed'}),verification('v',{name:'V',verifier:'check',onSuccess:'l',onFailure:'repair'}),loop('repair',{name:'Repair',maxIterations:2,body:'v',onSuccess:'done',onMaxExceeded:'failed'}),terminal('done',{name:'done',status:'succeeded'}),terminal('failed',{name:'failed',status:'succeeded'})]}); ``` 修复后的完整源码: ```js -import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl'; +import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl'; export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[loop('l',{name:'L',maxIterations:3,body:'v',onSuccess:'done',onMaxExceeded:'failed'}),verification('v',{name:'V',verifier:'check',onSuccess:'l',onFailure:'repair'}),action('repair',{name:'repair',action:'save',next:'v'}),terminal('done',{name:'done',status:'succeeded'}),terminal('failed',{name:'failed',status:'succeeded'})]}); ``` @@ -1281,14 +1281,14 @@ export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[loop 错误源码(保存为case.workflow.js): ```js -import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl'; +import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl'; export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[loop('l',{name:'L',maxIterations:3,body:'v',onSuccess:'done',onMaxExceeded:'failed'}),verification('v',{name:'V',verifier:'check',onSuccess:'l',onFailure:'repair'}),human('repair',{name:'Repair',onApprove:'v',onReject:'repair'}),terminal('done',{name:'done',status:'succeeded'}),terminal('failed',{name:'failed',status:'succeeded'})]}); ``` 修复后的完整源码: ```js -import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl'; +import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl'; export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[loop('l',{name:'L',maxIterations:3,body:'v',onSuccess:'done',onMaxExceeded:'failed'}),verification('v',{name:'V',verifier:'check',onSuccess:'l',onFailure:'repair'}),action('repair',{name:'repair',action:'save',next:'v'}),terminal('done',{name:'done',status:'succeeded'}),terminal('failed',{name:'failed',status:'succeeded'})]}); ``` @@ -1317,14 +1317,14 @@ export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[loop 错误源码(保存为case.workflow.js): ```js -import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl'; +import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl'; export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[loop('l',{name:'L',maxIterations:3,body:'v',onSuccess:'done',onMaxExceeded:'failed'}),verification('v',{name:'V',verifier:'check',onSuccess:'l',onFailure:'repair'}),action('repair',{name:'repair',action:'save',next:'l'}),terminal('done',{name:'done',status:'succeeded'}),terminal('failed',{name:'failed',status:'succeeded'})]}); ``` 修复后的完整源码: ```js -import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl'; +import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl'; export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[loop('l',{name:'L',maxIterations:3,body:'v',onSuccess:'done',onMaxExceeded:'failed'}),verification('v',{name:'V',verifier:'check',onSuccess:'l',onFailure:'repair'}),action('repair',{name:'repair',action:'save',next:'v'}),terminal('done',{name:'done',status:'succeeded'}),terminal('failed',{name:'failed',status:'succeeded'})]}); ``` @@ -1355,14 +1355,14 @@ export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[loop 错误源码(保存为case.workflow.js): ```js -import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl'; +import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl'; export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[node('n',{name:'N',output:{type:'object'},next:'done'}),terminal('done',{name:'done',status:'succeeded'})]}); ``` 修复后的完整源码: ```js -import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl'; +import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl'; export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[node('n',{name:'N',skill:'skills/writer.md',output:{type:'object'},next:'done'}),terminal('done',{name:'done',status:'succeeded'})]}); ``` @@ -1391,14 +1391,14 @@ export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[node 错误源码(保存为case.workflow.js): ```js -import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl'; +import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl'; export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[node('n',{name:'N',skill:'skills/missing.md',output:{type:'object'},next:'done'}),terminal('done',{name:'done',status:'succeeded'})]}); ``` 修复后的完整源码: ```js -import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl'; +import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl'; export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[node('n',{name:'N',skill:'skills/writer.md',output:{type:'object'},next:'done'}),terminal('done',{name:'done',status:'succeeded'})]}); ``` @@ -1427,14 +1427,14 @@ export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[node 错误源码(保存为case.workflow.js): ```js -import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl'; +import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl'; export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[node('n',{name:'N',skill:'skills\\writer.md',output:{type:'object'},next:'done'}),terminal('done',{name:'done',status:'succeeded'})]}); ``` 修复后的完整源码: ```js -import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl'; +import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl'; export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[node('n',{name:'N',skill:'skills/writer.md',output:{type:'object'},next:'done'}),terminal('done',{name:'done',status:'succeeded'})]}); ``` @@ -1463,14 +1463,14 @@ export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[node 错误源码(保存为case.workflow.js): ```js -import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl'; +import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl'; export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[condition('c',{name:'C',branches:[{when:'flag',next:'write'},{when:'true',next:'read'}]}),action('write',{name:'write',action:'save',next:'done',writes:['x']}),node('read',{name:'N',agent:'writer',output:{type:'object'},next:'done',inputs:['x']}),terminal('done',{name:'done',status:'succeeded'})]}); ``` 修复后的完整源码: ```js -import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl'; +import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl'; export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[condition('c',{name:'C',branches:[{when:'flag',next:'write'},{when:'true',next:'write'}]}),action('write',{name:'write',action:'save',next:'read',writes:['x']}),node('read',{name:'N',agent:'writer',output:{type:'object'},next:'done',inputs:['x']}),terminal('done',{name:'done',status:'succeeded'})]}); ``` @@ -1499,14 +1499,14 @@ export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[cond 错误源码(保存为case.workflow.js): ```js -import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl'; +import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl'; export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[node('n',{name:'N',agent:'writer',output:{type:'array'},next:'done'}),terminal('done',{name:'done',status:'succeeded'})]}); ``` 修复后的完整源码: ```js -import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl'; +import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl'; export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[node('n',{name:'N',skill:'skills/writer.md',output:{type:'object'},next:'done'}),terminal('done',{name:'done',status:'succeeded'})]}); ``` @@ -1535,14 +1535,14 @@ export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[node 错误源码(保存为case.workflow.js): ```js -import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl'; +import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl'; export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[node('n',{name:'N',agent:'writer',output:{type:'object'},next:'done',retries:11}),terminal('done',{name:'done',status:'succeeded'})]}); ``` 修复后的完整源码: ```js -import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl'; +import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl'; export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[node('n',{name:'N',skill:'skills/writer.md',output:{type:'object'},next:'done'}),terminal('done',{name:'done',status:'succeeded'})]}); ``` @@ -1571,14 +1571,14 @@ export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[node 错误源码(保存为case.workflow.js): ```js -import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl'; +import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl'; export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[action('a',{name:'a',action:'save',next:'done',writes:['x','x']}),terminal('done',{name:'done',status:'succeeded'})]}); ``` 修复后的完整源码: ```js -import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl'; +import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl'; export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[action('a',{name:'a',action:'save',next:'done',writes:['x']}),terminal('done',{name:'done',status:'succeeded'})]}); ``` @@ -1607,14 +1607,14 @@ export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[acti 错误源码(保存为case.workflow.js): ```js -import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl'; +import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl'; export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[node('n',{name:'N',skill:'https://skills.example.test/style.md',integrity:'sha256-GVdESIiHGUAdgUwF8wkh3HmX5deMlNBOUtZXJWVTaW4=',output:{type:'object'},next:'done'}),terminal('done',{name:'done',status:'succeeded'})]}); ``` 修复后的完整源码: ```js -import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl'; +import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl'; export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[node('n',{name:'N',skill:'https://skills.example.test/style.md',integrity:'sha256-GVdESIiHGUAdgUwF8wkh3HmX5deMlNBOUtZXJWVTaW4=',output:{type:'object'},next:'done'}),terminal('done',{name:'done',status:'succeeded'})]}); ``` @@ -1647,14 +1647,14 @@ export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[node 错误源码(保存为case.workflow.js): ```js -import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl'; +import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl'; export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[node('n',{name:'N',skill:'https://skills.example.test/style.md',integrity:'',output:{type:'object'},next:'done'}),terminal('done',{name:'done',status:'succeeded'})]}); ``` 修复后的完整源码: ```js -import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl'; +import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl'; export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[node('n',{name:'N',skill:'https://skills.example.test/style.md',integrity:'sha256-GVdESIiHGUAdgUwF8wkh3HmX5deMlNBOUtZXJWVTaW4=',output:{type:'object'},next:'done'}),terminal('done',{name:'done',status:'succeeded'})]}); ``` @@ -1691,14 +1691,14 @@ export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[node 错误源码(保存为case.workflow.js): ```js -import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl'; +import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl'; export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[node('n',{name:'N',skill:'https://skills.example.test/style.md',output:{type:'object'},next:'done'}),terminal('done',{name:'done',status:'succeeded'})]}); ``` 修复后的完整源码: ```js -import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl'; +import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl'; export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[node('n',{name:'N',skill:'https://skills.example.test/style.md',integrity:'sha256-GVdESIiHGUAdgUwF8wkh3HmX5deMlNBOUtZXJWVTaW4=',output:{type:'object'},next:'done'}),terminal('done',{name:'done',status:'succeeded'})]}); ``` @@ -1737,14 +1737,14 @@ export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[node 错误源码(保存为case.workflow.js): ```js -import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl'; +import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl'; export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[human('h',{name:'H',onApprove:'done',onReject:'repair'}),action('repair',{name:'repair',action:'save',next:'done'}),terminal('done',{name:'done',status:'succeeded'})]}); ``` 修复后的完整源码: ```js -import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl'; +import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl'; export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[human('h',{name:'H',onApprove:'done',onReject:'repair'}),action('repair',{name:'repair',action:'save',next:'h'}),terminal('done',{name:'done',status:'succeeded'})]}); ``` @@ -1773,14 +1773,14 @@ export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[huma 错误源码(保存为case.workflow.js): ```js -import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl'; +import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl'; export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[human('h',{name:'H',onApprove:'done',onReject:'repair'}),condition('repair',{name:'Repair',branches:[{when:'true',next:'h'}]}),terminal('done',{name:'done',status:'succeeded'})]}); ``` 修复后的完整源码: ```js -import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl'; +import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl'; export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[human('h',{name:'H',onApprove:'done',onReject:'repair'}),action('repair',{name:'repair',action:'save',next:'h'}),terminal('done',{name:'done',status:'succeeded'})]}); ``` @@ -1809,14 +1809,14 @@ export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[huma 错误源码(保存为case.workflow.js): ```js -import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl'; +import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl'; export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[terminal('done',{name:'Done',status:'ok'})]}); ``` 修复后的完整源码: ```js -import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl'; +import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl'; export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[terminal('done',{name:'done',status:'succeeded'})]}); ``` @@ -1847,14 +1847,14 @@ export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[term 错误源码(保存为case.workflow.js): ```js -import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl'; +import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl'; export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[action('a',{name:'a',action:'save',next:'a'})]}); ``` 修复后的完整源码: ```js -import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl'; +import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl'; export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[action('a',{name:'a',action:'save',next:'done'}),terminal('done',{name:'done',status:'succeeded'})]}); ``` @@ -1883,14 +1883,14 @@ export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[acti 错误源码(保存为case.workflow.js): ```js -import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl'; +import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl'; export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[action('a-0',{name:'a-0',action:'save',next:'a0'}),action('a0',{name:'a0',action:'save',next:'done'}),terminal('done',{name:'done',status:'succeeded'})]}); ``` 修复后的完整源码: ```js -import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex/flowkit/dsl'; +import {defineWorkflow,node,action,verification,parallel,condition,loop,human,terminal} from '@devcodex-labs/flowkit/dsl'; export default defineWorkflow({id:'demo',version:'1.0.0',name:'Demo',nodes:[action('a-0',{name:'a-0',action:'save',next:'b0'}),action('b0',{name:'b0',action:'save',next:'done'}),terminal('done',{name:'done',status:'succeeded'})]}); ``` diff --git a/website/content/troubleshooting/index.mdx b/website/content/troubleshooting/index.mdx index c9bd4ca..0ecb263 100644 --- a/website/content/troubleshooting/index.mdx +++ b/website/content/troubleshooting/index.mdx @@ -19,7 +19,7 @@ ## 最小诊断步骤 -在消费者目录执行`node --version`和`npm ls @devcodex/flowkit`,记录实际版本。运行compile,保留完整诊断和退出码;若无error,确认compiled/mmd存在,再运行check。最后运行宿主,记录result或原始异常的code/reasons/cause是否存在。 +在消费者目录执行`node --version`和`npm ls @devcodex-labs/flowkit`,记录实际版本。运行compile,保留完整诊断和退出码;若无error,确认compiled/mmd存在,再运行check。最后运行宿主,记录result或原始异常的code/reasons/cause是否存在。 直接SDK中compile/check返回诊断,run编译失败会拒绝并附带phase:compile和diagnostics;调用参数、文件I/O与业务异常不保证具有FK代码。先保留原错误类型,避免统一包装丢失定位信息。 @@ -43,3 +43,9 @@ Node/npm版本与操作系统: ``` 在[GitHub Issues](https://github.com/devcodex-labs/flowkit/issues)提交可复现信息。删除模型密钥、凭据、真实用户数据和不必要的业务内容;可以用固定响应替代外部服务,保留同样返回形状。不要只贴截图或一行“运行失败”。贡献过程见[参与贡献](/community/contributing)。 + +## 私有 Registry 与图谱集成排错 + +安装返回 401/403/404 时,先检查 `@devcodex-labs` Registry、PAT (classic) 的 `read:packages`、SSO 授权与包的读取权限,不要自动改用公共 npm 或换回旧包名。 + +Graph 适配器的 `FK_CG_BINDING_MISSING` 表示宿主没有注册动作,`FK_CG_NOT_APPLICABLE` 表示环境事实缺失/不匹配,`FK_CG_DEPENDENCIES_INCOMPLETE` 表示解析不完整。原始 `CG_*` GraphError(如权限拒绝)由 SDK 抛出,不属于 FlowKit 已有的 61 个编译/运行错误码。参见[能力图谱示例](/examples/capability-graph)。 diff --git a/website/coverage.json b/website/coverage.json index ada188a..90970a7 100644 --- a/website/coverage.json +++ b/website/coverage.json @@ -6,7 +6,7 @@ "file": "index.mdx", "group": "开始使用", "status": "drafted", - "scope": "定位、版本、开源和三步编排;首页按钮/图", + "scope": "私有产品定位、公开文档、未来托管服务方向和工作流介绍", "validation": "RT01/07,V-SITE" }, { @@ -22,11 +22,11 @@ { "id": "P03", "route": "/guide/installation", - "title": "安装与环境", + "title": "内部安装与环境", "file": "guide/installation.mdx", "group": "开始使用", "status": "drafted", - "scope": "精确安装、ESM、CLI、实际包版本", + "scope": "仅维护者的私有包安装、ESM、CLI 和内部部署权限", "validation": "RT01,E01" }, { @@ -36,7 +36,7 @@ "file": "guide/quick-start.mdx", "group": "开始使用", "status": "drafted", - "scope": "完整两文件、编译/检查/输出;README 同源", + "scope": "内部维护者的完整两文件工作流编译、检查和运行", "validation": "RT01,E01" }, { @@ -414,7 +414,7 @@ "route": "/community/contributing", "title": "参与贡献", "file": "community/contributing.mdx", - "group": "开源项目", + "group": "项目维护", "status": "drafted", "scope": "实际scripts、本地docs修改和示例更新、PR说明", "validation": "V-MAINT,V-CONTENT" @@ -424,7 +424,7 @@ "route": "/community/compatibility", "title": "兼容与支持范围", "file": "community/compatibility.mdx", - "group": "开源项目", + "group": "项目维护", "status": "drafted", "scope": "SDK与站点环境分别说明,平台证据不扩大", "validation": "V-TYPES,V-MAINT" @@ -434,7 +434,7 @@ "route": "/community/changelog", "title": "v1.0.0 发布记录", "file": "community/changelog.mdx", - "group": "开源项目", + "group": "项目维护", "status": "drafted", "scope": "与根CHANGELOG逐项对齐,仅首个正式发行", "validation": "V-RELEASE,V-CONTENT" @@ -442,11 +442,11 @@ { "id": "P45", "route": "/community/license", - "title": "开源许可证", + "title": "授权与使用", "file": "community/license.mdx", - "group": "开源项目", + "group": "项目维护", "status": "drafted", - "scope": "MIT、2026 devcodex-labs与根LICENSE/包声明一致", + "scope": "专有授权、包内 LICENSE、第三方依赖与访问权限", "validation": "V-RELEASE" }, { @@ -456,7 +456,27 @@ "file": "maintainers/releasing.mdx", "group": "发布维护", "status": "drafted", - "scope": "候选→公开包消费→站点、确切commit、失败与回退", + "scope": "候选→GitHub Packages 私有包消费→文档站、确切 Commit 与失败恢复", "validation": "V-RELEASE,V-MAINT" + }, + { + "id": "P47", + "route": "/guide/capability-provider", + "title": "向 capability-graph 声明 FlowKit 能力", + "file": "guide/capability-provider.mdx", + "group": "使用指南", + "status": "drafted", + "scope": "Provider Schema、能力目录、依赖与能力 ID 的声明边界", + "validation": "E13,G02-G08" + }, + { + "id": "P48", + "route": "/examples/capability-graph", + "title": "capability-graph 宿主消费示例", + "file": "examples/capability-graph.mdx", + "group": "场景示例", + "status": "drafted", + "scope": "Graph 查询、宿主显式绑定、授权/适用性/依赖失败反例", + "validation": "E13,G01-G15" } ] diff --git a/website/navigation.ts b/website/navigation.ts index 41c1458..abbc890 100644 --- a/website/navigation.ts +++ b/website/navigation.ts @@ -5,7 +5,7 @@ const active = pages.filter(page => existsSync(fileURLToPath(new URL(`./content/ const groups = [...new Set(active.map(page => page.group))]; export const sidebar = { '/': groups.map(group => ({ text: group, items: active.filter(page => page.group === group && page.id !== 'P01').map(page => ({ text: page.title, link: page.route })) })).filter(group => group.items.length) }; export const nav = [ - { text: '开始使用', link: '/guide/quick-start', activeMatch: '^/guide/(introduction|installation|quick-start|javascript-typescript)' }, + { text: '了解 FlowKit', link: '/guide/introduction', activeMatch: '^/guide/(introduction|installation|quick-start|javascript-typescript)' }, { text: '使用指南', link: '/guide/workflow-model', activeMatch: '^/guide/(?!introduction|installation|quick-start|javascript-typescript)' }, { text: '参考', link: '/dsl/index', activeMatch: '^/(dsl|reference)/' }, { text: '示例', link: '/examples/index', activeMatch: '^/examples/' }, diff --git a/website/rspress.config.ts b/website/rspress.config.ts index 5df50eb..592e026 100644 --- a/website/rspress.config.ts +++ b/website/rspress.config.ts @@ -2,7 +2,7 @@ import { defineConfig } from '@rspress/core'; import { pluginSitemap } from '@rspress/plugin-sitemap'; import { existsSync } from 'node:fs'; import { fileURLToPath } from 'node:url'; -import { base, repository, siteUrl, version, publicUrl } from './site'; +import { base, siteUrl, version, publicUrl } from './site'; import { nav, sidebar } from './navigation'; import pages from './coverage.json'; import { alignSearchHeadingBoundaries } from './search-index.mjs'; @@ -22,8 +22,6 @@ export default defineConfig({ plugins: [sitemap, { name: 'flowkit-search-heading-boundaries', modifySearchIndexData: alignSearchHeadingBoundaries }], themeConfig: { nav, sidebar, - socialLinks: [{ icon: 'github', mode: 'link', content: repository }], - editLink: { docRepoBaseUrl: `${repository}/edit/main/website/content` }, - footer: { message: `FlowKit v${version} · MIT · Copyright © 2026 devcodex-labs` }, + footer: { message: `FlowKit v${version} · 专有授权 · Copyright © 2026 devcodex-labs` }, }, }); diff --git a/website/scripts/check-content.mjs b/website/scripts/check-content.mjs index af30dd7..7393119 100644 --- a/website/scripts/check-content.mjs +++ b/website/scripts/check-content.mjs @@ -6,8 +6,9 @@ import { expectedReadme } from '../../scripts/docs/sync-readme.mjs'; const website = fileURLToPath(new URL('../', import.meta.url)); const root = path.dirname(website); export function checkCoverage(pages) { - assert.deepEqual(pages.map(page => page.id), Array.from({ length: 46 }, (_, index) => `P${String(index + 1).padStart(2, '0')}`)); - for (const field of ['route', 'file']) assert.equal(new Set(pages.map(page => page[field])).size, 46, `Duplicate ${field}`); + assert.ok(pages.length > 0, 'No documented pages'); + assert.deepEqual(pages.map(page => page.id), Array.from({ length: pages.length }, (_, index) => `P${String(index + 1).padStart(2, '0')}`)); + for (const field of ['route', 'file']) assert.equal(new Set(pages.map(page => page[field])).size, pages.length, `Duplicate ${field}`); for (const page of pages) assert.ok(page.title && page.scope && page.validation, `Missing page responsibility: ${page.id}`); } export function assertNoPrivateContent(text, name) { assert.ok(!/\.devcodex|\.task-lifecycle|TL-\d{8}-\d+|[\uFFFD]/.test(text), `Private or corrupt content: ${name}`); } @@ -15,9 +16,9 @@ export function assertAnchors(body, names, label) { const actual = [...body.matchAll(/<\/a>|\{#([^}]+)\}/g)].map(match => match[1] ?? match[2]); for (const name of names) assert.equal(actual.filter(value => value === name).length, 1, `Missing/duplicate ${label} ${name}`); } -export function assertVersion(pkg) { assert.equal(pkg.version, '1.0.0'); assert.equal(pkg.license, 'MIT'); assert.equal(pkg.private, false); } +export function assertVersion(pkg) { assert.match(pkg.version, /^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?$/); assert.equal(pkg.name, '@devcodex-labs/flowkit'); assert.equal(pkg.license, 'SEE LICENSE IN LICENSE'); assert.equal(pkg.private, false); assert.equal(pkg.publishConfig?.registry, 'https://npm.pkg.github.com/'); } export function phaseLimit(args) { - if (!args.length) return 46; + if (!args.length) return Number.POSITIVE_INFINITY; assert.equal(args.length, 2); assert.equal(args[0], '--phase'); assert.ok(['B1', 'B2'].includes(args[1]) && !process.env.CI, 'Partial checks are local only'); return args[1] === 'B1' ? 4 : 31; @@ -37,7 +38,7 @@ export async function checkContent(args = []) { assert.ok(page.id === 'P01' || text.includes(`# ${page.title}`), `Missing title: ${page.file}`); for (const match of text.matchAll(/```\w+\s+file="([^"]+)"/g)) await access(path.resolve(path.dirname(filename), match[1])); } - if (limit === 46) { + if (limit === Number.POSITIVE_INFINITY) { const changelog = (await readFile(path.join(root, 'CHANGELOG.md'), 'utf8')) .replace(/^# 更新记录\r?\n/, '# v1.0.0 发布记录\n') .replace('(LICENSE)', '(https://github.com/devcodex-labs/flowkit/blob/main/LICENSE)'); @@ -65,6 +66,6 @@ export async function checkContent(args = []) { } } } - return { pages: limit, full: limit === 46, passed: true }; + return { pages: pages.slice(0, limit).length, full: limit === Number.POSITIVE_INFINITY, passed: true }; } if (process.argv[1] === fileURLToPath(import.meta.url)) console.log(JSON.stringify(await checkContent(process.argv.slice(2)))); diff --git a/website/scripts/check-rendered.mjs b/website/scripts/check-rendered.mjs index bcfddd8..f51c9b0 100644 --- a/website/scripts/check-rendered.mjs +++ b/website/scripts/check-rendered.mjs @@ -57,6 +57,6 @@ export async function checkRendered(args = []) { } for (const [file, info] of inspected) for (const href of [...info.links, ...info.assets]) checkLink(href, file, inventory, idsByFile); assert.ok(inspected.get('404.html')?.text.includes('页面未找到'), 'Missing Chinese 404'); - return { pages: pages.length, html: inspected.size, full: limit === 46, passed: true }; + return { pages: pages.length, html: inspected.size, full: limit === Number.POSITIVE_INFINITY, passed: true }; } if (process.argv[1] === fileURLToPath(import.meta.url)) console.log(JSON.stringify(await checkRendered(process.argv.slice(2)))); diff --git a/website/scripts/checks.test.mjs b/website/scripts/checks.test.mjs index fc440c2..c0e32ef 100644 --- a/website/scripts/checks.test.mjs +++ b/website/scripts/checks.test.mjs @@ -44,8 +44,8 @@ test('missing or duplicate API anchors and incorrect release identity fail', () assertAnchors('## run:执行工作流 {#run}', ['run'], 'SDK'); assert.throws(() => assertAnchors('', ['run', 'compile'], 'SDK'), /compile/); assert.throws(() => assertAnchors('', ['run'], 'SDK'), /duplicate/); - assertVersion({ version: '1.0.0', license: 'MIT', private: false }); - assert.throws(() => assertVersion({ version: '0.1.0', license: 'MIT', private: false })); + assertVersion({ name: '@devcodex-labs/flowkit', version: '1.0.0', license: 'SEE LICENSE IN LICENSE', private: false, publishConfig: { registry: 'https://npm.pkg.github.com/' } }); + assert.throws(() => assertVersion({ name: '@devcodex-labs/flowkit', version: 'not-semver', license: 'SEE LICENSE IN LICENSE', private: false, publishConfig: { registry: 'https://npm.pkg.github.com/' } })); }); test('exact heading search hits keep their correct anchor without dropping prose matches', () => { const header = { type: 'header', title: 'SDK API', header: 'SDK API > compileSource:编译文本', link: '/reference/sdk#compileSource' };