From 797c8e70964c6ba34161963ac120663bd5132689 Mon Sep 17 00:00:00 2001 From: vrtnis <123119434+vrtnis@users.noreply.github.com> Date: Mon, 2 Jun 2025 00:18:58 +0000 Subject: [PATCH 01/20] Add GitHub Action to triage issues and publish to wiki --- .github/scripts/issue_triage.py | 164 ++++++++++++++++++++++++++++++++ .github/workflows/triage.yml | 60 ++++++++++++ 2 files changed, 224 insertions(+) create mode 100644 .github/scripts/issue_triage.py create mode 100644 .github/workflows/triage.yml diff --git a/.github/scripts/issue_triage.py b/.github/scripts/issue_triage.py new file mode 100644 index 00000000000..ade435b2190 --- /dev/null +++ b/.github/scripts/issue_triage.py @@ -0,0 +1,164 @@ +#!/usr/bin/env python +from __future__ import annotations +import os, sys, json, datetime, pathlib, textwrap, requests +from openai import OpenAI + +REPO = "voideditor/void" +CACHE_FILE = pathlib.Path(".github/triage_cache.json") +STAMP_FILE = pathlib.Path(".github/last_triage.txt") + +THEMES_MD = textwrap.dedent("""\ +1. πŸ”— LLM Integration & Provider Support +2. πŸ–₯ App Build & Platform Compatibility +3. 🎯 Prompt, Token, and Cost Management +4. 🧩 Editor UX & Interaction Design +5. πŸ€– Agent & Automation Features +6. βš™οΈ System Config & Environment Setup +7. πŸ—ƒ Meta: Feature Comparison, Structure, and Naming +""").strip() + +client = OpenAI(api_key=os.environ["OPENAI_API_KEY"]) +headers = {"Authorization": f"Bearer {os.environ['GITHUB_TOKEN']}"} + + +# ───────── helpers ──────────────────────────────────────────────────────── +def utc_iso_now() -> str: + return datetime.datetime.utcnow().replace(microsecond=0, tzinfo=datetime.timezone.utc).isoformat() + +def read_stamp() -> str: + return STAMP_FILE.read_text().strip() if STAMP_FILE.exists() else "1970-01-01T00:00:00Z" + +def save_stamp(): + STAMP_FILE.parent.mkdir(parents=True, exist_ok=True) + STAMP_FILE.write_text(utc_iso_now()) + +def load_cache() -> dict[int, str]: + return json.loads(CACHE_FILE.read_text()) if CACHE_FILE.exists() else {} + +def save_cache(d: dict[int, str]): + CACHE_FILE.parent.mkdir(parents=True, exist_ok=True) + CACHE_FILE.write_text(json.dumps(d, indent=2)) + +def fetch_open_issues(since_iso: str | None = None) -> list[dict]: + issues, page = [], 1 + while True: + url = ( + f"https://api.github.com/repos/{REPO}/issues" + f"?state=open&per_page=100&page={page}" + + (f"&since={since_iso}" if since_iso else "") + ) + chunk = requests.get(url, headers=headers).json() + if not chunk or (isinstance(chunk, dict) and chunk.get("message")): + break + issues.extend(i for i in chunk if "pull_request" not in i) + page += 1 + return issues + + +# ───────── main ─────────────────────────────────────────────────────────── +last_stamp = read_stamp() +changed = fetch_open_issues(since_iso=last_stamp) + +# Fallback if **nothing** changed AND we have *no* existing output +if not changed: + cache_exists = CACHE_FILE.exists() + wiki_exists = pathlib.Path("wiki/Issue-Categories.md").exists() + if not cache_exists or not wiki_exists: + # first run or someone wiped the wiki β†’ build from scratch + print("⏩ First run or empty wiki β€” fetching ALL open issues.", file=sys.stderr) + changed = fetch_open_issues() # full list + else: + print(f"βœ… No issues updated since {last_stamp}. Nothing to classify.", file=sys.stderr) + save_stamp() + sys.exit(0) + +# ---------------------------------------------------------------- prompt +issue_lines = "\n".join(f"- {i['title']} ({i['html_url']})" for i in changed) +prompt = textwrap.dedent(f"""\ +You are an AI assistant helping triage GitHub issues into exactly 7 predefined themes. + +Each issue must go into exactly one of the themes below: + +{THEMES_MD} + +Format your output in Markdown like: +## 🎯 Prompt, Token, and Cost Management +- [#123](https://github.com/org/repo/issues/123) – Title here + +Classify these issues: +{issue_lines} +""") + +resp = client.chat.completions.create( + model="gpt-4.1", + messages=[{"role": "user", "content": prompt}], + temperature=0.2, +) + +md = resp.choices[0].message.content + +# ---------------------------------------------------------------- parse GPT +new_map: dict[int, str] = {} +current = None +for ln in md.splitlines(): + if ln.startswith("##"): + current = ln.lstrip("# ").strip() + elif ln.lstrip().startswith("- [#"): + try: + num = int(ln.split("[#")[1].split("]")[0]) + new_map[num] = current + except Exception: + pass # ignore malformed lines + +cache = load_cache() +cache.update(new_map) +save_cache(cache) +save_stamp() + +# ---------------------------------------------------------------- rebuild wiki +order = [ + "πŸ”— LLM Integration & Provider Support", + "πŸ–₯ App Build & Platform Compatibility", + "🎯 Prompt, Token, and Cost Management", + "🧩 Editor UX & Interaction Design", + "πŸ€– Agent & Automation Features", + "βš™οΈ System Config & Environment Setup", + "πŸ—ƒ Meta: Feature Comparison, Structure, and Naming", +] + +sections: dict[str, list[int]] = {t: [] for t in order} + +# ── fetch ALL current open issues once (PRs filtered out) ──────────────── +title_map: dict[int, tuple[str, str]] = {} +open_now: set[int] = set() + +page = 1 +while True: + batch = fetch_open_issues(since_iso=None) if page == 1 else [] + if not batch: + break + for it in batch: + num = it["number"] + title_map[num] = (it["title"], it["html_url"]) + open_now.add(num) + page += 1 + +# 🧹 drop any cached IDs that are no longer open issues (e.g., became a PR or were closed) +for stale in set(cache) - open_now: + del cache[stale] +save_cache(cache) # persist cleaned cache + +# build sections from cleaned cache +for num, theme in cache.items(): + if theme in sections: # extra safety + sections[theme].append(num) + +# ---------------------------------------------------------------- print roadmap +for theme in order: + issues = sections[theme] + if issues: + print(f"## {theme}") + for n in sorted(issues): + title, url = title_map.get(n, ("(missing)", f"https://github.com/{REPO}/issues/{n}")) + print(f"- [#{n}]({url}) – {title}") + print() diff --git a/.github/workflows/triage.yml b/.github/workflows/triage.yml new file mode 100644 index 00000000000..2f8d5013bbf --- /dev/null +++ b/.github/workflows/triage.yml @@ -0,0 +1,60 @@ +name: Issue Triage to Wiki + +on: + workflow_dispatch: + schedule: + - cron: '0 */6 * * *' # every 6 hrs (UTC) + +jobs: + roadmap: + runs-on: ubuntu-latest + + steps: + # 1️⃣ Check out code (so the script and cache files are present) + - name: Checkout code + uses: actions/checkout@v3 + with: + fetch-depth: 1 # shallow clone + + # 2️⃣ Set up Python + - name: Set up Python + uses: actions/setup-python@v4 + with: + python-version: '3.11' + + # 3️⃣ Install dependencies + - name: Install Python dependencies + run: | + pip install openai requests + + # 4️⃣ Clone your fork’s Wiki + - name: Clone your fork's Wiki + run: | + git clone https://x-access-token:${{ secrets.GITHUB_TOKEN }}@github.com/${{ github.repository }}.wiki.git wiki + + # 5️⃣ (Optional) Show repo tree for debugging + - name: Show repo tree (debug) + run: | + echo "PWD: $(pwd)" + ls -al + ls -al .github/scripts || true + ls -al void/.github/scripts || true + + # 6️⃣ Generate roadmap and push only if it changed + - name: Generate roadmap directly into wiki + run: | + python .github/scripts/issue_triage.py > wiki/_new.md + if ! cmp -s wiki/_new.md wiki/Issue-Categories.md ; then + mv wiki/_new.md wiki/Issue-Categories.md + cd wiki + git config user.name "github-actions[bot]" + git config user.email "41898282+github-actions[bot]@users.noreply.github.com" + git add Issue-Categories.md + git commit -m "Auto-update Issue-Categories.md from GPT triage" + git push + else + echo "No content change – skipping wiki update" + fi + env: + OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} From ffbfba8d4ff47e5924d9606160ddb3aa9d690776 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Commaret?= Date: Thu, 12 Jun 2025 19:43:01 +0200 Subject: [PATCH 02/20] [Feature] Add magistral-small-2506 #741 --- .../contrib/void/common/modelCapabilities.ts | 20 +++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/contrib/void/common/modelCapabilities.ts b/src/vs/workbench/contrib/void/common/modelCapabilities.ts index 4c0d884b08c..7d75e26b1fd 100644 --- a/src/vs/workbench/contrib/void/common/modelCapabilities.ts +++ b/src/vs/workbench/contrib/void/common/modelCapabilities.ts @@ -985,7 +985,24 @@ const mistralModelOptions = { // https://mistral.ai/products/la-plateforme#prici supportsSystemMessage: 'system-role', reasoningCapabilities: false, }, - + 'magistral-medium-latest': { + contextWindow: 256_000, + reservedOutputTokenSpace: 8_192, + cost: { input: 0.30, output: 0.90 }, // TODO: check this + supportsFIM: true, + downloadable: { sizeGb: 13 }, + supportsSystemMessage: 'system-role', + reasoningCapabilities: false, + }, + 'magistral-small-latest': { + contextWindow: 40_000, + reservedOutputTokenSpace: 8_192, + cost: { input: 0.30, output: 0.90 }, // TODO: check this + supportsFIM: true, + downloadable: { sizeGb: 13 }, + supportsSystemMessage: 'system-role', + reasoningCapabilities: false, + }, 'devstral-small-latest': { //https://openrouter.ai/mistralai/devstral-small:free contextWindow: 131_000, reservedOutputTokenSpace: 8_192, @@ -995,7 +1012,6 @@ const mistralModelOptions = { // https://mistral.ai/products/la-plateforme#prici supportsSystemMessage: 'system-role', reasoningCapabilities: false, }, - 'ministral-8b-latest': { // ollama 'mistral' contextWindow: 131_000, reservedOutputTokenSpace: 4_096, From 940155ac80120a0cdb40f30168ec99ba092579b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Commaret?= Date: Thu, 12 Jun 2025 19:46:30 +0200 Subject: [PATCH 03/20] Added reasoning parameters --- src/vs/workbench/contrib/void/common/modelCapabilities.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/contrib/void/common/modelCapabilities.ts b/src/vs/workbench/contrib/void/common/modelCapabilities.ts index 7d75e26b1fd..76f552ee3a5 100644 --- a/src/vs/workbench/contrib/void/common/modelCapabilities.ts +++ b/src/vs/workbench/contrib/void/common/modelCapabilities.ts @@ -992,7 +992,7 @@ const mistralModelOptions = { // https://mistral.ai/products/la-plateforme#prici supportsFIM: true, downloadable: { sizeGb: 13 }, supportsSystemMessage: 'system-role', - reasoningCapabilities: false, + reasoningCapabilities: { supportsReasoning: true, canIOReasoning: true, canTurnOffReasoning: false, openSourceThinkTags: ['', ''] }, }, 'magistral-small-latest': { contextWindow: 40_000, @@ -1001,7 +1001,7 @@ const mistralModelOptions = { // https://mistral.ai/products/la-plateforme#prici supportsFIM: true, downloadable: { sizeGb: 13 }, supportsSystemMessage: 'system-role', - reasoningCapabilities: false, + reasoningCapabilities: { supportsReasoning: true, canIOReasoning: true, canTurnOffReasoning: false, openSourceThinkTags: ['', ''] }, }, 'devstral-small-latest': { //https://openrouter.ai/mistralai/devstral-small:free contextWindow: 131_000, From 453f392f01565377460d0ae8fe99cf9ade43ea27 Mon Sep 17 00:00:00 2001 From: "Alessandro de Oliveira Faria (A.K.A.CABELO)" Date: Tue, 24 Jun 2025 02:22:01 -0300 Subject: [PATCH 04/20] SUSE and openSUSE instructions --- HOW_TO_CONTRIBUTE.md | 1 + 1 file changed, 1 insertion(+) diff --git a/HOW_TO_CONTRIBUTE.md b/HOW_TO_CONTRIBUTE.md index e4b174d26d7..d156b482cc9 100644 --- a/HOW_TO_CONTRIBUTE.md +++ b/HOW_TO_CONTRIBUTE.md @@ -48,6 +48,7 @@ First, run `npm install -g node-gyp`. Then: - Debian (Ubuntu, etc): `sudo apt-get install build-essential g++ libx11-dev libxkbfile-dev libsecret-1-dev libkrb5-dev python-is-python3`. - Red Hat (Fedora, etc): `sudo dnf install @development-tools gcc gcc-c++ make libsecret-devel krb5-devel libX11-devel libxkbfile-devel`. +- SUSE (openSUSE, etc): `sudo zypper install patterns-devel-C-C++-devel_C_C++ krb5-devel libsecret-devel libxkbfile-devel libX11-devel`. - Others: see [How to Contribute](https://github.com/microsoft/vscode/wiki/How-to-Contribute). ### d. Building Void from inside VSCode From b5ae6d7a96fabeec28f8e6960541d3c90fe623c9 Mon Sep 17 00:00:00 2001 From: Hidetaka Tsuji Date: Tue, 24 Jun 2025 13:54:51 +0200 Subject: [PATCH 05/20] Fix: IME composition preventing message sending in chat --- .../void/browser/react/src/sidebar-tsx/SidebarChat.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/contrib/void/browser/react/src/sidebar-tsx/SidebarChat.tsx b/src/vs/workbench/contrib/void/browser/react/src/sidebar-tsx/SidebarChat.tsx index ea24ef38a92..1d47a369069 100644 --- a/src/vs/workbench/contrib/void/browser/react/src/sidebar-tsx/SidebarChat.tsx +++ b/src/vs/workbench/contrib/void/browser/react/src/sidebar-tsx/SidebarChat.tsx @@ -1121,7 +1121,7 @@ const UserMessageComponent = ({ chatMessage, messageIdx, isCheckpointGhost, curr if (e.key === 'Escape') { onCloseEdit() } - if (e.key === 'Enter' && !e.shiftKey) { + if (e.key === 'Enter' && !e.shiftKey && !(e.nativeEvent as any).isComposing) { onSubmit() } } @@ -3048,7 +3048,7 @@ export const SidebarChat = () => { setInstructionsAreEmpty(!newStr) }, [setInstructionsAreEmpty]) const onKeyDown = useCallback((e: KeyboardEvent) => { - if (e.key === 'Enter' && !e.shiftKey) { + if (e.key === 'Enter' && !e.shiftKey && !(e.nativeEvent as any).isComposing) { onSubmit() } else if (e.key === 'Escape' && isRunning) { onAbort() From 42c50413f583f00d09a6de34ff4c525f9bdf9f2d Mon Sep 17 00:00:00 2001 From: servetgulnaroglu Date: Sat, 28 Jun 2025 15:08:40 +0300 Subject: [PATCH 06/20] added tooltip for selected files the prevent ambiguity --- .../react/src/sidebar-tsx/SidebarChat.tsx | 149 +++++++++--------- 1 file changed, 78 insertions(+), 71 deletions(-) diff --git a/src/vs/workbench/contrib/void/browser/react/src/sidebar-tsx/SidebarChat.tsx b/src/vs/workbench/contrib/void/browser/react/src/sidebar-tsx/SidebarChat.tsx index ea24ef38a92..61cc98dc46d 100644 --- a/src/vs/workbench/contrib/void/browser/react/src/sidebar-tsx/SidebarChat.tsx +++ b/src/vs/workbench/contrib/void/browser/react/src/sidebar-tsx/SidebarChat.tsx @@ -664,81 +664,88 @@ export const SelectedFiles = ( key={thisKey} className={`flex flex-col space-y-[1px]`} > - {/* summarybox */} -
{ - if (type !== 'staging') return; // (never) - if (isThisSelectionProspective) { // add prospective selection to selections - setSelections([...selections, selection]) - } - else if (selection.type === 'File') { // open files - voidOpenFileFn(selection.uri, accessor); - - const wasAddedAsCurrentFile = selection.state.wasAddedAsCurrentFile - if (wasAddedAsCurrentFile) { - // make it so the file is added permanently, not just as the current file - const newSelection: StagingSelectionItem = { ...selection, state: { ...selection.state, wasAddedAsCurrentFile: false } } - setSelections([ - ...selections.slice(0, i), - newSelection, - ...selections.slice(i + 1) - ]) - } - } - else if (selection.type === 'CodeSelection') { - voidOpenFileFn(selection.uri, accessor, selection.range); - } - else if (selection.type === 'Folder') { - // TODO!!! reveal in tree - } - }} + {/* tooltip for file path */} + - {} + {/* summarybox */} +
{ + if (type !== 'staging') return; // (never) + if (isThisSelectionProspective) { // add prospective selection to selections + setSelections([...selections, selection]) + } + else if (selection.type === 'File') { // open files + voidOpenFileFn(selection.uri, accessor); + + const wasAddedAsCurrentFile = selection.state.wasAddedAsCurrentFile + if (wasAddedAsCurrentFile) { + // make it so the file is added permanently, not just as the current file + const newSelection: StagingSelectionItem = { ...selection, state: { ...selection.state, wasAddedAsCurrentFile: false } } + setSelections([ + ...selections.slice(0, i), + newSelection, + ...selections.slice(i + 1) + ]) + } + } + else if (selection.type === 'CodeSelection') { + voidOpenFileFn(selection.uri, accessor, selection.range); + } + else if (selection.type === 'Folder') { + // TODO!!! reveal in tree + } + }} + > + {} - { // file name and range - getBasename(selection.uri.fsPath) - + (selection.type === 'CodeSelection' ? ` (${selection.range[0]}-${selection.range[1]})` : '') - } + { // file name and range + getBasename(selection.uri.fsPath) + + (selection.type === 'CodeSelection' ? ` (${selection.range[0]}-${selection.range[1]})` : '') + } - {selection.type === 'File' && selection.state.wasAddedAsCurrentFile && messageIdx === undefined && currentURI?.fsPath === selection.uri.fsPath ? - - {`(Current File)`} - - : null - } + {selection.type === 'File' && selection.state.wasAddedAsCurrentFile && messageIdx === undefined && currentURI?.fsPath === selection.uri.fsPath ? + + {`(Current File)`} + + : null + } - {type === 'staging' && !isThisSelectionProspective ? // X button -
{ - e.stopPropagation(); // don't open/close selection - if (type !== 'staging') return; - setSelections([...selections.slice(0, i), ...selections.slice(i + 1)]) - }} - > - -
- : <> - } -
+ {type === 'staging' && !isThisSelectionProspective ? // X button +
{ + e.stopPropagation(); // don't open/close selection + if (type !== 'staging') return; + setSelections([...selections.slice(0, i), ...selections.slice(i + 1)]) + }} + > + +
+ : <> + } +
+ })} From c90f707070429f1beec7319fff928080b4fbcb1a Mon Sep 17 00:00:00 2001 From: Andrew Pareles Date: Sat, 28 Jun 2025 22:12:08 -0700 Subject: [PATCH 07/20] add delay --- .../contrib/void/browser/react/src/sidebar-tsx/SidebarChat.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/vs/workbench/contrib/void/browser/react/src/sidebar-tsx/SidebarChat.tsx b/src/vs/workbench/contrib/void/browser/react/src/sidebar-tsx/SidebarChat.tsx index 61cc98dc46d..2cd6c742513 100644 --- a/src/vs/workbench/contrib/void/browser/react/src/sidebar-tsx/SidebarChat.tsx +++ b/src/vs/workbench/contrib/void/browser/react/src/sidebar-tsx/SidebarChat.tsx @@ -669,6 +669,7 @@ export const SelectedFiles = ( data-tooltip-id='void-tooltip' data-tooltip-content={getRelative(selection.uri, accessor)} data-tooltip-place='top' + data-tooltip-delay-show={3000} > {/* summarybox */}
Date: Sun, 29 Jun 2025 16:33:29 -0700 Subject: [PATCH 08/20] Revert "Fix: IME composition preventing message sending in chat" --- .../void/browser/react/src/sidebar-tsx/SidebarChat.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/contrib/void/browser/react/src/sidebar-tsx/SidebarChat.tsx b/src/vs/workbench/contrib/void/browser/react/src/sidebar-tsx/SidebarChat.tsx index 58efb162ea0..2cd6c742513 100644 --- a/src/vs/workbench/contrib/void/browser/react/src/sidebar-tsx/SidebarChat.tsx +++ b/src/vs/workbench/contrib/void/browser/react/src/sidebar-tsx/SidebarChat.tsx @@ -1129,7 +1129,7 @@ const UserMessageComponent = ({ chatMessage, messageIdx, isCheckpointGhost, curr if (e.key === 'Escape') { onCloseEdit() } - if (e.key === 'Enter' && !e.shiftKey && !(e.nativeEvent as any).isComposing) { + if (e.key === 'Enter' && !e.shiftKey) { onSubmit() } } @@ -3056,7 +3056,7 @@ export const SidebarChat = () => { setInstructionsAreEmpty(!newStr) }, [setInstructionsAreEmpty]) const onKeyDown = useCallback((e: KeyboardEvent) => { - if (e.key === 'Enter' && !e.shiftKey && !(e.nativeEvent as any).isComposing) { + if (e.key === 'Enter' && !e.shiftKey) { onSubmit() } else if (e.key === 'Escape' && isRunning) { onAbort() From 9732f74ba7edc6908eb845c392cc47b7f850edd0 Mon Sep 17 00:00:00 2001 From: Andrew Pareles Date: Sun, 29 Jun 2025 16:34:35 -0700 Subject: [PATCH 09/20] remove random as any casts --- .../void/browser/react/src/sidebar-tsx/SidebarChat.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/contrib/void/browser/react/src/sidebar-tsx/SidebarChat.tsx b/src/vs/workbench/contrib/void/browser/react/src/sidebar-tsx/SidebarChat.tsx index 2cd6c742513..97add942891 100644 --- a/src/vs/workbench/contrib/void/browser/react/src/sidebar-tsx/SidebarChat.tsx +++ b/src/vs/workbench/contrib/void/browser/react/src/sidebar-tsx/SidebarChat.tsx @@ -1129,7 +1129,7 @@ const UserMessageComponent = ({ chatMessage, messageIdx, isCheckpointGhost, curr if (e.key === 'Escape') { onCloseEdit() } - if (e.key === 'Enter' && !e.shiftKey) { + if (e.key === 'Enter' && !e.shiftKey && !e.nativeEvent.isComposing) { onSubmit() } } @@ -3056,7 +3056,7 @@ export const SidebarChat = () => { setInstructionsAreEmpty(!newStr) }, [setInstructionsAreEmpty]) const onKeyDown = useCallback((e: KeyboardEvent) => { - if (e.key === 'Enter' && !e.shiftKey) { + if (e.key === 'Enter' && !e.shiftKey && !e.nativeEvent.isComposing) { onSubmit() } else if (e.key === 'Escape' && isRunning) { onAbort() From 34e3413dca8cf875faaa663e052027bbfc41c4e5 Mon Sep 17 00:00:00 2001 From: Andrew Pareles Date: Sat, 5 Jul 2025 01:01:07 -0700 Subject: [PATCH 10/20] wiki token --- .github/workflows/triage.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/triage.yml b/.github/workflows/triage.yml index 2f8d5013bbf..97ac2cd4739 100644 --- a/.github/workflows/triage.yml +++ b/.github/workflows/triage.yml @@ -30,7 +30,7 @@ jobs: # 4️⃣ Clone your fork’s Wiki - name: Clone your fork's Wiki run: | - git clone https://x-access-token:${{ secrets.GITHUB_TOKEN }}@github.com/${{ github.repository }}.wiki.git wiki + git clone https://x-access-token:${{ secrets.WIKI_TOKEN }}@github.com/${{ github.repository }}.wiki.git wiki # 5️⃣ (Optional) Show repo tree for debugging - name: Show repo tree (debug) @@ -57,4 +57,4 @@ jobs: fi env: OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }} - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + GITHUB_TOKEN: ${{ secrets.WIKI_TOKEN }} From a7eb54a09bd264360e91690548ecc887ae4655a9 Mon Sep 17 00:00:00 2001 From: Andrew Pareles <43356051+andrewpareles@users.noreply.github.com> Date: Tue, 22 Jul 2025 01:53:37 -0700 Subject: [PATCH 11/20] Update releases and add download button --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 78278598b71..2bdcc0593c1 100644 --- a/README.md +++ b/README.md @@ -21,6 +21,8 @@ This repo contains the full sourcecode for Void. If you're new, welcome! - πŸš™ [Project Board](https://github.com/orgs/voideditor/projects/2) +- 🌌 [Download](https://voideditor.com/download-beta) + ## Contributing From ee39ee94b13ae2b67a16ec2c2744f90d74678666 Mon Sep 17 00:00:00 2001 From: Andrew Pareles <43356051+andrewpareles@users.noreply.github.com> Date: Fri, 1 Aug 2025 02:06:28 -0700 Subject: [PATCH 12/20] add dev note --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 2bdcc0593c1..4e0c97feaf3 100644 --- a/README.md +++ b/README.md @@ -21,8 +21,6 @@ This repo contains the full sourcecode for Void. If you're new, welcome! - πŸš™ [Project Board](https://github.com/orgs/voideditor/projects/2) -- 🌌 [Download](https://voideditor.com/download-beta) - ## Contributing @@ -35,5 +33,8 @@ This repo contains the full sourcecode for Void. If you're new, welcome! Void is a fork of the [vscode](https://github.com/microsoft/vscode) repository. For a guide to the codebase, see [VOID_CODEBASE_GUIDE](https://github.com/voideditor/void/blob/main/VOID_CODEBASE_GUIDE.md). +## Note +Work is temporarily paused on the Void IDE (this repo) while we experiment with a few novel AI coding ideas for Void. Stay alerted with new releases in our Discord channel. + ## Support You can always reach us in our Discord server or contact us via email: hello@voideditor.com. From d948fc5950fb1a3d3921fdd101aef2afa9f09223 Mon Sep 17 00:00:00 2001 From: Chris Date: Sun, 3 Aug 2025 19:06:52 -0400 Subject: [PATCH 13/20] Updated code selection to properly parse selected lines --- .../workbench/contrib/void/common/prompt/prompts.ts | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/contrib/void/common/prompt/prompts.ts b/src/vs/workbench/contrib/void/common/prompt/prompts.ts index 55412a80dfc..c31fdb40cc5 100644 --- a/src/vs/workbench/contrib/void/common/prompt/prompts.ts +++ b/src/vs/workbench/contrib/void/common/prompt/prompts.ts @@ -575,13 +575,21 @@ export const messageOfSelection = async ( ) => { const lineNumAddition = (range: [number, number]) => ` (lines ${range[0]}:${range[1]})` - if (s.type === 'File' || s.type === 'CodeSelection') { + if (s.type === 'CodeSelection') { const { val } = await readFile(opts.fileService, s.uri, DEFAULT_FILE_SIZE_LIMIT) const lineNumAdd = s.type === 'CodeSelection' ? lineNumAddition(s.range) : '' - const content = val === null ? 'null' : `${tripleTick[0]}${s.language}\n${val}\n${tripleTick[1]}` + const lines = val?.split('\n') + const selection = lines?.slice(s.range[0] - 1, s.range[1]).join('\n') + const content = selection ?? 'null' const str = `${s.uri.fsPath}${lineNumAdd}:\n${content}` return str } + else if (s.type === 'File') { + const { val } = await readFile(opts.fileService, s.uri, DEFAULT_FILE_SIZE_LIMIT) + const content = val === null ? 'null' : `${tripleTick[0]}${s.language}\n${val}\n${tripleTick[1]}` + const str = `${s.uri.fsPath}:\n${content}` + return str + } else if (s.type === 'Folder') { const dirStr: string = await opts.directoryStrService.getDirectoryStrTool(s.uri) const folderStructure = `${s.uri.fsPath} folder structure:${tripleTick[0]}\n${dirStr}\n${tripleTick[1]}` From cbb52dec286a50bdc91af02d3e89d010dbe95b75 Mon Sep 17 00:00:00 2001 From: Chris Date: Mon, 4 Aug 2025 10:55:59 -0400 Subject: [PATCH 14/20] Removed unnecessary ternary in lineNumAdd --- src/vs/workbench/contrib/void/common/prompt/prompts.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/void/common/prompt/prompts.ts b/src/vs/workbench/contrib/void/common/prompt/prompts.ts index c31fdb40cc5..9c737193fea 100644 --- a/src/vs/workbench/contrib/void/common/prompt/prompts.ts +++ b/src/vs/workbench/contrib/void/common/prompt/prompts.ts @@ -577,7 +577,7 @@ export const messageOfSelection = async ( if (s.type === 'CodeSelection') { const { val } = await readFile(opts.fileService, s.uri, DEFAULT_FILE_SIZE_LIMIT) - const lineNumAdd = s.type === 'CodeSelection' ? lineNumAddition(s.range) : '' + const lineNumAdd = lineNumAddition(s.range) const lines = val?.split('\n') const selection = lines?.slice(s.range[0] - 1, s.range[1]).join('\n') const content = selection ?? 'null' From 7a974f2dff094c1ce858036dd8f912f1da792bcc Mon Sep 17 00:00:00 2001 From: Chris Date: Mon, 4 Aug 2025 14:23:35 -0400 Subject: [PATCH 15/20] Fixed selection output to include triple backticks and language tag --- src/vs/workbench/contrib/void/common/prompt/prompts.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/void/common/prompt/prompts.ts b/src/vs/workbench/contrib/void/common/prompt/prompts.ts index 9c737193fea..973dc49363d 100644 --- a/src/vs/workbench/contrib/void/common/prompt/prompts.ts +++ b/src/vs/workbench/contrib/void/common/prompt/prompts.ts @@ -579,7 +579,7 @@ export const messageOfSelection = async ( const { val } = await readFile(opts.fileService, s.uri, DEFAULT_FILE_SIZE_LIMIT) const lineNumAdd = lineNumAddition(s.range) const lines = val?.split('\n') - const selection = lines?.slice(s.range[0] - 1, s.range[1]).join('\n') + const selection = `${tripleTick[0]}${s.language}\n${lines?.slice(s.range[0] - 1, s.range[1]).join('\n')}\n${tripleTick[1]}` const content = selection ?? 'null' const str = `${s.uri.fsPath}${lineNumAdd}:\n${content}` return str From ff717cad1688492f858052ef4c1f57abcbb75b0a Mon Sep 17 00:00:00 2001 From: Andrew Pareles Date: Mon, 4 Aug 2025 15:21:42 -0700 Subject: [PATCH 16/20] update lines --- .../contrib/void/common/prompt/prompts.ts | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/vs/workbench/contrib/void/common/prompt/prompts.ts b/src/vs/workbench/contrib/void/common/prompt/prompts.ts index 973dc49363d..fba768159cf 100644 --- a/src/vs/workbench/contrib/void/common/prompt/prompts.ts +++ b/src/vs/workbench/contrib/void/common/prompt/prompts.ts @@ -577,16 +577,21 @@ export const messageOfSelection = async ( if (s.type === 'CodeSelection') { const { val } = await readFile(opts.fileService, s.uri, DEFAULT_FILE_SIZE_LIMIT) - const lineNumAdd = lineNumAddition(s.range) const lines = val?.split('\n') - const selection = `${tripleTick[0]}${s.language}\n${lines?.slice(s.range[0] - 1, s.range[1]).join('\n')}\n${tripleTick[1]}` - const content = selection ?? 'null' - const str = `${s.uri.fsPath}${lineNumAdd}:\n${content}` + + const innerVal = lines?.slice(s.range[0] - 1, s.range[1]).join('\n') + const content = !lines ? '' + : `${tripleTick[0]}${s.language}\n${innerVal}\n${tripleTick[1]}` + const str = `${s.uri.fsPath}${lineNumAddition(s.range)}:\n${content}` return str } else if (s.type === 'File') { const { val } = await readFile(opts.fileService, s.uri, DEFAULT_FILE_SIZE_LIMIT) - const content = val === null ? 'null' : `${tripleTick[0]}${s.language}\n${val}\n${tripleTick[1]}` + + const innerVal = val + const content = val === null ? '' + : `${tripleTick[0]}${s.language}\n${innerVal}\n${tripleTick[1]}` + const str = `${s.uri.fsPath}:\n${content}` return str } From 74650cb867a2f851173c2d026e4ab870daa458a7 Mon Sep 17 00:00:00 2001 From: Andrew Pareles <43356051+andrewpareles@users.noreply.github.com> Date: Wed, 6 Aug 2025 17:04:13 -0700 Subject: [PATCH 17/20] clearer instructions on developer mode and building locally --- HOW_TO_CONTRIBUTE.md | 110 +++++++++++++++++++------------------------ 1 file changed, 48 insertions(+), 62 deletions(-) diff --git a/HOW_TO_CONTRIBUTE.md b/HOW_TO_CONTRIBUTE.md index d156b482cc9..a472e8f31c4 100644 --- a/HOW_TO_CONTRIBUTE.md +++ b/HOW_TO_CONTRIBUTE.md @@ -20,14 +20,15 @@ Most of Void's code lives in the folder `src/vs/workbench/contrib/void/`. +## Editing Void's Code -## Building Void +If you're making changes to Void's code as a contributor, you'll want to run a local version of Void to make sure your changes worked. Developer mode lets you do this. Here's how to use it. -### a. Mac - Build Prerequisites +### a. Mac - Prerequisites If you're using a Mac, you need Python and XCode. You probably have these by default. -### b. Windows - Build Prerequisites +### b. Windows - Prerequisites If you're using a Windows computer, first get [Visual Studio 2022](https://visualstudio.microsoft.com/thank-you-downloading-visual-studio/?sku=Community) (recommended) or [VS Build Tools](https://visualstudio.microsoft.com/thank-you-downloading-visual-studio/?sku=BuildTools) (not recommended). If you already have both, you might need to run the next few steps on both of them. @@ -42,7 +43,7 @@ Go to the "Individual Components" tab and select: Finally, click Install. -### c. Linux - Build Prerequisites +### c. Linux - Prerequisites First, run `npm install -g node-gyp`. Then: @@ -51,26 +52,43 @@ First, run `npm install -g node-gyp`. Then: - SUSE (openSUSE, etc): `sudo zypper install patterns-devel-C-C++-devel_C_C++ krb5-devel libsecret-devel libxkbfile-devel libX11-devel`. - Others: see [How to Contribute](https://github.com/microsoft/vscode/wiki/How-to-Contribute). -### d. Building Void from inside VSCode +### Developer Mode Instructions + +Here's how to start changing Void's code. These steps cover everything from cloning Void, to opening a Developer Mode window where you can play around with your updates. 1. `git clone https://github.com/voideditor/void` to clone the repo. 2. `npm install` to install all dependencies. -3. To build Void, open VSCode. Then: +3. Open Void or VSCode, and initialize Developer Mode (this can take ~5 min to finish, it's done when 2 of the 3 spinners turn to check marks): - Windows: Press Ctrl+Shift+B. - Mac: Press Cmd+Shift+B. - Linux: Press Ctrl+Shift+B. - - This step can take ~5 min. The build is done when you see two check marks (one of the items will continue spinning indefinitely - it compiles our React code). -4. To run Void: +4. Open the Void Developer Mode window: - Windows: `./scripts/code.bat`. - Mac: `./scripts/code.sh`. - Linux: `./scripts/code.sh`. -5. Nice-to-knows. - - You can always press Ctrl+R (Cmd+R) inside the new window to reload and see your new changes. It's faster than Ctrl+Shift+P and `Reload Window`. - - You might want to add the flags `--user-data-dir ./.tmp/user-data --extensions-dir ./.tmp/extensions` to the above run command, which lets you delete the `.tmp` folder to reset any IDE changes you made when testing. - - You can kill any of the build scripts by pressing `Ctrl+D` in VSCode terminal. If you press `Ctrl+C` the script will close but will keep running in the background (to open all background scripts, just re-build). +5. You're good to start editing Void's code! + - You won't see your changes unless you press Ctrl+R (Cmd+R) inside the new window to reload. Alternatively, press Ctrl+Shift+P and `Reload Window`. + - You might want to add the flags `--user-data-dir ./.tmp/user-data --extensions-dir ./.tmp/extensions` to the command in step 4, which lets you reset any IDE changes you made by deleting the `.tmp` folder. + - You can kill any of the build scripts by pressing `Ctrl+D` in its terminal. If you press `Ctrl+C` the script will close but will keep running in the background. If you get any errors, scroll down for common fixes. +#### Common Fixes + +- Make sure you followed the prerequisite steps above. +- Make sure you have Node version `20.18.2` (the version in `.nvmrc`). + - You can do this without changing your global Node version using [nvm](https://github.com/nvm-sh/nvm): run `nvm install`, followed by `nvm use` to install the version in `.nvmrc` locally. +- Make sure the path to your Void folder does not have any spaces in it. +- If you get `"TypeError: Failed to fetch dynamically imported module"`, make sure all imports end with `.js`. +- If you get an error with React, try running `NODE_OPTIONS="--max-old-space-size=8192" npm run buildreact`. +- If you see missing styles, wait a few seconds and then reload. +- If you get errors like `npm error libtool: error: unrecognised option: '-static'`, when running ./scripts/code.sh, make sure you have GNU libtool instead of BSD libtool (BSD is the default in macos) +- If you get errors like `The SUID sandbox helper binary was found, but is not configured correctly` when running ./scripts/code.sh, run +`sudo chown root:root .build/electron/chrome-sandbox && sudo chmod 4755 .build/electron/chrome-sandbox` and then run `./scripts/code.sh` again. +- If you have any other questions, feel free to [submit an issue](https://github.com/voideditor/void/issues/new). You can also refer to VSCode's complete [How to Contribute](https://github.com/microsoft/vscode/wiki/How-to-Contribute) page. + + + #### Building Void from Terminal To build Void from the terminal instead of from inside VSCode, follow the steps above, but instead of pressing Cmd+Shift+B, run `npm run watch`. The build is done when you see something like this: @@ -83,50 +101,47 @@ To build Void from the terminal instead of from inside VSCode, follow the steps ``` -#### Common Fixes -- Make sure you followed the prerequisite steps above. -- Make sure you have Node version `20.18.2` (the version in `.nvmrc`)! - - You can do this easily without touching your base installation with [nvm](https://github.com/nvm-sh/nvm). Simply run `nvm install`, followed by `nvm use` and it will automatically install and use the version specified in `nvmrc`. -- Make sure that the path to your Void folder does not have any spaces in it. -- If you get `"TypeError: Failed to fetch dynamically imported module"`, make sure all imports end with `.js`. -- If you get an error with React, try running `NODE_OPTIONS="--max-old-space-size=8192" npm run buildreact`. -- If you see missing styles, wait a few seconds and then reload. -- If you get errors like `npm error libtool: error: unrecognised option: '-static'`, when running ./scripts/code.sh, make sure you have GNU libtool instead of BSD libtool (BSD is the default in macos) -- If you get erorrs like `The SUID sandbox helper binary was found, but is not configured correctly` when running ./scripts/code.sh, run -`sudo chown root:root .build/electron/chrome-sandbox && sudo chmod 4755 .build/electron/chrome-sandbox` and then run `./scripts/code.sh` again. -- If you have any other questions, feel free to [submit an issue](https://github.com/voideditor/void/issues/new). You can also refer to VSCode's complete [How to Contribute](https://github.com/microsoft/vscode/wiki/How-to-Contribute) page. +### Distributing +Void's maintainers distribute Void on our website and in releases. Our build pipeline is a fork of VSCodium, and it works by running GitHub Actions which create the downloadables. The build repo with more instructions lives [here](https://github.com/voideditor/void-builder). +If you want to completely control Void's build pipeline for your own internal usage, which comes with a lot of time cost (and is typically not recommended), see our [`void-builder`](https://github.com/voideditor/void-builder) repo which builds Void and contains a few important notes about auto-updating and rebasing. -## Packaging -We don't usually recommend packaging. Instead, you should probably just build. If you're sure you want to package Void into an executable app, make sure you've built first, then run one of the following commands. This will create a folder named `VSCode-darwin-arm64` or similar outside of the void/ repo (see below). Be patient - packaging can take ~25 minutes. +#### Building a Local Executible +We don't usually recommend building a local executible of Void - typically you should follow the steps above to distribute a complete executible with the advantages of VSCodium baked-in, or you should just use Developer Mode to run Void locally which is much faster. If you're certain this is what you want, see details below. +
+ Building Locally (not recommended) +If you're certain you want to build a local executible of Void, follow these steps. It can take ~25 minutes. -### Mac +Make sure you've already built Void first, then run one of the following commands. This will create a folder named `VSCode-darwin-arm64` or similar outside of the void/ repo (see below). + + +##### Mac - `npm run gulp vscode-darwin-arm64` - most common (Apple Silicon) - `npm run gulp vscode-darwin-x64` (Intel) -### Windows +##### Windows - `npm run gulp vscode-win32-x64` - most common - `npm run gulp vscode-win32-arm64` -### Linux +##### Linux - `npm run gulp vscode-linux-x64` - most common - `npm run gulp vscode-linux-arm64` -### Output +##### Local Executible Output -This will generate a folder outside of `void/`: +The local executible will be located in a folder outside of `void/`: ```bash workspace/ β”œβ”€β”€ void/ # Your Void fork └── VSCode-darwin-arm64/ # Generated output ``` -### Distributing -Void's maintainers distribute Void on our website and in releases. Our build pipeline is a fork of VSCodium, and it works by running GitHub Actions which create the downloadables. The build repo with more instructions lives [here](https://github.com/voideditor/void-builder). +
+ ## Pull Request Guidelines @@ -138,32 +153,3 @@ Void's maintainers distribute Void on our website and in releases. Our build pip - - From 1ee8980fe13978c58ff741d1d667a165fe43c550 Mon Sep 17 00:00:00 2001 From: Andrew Pareles <43356051+andrewpareles@users.noreply.github.com> Date: Wed, 6 Aug 2025 17:07:32 -0700 Subject: [PATCH 18/20] typo --- HOW_TO_CONTRIBUTE.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/HOW_TO_CONTRIBUTE.md b/HOW_TO_CONTRIBUTE.md index a472e8f31c4..443e3540acf 100644 --- a/HOW_TO_CONTRIBUTE.md +++ b/HOW_TO_CONTRIBUTE.md @@ -115,7 +115,7 @@ We don't usually recommend building a local executible of Void - typically you s Building Locally (not recommended) If you're certain you want to build a local executible of Void, follow these steps. It can take ~25 minutes. -Make sure you've already built Void first, then run one of the following commands. This will create a folder named `VSCode-darwin-arm64` or similar outside of the void/ repo (see below). +Make sure you've already entered Developer Mode with Void first, then run one of the following commands. This will create a folder named `VSCode-darwin-arm64` or similar outside of the void/ repo (see below). ##### Mac From f100db917592ed9f7435ec67003ce80d1d9a00a5 Mon Sep 17 00:00:00 2001 From: Andrew Pareles <43356051+andrewpareles@users.noreply.github.com> Date: Mon, 12 Jan 2026 01:25:52 -0800 Subject: [PATCH 19/20] Update README.md --- README.md | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 4e0c97feaf3..2b42cf8a0aa 100644 --- a/README.md +++ b/README.md @@ -22,19 +22,20 @@ This repo contains the full sourcecode for Void. If you're new, welcome! - πŸš™ [Project Board](https://github.com/orgs/voideditor/projects/2) -## Contributing - -1. To get started working on Void, check out our Project Board! You can also see [HOW_TO_CONTRIBUTE](https://github.com/voideditor/void/blob/main/HOW_TO_CONTRIBUTE.md). +## Note -2. Feel free to attend a casual weekly meeting in our Discord channel! +We've paused work on the Void IDE (this repo) to explore a few novel coding ideas. We want to focus on innovation over feature-parity. Void will continue running, but without maintenance some existing features might stop working over time. Depending on the direction of our new work, we might not resume Void. +We won't be actively reviewing Issues and PRs, but we will respond to all [email](mailto:hello@voideditor.com) inquiries on building and maintaining your own version of Void while we're paused. ## Reference Void is a fork of the [vscode](https://github.com/microsoft/vscode) repository. For a guide to the codebase, see [VOID_CODEBASE_GUIDE](https://github.com/voideditor/void/blob/main/VOID_CODEBASE_GUIDE.md). -## Note -Work is temporarily paused on the Void IDE (this repo) while we experiment with a few novel AI coding ideas for Void. Stay alerted with new releases in our Discord channel. +For a guide on how to develop your own version of Void, see [HOW_TO_CONTRIBUTE](https://github.com/voideditor/void/blob/main/HOW_TO_CONTRIBUTE.md) and [void-builder](https://github.com/voideditor/void-builder). + + + ## Support You can always reach us in our Discord server or contact us via email: hello@voideditor.com. From 17e7a5b1524345b19ab4ee38ec4f9b1b75a1bd00 Mon Sep 17 00:00:00 2001 From: Andrew Pareles <43356051+andrewpareles@users.noreply.github.com> Date: Mon, 12 Jan 2026 01:57:57 -0800 Subject: [PATCH 20/20] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 2b42cf8a0aa..63e779a40f7 100644 --- a/README.md +++ b/README.md @@ -24,7 +24,7 @@ This repo contains the full sourcecode for Void. If you're new, welcome! ## Note -We've paused work on the Void IDE (this repo) to explore a few novel coding ideas. We want to focus on innovation over feature-parity. Void will continue running, but without maintenance some existing features might stop working over time. Depending on the direction of our new work, we might not resume Void. +We've paused work on the Void IDE (this repo) to explore a few novel coding ideas. We want to focus on innovation over feature-parity. Void will continue running, but without maintenance some existing features might stop working over time. Depending on the direction of our new work, we might not resume Void as an IDE. We won't be actively reviewing Issues and PRs, but we will respond to all [email](mailto:hello@voideditor.com) inquiries on building and maintaining your own version of Void while we're paused.