Skip to content

Commit 499341b

Browse files
mvacoimbraclaude
andauthored
Release v1.3.1 (#2)
* chore: bump version to 1.3.0 Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * feat: change default settings for better UX - enterToSaveAndExit now defaults to true - confirmOnBackdropClick now defaults to false - openOnClick no longer forces insert mode (opens in normal mode) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * chore: add beads issue tracking for v1.3.0 Added bd (beads) for dependency-aware issue tracking. Issues created for v1.3.0: - vimput-2jf: Fix Enter in insert mode - vimput-21l: Fix navigation in empty lines - vimput-sp2: TypeScript Playground compatibility - vimput-ztw: Udemy editor compatibility - vimput-d8x: Cursor blink only on idle Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * fix: normalize line endings in vim engine Handle Windows (\r\n) and old Mac (\r) line endings by normalizing to Unix (\n) format. This fixes potential issues with Enter and navigation when text comes from editors with different line endings. Fixes: vimput-2jf, vimput-21l (partial) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * fix: cursor rendering on empty lines - Add explicit height to cursor span for consistent rendering - Add minHeight to line divs to ensure empty lines have height - Cursor now properly visible when navigating to/through empty lines Fixes: vimput-2jf, vimput-21l Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * feat: improve cursor behavior and rendering - Cursor only blinks when idle (after ~500ms of inactivity) - Cursor stays visible during typing and navigation - Insert mode cursor now uses a 2px wide element instead of "|" character - Better positioning control with adjustable offset Closes: vimput-d8x Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * feat: add Ace Editor support (Udemy compatibility) - Detect Ace Editor (.ace_editor) alongside Monaco - Use Ace API (ace.edit) to get/set text when available - Fallback to reading from .ace_text-layer (ignoring line numbers) - Fixes text extraction including line numbers from gutter Closes: vimput-ztw Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * fix: TypeScript Playground compatibility via external page script - Create external pageScript.js to bypass CSP restrictions - Use Monaco's pushEditOperations for reliable text replacement - Add web_accessible_resources to manifest - Increase API timeout from 100ms to 500ms - Remove problematic execCommand fallbacks that caused text duplication - Bump version to 1.3.0 * feat: add indentation settings (tabs/spaces) Add user-configurable indentation settings to the extension: - New indentType setting (tabs or spaces) - New indentSize setting (2, 4, or 8 spaces) - Settings UI in Editor tab with conditional size selector - Fixed vimEngine to handle multi-character insertions Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * bd sync: 2026-01-28 01:23:21 * feat: add local formatter worker for code formatting - Add Python-based formatter worker (public/vimput-formatter.py) - Runs as background daemon on localhost:7483 - Auto-installs Flask dependency - Prompts to install formatters (prettier, black) on first run - Supports: JS/TS/JSX/TSX, Python, CSS, HTML, JSON, MD, YAML, GraphQL, Bash, SQL, Go, Rust, Java, C/C++ - Update formatter.ts to communicate with local worker - Falls back to built-in sql-formatter when worker unavailable - Language-specific error messages with install suggestions - Add formatter worker UI in SettingsPanel - Shows worker connection status - Download script button - Lists available formatters when connected - OS-specific run instructions (Linux/macOS/Windows) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * feat: integrate formatter with editor UI - Add formatter integration in VimputEditor - Status messages for format success/failure - Sparkle icon indicator for formatter-enabled languages - Handle pendingAction from vim engine for :fmt command - Add :fmt and :format commands in vimEngine - Add <Space>cf shortcut for formatting in normal mode - Add formatterEnabled setting in configStore - Add sql-formatter dependency - Update beads issue tracking - Add CHANGELOG-1.3.0.md Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * chore: bump version to 1.3.0 and fix TypeScript errors - Update manifest version from 1.2.0 to 1.3.0 - Fix public path references (add leading /) - Fix Lucide icon title prop (wrap in span) - Apply Biome formatting * fix: resolve Firefox permission error when setting editor text Use cloneInto() to properly pass CustomEvent detail data from content script to page script context in Firefox. Chrome continues to work as before since cloneInto doesn't exist there. Also removes console.log statements and bumps version to 1.3.1. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * ci: add GitHub Actions workflow for automated releases - Automatically bumps version (patch by default) on push to main - Supports manual trigger with major/minor/patch selection - Builds and zips extensions for Chrome and Firefox - Creates GitHub Release with artifacts - Optional: uploads to Chrome Web Store and Firefox Add-ons (requires secrets to be configured) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * chore: add .env.example for store deployment secrets Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * chore: update CI to use Google Cloud service account - Add service account JSON patterns to .gitignore - Update workflow to authenticate with service account - Update .env.example with service account instructions Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * chore: sync beads * ci: use prod environment for secrets Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
1 parent 7a1c5be commit 499341b

25 files changed

Lines changed: 2161 additions & 50 deletions

.beads/.gitignore

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
# SQLite databases
2+
*.db
3+
*.db?*
4+
*.db-journal
5+
*.db-wal
6+
*.db-shm
7+
8+
# Daemon runtime files
9+
daemon.lock
10+
daemon.log
11+
daemon.pid
12+
bd.sock
13+
sync-state.json
14+
last-touched
15+
16+
# Local version tracking (prevents upgrade notification spam after git ops)
17+
.local_version
18+
19+
# Legacy database files
20+
db.sqlite
21+
bd.db
22+
23+
# Worktree redirect file (contains relative path to main repo's .beads/)
24+
# Must not be committed as paths would be wrong in other clones
25+
redirect
26+
27+
# Merge artifacts (temporary files from 3-way merge)
28+
beads.base.jsonl
29+
beads.base.meta.json
30+
beads.left.jsonl
31+
beads.left.meta.json
32+
beads.right.jsonl
33+
beads.right.meta.json
34+
35+
# Sync state (local-only, per-machine)
36+
# These files are machine-specific and should not be shared across clones
37+
.sync.lock
38+
sync_base.jsonl
39+
40+
# NOTE: Do NOT add negation patterns (e.g., !issues.jsonl) here.
41+
# They would override fork protection in .git/info/exclude, allowing
42+
# contributors to accidentally commit upstream issue databases.
43+
# The JSONL files (issues.jsonl, interactions.jsonl) and config files
44+
# are tracked by git by default since no pattern above ignores them.

.beads/README.md

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
# Beads - AI-Native Issue Tracking
2+
3+
Welcome to Beads! This repository uses **Beads** for issue tracking - a modern, AI-native tool designed to live directly in your codebase alongside your code.
4+
5+
## What is Beads?
6+
7+
Beads is issue tracking that lives in your repo, making it perfect for AI coding agents and developers who want their issues close to their code. No web UI required - everything works through the CLI and integrates seamlessly with git.
8+
9+
**Learn more:** [github.com/steveyegge/beads](https://github.com/steveyegge/beads)
10+
11+
## Quick Start
12+
13+
### Essential Commands
14+
15+
```bash
16+
# Create new issues
17+
bd create "Add user authentication"
18+
19+
# View all issues
20+
bd list
21+
22+
# View issue details
23+
bd show <issue-id>
24+
25+
# Update issue status
26+
bd update <issue-id> --status in_progress
27+
bd update <issue-id> --status done
28+
29+
# Sync with git remote
30+
bd sync
31+
```
32+
33+
### Working with Issues
34+
35+
Issues in Beads are:
36+
- **Git-native**: Stored in `.beads/issues.jsonl` and synced like code
37+
- **AI-friendly**: CLI-first design works perfectly with AI coding agents
38+
- **Branch-aware**: Issues can follow your branch workflow
39+
- **Always in sync**: Auto-syncs with your commits
40+
41+
## Why Beads?
42+
43+
**AI-Native Design**
44+
- Built specifically for AI-assisted development workflows
45+
- CLI-first interface works seamlessly with AI coding agents
46+
- No context switching to web UIs
47+
48+
🚀 **Developer Focused**
49+
- Issues live in your repo, right next to your code
50+
- Works offline, syncs when you push
51+
- Fast, lightweight, and stays out of your way
52+
53+
🔧 **Git Integration**
54+
- Automatic sync with git commits
55+
- Branch-aware issue tracking
56+
- Intelligent JSONL merge resolution
57+
58+
## Get Started with Beads
59+
60+
Try Beads in your own projects:
61+
62+
```bash
63+
# Install Beads
64+
curl -sSL https://raw.githubusercontent.com/steveyegge/beads/main/scripts/install.sh | bash
65+
66+
# Initialize in your repo
67+
bd init
68+
69+
# Create your first issue
70+
bd create "Try out Beads"
71+
```
72+
73+
## Learn More
74+
75+
- **Documentation**: [github.com/steveyegge/beads/docs](https://github.com/steveyegge/beads/tree/main/docs)
76+
- **Quick Start Guide**: Run `bd quickstart`
77+
- **Examples**: [github.com/steveyegge/beads/examples](https://github.com/steveyegge/beads/tree/main/examples)
78+
79+
---
80+
81+
*Beads: Issue tracking that moves at the speed of thought*

.beads/config.yaml

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
# Beads Configuration File
2+
# This file configures default behavior for all bd commands in this repository
3+
# All settings can also be set via environment variables (BD_* prefix)
4+
# or overridden with command-line flags
5+
6+
# Issue prefix for this repository (used by bd init)
7+
# If not set, bd init will auto-detect from directory name
8+
# Example: issue-prefix: "myproject" creates issues like "myproject-1", "myproject-2", etc.
9+
# issue-prefix: ""
10+
11+
# Use no-db mode: load from JSONL, no SQLite, write back after each command
12+
# When true, bd will use .beads/issues.jsonl as the source of truth
13+
# instead of SQLite database
14+
# no-db: false
15+
16+
# Disable daemon for RPC communication (forces direct database access)
17+
# no-daemon: false
18+
19+
# Disable auto-flush of database to JSONL after mutations
20+
# no-auto-flush: false
21+
22+
# Disable auto-import from JSONL when it's newer than database
23+
# no-auto-import: false
24+
25+
# Enable JSON output by default
26+
# json: false
27+
28+
# Default actor for audit trails (overridden by BD_ACTOR or --actor)
29+
# actor: ""
30+
31+
# Path to database (overridden by BEADS_DB or --db)
32+
# db: ""
33+
34+
# Auto-start daemon if not running (can also use BEADS_AUTO_START_DAEMON)
35+
# auto-start-daemon: true
36+
37+
# Debounce interval for auto-flush (can also use BEADS_FLUSH_DEBOUNCE)
38+
# flush-debounce: "5s"
39+
40+
# Git branch for beads commits (bd sync will commit to this branch)
41+
# IMPORTANT: Set this for team projects so all clones use the same sync branch.
42+
# This setting persists across clones (unlike database config which is gitignored).
43+
# Can also use BEADS_SYNC_BRANCH env var for local override.
44+
# If not set, bd sync will require you to run 'bd config set sync.branch <branch>'.
45+
# sync-branch: "beads-sync"
46+
47+
# Multi-repo configuration (experimental - bd-307)
48+
# Allows hydrating from multiple repositories and routing writes to the correct JSONL
49+
# repos:
50+
# primary: "." # Primary repo (where this database lives)
51+
# additional: # Additional repos to hydrate from (read-only)
52+
# - ~/beads-planning # Personal planning repo
53+
# - ~/work-planning # Work planning repo
54+
55+
# Integration settings (access with 'bd config get/set')
56+
# These are stored in the database, not in this file:
57+
# - jira.url
58+
# - jira.project
59+
# - linear.url
60+
# - linear.api-key
61+
# - github.org
62+
# - github.repo

.beads/interactions.jsonl

Whitespace-only changes.

.beads/issues.jsonl

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
{"id":"vimput-21l","title":"Fix: Navegação com J em linhas vazias não funciona","description":"Não é possível navegar para linhas vazias usando J (ou k). Quando há linhas em branco, o cursor não consegue descer/subir para elas.","status":"closed","priority":2,"issue_type":"bug","owner":"mvacoimbra.dev@gmail.com","created_at":"2026-01-26T17:40:51.630718-03:00","created_by":"mvacoimbra","updated_at":"2026-01-26T18:03:54.757076-03:00","closed_at":"2026-01-26T18:03:54.757076-03:00","close_reason":"Fixed cursor rendering on empty lines"}
2+
{"id":"vimput-2jf","title":"Fix: Enter no insert mode cria linha no lugar errado","description":"No insert mode, quando o cursor está no meio de uma linha e o usuário pressiona Enter, a quebra de linha deveria ser inserida exatamente onde o cursor está, mas está criando a linha embaixo da última linha.","status":"closed","priority":2,"issue_type":"bug","owner":"mvacoimbra.dev@gmail.com","created_at":"2026-01-26T17:40:51.376161-03:00","created_by":"mvacoimbra","updated_at":"2026-01-26T18:03:54.431016-03:00","closed_at":"2026-01-26T18:03:54.431016-03:00","close_reason":"Fixed cursor rendering on empty lines"}
3+
{"id":"vimput-bzx","title":"Setting para controlar indentação (tab/espaços)","description":"Adicionar configuração para controlar indentação: escolher entre tab ou espaços, e quantos caracteres usar.","status":"open","priority":2,"issue_type":"feature","owner":"mvacoimbra.dev@gmail.com","created_at":"2026-01-27T09:07:25.005439-03:00","created_by":"mvacoimbra","updated_at":"2026-01-27T09:07:25.005439-03:00"}
4+
{"id":"vimput-d8x","title":"Cursor só pisca em idle","description":"O cursor deve parar de piscar quando o usuário está movimentando ou digitando. Ele só deve piscar quando está em idle (sem atividade).","status":"closed","priority":2,"issue_type":"feature","owner":"mvacoimbra.dev@gmail.com","created_at":"2026-01-26T17:40:52.309519-03:00","created_by":"mvacoimbra","updated_at":"2026-01-26T18:08:53.543475-03:00","closed_at":"2026-01-26T18:08:53.543475-03:00","close_reason":"Cursor now only blinks when idle and uses element-based rendering"}
5+
{"id":"vimput-l50","title":"Add code formatter (Prettier + sql-formatter)","description":"Add code formatting support to the editor.\n\n## Libraries\n- **Prettier** (standalone): JS, TS, JSX, TSX, CSS, HTML, JSON, Markdown, YAML, GraphQL\n- **sql-formatter**: SQL\n\n## Features\n- Command `:fmt` or `:format` to format current buffer\n- Shortcut `\u003cSpace\u003ecf` in normal mode (leader + code + format)\n- Respect user's indentation settings (indentType: tabs/spaces, indentSize: 2/4/8)\n- Opt-in setting with privacy disclaimer\n\n## UX for unsupported languages\n- Show alert/message in status bar when user tries to format unsupported language\n- Add icon or tooltip in language selector indicating formatter support\n\n## Implementation Progress\n\n### Done\n- [x] Added `formatterEnabled` setting (opt-in, disabled by default)\n- [x] Added UI in Settings \u003e Editor with privacy disclaimer\n- [x] Added `:fmt` and `:format` commands in vimEngine\n- [x] Added `\u003cSpace\u003ecf` shortcut in normal mode\n- [x] Added `pendingAction` to VimState for component communication\n- [x] Added status bar messages for formatting feedback\n- [x] Added sparkle icon in language selector (shows when formatter enabled)\n- [x] Created formatter.ts with Prettier + sql-formatter integration\n\n### Blocked\n- **Chrome UTF-8 encoding error**: When bundling Prettier (~2MB), Chrome fails to load content script with \"Could not load file 'content-scripts/content.js' for content script. It isn't UTF-8 encoded.\"\n- CDN approach (esm.sh) blocked by page CSP policies\n- File validates as ASCII/UTF-8 with `file` command and Node.js syntax check passes\n\n## Next Steps to Try\n1. **Web Worker approach**: Move Prettier to a separate web accessible resource loaded via Web Worker\n2. **Investigate Prettier plugins**: Some plugins (especially TypeScript at 874KB) may contain problematic characters\n3. **Try alternative bundler settings**: Different minification or encoding options\n4. **Consider lighter alternatives**: Use only sql-formatter (works) and simpler JS formatter\n\n## Technical Notes\n- sql-formatter works fine when bundled (~300KB)\n- Prettier standalone + all plugins = ~2MB\n- TypeScript plugin alone is 874KB\n- Dynamic imports from CDN blocked by strict CSP on many sites","status":"closed","priority":2,"issue_type":"feature","owner":"mvacoimbra.dev@gmail.com","created_at":"2026-01-28T00:59:32.155309-03:00","created_by":"mvacoimbra","updated_at":"2026-01-28T02:01:21.120647-03:00","closed_at":"2026-01-28T02:01:21.120647-03:00","close_reason":"Implemented local Python formatter worker approach to bypass Chrome UTF-8 bundling issues"}
6+
{"id":"vimput-rej","title":"Add indentation settings","description":"Add user-configurable indentation settings to the extension.\n\n## Requirements\n- Allow users to configure:\n - Indentation type (tabs vs spaces)\n - Indentation size (2, 4, 8 spaces)\n- Settings should be persisted in browser.storage.sync\n- Settings should be accessible from the popup settings panel\n\n## Implementation\n- Add new fields to configStore.ts\n- Update SettingsPanel.tsx with new UI controls\n- Apply indentation settings in VimputEditor.tsx","status":"closed","priority":2,"issue_type":"feature","owner":"mvacoimbra.dev@gmail.com","created_at":"2026-01-27T22:27:07.179345-03:00","created_by":"mvacoimbra","updated_at":"2026-01-28T00:14:59.834224-03:00","closed_at":"2026-01-28T00:14:59.834224-03:00","close_reason":"Implemented indentation settings: added indentType (tabs/spaces) and indentSize (2/4/8) to configStore, SettingsPanel UI, and VimputEditor Tab handling"}
7+
{"id":"vimput-sp2","title":"Debug: Compatibilidade com TypeScript Playground","description":"O editor não funciona corretamente com o TypeScript Playground (typescriptlang.org/play). Investigar a integração com editores baseados em Monaco/VS Code.","status":"closed","priority":2,"issue_type":"bug","owner":"mvacoimbra.dev@gmail.com","created_at":"2026-01-26T17:40:51.859149-03:00","created_by":"mvacoimbra","updated_at":"2026-01-27T11:50:52.440637-03:00","closed_at":"2026-01-27T11:50:52.440637-03:00","close_reason":"Closed"}
8+
{"id":"vimput-ztw","title":"Debug: Compatibilidade com editor da Udemy","description":"O editor não funciona corretamente com o editor de código da Udemy. Investigar a integração com esse editor específico.","status":"closed","priority":2,"issue_type":"bug","owner":"mvacoimbra.dev@gmail.com","created_at":"2026-01-26T17:40:52.081289-03:00","created_by":"mvacoimbra","updated_at":"2026-01-27T09:07:23.975834-03:00","closed_at":"2026-01-27T09:07:23.975834-03:00","close_reason":"Added Ace Editor support"}

.beads/metadata.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"database": "beads.db",
3+
"jsonl_export": "issues.jsonl"
4+
}

.env.example

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
# GitHub Actions Secrets for Store Deployment
2+
# Copy these to your repository secrets in GitHub Settings > Secrets and variables > Actions
3+
4+
# ============================================
5+
# Chrome Web Store (Service Account)
6+
# ============================================
7+
# 1. Create a service account in Google Cloud Console
8+
# 2. Enable Chrome Web Store API
9+
# 3. Add the service account email to your Chrome Web Store publisher account
10+
# (Settings > Group publishers > Add member)
11+
# 4. Copy the entire JSON key file content as the secret value
12+
13+
CHROME_SERVICE_ACCOUNT_KEY={"type":"service_account","project_id":"...","private_key":"..."}
14+
15+
# Set as repository variable (Settings > Secrets and variables > Variables):
16+
# CHROME_EXTENSION_ID=your-extension-id-from-chrome-web-store
17+
18+
# ============================================
19+
# Firefox Add-ons (AMO)
20+
# ============================================
21+
# Get API credentials: https://addons.mozilla.org/developers/addon/api/key/
22+
23+
AMO_JWT_ISSUER=user:12345678:123
24+
AMO_JWT_SECRET=your-api-secret
25+
26+
# Set as repository variable (not secret):
27+
# AMO_EXTENSION_ID=vimput@extension

.gitattributes

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
2+
# Use bd merge for beads JSONL files
3+
.beads/issues.jsonl merge=beads

0 commit comments

Comments
 (0)