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
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).

## [Unreleased]

## [3.5.40] - 2026-06-10

### Fixed
- **Italian locale was ~51% Spanish.** `src/data/it.json` had been built from `es.json` and only partially re-translated — 632 of its long strings were byte-identical Spanish, and the `_protected` brand map mistranslated `Claude → Claudio`, `Anthropic → Antropico`, `Claude Code → Codice Claudio`, silently breaking runtime brand-term restoration for Italian (our #1 install market). Re-translated every contaminated string from the English source via the same Google Translate endpoint the extension uses, restored brand/technical terms to canonical English, and rebuilt `_protected` with the correct Italian wrong-forms. Italian↔Spanish overlap is now 0.1% (parity with the other 10 locales). (#166, #167)
- **Protected-term restoration corrupted correct CJK prose.** Across ko/ja/zh-CN/zh-TW, common words were mapped as brand "wrong-forms" (클라우드→Claude, 인류→Anthropic, 企业→Enterprise, …), so `restoreProtectedTerms` rewrote correct translations into wrong English (e.g. "클라우드 컴퓨팅" → "Claude 컴퓨팅"). Removed the ambiguous common-word wrong-forms; intended brand restoration (클로드→Claude, etc.) still works. (#172)
Expand Down
6 changes: 3 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

<img src="assets/icons/icon128.png" alt="SkillBridge" width="90" />

# SkillBridge — AI Course Translator <!-- VERSION_START -->v3.5.39<!-- VERSION_END -->
# SkillBridge — AI Course Translator <!-- VERSION_START -->v3.5.40<!-- VERSION_END -->

> Available in multiple languages at the [project landing page](https://heznpc.github.io/skillBridge/).

Expand Down Expand Up @@ -145,11 +145,11 @@ Generic translation tools often **mistranslate brand names and technical terms**

## Installation

> **Status: live as v1.0.1; re-publication of the current v3.5.39 pending.**
> **Status: live as v1.0.1; re-publication of the current v3.5.40 pending.**
> The Chrome Web Store listing is available in all locales **except the United
> States**, where it was removed on 2026-05-12 over a trademark issue with the
> old icon (since redesigned on `main`). The published store build is v1.0.1;
> `main` is the up-to-date release (v3.5.39). For the latest version — and for
> `main` is the up-to-date release (v3.5.40). For the latest version — and for
> US users until re-listing — install via the manual / developer-mode path below.

### Chrome / Edge / Chromium browsers
Expand Down
2 changes: 1 addition & 1 deletion claude-plugin/skills/academy-terms/data/index.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"plugin": "skillbridge-academy-terms",
"generatedBy": "scripts/build-plugin.js",
"sourceVersion": "3.5.39",
"sourceVersion": "3.5.40",
"languages": [
"de",
"es",
Expand Down
2 changes: 1 addition & 1 deletion claude-plugin/skills/academy-terms/data/terms.de.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"_meta": {
"lang": "de",
"langName": "Deutsch",
"sourceVersion": "3.5.39",
"sourceVersion": "3.5.40",
"sourceLastUpdated": "2026-04-02",
"generatedFrom": "src/data/de.json",
"termCount": 999
Expand Down
2 changes: 1 addition & 1 deletion claude-plugin/skills/academy-terms/data/terms.es.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"_meta": {
"lang": "es",
"langName": "Español",
"sourceVersion": "3.5.39",
"sourceVersion": "3.5.40",
"sourceLastUpdated": "2026-04-02",
"generatedFrom": "src/data/es.json",
"termCount": 999
Expand Down
2 changes: 1 addition & 1 deletion claude-plugin/skills/academy-terms/data/terms.fr.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"_meta": {
"lang": "fr",
"langName": "Français",
"sourceVersion": "3.5.39",
"sourceVersion": "3.5.40",
"sourceLastUpdated": "2026-04-02",
"generatedFrom": "src/data/fr.json",
"termCount": 999
Expand Down
2 changes: 1 addition & 1 deletion claude-plugin/skills/academy-terms/data/terms.it.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"_meta": {
"lang": "it",
"langName": "Italiano",
"sourceVersion": "3.5.39",
"sourceVersion": "3.5.40",
"sourceLastUpdated": "2026-06-03",
"generatedFrom": "src/data/it.json",
"termCount": 999
Expand Down
2 changes: 1 addition & 1 deletion claude-plugin/skills/academy-terms/data/terms.ja.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"_meta": {
"lang": "ja",
"langName": "日本語",
"sourceVersion": "3.5.39",
"sourceVersion": "3.5.40",
"sourceLastUpdated": "2026-04-02",
"generatedFrom": "src/data/ja.json",
"termCount": 999
Expand Down
2 changes: 1 addition & 1 deletion claude-plugin/skills/academy-terms/data/terms.ko.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"_meta": {
"lang": "ko",
"langName": "한국어",
"sourceVersion": "3.5.39",
"sourceVersion": "3.5.40",
"sourceLastUpdated": "2026-04-02",
"generatedFrom": "src/data/ko.json",
"termCount": 999
Expand Down
2 changes: 1 addition & 1 deletion claude-plugin/skills/academy-terms/data/terms.pt-BR.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"_meta": {
"lang": "pt-BR",
"langName": "Português (BR)",
"sourceVersion": "3.5.39",
"sourceVersion": "3.5.40",
"sourceLastUpdated": "2026-04-02",
"generatedFrom": "src/data/pt-BR.json",
"termCount": 999
Expand Down
2 changes: 1 addition & 1 deletion claude-plugin/skills/academy-terms/data/terms.ru.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"_meta": {
"lang": "ru",
"langName": "Русский",
"sourceVersion": "3.5.39",
"sourceVersion": "3.5.40",
"sourceLastUpdated": "2026-04-02",
"generatedFrom": "src/data/ru.json",
"termCount": 999
Expand Down
2 changes: 1 addition & 1 deletion claude-plugin/skills/academy-terms/data/terms.vi.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"_meta": {
"lang": "vi",
"langName": "Tiếng Việt",
"sourceVersion": "3.5.39",
"sourceVersion": "3.5.40",
"sourceLastUpdated": "2026-04-02",
"generatedFrom": "src/data/vi.json",
"termCount": 999
Expand Down
2 changes: 1 addition & 1 deletion claude-plugin/skills/academy-terms/data/terms.zh-CN.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"_meta": {
"lang": "zh-CN",
"langName": "简体中文",
"sourceVersion": "3.5.39",
"sourceVersion": "3.5.40",
"sourceLastUpdated": "2026-04-02",
"generatedFrom": "src/data/zh-CN.json",
"termCount": 999
Expand Down
2 changes: 1 addition & 1 deletion claude-plugin/skills/academy-terms/data/terms.zh-TW.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"_meta": {
"lang": "zh-TW",
"langName": "中文(繁體)",
"sourceVersion": "3.5.39",
"sourceVersion": "3.5.40",
"sourceLastUpdated": "2026-04-02",
"generatedFrom": "src/data/zh-TW.json",
"termCount": 999
Expand Down
4 changes: 2 additions & 2 deletions docs/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
<title>SkillBridge — AI Course Translator for <!-- LANG_COUNT_START -->32+<!-- LANG_COUNT_END --> Languages</title>
<meta name="description" content="Free Chrome extension to translate the free AI courses at anthropic.skilljar.com into <!-- LANG_COUNT_START -->32+<!-- LANG_COUNT_END --> languages with an in-page AI tutor. No API keys needed.">
<meta property="og:title" content="SkillBridge — AI Course Translator">
<meta property="og:description" content="Translate the free AI courses at anthropic.skilljar.com into your language. <!-- VERSION_START -->v3.5.39<!-- VERSION_END -->.">
<meta property="og:description" content="Translate the free AI courses at anthropic.skilljar.com into your language. <!-- VERSION_START -->v3.5.40<!-- VERSION_END -->.">
<meta property="og:type" content="website">
<style>
* { margin: 0; padding: 0; box-sizing: border-box; }
Expand Down Expand Up @@ -255,7 +255,7 @@
<body>
<section class="hero">
<div class="container">
<div class="hero-badge"><!-- VERSION_START -->v3.5.39<!-- VERSION_END --> &middot; Open Source &middot; Free &middot; No API Key</div>
<div class="hero-badge"><!-- VERSION_START -->v3.5.40<!-- VERSION_END --> &middot; Open Source &middot; Free &middot; No API Key</div>
<h1>Translate AI Courses<br>Into Your Language</h1>
<p>A Chrome extension that translates the free AI course pages at anthropic.skilljar.com into <!-- LANG_COUNT_START -->32+<!-- LANG_COUNT_END --> languages with an in-page AI tutor.</p>
<p style="font-size:13px;opacity:0.85;margin-top:-16px;">Independent community project. Not affiliated with, endorsed by, or sponsored by Anthropic or Skilljar.</p>
Expand Down
2 changes: 1 addition & 1 deletion manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"manifest_version": 3,
"name": "__MSG_extName__",
"description": "__MSG_extDescription__",
"version": "3.5.39",
"version": "3.5.40",
"minimum_chrome_version": "124",
"author": "SkillBridge Contributors",
"homepage_url": "https://github.com/heznpc/skillbridge",
Expand Down
4 changes: 2 additions & 2 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "skillbridge",
"version": "3.5.39",
"version": "3.5.40",
"private": true,
"scripts": {
"test": "jest --verbose",
Expand Down
2 changes: 1 addition & 1 deletion src/data/de.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"_meta": {
"lang": "de",
"langName": "Deutsch",
"version": "3.5.39",
"version": "3.5.40",
"lastUpdated": "2026-04-02"
},
"ui": {
Expand Down
2 changes: 1 addition & 1 deletion src/data/es.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"_meta": {
"lang": "es",
"langName": "Español",
"version": "3.5.39",
"version": "3.5.40",
"lastUpdated": "2026-04-02"
},
"ui": {
Expand Down
2 changes: 1 addition & 1 deletion src/data/fr.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"_meta": {
"lang": "fr",
"langName": "Français",
"version": "3.5.39",
"version": "3.5.40",
"lastUpdated": "2026-04-02"
},
"ui": {
Expand Down
2 changes: 1 addition & 1 deletion src/data/it.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"_meta": {
"lang": "it",
"langName": "Italiano",
"version": "3.5.39",
"version": "3.5.40",
"lastUpdated": "2026-06-03",
"translation_provenance": "Re-translated from the English source via Google Translate (2026-06), with brand/technical terms restored to canonical English; Italian↔Spanish overlap is now 0.1% (parity with the other 10 locales). Earlier v1 was a Spanish-derived regex transform — fully replaced. Structural keys must remain identical to other premium dictionaries (enforced by scripts/check-dict-coverage.js); native Italian PRs welcome."
},
Expand Down
2 changes: 1 addition & 1 deletion src/data/ja.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"_meta": {
"lang": "ja",
"langName": "日本語",
"version": "3.5.39",
"version": "3.5.40",
"lastUpdated": "2026-04-02"
},
"ui": {
Expand Down
2 changes: 1 addition & 1 deletion src/data/ko.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"_meta": {
"lang": "ko",
"langName": "한국어",
"version": "3.5.39",
"version": "3.5.40",
"lastUpdated": "2026-04-02"
},
"ui": {
Expand Down
2 changes: 1 addition & 1 deletion src/data/pt-BR.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"_meta": {
"lang": "pt-BR",
"langName": "Português (BR)",
"version": "3.5.39",
"version": "3.5.40",
"lastUpdated": "2026-04-02"
},
"ui": {
Expand Down
2 changes: 1 addition & 1 deletion src/data/ru.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"_meta": {
"lang": "ru",
"langName": "Русский",
"version": "3.5.39",
"version": "3.5.40",
"lastUpdated": "2026-04-02"
},
"ui": {
Expand Down
2 changes: 1 addition & 1 deletion src/data/vi.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"_meta": {
"lang": "vi",
"langName": "Tiếng Việt",
"version": "3.5.39",
"version": "3.5.40",
"lastUpdated": "2026-04-02"
},
"ui": {
Expand Down
2 changes: 1 addition & 1 deletion src/data/zh-CN.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"_meta": {
"lang": "zh-CN",
"langName": "简体中文",
"version": "3.5.39",
"version": "3.5.40",
"lastUpdated": "2026-04-02"
},
"ui": {
Expand Down
2 changes: 1 addition & 1 deletion src/data/zh-TW.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"_meta": {
"lang": "zh-TW",
"langName": "中文(繁體)",
"version": "3.5.39",
"version": "3.5.40",
"lastUpdated": "2026-04-02"
},
"ui": {
Expand Down
28 changes: 14 additions & 14 deletions store-assets/RELEASE_CHECKLIST.md
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
# Release Checklist — v3.5.39 re-publication
# Release Checklist — v3.5.40 re-publication

> Refreshed 2026-06-01 for v3.5.39. Since the last revision: the non-infringing
> Refreshed 2026-06-10 for v3.5.40 (post shadow-DOM migration + live-debug fixes). Since the last revision: the non-infringing
> icon shipped (v3.5.35), the learning-companion features + Tools menu landed
> (v3.5.36–3.5.39), and the page bridge / AI tutor was scoped to
> anthropic.skilljar.com. This is the source of truth for the next dashboard upload.

CWS listing status:
- Published: **v1.0.1** (uploaded 2026-03-10)
- Local: **v3.5.39**
- Many PRs (#135–#156) have landed since the published version — none have reached users yet
- Local: **v3.5.40**
- Many PRs (#135–#194) have landed since the published version — none have reached users yet
- `npm run check:cws-drift` intentionally fails until the dashboard is updated

The remaining publish steps cross trust boundaries the automation can't cross
Expand All @@ -17,9 +17,9 @@ Everything code-side is ready and pre-built.

## What's already prepared (no further action needed)

- ✅ `manifest.json` v3.5.39 + `package.json` + 11 `src/data/*.json` `_meta.version` all bumped
- ✅ `CHANGELOG.md` v3.5.34–3.5.39 sections written (PRs #135–#157 consolidated)
- ✅ `store-assets/skillbridge-bundled.zip` (minified, **rebuilt at v3.5.39** via `npm run build:bundle:zip`) — **this is the CWS upload artifact**
- ✅ `manifest.json` v3.5.40 + `package.json` + 11 `src/data/*.json` `_meta.version` all bumped
- ✅ `CHANGELOG.md` v3.5.34–3.5.40 sections written (PRs #135–#194 consolidated)
- ✅ `store-assets/skillbridge-bundled.zip` (minified, **rebuilt at v3.5.40** via `npm run build:bundle:zip`) — **this is the CWS upload artifact**
- ⚠️ `store-assets/skillbridge.zip` (raw source) — fallback only if the bundled
build is rejected in review. **Run `npm run build:zip` immediately before
uploading it** — this artifact is gitignored, is not rebuilt by
Expand All @@ -34,7 +34,7 @@ Everything code-side is ready and pre-built.
connect to the privacy policy link". `github.com` links are case-insensitive,
so the homepage/support URLs are fine lowercase — only the `github.io` URL
must be capital-B.
- ✅ Tests 488/488 + 17 e2e, ESLint + Prettier clean, all check-* scripts clean (incl. `check:academy`)
- ✅ Tests 520/520 + 19 e2e, ESLint + Prettier clean, all check-* scripts clean (incl. `check:academy`)
- ✅ AI-content gate wired into `manifest.json:content_scripts[].js` (PR #145 hotfix)
- ✅ CWS-drift watcher will keep this from drifting 3 months again
- ✅ Italian dictionary live (PR #140) — timed with Anthropic Milan office opening 2026-05-27
Expand Down Expand Up @@ -86,18 +86,18 @@ Open https://chrome.google.com/webstore/devconsole/a4725d38-81e7-41f5-bf21-5c11f
### 3b. Privacy tab (this is what blocked the last submit)

Open the "개인정보 보호 / Privacy practices" tab. The published v1.0.1 answers are
stale against v3.5.39 — fix these:
stale against v3.5.40 — fix these:

- **Privacy policy URL** — must be the **capital-B** `github.io` URL (see the
Privacy-URL note above). The lowercase form 404s and the dashboard refuses to
submit ("개인정보처리방침 링크에 연결할 수 없습니다").
- **"Are you using remote code?" → NO.** v1.0.1 loaded Puter.js from
`https://js.puter.com/v2/` (remote code → MV3 detailed review / delay).
v3.5.39 bundles it as `src/bridge/puter.js` and loads it via
v3.5.39+ bundles it as `src/bridge/puter.js` and loads it via
`chrome.runtime.getURL` (`translator.js` sets `script.dataset.puterUrl =
chrome.runtime.getURL('src/bridge/puter.js')`); there is no remote fallback
(`page-bridge.js`: `if (!_puterUrl) reject`). So no remote code is loaded.
**Only flip this to NO after the v3.5.39 package is uploaded** — answering NO
**Only flip this to NO after the v3.5.40 package is uploaded** — answering NO
while the published build still loads remote Puter would be a false statement.
(Puter's runtime calls to `api.puter.com` are data transfer, not remote code —
disclosed under data usage below.)
Expand All @@ -110,7 +110,7 @@ stale against v3.5.39 — fix these:
Keep the three confirmations checked (transfer to a service provider to perform
the requested feature is an approved use case, not a sale).
- **Permission justifications** — paste from `STORE_LISTING.md` "Permission
Justifications". v3.5.39 declares `storage` + `alarms` + four hosts
Justifications". v3.5.40 declares `storage` + `alarms` + four hosts
(`*.skilljar.com`, `*.youtube.com`, `translate.googleapis.com`,
`api.github.com`). The old `activeTab` / `tabs` justification fields disappear
after upload (those permissions are no longer in the manifest); `alarms` and
Expand Down Expand Up @@ -145,7 +145,7 @@ the `cws-drift.yml` workflow via `workflow_dispatch` — it should report `OK`

## If trademark complaint comes back

If Tracer / Anthropic IP enforcement files another complaint against v3.5.39:
If Tracer / Anthropic IP enforcement files another complaint against v3.5.40:
1. Check whether it cites the icon (then return to step 1 option B/C) or the
listing copy (then re-sweep `store-assets/STORE_LISTING*.md` for any
residual brand-as-product-modifier phrasing).
Expand All @@ -156,5 +156,5 @@ If Tracer / Anthropic IP enforcement files another complaint against v3.5.39:
## SNS launch (separate session, after listing is live)

SNS launch drafts are kept outside this repo (internal). Do not post until the
CWS listing reflects v3.5.39 — posting before would point users at a listing
CWS listing reflects v3.5.40 — posting before would point users at a listing
missing all the work the post talks about.
6 changes: 4 additions & 2 deletions store-assets/STORE_LISTING.md
Original file line number Diff line number Diff line change
@@ -1,17 +1,19 @@
# Chrome Web Store — Store Listing (v3.5.39)
# Chrome Web Store — Store Listing (v3.5.40)

This is the single Chrome Web Store listing (English / default locale — shown to
every user regardless of browser language). The store copy is intentionally
English-only to avoid listing drift; the extension UI itself is localized in 11
premium languages.

## What's New (v3.5.39) — paste into the CWS "What's new" field
## What's New (v3.5.40) — paste into the CWS "What's new" field

- 🃏 Spaced-repetition flashcards — a new "Review due" mode shows only the cards due now (cards come back at the right time).
- 🔖 Bookmarks — save a lesson at your exact scroll position and jump back anytime.
- ⏩ Continue / Recent — resume across courses right where you left off.
- 📑 In-lesson outline + reading-progress bar for long lessons.
- 🧰 Tidier tutor — history, flashcards, bookmarks, Continue, and PDF export are grouped in one "Tools" menu.
- 🛠️ Polish — the AI-tutor button icon renders on every page, suggestion chips line up with the chat, and brand terms no longer show up doubled like "Claude(Claude)".
- 🧱 Sturdier UI — SkillBridge's panels are now isolated from the host site's styles, so Academy site updates can't visually break them.
- 🎨 New extension icon.

## Title (max 75 chars)
Expand Down
Loading