Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
92 commits
Select commit Hold shift + click to select a range
c99f8c4
refactor(options): split prompt editor save helpers
audok May 20, 2026
4738c62
refactor(content): split controller helper modules
audok May 20, 2026
21cb901
refactor(options): split app UI components
audok May 20, 2026
38b3218
refactor(prompt): split repository helpers
audok May 20, 2026
d43f3ed
refactor(prompt): split storage client facade
audok May 20, 2026
2cd9651
refactor(prompt): remove legacy prompt storage support
audok May 22, 2026
e11b24f
test(prompt): remove sortOrder fixture alias
audok May 22, 2026
e7ee397
docs(testing): drop legacy prompt migration references
audok May 22, 2026
c80b571
refactor(platform): drop chat.openai.com host support
audok May 22, 2026
a5df013
fix(prompt): harden prompt concurrency mutations
audok May 22, 2026
e837d71
test(options): cover prompt concurrency conflicts
audok May 22, 2026
f59f1fa
fix(prompt): require explicit move boundaries
audok May 22, 2026
54522d2
Merge pull request #6 from audok/refactor
audok May 22, 2026
42a4617
style(content): restyle copy toast as glass chip
audok May 23, 2026
9a88c85
style(content): darken copy toast surface
audok May 23, 2026
b25397f
feat(options): show approved feedback in bottom toast
audok May 23, 2026
d21f8ef
style: normalize promptit brand casing
audok May 23, 2026
ac47e8d
style(options): enlarge promptit label
audok May 23, 2026
3c2728e
style(options): refine prompt editor copy
audok May 23, 2026
2cdef48
feat(options): refresh settings page UI
audok May 24, 2026
0bc57ef
style(options): align prompt add buttons
audok May 24, 2026
a2c8f15
fix(options): normalize reorder fallback toast
audok May 26, 2026
52c64e1
feat(i18n): add localized extension UI
audok May 26, 2026
04eb20d
test(i18n): cover localized extension flows
audok May 26, 2026
f1a2613
docs(testing): document i18n coverage
audok May 26, 2026
4feafba
fix(options): stabilize submit CTA rendering
audok May 26, 2026
470872a
feat(theme): add dark theme preference
audok May 28, 2026
99cca7b
fix(options): tint editor surface only while active
audok May 28, 2026
b45fdea
docs(testing): document e2e build-mode interference
audok May 28, 2026
f08cbea
style(content): darken slash popup theme
audok May 28, 2026
6f67609
style(options): align action button typography
audok May 28, 2026
8abed7d
test(content): wait for popup theme snapshots
audok May 28, 2026
6f4ee76
Merge pull request #7 from audok/theme
audok May 28, 2026
9cdf037
feat(options): add data portability flow
audok May 29, 2026
fe9ce8a
docs(testing): document data portability coverage
audok May 29, 2026
d380289
test(playwright): isolate extension test artifacts
audok May 29, 2026
3045fac
fix: normalize promptit name casing
audok May 29, 2026
08d1940
feat(backup): include theme preference in backups
audok May 29, 2026
28c421d
refactor(options): remove obsolete prompt draft helpers
audok May 29, 2026
59be5a5
test: remove unused popup color helper
audok May 29, 2026
961ec3f
refactor(runtime): split message contracts
audok May 31, 2026
206c69a
refactor(content): isolate runtime interactions
audok May 31, 2026
a34b0ef
refactor(options): centralize editor state transitions
audok May 31, 2026
4f2a054
refactor(options): split app orchestration from view
audok May 31, 2026
534ad74
test(e2e): split large specs by domain
audok May 31, 2026
a825beb
refactor: remove unused exported helpers
audok May 31, 2026
84385f6
docs: update testing documentation for split specs
audok May 31, 2026
eee5ac0
test(runtime): cover message contracts
audok May 31, 2026
e8791e6
test(e2e): cover corrupt prompt storage
audok May 31, 2026
98ebb84
test(e2e): cover host fixture matrix
audok May 31, 2026
f82ff20
test(e2e): cover rendering and scale regressions
audok May 31, 2026
d0e9d24
docs(testing): document WSL-stable coverage
audok May 31, 2026
7a603b7
test(live): add classified site smoke suite
audok May 31, 2026
f0f4208
docs(testing): document live smoke coverage
audok May 31, 2026
7cd5e02
test(live): broaden smoke flows without classifiers
audok May 31, 2026
5663535
docs(testing): simplify testing runbook
audok May 31, 2026
e6ba61a
fix(content): reject untrusted popup events
audok May 31, 2026
2b11573
build: isolate test extension output
audok May 31, 2026
6d3262c
docs(testing): clarify extension test outputs
audok May 31, 2026
cfc7514
perf(content): reduce slash popup runtime work
audok May 31, 2026
e13b6ee
refactor(runtime): split prompt conflict contracts
audok May 31, 2026
99e0e6e
fix(options): preserve dirty drafts during restore
audok May 31, 2026
2511a70
refactor(options): remove unused editor paths
audok May 31, 2026
a4e20a7
refactor(runtime): split prompt message contract
audok Jun 1, 2026
11fece0
refactor(content): split content controller responsibilities
audok Jun 1, 2026
3d76ec1
refactor(content): split popup renderer helpers
audok Jun 1, 2026
c42e481
test: quiet browser test output
audok Jun 1, 2026
51ee752
test: stabilize scale prompt edit flow
audok Jun 1, 2026
4163c43
fix(runtime): require record conflict payloads
audok Jun 1, 2026
5ee25f9
test(content): harden slash popup host coverage
audok Jun 1, 2026
5ab1593
test(live): add production insert smoke
audok Jun 1, 2026
f5bcbb4
test(options): strengthen ordering and export checks
audok Jun 1, 2026
169c93c
docs: document strengthened test coverage
audok Jun 1, 2026
ab96fbc
test: add visual QA snapshots
audok Jun 1, 2026
9b39fe8
fix(options): preserve editor state across conflicts
audok Jun 1, 2026
de634ed
fix(content): close copied popup after cleanup failure
audok Jun 1, 2026
a42b528
Merge pull request #8 from audok/refactor
audok Jun 1, 2026
2b60824
docs: simplify extension install guide
audok Jun 2, 2026
8c1ad62
docs: tighten testing documentation format
audok Jun 2, 2026
8f69fbf
test: make automated test commands OS-independent
audok Jun 2, 2026
b325c73
docs: document portable automated test workflow
audok Jun 2, 2026
655c480
fix(backup): bound restore and import payloads
audok Jun 3, 2026
a4fbfeb
perf(content): reduce slash trigger debounce
audok Jun 3, 2026
d6b1673
docs: add English docs with Korean copies
audok Jun 3, 2026
87e368f
docs: add contribution guide
audok Jun 3, 2026
ea7bbba
chore(release): bump version to 1.0.0
audok Jun 3, 2026
a6d3dcf
ci: add PR verification workflow
audok Jun 3, 2026
954a86a
docs: add README language links
audok Jun 3, 2026
5d4dbb5
docs: document v1 release asset name
audok Jun 3, 2026
65b036d
ci: use Playwright container for PR checks
audok Jun 3, 2026
ed6e226
fix: harden failure reporting paths
audok Jun 3, 2026
0952680
fix(storage): retry blocked IndexedDB opens
audok Jun 3, 2026
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
54 changes: 54 additions & 0 deletions .github/workflows/verification-check.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
name: Verification Check

on:
pull_request:
types: [opened, synchronize, reopened, ready_for_review]
workflow_dispatch:

permissions:
contents: read

concurrency:
group: verification-check-${{ github.ref }}
cancel-in-progress: true

jobs:
verify:
name: Verify build
runs-on: ubuntu-latest
container:
image: mcr.microsoft.com/playwright:v1.58.2-noble
timeout-minutes: 60

steps:
- name: Checkout
uses: actions/checkout@v6

- name: Setup pnpm
uses: pnpm/action-setup@v4
with:
version: 10.33.0

- name: Setup Node
uses: actions/setup-node@v6
with:
node-version: 24
cache: pnpm

- name: Install dependencies
run: pnpm install --frozen-lockfile

- name: Run verification
run: pnpm test

- name: Upload verification artifacts
if: ${{ !cancelled() }}
uses: actions/upload-artifact@v7
with:
name: verification-check-${{ github.run_id }}
path: |
dist/
playwright-report/
test-results/
if-no-files-found: ignore
retention-days: 14
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,7 @@ out
# Nuxt.js build / generate output
.nuxt
dist
dist-test/

# Gatsby files
.cache/
Expand Down Expand Up @@ -147,3 +148,4 @@ _codex/
# Playwright outputs
playwright-report/
test-results/
test-results-live/
94 changes: 94 additions & 0 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
# Contributing to promptit

Thanks for taking the time to improve promptit. This project is a Chromium browser extension for quickly inserting saved prompts into ChatGPT and Gemini with the `/ ` trigger.

This guide explains how to make focused, reviewable changes. For detailed test commands and coverage notes, read [TESTING.md](TESTING.md) and [TEST_CHECKLIST.md](TEST_CHECKLIST.md).

## Development Setup

promptit uses Node `^24.0.0` and `pnpm@10.33.0`.

```bash
git clone https://github.com/audok/promptit.git
cd promptit
pnpm install
pnpm build
```

The production extension bundle is created in `dist/`. To load it manually, open the Chrome or Chromium extensions page, turn on Developer mode, choose `Load unpacked`, and select `dist/`.

## Making Changes

Keep changes focused on the behavior you are trying to improve. Avoid unrelated refactors, formatting churn, generated artifacts, or cleanup that is not required by the contribution.

When changing user-facing behavior, update the relevant tests and documentation in the same change. If a primary English document has a Korean `.ko.md` counterpart, keep the counterpart in sync or clearly call out that it still needs translation.

When changing user-facing text, update both supported locales. App UI strings live in `src/shared/i18n.ts`; extension manifest strings live in `public/_locales/en/messages.json` and `public/_locales/ko/messages.json`.

When changing extension permissions, supported sites, manifest behavior, storage behavior, or data portability, keep the production manifest policy and existing privacy expectations intact. The extension should continue to use narrow permissions and supported-site content script matches.

## Testing

Use the narrowest useful test while developing, then run the broader gate when the change is ready.

```bash
pnpm typecheck
pnpm build
pnpm check:manifest
pnpm test:e2e
pnpm test
```

For a specific fixture spec, use npm script forwarding:

```bash
pnpm test:e2e -- tests/e2e/slash-popup-ui.spec.ts
```

Before release-oriented changes, also run the live smoke tests:

```bash
pnpm test:e2e:live
pnpm test:e2e:live:prod
```

After using Playwright, Chrome DevTools, or a task-owned browser, check for leftover test browser processes:

```bash
pnpm check:test-browsers
```

Live smoke tests depend on real ChatGPT/Gemini site state and may fail for external reasons. When that happens, keep deterministic fixture coverage strong and record the artifact or live site state that explains the failure.

## Manual Release Checks

Some behavior remains manual because browser toolbar UI, logged-in sessions, real downloads, and OS file pickers are not fully reliable through Playwright.

Before a release, manually confirm:

- Clicking the browser toolbar promptit icon opens or focuses the options page.
- Logged-in ChatGPT and Gemini sessions support `/ ` popup, insert, copy, pin/unpin, trigger cleanup, and no unintended submit.
- Backup/share export, restore, and import work with the actual downloads folder and OS file picker.

## Pull Request Checklist

Before opening or merging a PR, make sure:

- The change is scoped to one clear behavior or documentation update.
- Relevant docs and Korean/English text are updated.
- Relevant automated tests pass, or any skipped test is explained.
- `pnpm check:manifest` passes after a production build when manifest or release behavior is involved.
- Browser process cleanup has been checked after any browser automation.
- Generated build or test artifacts are not added unless the task explicitly requires them.

## Reporting Bugs

For bug reports, include:

- The browser and operating system.
- The affected site: ChatGPT or Gemini.
- Exact reproduction steps, including the text typed around the `/ ` trigger.
- Expected behavior and actual behavior.
- Screenshots, Playwright artifacts, or console logs when available.

Small, precise reports are easier to reproduce and fix than broad descriptions.
84 changes: 84 additions & 0 deletions README.ko.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
<p align="right"><a href="README.md">English</a> | 한국어</p>

# promptit

promptit은 ChatGPT와 Gemini 입력창에서 `/ `를 입력해 저장해 둔 프롬프트를 바로 불러오는 Chromium 브라우저 확장 프로그램입니다.

자주 쓰는 프롬프트를 옵션 페이지에 저장해 두고, [ChatGPT](https://chatgpt.com/), [Gemini](https://gemini.google.com/) 사이트에서 프롬프트를 바로 삽입하거나 복사할 수 있습니다.

## 지원 사이트
- [ChatGPT](https://chatgpt.com/)
- [Gemini](https://gemini.google.com/)

## 주요 기능
- `/` `space` 트리거(`slash` + `space`)로 저장된 프롬프트 목록 열기
- 선택한 프롬프트를 현재 입력창에 삽입
- 선택한 프롬프트를 클립보드에 복사

## 설치
### 방법 1. GitHub Releases에서 파일 다운로드
개발 환경을 준비하지 않아도 되는 방법입니다.

1. [이곳](https://github.com/audok/promptit/releases)에서 `promptit_v1.0.0.zip` 파일을 다운로드합니다.

2. 다운로드한 zip 파일의 압축을 풉니다.

3. Chrome 또는 Chromium 기반 브라우저에서 확장 관리 페이지를 엽니다.

4. 개발자 모드를 켭니다.

5. `압축해제된 확장 프로그램을 로드`를 클릭합니다.

6. 압축을 푼 폴더를 선택합니다.

> 새 버전으로 업데이트하려면 위의 과정을 다시 진행합니다.

### 방법 2. 직접 빌드 하기
이 프로젝트는 `pnpm@10.33.0`을 사용합니다.

1. 저장소를 클론합니다.
```bash
git clone https://github.com/audok/promptit.git
cd promptit
```

2. 의존성을 설치합니다.
```bash
pnpm install
```

3. 확장을 빌드합니다.
```bash
pnpm build
```

4. Chrome 또는 Chromium 기반 브라우저에서 확장 관리 페이지를 엽니다.

5. 개발자 모드를 켭니다.

6. `압축해제된 확장 프로그램을 로드합니다`를 클릭합니다.

7. 빌드 결과물인 `dist/` 폴더를 선택합니다.

> 새 버전으로 업데이트하려면 위의 과정을 다시 진행합니다.

## 사용법
1. 브라우저 툴바에서 promptit 확장 아이콘을 클릭해 옵션 페이지를 엽니다.
2. 제목과 본문을 입력해 프롬프트를 저장합니다.
3. ChatGPT 또는 Gemini 입력창에 `/` `space`를 입력하면 promptit 팝업이 열립니다.
4. 원하는 프롬프트를 선택해 입력창에 삽입하거나 복사합니다.

팝업에서는 마우스 또는 방향키와 `Enter` 키로 조작할 수 있습니다.
`Esc` 또는 `Backspace`를 누르면 팝업이 닫히고 입력한 `/ ` 트리거가 제거됩니다.

저장된 프롬프트가 없으면 팝업에서 옵션 페이지로 이동해 첫 프롬프트를 추가할 수 있습니다.

## 문제 해결
팝업이 열리지 않으면 아래 항목을 확인하세요.
1. 현재 페이지가 지원 사이트인지 확인합니다.
2. 입력창에 `/`만 입력한 것이 아니라 `/` `space`처럼 슬래시 뒤에 `space`까지 입력했는지 확인합니다.
3. 프롬프트가 없다면 옵션 페이지에서 먼저 프롬프트를 추가합니다.
4. 확장이 브라우저에 로드되어 있는지 확인합니다.

## LICENSE
[GPL-3.0](LICENSE)
101 changes: 48 additions & 53 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,89 +1,84 @@
# Promptit
Promptit은 ChatGPT와 Gemini 입력창에서 `/ `를 입력해 저장해 둔 프롬프트를 바로 불러오는 Chromium 브라우저 확장입니다.
<p align="right">English | <a href="README.ko.md">한국어</a></p>

자주 쓰는 프롬프트를 옵션 페이지에 저장해 두고, 지원되는 AI 사이트의 입력 흐름 안에서 삽입하거나 복사할 수 있습니다.
# promptit

## 지원 사이트
promptit is a Chromium browser extension that lets you quickly open saved prompts by typing `/ ` in ChatGPT and Gemini input fields.

Save frequently used prompts on the options page, then insert or copy them directly on [ChatGPT](https://chatgpt.com/) and [Gemini](https://gemini.google.com/).

## Supported Sites
- [ChatGPT](https://chatgpt.com/)
- [Gemini](https://gemini.google.com/)

## 주요 기능
- `/` `space` 트리거(`slash` + `space`)로 저장된 프롬프트 목록 열기
- 선택한 프롬프트를 현재 입력창에 삽입
- 선택한 프롬프트를 클립보드에 복사
## Features
- Open the saved prompt list with the `/` `space` trigger (`slash` + `space`)
- Insert the selected prompt into the current input field
- Copy the selected prompt to the clipboard

## 수동 설치
### 방법 1. GitHub Releases에서 빌드 파일 다운로드
## Installation
### Method 1. Download from GitHub Releases
Use this method if you do not want to set up a development environment.

개발 환경을 준비하지 않아도 되는 방법입니다.
1. Download `promptit_v1.0.0.zip` [here](https://github.com/audok/promptit/releases).

1. [이곳](https://github.com/audok/promptit/releases)에서 가장 최신 버전의 `promptit.zip` 파일을 다운로드합니다.
2. 다운로드한 zip 파일의 압축을 풉니다.
3. Chrome 또는 Chromium 기반 브라우저에서 확장 관리 페이지를 엽니다.
```text
chrome://extensions
```
2. Extract the downloaded zip file.

4. 개발자 모드를 켭니다.
5. `Load unpacked` 또는 `압축해제된 확장 프로그램을 로드합니다`를 클릭합니다.
6. 압축을 푼 폴더를 선택합니다.
3. Open the extensions management page in Chrome or a Chromium-based browser.

새 버전으로 업데이트하려면 최신 zip 파일을 다시 다운로드하고 압축을 푼 뒤, 5~6번 과정을 다시 진행합니다.
4. Turn on Developer mode.

### 방법 2. 저장소를 직접 빌드해서 설치
5. Click `Load unpacked`.

소스 코드를 직접 확인하거나 수정해서 사용하려는 경우 이 방법을 사용합니다.
6. Select the extracted folder.

이 프로젝트는 `pnpm@10.33.0`을 사용합니다.
> To update to a new version, repeat the steps above.

1. 저장소를 클론합니다.
### Method 2. Build It Yourself
This project uses `pnpm@10.33.0`.

1. Clone the repository.
```bash
git clone https://github.com/audok/promptit.git
cd promptit
```

2. 의존성을 설치합니다.
2. Install dependencies.
```bash
pnpm install
```

3. 확장을 빌드합니다.
3. Build the extension.
```bash
pnpm build
```

4. Chrome 또는 Chromium 기반 브라우저에서 확장 관리 페이지를 엽니다.
```text
chrome://extensions
```
4. Open the extensions management page in Chrome or a Chromium-based browser.

5. Turn on Developer mode.

5. 개발자 모드를 켭니다.
6. `Load unpacked` 또는 `압축해제된 확장 프로그램을 로드합니다`를 클릭합니다.
7. 빌드 결과물인 `dist/` 폴더를 선택합니다.
6. Click `Load unpacked`.

수동 설치한 확장은 자동 업데이트되지 않습니다. 새 버전이 나오면 GitHub Releases에서 최신 파일을 다시 받거나, 저장소를 최신 상태로 갱신한 뒤 다시 빌드해야 합니다.
7. Select the generated `dist/` folder.

## 사용법
1. 브라우저 툴바에서 Promptit 확장 아이콘을 클릭해 옵션 페이지를 엽니다.
2. 제목과 본문을 입력해 프롬프트를 저장합니다.
3. ChatGPT 또는 Gemini 입력창에 포커스합니다.
4. `/` `space`를 입력하면 Promptit 팝업이 열립니다.
5. 원하는 프롬프트를 선택해 입력창에 삽입하거나 복사합니다.
> To update to a new version, repeat the steps above.

팝업에서는 방향키로 항목과 액션을 이동하고 `Enter`로 실행할 수 있습니다. `Esc` 또는 `Backspace`를 누르면 팝업이 닫히고 입력한 `/ ` 트리거가 제거됩니다.
## Usage
1. Click the promptit extension icon in the browser toolbar to open the options page.
2. Enter a title and body to save a prompt.
3. Type `/` `space` in a ChatGPT or Gemini input field to open the promptit popup.
4. Select a prompt to insert it into the input field or copy it.

저장된 프롬프트가 없으면 팝업에서 옵션 페이지로 이동해 첫 프롬프트를 추가할 수 있습니다.
You can use the popup with a mouse, or with the arrow keys and `Enter`.
Press `Esc` or `Backspace` to close the popup and remove the `/ ` trigger you typed.

## 프롬프트 저장 규칙
- 제목은 1자 이상 40자 이하입니다.
- 본문은 비워 둘 수 없습니다.
If you do not have any saved prompts, you can open the options page from the popup and add your first prompt.

## 문제 해결
팝업이 열리지 않으면 아래 항목을 확인하세요.
- 현재 페이지가 지원 사이트인지 확인합니다.
- 확장이 브라우저에 로드되어 있는지 확인합니다.
- 입력창에 `/`만 입력한 것이 아니라 `/` `space`처럼 슬래시 뒤에 공백까지 입력했는지 확인합니다.
- 프롬프트가 없다면 옵션 페이지에서 먼저 프롬프트를 추가합니다.
## Troubleshooting
If the popup does not open, check the following:
1. Make sure the current page is a supported site.
2. Make sure you typed `/` `space`, including `space` after the slash, instead of only `/`.
3. If you do not have any prompts, add one from the options page first.
4. Make sure the extension is loaded in your browser.

## LICENSE
## License
[GPL-3.0](LICENSE)
Loading
Loading