Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .changeset/rename-vscode-marketplace-id.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@pymodel/pythinker-code": patch
---

Change the VS Code extension Marketplace ID to `pymodel.pythinker`. Existing users must install the extension again under the new ID because Microsoft permanently retired the previous ID.
6 changes: 3 additions & 3 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -169,7 +169,7 @@ jobs:
# Packages all six platform targets and runs the VSIX audit on each one.
# A failure here must stop the job before anything reaches a registry.
- name: Package and verify VSIX targets
run: pnpm --filter pythinker-code run package:platform
run: pnpm --filter pythinker run package:platform

- name: Publish to the Visual Studio Marketplace
env:
Expand All @@ -179,7 +179,7 @@ jobs:
echo "::warning::VSCE_PAT secret not set — skipping Marketplace publish."
exit 0
fi
pnpm --filter pythinker-code run publish:vsix
pnpm --filter pythinker run publish:vsix

# Open VSX serves Cursor / VSCodium / Windsurf. A failure here must not
# undo an already-successful Marketplace publish, so it only warns.
Expand All @@ -192,7 +192,7 @@ jobs:
echo "::warning::OVSX_PAT secret not set — skipping Open VSX publish."
exit 0
fi
pnpm --filter pythinker-code run publish:ovsx
pnpm --filter pythinker run publish:ovsx

- name: Upload VSIX artifacts
if: always()
Expand Down
6 changes: 3 additions & 3 deletions apps/site/src/App.vue
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ const terminalDemos = [
},
];

const vscodeInstallCommand = 'code --install-extension pymodel.pythinker-code';
const vscodeInstallCommand = 'code --install-extension pymodel.pythinker';

const copiedCommand = ref('');
const mobileMenu = ref(null);
Expand Down Expand Up @@ -307,12 +307,12 @@ onUnmounted(() => {
<li><strong>Thinking controls.</strong> Toggle reasoning or pick a model-supported thinking effort per task.</li>
</ul>
<div class="vscode-actions">
<a class="button button-primary" href="https://marketplace.visualstudio.com/items?itemName=pymodel.pythinker-code" target="_blank" rel="noopener">
<a class="button button-primary" href="https://marketplace.visualstudio.com/items?itemName=pymodel.pythinker" target="_blank" rel="noopener">
<img src="/brand/visualstudiocode.svg" alt="" width="16" height="16" />
Get the extension
</a>
<div class="vscode-command">
<code>code --install-extension pymodel.pythinker-code</code>
<code>code --install-extension pymodel.pythinker</code>
<button class="row-copy" type="button" aria-label="Copy VS Code install command" @click="copyText(vscodeInstallCommand)">
<svg v-if="copiedCommand === vscodeInstallCommand" aria-hidden="true" viewBox="0 0 20 20"><path d="m4 10 4 4 8-9" /></svg>
<svg v-else aria-hidden="true" viewBox="0 0 20 20"><rect x="7" y="3" width="10" height="11" rx="2" /><rect x="3" y="7" width="10" height="10" rx="2" /></svg>
Expand Down
2 changes: 1 addition & 1 deletion apps/vscode/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ AI coding assistant for VS Code, built for long-context workflows and complex co

Pythinker Code requires VS Code 1.100.0 or later.

1. Install from the [VS Code Marketplace](https://marketplace.visualstudio.com/items?itemName=pymodel.pythinker-code)
1. Install from the [VS Code Marketplace](https://marketplace.visualstudio.com/items?itemName=pymodel.pythinker)
2. Open a folder in VS Code
3. Click the Pythinker icon in the Activity Bar
4. Sign in, or use a provider already configured in the shared `config.toml`
Expand Down
2 changes: 1 addition & 1 deletion apps/vscode/package.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"name": "pythinker-code",
"name": "pythinker",
"publisher": "pymodel",
"displayName": "Pythinker Code",
"description": "Pythinker Code extension for VS Code",
Expand Down
16 changes: 8 additions & 8 deletions apps/vscode/scripts/release-extension.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@
// Tag and publish the VS Code extension in one pass:
// preflight -> bump -> commit -> build -> package+verify -> publish -> tag -> push.
//
// pnpm --filter pythinker-code run release 0.8.3
// pnpm --filter pythinker-code run release 0.8.3 --dry-run
// pnpm --filter pythinker run release 0.8.3
// pnpm --filter pythinker run release 0.8.3 --dry-run
//
// The Marketplace token is read from the macOS keychain, so it never reaches a
// shell history or a file. Store it once with:
Expand Down Expand Up @@ -70,7 +70,7 @@ async function assertUnpublished(version) {
const response = await fetch('https://marketplace.visualstudio.com/_apis/public/gallery/extensionquery', {
method: 'POST',
headers: { 'Content-Type': 'application/json', Accept: 'application/json;api-version=7.1-preview.1' },
body: JSON.stringify({ filters: [{ criteria: [{ filterType: 7, value: 'pymodel.pythinker-code' }] }], flags: 914 }),
body: JSON.stringify({ filters: [{ criteria: [{ filterType: 7, value: 'pymodel.pythinker' }] }], flags: 914 }),
});
if (!response.ok) {
console.warn(`Could not reach the Marketplace to check for ${version}; continuing.`);
Expand Down Expand Up @@ -119,7 +119,7 @@ async function main() {
// failed build — otherwise the next real run trips its own clean-tree check.
try {
run('pnpm', ['build']);
run('pnpm', ['--filter', 'pythinker-code', 'run', 'package:platform']);
run('pnpm', ['--filter', 'pythinker', 'run', 'package:platform']);
console.log(`\nDry run: built and verified ${version}. Nothing published, nothing tagged.`);
} finally {
writeFileSync(MANIFEST, originalManifest);
Expand All @@ -128,23 +128,23 @@ async function main() {
}

run('pnpm', ['build']);
run('pnpm', ['--filter', 'pythinker-code', 'run', 'package:platform']);
run('pnpm', ['--filter', 'pythinker', 'run', 'package:platform']);

// Commit before publishing so the shipped bits always correspond to a commit,
// and tag only once the Marketplace has actually accepted them.
run('git', ['add', 'apps/vscode/package.json']);
run('git', ['commit', '-m', `chore(vscode): release ${version}`]);

try {
run('pnpm', ['--filter', 'pythinker-code', 'run', 'publish:vsix'], { env: { ...process.env, VSCE_PAT: vscePat } });
run('pnpm', ['--filter', 'pythinker', 'run', 'publish:vsix'], { env: { ...process.env, VSCE_PAT: vscePat } });
} catch (error) {
// The version bump is already committed and some targets may already be
// live, so say exactly how to finish rather than leaving it to be worked out.
throw new Error(
`${error instanceof Error ? error.message : String(error)}\n\n` +
`${version} is partly published and NOT tagged. The publish summary above lists which\n` +
`targets are live; published ones are skipped on a re-run. Finish with:\n` +
` pnpm --filter pythinker-code run publish:vsix\n` +
` pnpm --filter pythinker run publish:vsix\n` +
` git tag -a ${tag} -m "Pythinker Code VS Code extension ${version}"\n` +
`Do not bump the version again — ${version} is already consumed.`,
);
Expand All @@ -155,7 +155,7 @@ async function main() {
// Open VSX serves Cursor / VSCodium / Windsurf, but it must never undo a
// successful Marketplace publish.
try {
run('pnpm', ['--filter', 'pythinker-code', 'run', 'publish:ovsx'], { env: { ...process.env, OVSX_PAT: ovsxPat } });
run('pnpm', ['--filter', 'pythinker', 'run', 'publish:ovsx'], { env: { ...process.env, OVSX_PAT: ovsxPat } });
} catch (error) {
console.warn(`Open VSX publish failed, Marketplace is live: ${error instanceof Error ? error.message : String(error)}`);
}
Expand Down
2 changes: 1 addition & 1 deletion apps/vscode/test/baseline.manager.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
* Scenario: VSCode-owned file baselines for new and forked sessions.
* Responsibilities: capture originals, show changes, keep/undo, and reject unsafe paths.
* Wiring: real temporary workspace/global-storage files; no stubbed collaborators.
* Run: pnpm --filter pythinker-code test -- baseline.manager.test.ts
* Run: pnpm --filter pythinker test -- baseline.manager.test.ts
*/
import { existsSync, writeFileSync } from 'node:fs';
import { chmod, mkdir, mkdtemp, readFile, rm, symlink, unlink, writeFile } from 'node:fs/promises';
Expand Down
2 changes: 1 addition & 1 deletion apps/vscode/test/bridge-handler.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
* Scenario: untrusted Webview RPC messages cross into the VS Code extension host.
* Responsibilities: validate requests, preserve public model metadata, omit private paths, and recover visibly from persisted state errors.
* Wiring: the real BridgeHandler and handlers; VS Code and the public Node SDK harness boundary are replaced.
* Run: pnpm --filter pythinker-code exec vitest run --config vitest.config.ts test/bridge-handler.test.ts
* Run: pnpm --filter pythinker exec vitest run --config vitest.config.ts test/bridge-handler.test.ts
*/
import { mkdtemp, readdir, rm, writeFile } from "node:fs/promises";
import { tmpdir } from "node:os";
Expand Down
2 changes: 1 addition & 1 deletion apps/vscode/test/extension-host-smoke.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
* Host cannot discover the developer's real home directory.
* Wiring: real smoke orchestration and filesystem; @vscode/test-electron is the
* external process/download boundary.
* Run: pnpm --filter pythinker-code exec vitest run --config vitest.config.ts test/extension-host-smoke.test.ts
* Run: pnpm --filter pythinker exec vitest run --config vitest.config.ts test/extension-host-smoke.test.ts
*/
import { mkdtemp, mkdir, rm, writeFile } from 'node:fs/promises';
import { tmpdir } from 'node:os';
Expand Down
2 changes: 1 addition & 1 deletion apps/vscode/test/extension-host/index.cjs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ const os = require("node:os");
const path = require("node:path");
const vscode = require("vscode");

const EXTENSION_ID = "pymodel.pythinker-code";
const EXTENSION_ID = "pymodel.pythinker";
const EXPECTED_COMMANDS = [
"pythinker.clearAllState",
"pythinker.focusInput",
Expand Down
2 changes: 1 addition & 1 deletion apps/vscode/test/pythinker-harness.integration.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
* Scenario: the VS Code host and another Node SDK client share one in-process Pythinker home.
* Responsibilities: outbound host identity, config/session interoperability, MCP credential/edit compatibility, and terminal provider failures.
* Wiring: PythinkerRuntime, PythinkerHarness, core, storage, and HTTP provider adapter are real; only the remote provider is local.
* Run: pnpm --filter pythinker-code exec vitest run test/pythinker-harness.integration.test.ts
* Run: pnpm --filter pythinker exec vitest run test/pythinker-harness.integration.test.ts
*/

import { mkdir, mkdtemp, readFile, rm, writeFile } from "node:fs/promises";
Expand Down
2 changes: 1 addition & 1 deletion apps/vscode/test/replay-resume.integration.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
* Scenario: persisted Node SDK sessions are reopened and rendered by the VS Code replay adapter.
* Responsibilities: restored tool displays and child-agent steps through the public resume state.
* Wiring: Node SDK, core, storage, and HTTP provider adapter are real; only the remote provider is local.
* Run: pnpm --filter pythinker-code exec vitest run --config vitest.config.ts test/replay-resume.integration.test.ts
* Run: pnpm --filter pythinker exec vitest run --config vitest.config.ts test/replay-resume.integration.test.ts
*/

import { mkdir, mkdtemp, rm, writeFile } from "node:fs/promises";
Expand Down
2 changes: 1 addition & 1 deletion apps/vscode/test/vsix-package.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
* dev state, manifest/resource hygiene, unresolved imports, and entry loading.
* Wiring: real Node packaging/verifier CLIs and filesystem; VSIX directory
* fixtures replace only the external Marketplace archive producer.
* Run: pnpm --filter pythinker-code exec vitest run --config vitest.config.ts test/vsix-package.test.ts
* Run: pnpm --filter pythinker exec vitest run --config vitest.config.ts test/vsix-package.test.ts
*/
import { spawnSync } from 'node:child_process';
import { mkdtemp, mkdir, readFile, rm, stat, writeFile } from 'node:fs/promises';
Expand Down
2 changes: 1 addition & 1 deletion apps/vscode/test/workspace-paths.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
* editor mentions use relative paths inside the working directory and absolute paths outside.
* Wiring: real temporary local files plus the public handler/bridge surfaces;
* VS Code host APIs are the only stubbed boundary.
* Run: pnpm --filter pythinker-code exec vitest run --config vitest.config.ts test/workspace-paths.test.ts
* Run: pnpm --filter pythinker exec vitest run --config vitest.config.ts test/workspace-paths.test.ts
*/
import { mkdtemp, mkdir, readFile, readdir, rm, stat, symlink, writeFile } from "node:fs/promises";
import { join } from "node:path";
Expand Down
Loading