This is an automated email from the ASF dual-hosted git repository.

jason810496 pushed a commit to branch v3-4-test
in repository https://gitbox.apache.org/repos/asf/airflow.git


The following commit(s) were added to refs/heads/v3-4-test by this push:
     new 23830fd8fe8 [v3-4-test] Rename TypeScript SDK npm package to 
@apache-airflow/ts-sdk (#75959) (#76293)
23830fd8fe8 is described below

commit 23830fd8fe8635372c6dc7cb5a6a5ac719733bf4
Author: github-actions[bot] 
<41898282+github-actions[bot]@users.noreply.github.com>
AuthorDate: Mon Nov 2 20:16:35 2026 +0800

    [v3-4-test] Rename TypeScript SDK npm package to @apache-airflow/ts-sdk 
(#75959) (#76293)
    
    * Rename TypeScript SDK npm package to @apache-airflow/ts-sdk
    
    * Take the TypeScript SDK release tarball name from npm pack
    
    Building the tarball name by hand duplicates npm's naming rules for scoped
    packages and can silently drift from what npm actually writes, so the
    release job now uses the filename npm reports.
    
    The example project is not published, so its name does not need to follow
    the scoped package rename.
    
    ---------
    (cherry picked from commit 336cd40a8637ee65b92c6a2e82237f96601f0342)
    
    Co-authored-by: Jason(Zhe-You) Liu 
<[email protected]>
---
 .github/workflows/ts-sdk-release.yml               | 15 ++++++----
 .../language-sdks/typescript.rst                   | 24 +++++++--------
 .../tests/test_release_management_commands.py      |  2 +-
 kubernetes-tests/lang_sdk/ts_example/package.json  |  2 +-
 .../lang_sdk/ts_example/pnpm-lock.yaml             | 34 +++++++++++-----------
 kubernetes-tests/lang_sdk/ts_example/src/main.ts   |  2 +-
 .../coordinators/node/test_bundle_reader.py        |  2 +-
 ts-sdk/DEVELOPMENT.md                              |  8 ++---
 ts-sdk/README.md                                   |  4 +--
 ts-sdk/adr/0001-mixed-lang-dag-interface.md        |  2 +-
 ts-sdk/adr/0002-native-dag-interface.md            |  2 +-
 ts-sdk/docs/index.md                               |  4 +--
 ts-sdk/example/package.json                        |  2 +-
 ts-sdk/example/src/ai-approval.ts                  |  6 ++--
 ts-sdk/example/src/dynamic.ts                      |  2 +-
 ts-sdk/example/src/hitl.ts                         |  6 ++--
 ts-sdk/example/src/main.ts                         |  2 +-
 ts-sdk/example/src/native.ts                       |  2 +-
 ts-sdk/example/src/taskflow.ts                     |  2 +-
 ts-sdk/package.json                                |  3 +-
 ts-sdk/pnpm-lock.yaml                              | 34 +++++++++++-----------
 ts-sdk/scripts/validate-release-inputs.mjs         |  7 +----
 ts-sdk/scripts/validate-release-inputs.test.mjs    |  6 ++--
 ts-sdk/scripts/verify-package.test.mjs             | 10 +++----
 ts-sdk/src/coordinator/arg-binding.ts              |  2 +-
 ts-sdk/src/sdk/brand.ts                            |  2 +-
 ts-sdk/src/sdk/client-types.ts                     |  2 +-
 ts-sdk/tests/cli/fixtures/bundle-v1.min.mjs        |  4 +--
 ts-sdk/tests/cli/pack.test.ts                      |  2 +-
 ts-sdk/tests/coordinator/arg-binding.test.ts       |  2 +-
 ts-sdk/tests/hitl/operator.test.ts                 |  2 +-
 ts-sdk/tests/public-api.test.ts                    |  2 +-
 ts-sdk/tests/sdk/bundle.test.ts                    |  2 +-
 ts-sdk/tsconfig.json                               |  6 ++--
 ts-sdk/vitest.config.ts                            |  6 ++--
 35 files changed, 106 insertions(+), 109 deletions(-)

diff --git a/.github/workflows/ts-sdk-release.yml 
b/.github/workflows/ts-sdk-release.yml
index 141e63ee046..ac09fa177b9 100644
--- a/.github/workflows/ts-sdk-release.yml
+++ b/.github/workflows/ts-sdk-release.yml
@@ -49,7 +49,7 @@ jobs:
     runs-on: ubuntu-latest
     outputs:
       artifact_name: ${{ steps.package.outputs.artifact_name }}
-      package_file: ${{ steps.release.outputs.package_file }}
+      package_file: ${{ steps.package.outputs.package_file }}
       sha256: ${{ steps.package.outputs.sha256 }}
       version: ${{ steps.release.outputs.version }}
     steps:
@@ -102,7 +102,7 @@ jobs:
           EXPECTED_VERSION: ${{ steps.release.outputs.version }}
         run: |
           set -euo pipefail
-          test "$(node --print "require('./package.json').name")" = 
"apache-airflow-ts-sdk"
+          test "$(node --print "require('./package.json').name")" = 
"@apache-airflow/ts-sdk"
           test "$(node --print "require('./package.json').version")" = 
"${EXPECTED_VERSION}"
       - name: Confirm release advances the npm dist-tag
         working-directory: ts-sdk
@@ -142,23 +142,26 @@ jobs:
         id: package
         working-directory: ts-sdk
         env:
-          PACKAGE_FILE: ${{ steps.release.outputs.package_file }}
           VERSION: ${{ steps.release.outputs.version }}
         run: |
           set -euo pipefail
           artifact_dir="${RUNNER_TEMP}/ts-sdk-package"
           mkdir -p "${artifact_dir}"
-          npm pack --pack-destination "${artifact_dir}"
-          artifact_path="${artifact_dir}/${PACKAGE_FILE}"
+          # Build explicitly so `npm pack --ignore-scripts` keeps prepack 
output out of the JSON report.
+          pnpm run build
+          package_file="$(npm pack --json --ignore-scripts --pack-destination 
"${artifact_dir}" \
+            | jq --raw-output '.[0].filename')"
+          artifact_path="${artifact_dir}/${package_file}"
           test -f "${artifact_path}"
           test "$(find "${artifact_dir}" -maxdepth 1 -type f -name '*.tgz' | 
wc -l)" -eq 1
           echo "artifact_name=ts-sdk-package-${VERSION}" >> "${GITHUB_OUTPUT}"
+          echo "package_file=${package_file}" >> "${GITHUB_OUTPUT}"
           echo "sha256=$(sha256sum "${artifact_path}" | awk '{print $1}')" >> 
"${GITHUB_OUTPUT}"
       - name: Upload package tarball
         uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 
 # v7.0.2
         with:
           name: ${{ steps.package.outputs.artifact_name }}
-          path: ${{ runner.temp }}/ts-sdk-package/${{ 
steps.release.outputs.package_file }}
+          path: ${{ runner.temp }}/ts-sdk-package/${{ 
steps.package.outputs.package_file }}
           if-no-files-found: error
           retention-days: 7
 
diff --git 
a/airflow-core/docs/authoring-and-scheduling/language-sdks/typescript.rst 
b/airflow-core/docs/authoring-and-scheduling/language-sdks/typescript.rst
index 4b80ea9dce1..1f730af4a84 100644
--- a/airflow-core/docs/authoring-and-scheduling/language-sdks/typescript.rst
+++ b/airflow-core/docs/authoring-and-scheduling/language-sdks/typescript.rst
@@ -32,7 +32,7 @@ Node.js. There are two ways to use it:
 
 Both use the same task API and the same build tool, and one bundle can serve 
both.
 
-The SDK is the ``apache-airflow-ts-sdk`` npm package (ESM-only). It is in 
**beta**, and its API may change.
+The SDK is the ``@apache-airflow/ts-sdk`` npm package (ESM-only). It is in 
**beta**, and its API may change.
 
 .. warning::
 
@@ -64,7 +64,7 @@ Prerequisites
 
   .. code-block:: bash
 
-      npm install apache-airflow-ts-sdk
+      npm install @apache-airflow/ts-sdk
       npm install --save-dev esbuild
 
 .. _typescript-sdk/quick-start:
@@ -79,7 +79,7 @@ Declare a Dag in ``src/main.ts``:
 
 .. code-block:: typescript
 
-    import { Bundle, Dag } from "apache-airflow-ts-sdk";
+    import { Bundle, Dag } from "@apache-airflow/ts-sdk";
 
     const dag = new Dag("ts_hello", { schedule: "@daily", queue: "typescript" 
});
 
@@ -124,7 +124,7 @@ the Dag and gives it its inputs, so the calls you write are 
the dependencies:
 
 .. code-block:: typescript
 
-    import { Dag } from "apache-airflow-ts-sdk";
+    import { Dag } from "@apache-airflow/ts-sdk";
 
     const dag = new Dag("ts_etl");
 
@@ -249,7 +249,7 @@ the code, just as the label sits between them in the graph:
 
 .. code-block:: typescript
 
-    import { Label } from "apache-airflow-ts-sdk";
+    import { Label } from "@apache-airflow/ts-sdk";
 
     checked.before(Label.of("rows found").on(processed), Label.of("no 
rows").on(notified));
     cleaned.after(Label.of("always").on(loaded));      // loaded >> 
Label("always") >> cleaned
@@ -351,7 +351,7 @@ Triggering another Dag
 
 .. code-block:: typescript
 
-    import { triggerDagRun } from "apache-airflow-ts-sdk";
+    import { triggerDagRun } from "@apache-airflow/ts-sdk";
 
     const triggered = dag.task(
       "trigger_downstream",
@@ -416,7 +416,7 @@ on a ``Bundle``:
 
 .. code-block:: typescript
 
-    import { Bundle, getClient, TaskHandler } from "apache-airflow-ts-sdk";
+    import { Bundle, getClient, TaskHandler } from "@apache-airflow/ts-sdk";
 
     export async function buildMessage() {
       const client = getClient();
@@ -587,7 +587,7 @@ for the full concept, including the equivalent Python API.
 
 .. code-block:: typescript
 
-    import { getClient, NEVER_EXPIRE } from "apache-airflow-ts-sdk";
+    import { getClient, NEVER_EXPIRE } from "@apache-airflow/ts-sdk";
 
     export async function runSparkJob() {
       const store = getClient().taskStateStore;
@@ -608,7 +608,7 @@ counted from the time of the write:
 
 * A number retains the key for that many seconds from now; ``retention: 0`` 
expires the key
   immediately.
-* ``NEVER_EXPIRE`` (imported from ``apache-airflow-ts-sdk``) stores the key 
with no expiry, regardless of
+* ``NEVER_EXPIRE`` (imported from ``@apache-airflow/ts-sdk``) stores the key 
with no expiry, regardless of
   the deployment default.
 * When ``retention`` is omitted the runtime reads 
``AIRFLOW__STATE_STORE__DEFAULT_RETENTION_DAYS``,
   which the coordinator sets from ``[state_store] default_retention_days``. A 
value of ``0`` there means the
@@ -687,13 +687,13 @@ XComs are stored as JSON, so a value read with 
``getXCom`` arrives as the matchi
 Human-in-the-loop tasks
 -----------------------
 
-``approval`` and ``hitl``, from ``apache-airflow-ts-sdk/hitl``, make a task 
that waits for a person, as Python's
+``approval`` and ``hitl``, from ``@apache-airflow/ts-sdk/hitl``, make a task 
that waits for a person, as Python's
 ``ApprovalOperator`` and ``HITLOperator`` do. Pass one to ``dag.task`` in 
place of a handler. Options are the
 Python keyword arguments in camelCase:
 
 .. code-block:: typescript
 
-    import { approval } from "apache-airflow-ts-sdk/hitl";
+    import { approval } from "@apache-airflow/ts-sdk/hitl";
 
     const signOff = dag.task(
       "sign_off",
@@ -745,7 +745,7 @@ file, and Airflow refuses to run a bundle whose content was 
changed after it was
   The name must end in ``.min.mjs``.
 
 ``--outdir`` and ``--outfile`` cannot be used together. ``esbuild`` must be 
installed before you build; the
-runtime install of ``apache-airflow-ts-sdk`` does not need it.
+runtime install of ``@apache-airflow/ts-sdk`` does not need it.
 
 The bundle's code is minified, with license banners of bundled dependencies 
kept. The Airflow UI's **Code**
 view shows the file each Dag is declared in, as you wrote it.
diff --git a/dev/breeze/tests/test_release_management_commands.py 
b/dev/breeze/tests/test_release_management_commands.py
index 7eb67b1dde2..4e9dae10338 100644
--- a/dev/breeze/tests/test_release_management_commands.py
+++ b/dev/breeze/tests/test_release_management_commands.py
@@ -323,7 +323,7 @@ def 
test_get_package_version_possibly_from_stable_txt_for_ts_sdk(
     monkeypatch.setattr(global_constants, "AIRFLOW_ROOT_PATH", tmp_path)
     package_json = tmp_path / "ts-sdk" / "package.json"
     package_json.parent.mkdir(parents=True)
-    package_json.write_text('{"name": "apache-airflow-ts-sdk", "version": 
"0.2.0-alpha.1"}\n')
+    package_json.write_text('{"name": "@apache-airflow/ts-sdk", "version": 
"0.2.0-alpha.1"}\n')
     if stable_txt_content is not None:
         stable_txt = tmp_path / "generated" / "_build" / "docs" / "ts-sdk" / 
"stable.txt"
         stable_txt.parent.mkdir(parents=True)
diff --git a/kubernetes-tests/lang_sdk/ts_example/package.json 
b/kubernetes-tests/lang_sdk/ts_example/package.json
index 94290747263..97b7d667a88 100644
--- a/kubernetes-tests/lang_sdk/ts_example/package.json
+++ b/kubernetes-tests/lang_sdk/ts_example/package.json
@@ -10,7 +10,7 @@
     "typecheck": "tsc --noEmit"
   },
   "dependencies": {
-    "apache-airflow-ts-sdk": "file:../../../ts-sdk"
+    "@apache-airflow/ts-sdk": "file:../../../ts-sdk"
   },
   "devDependencies": {
     "@types/node": "^26.1.2",
diff --git a/kubernetes-tests/lang_sdk/ts_example/pnpm-lock.yaml 
b/kubernetes-tests/lang_sdk/ts_example/pnpm-lock.yaml
index c04ba6a8f28..d1db4e89737 100644
--- a/kubernetes-tests/lang_sdk/ts_example/pnpm-lock.yaml
+++ b/kubernetes-tests/lang_sdk/ts_example/pnpm-lock.yaml
@@ -8,7 +8,7 @@ importers:
 
   .:
     dependencies:
-      apache-airflow-ts-sdk:
+      '@apache-airflow/ts-sdk':
         specifier: file:../../../ts-sdk
         version: file:../../../ts-sdk([email protected])
     devDependencies:
@@ -24,6 +24,16 @@ importers:
 
 packages:
 
+  '@apache-airflow/ts-sdk@file:../../../ts-sdk':
+    resolution: {directory: ../../../ts-sdk, type: directory}
+    engines: {node: '>=22'}
+    hasBin: true
+    peerDependencies:
+      esbuild: ^0.28.2
+    peerDependenciesMeta:
+      esbuild:
+        optional: true
+
   '@esbuild/[email protected]':
     resolution: {integrity: 
sha512-XExcO+dvLKvVtNTibSTBej1NCAbaGhWn9Ww1ZPx80qsahhPFe/8jgWP0IchNe0F3HwkU7n8ejhH8bjonqht8mQ==}
     engines: {node: '>=18'}
@@ -187,16 +197,6 @@ packages:
   '@types/[email protected]':
     resolution: {integrity: 
sha512-ldVPDCzj7fsaGZrLB0NuHuTvJcsNasysBAqMolr/cgxrLd1xbqxIr3XJiPnHHJUCxj5sNF1vnRj9aWnrVh5Jcg==}
 
-  apache-airflow-ts-sdk@file:../../../ts-sdk:
-    resolution: {directory: ../../../ts-sdk, type: directory}
-    engines: {node: '>=22'}
-    hasBin: true
-    peerDependencies:
-      esbuild: ^0.28.2
-    peerDependenciesMeta:
-      esbuild:
-        optional: true
-
   [email protected]:
     resolution: {integrity: 
sha512-HKVLS8dvII+xoKW9kmqxbRKrnWEXfJJr/FZhhJmiqIB0e053QNYFqOBouTMO/k5sID4MvCiUCvv8b9M4h32wIA==}
     engines: {node: '>=18'}
@@ -212,6 +212,12 @@ packages:
 
 snapshots:
 
+  '@apache-airflow/ts-sdk@file:../../../ts-sdk([email protected])':
+    dependencies:
+      '@msgpack/msgpack': 3.1.3
+    optionalDependencies:
+      esbuild: 0.28.2
+
   '@esbuild/[email protected]':
     optional: true
 
@@ -296,12 +302,6 @@ snapshots:
     dependencies:
       undici-types: 8.9.0
 
-  apache-airflow-ts-sdk@file:../../../ts-sdk([email protected]):
-    dependencies:
-      '@msgpack/msgpack': 3.1.3
-    optionalDependencies:
-      esbuild: 0.28.2
-
   [email protected]:
     optionalDependencies:
       '@esbuild/aix-ppc64': 0.28.2
diff --git a/kubernetes-tests/lang_sdk/ts_example/src/main.ts 
b/kubernetes-tests/lang_sdk/ts_example/src/main.ts
index 631268b4f31..e96fa1395b7 100644
--- a/kubernetes-tests/lang_sdk/ts_example/src/main.ts
+++ b/kubernetes-tests/lang_sdk/ts_example/src/main.ts
@@ -23,7 +23,7 @@
 // ../dags. The coordinator locates this bundle by dag_id, so only the 
TypeScript tasks
 // are registered here.
 
-import { Bundle, getClient, TaskHandler } from "apache-airflow-ts-sdk";
+import { Bundle, getClient, TaskHandler } from "@apache-airflow/ts-sdk";
 
 const MIXED_LANGUAGE_DAG_ID = "lang_sdk_mixed_language";
 
diff --git a/task-sdk/tests/task_sdk/coordinators/node/test_bundle_reader.py 
b/task-sdk/tests/task_sdk/coordinators/node/test_bundle_reader.py
index 29764941fbb..f0523919bc7 100644
--- a/task-sdk/tests/task_sdk/coordinators/node/test_bundle_reader.py
+++ b/task-sdk/tests/task_sdk/coordinators/node/test_bundle_reader.py
@@ -74,7 +74,7 @@ class TestBundleReader:
         # used by the other tests cannot establish on its own.
         assert read_bundle_source(TYPESCRIPT_V1_FIXTURE, "test_dag") == (
             "/** Handlers for the test Dag. */\n"
-            'import { Bundle, Dag } from "apache-airflow-ts-sdk";\n'
+            'import { Bundle, Dag } from "@apache-airflow/ts-sdk";\n'
             "\n"
             r"const TERMINATOR = /\*\//;"
             "\n"
diff --git a/ts-sdk/DEVELOPMENT.md b/ts-sdk/DEVELOPMENT.md
index dfbc4b78d78..4dbefd5f071 100644
--- a/ts-sdk/DEVELOPMENT.md
+++ b/ts-sdk/DEVELOPMENT.md
@@ -19,7 +19,7 @@
 
 # Developing the Airflow TypeScript SDK
 
-Contributor and release-manager reference for `apache-airflow-ts-sdk`. See
+Contributor and release-manager reference for `@apache-airflow/ts-sdk`. See
 [`README.md`](README.md) for the user-facing package documentation.
 
 ## Building and testing
@@ -122,7 +122,7 @@ so both release paths share a single configuration pinned 
to a single GitHub
 environment:
 
 ```bash
-npm trust github apache-airflow-ts-sdk \
+npm trust github @apache-airflow/ts-sdk \
   --repo apache/airflow \
   --file ts-sdk-release.yml \
   --environment ts-sdk-npm-release \
@@ -130,7 +130,7 @@ npm trust github apache-airflow-ts-sdk \
   --allow-publish
 ```
 
-Confirm it with `npm trust list apache-airflow-ts-sdk`. A second `npm trust
+Confirm it with `npm trust list @apache-airflow/ts-sdk`. A second `npm trust
 github` for the same package is rejected, so replace an outdated configuration
 with `npm trust revoke` first.
 
@@ -172,7 +172,7 @@ until a maintainer reviews and approves it with 2FA. The 
following commands
 require npm 11.15 or later:
 
 ```bash
-npm stage list apache-airflow-ts-sdk
+npm stage list @apache-airflow/ts-sdk
 npm stage view <stage-id>
 npm stage download <stage-id>
 npm stage approve <stage-id>
diff --git a/ts-sdk/README.md b/ts-sdk/README.md
index 490c031bfe6..d51cd212d9b 100644
--- a/ts-sdk/README.md
+++ b/ts-sdk/README.md
@@ -26,7 +26,7 @@ Write Apache Airflow Dags in TypeScript, and run them on 
Node.js.
 ## Installation
 
 ```bash
-npm install [email protected]
+npm install @apache-airflow/[email protected]
 npm install --save-dev esbuild
 ```
 
@@ -35,7 +35,7 @@ npm install --save-dev esbuild
 Declare a Dag in `src/main.ts`:
 
 ```ts
-import { Bundle, Dag } from "apache-airflow-ts-sdk";
+import { Bundle, Dag } from "@apache-airflow/ts-sdk";
 
 const dag = new Dag("ts_hello", { schedule: "@daily", queue: "typescript" });
 
diff --git a/ts-sdk/adr/0001-mixed-lang-dag-interface.md 
b/ts-sdk/adr/0001-mixed-lang-dag-interface.md
index 50a2a4ee325..e5b9cde01c9 100644
--- a/ts-sdk/adr/0001-mixed-lang-dag-interface.md
+++ b/ts-sdk/adr/0001-mixed-lang-dag-interface.md
@@ -57,7 +57,7 @@ in 
[`airflow-core/adr/lang-sdk/0007`](../../airflow-core/adr/lang-sdk/0007-taskf
 ## Example
 
 ```ts
-import { Bundle, TaskHandler, getClient, getContext } from 
"apache-airflow-ts-sdk";
+import { Bundle, TaskHandler, getClient, getContext } from 
"@apache-airflow/ts-sdk";
 
 interface TransformArgs {
   regionCode: string;
diff --git a/ts-sdk/adr/0002-native-dag-interface.md 
b/ts-sdk/adr/0002-native-dag-interface.md
index 67848c2980a..ca3ec03afaf 100644
--- a/ts-sdk/adr/0002-native-dag-interface.md
+++ b/ts-sdk/adr/0002-native-dag-interface.md
@@ -59,7 +59,7 @@ protocol substrate recorded in
 ## Example
 
 ```ts
-import { Bundle, Dag, getClient } from "apache-airflow-ts-sdk";
+import { Bundle, Dag, getClient } from "@apache-airflow/ts-sdk";
 
 const dag = new Dag("ts_etl", { schedule: "@daily", catchup: false, tags: 
["etl"] });
 
diff --git a/ts-sdk/docs/index.md b/ts-sdk/docs/index.md
index 2f46c154cf0..76a80414d99 100644
--- a/ts-sdk/docs/index.md
+++ b/ts-sdk/docs/index.md
@@ -30,14 +30,14 @@ Write Apache Airflow Dags in TypeScript, and run them on 
Node.js.
 Install the beta package from npm, and `esbuild` to build the bundle:
 
 ```bash
-npm install [email protected]
+npm install @apache-airflow/[email protected]
 npm install --save-dev esbuild
 ```
 
 Declare a Dag in `src/main.ts`. Calling a task names its inputs, which is how 
the tasks depend on each other:
 
 ```ts
-import { Bundle, Dag } from "apache-airflow-ts-sdk";
+import { Bundle, Dag } from "@apache-airflow/ts-sdk";
 
 const dag = new Dag("ts_hello", { schedule: "@daily", queue: "typescript" });
 
diff --git a/ts-sdk/example/package.json b/ts-sdk/example/package.json
index 35c74956eab..7468968947b 100644
--- a/ts-sdk/example/package.json
+++ b/ts-sdk/example/package.json
@@ -11,7 +11,7 @@
     "build:ai-approval": "airflow-ts-pack src/ai-approval.ts --outfile 
dist/ai-approval.min.mjs"
   },
   "dependencies": {
-    "apache-airflow-ts-sdk": "file:.."
+    "@apache-airflow/ts-sdk": "file:.."
   },
   "devDependencies": {
     "@types/node": "^26.1.2",
diff --git a/ts-sdk/example/src/ai-approval.ts 
b/ts-sdk/example/src/ai-approval.ts
index 7b925da480d..5410de6c462 100644
--- a/ts-sdk/example/src/ai-approval.ts
+++ b/ts-sdk/example/src/ai-approval.ts
@@ -33,9 +33,9 @@
 //
 //     airflow-ts-pack src/ai-approval.ts --outfile dist/ai-approval.min.mjs
 
-import { Bundle, Dag } from "apache-airflow-ts-sdk";
-import { hitl } from "apache-airflow-ts-sdk/hitl";
-import type { HITLResult } from "apache-airflow-ts-sdk/hitl";
+import { Bundle, Dag } from "@apache-airflow/ts-sdk";
+import { hitl } from "@apache-airflow/ts-sdk/hitl";
+import type { HITLResult } from "@apache-airflow/ts-sdk/hitl";
 
 /** The queue the deployment's `[sdk] queue_to_coordinator` routes to the Node 
coordinator. */
 const QUEUE = "typescript";
diff --git a/ts-sdk/example/src/dynamic.ts b/ts-sdk/example/src/dynamic.ts
index fbb0edba580..7f5fc8169e8 100644
--- a/ts-sdk/example/src/dynamic.ts
+++ b/ts-sdk/example/src/dynamic.ts
@@ -26,7 +26,7 @@
 
 import { existsSync, readFileSync } from "node:fs";
 
-import { Dag } from "apache-airflow-ts-sdk";
+import { Dag } from "@apache-airflow/ts-sdk";
 import { load } from "js-yaml";
 
 interface DagsFile {
diff --git a/ts-sdk/example/src/hitl.ts b/ts-sdk/example/src/hitl.ts
index 8e4bbca5559..3eb117863b7 100644
--- a/ts-sdk/example/src/hitl.ts
+++ b/ts-sdk/example/src/hitl.ts
@@ -28,9 +28,9 @@
 // Actions page in the Airflow UI (or through the REST API), and the task 
resumes in a new process
 // with the answer.
 
-import { Bundle, Dag } from "apache-airflow-ts-sdk";
-import { approval, hitl } from "apache-airflow-ts-sdk/hitl";
-import type { HITLResult } from "apache-airflow-ts-sdk/hitl";
+import { Bundle, Dag } from "@apache-airflow/ts-sdk";
+import { approval, hitl } from "@apache-airflow/ts-sdk/hitl";
+import type { HITLResult } from "@apache-airflow/ts-sdk/hitl";
 
 /** The queue the deployment's `[sdk] queue_to_coordinator` routes to the Node 
coordinator. */
 const QUEUE = "typescript";
diff --git a/ts-sdk/example/src/main.ts b/ts-sdk/example/src/main.ts
index 2aea8ee5875..d3c52b141e4 100644
--- a/ts-sdk/example/src/main.ts
+++ b/ts-sdk/example/src/main.ts
@@ -24,7 +24,7 @@
 // declared in TypeScript outright — graph, schedule and all. `dynamic.ts` 
adds a native Dag for
 // each entry of a YAML file next to the bundle.
 
-import { Bundle, getClient, getContext, NEVER_EXPIRE, TaskHandler } from 
"apache-airflow-ts-sdk";
+import { Bundle, getClient, getContext, NEVER_EXPIRE, TaskHandler } from 
"@apache-airflow/ts-sdk";
 
 import { loadDynamicDags } from "./dynamic.js";
 import { dag as nativeDag } from "./native.js";
diff --git a/ts-sdk/example/src/native.ts b/ts-sdk/example/src/native.ts
index 2c3a19c26d9..a782347a5d1 100644
--- a/ts-sdk/example/src/native.ts
+++ b/ts-sdk/example/src/native.ts
@@ -32,7 +32,7 @@
 // `main.ts` registers this Dag on the same bundle as the mixed-language
 // handlers, so one artifact covers both authoring modes.
 
-import { Dag, getClient, triggerDagRun } from "apache-airflow-ts-sdk";
+import { Dag, getClient, triggerDagRun } from "@apache-airflow/ts-sdk";
 
 /** The regions this example works over. */
 const REGIONS = ["north", "south"] as const;
diff --git a/ts-sdk/example/src/taskflow.ts b/ts-sdk/example/src/taskflow.ts
index 86f7de18039..464b98521a8 100644
--- a/ts-sdk/example/src/taskflow.ts
+++ b/ts-sdk/example/src/taskflow.ts
@@ -28,7 +28,7 @@
 // `buildSummaryMessage` implements a task named `build_message`, exactly as 
the other Dag has, and
 // the two share nothing else.
 
-import { getClient, getContext, withArgNames } from "apache-airflow-ts-sdk";
+import { getClient, getContext, withArgNames } from "@apache-airflow/ts-sdk";
 
 /** What `make_totals` returns on the Python side. */
 export interface Totals {
diff --git a/ts-sdk/package.json b/ts-sdk/package.json
index f6c1dbba742..87286252582 100644
--- a/ts-sdk/package.json
+++ b/ts-sdk/package.json
@@ -1,5 +1,5 @@
 {
-  "name": "apache-airflow-ts-sdk",
+  "name": "@apache-airflow/ts-sdk",
   "version": "1.0.0-beta1",
   "packageManager": "[email protected]",
   "description": "TypeScript Task SDK for Apache Airflow task handlers",
@@ -21,6 +21,7 @@
     "url": "https://github.com/apache/airflow/issues";
   },
   "publishConfig": {
+    "access": "public",
     "tag": "beta"
   },
   "exports": {
diff --git a/ts-sdk/pnpm-lock.yaml b/ts-sdk/pnpm-lock.yaml
index 072408df53c..80bf3783630 100644
--- a/ts-sdk/pnpm-lock.yaml
+++ b/ts-sdk/pnpm-lock.yaml
@@ -48,7 +48,7 @@ importers:
 
   example:
     dependencies:
-      apache-airflow-ts-sdk:
+      '@apache-airflow/ts-sdk':
         specifier: file:..
         version: file:([email protected])
     devDependencies:
@@ -67,6 +67,16 @@ importers:
 
 packages:
 
+  '@apache-airflow/ts-sdk@file:':
+    resolution: {directory: '', type: directory}
+    engines: {node: '>=22'}
+    hasBin: true
+    peerDependencies:
+      esbuild: ^0.28.2
+    peerDependenciesMeta:
+      esbuild:
+        optional: true
+
   '@apidevtools/[email protected]':
     resolution: {integrity: 
sha512-60vepv88RwcJtSHrD6MjIL6Ta3SOYbgfnkHb+ppAVK+o9mXprRtulx7VlRl3lN3bbvysAfCS7WMVfhUYemB0IQ==}
     engines: {node: '>= 16'}
@@ -545,16 +555,6 @@ packages:
   [email protected]:
     resolution: {integrity: 
sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==}
 
-  'apache-airflow-ts-sdk@file:':
-    resolution: {directory: '', type: directory}
-    engines: {node: '>=22'}
-    hasBin: true
-    peerDependencies:
-      esbuild: ^0.28.2
-    peerDependenciesMeta:
-      esbuild:
-        optional: true
-
   [email protected]:
     resolution: {integrity: 
sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
 
@@ -1093,6 +1093,12 @@ packages:
 
 snapshots:
 
+  '@apache-airflow/ts-sdk@file:([email protected])':
+    dependencies:
+      '@msgpack/msgpack': 3.1.3
+    optionalDependencies:
+      esbuild: 0.28.2
+
   '@apidevtools/[email protected]':
     dependencies:
       '@jsdevtools/ono': 7.1.3
@@ -1475,12 +1481,6 @@ snapshots:
       json-schema-traverse: 0.4.1
       uri-js: 4.4.1
 
-  apache-airflow-ts-sdk@file:([email protected]):
-    dependencies:
-      '@msgpack/msgpack': 3.1.3
-    optionalDependencies:
-      esbuild: 0.28.2
-
   [email protected]: {}
 
   [email protected]: {}
diff --git a/ts-sdk/scripts/validate-release-inputs.mjs 
b/ts-sdk/scripts/validate-release-inputs.mjs
index ac3e868ccfb..57d564e66b2 100644
--- a/ts-sdk/scripts/validate-release-inputs.mjs
+++ b/ts-sdk/scripts/validate-release-inputs.mjs
@@ -127,7 +127,6 @@ export function validateReleaseInputs({ releaseTag, npmTag, 
currentDistTagVersio
   return {
     version,
     packageName: PACKAGE_NAME,
-    packageFile: `${PACKAGE_NAME}-${version}.tgz`,
   };
 }
 
@@ -141,11 +140,7 @@ function run() {
   if (outputFile === undefined) {
     throw new Error("GITHUB_OUTPUT is required");
   }
-  appendFileSync(
-    outputFile,
-    `version=${result.version}\npackage_name=${result.packageName}\n` +
-      `package_file=${result.packageFile}\n`,
-  );
+  appendFileSync(outputFile, 
`version=${result.version}\npackage_name=${result.packageName}\n`);
 }
 
 if (process.argv[1] !== undefined && import.meta.url === 
pathToFileURL(process.argv[1]).href) {
diff --git a/ts-sdk/scripts/validate-release-inputs.test.mjs 
b/ts-sdk/scripts/validate-release-inputs.test.mjs
index fa7f2ee4033..315068b609b 100644
--- a/ts-sdk/scripts/validate-release-inputs.test.mjs
+++ b/ts-sdk/scripts/validate-release-inputs.test.mjs
@@ -32,8 +32,7 @@ describe("validateReleaseInputs", () => {
   it("accepts stable and prerelease channels", () => {
     expect(validateReleaseInputs({ releaseTag: "ts-sdk/1.0.0", npmTag: 
"latest" })).toEqual({
       version: "1.0.0",
-      packageName: "apache-airflow-ts-sdk",
-      packageFile: "apache-airflow-ts-sdk-1.0.0.tgz",
+      packageName: "@apache-airflow/ts-sdk",
     });
     expect(
       validateReleaseInputs({ releaseTag: "ts-sdk/1.0.0-beta1", npmTag: "beta" 
}).version,
@@ -124,8 +123,7 @@ describe("validateReleaseInputs", () => {
       );
       expect(result.status, result.stderr).toBe(0);
       expect(readFileSync(outputFile, "utf8")).toBe(
-        "version=1.0.0-beta1\npackage_name=apache-airflow-ts-sdk\n" +
-          "package_file=apache-airflow-ts-sdk-1.0.0-beta1.tgz\n",
+        "version=1.0.0-beta1\npackage_name=@apache-airflow/ts-sdk\n",
       );
     } finally {
       rmSync(tempDirectory, { force: true, recursive: true });
diff --git a/ts-sdk/scripts/verify-package.test.mjs 
b/ts-sdk/scripts/verify-package.test.mjs
index a1cb7b793f5..e74adfd309b 100644
--- a/ts-sdk/scripts/verify-package.test.mjs
+++ b/ts-sdk/scripts/verify-package.test.mjs
@@ -29,7 +29,7 @@ import {
 } from "./verify-package.mjs";
 
 const PACKAGE_JSON = {
-  name: "apache-airflow-ts-sdk",
+  name: "@apache-airflow/ts-sdk",
   exports: {
     ".": { types: "./dist/index.d.ts", import: "./dist/index.js" },
     "./coordinator": {
@@ -103,10 +103,10 @@ describe("isAllowedFile", () => {
 describe("parsePackMetadata", () => {
   it("takes the trailing JSON object after the prepack banner", () => {
     const stdout = [
-      "> [email protected] prepack",
+      "> @apache-airflow/[email protected] prepack",
       "> pnpm run build",
       "",
-      
'{"name":"apache-airflow-ts-sdk","filename":"pkg.tgz","files":[{"path":"LICENSE"}]}',
+      
'{"name":"@apache-airflow/ts-sdk","filename":"pkg.tgz","files":[{"path":"LICENSE"}]}',
       "",
     ].join("\n");
     expect(parsePackMetadata(stdout).filename).toBe("pkg.tgz");
@@ -150,8 +150,8 @@ describe("diffPackagedFiles", () => {
 describe("buildImportScript", () => {
   it("imports every exports subpath before asserting the root entrypoints", () 
=> {
     const script = buildImportScript(PACKAGE_JSON);
-    expect(script).toContain('await import("apache-airflow-ts-sdk");');
-    expect(script).toContain('await 
import("apache-airflow-ts-sdk/coordinator");');
+    expect(script).toContain('await import("@apache-airflow/ts-sdk");');
+    expect(script).toContain('await 
import("@apache-airflow/ts-sdk/coordinator");');
     for (const name of REQUIRED_ROOT_EXPORTS) {
       expect(script).toContain(name);
     }
diff --git a/ts-sdk/src/coordinator/arg-binding.ts 
b/ts-sdk/src/coordinator/arg-binding.ts
index 357932fcd11..7c208fc98eb 100644
--- a/ts-sdk/src/coordinator/arg-binding.ts
+++ b/ts-sdk/src/coordinator/arg-binding.ts
@@ -152,7 +152,7 @@ function checkBindable(binding: TaskArgBinding): void {
   const kind: unknown = (binding as { kind?: unknown }).kind;
   throw new Error(
     `Task argument "${name}" has binding kind ${JSON.stringify(kind)}, which 
this version ` +
-      "of apache-airflow-ts-sdk cannot bind; upgrade it to match this Airflow 
release",
+      "of @apache-airflow/ts-sdk cannot bind; upgrade it to match this Airflow 
release",
   );
 }
 
diff --git a/ts-sdk/src/sdk/brand.ts b/ts-sdk/src/sdk/brand.ts
index 5e09cb978a4..170b139b3e5 100644
--- a/ts-sdk/src/sdk/brand.ts
+++ b/ts-sdk/src/sdk/brand.ts
@@ -40,4 +40,4 @@ export function hasBrand(value: unknown, name: string): 
boolean {
 
 /** Tail shared by the errors reporting a second resolved copy. */
 export const DUPLICATE_COPY_HINT =
-  "comes from a different copy of apache-airflow-ts-sdk; deduplicate the 
dependency so one copy is resolved";
+  "comes from a different copy of @apache-airflow/ts-sdk; deduplicate the 
dependency so one copy is resolved";
diff --git a/ts-sdk/src/sdk/client-types.ts b/ts-sdk/src/sdk/client-types.ts
index 436921d808b..a76a1557c49 100644
--- a/ts-sdk/src/sdk/client-types.ts
+++ b/ts-sdk/src/sdk/client-types.ts
@@ -58,7 +58,7 @@ export interface SetXComOpts {
  * accident (a division by zero, for example) is rejected instead of silently
  * storing a key forever.
  */
-export const NEVER_EXPIRE: unique symbol = 
Symbol("apache-airflow-ts-sdk/NEVER_EXPIRE");
+export const NEVER_EXPIRE: unique symbol = 
Symbol("@apache-airflow/ts-sdk/NEVER_EXPIRE");
 
 /** Options for a task state store write. */
 export interface TaskStateStoreSetOpts {
diff --git a/ts-sdk/tests/cli/fixtures/bundle-v1.min.mjs 
b/ts-sdk/tests/cli/fixtures/bundle-v1.min.mjs
index 24331615747..e780e3a03e0 100644
--- a/ts-sdk/tests/cli/fixtures/bundle-v1.min.mjs
+++ b/ts-sdk/tests/cli/fixtures/bundle-v1.min.mjs
@@ -1,8 +1,8 @@
-//# 
airflowBundle={"code":{"start":"00000000000003ec","end":"00000000000004fb","sha256":"fa1afadd7cb7147d54e4870b849dd2390e5ad75f6153d040e7381ae8a76a5a29"},"metadata":{"start":"00000000000001de","end":"00000000000002df","sha256":"0f522f6b96c0813da84ac9ef1e4c944b93da409b502c850386964d4117b8d4b0"},"sources":[{"path":"entry.ts","start":"00000000000002fb","end":"00000000000003e7","sha256":"3e7a601893ae2cc92dd72dcc596d3fbfa19cafbaa0d3f5768973c49c3daee1c9"}]}
+//# 
airflowBundle={"code":{"start":"00000000000003ed","end":"00000000000004fc","sha256":"fa1afadd7cb7147d54e4870b849dd2390e5ad75f6153d040e7381ae8a76a5a29"},"metadata":{"start":"00000000000001de","end":"00000000000002df","sha256":"0f522f6b96c0813da84ac9ef1e4c944b93da409b502c850386964d4117b8d4b0"},"sources":[{"path":"entry.ts","start":"00000000000002fb","end":"00000000000003e8","sha256":"e7b366edca02548d1f3501fb2865f9661eb0dc1325c98f33f7a3fb5500e98c75"}]}
 //# 
airflowMetadata={"airflow_bundle_metadata_version":"1.0","sdk":{"language":"typescript","version":"0.1.0","supervisor_schema_version":"2026-06-16"},"entrypoint_path":"entry.ts","dag_source_paths":{"test_dag":"entry.ts"},"task_handlers":{"test_dag":{"tasks":["test_task"]}}}
 /*# airflowSource:entry.ts
 /** Handlers for the test Dag. *\/
-import { Bundle, Dag } from "apache-airflow-ts-sdk";
+import { Bundle, Dag } from "@apache-airflow/ts-sdk";
 
 const TERMINATOR = /\*\\//;
 const dag = new Dag("test_dag");
diff --git a/ts-sdk/tests/cli/pack.test.ts b/ts-sdk/tests/cli/pack.test.ts
index 0ff32ab6f83..21f63b74596 100644
--- a/ts-sdk/tests/cli/pack.test.ts
+++ b/ts-sdk/tests/cli/pack.test.ts
@@ -62,7 +62,7 @@ const GOLDEN_CODE = Buffer.from(
 // followed by a backslash. The Python reader is then validated against real 
encoder output.
 const GOLDEN_SOURCE = [
   "/** Handlers for the test Dag. */",
-  'import { Bundle, Dag } from "apache-airflow-ts-sdk";',
+  'import { Bundle, Dag } from "@apache-airflow/ts-sdk";',
   "",
   "const TERMINATOR = /\\*\\//;",
   'const dag = new Dag("test_dag");',
diff --git a/ts-sdk/tests/coordinator/arg-binding.test.ts 
b/ts-sdk/tests/coordinator/arg-binding.test.ts
index 663462613e8..6a0cfa189f2 100644
--- a/ts-sdk/tests/coordinator/arg-binding.test.ts
+++ b/ts-sdk/tests/coordinator/arg-binding.test.ts
@@ -442,7 +442,7 @@ describe("resolveArgs", () => {
     // destructures to `undefined` and corrupts the task's output.
     const unknownKind = [{ name: "totals", kind: "dataset" }] as unknown as 
ArgBindings;
     await expect(bind(unknownKind)).rejects.toThrowError(
-      /has binding kind "dataset", which this version of apache-airflow-ts-sdk 
cannot bind/,
+      /has binding kind "dataset", which this version of 
@apache-airflow\/ts-sdk cannot bind/,
     );
   });
 
diff --git a/ts-sdk/tests/hitl/operator.test.ts 
b/ts-sdk/tests/hitl/operator.test.ts
index 7dbb8809aa6..8f272ed4938 100644
--- a/ts-sdk/tests/hitl/operator.test.ts
+++ b/ts-sdk/tests/hitl/operator.test.ts
@@ -112,7 +112,7 @@ describe("a HITL task in a Dag", () => {
       const dag = new Dag("d");
 
       expect(() => dag.task("sign_off", foreign)).toThrowError(
-        /A human-in-the-loop task of Dag "d" comes from a different copy of 
apache-airflow-ts-sdk/,
+        /A human-in-the-loop task of Dag "d" comes from a different copy of 
@apache-airflow\/ts-sdk/,
       );
     });
 
diff --git a/ts-sdk/tests/public-api.test.ts b/ts-sdk/tests/public-api.test.ts
index 828fa7a32f4..e5cf267dd77 100644
--- a/ts-sdk/tests/public-api.test.ts
+++ b/ts-sdk/tests/public-api.test.ts
@@ -107,7 +107,7 @@ describe("public API", () => {
     Object.defineProperty(foreign, Symbol.for("airflow.ts-sdk.Bundle"), { 
value: true });
     const detached = Bundle.prototype.serve;
     await expect(detached.call(foreign as unknown as Bundle)).rejects.toThrow(
-      /different copy of apache-airflow-ts-sdk/,
+      /different copy of @apache-airflow\/ts-sdk/,
     );
   });
 
diff --git a/ts-sdk/tests/sdk/bundle.test.ts b/ts-sdk/tests/sdk/bundle.test.ts
index 24998153c27..05b731a5b39 100644
--- a/ts-sdk/tests/sdk/bundle.test.ts
+++ b/ts-sdk/tests/sdk/bundle.test.ts
@@ -127,7 +127,7 @@ describe("Bundle", () => {
     const foreign = { dagId: "foreign_dag" };
     Object.defineProperty(foreign, Symbol.for("airflow.ts-sdk.Dag"), { value: 
true });
     expect(() => new Bundle(foreign as unknown as Dag)).toThrowError(
-      /different copy of apache-airflow-ts-sdk/,
+      /different copy of @apache-airflow\/ts-sdk/,
     );
   });
 
diff --git a/ts-sdk/tsconfig.json b/ts-sdk/tsconfig.json
index 0d846c98205..0687671455f 100644
--- a/ts-sdk/tsconfig.json
+++ b/ts-sdk/tsconfig.json
@@ -28,9 +28,9 @@
     // the SDK, whose classes are not each other's. vitest.config.ts carries 
the
     // matching alias so the compiler and the runner agree.
     "paths": {
-      "apache-airflow-ts-sdk": ["./src/index.ts"],
-      "apache-airflow-ts-sdk/coordinator": ["./src/coordinator/index.ts"],
-      "apache-airflow-ts-sdk/hitl": ["./src/hitl/index.ts"]
+      "@apache-airflow/ts-sdk": ["./src/index.ts"],
+      "@apache-airflow/ts-sdk/coordinator": ["./src/coordinator/index.ts"],
+      "@apache-airflow/ts-sdk/hitl": ["./src/hitl/index.ts"]
     },
 
     "noEmit": true,
diff --git a/ts-sdk/vitest.config.ts b/ts-sdk/vitest.config.ts
index 432831cd2ae..e1e2ba84941 100644
--- a/ts-sdk/vitest.config.ts
+++ b/ts-sdk/vitest.config.ts
@@ -28,11 +28,11 @@ export default defineConfig({
       // `dist/`. A test that reaches into both would hold two copies of the
       // SDK, and a Dag from one is not an instance of the other's class.
       // Tests run against the sources, so the example does too.
-      "apache-airflow-ts-sdk": fileURLToPath(new URL("./src/index.ts", 
import.meta.url)),
-      "apache-airflow-ts-sdk/coordinator": fileURLToPath(
+      "@apache-airflow/ts-sdk": fileURLToPath(new URL("./src/index.ts", 
import.meta.url)),
+      "@apache-airflow/ts-sdk/coordinator": fileURLToPath(
         new URL("./src/coordinator/index.ts", import.meta.url),
       ),
-      "apache-airflow-ts-sdk/hitl": fileURLToPath(new 
URL("./src/hitl/index.ts", import.meta.url)),
+      "@apache-airflow/ts-sdk/hitl": fileURLToPath(new 
URL("./src/hitl/index.ts", import.meta.url)),
     },
   },
   test: {

Reply via email to