diff --git a/.agents/skills/gen-changesets/SKILL.md b/.agents/skills/gen-changesets/SKILL.md index 13b0450d..2863fcee 100644 --- a/.agents/skills/gen-changesets/SKILL.md +++ b/.agents/skills/gen-changesets/SKILL.md @@ -7,25 +7,25 @@ description: Use when generating changesets in the pythinker-code repository, in `pythinker-code` uses changesets to manage versions and changelogs. The current user-facing published package is: -- `@pythoughts/pythinker-code`: the CLI +- `@pymodel/pythinker-code`: the CLI -All other `@pythoughts/*` packages are treated as internal packages, including `@pythoughts/pythinker-code-sdk`, `agent-core`, `kosong`, `kaos`, `pythinker-code-oauth`, `pythinker-telemetry`, and `migration-legacy`. +All other `@pymodel/*` packages are treated as internal packages, including `@pymodel/pythinker-code-sdk`, `agent-core`, `kosong`, `kaos`, `pythinker-code-oauth`, `pythinker-telemetry`, and `migration-legacy`. ## Core Rules 1. **Inspect the actual changes first.** Use `git status` / `git diff --name-only` to identify which packages were actually changed. 2. **List packages that changesets can release.** If a changed package is ignored in `.changeset/config.json`, do not put that ignored package in frontmatter together with a non-ignored package; changesets rejects mixed ignored/non-ignored frontmatter. -3. **Map ignored internal changes to the affected released package.** If an ignored internal package changes CLI output or behavior, list `@pythoughts/pythinker-code` and describe the actual user-visible or release-artifact change in the changelog text. -4. **Internal package source changes that enter the CLI bundle must manually list the CLI.** `@pythoughts/pythinker-code` inline-bundles `@pythoughts/*` source, but those internal packages are devDependencies from the CLI's perspective, so changesets will not automatically propagate bumps. If a change enters the CLI output, list `@pythoughts/pythinker-code`. - - **Web app (`@pythoughts/pythinker-web`) changes always enter the CLI bundle.** `@pythoughts/pythinker-web` is ignored by changesets (see `.changeset/config.json`) and cannot be mixed with `@pythoughts/pythinker-code` in one changeset frontmatter. Describe the web change in the changelog text, but list `@pythoughts/pythinker-code` so the CLI release carries the bundled `dist-web` output. +3. **Map ignored internal changes to the affected released package.** If an ignored internal package changes CLI output or behavior, list `@pymodel/pythinker-code` and describe the actual user-visible or release-artifact change in the changelog text. +4. **Internal package source changes that enter the CLI bundle must manually list the CLI.** `@pymodel/pythinker-code` inline-bundles `@pymodel/*` source, but those internal packages are devDependencies from the CLI's perspective, so changesets will not automatically propagate bumps. If a change enters the CLI output, list `@pymodel/pythinker-code`. + - **Web app (`@pymodel/pythinker-web`) changes always enter the CLI bundle.** `@pymodel/pythinker-web` is ignored by changesets (see `.changeset/config.json`) and cannot be mixed with `@pymodel/pythinker-code` in one changeset frontmatter. Describe the web change in the changelog text, but list `@pymodel/pythinker-code` so the CLI release carries the bundled `dist-web` output. 5. **Docs-only and tests-only changes usually do not need a changeset.** README, internal docs, and `test/` changes that do not enter package output do not trigger a CLI bump. -6. `@pythoughts/dashboard` / `dashboard-server` / `dashboard-web` are ignored by changesets and should not be handled. +6. `@pymodel/dashboard` / `dashboard-server` / `dashboard-web` are ignored by changesets and should not be handled. ## Workflow 1. List the changed packages and check whether each one is ignored by `.changeset/config.json`. 2. Choose a bump level for each package. -3. If an ignored internal package change enters the CLI bundle, put `@pythoughts/pythinker-code` in frontmatter instead of mixing the ignored package into the same changeset. +3. If an ignored internal package change enters the CLI bundle, put `@pymodel/pythinker-code` in frontmatter instead of mixing the ignored package into the same changeset. 4. Create a short kebab-case file under `.changeset/`. 5. Split unrelated changes into separate changesets; keep one logical change in one file. @@ -70,7 +70,7 @@ An internal package fixes a bug visible to CLI users: ```markdown --- -"@pythoughts/pythinker-code": patch +"@pymodel/pythinker-code": patch --- Fix occasional loss of tool call results in long conversations. @@ -80,7 +80,7 @@ An internal package has an internal-only change, but it enters the CLI bundle: ```markdown --- -"@pythoughts/pythinker-code": patch +"@pymodel/pythinker-code": patch --- Unify tool execution metadata handling. @@ -90,7 +90,7 @@ Only SDK source changed, and the CLI does not use it: ```markdown --- -"@pythoughts/pythinker-code-sdk": patch +"@pymodel/pythinker-code-sdk": patch --- Clarify session status typing for internal SDK callers. @@ -98,7 +98,7 @@ Clarify session status typing for internal SDK callers. ## Web app changes -`@pythoughts/pythinker-web` is ignored by changesets and must **never** appear in a changeset frontmatter. Because the web app is bundled into the CLI release artifact, any web change that ships must list `@pythoughts/pythinker-code` instead and describe the actual web-facing change in the text. +`@pymodel/pythinker-web` is ignored by changesets and must **never** appear in a changeset frontmatter. Because the web app is bundled into the CLI release artifact, any web change that ships must list `@pymodel/pythinker-code` instead and describe the actual web-facing change in the text. - If a PR contains both web UI changes and server API changes, split them into separate changesets so each entry has a focused description. - Do not enumerate every micro-tweak; keep it to one sentence that captures what the web user gets. @@ -107,7 +107,7 @@ Web-only fix: ```markdown --- -"@pythoughts/pythinker-code": patch +"@pymodel/pythinker-code": patch --- Fix the web chat not scrolling to the bottom after sending a message. @@ -117,7 +117,7 @@ Web UI plus server APIs in the same PR (split into two changesets): ```markdown --- -"@pythoughts/pythinker-code": minor +"@pymodel/pythinker-code": minor --- Add the server-hosted web UI, including chat layout and session list behaviors. @@ -125,7 +125,7 @@ Add the server-hosted web UI, including chat layout and session list behaviors. ```markdown --- -"@pythoughts/pythinker-code": minor +"@pymodel/pythinker-code": minor --- Add the server REST and WebSocket APIs that power the web UI. @@ -134,9 +134,9 @@ Add the server REST and WebSocket APIs that power the web UI. ## Red Flags - You are about to write `major` without asking the user. -- Internal package source enters the CLI bundle, but `@pythoughts/pythinker-code` is missing. +- Internal package source enters the CLI bundle, but `@pymodel/pythinker-code` is missing. - A changeset frontmatter mixes ignored internal packages with non-ignored packages. -- `packages/node-sdk` was not changed, but `@pythoughts/pythinker-code-sdk` was listed for "internal package sync". +- `packages/node-sdk` was not changed, but `@pymodel/pythinker-code-sdk` was listed for "internal package sync". - The changelog entry is in Chinese. - The wording claims more than the diff actually did. - The CLI wording mentions internal package names, class names, or PR numbers. diff --git a/.agents/skills/sync-changelog/SKILL.md b/.agents/skills/sync-changelog/SKILL.md index b829fae8..82e508db 100644 --- a/.agents/skills/sync-changelog/SKILL.md +++ b/.agents/skills/sync-changelog/SKILL.md @@ -7,7 +7,7 @@ description: Use after a release succeeds, when maintainers need to sync apps/py ## Overview -`pythinker-code` uses changesets for versioning. Each package gets its own `CHANGELOG.md`. The user-facing CLI package, `@pythoughts/pythinker-code`, writes its changelog here: +`pythinker-code` uses changesets for versioning. Each package gets its own `CHANGELOG.md`. The user-facing CLI package, `@pymodel/pythinker-code`, writes its changelog here: ```text apps/pythinker-code/CHANGELOG.md @@ -38,7 +38,7 @@ Core rule: the English docs changelog is the source of truth for user-facing rel Before editing, confirm: -- The released version exists on npm (`npm view @pythoughts/pythinker-code versions --json`) or has a matching GitHub Release tag on `PyModel/pythinker-code`. +- The released version exists on npm (`npm view @pymodel/pythinker-code versions --json`) or has a matching GitHub Release tag on `PyModel/pythinker-code`. - The top of `apps/pythinker-code/CHANGELOG.md` is that new version. - The current branch is clean, or you are on a dedicated docs-sync branch. @@ -76,7 +76,7 @@ Keep: Remove: -- The upstream H1 `# @pythoughts/pythinker-code` because the docs page already has `# Changelog`. +- The upstream H1 `# @pymodel/pythinker-code` because the docs page already has `# Changelog`. - Changesets subheadings such as `### Patch Changes`, `### Minor Changes`, and `### Major Changes`. - PR links such as `[#317](...)`. - Commit hash links such as ``[`2f51db4`](...)``. @@ -156,7 +156,7 @@ Every version heading must carry its release date in parentheses: Take the date from the version's published GitHub Release tag, not from when you run the sync: ```bash -git log -1 --format=%cs "@pythoughts/pythinker-code@" +git log -1 --format=%cs "@pymodel/pythinker-code@" ``` Use the half-width parenthesis form ` (YYYY-MM-DD)` on the English page. Never invent or guess a date; if the tag is missing, stop and confirm with the user. diff --git a/.agents/skills/write-tui/SKILL.md b/.agents/skills/write-tui/SKILL.md index 1d5f5d53..e7ae0398 100644 --- a/.agents/skills/write-tui/SKILL.md +++ b/.agents/skills/write-tui/SKILL.md @@ -35,7 +35,7 @@ When a controller or `PythinkerTUI` section keeps growing, split pure functions, The feature type decides the landing spot: - **CLI arguments** → `src/cli/commands.ts` / `src/cli/options.ts`, passed into the TUI via `src/cli/run-shell.ts`. The CLI never operates on the session directly. -- **CLI subcommands** → `src/cli/sub/`, non-interactive only; reach core via `@pythoughts/pythinker-code-sdk`. +- **CLI subcommands** → `src/cli/sub/`, non-interactive only; reach core via `@pymodel/pythinker-code-sdk`. - **Slash commands** → declare/parse/type under `src/tui/commands/`; add the execution entry in `PythinkerTUI`'s slash-command handler section; sink complex logic into `utils` or a focused component. - **Skill-derived commands** → hook into `buildSkillSlashCommands` / the skill command map; do not hard-code a single skill. - **Transcript message types** → define the shape in `src/tui/types.ts`, add/extend a `components/messages/` component, register the renderer in the transcript builder. diff --git a/.changeset/README.md b/.changeset/README.md index e6fb75d0..b4d672cf 100644 --- a/.changeset/README.md +++ b/.changeset/README.md @@ -10,28 +10,28 @@ Current publishable packages: | Package | Directory | Description | | --- | --- | --- | -| `@pythoughts/pythinker-code` | `apps/pythinker-code` | CLI / TUI application — provides the `pythinker` command after install | -| `@pythoughts/pythinker-code-sdk` | `packages/node-sdk` | Public TypeScript SDK | +| `@pymodel/pythinker-code` | `apps/pythinker-code` | CLI / TUI application — provides the `pythinker` command after install | +| `@pymodel/pythinker-code-sdk` | `packages/node-sdk` | Public TypeScript SDK | All other workspace packages are private internal packages, are not published to npm, and are excluded via `ignore` in `.changeset/config.json`: -- `@pythoughts/acp-adapter` -- `@pythoughts/agent-core` -- `@pythoughts/kaos` -- `@pythoughts/pythinker-code-oauth` -- `@pythoughts/pythinker-telemetry` -- `@pythoughts/pythinker-web` -- `@pythoughts/kosong` -- `@pythoughts/migration-legacy` -- `@pythoughts/protocol` -- `@pythoughts/server` -- `@pythoughts/server-e2e` -- `@pythoughts/dashboard` -- `@pythoughts/dashboard-server` -- `@pythoughts/dashboard-web` +- `@pymodel/acp-adapter` +- `@pymodel/agent-core` +- `@pymodel/kaos` +- `@pymodel/pythinker-code-oauth` +- `@pymodel/pythinker-telemetry` +- `@pymodel/pythinker-web` +- `@pymodel/kosong` +- `@pymodel/migration-legacy` +- `@pymodel/protocol` +- `@pymodel/server` +- `@pymodel/server-e2e` +- `@pymodel/dashboard` +- `@pymodel/dashboard-server` +- `@pymodel/dashboard-web` - `pythinker-migration-legacy` -Version impact from internal dependencies must be judged manually. The published artifacts for CLI and SDK bundle internal workspace packages into the artifact itself; runtime `dependencies` of published packages must not include any `@pythoughts/*` internal workspace packages. +Version impact from internal dependencies must be judged manually. The published artifacts for CLI and SDK bundle internal workspace packages into the artifact itself; runtime `dependencies` of published packages must not include any `@pymodel/*` internal workspace packages. The repository's `.changeset/config.json` sets `updateInternalDependencies: "patch"`. Because internal packages are not published, you still need to manually select all affected publishable packages in the changeset — do not rely solely on automatic dependency bumps to express user-visible changes. @@ -39,12 +39,12 @@ Example scenarios: | Change | Changeset selection | | --- | --- | -| Only modifies TUI behavior in `@pythoughts/pythinker-code` | Add `patch` / `minor` / `major` to `@pythoughts/pythinker-code` | +| Only modifies TUI behavior in `@pymodel/pythinker-code` | Add `patch` / `minor` / `major` to `@pymodel/pythinker-code` | | Only modifies internal packages, no user-visible change in SDK / CLI | Usually no changeset needed | -| Internal package fix changes the CLI user experience | Add a changeset to `@pythoughts/pythinker-code` describing the user-visible fix | -| Internal package adds a new capability exposed by the SDK | Add a changeset to `@pythoughts/pythinker-code-sdk` | -| SDK behavior change affects CLI user experience | Add changesets to both `@pythoughts/pythinker-code-sdk` and `@pythoughts/pythinker-code` | -| Provider abstraction change affects SDK / CLI | Add changesets to the affected `@pythoughts/pythinker-code-sdk` and/or `@pythoughts/pythinker-code` | +| Internal package fix changes the CLI user experience | Add a changeset to `@pymodel/pythinker-code` describing the user-visible fix | +| Internal package adds a new capability exposed by the SDK | Add a changeset to `@pymodel/pythinker-code-sdk` | +| SDK behavior change affects CLI user experience | Add changesets to both `@pymodel/pythinker-code-sdk` and `@pymodel/pythinker-code` | +| Provider abstraction change affects SDK / CLI | Add changesets to the affected `@pymodel/pythinker-code-sdk` and/or `@pymodel/pythinker-code` | | Test-only, internal refactor, docs, or private debug tooling changes | Usually no changeset needed | | Bundled official plugin change under `plugins/` (e.g. `pythinker-datasource`) | No changeset — the plugin is versioned via its own `pythinker.plugin.json` / `plugins/marketplace.json` and shipped through the marketplace CDN, not the npm package | @@ -54,7 +54,7 @@ This repository uses npm's **Trusted Publishing** (OIDC-based) for publishing ### Configuration steps -1. Open each publishable package's page on the npm website, e.g. `https://www.npmjs.com/package/@pythoughts/pythinker-code`. +1. Open each publishable package's page on the npm website, e.g. `https://www.npmjs.com/package/@pymodel/pythinker-code`. 2. Go to **Settings** -> **Publishing access**. 3. Find **Automate publishing with GitHub Actions** or **Add trusted publisher**. 4. Click **Add a new trusted publisher**. @@ -146,12 +146,12 @@ The root-level `pnpm run publish` first runs typecheck, lint, sherif, test, buil ## Notes - Every PR that affects publishable-package behavior or public API should include a corresponding changeset. -- Changes under `plugins/` (the bundled official plugins such as `pythinker-datasource`) do **not** need a changeset: each plugin carries its own version in `pythinker.plugin.json` and `plugins/marketplace.json` and is distributed via the marketplace CDN, separately from the `@pythoughts/pythinker-code` npm package. +- Changes under `plugins/` (the bundled official plugins such as `pythinker-datasource`) do **not** need a changeset: each plugin carries its own version in `pythinker.plugin.json` and `plugins/marketplace.json` and is distributed via the marketplace CDN, separately from the `@pymodel/pythinker-code` npm package. - Changeset files must be committed to the repository — release PRs are only triggered after they're merged. - Release PRs require human review and merge; they will not publish automatically. -- Do not add release changesets for private internal packages; only select `@pythoughts/pythinker-code` and `@pythoughts/pythinker-code-sdk`. -- If a change in an underlying internal package alters user-visible behavior or public API of a publishable package, add a changeset to the affected publishable package. For example, when a bug fixed in `@pythoughts/agent-core` resolves an issue CLI users encounter, add a changeset to `@pythoughts/pythinker-code` describing the user-visible fix. -- `@pythoughts/pythinker-code` is the official CLI package name; after a global install it provides the `pythinker` command. +- Do not add release changesets for private internal packages; only select `@pymodel/pythinker-code` and `@pymodel/pythinker-code-sdk`. +- If a change in an underlying internal package alters user-visible behavior or public API of a publishable package, add a changeset to the affected publishable package. For example, when a bug fixed in `@pymodel/agent-core` resolves an issue CLI users encounter, add a changeset to `@pymodel/pythinker-code` describing the user-visible fix. +- `@pymodel/pythinker-code` is the official CLI package name; after a global install it provides the `pythinker` command. - Make sure each publishable package on npm has a Trusted Publisher configured. ## References diff --git a/.changeset/config.json b/.changeset/config.json index 0f6768fe..de34a553 100644 --- a/.changeset/config.json +++ b/.changeset/config.json @@ -7,20 +7,20 @@ "baseBranch": "main", "updateInternalDependencies": "patch", "ignore": [ - "@pythoughts/acp-adapter", - "@pythoughts/agent-core", - "@pythoughts/kaos", - "@pythoughts/pythinker-code-oauth", - "@pythoughts/pythinker-telemetry", - "@pythoughts/pythinker-web", - "@pythoughts/kosong", - "@pythoughts/migration-legacy", - "@pythoughts/protocol", - "@pythoughts/server", - "@pythoughts/server-e2e", - "@pythoughts/dashboard", - "@pythoughts/dashboard-server", - "@pythoughts/dashboard-web", + "@pymodel/acp-adapter", + "@pymodel/agent-core", + "@pymodel/kaos", + "@pymodel/pythinker-code-oauth", + "@pymodel/pythinker-telemetry", + "@pymodel/pythinker-web", + "@pymodel/kosong", + "@pymodel/migration-legacy", + "@pymodel/protocol", + "@pymodel/server", + "@pymodel/server-e2e", + "@pymodel/dashboard", + "@pymodel/dashboard-server", + "@pymodel/dashboard-web", "pythinker-migration-legacy" ], "snapshot": { diff --git a/.changeset/model-picker-keeps-effort.md b/.changeset/model-picker-keeps-effort.md index 98f30eca..dd609779 100644 --- a/.changeset/model-picker-keeps-effort.md +++ b/.changeset/model-picker-keeps-effort.md @@ -1,5 +1,5 @@ --- -"@pythoughts/pythinker-code": patch +"@pymodel/pythinker-code": patch --- Keep the current thinking effort when switching models in the model picker instead of silently saving the new model's lowest level as the default, and repair a stale thinking mode in the config when saving an effort. diff --git a/.changeset/persist-cycled-effort.md b/.changeset/persist-cycled-effort.md index 3b924c00..e17fa5d3 100644 --- a/.changeset/persist-cycled-effort.md +++ b/.changeset/persist-cycled-effort.md @@ -1,5 +1,5 @@ --- -"@pythoughts/pythinker-code": patch +"@pymodel/pythinker-code": patch --- Keep the thinking effort chosen with Ctrl-T/Shift-Tab as the default across restarts. diff --git a/.changeset/pymodel-npm-scope.md b/.changeset/pymodel-npm-scope.md new file mode 100644 index 00000000..b3cd22d3 --- /dev/null +++ b/.changeset/pymodel-npm-scope.md @@ -0,0 +1,5 @@ +--- +"@pymodel/pythinker-code": minor +--- + +Publish the CLI under the @pymodel npm scope; install with `npm install -g @pymodel/pythinker-code`. The old @pythoughts scope is deprecated and no longer receives releases. diff --git a/.changeset/thinking-indicator-only.md b/.changeset/thinking-indicator-only.md index 06c04037..c183ba63 100644 --- a/.changeset/thinking-indicator-only.md +++ b/.changeset/thinking-indicator-only.md @@ -1,5 +1,5 @@ --- -"@pythoughts/pythinker-code": patch +"@pymodel/pythinker-code": patch --- Show only the animated thinking indicator while the model thinks; the streamed thinking text no longer appears in the transcript unless expanded with Ctrl+O. diff --git a/.github/workflows/_native-build.yml b/.github/workflows/_native-build.yml index b8f0c716..22adf349 100644 --- a/.github/workflows/_native-build.yml +++ b/.github/workflows/_native-build.yml @@ -101,16 +101,16 @@ jobs: # The SEA blob step embeds apps/pythinker-code/dist-web; build the web app # and stage its assets before producing the native executable. run: | - pnpm --filter @pythoughts/pythinker-web run build + pnpm --filter @pymodel/pythinker-web run build node apps/pythinker-code/scripts/copy-web-assets.mjs - name: Build native executable (release profile, macOS signed) if: runner.os == 'macOS' && env.APPLE_SIGNING_AVAILABLE == 'true' - run: pnpm --filter @pythoughts/pythinker-code run build:native:release + run: pnpm --filter @pymodel/pythinker-code run build:native:release - name: Build native executable (local profile) if: '!(runner.os == ''macOS'' && env.APPLE_SIGNING_AVAILABLE == ''true'')' - run: pnpm --filter @pythoughts/pythinker-code run build:native:sea + run: pnpm --filter @pymodel/pythinker-code run build:native:sea - name: Notarize macOS binary if: runner.os == 'macOS' && env.APPLE_SIGNING_AVAILABLE == 'true' @@ -126,10 +126,10 @@ jobs: uses: ./.github/actions/macos-keychain-cleanup - name: Smoke test native executable - run: pnpm --filter @pythoughts/pythinker-code run test:native:smoke + run: pnpm --filter @pymodel/pythinker-code run test:native:smoke - name: Package native artifact - run: pnpm --filter @pythoughts/pythinker-code run package:native + run: pnpm --filter @pymodel/pythinker-code run package:native - name: Upload native artifact uses: actions/upload-artifact@v7 diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 020d60aa..2a06d598 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -83,8 +83,8 @@ jobs: pnpm dlx --package @typescript/native-preview@beta tsgo -p "${config}" --noEmit done - name: Typecheck pythinker-web (vue-tsc) - run: pnpm --filter @pythoughts/pythinker-web run typecheck + run: pnpm --filter @pymodel/pythinker-web run typecheck - name: Typecheck dashboard-server - run: pnpm --filter @pythoughts/dashboard-server run typecheck + run: pnpm --filter @pymodel/dashboard-server run typecheck - name: Typecheck dashboard-web - run: pnpm --filter @pythoughts/dashboard-web run typecheck + run: pnpm --filter @pymodel/dashboard-web run typecheck diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml index 1010edc7..84d9ccff 100644 --- a/.github/workflows/nightly.yml +++ b/.github/workflows/nightly.yml @@ -54,7 +54,7 @@ jobs: run: | pnpm changeset version --snapshot dev VERSION=$(node -p "require('./apps/pythinker-code/package.json').version") - if npm view "@pythoughts/pythinker-code@$VERSION" version >/dev/null 2>&1; then + if npm view "@pymodel/pythinker-code@$VERSION" version >/dev/null 2>&1; then echo "already published — no new commits" exit 0 fi diff --git a/.github/workflows/pkg-pr-new.yml b/.github/workflows/pkg-pr-new.yml index 40737769..45735a77 100644 --- a/.github/workflows/pkg-pr-new.yml +++ b/.github/workflows/pkg-pr-new.yml @@ -37,7 +37,7 @@ jobs: run: pnpm run build:packages - name: Build Pythinker web assets - run: pnpm --filter @pythoughts/pythinker-web run build + run: pnpm --filter @pymodel/pythinker-web run build - name: Generate Pythinker Code built-in catalog shell: bash @@ -47,7 +47,7 @@ jobs: echo "PYTHINKER_CODE_BUILT_IN_CATALOG_FILE=$CATALOG_FILE" >> "$GITHUB_ENV" - name: Build Pythinker Code package - run: pnpm --filter @pythoughts/pythinker-code run build + run: pnpm --filter @pymodel/pythinker-code run build - name: Publish pkg.pr.new preview run: pnpm exec pkg-pr-new publish --bin --commentWithSha --packageManager=pnpm,npm --no-template './apps/pythinker-code' diff --git a/.greptile/config.json b/.greptile/config.json index 16d746e7..35ee8ecd 100644 --- a/.greptile/config.json +++ b/.greptile/config.json @@ -5,7 +5,7 @@ "includeBranches": ["main"], "ignoreKeywords": "WIP\nDO NOT REVIEW", "ignorePatterns": "node_modules/**\ndist/**\nbuild/**\n**/*.min.js\npnpm-lock.yaml\nflake.lock\n**/*.snap\nreports/**\n**/*.webp\n**/*.png\n**/*.gif", - "instructions": "TypeScript pnpm monorepo for pythinker-code, a provider-agnostic AI coding agent. The published user-facing package is the CLI (@pythoughts/pythinker-code); packages/node-sdk is the public TypeScript SDK; packages/agent-core, kosong, kaos, oauth, and telemetry are internal engine packages. apps/* are the CLI/TUI, web UI, and dashboard. The root AGENTS.md is the authoritative contributor guide; nearest sub-directory AGENTS.md files add local rules.", + "instructions": "TypeScript pnpm monorepo for pythinker-code, a provider-agnostic AI coding agent. The published user-facing package is the CLI (@pymodel/pythinker-code); packages/node-sdk is the public TypeScript SDK; packages/agent-core, kosong, kaos, oauth, and telemetry are internal engine packages. apps/* are the CLI/TUI, web UI, and dashboard. The root AGENTS.md is the authoritative contributor guide; nearest sub-directory AGENTS.md files add local rules.", "rules": [ { "id": "no-type-weakening", diff --git a/.greptile/rules.md b/.greptile/rules.md index bcc5f2d2..5f79d882 100644 --- a/.greptile/rules.md +++ b/.greptile/rules.md @@ -10,7 +10,7 @@ ## Architecture boundaries -- `apps/pythinker-code` and `apps/pythinker-web` must not depend on `packages/agent-core`. They consume the SDK (`@pythoughts/pythinker-code-sdk`) or the server REST/WS API. +- `apps/pythinker-code` and `apps/pythinker-web` must not depend on `packages/agent-core`. They consume the SDK (`@pymodel/pythinker-code-sdk`) or the server REST/WS API. - The `Agent` class in `packages/agent-core` stays standalone: no mandatory `Session` or `agentId`; optional `sessionId` is a provider hint only. - `packages/acp-adapter` pins `@agentclientprotocol/sdk` to `^0.23.0` — flag any bump to 0.24+ (it broke the session-model API). - Experimental features are gated behind flags in `packages/agent-core/src/flags/registry.ts`, not shipped unguarded. diff --git a/.oxlintrc.json b/.oxlintrc.json index 68ff50f6..28c1821a 100644 --- a/.oxlintrc.json +++ b/.oxlintrc.json @@ -92,18 +92,18 @@ { "paths": [ { - "name": "@pythoughts/agent-core", - "message": "See AGENTS.md:19: apps/pythinker-code must consume core through @pythoughts/pythinker-code-sdk." + "name": "@pymodel/agent-core", + "message": "See AGENTS.md:19: apps/pythinker-code must consume core through @pymodel/pythinker-code-sdk." } ], "patterns": [ { "group": [ - "@pythoughts/agent-core/**", + "@pymodel/agent-core/**", "**/packages/agent-core", "**/packages/agent-core/**" ], - "message": "See AGENTS.md:19: apps/pythinker-code must consume core through @pythoughts/pythinker-code-sdk." + "message": "See AGENTS.md:19: apps/pythinker-code must consume core through @pymodel/pythinker-code-sdk." } ] } diff --git a/AGENTS.md b/AGENTS.md index df440da0..6d843f54 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -48,7 +48,7 @@ Adding an OpenAI-compatible provider requires **zero code changes** — just add | Package | Description | Notes | | ------- | ----------- | ----- | -| `apps/pythinker-code` | CLI / TUI app | Consumes `@pythoughts/pythinker-code-sdk`; no `agent-core` dep. Use `write-tui` skill. | +| `apps/pythinker-code` | CLI / TUI app | Consumes `@pymodel/pythinker-code-sdk`; no `agent-core` dep. Use `write-tui` skill. | | `apps/pythinker-web` | Browser UI (Vue 3 + Vite + vue-i18n) | REST + WS `/api/v1`; no `agent-core` dep. See its `AGENTS.md`. | | `apps/dashboard` | Session dashboard & replay | `server/` + `web/` subdirs. | | `packages/agent-core` | Agent engine | Agent, Session, profile, skills, tools, plan, permission, DI. | @@ -68,7 +68,7 @@ Adding an OpenAI-compatible provider requires **zero code changes** — just add - `pnpm-workspace.yaml` is source of truth, but `flake.nix` **hardcodes** `workspacePaths`/`workspaceNames`. - **Update both** when adding/removing any workspace package. Missing a path silently drops files from Nix; missing a name breaks `pnpmConfigHook`. -- CI (`scripts/check-nix-workspace.mjs`) only validates the `@pythoughts/pythinker-code` closure — keep `flake.nix` updated by hand. +- CI (`scripts/check-nix-workspace.mjs`) only validates the `@pymodel/pythinker-code` closure — keep `flake.nix` updated by hand. ## Coding Rules diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index ff3434c8..270b58ab 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -29,7 +29,7 @@ This is a pnpm monorepo. The most relevant entry points are: - `apps/pythinker-code` — CLI / TUI - `apps/dashboard` — session replay & debugging visualizer -- `packages/node-sdk` — public TypeScript SDK (`@pythoughts/pythinker-code-sdk`) +- `packages/node-sdk` — public TypeScript SDK (`@pymodel/pythinker-code-sdk`) - `packages/agent-core`, `kosong`, `kaos`, `oauth`, `telemetry` — internal engine packages - `docs/` — VitePress bilingual docs site diff --git a/README.md b/README.md index 61dc1c53..80d96fdf 100644 --- a/README.md +++ b/README.md @@ -9,8 +9,8 @@
-[![npm version](https://img.shields.io/npm/v/@pythoughts/pythinker-code?style=for-the-badge&logo=npm&logoColor=white&color=CB3837&label=pythinker-code)](https://www.npmjs.com/package/@pythoughts/pythinker-code) -[![Downloads](https://img.shields.io/npm/dm/@pythoughts/pythinker-code?style=for-the-badge&logo=npm&logoColor=white&color=2b89ff&label=downloads)](https://www.npmjs.com/package/@pythoughts/pythinker-code) +[![npm version](https://img.shields.io/npm/v/@pymodel/pythinker-code?style=for-the-badge&logo=npm&logoColor=white&color=CB3837&label=pythinker-code)](https://www.npmjs.com/package/@pymodel/pythinker-code) +[![Downloads](https://img.shields.io/npm/dm/@pymodel/pythinker-code?style=for-the-badge&logo=npm&logoColor=white&color=2b89ff&label=downloads)](https://www.npmjs.com/package/@pymodel/pythinker-code) [![Node.js](https://img.shields.io/badge/Node.js-26%2B-339933?style=for-the-badge&logo=nodedotjs&logoColor=white)](https://github.com/PyModel/pythinker-code/blob/main/package.json) [![License: MIT](https://img.shields.io/badge/License-MIT-16a34a.svg?style=for-the-badge)](https://github.com/PyModel/pythinker-code/blob/main/LICENSE) [![CI](https://img.shields.io/github/actions/workflow/status/PyModel/pythinker-code/ci.yml?branch=main&label=CI&style=for-the-badge&logo=githubactions&logoColor=white)](https://github.com/PyModel/pythinker-code/actions/workflows/ci.yml?query=branch%3Amain) @@ -132,7 +132,7 @@ Pythinker ships **native installers**— no Node.js prerequisite. Pick the row t | Homebrew **Homebrew**| `brew install pymodel/tap/pythinker-code` | Homebrew | | Windows **Windows (PowerShell)**| `irm https://code.pythinker.com/pythinker-code/install.ps1 \| iex` | [code.pythinker.com](https://code.pythinker.com) | | Nix **Nix**| `nix run github:PyModel/pythinker-code` | flake | -| npm **npm / pnpm fallback**| `npm install -g @pythoughts/pythinker-code` | requires Node.js ≥ 26.4.0 | +| npm **npm / pnpm fallback**| `npm install -g @pymodel/pythinker-code` | requires Node.js ≥ 26.4.0 | > [!NOTE] > **Windows:**install [Git for Windows](https://gitforwindows.org/) before first launch — Pythinker Code uses the bundled Git Bash as its shell. For a custom Git Bash location, set `PYTHINKER_SHELL_PATH` to the absolute path of `bash.exe`. @@ -252,7 +252,7 @@ Pythinker is a small, extensible runtime — not a monolith. Build on it. | **Skills**| `/skill:` loads reusable, repo-local instructions on demand | bundled & user-defined | | **Hooks**| Observe or block tool execution; integrate policy or automation | lifecycle hook events | | **Plugins**| Skills, MCP servers, and data sources from the marketplace or GitHub | plugin ecosystem | -| **SDK**| Embed agent capabilities in your own tools | [`@pythoughts/pythinker-code-sdk`](packages/node-sdk) | +| **SDK**| Embed agent capabilities in your own tools | [`@pymodel/pythinker-code-sdk`](packages/node-sdk) | --- @@ -359,7 +359,7 @@ Our TUI is built on [`pi-tui`](https://github.com/earendil-works/pi-mono/tree/ma **Built with for engineers who live in the terminal.** [ code.pythinker.com](https://code.pythinker.com)  ·  -[ npm](https://www.npmjs.com/package/@pythoughts/pythinker-code)  ·  +[ npm](https://www.npmjs.com/package/@pymodel/pythinker-code)  ·  [ GitHub](https://github.com/PyModel/pythinker-code)  ·  [ Docs](https://pymodel.github.io/pythinker-code/)  ·  [ ACP](https://agentclientprotocol.com/)  ·  diff --git a/apps/dashboard/package.json b/apps/dashboard/package.json index 52214d3d..bd73e4b3 100644 --- a/apps/dashboard/package.json +++ b/apps/dashboard/package.json @@ -1,15 +1,15 @@ { - "name": "@pythoughts/dashboard", + "name": "@pymodel/dashboard", "version": "0.1.1", "private": true, "description": "Session dashboard and debugging tool for pythinker-code sessions", "license": "MIT", "type": "module", "scripts": { - "build:deps": "pnpm --filter @pythoughts/agent-core... build", + "build:deps": "pnpm --filter @pymodel/agent-core... build", "predev": "pnpm run build:deps", "dev": "node scripts/dev.mjs", - "build": "pnpm run build:deps && pnpm --filter @pythoughts/dashboard-server build && pnpm --filter @pythoughts/dashboard-web build && node scripts/copy-web-dist.mjs", + "build": "pnpm run build:deps && pnpm --filter @pymodel/dashboard-server build && pnpm --filter @pymodel/dashboard-web build && node scripts/copy-web-dist.mjs", "prestart": "pnpm run build", "start": "node server/dist/server.mjs" }, diff --git a/apps/dashboard/scripts/copy-web-dist.mjs b/apps/dashboard/scripts/copy-web-dist.mjs index b924e873..cfc65b1e 100644 --- a/apps/dashboard/scripts/copy-web-dist.mjs +++ b/apps/dashboard/scripts/copy-web-dist.mjs @@ -15,7 +15,7 @@ try { await stat(src); } catch { process.stderr.write(`[copy-web-dist] source missing: ${src}\n`); - process.stderr.write('Did you run `pnpm --filter @pythoughts/dashboard-web build` first?\n'); + process.stderr.write('Did you run `pnpm --filter @pymodel/dashboard-web build` first?\n'); process.exit(1); } diff --git a/apps/dashboard/scripts/dev.mjs b/apps/dashboard/scripts/dev.mjs index cc12358a..437bd86d 100644 --- a/apps/dashboard/scripts/dev.mjs +++ b/apps/dashboard/scripts/dev.mjs @@ -58,8 +58,8 @@ const child = spawn( '-k', '-n', 'server,web', '-c', 'cyan,magenta', - 'pnpm --filter @pythoughts/dashboard-server dev', - 'pnpm --filter @pythoughts/dashboard-web dev', + 'pnpm --filter @pymodel/dashboard-server dev', + 'pnpm --filter @pymodel/dashboard-web dev', ], { stdio: 'inherit', env, shell: false }, ); diff --git a/apps/dashboard/server/package.json b/apps/dashboard/server/package.json index 2bf61585..d2d8b5db 100644 --- a/apps/dashboard/server/package.json +++ b/apps/dashboard/server/package.json @@ -1,5 +1,5 @@ { - "name": "@pythoughts/dashboard-server", + "name": "@pymodel/dashboard-server", "version": "0.1.1", "private": true, "license": "MIT", @@ -32,8 +32,8 @@ }, "dependencies": { "@hono/node-server": "^2.0.5", - "@pythoughts/agent-core": "workspace:^", - "@pythoughts/kosong": "workspace:^", + "@pymodel/agent-core": "workspace:^", + "@pymodel/kosong": "workspace:^", "hono": "^4.13.0" }, "devDependencies": { diff --git a/apps/dashboard/server/src/lib/agent-record-types.ts b/apps/dashboard/server/src/lib/agent-record-types.ts index 4c4594c2..1c1b3d9a 100644 --- a/apps/dashboard/server/src/lib/agent-record-types.ts +++ b/apps/dashboard/server/src/lib/agent-record-types.ts @@ -3,7 +3,7 @@ // Do NOT add local interfaces that duplicate upstream shapes. // Local binding for the `AgentRecord` type used by dashboard-only DTOs below. -import type { AgentRecord } from '@pythoughts/agent-core'; +import type { AgentRecord } from '@pymodel/agent-core'; export type { AgentRecord, @@ -19,9 +19,9 @@ export type { LoopRecordedEvent, ContextMessage, PromptOrigin, -} from '@pythoughts/agent-core'; -export { AGENT_WIRE_PROTOCOL_VERSION } from '@pythoughts/agent-core'; -export type { Message, ContentPart, ToolCall, TokenUsage } from '@pythoughts/kosong'; +} from '@pymodel/agent-core'; +export { AGENT_WIRE_PROTOCOL_VERSION } from '@pymodel/agent-core'; +export type { Message, ContentPart, ToolCall, TokenUsage } from '@pymodel/kosong'; // ── dashboard-only DTOs ────────────────────────────────────────────────────────── diff --git a/apps/dashboard/server/src/lib/session-store.ts b/apps/dashboard/server/src/lib/session-store.ts index d871fd86..04fde960 100644 --- a/apps/dashboard/server/src/lib/session-store.ts +++ b/apps/dashboard/server/src/lib/session-store.ts @@ -1,7 +1,7 @@ import { readdir, readFile, stat } from 'node:fs/promises'; import { join, resolve, sep } from 'node:path'; -import { parseSessionMetadata, type SessionMeta } from '@pythoughts/agent-core'; +import { parseSessionMetadata, type SessionMeta } from '@pymodel/agent-core'; import { DashboardIncompatibilityError, diff --git a/apps/dashboard/server/src/lib/wire-reader.ts b/apps/dashboard/server/src/lib/wire-reader.ts index 183a82ba..342dbdd0 100644 --- a/apps/dashboard/server/src/lib/wire-reader.ts +++ b/apps/dashboard/server/src/lib/wire-reader.ts @@ -4,7 +4,7 @@ import { createInterface } from 'node:readline'; import { AGENT_WIRE_PROTOCOL_VERSION, assertAgentRecord, -} from '@pythoughts/agent-core'; +} from '@pymodel/agent-core'; import { DashboardIncompatibilityError, diff --git a/apps/dashboard/server/tsdown.config.ts b/apps/dashboard/server/tsdown.config.ts index b82dac02..6e21a5d2 100644 --- a/apps/dashboard/server/tsdown.config.ts +++ b/apps/dashboard/server/tsdown.config.ts @@ -5,5 +5,5 @@ export default defineConfig({ format: ['esm'], outDir: 'dist', clean: true, - external: ['@pythoughts/agent-core', '@pythoughts/kosong', '@pythoughts/kaos'], + external: ['@pymodel/agent-core', '@pymodel/kosong', '@pymodel/kaos'], }); diff --git a/apps/dashboard/web/package.json b/apps/dashboard/web/package.json index 369044b8..700e04f9 100644 --- a/apps/dashboard/web/package.json +++ b/apps/dashboard/web/package.json @@ -1,5 +1,5 @@ { - "name": "@pythoughts/dashboard-web", + "name": "@pymodel/dashboard-web", "version": "0.1.1", "private": true, "license": "MIT", diff --git a/apps/dashboard/web/src/components/wire/renderers.tsx b/apps/dashboard/web/src/components/wire/renderers.tsx index 91492428..055f599c 100644 --- a/apps/dashboard/web/src/components/wire/renderers.tsx +++ b/apps/dashboard/web/src/components/wire/renderers.tsx @@ -2,7 +2,7 @@ // detail for every record kind. Because `WIRE_RENDERERS` is typed as a mapped // type over the FULL `RecordType` union, TypeScript REQUIRES an entry for each // kind: adding a kind upstream in agent-core fails -// `pnpm --filter @pythoughts/dashboard-web typecheck` here until a renderer is +// `pnpm --filter @pymodel/dashboard-web typecheck` here until a renderer is // added. This is the anti-rot guarantee that keeps dashboard from silently falling // behind the wire protocol. diff --git a/apps/pythinker-code/AGENTS.md b/apps/pythinker-code/AGENTS.md index 8fb7e05f..ba9cfe3e 100644 --- a/apps/pythinker-code/AGENTS.md +++ b/apps/pythinker-code/AGENTS.md @@ -42,7 +42,7 @@ Main directories: - `reverse-rpc` converts SDK approval/question requests into the data shape a UI panel/dialog needs, and converts the user's choice back into an SDK response. - `theme` is the single source of truth for colors and styles. Components must not bypass the theme system and use chalk named colors directly. - `utils` holds utility functions with no UI-state dependency. Logic that needs `TUIState` or a component instance must not live under app-level `src/utils`. -- `apps/pythinker-code` may only use core capabilities through `@pythoughts/pythinker-code-sdk`. Do not import `@pythoughts/agent-core` directly in app code. +- `apps/pythinker-code` may only use core capabilities through `@pymodel/pythinker-code-sdk`. Do not import `@pymodel/agent-core` directly in app code. ## TUI Coding Conventions diff --git a/apps/pythinker-code/CHANGELOG.md b/apps/pythinker-code/CHANGELOG.md index 30260a33..a156c030 100644 --- a/apps/pythinker-code/CHANGELOG.md +++ b/apps/pythinker-code/CHANGELOG.md @@ -1,4 +1,4 @@ -# @pythoughts/pythinker-code +# @pymodel/pythinker-code ## 0.16.0 @@ -886,7 +886,7 @@ ### Minor Changes -- [#368](https://github.com/PythoughtsAI/pythinker-code/pull/368) [`3eafa79`](https://github.com/PythoughtsAI/pythinker-code/commit/3eafa79f39c06b67d18bd2c1fd5321d2d889ed90) - Add `@pythoughts/acp-adapter` and the `pythinker acp` subcommand: pythinker-code now speaks [Agent Client Protocol 0.23](https://agentclientprotocol.com/) over stdio so IDEs (Zed, JetBrains AI Chat, custom clients) can drive sessions directly — coverage matrix, Zed configuration and breaking pre-release notes are in [pythinker acp Subcommand Page](https://pythoughtsai.github.io/pythinker-code/en/reference/pythinker-acp.html). +- [#368](https://github.com/PythoughtsAI/pythinker-code/pull/368) [`3eafa79`](https://github.com/PythoughtsAI/pythinker-code/commit/3eafa79f39c06b67d18bd2c1fd5321d2d889ed90) - Add `@pymodel/acp-adapter` and the `pythinker acp` subcommand: pythinker-code now speaks [Agent Client Protocol 0.23](https://agentclientprotocol.com/) over stdio so IDEs (Zed, JetBrains AI Chat, custom clients) can drive sessions directly — coverage matrix, Zed configuration and breaking pre-release notes are in [pythinker acp Subcommand Page](https://pythoughtsai.github.io/pythinker-code/en/reference/pythinker-acp.html). - [#338](https://github.com/PythoughtsAI/pythinker-code/pull/338) [`ba7dd73`](https://github.com/PythoughtsAI/pythinker-code/commit/ba7dd736a3b295b2a29c229a944208c232d51458) - Add `/btw` for side-channel conversations without steering the active main turn. diff --git a/apps/pythinker-code/README.md b/apps/pythinker-code/README.md index f443b7b8..d223a5d9 100644 --- a/apps/pythinker-code/README.md +++ b/apps/pythinker-code/README.md @@ -1,8 +1,8 @@ -# @pythoughts/pythinker-code +# @pymodel/pythinker-code > The Starting Point for Next-Gen Agents -[![npm](https://img.shields.io/npm/v/@pythoughts/pythinker-code)](https://www.npmjs.com/package/@pythoughts/pythinker-code) [![License](https://img.shields.io/badge/license-MIT-blue)](LICENSE) [![Docs](https://img.shields.io/badge/docs-online-blue)](https://pymodel.github.io/pythinker-code/) +[![npm](https://img.shields.io/npm/v/@pymodel/pythinker-code)](https://www.npmjs.com/package/@pymodel/pythinker-code) [![License](https://img.shields.io/badge/license-MIT-blue)](LICENSE) [![Docs](https://img.shields.io/badge/docs-online-blue)](https://pymodel.github.io/pythinker-code/)

Pythinker Code terminal demo @@ -41,13 +41,13 @@ pythinker --version If you prefer npm, use Node.js 26.4.0 or later: ```sh -npm install -g @pythoughts/pythinker-code +npm install -g @pymodel/pythinker-code ``` Or with pnpm: ```sh -pnpm add -g @pythoughts/pythinker-code +pnpm add -g @pymodel/pythinker-code ``` For upgrade and uninstall instructions, see the [Getting Started guide](https://pymodel.github.io/pythinker-code/guides/getting-started). diff --git a/apps/pythinker-code/package.json b/apps/pythinker-code/package.json index cdc53d68..06b8b982 100644 --- a/apps/pythinker-code/package.json +++ b/apps/pythinker-code/package.json @@ -1,5 +1,5 @@ { - "name": "@pythoughts/pythinker-code", + "name": "@pymodel/pythinker-code", "version": "0.16.0", "description": "The Starting Point for Next-Gen Agents", "license": "MIT", @@ -97,15 +97,15 @@ }, "devDependencies": { "@earendil-works/pi-tui": "^0.83.0", - "@pythoughts/acp-adapter": "workspace:^", - "@pythoughts/dashboard-server": "workspace:^", - "@pythoughts/dashboard-web": "workspace:*", - "@pythoughts/migration-legacy": "workspace:^", - "@pythoughts/pythinker-code-oauth": "workspace:^", - "@pythoughts/pythinker-code-sdk": "workspace:^", - "@pythoughts/pythinker-telemetry": "workspace:^", - "@pythoughts/pythinker-web": "workspace:^", - "@pythoughts/server": "workspace:^", + "@pymodel/acp-adapter": "workspace:^", + "@pymodel/dashboard-server": "workspace:^", + "@pymodel/dashboard-web": "workspace:*", + "@pymodel/migration-legacy": "workspace:^", + "@pymodel/pythinker-code-oauth": "workspace:^", + "@pymodel/pythinker-code-sdk": "workspace:^", + "@pymodel/pythinker-telemetry": "workspace:^", + "@pymodel/pythinker-web": "workspace:^", + "@pymodel/server": "workspace:^", "@types/node": "^26.1.2", "@types/semver": "^7.8.0", "@types/yazl": "^2.4.6", diff --git a/apps/pythinker-code/scripts/build-dashboard-asset.mjs b/apps/pythinker-code/scripts/build-dashboard-asset.mjs index 06584723..cb126ada 100644 --- a/apps/pythinker-code/scripts/build-dashboard-asset.mjs +++ b/apps/pythinker-code/scripts/build-dashboard-asset.mjs @@ -26,7 +26,7 @@ try { // runners (.github/workflows/_native-build.yml), which run this generator. // A single command string (not an args array) avoids the args+shell // deprecation; the command is static (no injection surface). - execSync('pnpm --filter @pythoughts/dashboard-web exec vite build', { + execSync('pnpm --filter @pymodel/dashboard-web exec vite build', { stdio: 'inherit', cwd: repoRoot, env: { ...process.env, DASHBOARD_SINGLEFILE: '1' }, diff --git a/apps/pythinker-code/scripts/copy-web-assets.mjs b/apps/pythinker-code/scripts/copy-web-assets.mjs index adc5c1ef..4a9f286d 100644 --- a/apps/pythinker-code/scripts/copy-web-assets.mjs +++ b/apps/pythinker-code/scripts/copy-web-assets.mjs @@ -15,7 +15,7 @@ async function assertBuiltWeb() { } } catch { throw new Error( - `Pythinker web build output was not found at ${source}. Run \`pnpm --filter @pythoughts/pythinker-web run build\` first.`, + `Pythinker web build output was not found at ${source}. Run \`pnpm --filter @pymodel/pythinker-web run build\` first.`, ); } } diff --git a/apps/pythinker-code/scripts/native/produce-manifest.mjs b/apps/pythinker-code/scripts/native/produce-manifest.mjs index 28225367..ef34f691 100644 --- a/apps/pythinker-code/scripts/native/produce-manifest.mjs +++ b/apps/pythinker-code/scripts/native/produce-manifest.mjs @@ -22,8 +22,8 @@ if (!inputDir || !tag) { process.exit(1); } -// Tag formats `@pythoughts/pythinker-code@x.y.z`, `vx.y.z`, or `x.y.z` — all normalize to x.y.z -const version = tag.replace(/^@pythoughts\/pythinker-code@/, '').replace(/^v/, ''); +// Tag formats `@pymodel/pythinker-code@x.y.z`, `vx.y.z`, or `x.y.z` — all normalize to x.y.z +const version = tag.replace(/^@pymodel\/pythinker-code@/, '').replace(/^v/, ''); const entries = await readdir(inputDir); const sumFiles = entries.filter((f) => /^pythinker-code-[a-z0-9-]+\.zip\.sha256$/.test(f)); diff --git a/apps/pythinker-code/scripts/native/resolve-release.mjs b/apps/pythinker-code/scripts/native/resolve-release.mjs index ac08b72a..43021116 100644 --- a/apps/pythinker-code/scripts/native/resolve-release.mjs +++ b/apps/pythinker-code/scripts/native/resolve-release.mjs @@ -3,7 +3,7 @@ import { resolve } from 'node:path'; import { appRoot } from './paths.mjs'; -const packageName = '@pythoughts/pythinker-code'; +const packageName = '@pymodel/pythinker-code'; const packageJson = JSON.parse( await readFile(resolve(appRoot, 'package.json'), 'utf-8'), ); diff --git a/apps/pythinker-code/scripts/native/web-assets.mjs b/apps/pythinker-code/scripts/native/web-assets.mjs index 0a51c21b..2d656763 100644 --- a/apps/pythinker-code/scripts/native/web-assets.mjs +++ b/apps/pythinker-code/scripts/native/web-assets.mjs @@ -106,7 +106,7 @@ async function collectAssetRoot({ export async function collectWebAssets({ appRoot, target }) { const buildCommand = - 'pnpm --filter @pythoughts/pythinker-web run build && pnpm --filter @pythoughts/pythinker-code run build'; + 'pnpm --filter @pymodel/pythinker-web run build && pnpm --filter @pymodel/pythinker-code run build'; return collectAssetRoot({ appRoot, target, diff --git a/apps/pythinker-code/scripts/postinstall.mjs b/apps/pythinker-code/scripts/postinstall.mjs index 49919c86..3412371a 100644 --- a/apps/pythinker-code/scripts/postinstall.mjs +++ b/apps/pythinker-code/scripts/postinstall.mjs @@ -1,6 +1,6 @@ #!/usr/bin/env node /** - * Postinstall hook for @pythoughts/pythinker-code. + * Postinstall hook for @pymodel/pythinker-code. * * Goal: when this package is installed globally, ensure typing `pythinker` * invokes the new TypeScript CLI. The npm `package.json` bin field @@ -43,7 +43,7 @@ * * ## Workflow * - * What runs when a user types `npm install -g @pythoughts/pythinker-code` + * What runs when a user types `npm install -g @pymodel/pythinker-code` * (or the yarn / pnpm equivalent): * * 1. The manager extracts the package and runs lifecycle scripts. diff --git a/apps/pythinker-code/scripts/postinstall/reach.mjs b/apps/pythinker-code/scripts/postinstall/reach.mjs index e1887e58..ba82af3e 100644 --- a/apps/pythinker-code/scripts/postinstall/reach.mjs +++ b/apps/pythinker-code/scripts/postinstall/reach.mjs @@ -112,7 +112,7 @@ export function pmGlobalInstallCommand(pm, pkg) { * location global` persistently). npm intentionally does NOT * also set `npm_config_global` in this case, so without this * branch the migration silently no-ops for `npm install - * --location=global @pythoughts/pythinker-code` — verified on npm + * --location=global @pymodel/pythinker-code` — verified on npm * 11.13.0. * - {@link isYarnClassicGlobalAdd} — yarn classic does NOT set * `npm_config_global` for `yarn global add`. The only reliable @@ -246,7 +246,7 @@ async function isExecutableFile(filePath) { // - pnpm POSIX shims (literal `/bin/sh` scripts, not symlinks; pnpm // does not symlink into the package root the way npm/yarn classic // do on POSIX) -const PACKAGE_NAME_MARKERS = ['@pythoughts/pythinker-code', '@pythoughts\\pythinker-code']; +const PACKAGE_NAME_MARKERS = ['@pymodel/pythinker-code', '@pymodel\\pythinker-code']; async function shimReferencesOwnPackage(shimPath) { try { diff --git a/apps/pythinker-code/scripts/postinstall/ui.mjs b/apps/pythinker-code/scripts/postinstall/ui.mjs index a9cea418..e231d157 100644 --- a/apps/pythinker-code/scripts/postinstall/ui.mjs +++ b/apps/pythinker-code/scripts/postinstall/ui.mjs @@ -181,7 +181,7 @@ function warningHeading(text) { * fs errors). Listed last so the user can see what to retry. */ export function logMigrationDone(outcomes, pm) { - const reinstallCmd = pmGlobalInstallCommand(pm, '@pythoughts/pythinker-code'); + const reinstallCmd = pmGlobalInstallCommand(pm, '@pymodel/pythinker-code'); const { renames, consolidates, @@ -322,7 +322,7 @@ export function logMigrationDone(outcomes, pm) { */ export function logMigrationBlocked(blocked, actionable, pm) { const isWindows = process.platform === 'win32'; - const reinstallCmd = pmGlobalInstallCommand(pm, '@pythoughts/pythinker-code'); + const reinstallCmd = pmGlobalInstallCommand(pm, '@pymodel/pythinker-code'); const lines = [ warningHeading('Can\'t switch to the new pythinker yet'), @@ -384,7 +384,7 @@ export function logMigrationBlocked(blocked, actionable, pm) { * user can decide. */ export function logForeignPythinkerInTheWay(foreignPath, pm) { - const reinstallCmd = pmGlobalInstallCommand(pm, '@pythoughts/pythinker-code'); + const reinstallCmd = pmGlobalInstallCommand(pm, '@pymodel/pythinker-code'); emit( renderBox([ warningHeading('Can\'t switch to the new pythinker yet'), @@ -426,7 +426,7 @@ export function logForeignPythinkerInTheWay(foreignPath, pm) { export function logNewCliNotOnPath(detection, pm) { const isWindows = process.platform === 'win32'; const binCmd = pmGlobalBinCommand(pm); - const reinstallCmd = pmGlobalInstallCommand(pm, '@pythoughts/pythinker-code'); + const reinstallCmd = pmGlobalInstallCommand(pm, '@pymodel/pythinker-code'); const newPathHint = isWindows ? `$env:Path = "$(${binCmd});$env:Path"` diff --git a/apps/pythinker-code/src/auth/terminal-login-ui.ts b/apps/pythinker-code/src/auth/terminal-login-ui.ts index 069de2b7..bbe0fc7f 100644 --- a/apps/pythinker-code/src/auth/terminal-login-ui.ts +++ b/apps/pythinker-code/src/auth/terminal-login-ui.ts @@ -1,6 +1,6 @@ /** * Terminal renderer for the multi-provider login flows (`runLogin` from - * `@pythoughts/pythinker-code-sdk`). + * `@pymodel/pythinker-code-sdk`). * * `pythinker login` (and `pythinker acp --login`) build a `LoginUi` backed by * `@clack/prompts`: the provider picker, API-key / redirect-URL input, model @@ -17,7 +17,7 @@ import { isCancel, log, password, select, spinner, text } from '@clack/prompts'; import { type PlatformModelInfo, type OpenPlatformDefinition, -} from '@pythoughts/pythinker-code-oauth'; +} from '@pymodel/pythinker-code-oauth'; import { buildPlatformOptions, catalogModelToAlias, @@ -36,7 +36,7 @@ import { type ModelAlias, type PlatformSelection, type PythinkerHarness, -} from '@pythoughts/pythinker-code-sdk'; +} from '@pymodel/pythinker-code-sdk'; import { BUILT_IN_CATALOG_JSON } from '#/built-in-catalog'; import type { ColorToken } from '#/tui/theme'; diff --git a/apps/pythinker-code/src/cli/goal-prompt.ts b/apps/pythinker-code/src/cli/goal-prompt.ts index 237c5c3e..1a107ecb 100644 --- a/apps/pythinker-code/src/cli/goal-prompt.ts +++ b/apps/pythinker-code/src/cli/goal-prompt.ts @@ -1,4 +1,4 @@ -import type { GoalSnapshot } from '@pythoughts/pythinker-code-sdk'; +import type { GoalSnapshot } from '@pymodel/pythinker-code-sdk'; import { parseGoalCommand } from '#/tui/commands/index'; diff --git a/apps/pythinker-code/src/cli/run-prompt.ts b/apps/pythinker-code/src/cli/run-prompt.ts index 291b06ae..cd415082 100644 --- a/apps/pythinker-code/src/cli/run-prompt.ts +++ b/apps/pythinker-code/src/cli/run-prompt.ts @@ -4,7 +4,7 @@ import { shutdownTelemetry, track, withTelemetryContext, -} from '@pythoughts/pythinker-telemetry'; +} from '@pymodel/pythinker-telemetry'; import chalk from 'chalk'; import { createPythinkerHarness, @@ -17,7 +17,7 @@ import { type Session, type SessionStatus, type TelemetryClient, -} from '@pythoughts/pythinker-code-sdk'; +} from '@pymodel/pythinker-code-sdk'; import { resolve } from 'pathe'; import { CLI_SHUTDOWN_TIMEOUT_MS } from '#/constant/app'; diff --git a/apps/pythinker-code/src/cli/run-shell.ts b/apps/pythinker-code/src/cli/run-shell.ts index 7134005d..8a4d9f9f 100644 --- a/apps/pythinker-code/src/cli/run-shell.ts +++ b/apps/pythinker-code/src/cli/run-shell.ts @@ -7,14 +7,14 @@ import { log, type PythinkerHarness, type TelemetryClient, -} from '@pythoughts/pythinker-code-sdk'; +} from '@pymodel/pythinker-code-sdk'; import { setCrashPhase, setTelemetryContext, shutdownTelemetry, track, withTelemetryContext, -} from '@pythoughts/pythinker-telemetry'; +} from '@pymodel/pythinker-telemetry'; import { CLI_SHUTDOWN_TIMEOUT_MS, CLI_UI_MODE } from '#/constant/app'; import { detectPendingMigration } from '#/migration/index'; diff --git a/apps/pythinker-code/src/cli/startup-error.ts b/apps/pythinker-code/src/cli/startup-error.ts index bcfcd4f2..6360bda0 100644 --- a/apps/pythinker-code/src/cli/startup-error.ts +++ b/apps/pythinker-code/src/cli/startup-error.ts @@ -1,4 +1,4 @@ -import { PYTHINKER_ERROR_INFO, isPythinkerError } from '@pythoughts/pythinker-code-sdk'; +import { PYTHINKER_ERROR_INFO, isPythinkerError } from '@pymodel/pythinker-code-sdk'; import { chalkStderr } from 'chalk'; import { STARTUP_ERROR_COLOR } from '#/constant/startup-error'; diff --git a/apps/pythinker-code/src/cli/sub/acp.ts b/apps/pythinker-code/src/cli/sub/acp.ts index d6b7603f..7a9c5d76 100644 --- a/apps/pythinker-code/src/cli/sub/acp.ts +++ b/apps/pythinker-code/src/cli/sub/acp.ts @@ -26,8 +26,8 @@ import { runAcpServer, type AvailableCommand, type SlashCommandsSnapshot, -} from '@pythoughts/acp-adapter'; -import { createPythinkerHarness, type Session, type SkillSummary } from '@pythoughts/pythinker-code-sdk'; +} from '@pymodel/acp-adapter'; +import { createPythinkerHarness, type Session, type SkillSummary } from '@pymodel/pythinker-code-sdk'; import { drainWritable, isBrokenPipeError, writeAndDrain } from '#/cli/output'; import { createPythinkerCodeHostIdentity, getVersion } from '#/cli/version'; diff --git a/apps/pythinker-code/src/cli/sub/dashboard.ts b/apps/pythinker-code/src/cli/sub/dashboard.ts index b3c8c4e8..7ce35d19 100644 --- a/apps/pythinker-code/src/cli/sub/dashboard.ts +++ b/apps/pythinker-code/src/cli/sub/dashboard.ts @@ -5,7 +5,7 @@ * dashboard server (auto-picking a free port by default), prints the URL, * optionally opens the browser (with an optional session deep-link), then * waits for Ctrl-C and shuts the server down. The dashboard server itself - * lives in `@pythoughts/dashboard-server`. + * lives in `@pymodel/dashboard-server`. */ import type { Command } from 'commander'; @@ -131,7 +131,7 @@ function createDefaultDashboardDeps(overrides: Partial = {}): Das overrides.startDashboardServer ?? (async (opts) => { // Dynamic import keeps the dashboard server (and Hono) out of the hot path. - const { startDashboardServer } = await import('@pythoughts/dashboard-server/start'); + const { startDashboardServer } = await import('@pymodel/dashboard-server/start'); return startDashboardServer(opts); }), // `openUrl` is a synchronous fire-and-forget; adapt it to the async dep. diff --git a/apps/pythinker-code/src/cli/sub/doctor.ts b/apps/pythinker-code/src/cli/sub/doctor.ts index 05de4920..f08896a3 100644 --- a/apps/pythinker-code/src/cli/sub/doctor.ts +++ b/apps/pythinker-code/src/cli/sub/doctor.ts @@ -9,7 +9,7 @@ import { type PythinkerConfigRpc, type PythinkerConfigValidationIssue, type RgResolution, -} from '@pythoughts/pythinker-code-sdk'; +} from '@pymodel/pythinker-code-sdk'; import type { Command } from 'commander'; import { z } from 'zod'; diff --git a/apps/pythinker-code/src/cli/sub/export.ts b/apps/pythinker-code/src/cli/sub/export.ts index cdf12451..04d81bfb 100644 --- a/apps/pythinker-code/src/cli/sub/export.ts +++ b/apps/pythinker-code/src/cli/sub/export.ts @@ -12,7 +12,7 @@ import { shutdownTelemetry, track, withTelemetryContext, -} from '@pythoughts/pythinker-telemetry'; +} from '@pymodel/pythinker-telemetry'; import { createPythinkerHarness, type ExportSessionInput, @@ -21,7 +21,7 @@ import { type SessionSummary, type ShellEnvironment, type TelemetryClient, -} from '@pythoughts/pythinker-code-sdk'; +} from '@pymodel/pythinker-code-sdk'; import type { Command } from 'commander'; import { CLI_SHUTDOWN_TIMEOUT_MS, CLI_UI_MODE } from '#/constant/app'; diff --git a/apps/pythinker-code/src/cli/sub/login-flow.ts b/apps/pythinker-code/src/cli/sub/login-flow.ts index b2993cb9..ed2d9a5c 100644 --- a/apps/pythinker-code/src/cli/sub/login-flow.ts +++ b/apps/pythinker-code/src/cli/sub/login-flow.ts @@ -11,7 +11,7 @@ * exits non-zero. */ -import { createPythinkerHarness, runLogin } from '@pythoughts/pythinker-code-sdk'; +import { createPythinkerHarness, runLogin } from '@pymodel/pythinker-code-sdk'; import { createTerminalLoginUi, UnknownProviderError } from '#/auth/terminal-login-ui'; import { writeAndDrain } from '#/cli/output'; diff --git a/apps/pythinker-code/src/cli/sub/mcp.ts b/apps/pythinker-code/src/cli/sub/mcp.ts index 165f1ce6..519fe88b 100644 --- a/apps/pythinker-code/src/cli/sub/mcp.ts +++ b/apps/pythinker-code/src/cli/sub/mcp.ts @@ -1,4 +1,4 @@ -import { runPythinkerMcpServer } from '@pythoughts/pythinker-code-sdk'; +import { runPythinkerMcpServer } from '@pymodel/pythinker-code-sdk'; import type { Command } from 'commander'; import { getVersion } from '#/cli/version'; diff --git a/apps/pythinker-code/src/cli/sub/provider.ts b/apps/pythinker-code/src/cli/sub/provider.ts index 717c769a..f6cae404 100644 --- a/apps/pythinker-code/src/cli/sub/provider.ts +++ b/apps/pythinker-code/src/cli/sub/provider.ts @@ -18,7 +18,7 @@ import { fetchCustomRegistry, type CustomRegistrySource, type PlatformConfigShape, -} from '@pythoughts/pythinker-code-oauth'; +} from '@pymodel/pythinker-code-oauth'; import { catalogConnectionWire, catalogProviderModels, @@ -32,7 +32,7 @@ import { type CatalogProviderEntry, type PythinkerConfig, type PythinkerHarness, -} from '@pythoughts/pythinker-code-sdk'; +} from '@pymodel/pythinker-code-sdk'; import type { Command } from 'commander'; import { createPythinkerCodeHostIdentity } from '#/cli/version'; diff --git a/apps/pythinker-code/src/cli/sub/server/daemon.ts b/apps/pythinker-code/src/cli/sub/server/daemon.ts index bacd1e6d..445b8e48 100644 --- a/apps/pythinker-code/src/cli/sub/server/daemon.ts +++ b/apps/pythinker-code/src/cli/sub/server/daemon.ts @@ -22,7 +22,7 @@ import { createRequire } from 'node:module'; import { createServer } from 'node:net'; import { dirname, isAbsolute, join, resolve } from 'node:path'; -import { DEFAULT_LOCK_DIR, getLiveLock, type LockContents } from '@pythoughts/server'; +import { DEFAULT_LOCK_DIR, getLiveLock, type LockContents } from '@pymodel/server'; import { DEFAULT_SERVER_HOST, diff --git a/apps/pythinker-code/src/cli/sub/server/kill.ts b/apps/pythinker-code/src/cli/sub/server/kill.ts index 6fd68a98..97286a6f 100644 --- a/apps/pythinker-code/src/cli/sub/server/kill.ts +++ b/apps/pythinker-code/src/cli/sub/server/kill.ts @@ -16,7 +16,7 @@ import type { Command } from 'commander'; -import { getLiveLock, type LockContents } from '@pythoughts/server'; +import { getLiveLock, type LockContents } from '@pymodel/server'; import { writeAndDrain } from '../../output'; import { lockConnectHost } from './daemon'; diff --git a/apps/pythinker-code/src/cli/sub/server/lifecycle.ts b/apps/pythinker-code/src/cli/sub/server/lifecycle.ts index 9e3bee3b..222f86fa 100644 --- a/apps/pythinker-code/src/cli/sub/server/lifecycle.ts +++ b/apps/pythinker-code/src/cli/sub/server/lifecycle.ts @@ -2,7 +2,7 @@ * `pythinker server install/uninstall/start/stop/restart/status`. * * Phase 2 lands the CLI shape; the lifecycle calls into the platform service - * manager from `@pythoughts/server`, which is filled in by Phase 3+. + * manager from `@pymodel/server`, which is filled in by Phase 3+. * * The Commander wiring here mirrors `addGatewayServiceCommands` from * `../openclaw/src/cli/daemon-cli/register-service-commands.ts:58`. @@ -17,7 +17,7 @@ import { type InstallArgs, type ServiceManager, type ServiceStatus, -} from '@pythoughts/server'; +} from '@pymodel/server'; import { drainWritable } from '#/cli/output'; import { openUrl as defaultOpenUrl } from '#/utils/open-url'; diff --git a/apps/pythinker-code/src/cli/sub/server/ps.ts b/apps/pythinker-code/src/cli/sub/server/ps.ts index decf80b2..335bafd7 100644 --- a/apps/pythinker-code/src/cli/sub/server/ps.ts +++ b/apps/pythinker-code/src/cli/sub/server/ps.ts @@ -9,7 +9,7 @@ import chalk from 'chalk'; import type { Command } from 'commander'; -import { getLiveLock } from '@pythoughts/server'; +import { getLiveLock } from '@pymodel/server'; import { writeAndDrain } from '../../output'; import { lockConnectHost } from './daemon'; diff --git a/apps/pythinker-code/src/cli/sub/server/run.ts b/apps/pythinker-code/src/cli/sub/server/run.ts index 69e5db0d..15913486 100644 --- a/apps/pythinker-code/src/cli/sub/server/run.ts +++ b/apps/pythinker-code/src/cli/sub/server/run.ts @@ -14,8 +14,8 @@ import { join } from 'node:path'; import { truncateToWidth, visibleWidth } from '@earendil-works/pi-tui'; -import { shutdownTelemetry, track } from '@pythoughts/pythinker-telemetry'; -import { startServer, type RunningServer } from '@pythoughts/server'; +import { shutdownTelemetry, track } from '@pymodel/pythinker-telemetry'; +import { startServer, type RunningServer } from '@pymodel/server'; import chalk from 'chalk'; import { Option, type Command } from 'commander'; diff --git a/apps/pythinker-code/src/cli/sub/server/shared.ts b/apps/pythinker-code/src/cli/sub/server/shared.ts index aeb90369..37474f1b 100644 --- a/apps/pythinker-code/src/cli/sub/server/shared.ts +++ b/apps/pythinker-code/src/cli/sub/server/shared.ts @@ -5,7 +5,7 @@ * `run`, `web`, and `status` all use. */ -import type { ServerLogLevel } from '@pythoughts/server'; +import type { ServerLogLevel } from '@pymodel/server'; export const DEFAULT_SERVER_HOST = '127.0.0.1'; export const DEFAULT_SERVER_PORT = 58627; diff --git a/apps/pythinker-code/src/cli/sub/upgrade.ts b/apps/pythinker-code/src/cli/sub/upgrade.ts index 062ba2ad..afdfaed8 100644 --- a/apps/pythinker-code/src/cli/sub/upgrade.ts +++ b/apps/pythinker-code/src/cli/sub/upgrade.ts @@ -1,5 +1,5 @@ -import { log, type Logger } from '@pythoughts/pythinker-code-sdk'; -import { track as trackTelemetry, type TelemetryProperties } from '@pythoughts/pythinker-telemetry'; +import { log, type Logger } from '@pymodel/pythinker-code-sdk'; +import { track as trackTelemetry, type TelemetryProperties } from '@pymodel/pythinker-telemetry'; import { refreshUpdateCache } from '#/cli/update/refresh'; import { tryAcquireUpdateInstallLock } from '#/cli/update/install-lock'; diff --git a/apps/pythinker-code/src/cli/telemetry.ts b/apps/pythinker-code/src/cli/telemetry.ts index 33490451..400b5a36 100644 --- a/apps/pythinker-code/src/cli/telemetry.ts +++ b/apps/pythinker-code/src/cli/telemetry.ts @@ -1,4 +1,4 @@ -import { createPythinkerDeviceId } from '@pythoughts/pythinker-code-oauth'; +import { createPythinkerDeviceId } from '@pymodel/pythinker-code-oauth'; import { loadRuntimeConfigSafe, resolveConfigPath, @@ -6,13 +6,13 @@ import { type PythinkerConfig, type PythinkerHarness, type TelemetryClient, -} from '@pythoughts/pythinker-code-sdk'; +} from '@pymodel/pythinker-code-sdk'; import { initializeTelemetry, setTelemetryContext, track, withTelemetryContext, -} from '@pythoughts/pythinker-telemetry'; +} from '@pymodel/pythinker-telemetry'; import { CLI_USER_AGENT_PRODUCT, WEB_UI_MODE } from '#/constant/app'; @@ -74,7 +74,7 @@ export interface InitializeServerTelemetryOptions { * events, …) actually leave the process carrying the enriched context * (`app_name` / `version` / `ui_mode` / `model` / platform fields). * - * The returned client wraps the `@pythoughts/pythinker-telemetry` module + * The returned client wraps the `@pymodel/pythinker-telemetry` module * functions, so the module-level `track` / `withTelemetryContext` (used to * fire the startup event) share the same underlying client + sink. */ diff --git a/apps/pythinker-code/src/cli/update/preflight.ts b/apps/pythinker-code/src/cli/update/preflight.ts index be4a281e..1e15313e 100644 --- a/apps/pythinker-code/src/cli/update/preflight.ts +++ b/apps/pythinker-code/src/cli/update/preflight.ts @@ -5,8 +5,8 @@ import type { Readable } from 'node:stream'; import { gt, gte, valid } from 'semver'; -import { log, type Logger } from '@pythoughts/pythinker-code-sdk'; -import type { TelemetryProperties } from '@pythoughts/pythinker-telemetry'; +import { log, type Logger } from '@pymodel/pythinker-code-sdk'; +import type { TelemetryProperties } from '@pymodel/pythinker-telemetry'; import { NATIVE_INSTALL_COMMAND_UNIX, diff --git a/apps/pythinker-code/src/cli/update/rollout.ts b/apps/pythinker-code/src/cli/update/rollout.ts index f546724b..d4865ffd 100644 --- a/apps/pythinker-code/src/cli/update/rollout.ts +++ b/apps/pythinker-code/src/cli/update/rollout.ts @@ -2,8 +2,8 @@ import { createHash, randomUUID } from 'node:crypto'; import { appendFile, mkdir, stat, writeFile } from 'node:fs/promises'; import { dirname } from 'node:path'; -import { readPythinkerDeviceId } from '@pythoughts/pythinker-code-oauth'; -import { resolvePythinkerHome } from '@pythoughts/pythinker-code-sdk'; +import { readPythinkerDeviceId } from '@pymodel/pythinker-code-oauth'; +import { resolvePythinkerHome } from '@pymodel/pythinker-code-sdk'; import { getUpdateRolloutLogFile } from '#/utils/paths'; diff --git a/apps/pythinker-code/src/cli/version.ts b/apps/pythinker-code/src/cli/version.ts index 873d942d..0305a3ce 100644 --- a/apps/pythinker-code/src/cli/version.ts +++ b/apps/pythinker-code/src/cli/version.ts @@ -7,7 +7,7 @@ import { existsSync, readFileSync } from 'node:fs'; import { dirname, resolve } from 'node:path'; -import { createPythinkerDefaultHeaders, type PythinkerHostIdentity } from '@pythoughts/pythinker-code-oauth'; +import { createPythinkerDefaultHeaders, type PythinkerHostIdentity } from '@pymodel/pythinker-code-oauth'; import { CLI_USER_AGENT_PRODUCT } from '#/constant/app'; diff --git a/apps/pythinker-code/src/constant/app.ts b/apps/pythinker-code/src/constant/app.ts index 7802a258..1a040824 100644 --- a/apps/pythinker-code/src/constant/app.ts +++ b/apps/pythinker-code/src/constant/app.ts @@ -1,4 +1,4 @@ -import { ErrorCodes } from '@pythoughts/pythinker-code-sdk'; +import { ErrorCodes } from '@pymodel/pythinker-code-sdk'; export const PRODUCT_NAME = 'Pythinker'; export const CLI_COMMAND_NAME = 'pythinker'; @@ -15,7 +15,7 @@ export const WEB_UI_MODE = 'web'; export const CLI_SHUTDOWN_TIMEOUT_MS = 3000; // Published npm package name; this can differ from the executable command. -export const NPM_PACKAGE_NAME = '@pythoughts/pythinker-code'; +export const NPM_PACKAGE_NAME = '@pymodel/pythinker-code'; // App-owned data paths. SDK/core runtime config is intentionally not routed here. export const PYTHINKER_CODE_HOME_ENV = 'PYTHINKER_CODE_HOME'; diff --git a/apps/pythinker-code/src/main.ts b/apps/pythinker-code/src/main.ts index 1c797191..0db0206e 100644 --- a/apps/pythinker-code/src/main.ts +++ b/apps/pythinker-code/src/main.ts @@ -13,14 +13,14 @@ import { resolveGlobalLogPath, resolvePythinkerHome, type TelemetryClient, -} from '@pythoughts/pythinker-code-sdk'; +} from '@pymodel/pythinker-code-sdk'; import { installCrashHandlers, setTelemetryContext, shutdownTelemetry, track, withTelemetryContext, -} from '@pythoughts/pythinker-telemetry'; +} from '@pymodel/pythinker-telemetry'; import { createProgram } from './cli/commands'; import type { CLIOptions } from './cli/options'; diff --git a/apps/pythinker-code/src/migration/detect-pending.ts b/apps/pythinker-code/src/migration/detect-pending.ts index 94690553..58cec5e0 100644 --- a/apps/pythinker-code/src/migration/detect-pending.ts +++ b/apps/pythinker-code/src/migration/detect-pending.ts @@ -6,7 +6,7 @@ import { existsSync, readFileSync } from 'node:fs'; import { join, resolve } from 'node:path'; -import { detectMigration, type MigrationPlan } from '@pythoughts/migration-legacy'; +import { detectMigration, type MigrationPlan } from '@pymodel/migration-legacy'; export interface DetectPendingInput { readonly sourceHome: string; diff --git a/apps/pythinker-code/src/migration/index.ts b/apps/pythinker-code/src/migration/index.ts index 3c01575d..565b77c7 100644 --- a/apps/pythinker-code/src/migration/index.ts +++ b/apps/pythinker-code/src/migration/index.ts @@ -4,7 +4,7 @@ * Removable glue: the `pythinker migrate` sub-command, the first-launch detection, * the native pi-tui migration screen, and the session-picker `[imported]` * badge helper. Migration logic itself lives in - * `@pythoughts/migration-legacy`. + * `@pymodel/migration-legacy`. */ export { registerMigrateCommand } from './command'; export { formatSessionLabel, isImportedSession, type SessionLabelInput } from './badge'; diff --git a/apps/pythinker-code/src/migration/migration-screen.ts b/apps/pythinker-code/src/migration/migration-screen.ts index 158d81f7..afa0d45d 100644 --- a/apps/pythinker-code/src/migration/migration-screen.ts +++ b/apps/pythinker-code/src/migration/migration-screen.ts @@ -27,7 +27,7 @@ import { type Prompt1Choice, type Prompt2Choice, type RunMigrationInput, -} from '@pythoughts/migration-legacy'; +} from '@pymodel/migration-legacy'; type Phase = 'ask1' | 'ask2' | 'progress' | 'result'; @@ -286,8 +286,7 @@ export class MigrationScreenComponent extends Container implements Focusable { if (this.migrationFailureReason !== undefined) { lines.push('', chalk.hex(colors.text)(` Reason: ${this.migrationFailureReason}`)); } - lines.push('', chalk.hex(colors.text)(' You can retry later by running "pythinker migrate".'), '', chalk.hex(colors.textMuted)(' ⏎ continue to pythinker-code')); - lines.push(chalk.hex(colors.primary)('─'.repeat(width))); + lines.push('', chalk.hex(colors.text)(' You can retry later by running "pythinker migrate".'), '', chalk.hex(colors.textMuted)(' ⏎ continue to pythinker-code'), chalk.hex(colors.primary)('─'.repeat(width))); return lines.map((l) => truncateToWidth(l, width)); } const r = this.report; diff --git a/apps/pythinker-code/src/tui/commands/agents.ts b/apps/pythinker-code/src/tui/commands/agents.ts index 05e6035a..3049ecce 100644 --- a/apps/pythinker-code/src/tui/commands/agents.ts +++ b/apps/pythinker-code/src/tui/commands/agents.ts @@ -1,6 +1,6 @@ import type { AgentProfileSummary, -} from '@pythoughts/pythinker-code-sdk'; +} from '@pymodel/pythinker-code-sdk'; import { ChoicePickerComponent } from '../components/dialogs/choice-picker'; import { formatErrorMessage } from '../utils/event-payload'; diff --git a/apps/pythinker-code/src/tui/commands/auth.ts b/apps/pythinker-code/src/tui/commands/auth.ts index f18cadb7..86c795c7 100644 --- a/apps/pythinker-code/src/tui/commands/auth.ts +++ b/apps/pythinker-code/src/tui/commands/auth.ts @@ -3,7 +3,7 @@ import { runLogin, type CatalogProviderEntry, type LoginUi, -} from '@pythoughts/pythinker-code-sdk'; +} from '@pymodel/pythinker-code-sdk'; import type { ChoiceOption } from '../components/dialogs/choice-picker'; import { diff --git a/apps/pythinker-code/src/tui/commands/config.ts b/apps/pythinker-code/src/tui/commands/config.ts index c637f383..7352f4c7 100644 --- a/apps/pythinker-code/src/tui/commands/config.ts +++ b/apps/pythinker-code/src/tui/commands/config.ts @@ -10,9 +10,9 @@ import type { PythinkerConfig, Session, WorkspaceDirectory, -} from '@pythoughts/pythinker-code-sdk'; -import { coerceEffortForModel, effortLevelsForModel } from '@pythoughts/pythinker-code-sdk'; -import { disableTelemetry } from '@pythoughts/pythinker-telemetry'; +} from '@pymodel/pythinker-code-sdk'; +import { coerceEffortForModel, effortLevelsForModel } from '@pymodel/pythinker-code-sdk'; +import { disableTelemetry } from '@pymodel/pythinker-telemetry'; import { ApiKeyInputDialogComponent } from '../components/dialogs/api-key-input-dialog'; import { ChoicePickerComponent } from '../components/dialogs/choice-picker'; diff --git a/apps/pythinker-code/src/tui/commands/debug.ts b/apps/pythinker-code/src/tui/commands/debug.ts index eb8abd51..04173a6a 100644 --- a/apps/pythinker-code/src/tui/commands/debug.ts +++ b/apps/pythinker-code/src/tui/commands/debug.ts @@ -5,7 +5,7 @@ import { enableDiagnosticDebugLogging, flushDiagnosticLogs, resolveGlobalLogPath, -} from '@pythoughts/pythinker-code-sdk'; +} from '@pymodel/pythinker-code-sdk'; import { LLM_NOT_SET_MESSAGE } from '../constant/pythinker-tui'; import type { SlashCommandHost } from './dispatch'; diff --git a/apps/pythinker-code/src/tui/commands/diff.ts b/apps/pythinker-code/src/tui/commands/diff.ts index bb032780..a8cdd628 100644 --- a/apps/pythinker-code/src/tui/commands/diff.ts +++ b/apps/pythinker-code/src/tui/commands/diff.ts @@ -1,7 +1,7 @@ import type { WorkingTreeChange, WorkingTreeFileDiff, -} from '@pythoughts/pythinker-code-sdk'; +} from '@pymodel/pythinker-code-sdk'; import { ChoicePickerComponent } from '../components/dialogs/choice-picker'; import { UsagePanelComponent } from '../components/messages/usage-panel'; diff --git a/apps/pythinker-code/src/tui/commands/dispatch.ts b/apps/pythinker-code/src/tui/commands/dispatch.ts index aacef9ef..beb418eb 100644 --- a/apps/pythinker-code/src/tui/commands/dispatch.ts +++ b/apps/pythinker-code/src/tui/commands/dispatch.ts @@ -1,5 +1,5 @@ import type { Component, Focusable } from '@earendil-works/pi-tui'; -import type { PythinkerHarness, Session } from '@pythoughts/pythinker-code-sdk'; +import type { PythinkerHarness, Session } from '@pymodel/pythinker-code-sdk'; import type { ColorToken, ThemeName } from '#/tui/theme'; import { performHeapDump } from '#/utils/heap-dump'; diff --git a/apps/pythinker-code/src/tui/commands/dynamic-workflow.ts b/apps/pythinker-code/src/tui/commands/dynamic-workflow.ts index ccfe0bc2..260d3190 100644 --- a/apps/pythinker-code/src/tui/commands/dynamic-workflow.ts +++ b/apps/pythinker-code/src/tui/commands/dynamic-workflow.ts @@ -3,7 +3,7 @@ import { writeSavedWorkflowSkill, type PermissionMode, type SavedWorkflowScope, -} from '@pythoughts/pythinker-code-sdk'; +} from '@pymodel/pythinker-code-sdk'; import { getDataDir } from '#/utils/paths'; import { diff --git a/apps/pythinker-code/src/tui/commands/experimental-flags.ts b/apps/pythinker-code/src/tui/commands/experimental-flags.ts index 33ea756e..ba54de08 100644 --- a/apps/pythinker-code/src/tui/commands/experimental-flags.ts +++ b/apps/pythinker-code/src/tui/commands/experimental-flags.ts @@ -1,4 +1,4 @@ -import type { ExperimentalFeatureState, ExperimentalFlagMap } from '@pythoughts/pythinker-code-sdk'; +import type { ExperimentalFeatureState, ExperimentalFlagMap } from '@pymodel/pythinker-code-sdk'; import { experimentalFeatureMap } from '#/utils/experimental-features'; diff --git a/apps/pythinker-code/src/tui/commands/goal.ts b/apps/pythinker-code/src/tui/commands/goal.ts index 72ca52eb..0eaa208e 100644 --- a/apps/pythinker-code/src/tui/commands/goal.ts +++ b/apps/pythinker-code/src/tui/commands/goal.ts @@ -1,4 +1,4 @@ -import { ErrorCodes, isPythinkerError, type PermissionMode } from '@pythoughts/pythinker-code-sdk'; +import { ErrorCodes, isPythinkerError, type PermissionMode } from '@pymodel/pythinker-code-sdk'; import { GoalStartPermissionPromptComponent, diff --git a/apps/pythinker-code/src/tui/commands/info.ts b/apps/pythinker-code/src/tui/commands/info.ts index 08859eef..695238f4 100644 --- a/apps/pythinker-code/src/tui/commands/info.ts +++ b/apps/pythinker-code/src/tui/commands/info.ts @@ -5,7 +5,7 @@ import type { PythinkerConfig, SessionStatus, SessionUsage, -} from '@pythoughts/pythinker-code-sdk'; +} from '@pymodel/pythinker-code-sdk'; import { handleDoctor } from '#/cli/sub/doctor'; import { startManualUpdate } from '#/cli/update/preflight'; diff --git a/apps/pythinker-code/src/tui/commands/plugins.ts b/apps/pythinker-code/src/tui/commands/plugins.ts index d6007e33..6ea7ed67 100644 --- a/apps/pythinker-code/src/tui/commands/plugins.ts +++ b/apps/pythinker-code/src/tui/commands/plugins.ts @@ -5,7 +5,7 @@ import type { PluginInfo, PluginInstallOptions, PluginSummary, -} from '@pythoughts/pythinker-code-sdk'; +} from '@pymodel/pythinker-code-sdk'; import { ANTHROPIC_PLUGIN_MARKETPLACE_ALIAS, diff --git a/apps/pythinker-code/src/tui/commands/prompts.ts b/apps/pythinker-code/src/tui/commands/prompts.ts index 2aae3e44..4927bd5b 100644 --- a/apps/pythinker-code/src/tui/commands/prompts.ts +++ b/apps/pythinker-code/src/tui/commands/prompts.ts @@ -11,11 +11,11 @@ import { type CatalogModel, type ModelAlias, type PlatformSelection, -} from '@pythoughts/pythinker-code-sdk'; +} from '@pymodel/pythinker-code-sdk'; import type { PlatformModelInfo, OpenPlatformDefinition, -} from '@pythoughts/pythinker-code-oauth'; +} from '@pymodel/pythinker-code-oauth'; import { ApiKeyInputDialogComponent, type ApiKeyInputResult } from '../components/dialogs/api-key-input-dialog'; import { ChoicePickerComponent, type ChoiceOption } from '../components/dialogs/choice-picker'; diff --git a/apps/pythinker-code/src/tui/commands/provider.ts b/apps/pythinker-code/src/tui/commands/provider.ts index d4271255..7f106af2 100644 --- a/apps/pythinker-code/src/tui/commands/provider.ts +++ b/apps/pythinker-code/src/tui/commands/provider.ts @@ -3,13 +3,13 @@ import { fetchCustomRegistry, type CustomRegistrySource, type PlatformConfigShape, -} from '@pythoughts/pythinker-code-oauth'; +} from '@pymodel/pythinker-code-oauth'; import { CatalogFetchError, DEFAULT_CATALOG_URL, fetchCatalog, type Catalog, -} from '@pythoughts/pythinker-code-sdk'; +} from '@pymodel/pythinker-code-sdk'; import { ChoicePickerComponent } from '../components/dialogs/choice-picker'; import { diff --git a/apps/pythinker-code/src/tui/commands/reload.ts b/apps/pythinker-code/src/tui/commands/reload.ts index 9cad0a16..e51e1500 100644 --- a/apps/pythinker-code/src/tui/commands/reload.ts +++ b/apps/pythinker-code/src/tui/commands/reload.ts @@ -1,4 +1,4 @@ -import type { PythinkerConfig } from '@pythoughts/pythinker-code-sdk'; +import type { PythinkerConfig } from '@pymodel/pythinker-code-sdk'; import { currentTheme, lightColors } from '#/tui/theme'; import { loadTuiConfig, type TuiConfig } from '../config'; diff --git a/apps/pythinker-code/src/tui/commands/session.ts b/apps/pythinker-code/src/tui/commands/session.ts index 09e5255f..832452d8 100644 --- a/apps/pythinker-code/src/tui/commands/session.ts +++ b/apps/pythinker-code/src/tui/commands/session.ts @@ -2,7 +2,7 @@ import { mkdir, writeFile } from 'node:fs/promises'; import { dirname, resolve } from 'node:path'; import { pathToFileURL } from 'node:url'; -import type { Session } from '@pythoughts/pythinker-code-sdk'; +import type { Session } from '@pymodel/pythinker-code-sdk'; import { detectInstallSource } from '#/cli/update/source'; import { detectShellEnvironment } from '#/utils/process/shell-env'; diff --git a/apps/pythinker-code/src/tui/commands/skills.ts b/apps/pythinker-code/src/tui/commands/skills.ts index 6452df50..085ac049 100644 --- a/apps/pythinker-code/src/tui/commands/skills.ts +++ b/apps/pythinker-code/src/tui/commands/skills.ts @@ -2,14 +2,14 @@ import { buildSkillSlashCommands, isUserActivatableSkill, type Session, -} from '@pythoughts/pythinker-code-sdk'; +} from '@pymodel/pythinker-code-sdk'; import { NO_ACTIVE_SESSION_MESSAGE } from '../constant/pythinker-tui'; import type { SlashCommandHost } from './dispatch'; export type SkillListSession = Pick; -export type { SkillSlashCommands } from '@pythoughts/pythinker-code-sdk'; +export type { SkillSlashCommands } from '@pymodel/pythinker-code-sdk'; export { buildSkillSlashCommands, isUserActivatableSkill }; export async function handleSkillsCommand( diff --git a/apps/pythinker-code/src/tui/commands/types.ts b/apps/pythinker-code/src/tui/commands/types.ts index 3f0cf734..0a4bfcc4 100644 --- a/apps/pythinker-code/src/tui/commands/types.ts +++ b/apps/pythinker-code/src/tui/commands/types.ts @@ -1,5 +1,5 @@ import type { AutocompleteItem, SlashCommand } from '@earendil-works/pi-tui'; -import type { FlagId } from '@pythoughts/pythinker-code-sdk'; +import type { FlagId } from '@pymodel/pythinker-code-sdk'; export type SlashCommandAvailability = 'always' | 'idle-only'; diff --git a/apps/pythinker-code/src/tui/commands/undo.ts b/apps/pythinker-code/src/tui/commands/undo.ts index 107a189d..2c66b969 100644 --- a/apps/pythinker-code/src/tui/commands/undo.ts +++ b/apps/pythinker-code/src/tui/commands/undo.ts @@ -5,8 +5,8 @@ import type { PartialCompactionDirection, RestoreFileCheckpointResult, SessionFileCheckpointPreview, -} from '@pythoughts/pythinker-code-sdk'; -import { isPythinkerError } from '@pythoughts/pythinker-code-sdk'; +} from '@pymodel/pythinker-code-sdk'; +import { isPythinkerError } from '@pymodel/pythinker-code-sdk'; import { WelcomeComponent } from '../components/chrome/welcome'; import { ChoicePickerComponent, type ChoiceOption } from '../components/dialogs/choice-picker'; diff --git a/apps/pythinker-code/src/tui/commands/workflow-availability.ts b/apps/pythinker-code/src/tui/commands/workflow-availability.ts index b063b32f..98baf2dd 100644 --- a/apps/pythinker-code/src/tui/commands/workflow-availability.ts +++ b/apps/pythinker-code/src/tui/commands/workflow-availability.ts @@ -1,7 +1,7 @@ import { resolveWorkflowSizeGuideline, type WorkflowSizeGuideline, -} from '@pythoughts/pythinker-code-sdk'; +} from '@pymodel/pythinker-code-sdk'; const DISABLE_WORKFLOWS_ENV = 'PYTHINKER_CODE_DISABLE_WORKFLOWS'; const TRUE_ENV_VALUES = new Set(['1', 'true', 'yes', 'on']); diff --git a/apps/pythinker-code/src/tui/components/dialogs/experiments-selector.ts b/apps/pythinker-code/src/tui/components/dialogs/experiments-selector.ts index 81427a24..36566bf2 100644 --- a/apps/pythinker-code/src/tui/components/dialogs/experiments-selector.ts +++ b/apps/pythinker-code/src/tui/components/dialogs/experiments-selector.ts @@ -6,7 +6,7 @@ import { visibleWidth, type Focusable, } from '@earendil-works/pi-tui'; -import type { ExperimentalFeatureState } from '@pythoughts/pythinker-code-sdk'; +import type { ExperimentalFeatureState } from '@pymodel/pythinker-code-sdk'; import { SELECT_POINTER } from '#/tui/constant/symbols'; import { combinedBindingHint, formatBindingKeys } from '#/tui/components/dialogs/choice-picker'; diff --git a/apps/pythinker-code/src/tui/components/dialogs/model-selector.ts b/apps/pythinker-code/src/tui/components/dialogs/model-selector.ts index 45dc5a76..92a9802d 100644 --- a/apps/pythinker-code/src/tui/components/dialogs/model-selector.ts +++ b/apps/pythinker-code/src/tui/components/dialogs/model-selector.ts @@ -3,7 +3,7 @@ import { effortLevelsForModel, thinkingAvailability, type ModelAlias, -} from '@pythoughts/pythinker-code-sdk'; +} from '@pymodel/pythinker-code-sdk'; import { Container, Key, diff --git a/apps/pythinker-code/src/tui/components/dialogs/permission-selector.ts b/apps/pythinker-code/src/tui/components/dialogs/permission-selector.ts index efd9c16b..638c68a5 100644 --- a/apps/pythinker-code/src/tui/components/dialogs/permission-selector.ts +++ b/apps/pythinker-code/src/tui/components/dialogs/permission-selector.ts @@ -1,4 +1,4 @@ -import type { PermissionMode } from '@pythoughts/pythinker-code-sdk'; +import type { PermissionMode } from '@pymodel/pythinker-code-sdk'; import { ChoicePickerComponent, type ChoiceOption } from './choice-picker'; diff --git a/apps/pythinker-code/src/tui/components/dialogs/platform-selector.ts b/apps/pythinker-code/src/tui/components/dialogs/platform-selector.ts index d398700c..fd012817 100644 --- a/apps/pythinker-code/src/tui/components/dialogs/platform-selector.ts +++ b/apps/pythinker-code/src/tui/components/dialogs/platform-selector.ts @@ -1,5 +1,5 @@ -import { buildPlatformOptions } from '@pythoughts/pythinker-code-sdk'; -import type { Catalog } from '@pythoughts/pythinker-code-sdk'; +import { buildPlatformOptions } from '@pymodel/pythinker-code-sdk'; +import type { Catalog } from '@pymodel/pythinker-code-sdk'; import { ChoicePickerComponent } from './choice-picker'; diff --git a/apps/pythinker-code/src/tui/components/dialogs/plugins-selector.ts b/apps/pythinker-code/src/tui/components/dialogs/plugins-selector.ts index 9e107a7d..a1ef86e0 100644 --- a/apps/pythinker-code/src/tui/components/dialogs/plugins-selector.ts +++ b/apps/pythinker-code/src/tui/components/dialogs/plugins-selector.ts @@ -7,7 +7,7 @@ import { visibleWidth, type Focusable, } from '@earendil-works/pi-tui'; -import type { PluginInfo, PluginMcpServerInfo, PluginSummary } from '@pythoughts/pythinker-code-sdk'; +import type { PluginInfo, PluginMcpServerInfo, PluginSummary } from '@pymodel/pythinker-code-sdk'; import { SELECT_POINTER } from '#/tui/constant/symbols'; import { diff --git a/apps/pythinker-code/src/tui/components/dialogs/provider-manager.ts b/apps/pythinker-code/src/tui/components/dialogs/provider-manager.ts index 7820bedb..4406004d 100644 --- a/apps/pythinker-code/src/tui/components/dialogs/provider-manager.ts +++ b/apps/pythinker-code/src/tui/components/dialogs/provider-manager.ts @@ -29,12 +29,12 @@ * `setOptions`. */ -import type { ProviderConfig } from '@pythoughts/pythinker-code-sdk'; +import type { ProviderConfig } from '@pymodel/pythinker-code-sdk'; import { getOpenPlatformById, isOpenPlatformId, type CustomRegistrySource, -} from '@pythoughts/pythinker-code-oauth'; +} from '@pymodel/pythinker-code-oauth'; import { Container, Key, diff --git a/apps/pythinker-code/src/tui/components/dialogs/tabbed-model-selector.ts b/apps/pythinker-code/src/tui/components/dialogs/tabbed-model-selector.ts index 3da64696..73c77629 100644 --- a/apps/pythinker-code/src/tui/components/dialogs/tabbed-model-selector.ts +++ b/apps/pythinker-code/src/tui/components/dialogs/tabbed-model-selector.ts @@ -13,7 +13,7 @@ * AskUserQuestion dialog's tab strip) — see .agents/skills/write-tui/DESIGN.md. */ -import type { ModelAlias } from '@pythoughts/pythinker-code-sdk'; +import type { ModelAlias } from '@pymodel/pythinker-code-sdk'; import { Container, truncateToWidth, diff --git a/apps/pythinker-code/src/tui/components/dialogs/task-output-viewer.ts b/apps/pythinker-code/src/tui/components/dialogs/task-output-viewer.ts index a0ffcbea..74ca5328 100644 --- a/apps/pythinker-code/src/tui/components/dialogs/task-output-viewer.ts +++ b/apps/pythinker-code/src/tui/components/dialogs/task-output-viewer.ts @@ -18,7 +18,7 @@ import { visibleWidth, type Focusable, } from '@earendil-works/pi-tui'; -import type { BackgroundTaskInfo, BackgroundTaskStatus } from '@pythoughts/pythinker-code-sdk'; +import type { BackgroundTaskInfo, BackgroundTaskStatus } from '@pymodel/pythinker-code-sdk'; import { currentTheme } from '#/tui/theme'; import { printableChar } from '@/tui/utils/printable-key'; diff --git a/apps/pythinker-code/src/tui/components/dialogs/tasks-browser.ts b/apps/pythinker-code/src/tui/components/dialogs/tasks-browser.ts index d9da395d..e1a9574b 100644 --- a/apps/pythinker-code/src/tui/components/dialogs/tasks-browser.ts +++ b/apps/pythinker-code/src/tui/components/dialogs/tasks-browser.ts @@ -22,7 +22,7 @@ import { visibleWidth, type Focusable, } from '@earendil-works/pi-tui'; -import type { BackgroundTaskInfo, BackgroundTaskStatus } from '@pythoughts/pythinker-code-sdk'; +import type { BackgroundTaskInfo, BackgroundTaskStatus } from '@pymodel/pythinker-code-sdk'; import { SELECT_POINTER } from '@/tui/constant/symbols'; import { combinedBindingHint, formatBindingKeys } from '#/tui/components/dialogs/choice-picker'; diff --git a/apps/pythinker-code/src/tui/components/dialogs/undo-selector.ts b/apps/pythinker-code/src/tui/components/dialogs/undo-selector.ts index 9e86dd31..a5cd80d7 100644 --- a/apps/pythinker-code/src/tui/components/dialogs/undo-selector.ts +++ b/apps/pythinker-code/src/tui/components/dialogs/undo-selector.ts @@ -7,7 +7,7 @@ import { visibleWidth, type Focusable, } from '@earendil-works/pi-tui'; -import type { PartialCompactionDirection } from '@pythoughts/pythinker-code-sdk'; +import type { PartialCompactionDirection } from '@pymodel/pythinker-code-sdk'; import { SELECT_POINTER } from '#/tui/constant/symbols'; import { diff --git a/apps/pythinker-code/src/tui/components/messages/goal-markers.ts b/apps/pythinker-code/src/tui/components/messages/goal-markers.ts index af49079e..eca5c1e5 100644 --- a/apps/pythinker-code/src/tui/components/messages/goal-markers.ts +++ b/apps/pythinker-code/src/tui/components/messages/goal-markers.ts @@ -8,7 +8,7 @@ */ import { truncateToWidth, type Component } from '@earendil-works/pi-tui'; -import type { GoalChange } from '@pythoughts/pythinker-code-sdk'; +import type { GoalChange } from '@pymodel/pythinker-code-sdk'; import { STATUS_BULLET } from '#/tui/constant/symbols'; import { currentTheme } from '#/tui/theme'; diff --git a/apps/pythinker-code/src/tui/components/messages/goal-panel.ts b/apps/pythinker-code/src/tui/components/messages/goal-panel.ts index e58a811b..a42baf5c 100644 --- a/apps/pythinker-code/src/tui/components/messages/goal-panel.ts +++ b/apps/pythinker-code/src/tui/components/messages/goal-panel.ts @@ -20,7 +20,7 @@ import { wrapTextWithAnsi, type Component, } from '@earendil-works/pi-tui'; -import type { GoalSnapshot, GoalStatus } from '@pythoughts/pythinker-code-sdk'; +import type { GoalSnapshot, GoalStatus } from '@pymodel/pythinker-code-sdk'; import { MESSAGE_INDENT } from '#/tui/constant/rendering'; import { STATUS_BULLET } from '#/tui/constant/symbols'; diff --git a/apps/pythinker-code/src/tui/components/messages/mcp-status-panel.ts b/apps/pythinker-code/src/tui/components/messages/mcp-status-panel.ts index 9b32ea9c..c9a2402c 100644 --- a/apps/pythinker-code/src/tui/components/messages/mcp-status-panel.ts +++ b/apps/pythinker-code/src/tui/components/messages/mcp-status-panel.ts @@ -1,4 +1,4 @@ -import type { McpServerInfo } from '@pythoughts/pythinker-code-sdk'; +import type { McpServerInfo } from '@pymodel/pythinker-code-sdk'; import { currentTheme } from '#/tui/theme'; diff --git a/apps/pythinker-code/src/tui/components/messages/plugins-status-panel.ts b/apps/pythinker-code/src/tui/components/messages/plugins-status-panel.ts index f375e2ad..3eb44f12 100644 --- a/apps/pythinker-code/src/tui/components/messages/plugins-status-panel.ts +++ b/apps/pythinker-code/src/tui/components/messages/plugins-status-panel.ts @@ -1,4 +1,4 @@ -import type { PluginInfo, PluginSummary } from '@pythoughts/pythinker-code-sdk'; +import type { PluginInfo, PluginSummary } from '@pymodel/pythinker-code-sdk'; import { currentTheme } from '#/tui/theme'; import { diff --git a/apps/pythinker-code/src/tui/components/messages/status-panel.ts b/apps/pythinker-code/src/tui/components/messages/status-panel.ts index 64e39b26..205d0fb6 100644 --- a/apps/pythinker-code/src/tui/components/messages/status-panel.ts +++ b/apps/pythinker-code/src/tui/components/messages/status-panel.ts @@ -5,7 +5,7 @@ * separate from the TUI orchestration layer. */ -import type { ModelAlias, PermissionMode, SessionStatus } from '@pythoughts/pythinker-code-sdk'; +import type { ModelAlias, PermissionMode, SessionStatus } from '@pymodel/pythinker-code-sdk'; import { PRODUCT_NAME } from '#/constant/app'; import { currentTheme } from '#/tui/theme'; diff --git a/apps/pythinker-code/src/tui/components/messages/tool-call.ts b/apps/pythinker-code/src/tui/components/messages/tool-call.ts index b8f3ca51..1a93f858 100644 --- a/apps/pythinker-code/src/tui/components/messages/tool-call.ts +++ b/apps/pythinker-code/src/tui/components/messages/tool-call.ts @@ -30,7 +30,7 @@ import { FAILURE_MARK, STATUS_BULLET, SUCCESS_MARK } from '#/tui/constant/symbol import { currentTheme } from '#/tui/theme'; import { createPythinkerMarkdownTheme } from '#/tui/theme'; import type { ToolCallBlockData, ToolResultBlockData } from '#/tui/types'; -import type { TokenUsage } from '@pythoughts/pythinker-code-sdk'; +import type { TokenUsage } from '@pymodel/pythinker-code-sdk'; import { appendStreamingArgsPreview } from '#/tui/utils/event-payload'; import { decodeMcpToolName } from '#/tui/utils/mcp-tool-name'; import { formatTokenCount } from '#/utils/usage/usage-format'; diff --git a/apps/pythinker-code/src/tui/components/messages/usage-panel.ts b/apps/pythinker-code/src/tui/components/messages/usage-panel.ts index 743ca23e..3975fe58 100644 --- a/apps/pythinker-code/src/tui/components/messages/usage-panel.ts +++ b/apps/pythinker-code/src/tui/components/messages/usage-panel.ts @@ -11,7 +11,7 @@ import type { ModelCostRates, SessionUsage, TokenUsage, -} from '@pythoughts/pythinker-code-sdk'; +} from '@pymodel/pythinker-code-sdk'; import { formatTokenCount, diff --git a/apps/pythinker-code/src/tui/controllers/auth-flow.ts b/apps/pythinker-code/src/tui/controllers/auth-flow.ts index 065cad01..6467fd47 100644 --- a/apps/pythinker-code/src/tui/controllers/auth-flow.ts +++ b/apps/pythinker-code/src/tui/controllers/auth-flow.ts @@ -2,7 +2,7 @@ import { coerceEffortForModel, type PythinkerHarness, type Session, -} from '@pythoughts/pythinker-code-sdk'; +} from '@pymodel/pythinker-code-sdk'; import type { SkillListSession } from '../commands'; import { OAUTH_LOGIN_REQUIRED_STARTUP_NOTICE } from '../constant/pythinker-tui'; diff --git a/apps/pythinker-code/src/tui/controllers/btw-panel.ts b/apps/pythinker-code/src/tui/controllers/btw-panel.ts index 70cad97a..1667b337 100644 --- a/apps/pythinker-code/src/tui/controllers/btw-panel.ts +++ b/apps/pythinker-code/src/tui/controllers/btw-panel.ts @@ -4,7 +4,7 @@ import type { PythinkerHarness, Session, TurnEndedEvent, -} from '@pythoughts/pythinker-code-sdk'; +} from '@pymodel/pythinker-code-sdk'; import { NO_ACTIVE_SESSION_MESSAGE } from '../constant/pythinker-tui'; import { BtwPanelComponent } from '../components/panes/btw-panel'; diff --git a/apps/pythinker-code/src/tui/controllers/editor-keyboard.ts b/apps/pythinker-code/src/tui/controllers/editor-keyboard.ts index dbfafc7b..b40c843d 100644 --- a/apps/pythinker-code/src/tui/controllers/editor-keyboard.ts +++ b/apps/pythinker-code/src/tui/controllers/editor-keyboard.ts @@ -4,7 +4,7 @@ import { effortLevelsForModel, type PythinkerHarness, type Session, -} from '@pythoughts/pythinker-code-sdk'; +} from '@pymodel/pythinker-code-sdk'; import { ClipboardMediaError, readClipboardMedia } from '#/utils/clipboard/clipboard-image'; import { parseImageMeta } from '#/utils/image/image-mime'; diff --git a/apps/pythinker-code/src/tui/controllers/session-event-handler.ts b/apps/pythinker-code/src/tui/controllers/session-event-handler.ts index 474e41a1..b6fd0744 100644 --- a/apps/pythinker-code/src/tui/controllers/session-event-handler.ts +++ b/apps/pythinker-code/src/tui/controllers/session-event-handler.ts @@ -29,7 +29,7 @@ import type { TurnStepInterruptedEvent, TurnStepStartedEvent, WarningEvent, -} from '@pythoughts/pythinker-code-sdk'; +} from '@pymodel/pythinker-code-sdk'; import { ActivityLoader } from '../components/chrome/activity-loader'; import { buildGoalMarker } from '../components/messages/goal-markers'; diff --git a/apps/pythinker-code/src/tui/controllers/session-replay.ts b/apps/pythinker-code/src/tui/controllers/session-replay.ts index d8d16735..0262362f 100644 --- a/apps/pythinker-code/src/tui/controllers/session-replay.ts +++ b/apps/pythinker-code/src/tui/controllers/session-replay.ts @@ -7,7 +7,7 @@ import type { ResumedAgentState, Session, ToolCall, -} from '@pythoughts/pythinker-code-sdk'; +} from '@pymodel/pythinker-code-sdk'; import { ToolCallComponent } from '../components/messages/tool-call'; import type { diff --git a/apps/pythinker-code/src/tui/controllers/streaming-ui.ts b/apps/pythinker-code/src/tui/controllers/streaming-ui.ts index f14edb4c..5e39e401 100644 --- a/apps/pythinker-code/src/tui/controllers/streaming-ui.ts +++ b/apps/pythinker-code/src/tui/controllers/streaming-ui.ts @@ -1,4 +1,4 @@ -import type { Session } from '@pythoughts/pythinker-code-sdk'; +import type { Session } from '@pymodel/pythinker-code-sdk'; import { AgentGroupComponent } from '../components/messages/agent-group'; import { AssistantMessageComponent } from '../components/messages/assistant-message'; diff --git a/apps/pythinker-code/src/tui/controllers/subagent-event-handler.ts b/apps/pythinker-code/src/tui/controllers/subagent-event-handler.ts index d20b3ad4..a4909282 100644 --- a/apps/pythinker-code/src/tui/controllers/subagent-event-handler.ts +++ b/apps/pythinker-code/src/tui/controllers/subagent-event-handler.ts @@ -1,7 +1,7 @@ import type { BackgroundTaskInfo, Event, -} from '@pythoughts/pythinker-code-sdk'; +} from '@pymodel/pythinker-code-sdk'; import type { Component } from '@earendil-works/pi-tui'; import { diff --git a/apps/pythinker-code/src/tui/controllers/tasks-browser.ts b/apps/pythinker-code/src/tui/controllers/tasks-browser.ts index 52828c44..5fdb4c84 100644 --- a/apps/pythinker-code/src/tui/controllers/tasks-browser.ts +++ b/apps/pythinker-code/src/tui/controllers/tasks-browser.ts @@ -1,4 +1,4 @@ -import type { BackgroundTaskInfo, Session } from '@pythoughts/pythinker-code-sdk'; +import type { BackgroundTaskInfo, Session } from '@pymodel/pythinker-code-sdk'; import type { Component, ProcessTerminal, TUI } from '@earendil-works/pi-tui'; import { TaskOutputViewer } from '../components/dialogs/task-output-viewer'; diff --git a/apps/pythinker-code/src/tui/goal-queue-store.ts b/apps/pythinker-code/src/tui/goal-queue-store.ts index 6dd5108b..3f2240ec 100644 --- a/apps/pythinker-code/src/tui/goal-queue-store.ts +++ b/apps/pythinker-code/src/tui/goal-queue-store.ts @@ -4,7 +4,7 @@ import { dirname, join } from 'node:path'; import { ErrorCodes, PythinkerError, -} from '@pythoughts/pythinker-code-sdk'; +} from '@pymodel/pythinker-code-sdk'; const GOAL_QUEUE_FILE = 'upcoming-goals.json'; const GOAL_QUEUE_VERSION = 1; diff --git a/apps/pythinker-code/src/tui/pythinker-tui.ts b/apps/pythinker-code/src/tui/pythinker-tui.ts index aba9e0c6..88788b90 100644 --- a/apps/pythinker-code/src/tui/pythinker-tui.ts +++ b/apps/pythinker-code/src/tui/pythinker-tui.ts @@ -17,8 +17,8 @@ import type { PermissionMode, PromptPart, Session, -} from '@pythoughts/pythinker-code-sdk'; -import type { MigrationPlan } from '@pythoughts/migration-legacy'; +} from '@pymodel/pythinker-code-sdk'; +import type { MigrationPlan } from '@pymodel/migration-legacy'; import { resolve } from 'pathe'; import type { CLIOptions } from '#/cli/options'; diff --git a/apps/pythinker-code/src/tui/reverse-rpc/approval/adapter.ts b/apps/pythinker-code/src/tui/reverse-rpc/approval/adapter.ts index c54156f1..3db2cf70 100644 --- a/apps/pythinker-code/src/tui/reverse-rpc/approval/adapter.ts +++ b/apps/pythinker-code/src/tui/reverse-rpc/approval/adapter.ts @@ -1,4 +1,4 @@ -import type { ApprovalRequest, ApprovalResponse, ToolInputDisplay } from '@pythoughts/pythinker-code-sdk'; +import type { ApprovalRequest, ApprovalResponse, ToolInputDisplay } from '@pymodel/pythinker-code-sdk'; import type { ApprovalPanelResponse } from '#/tui/components/dialogs/approval-panel'; import type { ApprovalPanelChoice, ApprovalPanelData, DisplayBlock } from '#/tui/reverse-rpc/types'; diff --git a/apps/pythinker-code/src/tui/reverse-rpc/approval/controller.ts b/apps/pythinker-code/src/tui/reverse-rpc/approval/controller.ts index 3ff312e4..8dea32a7 100644 --- a/apps/pythinker-code/src/tui/reverse-rpc/approval/controller.ts +++ b/apps/pythinker-code/src/tui/reverse-rpc/approval/controller.ts @@ -1,4 +1,4 @@ -import type { ApprovalResponse } from '@pythoughts/pythinker-code-sdk'; +import type { ApprovalResponse } from '@pymodel/pythinker-code-sdk'; import { ReverseRpcController } from '#/tui/reverse-rpc/base-controller'; import type { ApprovalPanelData } from '#/tui/reverse-rpc/types'; diff --git a/apps/pythinker-code/src/tui/reverse-rpc/approval/handler.ts b/apps/pythinker-code/src/tui/reverse-rpc/approval/handler.ts index 2cc7ed7b..2cf205ff 100644 --- a/apps/pythinker-code/src/tui/reverse-rpc/approval/handler.ts +++ b/apps/pythinker-code/src/tui/reverse-rpc/approval/handler.ts @@ -1,4 +1,4 @@ -import type { ApprovalHandler, ApprovalRequest, ApprovalResponse } from '@pythoughts/pythinker-code-sdk'; +import type { ApprovalHandler, ApprovalRequest, ApprovalResponse } from '@pymodel/pythinker-code-sdk'; import { adaptApprovalRequest } from './adapter'; import type { ApprovalController } from './controller'; diff --git a/apps/pythinker-code/src/tui/reverse-rpc/question/handler.ts b/apps/pythinker-code/src/tui/reverse-rpc/question/handler.ts index c996e644..e56bdb2b 100644 --- a/apps/pythinker-code/src/tui/reverse-rpc/question/handler.ts +++ b/apps/pythinker-code/src/tui/reverse-rpc/question/handler.ts @@ -1,4 +1,4 @@ -import type { QuestionHandler, QuestionRequest, QuestionResult } from '@pythoughts/pythinker-code-sdk'; +import type { QuestionHandler, QuestionRequest, QuestionResult } from '@pymodel/pythinker-code-sdk'; import type { QuestionPanelData, diff --git a/apps/pythinker-code/src/tui/reverse-rpc/types.ts b/apps/pythinker-code/src/tui/reverse-rpc/types.ts index 7dba9a7a..02ef57f9 100644 --- a/apps/pythinker-code/src/tui/reverse-rpc/types.ts +++ b/apps/pythinker-code/src/tui/reverse-rpc/types.ts @@ -6,7 +6,7 @@ * core payloads into these shapes for panel components. */ -import type { QuestionAnswerMethod } from '@pythoughts/pythinker-code-sdk'; +import type { QuestionAnswerMethod } from '@pymodel/pythinker-code-sdk'; // ── Display blocks (approval panel) ────────────────────────────────── diff --git a/apps/pythinker-code/src/tui/types.ts b/apps/pythinker-code/src/tui/types.ts index 1f4a2f63..b6549d89 100644 --- a/apps/pythinker-code/src/tui/types.ts +++ b/apps/pythinker-code/src/tui/types.ts @@ -7,7 +7,7 @@ import type { ProviderConfig, PromptPart, ToolInputDisplay, -} from '@pythoughts/pythinker-code-sdk'; +} from '@pymodel/pythinker-code-sdk'; import type { NotificationsConfig, diff --git a/apps/pythinker-code/src/tui/utils/background-task-status.ts b/apps/pythinker-code/src/tui/utils/background-task-status.ts index db7c9e9f..20260b47 100644 --- a/apps/pythinker-code/src/tui/utils/background-task-status.ts +++ b/apps/pythinker-code/src/tui/utils/background-task-status.ts @@ -9,7 +9,7 @@ * — into the dim detail line so the user still sees it. */ -import type { BackgroundTaskInfo, BackgroundTaskStatus } from '@pythoughts/pythinker-code-sdk'; +import type { BackgroundTaskInfo, BackgroundTaskStatus } from '@pymodel/pythinker-code-sdk'; import type { BackgroundAgentStatusData, BackgroundAgentStatusPhase } from '@/tui/types'; diff --git a/apps/pythinker-code/src/tui/utils/event-payload.ts b/apps/pythinker-code/src/tui/utils/event-payload.ts index f9b3d374..a07edaf2 100644 --- a/apps/pythinker-code/src/tui/utils/event-payload.ts +++ b/apps/pythinker-code/src/tui/utils/event-payload.ts @@ -6,7 +6,7 @@ import type { TodoItem } from '#/tui/components/chrome/todo-panel'; // Generic error formatting lives in the SDK so non-TUI surfaces (login flows, // CLI) share it; re-exported here for the TUI's existing importers. -export { formatErrorMessage, formatErrorPayload } from '@pythoughts/pythinker-code-sdk'; +export { formatErrorMessage, formatErrorPayload } from '@pymodel/pythinker-code-sdk'; export function appendStreamingArgsPreview( current: string | undefined, diff --git a/apps/pythinker-code/src/tui/utils/export-markdown.ts b/apps/pythinker-code/src/tui/utils/export-markdown.ts index 0b174453..b1c0ea32 100644 --- a/apps/pythinker-code/src/tui/utils/export-markdown.ts +++ b/apps/pythinker-code/src/tui/utils/export-markdown.ts @@ -1,4 +1,4 @@ -import type { ContentPart, ContextMessage, PromptOrigin, ToolCall } from '@pythoughts/pythinker-code-sdk'; +import type { ContentPart, ContextMessage, PromptOrigin, ToolCall } from '@pymodel/pythinker-code-sdk'; const HINT_KEYS = ['path', 'file_path', 'command', 'query', 'url', 'name', 'pattern'] as const; diff --git a/apps/pythinker-code/src/tui/utils/goal-completion.ts b/apps/pythinker-code/src/tui/utils/goal-completion.ts index e86f98c1..4cd7a0d3 100644 --- a/apps/pythinker-code/src/tui/utils/goal-completion.ts +++ b/apps/pythinker-code/src/tui/utils/goal-completion.ts @@ -1,4 +1,4 @@ -import type { GoalSnapshot } from '@pythoughts/pythinker-code-sdk'; +import type { GoalSnapshot } from '@pymodel/pythinker-code-sdk'; import { formatTokenCount } from '#/utils/usage/usage-format'; diff --git a/apps/pythinker-code/src/tui/utils/hook-result-format.ts b/apps/pythinker-code/src/tui/utils/hook-result-format.ts index 2fd91f6a..c1f6d461 100644 --- a/apps/pythinker-code/src/tui/utils/hook-result-format.ts +++ b/apps/pythinker-code/src/tui/utils/hook-result-format.ts @@ -1,4 +1,4 @@ -import type { HookResultEvent } from '@pythoughts/pythinker-code-sdk'; +import type { HookResultEvent } from '@pymodel/pythinker-code-sdk'; export function formatHookResultMarkdown(event: HookResultEvent): string { return `*${formatHookResultTitle(event)}*\n\n${formatHookResultBody(event)}`; diff --git a/apps/pythinker-code/src/tui/utils/image-placeholder.ts b/apps/pythinker-code/src/tui/utils/image-placeholder.ts index edf2836f..4be9d7db 100644 --- a/apps/pythinker-code/src/tui/utils/image-placeholder.ts +++ b/apps/pythinker-code/src/tui/utils/image-placeholder.ts @@ -15,7 +15,7 @@ * noise between two media parts. */ -import type { PromptPart } from '@pythoughts/pythinker-code-sdk'; +import type { PromptPart } from '@pymodel/pythinker-code-sdk'; import type { ImageAttachment, diff --git a/apps/pythinker-code/src/tui/utils/mcp-oauth.ts b/apps/pythinker-code/src/tui/utils/mcp-oauth.ts index dd2f542a..1869be58 100644 --- a/apps/pythinker-code/src/tui/utils/mcp-oauth.ts +++ b/apps/pythinker-code/src/tui/utils/mcp-oauth.ts @@ -3,7 +3,7 @@ import { type McpOAuthAuthorizationUrlUpdateData, type ToolProgressEvent, type ToolUpdate, -} from '@pythoughts/pythinker-code-sdk'; +} from '@pymodel/pythinker-code-sdk'; export type OpenUrl = (url: string) => void; diff --git a/apps/pythinker-code/src/tui/utils/mcp-server-status.ts b/apps/pythinker-code/src/tui/utils/mcp-server-status.ts index d1c0aed6..872e8c5a 100644 --- a/apps/pythinker-code/src/tui/utils/mcp-server-status.ts +++ b/apps/pythinker-code/src/tui/utils/mcp-server-status.ts @@ -1,4 +1,4 @@ -import type { McpServerInfo, McpServerStatusEvent } from '@pythoughts/pythinker-code-sdk'; +import type { McpServerInfo, McpServerStatusEvent } from '@pymodel/pythinker-code-sdk'; import type { ColorToken } from '#/tui/theme'; diff --git a/apps/pythinker-code/src/tui/utils/message-replay.ts b/apps/pythinker-code/src/tui/utils/message-replay.ts index 2206482e..e6ad3f0c 100644 --- a/apps/pythinker-code/src/tui/utils/message-replay.ts +++ b/apps/pythinker-code/src/tui/utils/message-replay.ts @@ -6,8 +6,8 @@ import type { PromptOrigin, ResumedAgentState, ToolCall, -} from '@pythoughts/pythinker-code-sdk'; -import { limitAgentReplayByTurns } from '@pythoughts/pythinker-code-sdk'; +} from '@pymodel/pythinker-code-sdk'; +import { limitAgentReplayByTurns } from '@pymodel/pythinker-code-sdk'; import type { AppState, diff --git a/apps/pythinker-code/src/tui/utils/persist-effort.ts b/apps/pythinker-code/src/tui/utils/persist-effort.ts index b6376c7e..06fd4793 100644 --- a/apps/pythinker-code/src/tui/utils/persist-effort.ts +++ b/apps/pythinker-code/src/tui/utils/persist-effort.ts @@ -1,4 +1,4 @@ -import type { PythinkerHarness } from '@pythoughts/pythinker-code-sdk'; +import type { PythinkerHarness } from '@pymodel/pythinker-code-sdk'; /** * Save the model + thinking-effort pair as the startup default. diff --git a/apps/pythinker-code/src/tui/utils/plugin-source-label.ts b/apps/pythinker-code/src/tui/utils/plugin-source-label.ts index 71e5d362..7eaae153 100644 --- a/apps/pythinker-code/src/tui/utils/plugin-source-label.ts +++ b/apps/pythinker-code/src/tui/utils/plugin-source-label.ts @@ -1,4 +1,4 @@ -import type { PluginSummary } from '@pythoughts/pythinker-code-sdk'; +import type { PluginSummary } from '@pymodel/pythinker-code-sdk'; export const OFFICIAL_BADGE = 'official'; export const CURATED_BADGE = 'curated'; diff --git a/apps/pythinker-code/src/tui/utils/refresh-providers.ts b/apps/pythinker-code/src/tui/utils/refresh-providers.ts index 4371a0a6..7da435d9 100644 --- a/apps/pythinker-code/src/tui/utils/refresh-providers.ts +++ b/apps/pythinker-code/src/tui/utils/refresh-providers.ts @@ -12,7 +12,7 @@ import { removeCustomRegistryProvider, type CustomRegistrySource, type PlatformConfigShape, -} from '@pythoughts/pythinker-code-oauth'; +} from '@pymodel/pythinker-code-oauth'; import { applyCatalogProvider, catalogBaseUrl, @@ -24,7 +24,7 @@ import { type PythinkerConfigPatch, type ModelAlias, type ProviderConfig, -} from '@pythoughts/pythinker-code-sdk'; +} from '@pymodel/pythinker-code-sdk'; export interface RefreshProviderHost { diff --git a/apps/pythinker-code/src/tui/utils/session-picker-rows.ts b/apps/pythinker-code/src/tui/utils/session-picker-rows.ts index b089c033..f6686bdc 100644 --- a/apps/pythinker-code/src/tui/utils/session-picker-rows.ts +++ b/apps/pythinker-code/src/tui/utils/session-picker-rows.ts @@ -1,4 +1,4 @@ -import type { SessionSummary } from '@pythoughts/pythinker-code-sdk'; +import type { SessionSummary } from '@pymodel/pythinker-code-sdk'; import type { SessionRow } from '#/tui/components/dialogs/session-picker'; diff --git a/apps/pythinker-code/src/tui/utils/thinking-levels.ts b/apps/pythinker-code/src/tui/utils/thinking-levels.ts index 0821802b..7a9b7a00 100644 --- a/apps/pythinker-code/src/tui/utils/thinking-levels.ts +++ b/apps/pythinker-code/src/tui/utils/thinking-levels.ts @@ -3,7 +3,7 @@ * * Only theme-bound presentation lives here, because the SDK must not depend on * the TUI theme. The level rules themselves are - * `@pythoughts/pythinker-code-sdk`'s, so the terminal and VS Code renderers + * `@pymodel/pythinker-code-sdk`'s, so the terminal and VS Code renderers * offer the same levels for the same model; import them from there. */ diff --git a/apps/pythinker-code/src/utils/experimental-features.ts b/apps/pythinker-code/src/utils/experimental-features.ts index 2f956d6f..4a6a6d51 100644 --- a/apps/pythinker-code/src/utils/experimental-features.ts +++ b/apps/pythinker-code/src/utils/experimental-features.ts @@ -1,7 +1,7 @@ import type { ExperimentalFeatureState, ExperimentalFlagMap, -} from '@pythoughts/pythinker-code-sdk'; +} from '@pymodel/pythinker-code-sdk'; export function experimentalFeatureMap( features: readonly Pick[], diff --git a/apps/pythinker-code/src/utils/plugin-marketplace.ts b/apps/pythinker-code/src/utils/plugin-marketplace.ts index 2f1db7ac..341930e3 100644 --- a/apps/pythinker-code/src/utils/plugin-marketplace.ts +++ b/apps/pythinker-code/src/utils/plugin-marketplace.ts @@ -3,7 +3,7 @@ import { homedir } from 'node:os'; import { dirname, isAbsolute, join, relative, resolve, sep, win32 } from 'node:path'; import { fileURLToPath } from 'node:url'; -import type { PluginInstallOptions, PluginSummary } from '@pythoughts/pythinker-code-sdk'; +import type { PluginInstallOptions, PluginSummary } from '@pymodel/pythinker-code-sdk'; import { gt, valid } from 'semver'; import { diff --git a/apps/pythinker-code/src/utils/process/shell-env.ts b/apps/pythinker-code/src/utils/process/shell-env.ts index 5bf81a61..df9e1894 100644 --- a/apps/pythinker-code/src/utils/process/shell-env.ts +++ b/apps/pythinker-code/src/utils/process/shell-env.ts @@ -1,4 +1,4 @@ -import type { ShellEnvironment } from '@pythoughts/pythinker-code-sdk'; +import type { ShellEnvironment } from '@pymodel/pythinker-code-sdk'; function detectMultiplexer(): string | undefined { if (process.env['TMUX']) return 'tmux'; diff --git a/apps/pythinker-code/test/cli/acp.test.ts b/apps/pythinker-code/test/cli/acp.test.ts index aeed0d75..579fe57c 100644 --- a/apps/pythinker-code/test/cli/acp.test.ts +++ b/apps/pythinker-code/test/cli/acp.test.ts @@ -2,7 +2,7 @@ * `pythinker acp` * * Verifies that the ACP sub-command is registered on the program and - * that the action wires the harness into `@pythoughts/acp-adapter`'s + * that the action wires the harness into `@pymodel/acp-adapter`'s * `runAcpServer` (the real server is stubbed so the test doesn't * actually take over stdio). */ @@ -10,12 +10,12 @@ import { Command } from 'commander'; import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; -vi.mock('@pythoughts/acp-adapter', () => ({ +vi.mock('@pymodel/acp-adapter', () => ({ ACP_BUILTIN_SLASH_COMMANDS: [], runAcpServer: vi.fn(async () => undefined), })); -import { runAcpServer } from '@pythoughts/acp-adapter'; +import { runAcpServer } from '@pymodel/acp-adapter'; import { registerAcpCommand } from '#/cli/sub/acp'; @@ -189,7 +189,7 @@ describe('pythinker acp', () => { })) as unknown as typeof actual.spinner, }; }); - vi.doMock(import('@pythoughts/pythinker-code-sdk'), async (importOriginal) => { + vi.doMock(import('@pymodel/pythinker-code-sdk'), async (importOriginal) => { const actual = await importOriginal(); return { ...actual, @@ -216,7 +216,7 @@ describe('pythinker acp', () => { expect(exitSpy).toHaveBeenCalled(); } finally { vi.doUnmock('@clack/prompts'); - vi.doUnmock('@pythoughts/pythinker-code-sdk'); + vi.doUnmock('@pymodel/pythinker-code-sdk'); if (originalAcpIsTTY === undefined) { delete (process.stdin as { isTTY?: boolean }).isTTY; } else { diff --git a/apps/pythinker-code/test/cli/export.test.ts b/apps/pythinker-code/test/cli/export.test.ts index f86bbb95..e7c146fd 100644 --- a/apps/pythinker-code/test/cli/export.test.ts +++ b/apps/pythinker-code/test/cli/export.test.ts @@ -9,7 +9,7 @@ import { mkdtempSync, rmSync } from 'node:fs'; import { tmpdir } from 'node:os'; import { join } from 'node:path'; -import type { createPythinkerDeviceId as createPythinkerDeviceIdFn } from '@pythoughts/pythinker-code-oauth'; +import type { createPythinkerDeviceId as createPythinkerDeviceIdFn } from '@pymodel/pythinker-code-oauth'; import { Command } from 'commander'; import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; @@ -20,7 +20,7 @@ import type { ExportSessionManifest, ExportSessionResult, SessionSummary, -} from '@pythoughts/pythinker-code-sdk'; +} from '@pymodel/pythinker-code-sdk'; let tmp: string; @@ -47,8 +47,8 @@ const mocks = vi.hoisted(() => ({ harnessCreatesDeviceIdOnConstruction: false, })); -vi.mock('@pythoughts/pythinker-code-sdk', async (importOriginal) => { - const actual = await importOriginal(); +vi.mock('@pymodel/pythinker-code-sdk', async (importOriginal) => { + const actual = await importOriginal(); return { ...actual, resolvePythinkerHome: mocks.resolvePythinkerHome, @@ -73,9 +73,9 @@ vi.mock('@pythoughts/pythinker-code-sdk', async (importOriginal) => { }; }); -vi.mock('@pythoughts/pythinker-code-oauth', async () => { - const actual = await vi.importActual( - '@pythoughts/pythinker-code-oauth', +vi.mock('@pymodel/pythinker-code-oauth', async () => { + const actual = await vi.importActual( + '@pymodel/pythinker-code-oauth', ); return { ...actual, @@ -83,7 +83,7 @@ vi.mock('@pythoughts/pythinker-code-oauth', async () => { }; }); -vi.mock('@pythoughts/pythinker-telemetry', () => ({ +vi.mock('@pymodel/pythinker-telemetry', () => ({ initializeTelemetry: mocks.initializeTelemetry, shutdownTelemetry: mocks.shutdownTelemetry, track: mocks.telemetryTrack, diff --git a/apps/pythinker-code/test/cli/goal-prompt.test.ts b/apps/pythinker-code/test/cli/goal-prompt.test.ts index ed7d6461..31bf25aa 100644 --- a/apps/pythinker-code/test/cli/goal-prompt.test.ts +++ b/apps/pythinker-code/test/cli/goal-prompt.test.ts @@ -107,8 +107,8 @@ const mocks = vi.hoisted(() => { }; }); -vi.mock('@pythoughts/pythinker-code-sdk', async (importOriginal) => { - const actual = await importOriginal(); +vi.mock('@pymodel/pythinker-code-sdk', async (importOriginal) => { + const actual = await importOriginal(); return { ...actual, createPythinkerHarness: () => ({ @@ -127,7 +127,7 @@ vi.mock('@pythoughts/pythinker-code-sdk', async (importOriginal) => { }; }); -vi.mock('@pythoughts/pythinker-telemetry', () => ({ +vi.mock('@pymodel/pythinker-telemetry', () => ({ initializeTelemetry: vi.fn(), setCrashPhase: vi.fn(), shutdownTelemetry: vi.fn(), diff --git a/apps/pythinker-code/test/cli/login.test.ts b/apps/pythinker-code/test/cli/login.test.ts index 13a3638c..31251ef2 100644 --- a/apps/pythinker-code/test/cli/login.test.ts +++ b/apps/pythinker-code/test/cli/login.test.ts @@ -16,7 +16,7 @@ import { createPythinkerHarness, fetchCatalog, type Catalog, -} from '@pythoughts/pythinker-code-sdk'; +} from '@pymodel/pythinker-code-sdk'; import { registerLoginCommand } from '#/cli/sub/login'; import { openUrl } from '#/utils/open-url'; @@ -27,9 +27,9 @@ const mockGetConfig = vi.fn(); const mockSetConfig = vi.fn(); const mockRemoveProvider = vi.fn(); -vi.mock('@pythoughts/pythinker-code-sdk', async () => { - const actual = await vi.importActual( - '@pythoughts/pythinker-code-sdk', +vi.mock('@pymodel/pythinker-code-sdk', async () => { + const actual = await vi.importActual( + '@pymodel/pythinker-code-sdk', ); return { ...actual, @@ -86,9 +86,9 @@ const { mockFetchOpenPlatformModels } = vi.hoisted(() => ({ mockFetchOpenPlatformModels: vi.fn(), })); -vi.mock('@pythoughts/pythinker-code-oauth', async () => { - const actual = await vi.importActual( - '@pythoughts/pythinker-code-oauth', +vi.mock('@pymodel/pythinker-code-oauth', async () => { + const actual = await vi.importActual( + '@pymodel/pythinker-code-oauth', ); return { ...actual, fetchOpenPlatformModels: mockFetchOpenPlatformModels }; }); diff --git a/apps/pythinker-code/test/cli/main.test.ts b/apps/pythinker-code/test/cli/main.test.ts index a9aeecfe..1c75680b 100644 --- a/apps/pythinker-code/test/cli/main.test.ts +++ b/apps/pythinker-code/test/cli/main.test.ts @@ -1,5 +1,5 @@ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; -import { ErrorCodes, PythinkerError } from '@pythoughts/pythinker-code-sdk'; +import { ErrorCodes, PythinkerError } from '@pymodel/pythinker-code-sdk'; import { OptionConflictError, validateOptions } from '#/cli/options'; import type { CLIOptions } from '#/cli/options'; @@ -56,7 +56,7 @@ const mocks = vi.hoisted(() => { }; }); -vi.mock('@pythoughts/pythinker-telemetry', () => ({ +vi.mock('@pymodel/pythinker-telemetry', () => ({ installCrashHandlers: mocks.installCrashHandlers, track: mocks.track, setTelemetryContext: mocks.setTelemetryContext, @@ -64,9 +64,9 @@ vi.mock('@pythoughts/pythinker-telemetry', () => ({ shutdownTelemetry: mocks.shutdownTelemetry, })); -vi.mock('@pythoughts/pythinker-code-sdk', async () => { - const actual = await vi.importActual( - '@pythoughts/pythinker-code-sdk', +vi.mock('@pymodel/pythinker-code-sdk', async () => { + const actual = await vi.importActual( + '@pymodel/pythinker-code-sdk', ); class MockPythinkerHarness { readonly homeDir = mocks.harness.homeDir; diff --git a/apps/pythinker-code/test/cli/provider.test.ts b/apps/pythinker-code/test/cli/provider.test.ts index 106a4870..d03a9874 100644 --- a/apps/pythinker-code/test/cli/provider.test.ts +++ b/apps/pythinker-code/test/cli/provider.test.ts @@ -9,7 +9,7 @@ import { Command } from 'commander'; import { DEFAULT_CATALOG_URL, type PythinkerConfig, -} from '@pythoughts/pythinker-code-sdk'; +} from '@pymodel/pythinker-code-sdk'; import { handleCatalogAdd, diff --git a/apps/pythinker-code/test/cli/run-prompt.test.ts b/apps/pythinker-code/test/cli/run-prompt.test.ts index f80a7ddb..5ccb6004 100644 --- a/apps/pythinker-code/test/cli/run-prompt.test.ts +++ b/apps/pythinker-code/test/cli/run-prompt.test.ts @@ -1,4 +1,4 @@ -import type { createPythinkerDeviceId as createPythinkerDeviceIdFn } from '@pythoughts/pythinker-code-oauth'; +import type { createPythinkerDeviceId as createPythinkerDeviceIdFn } from '@pymodel/pythinker-code-oauth'; import { afterEach, describe, expect, it, vi } from 'vitest'; import { runPrompt } from '#/cli/run-prompt'; @@ -82,8 +82,8 @@ const mocks = vi.hoisted(() => { }; }); -vi.mock('@pythoughts/pythinker-code-sdk', async (importOriginal) => { - const actual = await importOriginal(); +vi.mock('@pymodel/pythinker-code-sdk', async (importOriginal) => { + const actual = await importOriginal(); return { ...actual, resolvePythinkerHome: mocks.resolvePythinkerHome, @@ -111,9 +111,9 @@ vi.mock('@pythoughts/pythinker-code-sdk', async (importOriginal) => { }; }); -vi.mock('@pythoughts/pythinker-code-oauth', async () => { - const actual = await vi.importActual( - '@pythoughts/pythinker-code-oauth', +vi.mock('@pymodel/pythinker-code-oauth', async () => { + const actual = await vi.importActual( + '@pymodel/pythinker-code-oauth', ); return { ...actual, @@ -121,7 +121,7 @@ vi.mock('@pythoughts/pythinker-code-oauth', async () => { }; }); -vi.mock('@pythoughts/pythinker-telemetry', () => ({ +vi.mock('@pymodel/pythinker-telemetry', () => ({ initializeTelemetry: mocks.initializeTelemetry, setCrashPhase: mocks.setCrashPhase, shutdownTelemetry: mocks.shutdownTelemetry, diff --git a/apps/pythinker-code/test/cli/run-shell.test.ts b/apps/pythinker-code/test/cli/run-shell.test.ts index 2072f003..4831b0f7 100644 --- a/apps/pythinker-code/test/cli/run-shell.test.ts +++ b/apps/pythinker-code/test/cli/run-shell.test.ts @@ -1,6 +1,6 @@ import { execSync } from 'node:child_process'; -import type { createPythinkerDeviceId as createPythinkerDeviceIdFn } from '@pythoughts/pythinker-code-oauth'; +import type { createPythinkerDeviceId as createPythinkerDeviceIdFn } from '@pymodel/pythinker-code-oauth'; import { afterEach, describe, expect, it, vi } from 'vitest'; import { runShell } from '#/cli/run-shell'; @@ -76,8 +76,8 @@ function tuiConfig(overrides: Partial = {}): TuiConfig { }; } -vi.mock('@pythoughts/pythinker-code-sdk', async (importOriginal) => { - const actual = await importOriginal(); +vi.mock('@pymodel/pythinker-code-sdk', async (importOriginal) => { + const actual = await importOriginal(); return { ...actual, resolvePythinkerHome: mocks.resolvePythinkerHome, @@ -104,9 +104,9 @@ vi.mock('@pythoughts/pythinker-code-sdk', async (importOriginal) => { }; }); -vi.mock('@pythoughts/pythinker-code-oauth', async () => { - const actual = await vi.importActual( - '@pythoughts/pythinker-code-oauth', +vi.mock('@pymodel/pythinker-code-oauth', async () => { + const actual = await vi.importActual( + '@pymodel/pythinker-code-oauth', ); return { ...actual, @@ -114,7 +114,7 @@ vi.mock('@pythoughts/pythinker-code-oauth', async () => { }; }); -vi.mock('@pythoughts/pythinker-telemetry', () => ({ +vi.mock('@pymodel/pythinker-telemetry', () => ({ initializeTelemetry: mocks.initializeTelemetry, setCrashPhase: mocks.setCrashPhase, shutdownTelemetry: mocks.shutdownTelemetry, diff --git a/apps/pythinker-code/test/cli/server/server.test.ts b/apps/pythinker-code/test/cli/server/server.test.ts index ff76c3f3..9529dbf0 100644 --- a/apps/pythinker-code/test/cli/server/server.test.ts +++ b/apps/pythinker-code/test/cli/server/server.test.ts @@ -107,7 +107,7 @@ describe('`pythinker server` lifecycle exits with ESERVICE_UNSUPPORTED on unsupp // The remaining platforms fall through to the stub that throws // `ServiceUnsupportedError` — pin that contract so a future addition // (freebsd, etc.) needs a deliberate decision instead of silently working. - const { resolveServiceManager, ServiceUnsupportedError } = await import('@pythoughts/server'); + const { resolveServiceManager, ServiceUnsupportedError } = await import('@pymodel/server'); const mgr = resolveServiceManager('freebsd'); await expect( mgr.install({ host: '127.0.0.1', port: 58627, logLevel: 'info' }), @@ -118,7 +118,7 @@ describe('`pythinker server` lifecycle exits with ESERVICE_UNSUPPORTED on unsupp describe('`pythinker server` lifecycle handles unavailable service managers', () => { it('prints a friendly JSON error and exits 2', async () => { - const { ServiceUnavailableError } = await import('@pythoughts/server'); + const { ServiceUnavailableError } = await import('@pymodel/server'); const program = new Command('pythinker').exitOverride(); const server = program.command('server'); let stdout = ''; @@ -171,7 +171,7 @@ describe('`pythinker server` lifecycle handles unavailable service managers', () }); it('preserves exit 2 when output draining rejects', async () => { - const { ServiceUnavailableError } = await import('@pythoughts/server'); + const { ServiceUnavailableError } = await import('@pymodel/server'); const program = new Command('pythinker').exitOverride(); const server = program.command('server'); const exit = vi.spyOn(process, 'exit').mockImplementation(((code?: number | string | null) => { diff --git a/apps/pythinker-code/test/cli/telemetry.test.ts b/apps/pythinker-code/test/cli/telemetry.test.ts index 50d2ebe8..e90d54c8 100644 --- a/apps/pythinker-code/test/cli/telemetry.test.ts +++ b/apps/pythinker-code/test/cli/telemetry.test.ts @@ -22,20 +22,20 @@ const mocks = vi.hoisted(() => ({ getCachedAccessToken: vi.fn(async () => 'tok'), })); -vi.mock('@pythoughts/pythinker-telemetry', () => ({ +vi.mock('@pymodel/pythinker-telemetry', () => ({ initializeTelemetry: mocks.initializeTelemetry, setTelemetryContext: vi.fn(), track: vi.fn(), withTelemetryContext: vi.fn(), })); -vi.mock('@pythoughts/pythinker-code-oauth', () => ({ +vi.mock('@pymodel/pythinker-code-oauth', () => ({ createPythinkerDeviceId: mocks.createPythinkerDeviceId, KIMI_CODE_PROVIDER_NAME: 'managed:kimi-code', })); -vi.mock('@pythoughts/pythinker-code-sdk', async (importOriginal) => { - const actual = await importOriginal(); +vi.mock('@pymodel/pythinker-code-sdk', async (importOriginal) => { + const actual = await importOriginal(); return { ...actual, resolvePythinkerHome: mocks.resolvePythinkerHome, diff --git a/apps/pythinker-code/test/cli/update/cache.test.ts b/apps/pythinker-code/test/cli/update/cache.test.ts index dbc50624..9cc11545 100644 --- a/apps/pythinker-code/test/cli/update/cache.test.ts +++ b/apps/pythinker-code/test/cli/update/cache.test.ts @@ -47,7 +47,7 @@ describe('update cache', () => { writeFileSync( getUpdateStateFile(), JSON.stringify({ - packageName: '@pythoughts/pythinker-code', + packageName: '@pymodel/pythinker-code', checkedAt: '2026-04-23T08:00:00.000Z', distTags: { beta: '0.0.1-beta.1' }, }), diff --git a/apps/pythinker-code/test/cli/update/cdn.test.ts b/apps/pythinker-code/test/cli/update/cdn.test.ts index 0a95cdae..566925f2 100644 --- a/apps/pythinker-code/test/cli/update/cdn.test.ts +++ b/apps/pythinker-code/test/cli/update/cdn.test.ts @@ -85,7 +85,7 @@ describe('fetchUpdateManifest', () => { publishedAt: '2026-06-12T00:00:00.000Z', platforms: { 'darwin-arm64': { - url: 'https://github.com/PyModel/pythinker-code/releases/download/%40pythoughts%2Fpythinker-code%400.9.2/pythinker-code-darwin-arm64.zip', + url: 'https://github.com/PyModel/pythinker-code/releases/download/%40pymodel%2Fpythinker-code%400.9.2/pythinker-code-darwin-arm64.zip', sha256: 'nope', }, }, @@ -145,11 +145,11 @@ describe('fetchUpdateManifest', () => { rollout: [], platforms: { 'darwin-arm64': { - url: 'https://github.com/PyModel/pythinker-code/releases/download/%40pythoughts%2Fpythinker-code%400.9.2/pythinker-code-darwin-arm64.zip', + url: 'https://github.com/PyModel/pythinker-code/releases/download/%40pymodel%2Fpythinker-code%400.9.2/pythinker-code-darwin-arm64.zip', sha256: 'a'.repeat(64), }, 'linux-x64': { - url: 'https://github.com/PyModel/pythinker-code/releases/download/%40pythoughts%2Fpythinker-code%400.9.2/pythinker-code-linux-x64.zip', + url: 'https://github.com/PyModel/pythinker-code/releases/download/%40pymodel%2Fpythinker-code%400.9.2/pythinker-code-linux-x64.zip', sha256: 'b'.repeat(64), }, }, @@ -159,11 +159,11 @@ describe('fetchUpdateManifest', () => { expect(result.version).toBe('2.0.0'); expect(result.platforms).toEqual({ 'darwin-arm64': { - url: 'https://github.com/PyModel/pythinker-code/releases/download/%40pythoughts%2Fpythinker-code%400.9.2/pythinker-code-darwin-arm64.zip', + url: 'https://github.com/PyModel/pythinker-code/releases/download/%40pymodel%2Fpythinker-code%400.9.2/pythinker-code-darwin-arm64.zip', sha256: 'a'.repeat(64), }, 'linux-x64': { - url: 'https://github.com/PyModel/pythinker-code/releases/download/%40pythoughts%2Fpythinker-code%400.9.2/pythinker-code-linux-x64.zip', + url: 'https://github.com/PyModel/pythinker-code/releases/download/%40pymodel%2Fpythinker-code%400.9.2/pythinker-code-linux-x64.zip', sha256: 'b'.repeat(64), }, }); @@ -262,7 +262,7 @@ describe('manifestArtifactAvailability', () => { rollout: [], platforms: { 'darwin-arm64': { - url: 'https://github.com/PyModel/pythinker-code/releases/download/%40pythoughts%2Fpythinker-code%400.9.2/pythinker-code-darwin-arm64.zip', + url: 'https://github.com/PyModel/pythinker-code/releases/download/%40pymodel%2Fpythinker-code%400.9.2/pythinker-code-darwin-arm64.zip', sha256: 'a'.repeat(64), }, }, @@ -277,7 +277,7 @@ describe('manifestArtifactAvailability', () => { rollout: [], platforms: { 'darwin-arm64': { - url: 'https://github.com/PyModel/pythinker-code/releases/download/%40pythoughts%2Fpythinker-code%400.9.2/pythinker-code-darwin-arm64.zip', + url: 'https://github.com/PyModel/pythinker-code/releases/download/%40pymodel%2Fpythinker-code%400.9.2/pythinker-code-darwin-arm64.zip', sha256: 'a'.repeat(64), }, }, @@ -302,7 +302,7 @@ describe('manifestArtifactAvailability', () => { rollout: [], platforms: { [`${process.platform}-${process.arch}`]: { - url: 'https://github.com/PyModel/pythinker-code/releases/download/%40pythoughts%2Fpythinker-code%400.9.2/pythinker-code-darwin-arm64.zip', + url: 'https://github.com/PyModel/pythinker-code/releases/download/%40pymodel%2Fpythinker-code%400.9.2/pythinker-code-darwin-arm64.zip', sha256: 'a'.repeat(64), }, }, diff --git a/apps/pythinker-code/test/cli/update/preflight.test.ts b/apps/pythinker-code/test/cli/update/preflight.test.ts index f7129152..d396fd5d 100644 --- a/apps/pythinker-code/test/cli/update/preflight.test.ts +++ b/apps/pythinker-code/test/cli/update/preflight.test.ts @@ -482,7 +482,7 @@ describe('runUpdatePreflight', () => { expect(detectInstallSource).toHaveBeenCalledTimes(1); expect(mocks.spawn).toHaveBeenCalledWith( expect.stringMatching(/^npm(\.cmd)?$/), - ['install', '-g', '@pythoughts/pythinker-code@0.5.0'], + ['install', '-g', '@pymodel/pythinker-code@0.5.0'], { detached: true, windowsHide: false, stdio: ['ignore', 'ignore', 'pipe'] }, ); }); @@ -541,16 +541,16 @@ describe('runUpdatePreflight', () => { await expect(runUpdatePreflight('0.4.0', options)).resolves.toBe('exit'); expect(mocks.promptForInstallChoice).toHaveBeenCalledWith( expect.objectContaining({ - installCommand: 'npm install -g @pythoughts/pythinker-code@0.5.0', + installCommand: 'npm install -g @pymodel/pythinker-code@0.5.0', installSource: 'npm-global', }), ); expect(mocks.spawn).toHaveBeenCalledWith( expect.stringMatching(/^npm(\.cmd)?$/), - ['install', '-g', '@pythoughts/pythinker-code@0.5.0'], + ['install', '-g', '@pymodel/pythinker-code@0.5.0'], { stdio: 'inherit' }, ); - expect(stdout.join('')).toContain('Updated @pythoughts/pythinker-code to 0.5.0'); + expect(stdout.join('')).toContain('Updated @pymodel/pythinker-code to 0.5.0'); }); it('refreshes a stale cached target before showing the foreground install prompt', async () => { @@ -568,15 +568,15 @@ describe('runUpdatePreflight', () => { expect(mocks.promptForInstallChoice).toHaveBeenCalledWith( expect.objectContaining({ target: { version: '0.7.0' }, - installCommand: 'npm install -g @pythoughts/pythinker-code@0.7.0', + installCommand: 'npm install -g @pymodel/pythinker-code@0.7.0', }), ); expect(mocks.spawn).toHaveBeenCalledWith( expect.stringMatching(/^npm(\.cmd)?$/), - ['install', '-g', '@pythoughts/pythinker-code@0.7.0'], + ['install', '-g', '@pymodel/pythinker-code@0.7.0'], { stdio: 'inherit' }, ); - expect(stdout.join('')).toContain('Updated @pythoughts/pythinker-code to 0.7.0'); + expect(stdout.join('')).toContain('Updated @pymodel/pythinker-code to 0.7.0'); }); it('falls back to the cached foreground prompt target when the refresh hangs', async () => { @@ -596,7 +596,7 @@ describe('runUpdatePreflight', () => { expect(mocks.promptForInstallChoice).toHaveBeenCalledWith( expect.objectContaining({ target: { version: '0.6.0' }, - installCommand: 'npm install -g @pythoughts/pythinker-code@0.6.0', + installCommand: 'npm install -g @pymodel/pythinker-code@0.6.0', }), ); } finally { @@ -618,12 +618,12 @@ describe('runUpdatePreflight', () => { expect(mocks.spawn).toHaveBeenCalledTimes(1); expect(mocks.spawn).toHaveBeenCalledWith( expect.stringMatching(/^npm(\.cmd)?$/u), - ['install', '-g', '@pythoughts/pythinker-code@0.11.0'], + ['install', '-g', '@pymodel/pythinker-code@0.11.0'], { detached: true, windowsHide: false, stdio: ['ignore', 'ignore', 'pipe'] }, ); expect(mocks.spawn).not.toHaveBeenCalledWith( expect.stringMatching(/^npm(\.cmd)?$/u), - ['install', '-g', '@pythoughts/pythinker-code@0.10.0'], + ['install', '-g', '@pymodel/pythinker-code@0.10.0'], expect.anything(), ); }); @@ -655,7 +655,7 @@ describe('runUpdatePreflight', () => { expect(mocks.spawn).toHaveBeenCalledTimes(1); expect(mocks.spawn).toHaveBeenCalledWith( expect.stringMatching(/^npm(\.cmd)?$/u), - ['install', '-g', '@pythoughts/pythinker-code@0.10.0'], + ['install', '-g', '@pymodel/pythinker-code@0.10.0'], { detached: true, windowsHide: false, stdio: ['ignore', 'ignore', 'pipe'] }, ); }); @@ -677,7 +677,7 @@ describe('runUpdatePreflight', () => { expect(mocks.spawn).toHaveBeenCalledTimes(1); expect(mocks.spawn).toHaveBeenCalledWith( expect.stringMatching(/^npm(\.cmd)?$/u), - ['install', '-g', '@pythoughts/pythinker-code@0.10.0'], + ['install', '-g', '@pymodel/pythinker-code@0.10.0'], { detached: true, windowsHide: false, stdio: ['ignore', 'ignore', 'pipe'] }, ); } finally { @@ -728,7 +728,7 @@ describe('runUpdatePreflight', () => { await runUpdatePreflight('0.4.0', options); expect(mocks.spawn).toHaveBeenCalledWith( expect.stringMatching(/^pnpm(\.cmd)?$/), - ['add', '-g', '@pythoughts/pythinker-code@0.5.0'], + ['add', '-g', '@pymodel/pythinker-code@0.5.0'], { stdio: 'inherit' }, ); }); @@ -744,7 +744,7 @@ describe('runUpdatePreflight', () => { await runUpdatePreflight('0.4.0', options); expect(mocks.spawn).toHaveBeenCalledWith( expect.stringMatching(/^yarn(\.cmd)?$/), - ['global', 'add', '@pythoughts/pythinker-code@0.5.0'], + ['global', 'add', '@pymodel/pythinker-code@0.5.0'], { stdio: 'inherit' }, ); }); @@ -760,7 +760,7 @@ describe('runUpdatePreflight', () => { await runUpdatePreflight('0.4.0', options); expect(mocks.spawn).toHaveBeenCalledWith( expect.stringMatching(/^bun(\.exe)?$/), - ['add', '-g', '@pythoughts/pythinker-code@0.5.0'], + ['add', '-g', '@pymodel/pythinker-code@0.5.0'], { stdio: 'inherit' }, ); }); @@ -923,7 +923,7 @@ describe('runUpdatePreflight', () => { ); expect(mocks.spawn).toHaveBeenCalledWith( expect.stringMatching(/^npm(\.cmd)?$/u), - ['install', '-g', '@pythoughts/pythinker-code@0.5.0'], + ['install', '-g', '@pymodel/pythinker-code@0.5.0'], { stdio: 'inherit' }, ); }); @@ -934,7 +934,7 @@ describe('runUpdatePreflight', () => { mocks.detectInstallSource.mockResolvedValue('unsupported'); const { stdout, options } = captureOutput(); await expect(runUpdatePreflight('0.4.0', options)).resolves.toBe('continue'); - expect(stdout.join('')).toContain('npm install -g @pythoughts/pythinker-code@0.5.0'); + expect(stdout.join('')).toContain('npm install -g @pymodel/pythinker-code@0.5.0'); expect(mocks.spawn).not.toHaveBeenCalled(); }); @@ -1011,7 +1011,7 @@ describe('runUpdatePreflight', () => { notifiedAt: null, }, })); - expect(stdout.join('')).toContain('Updated @pythoughts/pythinker-code to 0.5.0'); + expect(stdout.join('')).toContain('Updated @pymodel/pythinker-code to 0.5.0'); }); it('releases the lock and records the failure when the foreground install fails', async () => { @@ -1056,7 +1056,7 @@ describe('runUpdatePreflight', () => { await expect(runUpdatePreflight('0.4.0', options)).resolves.toBe('continue'); expect(stderr.join('')).toContain('warning: failed to install'); // A failed install must never print the "Updated …" success line. - expect(stdout.join('')).not.toContain('Updated @pythoughts/pythinker-code'); + expect(stdout.join('')).not.toContain('Updated @pymodel/pythinker-code'); }); it('starts an automatic update in the background by default', async () => { @@ -1071,7 +1071,7 @@ describe('runUpdatePreflight', () => { expect(promptForInstallChoice).not.toHaveBeenCalled(); expect(mocks.spawn).toHaveBeenCalledWith( expect.stringMatching(/^npm(\.cmd)?$/), - ['install', '-g', '@pythoughts/pythinker-code@0.5.0'], + ['install', '-g', '@pymodel/pythinker-code@0.5.0'], { detached: true, windowsHide: false, stdio: ['ignore', 'ignore', 'pipe'] }, ); expect(writeUpdateInstallState).toHaveBeenCalledWith(expect.objectContaining({ @@ -1215,7 +1215,7 @@ describe('runUpdatePreflight', () => { expect(mocks.spawn).toHaveBeenCalledWith( expect.stringMatching(/^npm(\.cmd)?$/u), - ['install', '-g', '@pythoughts/pythinker-code@0.6.0'], + ['install', '-g', '@pymodel/pythinker-code@0.6.0'], { detached: true, windowsHide: false, stdio: ['ignore', 'ignore', 'pipe'] }, ); }); @@ -1278,7 +1278,7 @@ describe('runUpdatePreflight', () => { expect(mocks.spawn).toHaveBeenCalledWith( expect.stringMatching(/^npm(\.cmd)?$/), - ['install', '-g', '@pythoughts/pythinker-code@0.6.0'], + ['install', '-g', '@pymodel/pythinker-code@0.6.0'], { detached: true, windowsHide: false, stdio: ['ignore', 'ignore', 'pipe'] }, ); }); @@ -1302,7 +1302,7 @@ describe('runUpdatePreflight', () => { expect(mocks.spawn).toHaveBeenCalledWith( expect.stringMatching(/^npm(\.cmd)?$/), - ['install', '-g', '@pythoughts/pythinker-code@0.6.0'], + ['install', '-g', '@pymodel/pythinker-code@0.6.0'], { detached: true, windowsHide: false, stdio: ['ignore', 'ignore', 'pipe'] }, ); }); @@ -1371,7 +1371,7 @@ describe('runUpdatePreflight', () => { expect(mocks.spawn).toHaveBeenCalledWith( expect.stringMatching(/^npm(\.cmd)?$/), - ['install', '-g', '@pythoughts/pythinker-code@0.6.0'], + ['install', '-g', '@pymodel/pythinker-code@0.6.0'], { detached: true, windowsHide: false, stdio: ['ignore', 'ignore', 'pipe'] }, ); }); @@ -1597,7 +1597,7 @@ describe('runUpdatePreflight', () => { expect(promptForInstallChoice).not.toHaveBeenCalled(); expect(mocks.spawn).toHaveBeenCalledWith( expect.stringMatching(/^npm(\.cmd)?$/), - ['install', '-g', '@pythoughts/pythinker-code@0.5.0'], + ['install', '-g', '@pymodel/pythinker-code@0.5.0'], { detached: true, windowsHide: false, stdio: ['ignore', 'ignore', 'pipe'] }, ); }); @@ -1963,7 +1963,7 @@ describe('runUpdatePreflight', () => { expect(mocks.spawn).toHaveBeenCalledWith( expect.stringMatching(/^npm(\.cmd)?$/), - ['install', '-g', '@pythoughts/pythinker-code@0.5.0'], + ['install', '-g', '@pymodel/pythinker-code@0.5.0'], { detached: true, windowsHide: false, stdio: ['ignore', 'ignore', 'pipe'] }, ); expect(track).toHaveBeenCalledWith('update_background_install_started', expect.objectContaining({ @@ -2089,7 +2089,7 @@ describe('runUpdatePreflight', () => { expect(mocks.spawn).toHaveBeenCalledWith( expect.stringMatching(/^npm(\.cmd)?$/), - ['install', '-g', '@pythoughts/pythinker-code@0.5.0'], + ['install', '-g', '@pymodel/pythinker-code@0.5.0'], { detached: true, windowsHide: false, stdio: ['ignore', 'ignore', 'pipe'] }, ); expect(track).toHaveBeenCalledWith('update_background_install_started', expect.objectContaining({ @@ -2474,23 +2474,23 @@ describe('windows package-manager shims', () => { 'npm.cmd', 'install', '-g', - '@pythoughts/pythinker-code@0.5.0', + '@pymodel/pythinker-code@0.5.0', ]); }); it('runs pnpm.cmd and yarn.cmd the same way', () => { expect(spawnForSource('pnpm-global', '0.5.0', 'win32').args).toEqual([ - '/d', '/s', '/c', 'pnpm.cmd', 'add', '-g', '@pythoughts/pythinker-code@0.5.0', + '/d', '/s', '/c', 'pnpm.cmd', 'add', '-g', '@pymodel/pythinker-code@0.5.0', ]); expect(spawnForSource('yarn-global', '0.5.0', 'win32').args).toEqual([ - '/d', '/s', '/c', 'yarn.cmd', 'global', 'add', '@pythoughts/pythinker-code@0.5.0', + '/d', '/s', '/c', 'yarn.cmd', 'global', 'add', '@pymodel/pythinker-code@0.5.0', ]); }); it('leaves real executables alone', () => { expect(spawnForSource('bun-global', '0.5.0', 'win32')).toEqual({ cmd: 'bun.exe', - args: ['add', '-g', '@pythoughts/pythinker-code@0.5.0'], + args: ['add', '-g', '@pymodel/pythinker-code@0.5.0'], }); expect(spawnForSource('native', '0.5.0', 'win32').cmd).toBe('powershell.exe'); }); @@ -2498,7 +2498,7 @@ describe('windows package-manager shims', () => { it('never wraps anything off Windows', () => { expect(spawnForSource('npm-global', '0.5.0', 'darwin')).toEqual({ cmd: 'npm', - args: ['install', '-g', '@pythoughts/pythinker-code@0.5.0'], + args: ['install', '-g', '@pymodel/pythinker-code@0.5.0'], }); expect(isWindowsShim('npm.cmd', 'darwin')).toBe(false); expect(isWindowsShim('npm.cmd', 'win32')).toBe(true); @@ -2766,7 +2766,7 @@ describe('startManualUpdate', () => { attempts: 2, failedAt: '2026-08-05T08:00:00.000Z', message: 'npm exited with code 1', - command: 'npm install -g @pythoughts/pythinker-code@0.5.0', + command: 'npm install -g @pymodel/pythinker-code@0.5.0', }); expect(mocks.spawn).not.toHaveBeenCalled(); }); @@ -2854,7 +2854,7 @@ describe('startManualUpdate', () => { version: '0.5.0', attempts: 2, failedAt: '2026-08-05T08:00:00.000Z', - command: 'npm install -g @pythoughts/pythinker-code@0.5.0', + command: 'npm install -g @pymodel/pythinker-code@0.5.0', }); expect(mocks.spawn).not.toHaveBeenCalled(); }); diff --git a/apps/pythinker-code/test/cli/update/prompt.test.ts b/apps/pythinker-code/test/cli/update/prompt.test.ts index 6ac82404..37f5eb37 100644 --- a/apps/pythinker-code/test/cli/update/prompt.test.ts +++ b/apps/pythinker-code/test/cli/update/prompt.test.ts @@ -54,7 +54,7 @@ describe('promptForInstallChoice', () => { const promptPromise = promptForInstallChoice({ currentVersion: '0.4.0', target: { version: '0.5.0' }, - installCommand: 'npm install -g @pythoughts/pythinker-code@0.5.0', + installCommand: 'npm install -g @pymodel/pythinker-code@0.5.0', installSource: 'npm-global', input, output, diff --git a/apps/pythinker-code/test/cli/update/source.test.ts b/apps/pythinker-code/test/cli/update/source.test.ts index 2c699996..01498082 100644 --- a/apps/pythinker-code/test/cli/update/source.test.ts +++ b/apps/pythinker-code/test/cli/update/source.test.ts @@ -8,78 +8,78 @@ import { describe('classifyByPathHeuristic', () => { it('returns null for an npm-style global path (handled by classifyInstallSource)', () => { - expect(classifyByPathHeuristic('/usr/local/lib/node_modules/@pythoughts/pythinker-code')).toBeNull(); + expect(classifyByPathHeuristic('/usr/local/lib/node_modules/@pymodel/pythinker-code')).toBeNull(); }); it('detects pnpm global on macOS', () => { expect( - classifyByPathHeuristic('/Users/me/Library/pnpm/global/5/node_modules/@pythoughts/pythinker-code'), + classifyByPathHeuristic('/Users/me/Library/pnpm/global/5/node_modules/@pymodel/pythinker-code'), ).toBe('pnpm-global'); }); it('detects pnpm global on Linux', () => { expect( - classifyByPathHeuristic('/home/me/.local/share/pnpm/global/5/node_modules/@pythoughts/pythinker-code'), + classifyByPathHeuristic('/home/me/.local/share/pnpm/global/5/node_modules/@pymodel/pythinker-code'), ).toBe('pnpm-global'); }); it('detects pnpm global on Windows (normalized backslashes)', () => { expect( - classifyByPathHeuristic('C:\\Users\\me\\AppData\\Local\\pnpm\\global\\5\\node_modules\\@pythoughts/pythinker-code'), + classifyByPathHeuristic('C:\\Users\\me\\AppData\\Local\\pnpm\\global\\5\\node_modules\\@pymodel/pythinker-code'), ).toBe('pnpm-global'); }); it('detects yarn classic global', () => { expect( - classifyByPathHeuristic('/Users/me/.config/yarn/global/node_modules/@pythoughts/pythinker-code'), + classifyByPathHeuristic('/Users/me/.config/yarn/global/node_modules/@pymodel/pythinker-code'), ).toBe('yarn-global'); }); it('detects yarn berry global (~/.yarn/global)', () => { expect( - classifyByPathHeuristic('/Users/me/.yarn/global/node_modules/@pythoughts/pythinker-code'), + classifyByPathHeuristic('/Users/me/.yarn/global/node_modules/@pymodel/pythinker-code'), ).toBe('yarn-global'); }); it('detects bun global', () => { expect( - classifyByPathHeuristic('/Users/me/.bun/install/global/node_modules/@pythoughts/pythinker-code'), + classifyByPathHeuristic('/Users/me/.bun/install/global/node_modules/@pymodel/pythinker-code'), ).toBe('bun-global'); }); it('detects homebrew on macOS (Cellar path)', () => { expect( - classifyByPathHeuristic('/opt/homebrew/Cellar/pythinker-code/0.5.0/libexec/lib/node_modules/@pythoughts/pythinker-code'), + classifyByPathHeuristic('/opt/homebrew/Cellar/pythinker-code/0.5.0/libexec/lib/node_modules/@pymodel/pythinker-code'), ).toBe('homebrew'); }); it('detects homebrew on Linux (Linuxbrew)', () => { expect( - classifyByPathHeuristic('/home/linuxbrew/.linuxbrew/Cellar/pythinker-code/0.5.0/libexec/lib/node_modules/@pythoughts/pythinker-code'), + classifyByPathHeuristic('/home/linuxbrew/.linuxbrew/Cellar/pythinker-code/0.5.0/libexec/lib/node_modules/@pymodel/pythinker-code'), ).toBe('homebrew'); }); it('does not treat npm-global under Homebrew prefix as homebrew', () => { expect( - classifyByPathHeuristic('/opt/homebrew/lib/node_modules/@pythoughts/pythinker-code'), + classifyByPathHeuristic('/opt/homebrew/lib/node_modules/@pymodel/pythinker-code'), ).toBeNull(); }); it('returns null for an unknown layout', () => { - expect(classifyByPathHeuristic('/Users/me/dev/@pythoughts/pythinker-code')).toBeNull(); + expect(classifyByPathHeuristic('/Users/me/dev/@pymodel/pythinker-code')).toBeNull(); }); }); describe('classifyInstallSource (npm prefix matching)', () => { it('matches a macOS/Linux npm global package path', () => { expect( - classifyInstallSource('/usr/local/lib/node_modules/@pythoughts/pythinker-code', '/usr/local', 'darwin'), + classifyInstallSource('/usr/local/lib/node_modules/@pymodel/pythinker-code', '/usr/local', 'darwin'), ).toBe('npm-global'); }); it('returns unsupported when the package path does not match the prefix', () => { expect( - classifyInstallSource('/Users/me/dev/@pythoughts/pythinker-code', '/usr/local', 'darwin'), + classifyInstallSource('/Users/me/dev/@pymodel/pythinker-code', '/usr/local', 'darwin'), ).toBe('unsupported'); }); }); @@ -105,7 +105,7 @@ describe('detectInstallSource', () => { await expect( detectInstallSource({ getPackageRoot: () => - '/Users/me/Library/pnpm/global/5/node_modules/@pythoughts/pythinker-code', + '/Users/me/Library/pnpm/global/5/node_modules/@pymodel/pythinker-code', getGlobalPrefix: async () => '/usr/local', detectNative: () => false, platform: 'darwin', @@ -116,7 +116,7 @@ describe('detectInstallSource', () => { it('returns yarn-global when packageRoot matches yarn heuristic', async () => { await expect( detectInstallSource({ - getPackageRoot: () => '/Users/me/.config/yarn/global/node_modules/@pythoughts/pythinker-code', + getPackageRoot: () => '/Users/me/.config/yarn/global/node_modules/@pymodel/pythinker-code', getGlobalPrefix: async () => '/usr/local', detectNative: () => false, platform: 'darwin', @@ -127,7 +127,7 @@ describe('detectInstallSource', () => { it('returns bun-global when packageRoot matches bun heuristic', async () => { await expect( detectInstallSource({ - getPackageRoot: () => '/Users/me/.bun/install/global/node_modules/@pythoughts/pythinker-code', + getPackageRoot: () => '/Users/me/.bun/install/global/node_modules/@pymodel/pythinker-code', getGlobalPrefix: async () => '/usr/local', detectNative: () => false, platform: 'darwin', @@ -138,7 +138,7 @@ describe('detectInstallSource', () => { it('returns npm-global when packageRoot matches npm prefix', async () => { await expect( detectInstallSource({ - getPackageRoot: () => '/usr/local/lib/node_modules/@pythoughts/pythinker-code', + getPackageRoot: () => '/usr/local/lib/node_modules/@pymodel/pythinker-code', getGlobalPrefix: async () => '/usr/local', detectNative: () => false, platform: 'darwin', @@ -150,7 +150,7 @@ describe('detectInstallSource', () => { await expect( detectInstallSource({ getPackageRoot: () => - '/opt/homebrew/Cellar/pythinker-code/0.5.0/libexec/lib/node_modules/@pythoughts/pythinker-code', + '/opt/homebrew/Cellar/pythinker-code/0.5.0/libexec/lib/node_modules/@pymodel/pythinker-code', getGlobalPrefix: async () => '/usr/local', detectNative: () => false, platform: 'darwin', @@ -161,7 +161,7 @@ describe('detectInstallSource', () => { it('returns native when SEA isSea() is true (highest priority)', async () => { await expect( detectInstallSource({ - getPackageRoot: () => '/usr/local/lib/node_modules/@pythoughts/pythinker-code', + getPackageRoot: () => '/usr/local/lib/node_modules/@pymodel/pythinker-code', getGlobalPrefix: async () => '/usr/local', detectNative: () => true, platform: 'darwin', @@ -172,7 +172,7 @@ describe('detectInstallSource', () => { it('returns unsupported when nothing matches', async () => { await expect( detectInstallSource({ - getPackageRoot: () => '/Users/me/dev/@pythoughts/pythinker-code', + getPackageRoot: () => '/Users/me/dev/@pymodel/pythinker-code', getGlobalPrefix: async () => '/usr/local', detectNative: () => false, platform: 'darwin', @@ -183,7 +183,7 @@ describe('detectInstallSource', () => { it('returns unsupported when npm prefix lookup throws', async () => { await expect( detectInstallSource({ - getPackageRoot: () => '/Users/me/dev/@pythoughts/pythinker-code', + getPackageRoot: () => '/Users/me/dev/@pymodel/pythinker-code', getGlobalPrefix: async () => { throw new Error('prefix failed'); }, diff --git a/apps/pythinker-code/test/cli/upgrade.test.ts b/apps/pythinker-code/test/cli/upgrade.test.ts index 421388a3..9642af21 100644 --- a/apps/pythinker-code/test/cli/upgrade.test.ts +++ b/apps/pythinker-code/test/cli/upgrade.test.ts @@ -129,7 +129,7 @@ describe('handleUpgrade', () => { expect(deps.promptForInstallChoice).toHaveBeenCalledWith({ currentVersion: '0.4.0', target: { version: '0.5.0' }, - installCommand: 'npm install -g @pythoughts/pythinker-code@0.5.0', + installCommand: 'npm install -g @pymodel/pythinker-code@0.5.0', installSource: 'npm-global', }); expect(deps.installUpdate).toHaveBeenCalledWith('npm-global', '0.5.0', 'darwin'); @@ -150,7 +150,7 @@ describe('handleUpgrade', () => { targetVersion: '0.5.0', source: 'npm-global', })); - expect(stdout.join('')).toContain('Updated @pythoughts/pythinker-code to 0.5.0'); + expect(stdout.join('')).toContain('Updated @pymodel/pythinker-code to 0.5.0'); expect(stderr.join('')).toBe(''); }); @@ -199,7 +199,7 @@ describe('handleUpgrade', () => { target_version: '0.5.0', source: 'unsupported', })); - expect(stdout.join('')).toContain('To update manually, run: npm install -g @pythoughts/pythinker-code@0.5.0'); + expect(stdout.join('')).toContain('To update manually, run: npm install -g @pymodel/pythinker-code@0.5.0'); }); it('prints the manual update command without prompting when not interactive', async () => { @@ -214,7 +214,7 @@ describe('handleUpgrade', () => { target_version: '0.5.0', source: 'npm-global', })); - expect(stdout.join('')).toContain('To update manually, run: npm install -g @pythoughts/pythinker-code@0.5.0'); + expect(stdout.join('')).toContain('To update manually, run: npm install -g @pymodel/pythinker-code@0.5.0'); }); it('records why a manual install could not be verified', async () => { @@ -250,7 +250,7 @@ describe('handleUpgrade', () => { await expect(handleUpgrade('0.4.0', { ...deps, ...writable })).resolves.toBe(1); expect(stderr.join('')).toContain( - 'warning: failed to install @pythoughts/pythinker-code@0.5.0: npm exited with code 1', + 'warning: failed to install @pymodel/pythinker-code@0.5.0: npm exited with code 1', ); expect(deps.track).toHaveBeenCalledWith('upgrade_command_failed', expect.objectContaining({ target_version: '0.5.0', @@ -297,7 +297,7 @@ describe('handleUpgrade', () => { await expect(handleUpgrade('0.4.0', { ...deps, ...writable })).resolves.toBe(0); expect(deps.installUpdate).toHaveBeenCalledWith('npm-global', '0.5.0', 'darwin'); - expect(stdout.join('')).toContain('Updated @pythoughts/pythinker-code to 0.5.0'); + expect(stdout.join('')).toContain('Updated @pymodel/pythinker-code to 0.5.0'); }); it('native: refuses the update when the manifest omits the running platform', async () => { @@ -330,7 +330,7 @@ describe('handleUpgrade', () => { await expect(handleUpgrade('0.4.0', { ...deps, ...writable })).resolves.toBe(0); expect(deps.installUpdate).toHaveBeenCalledWith('native', '0.5.0', 'darwin'); - expect(stdout.join('')).toContain('Updated @pythoughts/pythinker-code to 0.5.0'); + expect(stdout.join('')).toContain('Updated @pymodel/pythinker-code to 0.5.0'); }); it('npm-global: still installs when the manifest omits the running platform', async () => { @@ -348,7 +348,7 @@ describe('handleUpgrade', () => { target_version: '0.5.0', source: 'npm-global', })); - expect(stdout.join('')).toContain('Updated @pythoughts/pythinker-code to 0.5.0'); + expect(stdout.join('')).toContain('Updated @pymodel/pythinker-code to 0.5.0'); }); it('refuses the install while a fresh active install for another version is running', async () => { @@ -423,7 +423,7 @@ describe('handleUpgrade', () => { notifiedAt: null, }, })); - expect(stdout.join('')).toContain('Updated @pythoughts/pythinker-code to 0.5.0'); + expect(stdout.join('')).toContain('Updated @pymodel/pythinker-code to 0.5.0'); }); it('releases the lock and records the failure when the foreground install fails', async () => { @@ -462,7 +462,7 @@ describe('handleUpgrade', () => { }), })); expect(stderr.join('')).toContain( - 'warning: failed to install @pythoughts/pythinker-code@0.5.0: npm exited with code 1', + 'warning: failed to install @pymodel/pythinker-code@0.5.0: npm exited with code 1', ); }); diff --git a/apps/pythinker-code/test/e2e/local-logging-export.e2e.test.ts b/apps/pythinker-code/test/e2e/local-logging-export.e2e.test.ts index 4730579c..bc0386a5 100644 --- a/apps/pythinker-code/test/e2e/local-logging-export.e2e.test.ts +++ b/apps/pythinker-code/test/e2e/local-logging-export.e2e.test.ts @@ -8,7 +8,7 @@ import { afterEach, beforeEach, describe, expect, it } from 'vitest'; import { registerExportCommand } from '#/cli/sub/export'; import { createPythinkerCodeHostIdentity } from '#/cli/version'; -import { createPythinkerHarness, log } from '@pythoughts/pythinker-code-sdk'; +import { createPythinkerHarness, log } from '@pymodel/pythinker-code-sdk'; import { __resetRootLoggerForTest } from '../../../../packages/agent-core/src/logging/logger'; const SESSION_LOG = 'logs/pythinker-code.log'; diff --git a/apps/pythinker-code/test/e2e/real-llm-smoke.e2e.test.ts b/apps/pythinker-code/test/e2e/real-llm-smoke.e2e.test.ts index 5141a8fd..5511d3ef 100644 --- a/apps/pythinker-code/test/e2e/real-llm-smoke.e2e.test.ts +++ b/apps/pythinker-code/test/e2e/real-llm-smoke.e2e.test.ts @@ -14,7 +14,7 @@ import { mkdirSync } from 'node:fs'; import process from 'node:process'; -import { createPythinkerHarness, type Event } from '@pythoughts/pythinker-code-sdk'; +import { createPythinkerHarness, type Event } from '@pymodel/pythinker-code-sdk'; import { describe, expect, test } from 'vitest'; import { createPythinkerCodeHostIdentity, getVersion } from '#/cli/version'; diff --git a/apps/pythinker-code/test/migration/migration-screen.test.ts b/apps/pythinker-code/test/migration/migration-screen.test.ts index 66a48495..5e4e9bff 100644 --- a/apps/pythinker-code/test/migration/migration-screen.test.ts +++ b/apps/pythinker-code/test/migration/migration-screen.test.ts @@ -8,7 +8,7 @@ import type { MigrationPlan, MigrationReport, RunMigrationInput, -} from '@pythoughts/migration-legacy'; +} from '@pymodel/migration-legacy'; function makePlan(over: Partial = {}): MigrationPlan { return { diff --git a/apps/pythinker-code/test/scripts/native/release-artifacts.test.ts b/apps/pythinker-code/test/scripts/native/release-artifacts.test.ts index 2cd3c117..e1ab84f3 100644 --- a/apps/pythinker-code/test/scripts/native/release-artifacts.test.ts +++ b/apps/pythinker-code/test/scripts/native/release-artifacts.test.ts @@ -127,7 +127,7 @@ describe('native release artifacts', () => { `${checksum} pythinker-code-darwin-arm64.zip\n`, ); - await execFileAsync(process.execPath, [manifestScript, releaseDir, '@pythoughts/pythinker-code@0.5.0']); + await execFileAsync(process.execPath, [manifestScript, releaseDir, '@pymodel/pythinker-code@0.5.0']); const manifest = JSON.parse( await readFile(join(releaseDir, 'manifest.json'), 'utf-8'), @@ -138,7 +138,7 @@ describe('native release artifacts', () => { }; expect(manifest).toEqual({ version: '0.5.0', - tag: '@pythoughts/pythinker-code@0.5.0', + tag: '@pymodel/pythinker-code@0.5.0', platforms: { 'darwin-arm64': { filename: 'pythinker-code-darwin-arm64.zip', diff --git a/apps/pythinker-code/test/tui/activity-pane.test.ts b/apps/pythinker-code/test/tui/activity-pane.test.ts index 783f821d..0e3d1d66 100644 --- a/apps/pythinker-code/test/tui/activity-pane.test.ts +++ b/apps/pythinker-code/test/tui/activity-pane.test.ts @@ -1,5 +1,5 @@ import chalk from 'chalk'; -import type { Event } from '@pythoughts/pythinker-code-sdk'; +import type { Event } from '@pymodel/pythinker-code-sdk'; import { describe, expect, it, vi } from 'vitest'; import { DynamicWorkflowMissionControlComponent } from '#/tui/components/messages/dynamic-workflow-mission-control'; diff --git a/apps/pythinker-code/test/tui/background-task-status.test.ts b/apps/pythinker-code/test/tui/background-task-status.test.ts index 8f0d85d0..a7bd8667 100644 --- a/apps/pythinker-code/test/tui/background-task-status.test.ts +++ b/apps/pythinker-code/test/tui/background-task-status.test.ts @@ -1,4 +1,4 @@ -import type { BackgroundTaskInfo, BackgroundTaskStatus } from '@pythoughts/pythinker-code-sdk'; +import type { BackgroundTaskInfo, BackgroundTaskStatus } from '@pymodel/pythinker-code-sdk'; import { describe, expect, it } from 'vitest'; import { formatBackgroundTaskTranscript } from '@/tui/utils/background-task-status'; diff --git a/apps/pythinker-code/test/tui/commands/auth.test.ts b/apps/pythinker-code/test/tui/commands/auth.test.ts index d44bdfa1..11442611 100644 --- a/apps/pythinker-code/test/tui/commands/auth.test.ts +++ b/apps/pythinker-code/test/tui/commands/auth.test.ts @@ -1,5 +1,5 @@ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; -import type { CatalogProviderEntry, PythinkerConfig } from '@pythoughts/pythinker-code-sdk'; +import type { CatalogProviderEntry, PythinkerConfig } from '@pymodel/pythinker-code-sdk'; import { connectCatalogProvider } from '#/tui/commands/auth'; import type { SlashCommandHost } from '#/tui/commands/dispatch'; @@ -129,12 +129,12 @@ describe('connectCatalogProvider credential acquisition', () => { describe('OpenAI Codex login keeps the existing provider until it is replaced', () => { afterEach(() => { vi.resetModules(); - vi.doUnmock('@pythoughts/pythinker-code-oauth'); + vi.doUnmock('@pymodel/pythinker-code-oauth'); }); it('leaves the configured provider intact when the model picker is cancelled', async () => { - const oauth = await import('@pythoughts/pythinker-code-oauth'); - vi.doMock('@pythoughts/pythinker-code-oauth', () => ({ + const oauth = await import('@pymodel/pythinker-code-oauth'); + vi.doMock('@pymodel/pythinker-code-oauth', () => ({ ...oauth, runOpenAICodexOAuthFlow: vi.fn(async () => ({ accessToken: 'access', @@ -144,7 +144,7 @@ describe('OpenAI Codex login keeps the existing provider until it is replaced', fetchOpenAICodexModels: vi.fn(async () => [{ id: 'gpt-5-codex', name: 'GPT-5 Codex' }]), })); vi.resetModules(); - const { runLogin } = await import('@pythoughts/pythinker-code-sdk'); + const { runLogin } = await import('@pymodel/pythinker-code-sdk'); const { OPENAI_CODEX_OAUTH_PLATFORM_ID, OPENAI_CODEX_PROVIDER_ID } = oauth; let config = { diff --git a/apps/pythinker-code/test/tui/commands/experimental-flags.test.ts b/apps/pythinker-code/test/tui/commands/experimental-flags.test.ts index 6513a5dd..a1d70cae 100644 --- a/apps/pythinker-code/test/tui/commands/experimental-flags.test.ts +++ b/apps/pythinker-code/test/tui/commands/experimental-flags.test.ts @@ -2,7 +2,7 @@ import { mkdtemp, rm } from 'node:fs/promises'; import { tmpdir } from 'node:os'; import { join } from 'node:path'; -import { createPythinkerHarness } from '@pythoughts/pythinker-code-sdk'; +import { createPythinkerHarness } from '@pymodel/pythinker-code-sdk'; import { afterEach, describe, expect, it, vi } from 'vitest'; import { diff --git a/apps/pythinker-code/test/tui/commands/experiments.test.ts b/apps/pythinker-code/test/tui/commands/experiments.test.ts index 0a0c192c..594d55ec 100644 --- a/apps/pythinker-code/test/tui/commands/experiments.test.ts +++ b/apps/pythinker-code/test/tui/commands/experiments.test.ts @@ -1,4 +1,4 @@ -import type { ExperimentalFeatureState } from '@pythoughts/pythinker-code-sdk'; +import type { ExperimentalFeatureState } from '@pymodel/pythinker-code-sdk'; import { afterEach, describe, expect, it, vi } from 'vitest'; import type { SlashCommandHost } from '#/tui/commands'; diff --git a/apps/pythinker-code/test/tui/commands/goal.test.ts b/apps/pythinker-code/test/tui/commands/goal.test.ts index fafdc7d7..3fa068f1 100644 --- a/apps/pythinker-code/test/tui/commands/goal.test.ts +++ b/apps/pythinker-code/test/tui/commands/goal.test.ts @@ -1,4 +1,4 @@ -import { ErrorCodes, PythinkerError } from '@pythoughts/pythinker-code-sdk'; +import { ErrorCodes, PythinkerError } from '@pymodel/pythinker-code-sdk'; import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; import { diff --git a/apps/pythinker-code/test/tui/commands/skills.test.ts b/apps/pythinker-code/test/tui/commands/skills.test.ts index 0d6bfd03..9128d7ab 100644 --- a/apps/pythinker-code/test/tui/commands/skills.test.ts +++ b/apps/pythinker-code/test/tui/commands/skills.test.ts @@ -5,7 +5,7 @@ import { handleSkillsCommand, isUserActivatableSkill, } from '#/tui/commands/index'; -import type { SkillSummary } from '@pythoughts/pythinker-code-sdk'; +import type { SkillSummary } from '@pymodel/pythinker-code-sdk'; import { describe, expect, it, vi } from 'vitest'; function skill( diff --git a/apps/pythinker-code/test/tui/commands/update-preferences.test.ts b/apps/pythinker-code/test/tui/commands/update-preferences.test.ts index fb688c83..15762fc3 100644 --- a/apps/pythinker-code/test/tui/commands/update-preferences.test.ts +++ b/apps/pythinker-code/test/tui/commands/update-preferences.test.ts @@ -18,8 +18,8 @@ const mocks = vi.hoisted(() => ({ startManualUpdate: vi.fn(), })); -vi.mock('@pythoughts/pythinker-telemetry', async (importOriginal) => ({ - ...(await importOriginal()), +vi.mock('@pymodel/pythinker-telemetry', async (importOriginal) => ({ + ...(await importOriginal()), disableTelemetry: mocks.disableTelemetry, })); @@ -317,7 +317,7 @@ describe('update command', () => { attempts: 2, failedAt: '2026-08-05T08:00:00.000Z', message: 'npm exited with code 1', - command: 'npm install -g @pythoughts/pythinker-code@0.10.0', + command: 'npm install -g @pymodel/pythinker-code@0.10.0', }); await handleUpdateCommand(host, ''); @@ -325,7 +325,7 @@ describe('update command', () => { expect(host.showError).toHaveBeenCalledWith( 'Update to v0.10.0 failed after 2 attempts.\n' + 'Reason: npm exited with code 1\n' + - 'To update manually, run: npm install -g @pythoughts/pythinker-code@0.10.0', + 'To update manually, run: npm install -g @pymodel/pythinker-code@0.10.0', ); }); @@ -336,14 +336,14 @@ describe('update command', () => { version: '0.10.0', attempts: 2, failedAt: '2026-08-05T08:00:00.000Z', - command: 'npm install -g @pythoughts/pythinker-code@0.10.0', + command: 'npm install -g @pymodel/pythinker-code@0.10.0', }); await handleUpdateCommand(host, ''); expect(host.showError).toHaveBeenCalledWith( 'Update to v0.10.0 failed after 2 attempts.\n' + - 'To update manually, run: npm install -g @pythoughts/pythinker-code@0.10.0', + 'To update manually, run: npm install -g @pymodel/pythinker-code@0.10.0', ); }); @@ -356,7 +356,7 @@ describe('update command', () => { attempts: 3, failedAt: '2026-08-05T08:00:00.000Z', message: longReason, - command: 'npm install -g @pythoughts/pythinker-code@0.10.0', + command: 'npm install -g @pymodel/pythinker-code@0.10.0', }); await handleUpdateCommand(host, ''); @@ -364,7 +364,7 @@ describe('update command', () => { expect(host.showError).toHaveBeenCalledWith( 'Update to v0.10.0 failed after 3 attempts.\n' + `Reason: ${longReason.slice(0, 160)}… (truncated)\n` + - 'To update manually, run: npm install -g @pythoughts/pythinker-code@0.10.0', + 'To update manually, run: npm install -g @pymodel/pythinker-code@0.10.0', ); }); }); diff --git a/apps/pythinker-code/test/tui/components/dialogs/experiments-selector.test.ts b/apps/pythinker-code/test/tui/components/dialogs/experiments-selector.test.ts index 6b2a2fb5..bbafa37d 100644 --- a/apps/pythinker-code/test/tui/components/dialogs/experiments-selector.test.ts +++ b/apps/pythinker-code/test/tui/components/dialogs/experiments-selector.test.ts @@ -1,4 +1,4 @@ -import type { ExperimentalFeatureState } from '@pythoughts/pythinker-code-sdk'; +import type { ExperimentalFeatureState } from '@pymodel/pythinker-code-sdk'; import { describe, expect, it, vi } from 'vitest'; import { diff --git a/apps/pythinker-code/test/tui/components/dialogs/model-selector.test.ts b/apps/pythinker-code/test/tui/components/dialogs/model-selector.test.ts index 1e3d58fb..627efa8c 100644 --- a/apps/pythinker-code/test/tui/components/dialogs/model-selector.test.ts +++ b/apps/pythinker-code/test/tui/components/dialogs/model-selector.test.ts @@ -1,4 +1,4 @@ -import type { ModelAlias } from '@pythoughts/pythinker-code-sdk'; +import type { ModelAlias } from '@pymodel/pythinker-code-sdk'; import { visibleWidth } from '@earendil-works/pi-tui'; import { describe, expect, it, vi } from 'vitest'; diff --git a/apps/pythinker-code/test/tui/components/dialogs/platform-selector.test.ts b/apps/pythinker-code/test/tui/components/dialogs/platform-selector.test.ts index fa1ebe1a..88c72f44 100644 --- a/apps/pythinker-code/test/tui/components/dialogs/platform-selector.test.ts +++ b/apps/pythinker-code/test/tui/components/dialogs/platform-selector.test.ts @@ -1,6 +1,6 @@ import { describe, expect, it, vi } from 'vitest'; -import { CATALOG_PLATFORM_VALUE_PREFIX } from '@pythoughts/pythinker-code-sdk'; +import { CATALOG_PLATFORM_VALUE_PREFIX } from '@pymodel/pythinker-code-sdk'; import { PlatformSelectorComponent } from '#/tui/components/dialogs/platform-selector'; import { promptPlatformSelection } from '#/tui/commands/prompts'; diff --git a/apps/pythinker-code/test/tui/components/dialogs/plugins-selector.test.ts b/apps/pythinker-code/test/tui/components/dialogs/plugins-selector.test.ts index e5b6d1fc..f7f4801f 100644 --- a/apps/pythinker-code/test/tui/components/dialogs/plugins-selector.test.ts +++ b/apps/pythinker-code/test/tui/components/dialogs/plugins-selector.test.ts @@ -1,5 +1,5 @@ import { visibleWidth } from '@earendil-works/pi-tui'; -import type { PluginSummary } from '@pythoughts/pythinker-code-sdk'; +import type { PluginSummary } from '@pymodel/pythinker-code-sdk'; import { describe, expect, it, vi } from 'vitest'; import chalk from 'chalk'; diff --git a/apps/pythinker-code/test/tui/components/dialogs/provider-manager.test.ts b/apps/pythinker-code/test/tui/components/dialogs/provider-manager.test.ts index 092f3b7d..167ed5ae 100644 --- a/apps/pythinker-code/test/tui/components/dialogs/provider-manager.test.ts +++ b/apps/pythinker-code/test/tui/components/dialogs/provider-manager.test.ts @@ -1,4 +1,4 @@ -import type { ProviderConfig } from '@pythoughts/pythinker-code-sdk'; +import type { ProviderConfig } from '@pymodel/pythinker-code-sdk'; import chalk from 'chalk'; import { afterAll, beforeAll, describe, expect, it, vi } from 'vitest'; diff --git a/apps/pythinker-code/test/tui/components/dialogs/tabbed-model-selector.test.ts b/apps/pythinker-code/test/tui/components/dialogs/tabbed-model-selector.test.ts index 521a3e5c..98c2efbd 100644 --- a/apps/pythinker-code/test/tui/components/dialogs/tabbed-model-selector.test.ts +++ b/apps/pythinker-code/test/tui/components/dialogs/tabbed-model-selector.test.ts @@ -1,4 +1,4 @@ -import type { ModelAlias } from '@pythoughts/pythinker-code-sdk'; +import type { ModelAlias } from '@pymodel/pythinker-code-sdk'; import chalk from 'chalk'; import { afterAll, beforeAll, describe, expect, it, vi } from 'vitest'; diff --git a/apps/pythinker-code/test/tui/components/messages/goal-markers.test.ts b/apps/pythinker-code/test/tui/components/messages/goal-markers.test.ts index 98d4f3fd..638c3a4c 100644 --- a/apps/pythinker-code/test/tui/components/messages/goal-markers.test.ts +++ b/apps/pythinker-code/test/tui/components/messages/goal-markers.test.ts @@ -3,7 +3,7 @@ import { describe, expect, it } from 'vitest'; import { DynamicWorkflowModeMarkerComponent } from '#/tui/components/messages/dynamic-workflow-markers'; import { buildGoalMarker, GoalMarkerComponent } from '#/tui/components/messages/goal-markers'; -import type { GoalChange } from '@pythoughts/pythinker-code-sdk'; +import type { GoalChange } from '@pymodel/pythinker-code-sdk'; const ANSI_SGR = /\u001B\[[0-9;]*m/g; function strip(lines: string[]): string { diff --git a/apps/pythinker-code/test/tui/components/messages/goal-panel.test.ts b/apps/pythinker-code/test/tui/components/messages/goal-panel.test.ts index 4ce80a34..d3329727 100644 --- a/apps/pythinker-code/test/tui/components/messages/goal-panel.test.ts +++ b/apps/pythinker-code/test/tui/components/messages/goal-panel.test.ts @@ -12,7 +12,7 @@ import { } from '#/tui/components/messages/goal-panel'; import { STATUS_BULLET } from '#/tui/constant/symbols'; import { darkColors } from '#/tui/theme/colors'; -import type { GoalSnapshot } from '@pythoughts/pythinker-code-sdk'; +import type { GoalSnapshot } from '@pymodel/pythinker-code-sdk'; const previousChalkLevel = chalk.level; beforeAll(() => { diff --git a/apps/pythinker-code/test/tui/components/panels/footer-goal-badge.test.ts b/apps/pythinker-code/test/tui/components/panels/footer-goal-badge.test.ts index 5e72e6e0..834a4797 100644 --- a/apps/pythinker-code/test/tui/components/panels/footer-goal-badge.test.ts +++ b/apps/pythinker-code/test/tui/components/panels/footer-goal-badge.test.ts @@ -7,7 +7,7 @@ import { reduceFooterState, selectStatusBarExtras, } from '#/tui/runtime/footer/footer-model'; -import type { GoalSnapshot } from '@pythoughts/pythinker-code-sdk'; +import type { GoalSnapshot } from '@pymodel/pythinker-code-sdk'; import type { AppState } from '#/tui/types'; function baseState(overrides: Partial = {}): AppState { diff --git a/apps/pythinker-code/test/tui/export-markdown.test.ts b/apps/pythinker-code/test/tui/export-markdown.test.ts index 793f1dc4..c87ed5df 100644 --- a/apps/pythinker-code/test/tui/export-markdown.test.ts +++ b/apps/pythinker-code/test/tui/export-markdown.test.ts @@ -1,6 +1,6 @@ import { describe, expect, it } from 'vitest'; -import type { ContentPart, ToolCall } from '@pythoughts/pythinker-code-sdk'; -import type { ContextMessage, PromptOrigin } from '@pythoughts/pythinker-code-sdk'; +import type { ContentPart, ToolCall } from '@pymodel/pythinker-code-sdk'; +import type { ContextMessage, PromptOrigin } from '@pymodel/pythinker-code-sdk'; import { buildExportMarkdown, diff --git a/apps/pythinker-code/test/tui/goal-queue-store.test.ts b/apps/pythinker-code/test/tui/goal-queue-store.test.ts index 16db7658..c0003a84 100644 --- a/apps/pythinker-code/test/tui/goal-queue-store.test.ts +++ b/apps/pythinker-code/test/tui/goal-queue-store.test.ts @@ -2,7 +2,7 @@ import { mkdir, mkdtemp, readFile, rm, writeFile } from 'node:fs/promises'; import { tmpdir } from 'node:os'; import { join } from 'node:path'; import { afterEach, beforeEach, describe, expect, it } from 'vitest'; -import { ErrorCodes, PythinkerError } from '@pythoughts/pythinker-code-sdk'; +import { ErrorCodes, PythinkerError } from '@pymodel/pythinker-code-sdk'; import { appendGoalQueueItem, diff --git a/apps/pythinker-code/test/tui/message-replay.test.ts b/apps/pythinker-code/test/tui/message-replay.test.ts index 5b0a19c3..7a484a76 100644 --- a/apps/pythinker-code/test/tui/message-replay.test.ts +++ b/apps/pythinker-code/test/tui/message-replay.test.ts @@ -11,7 +11,7 @@ import type { Role, Session, ToolCall, -} from '@pythoughts/pythinker-code-sdk'; +} from '@pymodel/pythinker-code-sdk'; import { describe, expect, it, vi } from 'vitest'; import { AgentGroupComponent } from '#/tui/components/messages/agent-group'; diff --git a/apps/pythinker-code/test/tui/pythinker-tui-message-flow.test.ts b/apps/pythinker-code/test/tui/pythinker-tui-message-flow.test.ts index 96e66d1b..a19c3944 100644 --- a/apps/pythinker-code/test/tui/pythinker-tui-message-flow.test.ts +++ b/apps/pythinker-code/test/tui/pythinker-tui-message-flow.test.ts @@ -12,7 +12,7 @@ import { type AutocompleteProvider, type Component, } from '@earendil-works/pi-tui'; -import type { ApprovalRequest, ApprovalResponse, Event } from '@pythoughts/pythinker-code-sdk'; +import type { ApprovalRequest, ApprovalResponse, Event } from '@pymodel/pythinker-code-sdk'; import { afterEach, describe, expect, it, vi } from 'vitest'; import { ApprovalPanelComponent } from '#/tui/components/dialogs/approval-panel'; diff --git a/apps/pythinker-code/test/tui/pythinker-tui-startup.test.ts b/apps/pythinker-code/test/tui/pythinker-tui-startup.test.ts index 6af68ba2..5ed7adf4 100644 --- a/apps/pythinker-code/test/tui/pythinker-tui-startup.test.ts +++ b/apps/pythinker-code/test/tui/pythinker-tui-startup.test.ts @@ -11,8 +11,8 @@ import { CATALOG_PLATFORM_VALUE_PREFIX, log, type GoalSnapshot, -} from '@pythoughts/pythinker-code-sdk'; -import type { MigrationPlan } from '@pythoughts/migration-legacy'; +} from '@pymodel/pythinker-code-sdk'; +import type { MigrationPlan } from '@pymodel/migration-legacy'; import { describe, expect, it, vi } from 'vitest'; import { BannerProvider } from '#/tui/banner/banner-provider'; diff --git a/apps/pythinker-code/test/tui/reverse-rpc/approval.test.ts b/apps/pythinker-code/test/tui/reverse-rpc/approval.test.ts index ee753a54..04313109 100644 --- a/apps/pythinker-code/test/tui/reverse-rpc/approval.test.ts +++ b/apps/pythinker-code/test/tui/reverse-rpc/approval.test.ts @@ -1,4 +1,4 @@ -import type { ApprovalRequest } from '@pythoughts/pythinker-code-sdk'; +import type { ApprovalRequest } from '@pymodel/pythinker-code-sdk'; import { describe, expect, it, vi } from 'vitest'; import { ApprovalController } from '#/tui/reverse-rpc/approval/controller'; diff --git a/apps/pythinker-code/test/tui/reverse-rpc/question.test.ts b/apps/pythinker-code/test/tui/reverse-rpc/question.test.ts index ec2a8ca9..23928915 100644 --- a/apps/pythinker-code/test/tui/reverse-rpc/question.test.ts +++ b/apps/pythinker-code/test/tui/reverse-rpc/question.test.ts @@ -1,4 +1,4 @@ -import type { QuestionRequest } from '@pythoughts/pythinker-code-sdk'; +import type { QuestionRequest } from '@pymodel/pythinker-code-sdk'; import { describe, expect, it, vi } from 'vitest'; import { QuestionController } from '#/tui/reverse-rpc/question/controller'; diff --git a/apps/pythinker-code/test/tui/task-output-viewer.test.ts b/apps/pythinker-code/test/tui/task-output-viewer.test.ts index d95c275f..2f53619d 100644 --- a/apps/pythinker-code/test/tui/task-output-viewer.test.ts +++ b/apps/pythinker-code/test/tui/task-output-viewer.test.ts @@ -1,5 +1,5 @@ import type { Terminal } from '@earendil-works/pi-tui'; -import type { BackgroundTaskInfo } from '@pythoughts/pythinker-code-sdk'; +import type { BackgroundTaskInfo } from '@pymodel/pythinker-code-sdk'; import { describe, expect, it, vi } from 'vitest'; import { TaskOutputViewer } from '@/tui/components/dialogs/task-output-viewer'; diff --git a/apps/pythinker-code/test/tui/tasks-browser.test.ts b/apps/pythinker-code/test/tui/tasks-browser.test.ts index 01d07545..5f077b36 100644 --- a/apps/pythinker-code/test/tui/tasks-browser.test.ts +++ b/apps/pythinker-code/test/tui/tasks-browser.test.ts @@ -1,5 +1,5 @@ import type { Terminal } from '@earendil-works/pi-tui'; -import type { BackgroundTaskInfo, BackgroundTaskStatus } from '@pythoughts/pythinker-code-sdk'; +import type { BackgroundTaskInfo, BackgroundTaskStatus } from '@pymodel/pythinker-code-sdk'; import { describe, expect, it, vi } from 'vitest'; import { diff --git a/apps/pythinker-code/test/tui/tool-intent-label.test.ts b/apps/pythinker-code/test/tui/tool-intent-label.test.ts index 4a5535cb..e4af7c39 100644 --- a/apps/pythinker-code/test/tui/tool-intent-label.test.ts +++ b/apps/pythinker-code/test/tui/tool-intent-label.test.ts @@ -1,4 +1,4 @@ -import type { Event } from '@pythoughts/pythinker-code-sdk'; +import type { Event } from '@pymodel/pythinker-code-sdk'; import { afterEach, describe, expect, it, vi } from 'vitest'; import { DEFAULT_STATUS_LINE_CONFIG } from '#/tui/config'; diff --git a/apps/pythinker-code/test/tui/utils/event-payload.test.ts b/apps/pythinker-code/test/tui/utils/event-payload.test.ts index 7f062592..1d7fd418 100644 --- a/apps/pythinker-code/test/tui/utils/event-payload.test.ts +++ b/apps/pythinker-code/test/tui/utils/event-payload.test.ts @@ -1,4 +1,4 @@ -import { ErrorCodes, PythinkerError } from '@pythoughts/pythinker-code-sdk'; +import { ErrorCodes, PythinkerError } from '@pymodel/pythinker-code-sdk'; import { describe, expect, it } from 'vitest'; import { STREAMING_ARGS_PREVIEW_MAX_CHARS } from '#/tui/constant/streaming'; diff --git a/apps/pythinker-code/test/tui/utils/goal-completion.test.ts b/apps/pythinker-code/test/tui/utils/goal-completion.test.ts index 6219cbf3..fcfcad56 100644 --- a/apps/pythinker-code/test/tui/utils/goal-completion.test.ts +++ b/apps/pythinker-code/test/tui/utils/goal-completion.test.ts @@ -1,7 +1,7 @@ import { describe, expect, it } from 'vitest'; import { buildGoalCompletionMessage } from '#/tui/utils/goal-completion'; -import type { GoalSnapshot } from '@pythoughts/pythinker-code-sdk'; +import type { GoalSnapshot } from '@pymodel/pythinker-code-sdk'; function snapshot(overrides: Partial = {}): GoalSnapshot { return { diff --git a/apps/pythinker-code/test/tui/utils/mcp-oauth.test.ts b/apps/pythinker-code/test/tui/utils/mcp-oauth.test.ts index 552c209a..8311a668 100644 --- a/apps/pythinker-code/test/tui/utils/mcp-oauth.test.ts +++ b/apps/pythinker-code/test/tui/utils/mcp-oauth.test.ts @@ -1,7 +1,7 @@ import { MCP_OAUTH_AUTHORIZATION_URL_TOOL_UPDATE, type ToolUpdate, -} from '@pythoughts/pythinker-code-sdk'; +} from '@pymodel/pythinker-code-sdk'; import { describe, expect, it, vi } from 'vitest'; import { diff --git a/apps/pythinker-code/test/tui/utils/refresh-providers.test.ts b/apps/pythinker-code/test/tui/utils/refresh-providers.test.ts index 1f6b5632..ff8306d1 100644 --- a/apps/pythinker-code/test/tui/utils/refresh-providers.test.ts +++ b/apps/pythinker-code/test/tui/utils/refresh-providers.test.ts @@ -9,7 +9,7 @@ import { refreshAllProviderModels } from '../../../src/tui/utils/refresh-provide import { createPythinkerHarness, type PythinkerConfig, -} from '@pythoughts/pythinker-code-sdk'; +} from '@pymodel/pythinker-code-sdk'; type FetchMock = ( input: Parameters[0], diff --git a/apps/pythinker-code/test/tui/utils/session-picker-rows.test.ts b/apps/pythinker-code/test/tui/utils/session-picker-rows.test.ts index cfbca4e1..cee8f88f 100644 --- a/apps/pythinker-code/test/tui/utils/session-picker-rows.test.ts +++ b/apps/pythinker-code/test/tui/utils/session-picker-rows.test.ts @@ -1,4 +1,4 @@ -import type { SessionSummary } from '@pythoughts/pythinker-code-sdk'; +import type { SessionSummary } from '@pymodel/pythinker-code-sdk'; import { describe, expect, it } from 'vitest'; import { sessionRowsForPicker } from '#/tui/utils/session-picker-rows'; diff --git a/apps/pythinker-code/test/utils/plugin-marketplace.test.ts b/apps/pythinker-code/test/utils/plugin-marketplace.test.ts index c1c855d2..0f89a115 100644 --- a/apps/pythinker-code/test/utils/plugin-marketplace.test.ts +++ b/apps/pythinker-code/test/utils/plugin-marketplace.test.ts @@ -3,7 +3,7 @@ import { tmpdir } from 'node:os'; import { dirname, join } from 'node:path'; import { fileURLToPath } from 'node:url'; -import type { PluginSummary } from '@pythoughts/pythinker-code-sdk'; +import type { PluginSummary } from '@pymodel/pythinker-code-sdk'; import { afterEach, describe, expect, it, vi } from 'vitest'; import { diff --git a/apps/pythinker-code/tsdown.config.ts b/apps/pythinker-code/tsdown.config.ts index 0cf67946..7d6f3e49 100644 --- a/apps/pythinker-code/tsdown.config.ts +++ b/apps/pythinker-code/tsdown.config.ts @@ -38,10 +38,10 @@ export default defineConfig({ [BUILT_IN_CATALOG_DEFINE]: builtInCatalogDefine(), }, deps: { - alwaysBundle: [/^@pythoughts\//u, solidRuntimeAlias.find], + alwaysBundle: [/^@pymodel\//u, solidRuntimeAlias.find], // node-pty is a native addon: its `pty.node` binary cannot be bundled and // must resolve from node_modules at runtime. Keep it external (even though - // its importer @pythoughts/agent-core is force-bundled above) and declare it + // its importer @pymodel/agent-core is force-bundled above) and declare it // as a runtime dependency of this package so npm/npx installs it with its // prebuilt binary. Bundling it leaves the binary unresolvable → the terminal // PTY fails with "Failed to load native module: pty.node". diff --git a/apps/pythinker-code/tsdown.native.config.ts b/apps/pythinker-code/tsdown.native.config.ts index 2b85e75e..c15eb1d1 100644 --- a/apps/pythinker-code/tsdown.native.config.ts +++ b/apps/pythinker-code/tsdown.native.config.ts @@ -36,7 +36,7 @@ function shouldAlwaysBundle(id: string): boolean { if (builtins.has(id) || id.startsWith('node:')) return false; if (id === 'node-pty') return false; if (optionalNativeDependencies.has(id)) return false; - // Everything else is force-bundled, which covers `@pythoughts/*` (incl. + // Everything else is force-bundled, which covers `@pymodel/*` (incl. // dashboard-server for `pythinker dashboard`) plus its transitive `hono` / `@hono/node-server` // — so the SEA bundle is self-contained (check-bundle.mjs enforces this). return true; diff --git a/apps/pythinker-web/AGENTS.md b/apps/pythinker-web/AGENTS.md index 42d851e2..2f7e0784 100644 --- a/apps/pythinker-web/AGENTS.md +++ b/apps/pythinker-web/AGENTS.md @@ -1,6 +1,6 @@ # pythinker-web Agent Guide -Package-local rules for `apps/pythinker-web` (`@pythoughts/pythinker-web`). +Package-local rules for `apps/pythinker-web` (`@pymodel/pythinker-web`). ## What it is @@ -33,7 +33,7 @@ The browser web UI for Pythinker Code — a peer to the TUI in `apps/pythinker-c ## Commands -All via `pnpm --filter @pythoughts/pythinker-web …`: +All via `pnpm --filter @pymodel/pythinker-web …`: - `dev` — Vite dev server (port `WEB_PORT`, default 5175; proxies `/api/v1` to `PYTHINKER_SERVER_URL`, default `http://127.0.0.1:58627`). - `dev:stub` — offline stub daemon (`dev/stub-daemon.mjs`). @@ -44,7 +44,7 @@ All via `pnpm --filter @pythoughts/pythinker-web …`: ## Gotchas / hard rules -- **Do not depend on `@pythoughts/agent-core`** (mirrors the CLI/SDK rule). The web app is decoupled from core/protocol; wire types are re-implemented locally in `src/api/daemon/wire.ts`. Keep it that way. +- **Do not depend on `@pymodel/agent-core`** (mirrors the CLI/SDK rule). The web app is decoupled from core/protocol; wire types are re-implemented locally in `src/api/daemon/wire.ts`. Keep it that way. - **Same-origin by default:** the browser only talks to its own origin; Vite proxies `/api/v1` for both HTTP and WS. Set `VITE_PYTHINKER_SERVER_HTTP_URL` only when you intentionally want direct (CORS) mode. - Vite-injected globals (`__PYTHINKER_DEV_PROXY_TARGET__`, `__PYTHINKER_WEB_VERSION__`, `__PYTHINKER_WEB_COMMIT__`) are declared in `src/env.d.ts` and defined in `vite.config.ts`. Do not hand-edit `dist/`. - **Theming:** the root element carries `data-color-scheme` (`light` | `dark` | `system`); react to it through `useIsDark()`, not by reading the DOM directly. diff --git a/apps/pythinker-web/README.md b/apps/pythinker-web/README.md index 5618c87d..058ed36e 100644 --- a/apps/pythinker-web/README.md +++ b/apps/pythinker-web/README.md @@ -99,13 +99,13 @@ web UI of the `pythinker` CLI (`apps/pythinker-code`). `scripts/copy-web-assets.mjs`, which copies `apps/pythinker-web/dist` into `apps/pythinker-code/dist-web`. 4. **Publish** — the root `.github/workflows/release.yml` publishes - `@pythoughts/pythinker-code` to npm; `dist-web` is listed in the package `files` + `@pymodel/pythinker-code` to npm; `dist-web` is listed in the package `files` array, so the built web assets travel with the CLI package. 5. **Serve** — `pythinker server run` / `pythinker web` serves `dist-web` from the installed package. The web UI does not display its own package version or build commit. It is -bundled into the CLI package and follows the published `@pythoughts/pythinker-code` +bundled into the CLI package and follows the published `@pymodel/pythinker-code` release. ### Suggested improvements diff --git a/apps/pythinker-web/package.json b/apps/pythinker-web/package.json index 86f0b6c0..b1e8ff4f 100644 --- a/apps/pythinker-web/package.json +++ b/apps/pythinker-web/package.json @@ -1,5 +1,5 @@ { - "name": "@pythoughts/pythinker-web", + "name": "@pymodel/pythinker-web", "version": "0.1.1", "private": true, "license": "MIT", diff --git a/apps/pythinker-web/public/install.ps1 b/apps/pythinker-web/public/install.ps1 index aea72512..87aa1d7d 100644 --- a/apps/pythinker-web/public/install.ps1 +++ b/apps/pythinker-web/public/install.ps1 @@ -531,7 +531,7 @@ Unix / macOS / Linux users: } function Get-ReleaseTag([string]$ResolvedVersion) { - return "@pythoughts/pythinker-code@$ResolvedVersion" + return "@pymodel/pythinker-code@$ResolvedVersion" } function Get-EncodedReleaseTag([string]$ResolvedVersion) { @@ -558,7 +558,7 @@ Unix / macOS / Linux users: try { $latest = Get-HttpJson $Client $latestApi $tag = [string]$latest.tag_name - if ($tag -match '^@pythoughts/pythinker-code@(\d+\.\d+\.\d+)$') { + if ($tag -match '^@pymodel/pythinker-code@(\d+\.\d+\.\d+)$') { return $Matches[1] } Stop-Installer "could not parse latest release tag '$tag' from GitHub" diff --git a/apps/pythinker-web/public/install.sh b/apps/pythinker-web/public/install.sh index 48c3bc84..779ba3b4 100755 --- a/apps/pythinker-web/public/install.sh +++ b/apps/pythinker-web/public/install.sh @@ -820,7 +820,7 @@ _resolve_version() { payload="$(_fetch "$api")" \ || fail "could not reach $CDN_LATEST_URL or $api" VERSION="$(printf '%s' "$payload" \ - | sed -nE 's/.*"tag_name": *"@pythoughts\/pythinker-code@([0-9]+\.[0-9]+\.[0-9]+)".*/\1/p' \ + | sed -nE 's/.*"tag_name": *"@pymodel\/pythinker-code@([0-9]+\.[0-9]+\.[0-9]+)".*/\1/p' \ | head -n 1)" fi fi @@ -969,7 +969,7 @@ main() { _detect_target _resolve_version - tag_encoded="%40pythoughts%2Fpythinker-code%40${VERSION}" + tag_encoded="%40pymodel%2Fpythinker-code%40${VERSION}" archive="pythinker-code-${target}.zip" archive_url="https://github.com/${REPO}/releases/download/${tag_encoded}/${archive}" sha_url="${archive_url}.sha256" diff --git a/apps/pythinker-web/src/composables/messagesToTurns.ts b/apps/pythinker-web/src/composables/messagesToTurns.ts index be640a3f..f8d17d1b 100644 --- a/apps/pythinker-web/src/composables/messagesToTurns.ts +++ b/apps/pythinker-web/src/composables/messagesToTurns.ts @@ -363,7 +363,7 @@ interface Group { * user-typed slash command) is displayed; system-injected user turns * (compaction summaries, injections, hook results, retries, system triggers, * background tasks, cron) are hidden. The origin arrives via message metadata - * (see toProtocolMessage in @pythoughts/agent-core). + * (see toProtocolMessage in @pymodel/agent-core). */ function isDisplayableUserMessage(msg: AppMessage): boolean { const origin = msg.metadata?.['origin'] as { kind?: string; trigger?: string } | undefined; diff --git a/apps/site/package.json b/apps/site/package.json index cd558dcc..712a1655 100644 --- a/apps/site/package.json +++ b/apps/site/package.json @@ -1,5 +1,5 @@ { - "name": "@pythoughts/site", + "name": "@pymodel/site", "version": "0.1.0", "private": true, "type": "module", diff --git a/apps/site/public/index.md b/apps/site/public/index.md index c0c24907..ba4ffc21 100644 --- a/apps/site/public/index.md +++ b/apps/site/public/index.md @@ -40,7 +40,7 @@ nix run github:PyModel/pythinker-code ### npm ```sh -npm install -g @pythoughts/pythinker-code +npm install -g @pymodel/pythinker-code ``` Verify the installation with `pythinker --version`. @@ -66,4 +66,4 @@ Verify the installation with `pythinker --version`. - [Configuration](https://pymodel.github.io/pythinker-code/configuration/config-files) - [Command reference](https://pymodel.github.io/pythinker-code/reference/pythinker-command) - [GitHub repository](https://github.com/PyModel/pythinker-code) -- [npm package](https://www.npmjs.com/package/@pythoughts/pythinker-code) +- [npm package](https://www.npmjs.com/package/@pymodel/pythinker-code) diff --git a/apps/site/scripts/build-cdn.mjs b/apps/site/scripts/build-cdn.mjs index 601667c2..ba49dcef 100644 --- a/apps/site/scripts/build-cdn.mjs +++ b/apps/site/scripts/build-cdn.mjs @@ -111,7 +111,7 @@ const MIN_REQUIRED_VERSION = null; * it; clients that see no `platforms` key keep their previous behaviour. */ async function resolvePlatformArtifacts(version) { - const base = `${RELEASE_DOWNLOAD_BASE}/%40pythoughts%2Fpythinker-code%40${version}`; + const base = `${RELEASE_DOWNLOAD_BASE}/%40pymodel%2Fpythinker-code%40${version}`; let native; try { const response = await fetch(`${base}/manifest.json`, { signal: AbortSignal.timeout(30_000) }); diff --git a/apps/site/src/App.vue b/apps/site/src/App.vue index 1057d246..d223c379 100644 --- a/apps/site/src/App.vue +++ b/apps/site/src/App.vue @@ -12,7 +12,7 @@ const installRows = [ ['Windows (PowerShell)', 'irm https://code.pythinker.com/pythinker-code/install.ps1 | iex', '/brand/windows11.svg'], ['Homebrew', 'brew install pymodel/tap/pythinker-code'], ['Nix', 'nix run github:PyModel/pythinker-code'], - ['npm', 'npm install -g @pythoughts/pythinker-code', '/brand/npm.svg'], + ['npm', 'npm install -g @pymodel/pythinker-code', '/brand/npm.svg'], ['Verify', 'pythinker --version'], ]; @@ -205,7 +205,7 @@ onUnmounted(() => {

Get started
@@ -216,7 +216,7 @@ onUnmounted(() => {
@@ -233,13 +233,13 @@ onUnmounted(() => {

An open-source AI engineering agent for your terminal. It reads your repo, edits files, runs commands, and iterates until the job is done.

npm downloads per month for @pythoughts/pythinker-code {