mirror of
https://github.com/GetOpenScript/OpenScript.git
synced 2026-09-18 09:45:43 +00:00
Refactor: Streamline storage API and lock in @require
Co-authored-by: gemini-3.8-flash <noreply@google.com>
This commit is contained in:
85
TODO.md
Normal file
85
TODO.md
Normal file
@@ -0,0 +1,85 @@
|
||||
# OpenScript Architecture & Roadmap (TODO)
|
||||
|
||||
## 🎯 Vision & Philosophy
|
||||
OpenScript is built for personal control, security, and developer ergonomics—not legacy compatibility. We are intentionally divorcing from Greasemonkey/Tampermonkey conventions and Greasy Fork baggage in favor of a clean, modern, zero-overhead script runner for Chrome MV3.
|
||||
|
||||
---
|
||||
|
||||
## 1. Implement `OpenScript.storage.*` (Stateful Scripts)
|
||||
Add native, per-script key-value persistence so scripts can retain state, caches, counters, and UI toggle preferences across page reloads and browser restarts without relying on in-memory `Map`s.
|
||||
|
||||
### Proposed API
|
||||
```javascript
|
||||
await OpenScript.storage.set('repo_cache', { size: 1024 });
|
||||
const cached = await OpenScript.storage.get('repo_cache'); // returns undefined if not found
|
||||
await OpenScript.storage.delete('repo_cache');
|
||||
const allKeys = await OpenScript.storage.list();
|
||||
```
|
||||
|
||||
### Implementation Details
|
||||
* Store values under `chrome.storage.local`.
|
||||
* Prefix keys by script ID (`storage_${scriptId}_${key}`) to guarantee strict isolation between scripts.
|
||||
* Expose via background worker messaging or direct bridge in script injection context.
|
||||
* Universally available to all scripts without requiring any permission gates.
|
||||
|
||||
---
|
||||
|
||||
## 2. Eliminate Legacy Metadata Bloat (`@grant`, `@namespace`)
|
||||
Tampermonkey required headers designed for third-party security audits and sandboxing hacks from 15 years ago. For OpenScript, these are purely friction.
|
||||
|
||||
### TODO:
|
||||
- [ ] **Remove `@grant`:** Eliminate `@grant` from the parser, template boilerplate, and docs. Since OpenScript is designed for personal scripts, artificial permission gating is unnecessary red tape. All built-in APIs (`env`, `storage`) should be available out of the box.
|
||||
- [ ] **Remove `@namespace`:** Unnecessary metadata relic; completely ignore and omit.
|
||||
- [ ] **Minimalist Header Standard:** Retain only the essentials:
|
||||
- `@name` (UI display in popup)
|
||||
- `@match` (URL injection pattern for Chrome)
|
||||
- `@run-at` (`document_idle` | `document_start` | `document_end`)
|
||||
- `@description` *(Optional)*
|
||||
|
||||
---
|
||||
|
||||
## 3. Drop Ritualistic Wrappers & Enable Native Async
|
||||
Forcing scripts to start with `(function() { 'use strict'; })();` is ugly, redundant, and visually noisy.
|
||||
|
||||
### Proposed Improvement:
|
||||
* Automatically wrap user code behind the scenes inside `wrapScriptCode`:
|
||||
```javascript
|
||||
(async function() {
|
||||
'use strict';
|
||||
// User's clean script code runs here
|
||||
})();
|
||||
```
|
||||
|
||||
### Benefits:
|
||||
- **Top-Level `await` Everywhere:** Users can write `const res = await fetch(...)` directly at the root of the script without nesting inside an async function.
|
||||
- **Zero Boilerplate:** The default new script template drops down to:
|
||||
```javascript
|
||||
// ==UserScript==
|
||||
// @name My Script
|
||||
// @match *://*/*
|
||||
// ==/UserScript==
|
||||
|
||||
console.log('Running on', location.hostname);
|
||||
```
|
||||
- **Scope Isolation:** Variables (`const`, `let`, `var`) won't collide across multiple user scripts on the same page.
|
||||
- **Clean Early Exits:** Top-level `return;` continues to work cleanly to halt execution early when needed.
|
||||
|
||||
---
|
||||
|
||||
## 4. Purge `GM_*` Polyfills
|
||||
- [ ] Remove `GM_getValue` polyfill from `src/utils/userScripts.js`.
|
||||
- [ ] Transition strictly to the modern, canonical OpenScript namespace:
|
||||
- `OpenScript.env.KEY` / `env.KEY` (for synced credentials)
|
||||
- `OpenScript.storage.*` (for persistent per-script state)
|
||||
- [ ] Clean up tests and examples to remove references to `GM_*`.
|
||||
|
||||
---
|
||||
|
||||
## 5. External Libraries: Bundling via `@require`
|
||||
Instead of relying on dynamic `import()` (which is blocked by website Content Security Policies on hardened domains like GitHub), support `@require <url>`.
|
||||
|
||||
### Implementation:
|
||||
- Parser extracts `@require <url>` directives from metadata.
|
||||
- When saving/syncing scripts, OpenScript fetches external scripts (e.g. SweetAlert2, UI helpers) in the background.
|
||||
- Downloaded libraries are prepended directly into the user script bundle inside Chrome's isolated `USER_SCRIPT` world.
|
||||
- Bypasses target website CSP restrictions completely and works offline.
|
||||
Reference in New Issue
Block a user