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.
- package/.agents/skills/nextjs-best-practices/SKILL.md +208 -0
- package/.agents/skills/sql-optimization-patterns/SKILL.md +509 -0
- package/HEARTBEAT.md +45 -0
- package/README.md +197 -0
- package/USAGE.md +191 -0
- package/dist/package.json +77 -0
- package/dist/src/agent/pi-adapter.js +307 -0
- package/dist/src/agent/pi-adapter.js.map +1 -0
- package/dist/src/agent/tool-adapter.js +86 -0
- package/dist/src/agent/tool-adapter.js.map +1 -0
- package/dist/src/approval/queue.js +114 -0
- package/dist/src/approval/queue.js.map +1 -0
- package/dist/src/ascii-kobold.js +76 -0
- package/dist/src/ascii-kobold.js.map +1 -0
- package/dist/src/cli/client.js +217 -0
- package/dist/src/cli/client.js.map +1 -0
- package/dist/src/cli/commands/agent.js +272 -0
- package/dist/src/cli/commands/agent.js.map +1 -0
- package/dist/src/cli/commands/chat.js +234 -0
- package/dist/src/cli/commands/chat.js.map +1 -0
- package/dist/src/cli/commands/config.js +202 -0
- package/dist/src/cli/commands/config.js.map +1 -0
- package/dist/src/cli/commands/daemon.js +203 -0
- package/dist/src/cli/commands/daemon.js.map +1 -0
- package/dist/src/cli/commands/gateway.js +184 -0
- package/dist/src/cli/commands/gateway.js.map +1 -0
- package/dist/src/cli/commands/init.js +175 -0
- package/dist/src/cli/commands/init.js.map +1 -0
- package/dist/src/cli/commands/kobold.js +21 -0
- package/dist/src/cli/commands/kobold.js.map +1 -0
- package/dist/src/cli/commands/logs.js +27 -0
- package/dist/src/cli/commands/logs.js.map +1 -0
- package/dist/src/cli/commands/mode.js +121 -0
- package/dist/src/cli/commands/mode.js.map +1 -0
- package/dist/src/cli/commands/persona.js +261 -0
- package/dist/src/cli/commands/persona.js.map +1 -0
- package/dist/src/cli/commands/start.js +66 -0
- package/dist/src/cli/commands/start.js.map +1 -0
- package/dist/src/cli/commands/status.js +117 -0
- package/dist/src/cli/commands/status.js.map +1 -0
- package/dist/src/cli/commands/stop.js +27 -0
- package/dist/src/cli/commands/stop.js.map +1 -0
- package/dist/src/cli/commands/system.js +128 -0
- package/dist/src/cli/commands/system.js.map +1 -0
- package/dist/src/cli/commands/tui.js +103 -0
- package/dist/src/cli/commands/tui.js.map +1 -0
- package/dist/src/cli/commands/update.js +133 -0
- package/dist/src/cli/commands/update.js.map +1 -0
- package/dist/src/cli/extensions/discord.js +113 -0
- package/dist/src/cli/extensions/discord.js.map +1 -0
- package/dist/src/cli/extensions/env.js +91 -0
- package/dist/src/cli/extensions/env.js.map +1 -0
- package/dist/src/cli/extensions/heartbeat.js +78 -0
- package/dist/src/cli/extensions/heartbeat.js.map +1 -0
- package/dist/src/cli/index.js +24 -0
- package/dist/src/cli/index.js.map +1 -0
- package/dist/src/cli/program.js +70 -0
- package/dist/src/cli/program.js.map +1 -0
- package/dist/src/cli/repl.js +184 -0
- package/dist/src/cli/repl.js.map +1 -0
- package/dist/src/cli/shared/discord-service.js +102 -0
- package/dist/src/cli/shared/discord-service.js.map +1 -0
- package/dist/src/config/index.js +10 -0
- package/dist/src/config/index.js.map +1 -0
- package/dist/src/config/loader.js +401 -0
- package/dist/src/config/loader.js.map +1 -0
- package/dist/src/config/paths.js +84 -0
- package/dist/src/config/paths.js.map +1 -0
- package/dist/src/config/types.js +8 -0
- package/dist/src/config/types.js.map +1 -0
- package/dist/src/context-detector.js +60 -0
- package/dist/src/context-detector.js.map +1 -0
- package/dist/src/discord/index.js +376 -0
- package/dist/src/discord/index.js.map +1 -0
- package/dist/src/event-bus/index.js +97 -0
- package/dist/src/event-bus/index.js.map +1 -0
- package/dist/src/extensions/command-args.js +68 -0
- package/dist/src/extensions/command-args.js.map +1 -0
- package/dist/src/extensions/core/agent-registry-extension.js +541 -0
- package/dist/src/extensions/core/agent-registry-extension.js.map +1 -0
- package/dist/src/extensions/core/agent-worker.js +148 -0
- package/dist/src/extensions/core/agent-worker.js.map +1 -0
- package/dist/src/extensions/core/compaction-safeguard.js +154 -0
- package/dist/src/extensions/core/compaction-safeguard.js.map +1 -0
- package/dist/src/extensions/core/confirm-destructive.js +43 -0
- package/dist/src/extensions/core/confirm-destructive.js.map +1 -0
- package/dist/src/extensions/core/context-aware-extension.js +124 -0
- package/dist/src/extensions/core/context-aware-extension.js.map +1 -0
- package/dist/src/extensions/core/context-pruning/extension.js +124 -0
- package/dist/src/extensions/core/context-pruning/extension.js.map +1 -0
- package/dist/src/extensions/core/context-pruning/pruner.js +312 -0
- package/dist/src/extensions/core/context-pruning/pruner.js.map +1 -0
- package/dist/src/extensions/core/context-pruning/runtime.js +48 -0
- package/dist/src/extensions/core/context-pruning/runtime.js.map +1 -0
- package/dist/src/extensions/core/context-pruning/settings.js +105 -0
- package/dist/src/extensions/core/context-pruning/settings.js.map +1 -0
- package/dist/src/extensions/core/dirty-repo-guard.js +42 -0
- package/dist/src/extensions/core/dirty-repo-guard.js.map +1 -0
- package/dist/src/extensions/core/discord-channel-extension.js +205 -0
- package/dist/src/extensions/core/discord-channel-extension.js.map +1 -0
- package/dist/src/extensions/core/discord-extension.js +142 -0
- package/dist/src/extensions/core/discord-extension.js.map +1 -0
- package/dist/src/extensions/core/env-loader-extension.js +157 -0
- package/dist/src/extensions/core/env-loader-extension.js.map +1 -0
- package/dist/src/extensions/core/fileops-extension.js +699 -0
- package/dist/src/extensions/core/fileops-extension.js.map +1 -0
- package/dist/src/extensions/core/gateway-extension.js +730 -0
- package/dist/src/extensions/core/gateway-extension.js.map +1 -0
- package/dist/src/extensions/core/git-checkpoint.js +46 -0
- package/dist/src/extensions/core/git-checkpoint.js.map +1 -0
- package/dist/src/extensions/core/handoff-extension.js +206 -0
- package/dist/src/extensions/core/handoff-extension.js.map +1 -0
- package/dist/src/extensions/core/heartbeat-extension.js +373 -0
- package/dist/src/extensions/core/heartbeat-extension.js.map +1 -0
- package/dist/src/extensions/core/mcp-extension.js +413 -0
- package/dist/src/extensions/core/mcp-extension.js.map +1 -0
- package/dist/src/extensions/core/mode-manager-extension.js +562 -0
- package/dist/src/extensions/core/mode-manager-extension.js.map +1 -0
- package/dist/src/extensions/core/multi-channel-extension.js +435 -0
- package/dist/src/extensions/core/multi-channel-extension.js.map +1 -0
- package/dist/src/extensions/core/ollama-provider-extension.js +66 -0
- package/dist/src/extensions/core/ollama-provider-extension.js.map +1 -0
- package/dist/src/extensions/core/onboarding-extension.js +122 -0
- package/dist/src/extensions/core/onboarding-extension.js.map +1 -0
- package/dist/src/extensions/core/persona-loader-extension.js +139 -0
- package/dist/src/extensions/core/persona-loader-extension.js.map +1 -0
- package/dist/src/extensions/core/pi-notify-extension.js +70 -0
- package/dist/src/extensions/core/pi-notify-extension.js.map +1 -0
- package/dist/src/extensions/core/protected-paths.js +24 -0
- package/dist/src/extensions/core/protected-paths.js.map +1 -0
- package/dist/src/extensions/core/questionnaire-extension.js +242 -0
- package/dist/src/extensions/core/questionnaire-extension.js.map +1 -0
- package/dist/src/extensions/core/self-update-extension.js +181 -0
- package/dist/src/extensions/core/self-update-extension.js.map +1 -0
- package/dist/src/extensions/core/session-bridge-extension.js +78 -0
- package/dist/src/extensions/core/session-bridge-extension.js.map +1 -0
- package/dist/src/extensions/core/session-manager-extension.js +319 -0
- package/dist/src/extensions/core/session-manager-extension.js.map +1 -0
- package/dist/src/extensions/core/session-name-extension.js +88 -0
- package/dist/src/extensions/core/session-name-extension.js.map +1 -0
- package/dist/src/extensions/core/session-pruning-extension.js +480 -0
- package/dist/src/extensions/core/session-pruning-extension.js.map +1 -0
- package/dist/src/extensions/core/task-manager-extension.js +661 -0
- package/dist/src/extensions/core/task-manager-extension.js.map +1 -0
- package/dist/src/extensions/core/update-extension.js +438 -0
- package/dist/src/extensions/core/update-extension.js.map +1 -0
- package/dist/src/extensions/core/websearch-extension.js +463 -0
- package/dist/src/extensions/core/websearch-extension.js.map +1 -0
- package/dist/src/extensions/index.js +5 -0
- package/dist/src/extensions/index.js.map +1 -0
- package/dist/src/extensions/loader.js +80 -0
- package/dist/src/extensions/loader.js.map +1 -0
- package/dist/src/gateway/index.js +353 -0
- package/dist/src/gateway/index.js.map +1 -0
- package/dist/src/index.js +150 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/llm/anthropic.js +86 -0
- package/dist/src/llm/anthropic.js.map +1 -0
- package/dist/src/llm/index.js +9 -0
- package/dist/src/llm/index.js.map +1 -0
- package/dist/src/llm/ollama.js +113 -0
- package/dist/src/llm/ollama.js.map +1 -0
- package/dist/src/llm/router.js +145 -0
- package/dist/src/llm/router.js.map +1 -0
- package/dist/src/llm/types.js +7 -0
- package/dist/src/llm/types.js.map +1 -0
- package/dist/src/memory/index.js +5 -0
- package/dist/src/memory/index.js.map +1 -0
- package/dist/src/memory/store.js +91 -0
- package/dist/src/memory/store.js.map +1 -0
- package/dist/src/pi-config.js +80 -0
- package/dist/src/pi-config.js.map +1 -0
- package/dist/src/skills/builtin/file.js +184 -0
- package/dist/src/skills/builtin/file.js.map +1 -0
- package/dist/src/skills/builtin/shell.js +100 -0
- package/dist/src/skills/builtin/shell.js.map +1 -0
- package/dist/src/skills/builtin/subagent.js +62 -0
- package/dist/src/skills/builtin/subagent.js.map +1 -0
- package/dist/src/skills/hello.js +42 -0
- package/dist/src/skills/hello.js.map +1 -0
- package/dist/src/skills/index.js +11 -0
- package/dist/src/skills/index.js.map +1 -0
- package/dist/src/skills/loader.js +382 -0
- package/dist/src/skills/loader.js.map +1 -0
- package/dist/src/skills/types.js +8 -0
- package/dist/src/skills/types.js.map +1 -0
- package/dist/src/utils/working-dir.js +71 -0
- package/dist/src/utils/working-dir.js.map +1 -0
- package/package.json +77 -0
- package/skills/1password/SKILL.md +70 -0
- package/skills/1password/references/cli-examples.md +29 -0
- package/skills/1password/references/get-started.md +17 -0
- package/skills/apple-notes/SKILL.md +77 -0
- package/skills/apple-reminders/SKILL.md +118 -0
- package/skills/bear-notes/SKILL.md +107 -0
- package/skills/blogwatcher/SKILL.md +69 -0
- package/skills/blucli/SKILL.md +47 -0
- package/skills/bluebubbles/SKILL.md +131 -0
- package/skills/camsnap/SKILL.md +45 -0
- package/skills/canvas/SKILL.md +198 -0
- package/skills/clawhub/SKILL.md +77 -0
- package/skills/coding-agent/SKILL.md +284 -0
- package/skills/discord/SKILL.md +197 -0
- package/skills/eightctl/SKILL.md +50 -0
- package/skills/food-order/SKILL.md +48 -0
- package/skills/gemini/SKILL.md +43 -0
- package/skills/gh-issues/SKILL.md +865 -0
- package/skills/gifgrep/SKILL.md +79 -0
- package/skills/github/SKILL.md +163 -0
- package/skills/gog/SKILL.md +116 -0
- package/skills/goplaces/SKILL.md +52 -0
- package/skills/healthcheck/SKILL.md +245 -0
- package/skills/himalaya/SKILL.md +257 -0
- package/skills/himalaya/references/configuration.md +184 -0
- package/skills/himalaya/references/message-composition.md +199 -0
- package/skills/imsg/SKILL.md +122 -0
- package/skills/mcporter/SKILL.md +61 -0
- package/skills/model-usage/SKILL.md +69 -0
- package/skills/model-usage/references/codexbar-cli.md +33 -0
- package/skills/model-usage/scripts/model_usage.py +310 -0
- package/skills/nano-banana-pro/SKILL.md +58 -0
- package/skills/nano-banana-pro/scripts/generate_image.py +184 -0
- package/skills/nano-pdf/SKILL.md +38 -0
- package/skills/notion/SKILL.md +172 -0
- package/skills/obsidian/SKILL.md +81 -0
- package/skills/openai-image-gen/SKILL.md +89 -0
- package/skills/openai-image-gen/scripts/gen.py +240 -0
- package/skills/openai-whisper/SKILL.md +38 -0
- package/skills/openai-whisper-api/SKILL.md +52 -0
- package/skills/openai-whisper-api/scripts/transcribe.sh +85 -0
- package/skills/openhue/SKILL.md +112 -0
- package/skills/oracle/SKILL.md +125 -0
- package/skills/ordercli/SKILL.md +78 -0
- package/skills/peekaboo/SKILL.md +190 -0
- package/skills/sag/SKILL.md +87 -0
- package/skills/session-logs/SKILL.md +115 -0
- package/skills/sherpa-onnx-tts/SKILL.md +103 -0
- package/skills/sherpa-onnx-tts/bin/sherpa-onnx-tts +178 -0
- package/skills/skill-creator/SKILL.md +370 -0
- package/skills/skill-creator/license.txt +202 -0
- package/skills/skill-creator/scripts/init_skill.py +378 -0
- package/skills/skill-creator/scripts/package_skill.py +111 -0
- package/skills/skill-creator/scripts/quick_validate.py +101 -0
- package/skills/slack/SKILL.md +144 -0
- package/skills/songsee/SKILL.md +49 -0
- package/skills/sonoscli/SKILL.md +46 -0
- package/skills/spotify-player/SKILL.md +64 -0
- package/skills/summarize/SKILL.md +87 -0
- package/skills/things-mac/SKILL.md +86 -0
- package/skills/tmux/SKILL.md +153 -0
- package/skills/tmux/scripts/find-sessions.sh +112 -0
- package/skills/tmux/scripts/wait-for-text.sh +83 -0
- package/skills/trello/SKILL.md +95 -0
- package/skills/video-frames/SKILL.md +46 -0
- package/skills/video-frames/scripts/frame.sh +81 -0
- package/skills/voice-call/SKILL.md +45 -0
- package/skills/wacli/SKILL.md +72 -0
- 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":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AACxE,OAAO,EAAE,IAAI,EAAW,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAE7B,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,WAAW,CAAC,CAAC;AAQjD,MAAM,iBAAiB,GAAgC;IACrD,aAAa,EAAE;QACb,IAAI,EAAE,gBAAgB;QACtB,WAAW,EAAE,oDAAoD;QACjE,QAAQ,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6Bb;KACE;IACD,SAAS,EAAE;QACT,IAAI,EAAE,cAAc;QACpB,WAAW,EAAE,6CAA6C;QAC1D,QAAQ,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;CAyBb;KACE;IACD,SAAS,EAAE;QACT,IAAI,EAAE,YAAY;QAClB,WAAW,EAAE,yCAAyC;QACtD,QAAQ,EAAE;;;;;;;;;;;;;;;;CAgBb;KACE;IACD,UAAU,EAAE;QACV,IAAI,EAAE,gBAAgB;QACtB,WAAW,EAAE,0DAA0D;QACvE,QAAQ,EAAE;;;;;;;;;;;;;;;;;;;;;;;CAuBb;KACE;IACD,WAAW,EAAE;QACX,IAAI,EAAE,kBAAkB;QACxB,WAAW,EAAE,qDAAqD;QAClE,QAAQ,EAAE;;;;;;;;;;;;;;;;;;;;;;;;CAwBb;KACE;CACF,CAAC;AAEF,SAAS,SAAS;IAChB,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC7B,SAAS,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9C,CAAC;AACH,CAAC;AAED,SAAS,gBAAgB;IACvB,SAAS,EAAE,CAAC;IACZ,OAAO,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CACtD,UAAU,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC,CACxC,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,OAAO,EAAE;KACxC,IAAI,CAAC,SAAS,CAAC;KACf,WAAW,CAAC,8DAA8D,CAAC,CAAC;AAE/E,cAAc;KACX,OAAO,CAAC,MAAM,CAAC;KACf,KAAK,CAAC,IAAI,CAAC;KACX,WAAW,CAAC,6BAA6B,CAAC;KAC1C,MAAM,CAAC,GAAG,EAAE;IACX,MAAM,QAAQ,GAAG,gBAAgB,EAAE,CAAC;IACpC,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;IAEnD,KAAK,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC,EAAE,CAAC;QACjE,MAAM,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAC3C,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;QAClC,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,IAAI,QAAQ,EAAE,CAAC,CAAC;QACrC,OAAO,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;QACtC,OAAO,CAAC,GAAG,EAAE,CAAC;IAChB,CAAC;IAED,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;QAC7C,OAAO,CAAC,GAAG,CAAC,kDAAkD,CAAC,CAAC;IAClE,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,cAAc;KACX,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,yCAAyC,CAAC;KACtD,MAAM,CAAC,aAAa,EAAE,0BAA0B,CAAC;KACjD,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE;IAClB,SAAS,EAAE,CAAC;IACZ,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,IAAI,OAAO,GAAG,CAAC,CAAC;IAEhB,KAAK,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC,EAAE,CAAC;QACjE,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;QAE7C,IAAI,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YAC3C,OAAO,CAAC,GAAG,CAAC,KAAK,QAAQ,wCAAwC,CAAC,CAAC;YACnE,OAAO,EAAE,CAAC;YACV,SAAS;QACX,CAAC;QAED,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAChD,OAAO,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,QAAQ,EAAE,CAAC,CAAC;QAC/D,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,OAAO,mBAAmB,OAAO,UAAU,CAAC,CAAC;IAC9D,OAAO,CAAC,GAAG,CAAC,oEAAoE,CAAC,CAAC;IAClF,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC;AACxD,CAAC,CAAC,CAAC;AAEL,cAAc;KACX,OAAO,CAAC,aAAa,CAAC;KACtB,WAAW,CAAC,wCAAwC,CAAC;KACrD,MAAM,CAAC,KAAK,EAAE,QAAgB,EAAE,EAAE;IACjC,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;IAE7C,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1B,OAAO,CAAC,KAAK,CAAC,mBAAmB,QAAQ,EAAE,CAAC,CAAC;QAC7C,OAAO,CAAC,GAAG,CAAC,wDAAwD,CAAC,CAAC;QACtE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,IAAI,MAAM,CAAC;IAC5C,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,CAAC;IAEhD,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE;QACtC,KAAK,EAAE,SAAS;KACjB,CAAC,CAAC;IAEH,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;QACxB,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEL,cAAc;KACX,OAAO,CAAC,aAAa,CAAC;KACtB,WAAW,CAAC,qBAAqB,CAAC;KAClC,MAAM,CAAC,CAAC,QAAgB,EAAE,EAAE;IAC3B,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;IAE7C,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1B,OAAO,CAAC,KAAK,CAAC,mBAAmB,QAAQ,EAAE,CAAC,CAAC;QAC7C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,OAAO,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAChD,OAAO,CAAC,GAAG,CAAC,SAAS,QAAQ,QAAQ,CAAC,CAAC;IACvC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AACvB,CAAC,CAAC,CAAC;AAEL,cAAc;KACX,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,yCAAyC,CAAC;KACtD,MAAM,CAAC,GAAG,EAAE;IACX,MAAM,QAAQ,GAAG,gBAAgB,EAAE,CAAC;IAEpC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;QACvC,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;QAC1C,OAAO;IACT,CAAC;IAED,KAAK,MAAM,QAAQ,IAAI,QAAQ,EAAE,CAAC;QAChC,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;QAC7C,MAAM,OAAO,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAChD,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QACnC,OAAO,CAAC,GAAG,CAAC,MAAM,QAAQ,EAAE,CAAC,CAAC;QAC9B,OAAO,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;QACnC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACvB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,cAAc;KACX,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,6BAA6B,CAAC;KAC1C,MAAM,CAAC,GAAG,EAAE;IACX,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;AAC3B,CAAC,CAAC,CAAC"}
|
|
@@ -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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"}
|