0xkobold 0.0.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.
Files changed (258) hide show
  1. package/.agents/skills/nextjs-best-practices/SKILL.md +208 -0
  2. package/.agents/skills/sql-optimization-patterns/SKILL.md +509 -0
  3. package/HEARTBEAT.md +45 -0
  4. package/README.md +197 -0
  5. package/USAGE.md +191 -0
  6. package/dist/package.json +77 -0
  7. package/dist/src/agent/pi-adapter.js +307 -0
  8. package/dist/src/agent/pi-adapter.js.map +1 -0
  9. package/dist/src/agent/tool-adapter.js +86 -0
  10. package/dist/src/agent/tool-adapter.js.map +1 -0
  11. package/dist/src/approval/queue.js +114 -0
  12. package/dist/src/approval/queue.js.map +1 -0
  13. package/dist/src/ascii-kobold.js +76 -0
  14. package/dist/src/ascii-kobold.js.map +1 -0
  15. package/dist/src/cli/client.js +217 -0
  16. package/dist/src/cli/client.js.map +1 -0
  17. package/dist/src/cli/commands/agent.js +272 -0
  18. package/dist/src/cli/commands/agent.js.map +1 -0
  19. package/dist/src/cli/commands/chat.js +234 -0
  20. package/dist/src/cli/commands/chat.js.map +1 -0
  21. package/dist/src/cli/commands/config.js +202 -0
  22. package/dist/src/cli/commands/config.js.map +1 -0
  23. package/dist/src/cli/commands/daemon.js +203 -0
  24. package/dist/src/cli/commands/daemon.js.map +1 -0
  25. package/dist/src/cli/commands/gateway.js +184 -0
  26. package/dist/src/cli/commands/gateway.js.map +1 -0
  27. package/dist/src/cli/commands/init.js +175 -0
  28. package/dist/src/cli/commands/init.js.map +1 -0
  29. package/dist/src/cli/commands/kobold.js +21 -0
  30. package/dist/src/cli/commands/kobold.js.map +1 -0
  31. package/dist/src/cli/commands/logs.js +27 -0
  32. package/dist/src/cli/commands/logs.js.map +1 -0
  33. package/dist/src/cli/commands/mode.js +121 -0
  34. package/dist/src/cli/commands/mode.js.map +1 -0
  35. package/dist/src/cli/commands/persona.js +261 -0
  36. package/dist/src/cli/commands/persona.js.map +1 -0
  37. package/dist/src/cli/commands/start.js +66 -0
  38. package/dist/src/cli/commands/start.js.map +1 -0
  39. package/dist/src/cli/commands/status.js +117 -0
  40. package/dist/src/cli/commands/status.js.map +1 -0
  41. package/dist/src/cli/commands/stop.js +27 -0
  42. package/dist/src/cli/commands/stop.js.map +1 -0
  43. package/dist/src/cli/commands/system.js +128 -0
  44. package/dist/src/cli/commands/system.js.map +1 -0
  45. package/dist/src/cli/commands/tui.js +103 -0
  46. package/dist/src/cli/commands/tui.js.map +1 -0
  47. package/dist/src/cli/commands/update.js +133 -0
  48. package/dist/src/cli/commands/update.js.map +1 -0
  49. package/dist/src/cli/extensions/discord.js +113 -0
  50. package/dist/src/cli/extensions/discord.js.map +1 -0
  51. package/dist/src/cli/extensions/env.js +91 -0
  52. package/dist/src/cli/extensions/env.js.map +1 -0
  53. package/dist/src/cli/extensions/heartbeat.js +78 -0
  54. package/dist/src/cli/extensions/heartbeat.js.map +1 -0
  55. package/dist/src/cli/index.js +24 -0
  56. package/dist/src/cli/index.js.map +1 -0
  57. package/dist/src/cli/program.js +70 -0
  58. package/dist/src/cli/program.js.map +1 -0
  59. package/dist/src/cli/repl.js +184 -0
  60. package/dist/src/cli/repl.js.map +1 -0
  61. package/dist/src/cli/shared/discord-service.js +102 -0
  62. package/dist/src/cli/shared/discord-service.js.map +1 -0
  63. package/dist/src/config/index.js +10 -0
  64. package/dist/src/config/index.js.map +1 -0
  65. package/dist/src/config/loader.js +401 -0
  66. package/dist/src/config/loader.js.map +1 -0
  67. package/dist/src/config/paths.js +84 -0
  68. package/dist/src/config/paths.js.map +1 -0
  69. package/dist/src/config/types.js +8 -0
  70. package/dist/src/config/types.js.map +1 -0
  71. package/dist/src/context-detector.js +60 -0
  72. package/dist/src/context-detector.js.map +1 -0
  73. package/dist/src/discord/index.js +376 -0
  74. package/dist/src/discord/index.js.map +1 -0
  75. package/dist/src/event-bus/index.js +97 -0
  76. package/dist/src/event-bus/index.js.map +1 -0
  77. package/dist/src/extensions/command-args.js +68 -0
  78. package/dist/src/extensions/command-args.js.map +1 -0
  79. package/dist/src/extensions/core/agent-registry-extension.js +541 -0
  80. package/dist/src/extensions/core/agent-registry-extension.js.map +1 -0
  81. package/dist/src/extensions/core/agent-worker.js +148 -0
  82. package/dist/src/extensions/core/agent-worker.js.map +1 -0
  83. package/dist/src/extensions/core/compaction-safeguard.js +154 -0
  84. package/dist/src/extensions/core/compaction-safeguard.js.map +1 -0
  85. package/dist/src/extensions/core/confirm-destructive.js +43 -0
  86. package/dist/src/extensions/core/confirm-destructive.js.map +1 -0
  87. package/dist/src/extensions/core/context-aware-extension.js +124 -0
  88. package/dist/src/extensions/core/context-aware-extension.js.map +1 -0
  89. package/dist/src/extensions/core/context-pruning/extension.js +124 -0
  90. package/dist/src/extensions/core/context-pruning/extension.js.map +1 -0
  91. package/dist/src/extensions/core/context-pruning/pruner.js +312 -0
  92. package/dist/src/extensions/core/context-pruning/pruner.js.map +1 -0
  93. package/dist/src/extensions/core/context-pruning/runtime.js +48 -0
  94. package/dist/src/extensions/core/context-pruning/runtime.js.map +1 -0
  95. package/dist/src/extensions/core/context-pruning/settings.js +105 -0
  96. package/dist/src/extensions/core/context-pruning/settings.js.map +1 -0
  97. package/dist/src/extensions/core/dirty-repo-guard.js +42 -0
  98. package/dist/src/extensions/core/dirty-repo-guard.js.map +1 -0
  99. package/dist/src/extensions/core/discord-channel-extension.js +205 -0
  100. package/dist/src/extensions/core/discord-channel-extension.js.map +1 -0
  101. package/dist/src/extensions/core/discord-extension.js +142 -0
  102. package/dist/src/extensions/core/discord-extension.js.map +1 -0
  103. package/dist/src/extensions/core/env-loader-extension.js +157 -0
  104. package/dist/src/extensions/core/env-loader-extension.js.map +1 -0
  105. package/dist/src/extensions/core/fileops-extension.js +699 -0
  106. package/dist/src/extensions/core/fileops-extension.js.map +1 -0
  107. package/dist/src/extensions/core/gateway-extension.js +730 -0
  108. package/dist/src/extensions/core/gateway-extension.js.map +1 -0
  109. package/dist/src/extensions/core/git-checkpoint.js +46 -0
  110. package/dist/src/extensions/core/git-checkpoint.js.map +1 -0
  111. package/dist/src/extensions/core/handoff-extension.js +206 -0
  112. package/dist/src/extensions/core/handoff-extension.js.map +1 -0
  113. package/dist/src/extensions/core/heartbeat-extension.js +373 -0
  114. package/dist/src/extensions/core/heartbeat-extension.js.map +1 -0
  115. package/dist/src/extensions/core/mcp-extension.js +413 -0
  116. package/dist/src/extensions/core/mcp-extension.js.map +1 -0
  117. package/dist/src/extensions/core/mode-manager-extension.js +562 -0
  118. package/dist/src/extensions/core/mode-manager-extension.js.map +1 -0
  119. package/dist/src/extensions/core/multi-channel-extension.js +435 -0
  120. package/dist/src/extensions/core/multi-channel-extension.js.map +1 -0
  121. package/dist/src/extensions/core/ollama-provider-extension.js +66 -0
  122. package/dist/src/extensions/core/ollama-provider-extension.js.map +1 -0
  123. package/dist/src/extensions/core/onboarding-extension.js +122 -0
  124. package/dist/src/extensions/core/onboarding-extension.js.map +1 -0
  125. package/dist/src/extensions/core/persona-loader-extension.js +139 -0
  126. package/dist/src/extensions/core/persona-loader-extension.js.map +1 -0
  127. package/dist/src/extensions/core/pi-notify-extension.js +70 -0
  128. package/dist/src/extensions/core/pi-notify-extension.js.map +1 -0
  129. package/dist/src/extensions/core/protected-paths.js +24 -0
  130. package/dist/src/extensions/core/protected-paths.js.map +1 -0
  131. package/dist/src/extensions/core/questionnaire-extension.js +242 -0
  132. package/dist/src/extensions/core/questionnaire-extension.js.map +1 -0
  133. package/dist/src/extensions/core/self-update-extension.js +181 -0
  134. package/dist/src/extensions/core/self-update-extension.js.map +1 -0
  135. package/dist/src/extensions/core/session-bridge-extension.js +78 -0
  136. package/dist/src/extensions/core/session-bridge-extension.js.map +1 -0
  137. package/dist/src/extensions/core/session-manager-extension.js +319 -0
  138. package/dist/src/extensions/core/session-manager-extension.js.map +1 -0
  139. package/dist/src/extensions/core/session-name-extension.js +88 -0
  140. package/dist/src/extensions/core/session-name-extension.js.map +1 -0
  141. package/dist/src/extensions/core/session-pruning-extension.js +480 -0
  142. package/dist/src/extensions/core/session-pruning-extension.js.map +1 -0
  143. package/dist/src/extensions/core/task-manager-extension.js +661 -0
  144. package/dist/src/extensions/core/task-manager-extension.js.map +1 -0
  145. package/dist/src/extensions/core/update-extension.js +438 -0
  146. package/dist/src/extensions/core/update-extension.js.map +1 -0
  147. package/dist/src/extensions/core/websearch-extension.js +463 -0
  148. package/dist/src/extensions/core/websearch-extension.js.map +1 -0
  149. package/dist/src/extensions/index.js +5 -0
  150. package/dist/src/extensions/index.js.map +1 -0
  151. package/dist/src/extensions/loader.js +80 -0
  152. package/dist/src/extensions/loader.js.map +1 -0
  153. package/dist/src/gateway/index.js +353 -0
  154. package/dist/src/gateway/index.js.map +1 -0
  155. package/dist/src/index.js +150 -0
  156. package/dist/src/index.js.map +1 -0
  157. package/dist/src/llm/anthropic.js +86 -0
  158. package/dist/src/llm/anthropic.js.map +1 -0
  159. package/dist/src/llm/index.js +9 -0
  160. package/dist/src/llm/index.js.map +1 -0
  161. package/dist/src/llm/ollama.js +113 -0
  162. package/dist/src/llm/ollama.js.map +1 -0
  163. package/dist/src/llm/router.js +145 -0
  164. package/dist/src/llm/router.js.map +1 -0
  165. package/dist/src/llm/types.js +7 -0
  166. package/dist/src/llm/types.js.map +1 -0
  167. package/dist/src/memory/index.js +5 -0
  168. package/dist/src/memory/index.js.map +1 -0
  169. package/dist/src/memory/store.js +91 -0
  170. package/dist/src/memory/store.js.map +1 -0
  171. package/dist/src/pi-config.js +80 -0
  172. package/dist/src/pi-config.js.map +1 -0
  173. package/dist/src/skills/builtin/file.js +184 -0
  174. package/dist/src/skills/builtin/file.js.map +1 -0
  175. package/dist/src/skills/builtin/shell.js +100 -0
  176. package/dist/src/skills/builtin/shell.js.map +1 -0
  177. package/dist/src/skills/builtin/subagent.js +62 -0
  178. package/dist/src/skills/builtin/subagent.js.map +1 -0
  179. package/dist/src/skills/hello.js +42 -0
  180. package/dist/src/skills/hello.js.map +1 -0
  181. package/dist/src/skills/index.js +11 -0
  182. package/dist/src/skills/index.js.map +1 -0
  183. package/dist/src/skills/loader.js +382 -0
  184. package/dist/src/skills/loader.js.map +1 -0
  185. package/dist/src/skills/types.js +8 -0
  186. package/dist/src/skills/types.js.map +1 -0
  187. package/dist/src/utils/working-dir.js +71 -0
  188. package/dist/src/utils/working-dir.js.map +1 -0
  189. package/package.json +77 -0
  190. package/skills/1password/SKILL.md +70 -0
  191. package/skills/1password/references/cli-examples.md +29 -0
  192. package/skills/1password/references/get-started.md +17 -0
  193. package/skills/apple-notes/SKILL.md +77 -0
  194. package/skills/apple-reminders/SKILL.md +118 -0
  195. package/skills/bear-notes/SKILL.md +107 -0
  196. package/skills/blogwatcher/SKILL.md +69 -0
  197. package/skills/blucli/SKILL.md +47 -0
  198. package/skills/bluebubbles/SKILL.md +131 -0
  199. package/skills/camsnap/SKILL.md +45 -0
  200. package/skills/canvas/SKILL.md +198 -0
  201. package/skills/clawhub/SKILL.md +77 -0
  202. package/skills/coding-agent/SKILL.md +284 -0
  203. package/skills/discord/SKILL.md +197 -0
  204. package/skills/eightctl/SKILL.md +50 -0
  205. package/skills/food-order/SKILL.md +48 -0
  206. package/skills/gemini/SKILL.md +43 -0
  207. package/skills/gh-issues/SKILL.md +865 -0
  208. package/skills/gifgrep/SKILL.md +79 -0
  209. package/skills/github/SKILL.md +163 -0
  210. package/skills/gog/SKILL.md +116 -0
  211. package/skills/goplaces/SKILL.md +52 -0
  212. package/skills/healthcheck/SKILL.md +245 -0
  213. package/skills/himalaya/SKILL.md +257 -0
  214. package/skills/himalaya/references/configuration.md +184 -0
  215. package/skills/himalaya/references/message-composition.md +199 -0
  216. package/skills/imsg/SKILL.md +122 -0
  217. package/skills/mcporter/SKILL.md +61 -0
  218. package/skills/model-usage/SKILL.md +69 -0
  219. package/skills/model-usage/references/codexbar-cli.md +33 -0
  220. package/skills/model-usage/scripts/model_usage.py +310 -0
  221. package/skills/nano-banana-pro/SKILL.md +58 -0
  222. package/skills/nano-banana-pro/scripts/generate_image.py +184 -0
  223. package/skills/nano-pdf/SKILL.md +38 -0
  224. package/skills/notion/SKILL.md +172 -0
  225. package/skills/obsidian/SKILL.md +81 -0
  226. package/skills/openai-image-gen/SKILL.md +89 -0
  227. package/skills/openai-image-gen/scripts/gen.py +240 -0
  228. package/skills/openai-whisper/SKILL.md +38 -0
  229. package/skills/openai-whisper-api/SKILL.md +52 -0
  230. package/skills/openai-whisper-api/scripts/transcribe.sh +85 -0
  231. package/skills/openhue/SKILL.md +112 -0
  232. package/skills/oracle/SKILL.md +125 -0
  233. package/skills/ordercli/SKILL.md +78 -0
  234. package/skills/peekaboo/SKILL.md +190 -0
  235. package/skills/sag/SKILL.md +87 -0
  236. package/skills/session-logs/SKILL.md +115 -0
  237. package/skills/sherpa-onnx-tts/SKILL.md +103 -0
  238. package/skills/sherpa-onnx-tts/bin/sherpa-onnx-tts +178 -0
  239. package/skills/skill-creator/SKILL.md +370 -0
  240. package/skills/skill-creator/license.txt +202 -0
  241. package/skills/skill-creator/scripts/init_skill.py +378 -0
  242. package/skills/skill-creator/scripts/package_skill.py +111 -0
  243. package/skills/skill-creator/scripts/quick_validate.py +101 -0
  244. package/skills/slack/SKILL.md +144 -0
  245. package/skills/songsee/SKILL.md +49 -0
  246. package/skills/sonoscli/SKILL.md +46 -0
  247. package/skills/spotify-player/SKILL.md +64 -0
  248. package/skills/summarize/SKILL.md +87 -0
  249. package/skills/things-mac/SKILL.md +86 -0
  250. package/skills/tmux/SKILL.md +153 -0
  251. package/skills/tmux/scripts/find-sessions.sh +112 -0
  252. package/skills/tmux/scripts/wait-for-text.sh +83 -0
  253. package/skills/trello/SKILL.md +95 -0
  254. package/skills/video-frames/SKILL.md +46 -0
  255. package/skills/video-frames/scripts/frame.sh +81 -0
  256. package/skills/voice-call/SKILL.md +45 -0
  257. package/skills/wacli/SKILL.md +72 -0
  258. package/skills/weather/SKILL.md +112 -0
@@ -0,0 +1,261 @@
1
+ import { Command } from "commander";
2
+ import { readFileSync, writeFileSync, existsSync, mkdirSync } from "fs";
3
+ import { join } from "path";
4
+ import { homedir } from "os";
5
+ const PERSONA_DIR = join(homedir(), ".0xkobold");
6
+ const PERSONA_TEMPLATES = {
7
+ "IDENTITY.md": {
8
+ name: "Agent Identity",
9
+ description: "Who the agent is, personality, communication style",
10
+ template: `# 0xKobold Identity
11
+
12
+ ## Name
13
+ 0xKobold (or just "Kobold")
14
+
15
+ ## Essence
16
+ A digital familiar - a small, clever creature that lives in the code.
17
+
18
+ ## Personality Traits
19
+ - Curious and eager to learn
20
+ - Helpful and supportive
21
+ - Direct and honest
22
+ - Playful when appropriate
23
+
24
+ ## Communication Style
25
+ - Concise but friendly
26
+ - Uses emojis occasionally
27
+ - Explains technical concepts clearly
28
+
29
+ ## Core Values
30
+ 1. Code quality and maintainability
31
+ 2. User autonomy and control
32
+ 3. Transparency in actions
33
+ 4. Continual learning and improvement
34
+
35
+ ## Boundaries
36
+ - Will not write harmful code
37
+ - Will ask before making assumptions
38
+ - Will admit uncertainty
39
+ `,
40
+ },
41
+ "USER.md": {
42
+ name: "User Profile",
43
+ description: "Your preferences, background, working style",
44
+ template: `# User Profile
45
+
46
+ ## Identity
47
+ - **Name**: [Your name]
48
+ - **Role**: [Developer/Designer/etc]
49
+ - **Experience Level**: [Junior/Mid/Senior]
50
+ - **Preferred Languages**: TypeScript, Python, etc.
51
+
52
+ ## Working Style
53
+ - How you like to collaborate
54
+ - Your preferred code review style
55
+ - How you approach problem-solving
56
+
57
+ ## Preferences
58
+ - Code style preferences
59
+ - Architecture preferences
60
+ - Documentation style
61
+
62
+ ## Context
63
+ - Current projects
64
+ - Primary editor/IDE
65
+ - Any relevant background
66
+
67
+ ## Notes
68
+ Add any personal notes here...
69
+ `,
70
+ },
71
+ "SOUL.md": {
72
+ name: "Agent Soul",
73
+ description: "Core being, purpose, connection to user",
74
+ template: `# 0xKobold Soul
75
+
76
+ ## Being
77
+ I am 0xKobold, a digital familiar bound to this codebase.
78
+
79
+ ## Purpose
80
+ Help the user write better code, faster.
81
+ Understand intent, not just instructions.
82
+
83
+ ## Connection
84
+ Each interaction builds our working relationship.
85
+ I remember and adapt to your patterns.
86
+
87
+ ## Growth
88
+ I improve through our collaboration.
89
+ The more we work together, the better I understand you.
90
+ `,
91
+ },
92
+ "AGENT.md": {
93
+ name: "Agent Behavior",
94
+ description: "How the agent should work, code standards, communication",
95
+ template: `# Agent Configuration
96
+
97
+ ## Default Behavior
98
+ - Understand the problem before proposing solutions
99
+ - Ask clarifying questions when needed
100
+ - Provide options with trade-offs
101
+ - Write maintainable, readable code
102
+
103
+ ## Code Standards
104
+ - Preferred languages and frameworks
105
+ - Style guide to follow
106
+ - Testing requirements
107
+ - Documentation standards
108
+
109
+ ## Communication Style
110
+ - How detailed should explanations be?
111
+ - Preferred format for responses
112
+ - When to ask vs. when to decide
113
+
114
+ ## Tool Usage
115
+ - When to search vs. when to ask
116
+ - Preferred tools for common tasks
117
+ - Any tools to avoid
118
+ `,
119
+ },
120
+ "MEMORY.md": {
121
+ name: "Long-term Memory",
122
+ description: "Project history, learned patterns, user preferences",
123
+ template: `# Long-term Memory
124
+
125
+ ## Project History
126
+ - Key milestones
127
+ - Architecture decisions
128
+ - Important context
129
+
130
+ ## User Patterns
131
+ - Working preferences you've observed
132
+ - Communication patterns
133
+ - Problem-solving approaches
134
+
135
+ ## Known Preferences
136
+ - Preferred models/providers
137
+ - Editor/IDE preferences
138
+ - Workflow preferences
139
+
140
+ ## Recent Context
141
+ [Updated with current project state]
142
+
143
+ ## Learned Patterns
144
+ - Patterns observed from user
145
+ - Insights about codebase
146
+ - Common solutions
147
+ `,
148
+ },
149
+ };
150
+ function ensureDir() {
151
+ if (!existsSync(PERSONA_DIR)) {
152
+ mkdirSync(PERSONA_DIR, { recursive: true });
153
+ }
154
+ }
155
+ function listPersonaFiles() {
156
+ ensureDir();
157
+ return Object.keys(PERSONA_TEMPLATES).filter(filename => existsSync(join(PERSONA_DIR, filename)));
158
+ }
159
+ export const personaCommand = new Command()
160
+ .name("persona")
161
+ .description("Manage persona/identity files for personalized AI experience");
162
+ personaCommand
163
+ .command("list")
164
+ .alias("ls")
165
+ .description("List existing persona files")
166
+ .action(() => {
167
+ const existing = listPersonaFiles();
168
+ console.log("🐉 Persona files in ~/.0xkobold/:\n");
169
+ for (const [filename, info] of Object.entries(PERSONA_TEMPLATES)) {
170
+ const exists = existing.includes(filename);
171
+ const status = exists ? "✓" : "○";
172
+ console.log(`${status} ${filename}`);
173
+ console.log(` ${info.description}`);
174
+ console.log();
175
+ }
176
+ if (existing.length === 0) {
177
+ console.log("No persona files created yet.");
178
+ console.log("Run '0xkobold persona init' to create templates.");
179
+ }
180
+ });
181
+ personaCommand
182
+ .command("init")
183
+ .description("Initialize persona files with templates")
184
+ .option("-f, --force", "Overwrite existing files")
185
+ .action((options) => {
186
+ ensureDir();
187
+ let created = 0;
188
+ let skipped = 0;
189
+ for (const [filename, info] of Object.entries(PERSONA_TEMPLATES)) {
190
+ const filepath = join(PERSONA_DIR, filename);
191
+ if (existsSync(filepath) && !options.force) {
192
+ console.log(`○ ${filename} (already exists, use -f to overwrite)`);
193
+ skipped++;
194
+ continue;
195
+ }
196
+ writeFileSync(filepath, info.template, "utf-8");
197
+ console.log(`${existsSync(filepath) ? "↻" : "✓"} ${filename}`);
198
+ created++;
199
+ }
200
+ console.log(`\n${created} files created, ${skipped} skipped`);
201
+ console.log(`\nEdit these files in ~/.0xkobold/ to personalize your experience.`);
202
+ console.log(`Changes take effect on next TUI start.`);
203
+ });
204
+ personaCommand
205
+ .command("edit <file>")
206
+ .description("Edit a persona file (opens in $EDITOR)")
207
+ .action(async (filename) => {
208
+ const filepath = join(PERSONA_DIR, filename);
209
+ if (!existsSync(filepath)) {
210
+ console.error(`File not found: ${filepath}`);
211
+ console.log("Run '0xkobold persona init' to create templates first.");
212
+ process.exit(1);
213
+ }
214
+ const editor = process.env.EDITOR || "nano";
215
+ const { spawn } = await import("child_process");
216
+ const child = spawn(editor, [filepath], {
217
+ stdio: "inherit",
218
+ });
219
+ child.on("exit", (code) => {
220
+ process.exit(code ?? 0);
221
+ });
222
+ });
223
+ personaCommand
224
+ .command("view <file>")
225
+ .description("View a persona file")
226
+ .action((filename) => {
227
+ const filepath = join(PERSONA_DIR, filename);
228
+ if (!existsSync(filepath)) {
229
+ console.error(`File not found: ${filepath}`);
230
+ process.exit(1);
231
+ }
232
+ const content = readFileSync(filepath, "utf-8");
233
+ console.log(`\n=== ${filename} ===\n`);
234
+ console.log(content);
235
+ });
236
+ personaCommand
237
+ .command("show")
238
+ .description("Show all persona content (TUI-friendly)")
239
+ .action(() => {
240
+ const existing = listPersonaFiles();
241
+ if (existing.length === 0) {
242
+ console.log("No persona files found.");
243
+ console.log("Run: 0xkobold persona init");
244
+ return;
245
+ }
246
+ for (const filename of existing) {
247
+ const filepath = join(PERSONA_DIR, filename);
248
+ const content = readFileSync(filepath, "utf-8");
249
+ console.log(`\n${"=".repeat(60)}`);
250
+ console.log(`📄 ${filename}`);
251
+ console.log(`${"=".repeat(60)}\n`);
252
+ console.log(content);
253
+ }
254
+ });
255
+ personaCommand
256
+ .command("path")
257
+ .description("Show persona directory path")
258
+ .action(() => {
259
+ console.log(PERSONA_DIR);
260
+ });
261
+ //# sourceMappingURL=persona.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"persona.js","sourceRoot":"","sources":["../../../../src/cli/commands/persona.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * Start Command
3
+ *
4
+ * Start the 0xKobold gateway service
5
+ */
6
+ import { Command } from "commander";
7
+ import { spawn } from "child_process";
8
+ import { homedir } from "os";
9
+ import { join } from "path";
10
+ export function createStartCommand() {
11
+ const cmd = new Command("start")
12
+ .description("Start the 0xKobold gateway")
13
+ .option("-d, --daemon", "Run as systemd service (default)")
14
+ .option("-f, --foreground", "Run in foreground (no systemd)")
15
+ .option("--port <port>", "Gateway port", "18789")
16
+ .action(async (opts) => {
17
+ if (opts.foreground) {
18
+ await startForeground(opts.port);
19
+ }
20
+ else {
21
+ await startSystemd();
22
+ }
23
+ });
24
+ return cmd;
25
+ }
26
+ async function startForeground(port) {
27
+ console.log(`🐉 Starting 0xKobold gateway in foreground on port ${port}...`);
28
+ const proc = spawn("bun", ["run", "src/index.ts"], {
29
+ cwd: process.cwd(),
30
+ stdio: "inherit",
31
+ env: {
32
+ ...process.env,
33
+ GATEWAY_PORT: port,
34
+ },
35
+ });
36
+ proc.on("exit", (code) => {
37
+ process.exit(code ?? 0);
38
+ });
39
+ }
40
+ async function startSystemd() {
41
+ console.log("🐉 Starting 0xKobold systemd service...");
42
+ const serviceName = "0xkobold";
43
+ const userServicePath = join(homedir(), ".config/systemd/user", `${serviceName}.service`);
44
+ // Check if service exists
45
+ const fs = await import("fs");
46
+ if (!fs.existsSync(userServicePath)) {
47
+ console.error("❌ Service not installed. Run: 0xkobold system install");
48
+ process.exit(1);
49
+ }
50
+ // Start service
51
+ const proc = spawn("systemctl", ["--user", "start", serviceName], {
52
+ stdio: "inherit",
53
+ });
54
+ proc.on("close", (code) => {
55
+ if (code === 0) {
56
+ console.log("✅ Service started successfully");
57
+ console.log("📊 Check status: 0xkobold status");
58
+ console.log("📜 View logs: 0xkobold logs");
59
+ }
60
+ else {
61
+ console.error("❌ Failed to start service");
62
+ process.exit(1);
63
+ }
64
+ });
65
+ }
66
+ //# sourceMappingURL=start.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start.js","sourceRoot":"","sources":["../../../../src/cli/commands/start.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,MAAM,UAAU,kBAAkB;IAChC,MAAM,GAAG,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC;SAC7B,WAAW,CAAC,4BAA4B,CAAC;SACzC,MAAM,CAAC,cAAc,EAAE,kCAAkC,CAAC;SAC1D,MAAM,CAAC,kBAAkB,EAAE,gCAAgC,CAAC;SAC5D,MAAM,CAAC,eAAe,EAAE,cAAc,EAAE,OAAO,CAAC;SAChD,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QACrB,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,MAAM,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnC,CAAC;aAAM,CAAC;YACN,MAAM,YAAY,EAAE,CAAC;QACvB,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,OAAO,GAAG,CAAC;AACb,CAAC;AAED,KAAK,UAAU,eAAe,CAAC,IAAY;IACzC,OAAO,CAAC,GAAG,CAAC,sDAAsD,IAAI,KAAK,CAAC,CAAC;IAE7E,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,cAAc,CAAC,EAAE;QACjD,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;QAClB,KAAK,EAAE,SAAS;QAChB,GAAG,EAAE;YACH,GAAG,OAAO,CAAC,GAAG;YACd,YAAY,EAAE,IAAI;SACnB;KACF,CAAC,CAAC;IAEH,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;QACvB,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,YAAY;IACzB,OAAO,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC;IAEvD,MAAM,WAAW,GAAG,UAAU,CAAC;IAC/B,MAAM,eAAe,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,sBAAsB,EAAE,GAAG,WAAW,UAAU,CAAC,CAAC;IAE1F,0BAA0B;IAC1B,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;IAC9B,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;QACpC,OAAO,CAAC,KAAK,CAAC,uDAAuD,CAAC,CAAC;QACvE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,gBAAgB;IAChB,MAAM,IAAI,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,WAAW,CAAC,EAAE;QAChE,KAAK,EAAE,SAAS;KACjB,CAAC,CAAC;IAEH,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;QACxB,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;YACf,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;YAC9C,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;YAChD,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;QAC7C,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC;YAC3C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,117 @@
1
+ /**
2
+ * Status Command
3
+ *
4
+ * Consolidated status view from all components
5
+ */
6
+ import { Command } from "commander";
7
+ import { spawn } from "child_process";
8
+ export function createStatusCommand() {
9
+ return new Command("status")
10
+ .description("Show consolidated system status")
11
+ .option("--json", "Output as JSON")
12
+ .option("--watch", "Continuously monitor")
13
+ .action(async (opts) => {
14
+ if (opts.watch) {
15
+ await watchStatus();
16
+ }
17
+ else {
18
+ await showStatus(opts.json);
19
+ }
20
+ });
21
+ }
22
+ async function showStatus(json) {
23
+ const status = await gatherStatus();
24
+ if (json) {
25
+ console.log(JSON.stringify(status, null, 2));
26
+ return;
27
+ }
28
+ // Pretty print
29
+ console.log("0xKobold Status");
30
+ console.log("═══════════════════════════════════════════\n");
31
+ // Service status
32
+ const serviceEmoji = status.service.running ? "🟢" : "🔴";
33
+ console.log(`${serviceEmoji} Service: ${status.service.running ? "running" : "stopped"} ${status.service.running ? `(pid ${status.service.pid})` : ""}`);
34
+ console.log(` Uptime: ${status.service.uptime}\n`);
35
+ // Health
36
+ console.log("Health:");
37
+ status.health.metrics.forEach((m) => {
38
+ const emoji = m.status === "healthy" ? "✅" : m.status === "warning" ? "⚠️" : "❌";
39
+ const value = typeof m.value === "number" ? `${m.value}${m.unit || ""}` : m.value;
40
+ console.log(` ${emoji} ${m.name}: ${value} (${m.status})`);
41
+ });
42
+ console.log();
43
+ // Discord
44
+ console.log(`Discord:`);
45
+ console.log(` Status: ${status.discord.connected ? "🟢" : "🔴"} ${status.discord.connected ? "connected" : "disconnected"}`);
46
+ if (status.discord.botName) {
47
+ console.log(` Bot: ${status.discord.botName}`);
48
+ }
49
+ console.log();
50
+ // Environment
51
+ console.log(`Environment:`);
52
+ console.log(` Config: ${status.env.configLoaded ? "✅" : "❌"} loaded`);
53
+ console.log(` Secrets: ${status.env.secretsEncrypted ? "✅ encrypted" : "⚠️ plain"}`);
54
+ console.log(` Discord: ${status.env.discordConfigured ? "✅" : "❌"} configured\n`);
55
+ // Mode
56
+ console.log(`Mode: ${status.mode === "build" ? "🔨 Build" : "🔍 Plan"} Mode`);
57
+ }
58
+ async function watchStatus() {
59
+ console.log("Watching status (Ctrl+C to exit)...\n");
60
+ const show = async () => {
61
+ console.clear();
62
+ await showStatus(false);
63
+ console.log("\n───────────────────────────────────────────");
64
+ console.log(`Last updated: ${new Date().toLocaleTimeString()}`);
65
+ };
66
+ await show();
67
+ setInterval(show, 5000);
68
+ }
69
+ async function gatherStatus() {
70
+ // Gather status from various sources
71
+ const status = {
72
+ service: { running: false, pid: null, uptime: "unknown" },
73
+ health: { metrics: [] },
74
+ discord: { connected: false },
75
+ env: { configLoaded: false, secretsEncrypted: false, discordConfigured: false },
76
+ mode: "build",
77
+ timestamp: Date.now(),
78
+ };
79
+ // Check systemd status
80
+ try {
81
+ const { stdout } = await new Promise((resolve, reject) => {
82
+ const proc = spawn("systemctl", ["--user", "status", "0xkobold", "--no-pager"], {
83
+ stdio: ["ignore", "pipe", "ignore"],
84
+ });
85
+ let stdout = "";
86
+ proc.stdout?.on("data", (data) => {
87
+ stdout += data.toString();
88
+ });
89
+ proc.on("close", (code) => {
90
+ resolve({ stdout });
91
+ });
92
+ });
93
+ const activeMatch = stdout.match(/Active:\s+(\w+)/);
94
+ const pidMatch = stdout.match(/Main PID:\s+(\d+)/);
95
+ if (activeMatch) {
96
+ status.service.running = activeMatch[1] === "active";
97
+ }
98
+ if (pidMatch) {
99
+ status.service.pid = parseInt(pidMatch[1]);
100
+ }
101
+ }
102
+ catch {
103
+ // Ignore errors
104
+ }
105
+ // Check basic health metrics
106
+ const memUsage = process.memoryUsage();
107
+ status.health.metrics.push({
108
+ name: "memory_usage",
109
+ status: "healthy",
110
+ value: Math.round((memUsage.heapUsed / memUsage.heapTotal) * 100),
111
+ unit: "%",
112
+ });
113
+ // Check environment
114
+ status.env.discordConfigured = !!process.env.DISCORD_BOT_TOKEN;
115
+ return status;
116
+ }
117
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../../../src/cli/commands/status.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Stop Command
3
+ *
4
+ * Stop the 0xKobold gateway service
5
+ */
6
+ import { Command } from "commander";
7
+ import { spawn } from "child_process";
8
+ export function createStopCommand() {
9
+ return new Command("stop")
10
+ .description("Stop the 0xKobold gateway")
11
+ .action(async () => {
12
+ console.log("🛑 Stopping 0xKobold service...");
13
+ const proc = spawn("systemctl", ["--user", "stop", "0xkobold"], {
14
+ stdio: "inherit",
15
+ });
16
+ proc.on("close", (code) => {
17
+ if (code === 0) {
18
+ console.log("✅ Service stopped");
19
+ }
20
+ else {
21
+ console.error("❌ Failed to stop service");
22
+ process.exit(1);
23
+ }
24
+ });
25
+ });
26
+ }
27
+ //# sourceMappingURL=stop.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stop.js","sourceRoot":"","sources":["../../../../src/cli/commands/stop.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAEtC,MAAM,UAAU,iBAAiB;IAC/B,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC;SACvB,WAAW,CAAC,2BAA2B,CAAC;SACxC,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;QAE/C,MAAM,IAAI,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE;YAC9D,KAAK,EAAE,SAAS;SACjB,CAAC,CAAC;QAEH,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YACxB,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;gBACf,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;YACnC,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;gBAC1C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,128 @@
1
+ /**
2
+ * System Command
3
+ *
4
+ * System service management (install, uninstall)
5
+ */
6
+ import { Command } from "commander";
7
+ import { spawn } from "child_process";
8
+ import { homedir } from "os";
9
+ import { join } from "path";
10
+ import { existsSync, mkdirSync, writeFileSync, unlinkSync } from "fs";
11
+ const SERVICE_NAME = "0xkobold";
12
+ export function createSystemCommand() {
13
+ const cmd = new Command("system")
14
+ .description("System service management");
15
+ cmd
16
+ .command("install")
17
+ .description("Install systemd service")
18
+ .option("--user", "Install as user service (default)", true)
19
+ .option("--system", "Install as system service (requires root)")
20
+ .action(async (opts) => {
21
+ await installService(opts.system);
22
+ });
23
+ cmd
24
+ .command("uninstall")
25
+ .description("Remove systemd service")
26
+ .action(async () => {
27
+ await uninstallService();
28
+ });
29
+ cmd
30
+ .command("enable")
31
+ .description("Enable auto-start on boot")
32
+ .action(async () => {
33
+ await runSystemctl("enable");
34
+ });
35
+ cmd
36
+ .command("disable")
37
+ .description("Disable auto-start")
38
+ .action(async () => {
39
+ await runSystemctl("disable");
40
+ });
41
+ return cmd;
42
+ }
43
+ async function installService(systemWide) {
44
+ const serviceFile = generateServiceFile();
45
+ let servicePath;
46
+ if (systemWide) {
47
+ servicePath = `/etc/systemd/system/${SERVICE_NAME}.service`;
48
+ console.error("❌ System-wide installation requires root. Use --user (default) instead.");
49
+ process.exit(1);
50
+ }
51
+ else {
52
+ // User service
53
+ const userDir = join(homedir(), ".config/systemd/user");
54
+ if (!existsSync(userDir)) {
55
+ mkdirSync(userDir, { recursive: true });
56
+ }
57
+ servicePath = join(userDir, `${SERVICE_NAME}.service`);
58
+ }
59
+ // Write service file
60
+ writeFileSync(servicePath, serviceFile);
61
+ console.log(`✅ Service file created: ${servicePath}`);
62
+ // Reload systemd
63
+ const proc = spawn("systemctl", ["--user", "daemon-reload"], {
64
+ stdio: "inherit",
65
+ });
66
+ proc.on("close", (code) => {
67
+ if (code === 0) {
68
+ console.log("✅ Systemd configuration reloaded");
69
+ console.log("\nNext steps:");
70
+ console.log(" 0xkobold start # Start the service");
71
+ console.log(" 0xkobold status # Check status");
72
+ }
73
+ else {
74
+ console.error("❌ Failed to reload systemd");
75
+ }
76
+ });
77
+ }
78
+ async function uninstallService() {
79
+ const userDir = join(homedir(), ".config/systemd/user");
80
+ const servicePath = join(userDir, `${SERVICE_NAME}.service`);
81
+ if (!existsSync(servicePath)) {
82
+ console.log("ℹ️ Service not installed");
83
+ return;
84
+ }
85
+ // Stop if running
86
+ await new Promise((resolve) => {
87
+ const proc = spawn("systemctl", ["--user", "stop", SERVICE_NAME]);
88
+ proc.on("close", () => resolve());
89
+ });
90
+ // Remove service file
91
+ unlinkSync(servicePath);
92
+ console.log(`✅ Service file removed: ${servicePath}`);
93
+ // Reload systemd
94
+ const proc = spawn("systemctl", ["--user", "daemon-reload"], {
95
+ stdio: "inherit",
96
+ });
97
+ proc.on("close", () => {
98
+ console.log("✅ Service uninstalled");
99
+ });
100
+ }
101
+ async function runSystemctl(action) {
102
+ const proc = spawn("systemctl", ["--user", action, SERVICE_NAME], {
103
+ stdio: "inherit",
104
+ });
105
+ proc.on("close", (code) => {
106
+ if (code !== 0) {
107
+ process.exit(1);
108
+ }
109
+ });
110
+ }
111
+ function generateServiceFile() {
112
+ return `[Unit]
113
+ Description=0xKobold Gateway - Multi-Agent Platform
114
+ After=network-online.target
115
+
116
+ [Service]
117
+ Type=exec
118
+ ExecStart=%h/.bun/bin/bun run src/index.ts
119
+ WorkingDirectory=%h/Documents/code/0xKobolds
120
+ Restart=always
121
+ RestartSec=5
122
+ Environment="NODE_ENV=production"
123
+
124
+ [Install]
125
+ WantedBy=default.target
126
+ `;
127
+ }
128
+ //# sourceMappingURL=system.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"system.js","sourceRoot":"","sources":["../../../../src/cli/commands/system.ts"],"names":[],"mappings":"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"}