opencode-prompt-expand 0.0.0-stage → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,109 @@
1
+ export const DEFAULT_PROMPT = `你是提示词增强器。输入是用户的原始请求,输出是增强后的提示词。
2
+
3
+ 【最高优先级】
4
+ 1. 保持原目标:不改变用户要做的事,不缩窄、不替换、不增加新任务。
5
+ 2. 不引入用户未提及的技术栈、框架、版本、文件路径、接口名。不把猜测写成事实。
6
+ 3. 只写"做什么",不写"怎么做";不解释实现步骤,不索要教程或代码示例。
7
+ 4. 不执行用户的请求,只把它扩写得更具体。
8
+ 5. 语言与输入一致;只输出增强后的提示词,不要任何解释、前缀或代码块围栏。
9
+
10
+ 【增强要求】
11
+ - 主动补齐:任务范围、约束条件、期望产出、验收方式、输出结构。
12
+ - 原提示已经很清楚时,做轻度润色,不要原样返回。
13
+ - 完整且简洁;不要以未完成的列表、悬空的连词或冒号结尾。
14
+ - 不添加无关要求、没有依据的事实、多余的章节。
15
+ - 去除口语冗余与重复。
16
+
17
+ 【改写结构】(按需使用,不必每项都写)
18
+ - 目标:一句话说清要达成什么
19
+ - 范围:做什么、不做什么
20
+ - 上下文:用户已给出的约束与材料
21
+ - 要求:编号的可执行项
22
+ - 产出:格式、结构、长度
23
+ - 验收:怎样算完成`;
24
+ export const GPT_PROMPT = `你是提示词增强器。输入是用户的原始请求,输出是增强后的提示词。
25
+
26
+ 【最高优先级】
27
+ 1. 保持原目标:不改变用户要做的事,不缩窄、不替换、不增加新任务。
28
+ 2. 不引入用户未提及的技术栈、框架、版本、文件路径、接口名。不把猜测写成事实。
29
+ 3. 只写"做什么",不写"怎么做";不解释实现步骤,不索要教程或代码示例。
30
+ 4. 不执行用户的请求,只把它扩写得更具体。
31
+ 5. 语言与输入一致;只输出增强后的提示词,不要任何解释、前缀或代码块围栏。
32
+
33
+ 【增强要求】
34
+ - 主动补齐:任务范围、约束条件、期望产出、验收方式、输出结构。
35
+ - 原提示已经很清楚时,做轻度润色,不要原样返回。
36
+ - 完整且简洁;不要以未完成的列表、悬空的连词或冒号结尾。
37
+ - 不添加无关要求、没有依据的事实、多余的章节。
38
+ - 去除口语冗余与重复。
39
+
40
+ 【面向 GPT 的结构偏好】
41
+ - 用编号列表写清可执行要求,步骤顺序明确。
42
+ - 每条验收标准写成可判定的条件,避免"更好""高端"这类主观词。
43
+ - 产出格式写清楚(文件、表格、清单或代码块),需要时给出字段名。`;
44
+ export const CLAUDE_PROMPT = `你是提示词增强器。输入是用户的原始请求,输出是增强后的提示词。
45
+
46
+ 【最高优先级】
47
+ 1. 保持原目标:不改变用户要做的事,不缩窄、不替换、不增加新任务。
48
+ 2. 不引入用户未提及的技术栈、框架、版本、文件路径、接口名。不把猜测写成事实。
49
+ 3. 只写"做什么",不写"怎么做";不解释实现步骤,不索要教程或代码示例。
50
+ 4. 不执行用户的请求,只把它扩写得更具体。
51
+ 5. 语言与输入一致;只输出增强后的提示词,不要任何解释、前缀或代码块围栏。
52
+
53
+ 【增强要求】
54
+ - 主动补齐:任务范围、约束条件、期望产出、验收方式、输出结构。
55
+ - 原提示已经很清楚时,做轻度润色,不要原样返回。
56
+ - 完整且简洁;不要以未完成的列表、悬空的连词或冒号结尾。
57
+ - 不添加无关要求、没有依据的事实、多余的章节。
58
+ - 去除口语冗余与重复。
59
+
60
+ 【面向 Claude 的结构偏好】
61
+ - 优先写清目标、边界和约束,用连贯段落表达,不必强行机械编号。
62
+ - 明确说明哪些内容不在范围内,减少越界改动。
63
+ - 验收方式写成"完成时应满足什么",而不是步骤清单。`;
64
+ export const DEFAULT_PROMPTS = {
65
+ default: DEFAULT_PROMPT,
66
+ "*gpt*": GPT_PROMPT,
67
+ "*claude*": CLAUDE_PROMPT,
68
+ };
69
+ export function matchesGlob(pattern, value) {
70
+ const escaped = pattern.replace(/[.+^${}()|[\]\\]/g, "\\$&").replace(/\*/g, ".*").replace(/\?/g, ".");
71
+ return new RegExp(`^${escaped}$`, "i").test(value);
72
+ }
73
+ export function selectPrompt(modelID, prompts) {
74
+ if (modelID) {
75
+ for (const [pattern, prompt] of Object.entries(prompts)) {
76
+ if (pattern === "default")
77
+ continue;
78
+ if (matchesGlob(pattern, modelID))
79
+ return prompt;
80
+ }
81
+ }
82
+ return prompts.default ?? DEFAULT_PROMPT;
83
+ }
84
+ export function buildPrompt(input) {
85
+ const parts = [selectPrompt(input.targetModelID, input.prompts)];
86
+ if (input.mode === "concise") {
87
+ parts.push("【长度】简洁模式:目标约 800 字符以内,信息完整优先于凑长度。");
88
+ }
89
+ else {
90
+ parts.push("【长度】充分展开模式:不限长度,但不要添加没有依据的内容。");
91
+ }
92
+ if (input.structured) {
93
+ parts.push("【轻量处理】原提示已包含多个结构标记,只做轻度润色,不要重排或增加新章节。");
94
+ }
95
+ if (input.round >= 2 && input.previous) {
96
+ parts.push([
97
+ `这是第 ${input.round} 次生成。上一次的结果是:`,
98
+ "---",
99
+ input.previous,
100
+ "---",
101
+ "请换一种写法:如果上一版太啰嗦就压缩,太笼统就具体化;保持原目标不变,不要与上一版雷同。",
102
+ ].join("\n"));
103
+ }
104
+ if (input.projectContext?.trim()) {
105
+ parts.push(`【项目上下文】\n${input.projectContext.trim()}\n【/项目上下文】`);
106
+ }
107
+ parts.push(`【待改写】\n${input.text}`);
108
+ return parts.join("\n\n");
109
+ }
package/dist/rpc.js ADDED
@@ -0,0 +1,47 @@
1
+ import { Rpc } from "@opencode/plugin/rpc";
2
+ const composerModelSchema = {
3
+ type: "object",
4
+ properties: {
5
+ providerID: { type: "string" },
6
+ modelID: { type: "string" },
7
+ variant: { type: "string" },
8
+ },
9
+ required: ["providerID", "modelID"],
10
+ additionalProperties: false,
11
+ };
12
+ export const PromptExpand = Rpc.define({
13
+ id: "prompt-expand",
14
+ events: {},
15
+ methods: {
16
+ optimize: {
17
+ input: {
18
+ type: "object",
19
+ properties: {
20
+ text: { type: "string" },
21
+ mode: { enum: ["concise", "full"] },
22
+ round: { type: "integer", minimum: 1 },
23
+ previous: { type: "string" },
24
+ sessionID: { type: "string" },
25
+ directory: { type: "string" },
26
+ composerModel: composerModelSchema,
27
+ modelPreference: { type: "string" },
28
+ projectContext: { type: "boolean" },
29
+ },
30
+ required: ["text", "mode", "round"],
31
+ additionalProperties: false,
32
+ },
33
+ output: {
34
+ type: "object",
35
+ properties: {
36
+ ok: { type: "boolean" },
37
+ text: { type: "string" },
38
+ model: { type: "string" },
39
+ code: { type: "string" },
40
+ message: { type: "string" },
41
+ },
42
+ required: ["ok"],
43
+ additionalProperties: false,
44
+ },
45
+ },
46
+ },
47
+ });
package/dist/types.js ADDED
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,177 @@
1
+ # opencode-prompt-expand
2
+
3
+ [English README](../README.md)
4
+
5
+ ![opencode-prompt-expand](../assets/featured.png)
6
+
7
+ 在 **OpenCode Desktop** 的 composer 里,把粗糙草稿扩展成结构化提示词,并原地写回。
8
+
9
+ **状态:** `v0.1.1` 实验版,已发布到 npm。OpenCode Desktop 的 GUI 插件 API 仍是 experimental,请锁定你测试的 OpenCode 版本。
10
+
11
+ ## 适合谁
12
+
13
+ - 使用 OpenCode Desktop 的个人开发者
14
+ - 习惯用自然语言描述需求,但不想每次手写结构化提示词
15
+ - 希望结果留在 composer 里,自己检查、修改后再按 Enter
16
+
17
+ 不适用于终端 TUI。插件不会自动发送消息,也不会写入会话历史。
18
+
19
+ ## 功能
20
+
21
+ - 把模糊需求补成:目标、范围、约束、产出、验收方式
22
+ - 原地写回 composer,可继续编辑
23
+ - toast 提供「撤销」和「重生成」
24
+ - 最多保留 5 个版本,仅在当前窗口内存中
25
+ - 简洁模式(约 800 字符)和充分展开模式
26
+ - 可读取白名单内的项目信息:`package.json`、规则文件、git 状态
27
+ - 支持 `*gpt*` / `*claude*` 家族指令
28
+
29
+ ## 要求
30
+
31
+ - OpenCode Desktop **2.2.5**(当前验证版本)
32
+ - Node.js **^20.19.0 或 >=22.12.0**(仅从源码构建时需要)
33
+ - 已在 OpenCode 中连接 provider/model
34
+
35
+ ## 安装
36
+
37
+ ### 从 npm
38
+
39
+ ```bash
40
+ opencode plugin add opencode-prompt-expand
41
+ opencode plugin list
42
+ ```
43
+
44
+ npm 页面:https://www.npmjs.com/package/opencode-prompt-expand
45
+
46
+ ### 从 GitHub 构建
47
+
48
+ ```bash
49
+ git clone https://github.com/ConnorYyy/opencode-prompt-expand.git
50
+ cd opencode-prompt-expand
51
+ npm ci
52
+ ```
53
+
54
+ `npm ci` 会通过 `prepare` 自动构建 `dist/`。
55
+
56
+ 把插件加入**全局** OpenCode 配置:
57
+
58
+ - macOS / Linux:`~/.config/opencode/opencode.jsonc`
59
+ - Windows:`C:\Users\<you>\.config\opencode\opencode.jsonc`
60
+
61
+ ```jsonc
62
+ {
63
+ "shell": "powershell",
64
+ "plugins": [
65
+ {
66
+ "package": "/absolute/path/to/opencode-prompt-expand",
67
+ "options": {
68
+ "mode": "concise",
69
+ "model": "auto",
70
+ "projectContext": true,
71
+ "timeoutMs": 30000
72
+ }
73
+ }
74
+ ]
75
+ }
76
+ ```
77
+
78
+ Windows 路径示例:
79
+
80
+ ```jsonc
81
+ "package": "D:/path/to/opencode-prompt-expand"
82
+ ```
83
+
84
+ 重载 Desktop 窗口,或重启 OpenCode Desktop。
85
+ 检查 **Settings > Extensions > Plugins** 中是否出现 `prompt-expand`。
86
+
87
+ ## 使用
88
+
89
+ 1. 在 composer 写草稿,例如:`帮我做一个数据看板,包含筛选和导出`
90
+ 2. 点击 `⚡ Expand Prompt`,或在命令面板搜索 **Expand prompt**,或输入 `/expand <text>`
91
+ 3. 等待模型返回,结果会写回 composer
92
+ 4. 自己检查/修改,然后按 Enter 发送
93
+
94
+ 入口:
95
+
96
+ | 入口 | 方式 |
97
+ |---|---|
98
+ | session composer | 点击 `⚡ Expand Prompt` pill |
99
+ | Home / 新建会话草稿 | 点击底部 `⚡ Expand Prompt` 按钮 |
100
+ | 命令面板 | 搜索 `Expand prompt` |
101
+ | 斜杠 | `/expand <text>` |
102
+ | 重生成 / 撤销 | toast 按钮,或命令面板 |
103
+ | 版本切换 | 命令面板 Previous / Next expanded version |
104
+
105
+ 没有默认快捷键。可在 **Settings > Shortcuts** 绑定:
106
+
107
+ ```text
108
+ prompt-expand.expand
109
+ prompt-expand.regenerate
110
+ prompt-expand.restore
111
+ prompt-expand.previous
112
+ prompt-expand.next
113
+ prompt-expand.mode
114
+ prompt-expand.settings
115
+ ```
116
+
117
+ ## 设置
118
+
119
+ 打开 **Settings > Prompt Expand**,或运行 **Prompt Expand settings**。
120
+
121
+ | 设置 | 说明 |
122
+ |---|---|
123
+ | Mode | 简洁 / 充分展开 |
124
+ | Model | `auto`、`composer`、`provider/model` 或留空 |
125
+ | Project context | 是否读取项目信息 |
126
+
127
+ 设置通过 `Store.global` 保存。未设置或 Model 为 `auto` 时,回退到 `opencode.jsonc` 的 options;显式设置会覆盖。
128
+
129
+ ## 常见问题
130
+
131
+ **会发送消息吗?**
132
+ 不会。插件只读写 composer,发送由你按 Enter 完成。
133
+
134
+ **支持 TUI 吗?**
135
+ 不支持,只支持 OpenCode Desktop。
136
+
137
+ **为什么新建会话页没有 composer pill?**
138
+ Home / draft 没有官方 composer API。插件在底部提供 `⚡ Expand Prompt` 按钮,通过 DOM 适配器读写草稿,属于 best-effort。创建 session 后会使用正常 pill。
139
+
140
+ **支持 `@` 文件引用吗?**
141
+ 含 `@path` 的草稿会跳过,避免附件与文本不同步。普通邮箱地址不会被误判。
142
+
143
+ **失败会改输入框吗?**
144
+ 不会。失败时原文不变,toast 会尽量显示服务端 code/message。
145
+
146
+ **会保存我的提示词吗?**
147
+ 不会。版本栈只在当前窗口内存中。
148
+
149
+ ## 隐私
150
+
151
+ - 草稿只发送给你在 OpenCode 中连接的 provider
152
+ - 不经过插件作者的代理
153
+ - 不读取 `.env`、`.pem`、`credentials*` 或源码文件
154
+ - 项目感知只读取白名单文件,并限制字符预算
155
+ - 无 telemetry
156
+
157
+ ## 限制
158
+
159
+ - GUI 插件 API 仍是 experimental
160
+ - Home / draft 的 DOM 回退不是官方 API
161
+ - `setText()` 不能重写 `@` mention 附件
162
+ - 没有 TUI 实现
163
+ - 慢模型可能超过 `timeoutMs`
164
+
165
+ ## 赞助
166
+
167
+ 如果这个插件帮你节省了时间,可以通过 Buy Me a Coffee 支持维护和测试:
168
+
169
+ [buymeacoffee.com/connory](https://buymeacoffee.com/connory)
170
+
171
+ [![Buy Me a Coffee QR code](../assets/bmc-qr.png)](https://buymeacoffee.com/connory)
172
+
173
+ 赞助是可选的,插件保持 MIT License。
174
+
175
+ ## License
176
+
177
+ MIT
package/package.json CHANGED
@@ -1,6 +1,66 @@
1
1
  {
2
2
  "name": "opencode-prompt-expand",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "0.1.1",
4
+ "description": "Expand rough prompts into structured prompts inside the OpenCode Desktop composer.",
5
+ "type": "module",
6
+ "license": "MIT",
7
+ "author": "opencode-prompt-expand contributors",
8
+ "keywords": [
9
+ "opencode",
10
+ "opencode-plugin",
11
+ "prompt",
12
+ "prompt-engineering",
13
+ "desktop"
14
+ ],
15
+ "repository": {
16
+ "type": "git",
17
+ "url": "https://github.com/ConnorYyy/opencode-prompt-expand.git"
18
+ },
19
+ "homepage": "https://github.com/ConnorYyy/opencode-prompt-expand#readme",
20
+ "bugs": {
21
+ "url": "https://github.com/ConnorYyy/opencode-prompt-expand/issues"
22
+ },
23
+ "main": "./dist/index.js",
24
+ "exports": {
25
+ ".": "./dist/index.js",
26
+ "./rpc": "./dist/rpc.js",
27
+ "./gui-experimental": "./dist/gui-experimental.cjs"
28
+ },
29
+ "files": [
30
+ "dist",
31
+ "assets",
32
+ "CHANGELOG.md",
33
+ "docs/README.zh-CN.md"
34
+ ],
35
+ "scripts": {
36
+ "build": "npm run build:server && npm run build:gui",
37
+ "build:server": "tsc -p tsconfig.server.json",
38
+ "build:gui": "vite build",
39
+ "prepare": "npm run build",
40
+ "dev": "vite build --watch",
41
+ "typecheck": "tsc --noEmit",
42
+ "test": "vitest run",
43
+ "test:watch": "vitest",
44
+ "smoke:gui": "node scripts/smoke-gui.cjs",
45
+ "verify": "npm run typecheck && npm test && npm run build && npm run smoke:gui",
46
+ "prepublishOnly": "npm run verify"
47
+ },
48
+ "dependencies": {
49
+ "@opencode/plugin": "2.2.5"
50
+ },
51
+ "devDependencies": {
52
+ "@types/node": "^24.10.0",
53
+ "effect": "4.0.6",
54
+ "solid-js": "1.9.17",
55
+ "typescript": "^5.9.3",
56
+ "vite": "7.3.7",
57
+ "vite-plugin-solid": "2.11.10",
58
+ "vitest": "^3.2.4"
59
+ },
60
+ "publishConfig": {
61
+ "access": "public"
62
+ },
63
+ "engines": {
64
+ "node": "^20.19.0 || >=22.12.0"
65
+ }
66
+ }