@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.
Files changed (52) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +286 -0
  3. package/assets/arise-banner.txt +13 -0
  4. package/dist/agents/index.d.ts +1 -0
  5. package/dist/agents/index.js +2 -0
  6. package/dist/agents/index.js.map +1 -0
  7. package/dist/agents/shadows.d.ts +28 -0
  8. package/dist/agents/shadows.js +182 -0
  9. package/dist/agents/shadows.js.map +1 -0
  10. package/dist/cli/index.d.ts +2 -0
  11. package/dist/cli/index.js +221 -0
  12. package/dist/cli/index.js.map +1 -0
  13. package/dist/config/paths.d.ts +91 -0
  14. package/dist/config/paths.js +166 -0
  15. package/dist/config/paths.js.map +1 -0
  16. package/dist/config/schema.d.ts +64 -0
  17. package/dist/config/schema.js +55 -0
  18. package/dist/config/schema.js.map +1 -0
  19. package/dist/hooks/arise-banner.d.ts +6 -0
  20. package/dist/hooks/arise-banner.js +50 -0
  21. package/dist/hooks/arise-banner.js.map +1 -0
  22. package/dist/hooks/compaction-preserver.d.ts +3 -0
  23. package/dist/hooks/compaction-preserver.js +17 -0
  24. package/dist/hooks/compaction-preserver.js.map +1 -0
  25. package/dist/hooks/index.d.ts +4 -0
  26. package/dist/hooks/index.js +5 -0
  27. package/dist/hooks/index.js.map +1 -0
  28. package/dist/hooks/output-shaper.d.ts +4 -0
  29. package/dist/hooks/output-shaper.js +52 -0
  30. package/dist/hooks/output-shaper.js.map +1 -0
  31. package/dist/hooks/todo-enforcer.d.ts +9 -0
  32. package/dist/hooks/todo-enforcer.js +43 -0
  33. package/dist/hooks/todo-enforcer.js.map +1 -0
  34. package/dist/index.d.ts +5 -0
  35. package/dist/index.js +166 -0
  36. package/dist/index.js.map +1 -0
  37. package/dist/tools/background-manager.d.ts +35 -0
  38. package/dist/tools/background-manager.js +163 -0
  39. package/dist/tools/background-manager.js.map +1 -0
  40. package/dist/tools/background-tools.d.ts +6 -0
  41. package/dist/tools/background-tools.js +121 -0
  42. package/dist/tools/background-tools.js.map +1 -0
  43. package/dist/tools/call-arise-agent.d.ts +3 -0
  44. package/dist/tools/call-arise-agent.js +95 -0
  45. package/dist/tools/call-arise-agent.js.map +1 -0
  46. package/dist/tools/index.d.ts +3 -0
  47. package/dist/tools/index.js +4 -0
  48. package/dist/tools/index.js.map +1 -0
  49. package/dist/utils/bun-shim.d.ts +88 -0
  50. package/dist/utils/bun-shim.js +147 -0
  51. package/dist/utils/bun-shim.js.map +1 -0
  52. 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,6 @@
1
+ import type { PluginInput } from "@opencode-ai/plugin";
2
+ export declare function createAriseBannerHook(ctx: PluginInput): {
3
+ onSessionCreated(): Promise<void>;
4
+ };
5
+ export declare function getBanner(): string;
6
+ export declare function printBannerToConsole(): void;
@@ -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"}