@bluelovers/opencode-arise 0.1.6
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.
- package/LICENSE +21 -0
- package/README.md +286 -0
- package/assets/arise-banner.txt +13 -0
- package/dist/agents/index.d.ts +1 -0
- package/dist/agents/index.js +2 -0
- package/dist/agents/index.js.map +1 -0
- package/dist/agents/shadows.d.ts +28 -0
- package/dist/agents/shadows.js +182 -0
- package/dist/agents/shadows.js.map +1 -0
- package/dist/cli/index.d.ts +2 -0
- package/dist/cli/index.js +221 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/config/paths.d.ts +91 -0
- package/dist/config/paths.js +166 -0
- package/dist/config/paths.js.map +1 -0
- package/dist/config/schema.d.ts +64 -0
- package/dist/config/schema.js +55 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/hooks/arise-banner.d.ts +6 -0
- package/dist/hooks/arise-banner.js +50 -0
- package/dist/hooks/arise-banner.js.map +1 -0
- package/dist/hooks/compaction-preserver.d.ts +3 -0
- package/dist/hooks/compaction-preserver.js +17 -0
- package/dist/hooks/compaction-preserver.js.map +1 -0
- package/dist/hooks/index.d.ts +4 -0
- package/dist/hooks/index.js +5 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/hooks/output-shaper.d.ts +4 -0
- package/dist/hooks/output-shaper.js +52 -0
- package/dist/hooks/output-shaper.js.map +1 -0
- package/dist/hooks/todo-enforcer.d.ts +9 -0
- package/dist/hooks/todo-enforcer.js +43 -0
- package/dist/hooks/todo-enforcer.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.js +166 -0
- package/dist/index.js.map +1 -0
- package/dist/tools/background-manager.d.ts +35 -0
- package/dist/tools/background-manager.js +163 -0
- package/dist/tools/background-manager.js.map +1 -0
- package/dist/tools/background-tools.d.ts +6 -0
- package/dist/tools/background-tools.js +121 -0
- package/dist/tools/background-tools.js.map +1 -0
- package/dist/tools/call-arise-agent.d.ts +3 -0
- package/dist/tools/call-arise-agent.js +95 -0
- package/dist/tools/call-arise-agent.js.map +1 -0
- package/dist/tools/index.d.ts +3 -0
- package/dist/tools/index.js +4 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/utils/bun-shim.d.ts +88 -0
- package/dist/utils/bun-shim.js +147 -0
- package/dist/utils/bun-shim.js.map +1 -0
- package/package.json +64 -0
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
#!/usr/bin/env bun
|
|
2
|
+
import { existsSync, readFileSync, writeFileSync } from "fs";
|
|
3
|
+
import { getBanner } from "../hooks";
|
|
4
|
+
import { PLUGIN_NAME, findOpencodeConfig, getAriseConfigPath, createDefaultAriseConfig, } from "../config/paths";
|
|
5
|
+
function parseJsonc(content) {
|
|
6
|
+
// More robust JSONC parsing:
|
|
7
|
+
// 1. Remove single-line comments (but not inside strings)
|
|
8
|
+
// 2. Remove multi-line comments
|
|
9
|
+
// 3. Remove trailing commas
|
|
10
|
+
let result = "";
|
|
11
|
+
let inString = false;
|
|
12
|
+
let inSingleLineComment = false;
|
|
13
|
+
let inMultiLineComment = false;
|
|
14
|
+
let i = 0;
|
|
15
|
+
while (i < content.length) {
|
|
16
|
+
const char = content[i];
|
|
17
|
+
const nextChar = content[i + 1];
|
|
18
|
+
if (inSingleLineComment) {
|
|
19
|
+
if (char === "\n") {
|
|
20
|
+
inSingleLineComment = false;
|
|
21
|
+
result += char;
|
|
22
|
+
}
|
|
23
|
+
i++;
|
|
24
|
+
continue;
|
|
25
|
+
}
|
|
26
|
+
if (inMultiLineComment) {
|
|
27
|
+
if (char === "*" && nextChar === "/") {
|
|
28
|
+
inMultiLineComment = false;
|
|
29
|
+
i += 2;
|
|
30
|
+
continue;
|
|
31
|
+
}
|
|
32
|
+
i++;
|
|
33
|
+
continue;
|
|
34
|
+
}
|
|
35
|
+
if (inString) {
|
|
36
|
+
result += char;
|
|
37
|
+
if (char === "\\") {
|
|
38
|
+
// Skip escaped character
|
|
39
|
+
result += nextChar ?? "";
|
|
40
|
+
i += 2;
|
|
41
|
+
continue;
|
|
42
|
+
}
|
|
43
|
+
if (char === '"') {
|
|
44
|
+
inString = false;
|
|
45
|
+
}
|
|
46
|
+
i++;
|
|
47
|
+
continue;
|
|
48
|
+
}
|
|
49
|
+
// Not in string or comment
|
|
50
|
+
if (char === '"') {
|
|
51
|
+
inString = true;
|
|
52
|
+
result += char;
|
|
53
|
+
i++;
|
|
54
|
+
continue;
|
|
55
|
+
}
|
|
56
|
+
if (char === "/" && nextChar === "/") {
|
|
57
|
+
inSingleLineComment = true;
|
|
58
|
+
i += 2;
|
|
59
|
+
continue;
|
|
60
|
+
}
|
|
61
|
+
if (char === "/" && nextChar === "*") {
|
|
62
|
+
inMultiLineComment = true;
|
|
63
|
+
i += 2;
|
|
64
|
+
continue;
|
|
65
|
+
}
|
|
66
|
+
result += char;
|
|
67
|
+
i++;
|
|
68
|
+
}
|
|
69
|
+
// Remove trailing commas
|
|
70
|
+
result = result.replace(/,(\s*[}\]])/g, "$1");
|
|
71
|
+
return JSON.parse(result);
|
|
72
|
+
}
|
|
73
|
+
function addPluginToConfig(configPath) {
|
|
74
|
+
let content;
|
|
75
|
+
try {
|
|
76
|
+
content = readFileSync(configPath, "utf-8");
|
|
77
|
+
}
|
|
78
|
+
catch (err) {
|
|
79
|
+
console.error(`✗ Failed to read config file: ${configPath}`);
|
|
80
|
+
console.error(` Error: ${err instanceof Error ? err.message : err}`);
|
|
81
|
+
return false;
|
|
82
|
+
}
|
|
83
|
+
let config;
|
|
84
|
+
try {
|
|
85
|
+
config = parseJsonc(content);
|
|
86
|
+
}
|
|
87
|
+
catch (err) {
|
|
88
|
+
console.error(`✗ Failed to parse config file: ${configPath}`);
|
|
89
|
+
console.error(` Error: ${err instanceof Error ? err.message : err}`);
|
|
90
|
+
console.error(`\n Your config file may have invalid JSON syntax.`);
|
|
91
|
+
console.error(` You can manually add "${PLUGIN_NAME}" to the "plugin" array.`);
|
|
92
|
+
return false;
|
|
93
|
+
}
|
|
94
|
+
try {
|
|
95
|
+
if (!config.plugin) {
|
|
96
|
+
config.plugin = [];
|
|
97
|
+
}
|
|
98
|
+
const plugins = config.plugin;
|
|
99
|
+
if (plugins.includes(PLUGIN_NAME)) {
|
|
100
|
+
console.log(`✓ ${PLUGIN_NAME} already registered in OpenCode config`);
|
|
101
|
+
return true;
|
|
102
|
+
}
|
|
103
|
+
plugins.push(PLUGIN_NAME);
|
|
104
|
+
const newContent = JSON.stringify(config, null, 2);
|
|
105
|
+
writeFileSync(configPath, newContent, "utf-8");
|
|
106
|
+
console.log(`✓ Added ${PLUGIN_NAME} to ${configPath}`);
|
|
107
|
+
return true;
|
|
108
|
+
}
|
|
109
|
+
catch (err) {
|
|
110
|
+
console.error(`✗ Failed to update config:`, err);
|
|
111
|
+
return false;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
function createDefaultAriseConfigHandler() {
|
|
115
|
+
const configPath = getAriseConfigPath();
|
|
116
|
+
const success = createDefaultAriseConfig(configPath);
|
|
117
|
+
if (success) {
|
|
118
|
+
console.log(`✓ Created default config at ${configPath}`);
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
console.log(`✓ opencode-arise.json already exists at ${configPath}`);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
function install() {
|
|
125
|
+
console.log(getBanner());
|
|
126
|
+
console.log("\n🌑 Installing opencode-arise...\n");
|
|
127
|
+
const configPath = findOpencodeConfig();
|
|
128
|
+
if (!configPath) {
|
|
129
|
+
console.error("✗ OpenCode config not found. Is OpenCode installed?");
|
|
130
|
+
console.error(" Expected: ~/.config/opencode/opencode.json");
|
|
131
|
+
process.exit(1);
|
|
132
|
+
}
|
|
133
|
+
// TypeScript narrowing: configPath is guaranteed to be string here after check
|
|
134
|
+
const success = addPluginToConfig(configPath);
|
|
135
|
+
if (!success) {
|
|
136
|
+
process.exit(1);
|
|
137
|
+
}
|
|
138
|
+
createDefaultAriseConfigHandler();
|
|
139
|
+
console.log("\n⚔️ Installation complete!");
|
|
140
|
+
console.log("\n The Shadow Army awaits. Run 'opencode' to begin.\n");
|
|
141
|
+
console.log(" Shadows available:");
|
|
142
|
+
console.log(" @beru - Fast codebase scout (Ant King)");
|
|
143
|
+
console.log(" @igris - Precise implementation (Loyal Knight)");
|
|
144
|
+
console.log(" @bellion - Strategic planning (Grand Marshal)");
|
|
145
|
+
console.log(" @tusk - UI/UX specialist");
|
|
146
|
+
console.log(" @tank - External research");
|
|
147
|
+
console.log(" @shadow-sovereign - Deep reasoning (Full Power)");
|
|
148
|
+
console.log("");
|
|
149
|
+
}
|
|
150
|
+
function doctor() {
|
|
151
|
+
console.log("🔍 Checking opencode-arise installation...\n");
|
|
152
|
+
const configPath = findOpencodeConfig();
|
|
153
|
+
if (!configPath) {
|
|
154
|
+
console.log(`✗ OpenCode config not found: ${configPath}`);
|
|
155
|
+
// process.exit(1);
|
|
156
|
+
}
|
|
157
|
+
else {
|
|
158
|
+
console.log(`✓ OpenCode config: ${configPath}`);
|
|
159
|
+
try {
|
|
160
|
+
const content = readFileSync(configPath, "utf-8");
|
|
161
|
+
const config = parseJsonc(content);
|
|
162
|
+
const plugins = config.plugin ?? [];
|
|
163
|
+
if (plugins.includes(PLUGIN_NAME)) {
|
|
164
|
+
console.log(`✓ ${PLUGIN_NAME} is registered`);
|
|
165
|
+
}
|
|
166
|
+
else {
|
|
167
|
+
console.log(`✗ ${PLUGIN_NAME} is NOT registered`);
|
|
168
|
+
console.log(` Run: bunx ${PLUGIN_NAME} install`);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
catch (err) {
|
|
172
|
+
console.log(`✗ Failed to read config:`, err instanceof Error ? err.message : err);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
const ariseConfigPath = getAriseConfigPath();
|
|
176
|
+
if (existsSync(ariseConfigPath)) {
|
|
177
|
+
console.log(`✓ opencode-arise.json exists: ${ariseConfigPath}`);
|
|
178
|
+
}
|
|
179
|
+
else {
|
|
180
|
+
console.log(`○ opencode-arise.json not found (optional): ${ariseConfigPath}`);
|
|
181
|
+
}
|
|
182
|
+
console.log("\n✅ Doctor check complete");
|
|
183
|
+
}
|
|
184
|
+
function showHelp() {
|
|
185
|
+
console.log(`
|
|
186
|
+
${getBanner()}
|
|
187
|
+
Usage: opencode-arise <command>
|
|
188
|
+
|
|
189
|
+
Commands:
|
|
190
|
+
install Register plugin with OpenCode and create default config
|
|
191
|
+
doctor Check installation status
|
|
192
|
+
help Show this help message
|
|
193
|
+
|
|
194
|
+
Examples:
|
|
195
|
+
bunx opencode-arise install
|
|
196
|
+
npx opencode-arise install
|
|
197
|
+
`);
|
|
198
|
+
}
|
|
199
|
+
// Main
|
|
200
|
+
const args = process.argv.slice(2);
|
|
201
|
+
const command = args[0];
|
|
202
|
+
switch (command) {
|
|
203
|
+
case "install":
|
|
204
|
+
install();
|
|
205
|
+
break;
|
|
206
|
+
case "doctor":
|
|
207
|
+
doctor();
|
|
208
|
+
break;
|
|
209
|
+
case "help":
|
|
210
|
+
case "--help":
|
|
211
|
+
case "-h":
|
|
212
|
+
showHelp();
|
|
213
|
+
break;
|
|
214
|
+
default:
|
|
215
|
+
if (command) {
|
|
216
|
+
console.error(`Unknown command: ${command}`);
|
|
217
|
+
}
|
|
218
|
+
showHelp();
|
|
219
|
+
process.exit(command ? 1 : 0);
|
|
220
|
+
}
|
|
221
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 配置路徑工具函數
|
|
3
|
+
* Configuration path utility functions
|
|
4
|
+
*
|
|
5
|
+
* 集中管理所有與配置文件路徑相關的邏輯
|
|
6
|
+
* Centralized management of all config file path related logic
|
|
7
|
+
*/
|
|
8
|
+
import { type AriseConfig } from "./schema";
|
|
9
|
+
/**
|
|
10
|
+
* OpenCode 插件名稱
|
|
11
|
+
* OpenCode plugin name
|
|
12
|
+
*/
|
|
13
|
+
export declare const PLUGIN_NAME = "opencode-arise";
|
|
14
|
+
/**
|
|
15
|
+
* Arise 配置檔案名稱
|
|
16
|
+
* Arise config file name
|
|
17
|
+
*/
|
|
18
|
+
export declare const CONFIG_FILENAME = "opencode-arise.json";
|
|
19
|
+
/**
|
|
20
|
+
* OpenCode 配置檔案路徑列表
|
|
21
|
+
* OpenCode config file path list
|
|
22
|
+
*
|
|
23
|
+
* @type {string[]}
|
|
24
|
+
*/
|
|
25
|
+
export declare const OPENCODE_CONFIG_PATHS: string[];
|
|
26
|
+
/**
|
|
27
|
+
* 取得 OpenCode 配置目錄路徑
|
|
28
|
+
* Get OpenCode config directory path
|
|
29
|
+
*
|
|
30
|
+
* @returns {string} OpenCode 配置目錄路徑
|
|
31
|
+
*/
|
|
32
|
+
export declare function getOpencodeConfigDir(): string;
|
|
33
|
+
/**
|
|
34
|
+
* 取得 Arise 配置檔案路徑
|
|
35
|
+
* Get Arise config file path
|
|
36
|
+
*
|
|
37
|
+
* @returns {string} Arise 配置檔案完整路徑
|
|
38
|
+
*/
|
|
39
|
+
export declare function getAriseConfigPath(): string;
|
|
40
|
+
/**
|
|
41
|
+
* 取得 Arise 配置檔案搜尋路徑列表
|
|
42
|
+
* Get Arise config file search path list
|
|
43
|
+
*
|
|
44
|
+
* 依序為:
|
|
45
|
+
* 1. 工作目錄下的 .opencode/ 目錄
|
|
46
|
+
* 2. 使用者配置目錄 (~/.config/opencode/)
|
|
47
|
+
*
|
|
48
|
+
* @param worktree - 工作目錄路徑,若為空則只返回全局配置路徑
|
|
49
|
+
* @returns {string[]} 配置檔案搜尋路徑列表(順序:由局部到全局)
|
|
50
|
+
*/
|
|
51
|
+
export declare function getAriseConfigPaths(worktree?: string): string[];
|
|
52
|
+
/**
|
|
53
|
+
* 查詢 OpenCode 配置檔案路徑
|
|
54
|
+
* Find OpenCode config file path
|
|
55
|
+
*
|
|
56
|
+
* @returns {string | null} 配置檔案路徑,若不存在則返回 null
|
|
57
|
+
*/
|
|
58
|
+
export declare function findOpencodeConfig(): string | null;
|
|
59
|
+
/**
|
|
60
|
+
* 檢查 OpenCode 配置檔案是否存在
|
|
61
|
+
* Check if OpenCode config file exists
|
|
62
|
+
*
|
|
63
|
+
* @returns {boolean} 配置檔案是否存在
|
|
64
|
+
*/
|
|
65
|
+
export declare function hasOpencodeConfig(): boolean;
|
|
66
|
+
/**
|
|
67
|
+
* 檢查 Arise 配置檔案是否存在
|
|
68
|
+
* Check if Arise config file exists
|
|
69
|
+
*
|
|
70
|
+
* @param worktree - 可選的工作目錄路徑
|
|
71
|
+
* @returns {boolean} 配置檔案是否存在
|
|
72
|
+
*/
|
|
73
|
+
export declare function hasAriseConfig(worktree?: string): boolean;
|
|
74
|
+
/**
|
|
75
|
+
* 取得預設 Arise 配置物件
|
|
76
|
+
* Get default Arise config object
|
|
77
|
+
*
|
|
78
|
+
* @returns {AriseConfig} 預設配置物件
|
|
79
|
+
*/
|
|
80
|
+
export declare function getDefaultAriseConfig(): AriseConfig;
|
|
81
|
+
/**
|
|
82
|
+
* 建立預設 Arise 配置檔案
|
|
83
|
+
* Create default Arise config file
|
|
84
|
+
*
|
|
85
|
+
* 當配置檔案不存在時,会建立預設配置
|
|
86
|
+
* Creates default config when config file does not exist
|
|
87
|
+
*
|
|
88
|
+
* @param configPath - 自定義配置檔案路徑(可選,預設為全局配置路徑)
|
|
89
|
+
* @returns {boolean} 是否成功建立配置檔案
|
|
90
|
+
*/
|
|
91
|
+
export declare function createDefaultAriseConfig(configPath?: string): boolean;
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 配置路徑工具函數
|
|
3
|
+
* Configuration path utility functions
|
|
4
|
+
*
|
|
5
|
+
* 集中管理所有與配置文件路徑相關的邏輯
|
|
6
|
+
* Centralized management of all config file path related logic
|
|
7
|
+
*/
|
|
8
|
+
import { existsSync, mkdirSync, writeFileSync } from "fs";
|
|
9
|
+
import { homedir } from "os";
|
|
10
|
+
import { resolve } from "path";
|
|
11
|
+
import { SHADOW_AGENTS } from "../agents/shadows";
|
|
12
|
+
/**
|
|
13
|
+
* 取得使用者主目錄
|
|
14
|
+
* Get user home directory
|
|
15
|
+
*
|
|
16
|
+
* 使用 os.homedir() 確保跨平台相容性
|
|
17
|
+
* Use os.homedir() for cross-platform compatibility
|
|
18
|
+
*
|
|
19
|
+
* @returns {string} 使用者主目錄路徑
|
|
20
|
+
*/
|
|
21
|
+
function getHomeDir() {
|
|
22
|
+
return homedir();
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* OpenCode 插件名稱
|
|
26
|
+
* OpenCode plugin name
|
|
27
|
+
*/
|
|
28
|
+
export const PLUGIN_NAME = "opencode-arise";
|
|
29
|
+
/**
|
|
30
|
+
* Arise 配置檔案名稱
|
|
31
|
+
* Arise config file name
|
|
32
|
+
*/
|
|
33
|
+
export const CONFIG_FILENAME = "opencode-arise.json";
|
|
34
|
+
/**
|
|
35
|
+
* OpenCode 配置檔案路徑列表
|
|
36
|
+
* OpenCode config file path list
|
|
37
|
+
*
|
|
38
|
+
* @type {string[]}
|
|
39
|
+
*/
|
|
40
|
+
export const OPENCODE_CONFIG_PATHS = [
|
|
41
|
+
resolve(getHomeDir(), ".config/opencode/opencode.json"),
|
|
42
|
+
resolve(getHomeDir(), ".config/opencode/opencode.jsonc"),
|
|
43
|
+
];
|
|
44
|
+
/**
|
|
45
|
+
* 取得 OpenCode 配置目錄路徑
|
|
46
|
+
* Get OpenCode config directory path
|
|
47
|
+
*
|
|
48
|
+
* @returns {string} OpenCode 配置目錄路徑
|
|
49
|
+
*/
|
|
50
|
+
export function getOpencodeConfigDir() {
|
|
51
|
+
return resolve(getHomeDir(), ".config/opencode");
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* 取得 Arise 配置檔案路徑
|
|
55
|
+
* Get Arise config file path
|
|
56
|
+
*
|
|
57
|
+
* @returns {string} Arise 配置檔案完整路徑
|
|
58
|
+
*/
|
|
59
|
+
export function getAriseConfigPath() {
|
|
60
|
+
return resolve(getOpencodeConfigDir(), CONFIG_FILENAME);
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* 取得 Arise 配置檔案搜尋路徑列表
|
|
64
|
+
* Get Arise config file search path list
|
|
65
|
+
*
|
|
66
|
+
* 依序為:
|
|
67
|
+
* 1. 工作目錄下的 .opencode/ 目錄
|
|
68
|
+
* 2. 使用者配置目錄 (~/.config/opencode/)
|
|
69
|
+
*
|
|
70
|
+
* @param worktree - 工作目錄路徑,若為空則只返回全局配置路徑
|
|
71
|
+
* @returns {string[]} 配置檔案搜尋路徑列表(順序:由局部到全局)
|
|
72
|
+
*/
|
|
73
|
+
export function getAriseConfigPaths(worktree) {
|
|
74
|
+
const globalPath = resolve(getOpencodeConfigDir(), CONFIG_FILENAME);
|
|
75
|
+
if (!worktree) {
|
|
76
|
+
return [globalPath];
|
|
77
|
+
}
|
|
78
|
+
const localPath = resolve(worktree, ".opencode", CONFIG_FILENAME);
|
|
79
|
+
// 返回順序:先局部(local),後全局(global)
|
|
80
|
+
// 載入時需要反序(先全局,後局部)
|
|
81
|
+
return [localPath, globalPath];
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* 查詢 OpenCode 配置檔案路徑
|
|
85
|
+
* Find OpenCode config file path
|
|
86
|
+
*
|
|
87
|
+
* @returns {string | null} 配置檔案路徑,若不存在則返回 null
|
|
88
|
+
*/
|
|
89
|
+
export function findOpencodeConfig() {
|
|
90
|
+
for (const path of OPENCODE_CONFIG_PATHS) {
|
|
91
|
+
if (existsSync(path)) {
|
|
92
|
+
return path;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
return null;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* 檢查 OpenCode 配置檔案是否存在
|
|
99
|
+
* Check if OpenCode config file exists
|
|
100
|
+
*
|
|
101
|
+
* @returns {boolean} 配置檔案是否存在
|
|
102
|
+
*/
|
|
103
|
+
export function hasOpencodeConfig() {
|
|
104
|
+
return findOpencodeConfig() !== null;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* 檢查 Arise 配置檔案是否存在
|
|
108
|
+
* Check if Arise config file exists
|
|
109
|
+
*
|
|
110
|
+
* @param worktree - 可選的工作目錄路徑
|
|
111
|
+
* @returns {boolean} 配置檔案是否存在
|
|
112
|
+
*/
|
|
113
|
+
export function hasAriseConfig(worktree) {
|
|
114
|
+
const paths = getAriseConfigPaths(worktree);
|
|
115
|
+
return paths.some((path) => existsSync(path));
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* 取得預設 Arise 配置物件
|
|
119
|
+
* Get default Arise config object
|
|
120
|
+
*
|
|
121
|
+
* @returns {AriseConfig} 預設配置物件
|
|
122
|
+
*/
|
|
123
|
+
export function getDefaultAriseConfig() {
|
|
124
|
+
// 從 SHADOW_AGENTS 產生預設的 agents 設定
|
|
125
|
+
// Generate default agents config from SHADOW_AGENTS
|
|
126
|
+
const defaultAgents = Object.fromEntries(Object.entries(SHADOW_AGENTS).map(([name, agent]) => [
|
|
127
|
+
name,
|
|
128
|
+
{ model: agent.model },
|
|
129
|
+
]));
|
|
130
|
+
return {
|
|
131
|
+
show_banner: true,
|
|
132
|
+
disabled_shadows: [],
|
|
133
|
+
disabled_hooks: [],
|
|
134
|
+
agents: defaultAgents,
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* 建立預設 Arise 配置檔案
|
|
139
|
+
* Create default Arise config file
|
|
140
|
+
*
|
|
141
|
+
* 當配置檔案不存在時,会建立預設配置
|
|
142
|
+
* Creates default config when config file does not exist
|
|
143
|
+
*
|
|
144
|
+
* @param configPath - 自定義配置檔案路徑(可選,預設為全局配置路徑)
|
|
145
|
+
* @returns {boolean} 是否成功建立配置檔案
|
|
146
|
+
*/
|
|
147
|
+
export function createDefaultAriseConfig(configPath) {
|
|
148
|
+
const targetPath = configPath || getAriseConfigPath();
|
|
149
|
+
if (existsSync(targetPath)) {
|
|
150
|
+
return false;
|
|
151
|
+
}
|
|
152
|
+
const configDir = resolve(targetPath, "..");
|
|
153
|
+
const defaultConfig = getDefaultAriseConfig();
|
|
154
|
+
try {
|
|
155
|
+
if (!existsSync(configDir)) {
|
|
156
|
+
mkdirSync(configDir, { recursive: true });
|
|
157
|
+
}
|
|
158
|
+
writeFileSync(targetPath, JSON.stringify(defaultConfig, null, 2), "utf-8");
|
|
159
|
+
return true;
|
|
160
|
+
}
|
|
161
|
+
catch (err) {
|
|
162
|
+
console.error("✗ Failed to create config:", err);
|
|
163
|
+
return false;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
//# sourceMappingURL=paths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/config/paths.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export declare const ShadowName: z.ZodEnum<{
|
|
3
|
+
monarch: "monarch";
|
|
4
|
+
beru: "beru";
|
|
5
|
+
igris: "igris";
|
|
6
|
+
bellion: "bellion";
|
|
7
|
+
tusk: "tusk";
|
|
8
|
+
tank: "tank";
|
|
9
|
+
"shadow-sovereign": "shadow-sovereign";
|
|
10
|
+
}>;
|
|
11
|
+
export type ShadowName = z.infer<typeof ShadowName>;
|
|
12
|
+
export declare const HookName: z.ZodEnum<{
|
|
13
|
+
"arise-banner": "arise-banner";
|
|
14
|
+
"output-shaper": "output-shaper";
|
|
15
|
+
"compaction-preserver": "compaction-preserver";
|
|
16
|
+
"todo-enforcer": "todo-enforcer";
|
|
17
|
+
}>;
|
|
18
|
+
export type HookName = z.infer<typeof HookName>;
|
|
19
|
+
export declare const AgentOverride: z.ZodObject<{
|
|
20
|
+
model: z.ZodOptional<z.ZodString>;
|
|
21
|
+
disabled: z.ZodOptional<z.ZodBoolean>;
|
|
22
|
+
}, z.core.$strip>;
|
|
23
|
+
export declare const AriseConfigSchema: z.ZodObject<{
|
|
24
|
+
$schema: z.ZodOptional<z.ZodString>;
|
|
25
|
+
disabled_shadows: z.ZodOptional<z.ZodArray<z.ZodEnum<{
|
|
26
|
+
monarch: "monarch";
|
|
27
|
+
beru: "beru";
|
|
28
|
+
igris: "igris";
|
|
29
|
+
bellion: "bellion";
|
|
30
|
+
tusk: "tusk";
|
|
31
|
+
tank: "tank";
|
|
32
|
+
"shadow-sovereign": "shadow-sovereign";
|
|
33
|
+
}>>>;
|
|
34
|
+
disabled_hooks: z.ZodOptional<z.ZodArray<z.ZodEnum<{
|
|
35
|
+
"arise-banner": "arise-banner";
|
|
36
|
+
"output-shaper": "output-shaper";
|
|
37
|
+
"compaction-preserver": "compaction-preserver";
|
|
38
|
+
"todo-enforcer": "todo-enforcer";
|
|
39
|
+
}>>>;
|
|
40
|
+
show_banner: z.ZodOptional<z.ZodDefault<z.ZodBoolean>>;
|
|
41
|
+
banner_every_session: z.ZodOptional<z.ZodDefault<z.ZodBoolean>>;
|
|
42
|
+
agents: z.ZodOptional<z.ZodRecord<z.ZodEnum<{
|
|
43
|
+
monarch: "monarch";
|
|
44
|
+
beru: "beru";
|
|
45
|
+
igris: "igris";
|
|
46
|
+
bellion: "bellion";
|
|
47
|
+
tusk: "tusk";
|
|
48
|
+
tank: "tank";
|
|
49
|
+
"shadow-sovereign": "shadow-sovereign";
|
|
50
|
+
}>, z.ZodObject<{
|
|
51
|
+
model: z.ZodOptional<z.ZodString>;
|
|
52
|
+
disabled: z.ZodOptional<z.ZodBoolean>;
|
|
53
|
+
}, z.core.$strip>>>;
|
|
54
|
+
output_shaping: z.ZodOptional<z.ZodObject<{
|
|
55
|
+
max_chars: z.ZodDefault<z.ZodNumber>;
|
|
56
|
+
preserve_errors: z.ZodDefault<z.ZodBoolean>;
|
|
57
|
+
}, z.core.$strip>>;
|
|
58
|
+
compaction: z.ZodOptional<z.ZodObject<{
|
|
59
|
+
threshold_percent: z.ZodDefault<z.ZodNumber>;
|
|
60
|
+
preserve_todos: z.ZodDefault<z.ZodBoolean>;
|
|
61
|
+
}, z.core.$strip>>;
|
|
62
|
+
}, z.core.$strip>;
|
|
63
|
+
export type AriseConfig = z.infer<typeof AriseConfigSchema>;
|
|
64
|
+
export declare const DEFAULT_CONFIG: AriseConfig;
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export const ShadowName = z.enum([
|
|
3
|
+
"monarch",
|
|
4
|
+
"beru",
|
|
5
|
+
"igris",
|
|
6
|
+
"bellion",
|
|
7
|
+
"tusk",
|
|
8
|
+
"tank",
|
|
9
|
+
"shadow-sovereign",
|
|
10
|
+
]);
|
|
11
|
+
export const HookName = z.enum([
|
|
12
|
+
"arise-banner",
|
|
13
|
+
"output-shaper",
|
|
14
|
+
"compaction-preserver",
|
|
15
|
+
"todo-enforcer",
|
|
16
|
+
]);
|
|
17
|
+
export const AgentOverride = z.object({
|
|
18
|
+
model: z.string().optional(),
|
|
19
|
+
disabled: z.boolean().optional(),
|
|
20
|
+
});
|
|
21
|
+
export const AriseConfigSchema = z.object({
|
|
22
|
+
$schema: z.string().optional(),
|
|
23
|
+
disabled_shadows: z.array(ShadowName).optional(),
|
|
24
|
+
disabled_hooks: z.array(HookName).optional(),
|
|
25
|
+
show_banner: z.boolean().default(true).optional(),
|
|
26
|
+
banner_every_session: z.boolean().default(false).optional(),
|
|
27
|
+
agents: z.record(ShadowName, AgentOverride).optional(),
|
|
28
|
+
output_shaping: z
|
|
29
|
+
.object({
|
|
30
|
+
max_chars: z.number().default(12000),
|
|
31
|
+
preserve_errors: z.boolean().default(true),
|
|
32
|
+
})
|
|
33
|
+
.optional(),
|
|
34
|
+
compaction: z
|
|
35
|
+
.object({
|
|
36
|
+
threshold_percent: z.number().min(50).max(95).default(80),
|
|
37
|
+
preserve_todos: z.boolean().default(true),
|
|
38
|
+
})
|
|
39
|
+
.optional(),
|
|
40
|
+
});
|
|
41
|
+
export const DEFAULT_CONFIG = {
|
|
42
|
+
show_banner: true,
|
|
43
|
+
banner_every_session: false,
|
|
44
|
+
disabled_shadows: [],
|
|
45
|
+
disabled_hooks: [],
|
|
46
|
+
output_shaping: {
|
|
47
|
+
max_chars: 12000,
|
|
48
|
+
preserve_errors: true,
|
|
49
|
+
},
|
|
50
|
+
compaction: {
|
|
51
|
+
threshold_percent: 80,
|
|
52
|
+
preserve_todos: true,
|
|
53
|
+
},
|
|
54
|
+
};
|
|
55
|
+
//# sourceMappingURL=schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,CAAC,IAAI,CAAC;IAC/B,SAAS;IACT,MAAM;IACN,OAAO;IACP,SAAS;IACT,MAAM;IACN,MAAM;IACN,kBAAkB;CACnB,CAAC,CAAC;AAGH,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,CAAC,IAAI,CAAC;IAC7B,cAAc;IACd,eAAe;IACf,sBAAsB;IACtB,eAAe;CAChB,CAAC,CAAC;AAGH,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,CAAC,MAAM,CAAC;IACpC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC5B,QAAQ,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;CACjC,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC;IACxC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC9B,gBAAgB,EAAE,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,QAAQ,EAAE;IAChD,cAAc,EAAE,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,QAAQ,EAAE;IAC5C,WAAW,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE;IACjD,oBAAoB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE;IAC3D,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC,QAAQ,EAAE;IACtD,cAAc,EAAE,CAAC;SACd,MAAM,CAAC;QACN,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;QACpC,eAAe,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;KAC3C,CAAC;SACD,QAAQ,EAAE;IACb,UAAU,EAAE,CAAC;SACV,MAAM,CAAC;QACN,iBAAiB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;QACzD,cAAc,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;KAC1C,CAAC;SACD,QAAQ,EAAE;CACd,CAAC,CAAC;AAIH,MAAM,CAAC,MAAM,cAAc,GAAgB;IACzC,WAAW,EAAE,IAAI;IACjB,oBAAoB,EAAE,KAAK;IAC3B,gBAAgB,EAAE,EAAE;IACpB,cAAc,EAAE,EAAE;IAClB,cAAc,EAAE;QACd,SAAS,EAAE,KAAK;QAChB,eAAe,EAAE,IAAI;KACtB;IACD,UAAU,EAAE;QACV,iBAAiB,EAAE,EAAE;QACrB,cAAc,EAAE,IAAI;KACrB;CACF,CAAC"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
const BANNER_ASCII = `
|
|
2
|
+
╔═══════════════════════════════════════════════════════╗
|
|
3
|
+
║ ║
|
|
4
|
+
║ ⚔️ A R I S E ! ⚔️ ║
|
|
5
|
+
║ ║
|
|
6
|
+
║ ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ ║
|
|
7
|
+
║ ░░ Shadow Army Assembled ░░░ ║
|
|
8
|
+
║ ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ ║
|
|
9
|
+
║ ║
|
|
10
|
+
║ Monarch ready. Shadows await your command. ║
|
|
11
|
+
║ ║
|
|
12
|
+
╚═══════════════════════════════════════════════════════╝
|
|
13
|
+
`;
|
|
14
|
+
const TOAST_MESSAGE = "⚔️ ARISE! Shadow Army Assembled. Monarch ready.";
|
|
15
|
+
let bannerShownThisProcess = false;
|
|
16
|
+
export function createAriseBannerHook(ctx) {
|
|
17
|
+
const showToast = async () => {
|
|
18
|
+
try {
|
|
19
|
+
await ctx.client.tui.showToast({
|
|
20
|
+
body: {
|
|
21
|
+
title: "opencode-arise",
|
|
22
|
+
message: TOAST_MESSAGE,
|
|
23
|
+
variant: "info",
|
|
24
|
+
duration: 4000,
|
|
25
|
+
},
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
// TUI might not be available (non-interactive mode)
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
return {
|
|
33
|
+
async onSessionCreated() {
|
|
34
|
+
if (!bannerShownThisProcess) {
|
|
35
|
+
bannerShownThisProcess = true;
|
|
36
|
+
await showToast();
|
|
37
|
+
}
|
|
38
|
+
},
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
export function getBanner() {
|
|
42
|
+
return BANNER_ASCII;
|
|
43
|
+
}
|
|
44
|
+
export function printBannerToConsole() {
|
|
45
|
+
if (!bannerShownThisProcess) {
|
|
46
|
+
console.log(BANNER_ASCII);
|
|
47
|
+
bannerShownThisProcess = true;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=arise-banner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"arise-banner.js","sourceRoot":"","sources":["../../src/hooks/arise-banner.ts"],"names":[],"mappings":"AAEA,MAAM,YAAY,GAAG;;;;;;;;;;;;CAYpB,CAAC;AAEF,MAAM,aAAa,GAAG,iDAAiD,CAAC;AAExE,IAAI,sBAAsB,GAAG,KAAK,CAAC;AAEnC,MAAM,UAAU,qBAAqB,CAAC,GAAgB;IACpD,MAAM,SAAS,GAAG,KAAK,IAAI,EAAE;QAC3B,IAAI,CAAC;YACH,MAAM,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC;gBAC7B,IAAI,EAAE;oBACJ,KAAK,EAAE,gBAAgB;oBACvB,OAAO,EAAE,aAAa;oBACtB,OAAO,EAAE,MAAM;oBACf,QAAQ,EAAE,IAAI;iBACf;aACF,CAAC,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACP,oDAAoD;QACtD,CAAC;IACH,CAAC,CAAC;IAEF,OAAO;QACL,KAAK,CAAC,gBAAgB;YACpB,IAAI,CAAC,sBAAsB,EAAE,CAAC;gBAC5B,sBAAsB,GAAG,IAAI,CAAC;gBAC9B,MAAM,SAAS,EAAE,CAAC;YACpB,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,SAAS;IACvB,OAAO,YAAY,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,oBAAoB;IAClC,IAAI,CAAC,sBAAsB,EAAE,CAAC;QAC5B,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QAC1B,sBAAsB,GAAG,IAAI,CAAC;IAChC,CAAC;AACH,CAAC"}
|