diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index bf56b36..05127ae 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -187,7 +187,24 @@ jobs: - name: Run tolerant same-host observability regression gate run: npm run bench:observability:ci + - name: Pack the minimum core version supported by OTel + id: minimum-otel-core + run: | + set -euo pipefail + range=$(jq -r '.dependencies["@open-multi-agent/core"]' packages/otel/package.json) + if [[ ! "$range" =~ ^\^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then + echo "::error::expected an exact caret range for the OTel core dependency; got $range" + exit 1 + fi + minimum="${range#^}" + filename=$(npm pack "@open-multi-agent/core@$minimum" --pack-destination "$RUNNER_TEMP" --json | jq -er '.[0].filename') + tarball="$RUNNER_TEMP/$filename" + test -f "$tarball" + echo "tarball=$tarball" >> "$GITHUB_OUTPUT" + - name: Install real core and OTel tarballs in clean consumers + env: + OMA_OBSERVABILITY_MIN_CORE_TARBALL: ${{ steps.minimum-otel-core.outputs.tarball }} run: npm run test:observability-pack scaffold-e2e: diff --git a/.github/workflows/release-smoke.yml b/.github/workflows/release-smoke.yml index 898f288..70754d5 100644 --- a/.github/workflows/release-smoke.yml +++ b/.github/workflows/release-smoke.yml @@ -3,7 +3,8 @@ name: Release smoke # After a GitHub Release is published, prove that the packages we just pushed to # npm actually work from a *user's* point of view: `npx create-oma-app@latest` # scaffolds the recommended PR-review starter, the @open-multi-agent/core it -# pins installs from npm, and the demo reaches the missing-key gate. +# pins installs from npm, and the deterministic no-key demo produces all three +# disclosed report formats without making a model request. # # This is a POST-publish alarm, not a gate. The release is already out, so a red # run here means "the published bytes are broken, cut a fix" — it does not block @@ -25,13 +26,14 @@ jobs: - uses: actions/setup-node@v4 with: node-version: 20 - - name: Scaffold from the published npm package and reach the run gate + - name: Scaffold from the published npm package and run the no-key demo env: # The tag is the core version (e.g. v1.11.0); create-oma-app has its # own version, so we resolve the scaffolder via @latest and verify it # pins THIS release's core below. RELEASE_TAG: ${{ github.event.release.tag_name }} - # Force the missing-key gate even if the runner ever grows these. + # Prove that the deterministic demo does not depend on ambient model + # configuration, even if the runner ever grows these variables. OPENAI_API_KEY: '' OMA_MODEL: '' OPENAI_BASE_URL: '' @@ -76,16 +78,33 @@ jobs: echo "scaffolded the PR-review starter with create-oma-app@$(npm view create-oma-app version) → installed core@$want" - # No API key on purpose: the demo must exit non-zero at the env gate. - # Reaching that message proves core resolved from npm, imported, and - # ran under tsx — a broken import or syntax error would fail elsewhere. + # No API key on purpose: scripted model responses must drive the real + # scheduler and report generation without making a model request. set +e out=$( cd "$project" && npm run demo 2>&1 ) code=$? set -e echo "$out" - if [ "$code" -eq 0 ] || ! printf '%s' "$out" | grep -q "Missing OPENAI_API_KEY"; then - echo "::error::expected a non-zero exit with 'Missing OPENAI_API_KEY'; got exit $code" + if [ "$code" -ne 0 ]; then + echo "::error::expected the no-key demo to succeed; got exit $code" exit 1 fi - echo "✓ create-oma-app@latest scaffolds the PR-review starter, installs core from npm, and reaches the run gate" + grep -q "Simulated model responses" <<<"$out" + grep -q "demo-fixture" <<<"$out" + + if [ ! -d "$project/reports" ]; then + echo "::error::the no-key demo did not create its reports directory" + exit 1 + fi + markdown=$(find "$project/reports" -maxdepth 1 -type f -name '*.md' -print -quit) + json=$(find "$project/reports" -maxdepth 1 -type f -name '*.json' -print -quit) + dashboard=$(find "$project/reports" -maxdepth 1 -type f -name '*.html' -print -quit) + if [ -z "$markdown" ] || [ -z "$json" ] || [ -z "$dashboard" ]; then + echo "::error::the no-key demo did not produce Markdown, JSON, and HTML reports" + exit 1 + fi + grep -q "Demo mode" "$markdown" + grep -q '"mode": "demo"' "$json" + grep -q "Simulated model responses" "$dashboard" + + echo "✓ create-oma-app@latest installs core@$want and runs the disclosed no-key demo from npm" diff --git a/README.md b/README.md index 984ae5f..4dd1a62 100644 --- a/README.md +++ b/README.md @@ -48,7 +48,7 @@ `open-multi-agent` is an AI agent orchestration framework for TypeScript backends that drops into any Node.js app. It turns one goal into an inspectable task DAG, runs it across a team of agents, and synthesizes the result, all inside your own environment. Run it local, offline, or air-gapped, mixing cloud and local models on one team. -Use OMA when the plan should adapt at runtime, but execution still needs deterministic scheduling, explicit controls, and a trace you can inspect or replay. +Use OMA for **dynamic workflows**: the coordinator turns a goal into a task DAG at runtime, while deterministic scheduling keeps execution inspectable, controllable, and replayable. ## Why OMA diff --git a/README_zh.md b/README_zh.md index 58279ac..79a8600 100644 --- a/README_zh.md +++ b/README_zh.md @@ -48,7 +48,7 @@ `open-multi-agent` 是面向 TypeScript 后端的多智能体编排框架,可直接嵌入任意 Node.js 应用。它把一个目标拆成可审查的任务 DAG,交给多个 Agent 执行,再合成最终结果,全程在你自己的环境中运行。可本地、断网或气隙部署,云端与本地模型同队混用。 -当任务计划需要在运行时动态生成,但执行仍需确定性调度、明确管控和可回放轨迹时,选择 OMA。 +OMA 适合**动态工作流(dynamic workflows)**:Coordinator 在运行时把目标拆成任务 DAG,确定性调度让执行保持可审查、可管控、可回放。 ## 为什么选择 OMA diff --git a/package-lock.json b/package-lock.json index 0f2e139..5cdb3f5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6560,7 +6560,7 @@ }, "packages/core": { "name": "@open-multi-agent/core", - "version": "1.11.0", + "version": "1.12.0", "license": "MIT", "dependencies": { "@anthropic-ai/sdk": "^0.52.0", @@ -6613,7 +6613,7 @@ } }, "packages/create-oma-app": { - "version": "0.4.0", + "version": "0.5.0", "license": "MIT", "bin": { "create-oma-app": "dist/index.js" diff --git a/packages/core/README.md b/packages/core/README.md index b33726e..1c4dda1 100644 --- a/packages/core/README.md +++ b/packages/core/README.md @@ -46,7 +46,7 @@
-`@open-multi-agent/core` is the OMA orchestration runtime for TypeScript backends. Give it one agent, an explicit task graph, or a goal that the coordinator can decompose at runtime. +`@open-multi-agent/core` is the OMA orchestration runtime for TypeScript backends. Give it one agent, an explicit task graph, or a **dynamic workflow** that the coordinator generates from a goal at runtime. The runtime schedules dependencies, runs independent work in parallel, shares context across agents, and returns an inspectable result. For product positioning and known users, see the [project overview](https://github.com/open-multi-agent/open-multi-agent#readme). diff --git a/packages/core/README_zh.md b/packages/core/README_zh.md index a91f99d..36ba70c 100644 --- a/packages/core/README_zh.md +++ b/packages/core/README_zh.md @@ -46,7 +46,7 @@
-`@open-multi-agent/core` 是面向 TypeScript 后端的 OMA 编排运行时。你可以交给它一个 Agent、一张显式任务图,或一个由 Coordinator 在运行时拆解的目标。 +`@open-multi-agent/core` 是面向 TypeScript 后端的 OMA 编排运行时。你可以交给它一个 Agent、一张显式任务图,或一条由 Coordinator 在运行时从目标生成的**动态工作流(dynamic workflow)**。 运行时负责依赖调度、并行执行、Agent 间上下文共享和可审查结果输出。产品定位与已知用户见[项目首页](https://github.com/open-multi-agent/open-multi-agent/blob/main/README_zh.md)。 diff --git a/packages/core/package.json b/packages/core/package.json index 8f00c86..7252b97 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@open-multi-agent/core", - "version": "1.11.0", + "version": "1.12.0", "description": "TypeScript multi-agent framework: one runTeam() call from goal to result. Auto task decomposition and parallel execution for multi-step LLM jobs. Deploys anywhere Node.js runs.", "files": [ "dist", diff --git a/packages/create-oma-app/package.json b/packages/create-oma-app/package.json index af36ccc..5463bfc 100644 --- a/packages/create-oma-app/package.json +++ b/packages/create-oma-app/package.json @@ -1,6 +1,6 @@ { "name": "create-oma-app", - "version": "0.4.0", + "version": "0.5.0", "description": "Scaffold PR review, security analysis, and multi-agent DAG starters on @open-multi-agent/core.", "type": "module", "bin": { diff --git a/packages/create-oma-app/template/package.json b/packages/create-oma-app/template/package.json index 029ca4c..977fbfb 100644 --- a/packages/create-oma-app/template/package.json +++ b/packages/create-oma-app/template/package.json @@ -7,7 +7,7 @@ "dev": "tsx src/index.ts" }, "dependencies": { - "@open-multi-agent/core": "1.11.0" + "@open-multi-agent/core": "1.12.0" }, "devDependencies": { "tsx": "^4.21.0" diff --git a/packages/create-oma-app/templates/demo/package.json b/packages/create-oma-app/templates/demo/package.json index d0450d2..1e7d953 100644 --- a/packages/create-oma-app/templates/demo/package.json +++ b/packages/create-oma-app/templates/demo/package.json @@ -8,7 +8,7 @@ "demo": "tsx src/index.ts --demo" }, "dependencies": { - "@open-multi-agent/core": "1.11.0" + "@open-multi-agent/core": "1.12.0" }, "devDependencies": { "tsx": "^4.21.0" diff --git a/packages/create-oma-app/templates/pr-review/package.json b/packages/create-oma-app/templates/pr-review/package.json index b29bdfa..c7fef60 100644 --- a/packages/create-oma-app/templates/pr-review/package.json +++ b/packages/create-oma-app/templates/pr-review/package.json @@ -8,7 +8,7 @@ "demo": "tsx src/index.ts --demo" }, "dependencies": { - "@open-multi-agent/core": "1.11.0", + "@open-multi-agent/core": "1.12.0", "zod": "^3.23.0" }, "devDependencies": { diff --git a/packages/create-oma-app/templates/security/package.json b/packages/create-oma-app/templates/security/package.json index b29bdfa..c7fef60 100644 --- a/packages/create-oma-app/templates/security/package.json +++ b/packages/create-oma-app/templates/security/package.json @@ -8,7 +8,7 @@ "demo": "tsx src/index.ts --demo" }, "dependencies": { - "@open-multi-agent/core": "1.11.0", + "@open-multi-agent/core": "1.12.0", "zod": "^3.23.0" }, "devDependencies": {