arkaos 4.3.1 → 4.3.3
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/README.md +1 -1
- package/VERSION +1 -1
- package/arka/SKILL.md +4 -4
- package/arka/skills/costs/SKILL.md +1 -1
- package/arka/skills/fusion/SKILL.md +3 -3
- package/bin/arka +225 -0
- package/bin/arka-claude +64 -0
- package/bin/arka-claude.cmd +11 -0
- package/bin/arka-claude.ps1 +126 -0
- package/bin/arka-doctor +391 -0
- package/bin/arka-providers +261 -0
- package/bin/arka-py +46 -0
- package/bin/arka-py.cmd +9 -0
- package/bin/arka-py.ps1 +36 -0
- package/bin/arka-registry-gen +185 -0
- package/bin/arka-skill +300 -0
- package/bin/scheduler-daemon.py +48 -0
- package/config/claude-agents/marta-cqo.md +1 -1
- package/config/claude-agents/paulo-tech-lead.md +1 -1
- package/config/constitution.yaml +5 -5
- package/config/hooks/_lib/arka_python.ps1 +43 -0
- package/config/hooks/_lib/arka_python.sh +63 -0
- package/config/hooks/agent-provision.sh +8 -1
- package/config/hooks/cwd-changed.sh +6 -2
- package/config/hooks/post-tool-use-v2.sh +6 -2
- package/config/hooks/post-tool-use.sh +8 -17
- package/config/hooks/pre-tool-use.ps1 +8 -6
- package/config/hooks/pre-tool-use.sh +8 -17
- package/config/hooks/session-start.sh +23 -21
- package/config/hooks/stop.ps1 +7 -5
- package/config/hooks/stop.sh +8 -17
- package/config/hooks/token-hygiene.sh +5 -1
- package/config/hooks/user-prompt-submit-v2.sh +13 -9
- package/config/hooks/user-prompt-submit.sh +8 -17
- package/core/hooks/__pycache__/post_tool_use.cpython-312.pyc +0 -0
- package/core/hooks/__pycache__/pre_tool_use.cpython-312.pyc +0 -0
- package/core/runtime/__pycache__/cost_governor.cpython-312.pyc +0 -0
- package/core/runtime/__pycache__/llm_provider.cpython-312.pyc +0 -0
- package/core/runtime/__pycache__/openrouter_provider.cpython-312.pyc +0 -0
- package/core/workflow/state_reader.sh +12 -5
- package/departments/ops/skills/update/SKILL.md +2 -2
- package/departments/ops/skills/update/references/sync-engine.md +1 -1
- package/departments/quality/SKILL.md +1 -1
- package/installer/index.js +14 -0
- package/installer/update.js +31 -0
- package/package.json +6 -3
- package/pyproject.toml +1 -1
- package/scripts/seed_initial_patterns.py +1 -1
package/README.md
CHANGED
|
@@ -491,7 +491,7 @@ npx arkaos uninstall # Remove ArkaOS
|
|
|
491
491
|
**Release pipeline (operator-side, headless):**
|
|
492
492
|
|
|
493
493
|
```
|
|
494
|
-
|
|
494
|
+
~/.arkaos/bin/arka-py -m core.release.preflight_cli --expected-npm-user <user>
|
|
495
495
|
# Step 0 NON-NEGOTIABLE before any tag/push/publish (v2.43.0+).
|
|
496
496
|
# Six checks: version-alignment / npm-auth / npm-publish-capability /
|
|
497
497
|
# gh-auth / git-remote / git-clean. Plus no-client-name-leaks
|
package/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
4.3.
|
|
1
|
+
4.3.3
|
package/arka/SKILL.md
CHANGED
|
@@ -180,10 +180,10 @@ violation (squad-routing, arka-supremacy, spec-driven, mandatory-qa).
|
|
|
180
180
|
| Command | Description |
|
|
181
181
|
|---------|-------------|
|
|
182
182
|
| `/arka status` | System status (version, departments, agents, active projects). Includes **LLM costs (24h)** section: top-line cost + cache hit rate + call count from `core.runtime.llm_cost_telemetry.summarise(period="today")`. Also includes **Enforcement (24h)** section: total calls, block rate, top blocked tools/reasons from `core.governance.enforcement_telemetry.summarise(period="today")` (PR19 v2.41.0). Plus **Reorganization (today)** section: today's proposal path + artifact count from `core.cognition.reorganizer_scheduler.status_summary()` (PR24 v2.46.0). |
|
|
183
|
-
| `/arka costs [period]` | LLM cost visibility — aggregates telemetry by day/week/month/all, with top expensive sessions. See `arka/skills/costs/SKILL.md`. Shells out to
|
|
184
|
-
| `/arka enforcement [period]` | Enforcement compliance — aggregates flow-marker enforcement telemetry by day/week/month/all. Shows block rate, top blocked tools, top reasons. Shells out to
|
|
185
|
-
| `/arka compliance [period]` | Behavior compliance summary (PR29 v2.48.0) — aggregates stop-hook telemetry by day/week/month/all. Shows rates for the four contracts: closing marker, `[arka:meta]` tag, KB citation pass, sycophancy clean. Shells out to
|
|
186
|
-
| `/arka reorganize [--since-days N]` | Dreaming → Agent reorganizer. Aggregates recent KB pattern/anti-pattern/lesson artifacts (default last 7 days) into a markdown proposal at `~/.arkaos/reorganize-proposals/<date>.md`. **Propose-only** — never modifies agent YAMLs. Sanitizes client identifiers from titles and body excerpts; drops `tags:` field entirely to prevent project-name leaks. **Auto-fires on session start when today's proposal is missing** (PR24 v2.46.0 stale-aware trigger, 30s timeout, background). Shells out to
|
|
183
|
+
| `/arka costs [period]` | LLM cost visibility — aggregates telemetry by day/week/month/all, with top expensive sessions. See `arka/skills/costs/SKILL.md`. Shells out to `~/.arkaos/bin/arka-py -m core.runtime.llm_cost_telemetry_cli <period>`. |
|
|
184
|
+
| `/arka enforcement [period]` | Enforcement compliance — aggregates flow-marker enforcement telemetry by day/week/month/all. Shows block rate, top blocked tools, top reasons. Shells out to `~/.arkaos/bin/arka-py -m core.governance.enforcement_telemetry_cli <period>`. |
|
|
185
|
+
| `/arka compliance [period]` | Behavior compliance summary (PR29 v2.48.0) — aggregates stop-hook telemetry by day/week/month/all. Shows rates for the four contracts: closing marker, `[arka:meta]` tag, KB citation pass, sycophancy clean. Shells out to `~/.arkaos/bin/arka-py -m core.governance.compliance_telemetry_cli <period>`. |
|
|
186
|
+
| `/arka reorganize [--since-days N]` | Dreaming → Agent reorganizer. Aggregates recent KB pattern/anti-pattern/lesson artifacts (default last 7 days) into a markdown proposal at `~/.arkaos/reorganize-proposals/<date>.md`. **Propose-only** — never modifies agent YAMLs. Sanitizes client identifiers from titles and body excerpts; drops `tags:` field entirely to prevent project-name leaks. **Auto-fires on session start when today's proposal is missing** (PR24 v2.46.0 stale-aware trigger, 30s timeout, background). Shells out to `~/.arkaos/bin/arka-py -m core.cognition.reorganizer_cli [--since-days N] [--dry-run]`. |
|
|
187
187
|
| `/arka standup` | Daily standup (projects, priorities, blockers, updates) |
|
|
188
188
|
| `/arka monitor` | System health monitoring |
|
|
189
189
|
| `/arka onboard <path>` | Onboard an existing project into ArkaOS |
|
|
@@ -42,7 +42,7 @@ surfaces usage and emits soft advisories. It never blocks a call.
|
|
|
42
42
|
This skill shells out to the Python CLI:
|
|
43
43
|
|
|
44
44
|
```bash
|
|
45
|
-
|
|
45
|
+
~/.arkaos/bin/arka-py -m core.runtime.llm_cost_telemetry_cli <period>
|
|
46
46
|
```
|
|
47
47
|
|
|
48
48
|
Source:
|
|
@@ -24,9 +24,9 @@ mechanical work economises.
|
|
|
24
24
|
Run and read all three:
|
|
25
25
|
|
|
26
26
|
```bash
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
27
|
+
~/.arkaos/bin/arka-py -m core.runtime.model_router_cli discover # Ollama + local models
|
|
28
|
+
~/.arkaos/bin/arka-py -m core.runtime.model_router_cli --json # current routing
|
|
29
|
+
~/.arkaos/bin/arka-py -m core.runtime.model_router_cli usage --period week --json
|
|
30
30
|
```
|
|
31
31
|
|
|
32
32
|
Also check key presence (never print values): `OPENROUTER_API_KEY` /
|
package/bin/arka
ADDED
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# ============================================================================
|
|
3
|
+
# ARKA OS — CLI Wrapper
|
|
4
|
+
# Usage: arka [command] [args...]
|
|
5
|
+
# ============================================================================
|
|
6
|
+
set -e
|
|
7
|
+
|
|
8
|
+
command -v claude &>/dev/null || { echo "Error: Claude Code CLI not found."; exit 1; }
|
|
9
|
+
|
|
10
|
+
ARKA_OS="${ARKA_OS:-$HOME/.claude/skills/arka}"
|
|
11
|
+
[ -d "$ARKA_OS" ] || { echo "Error: ARKA OS not installed. Run: bash install.sh"; exit 1; }
|
|
12
|
+
|
|
13
|
+
# Run version check (silent on errors)
|
|
14
|
+
bash "$ARKA_OS/version-check.sh" 2>/dev/null || true
|
|
15
|
+
|
|
16
|
+
# Generate dynamic system prompt from user profile
|
|
17
|
+
SYSTEM_PROMPT=$(bash "$ARKA_OS/system-prompt.sh" 2>/dev/null || echo "")
|
|
18
|
+
|
|
19
|
+
# ─── ARKA OS Banner ─────────────────────────────────────────────────────────
|
|
20
|
+
show_banner() {
|
|
21
|
+
local C='\033[0;36m' # cyan
|
|
22
|
+
local G='\033[0;32m' # green
|
|
23
|
+
local Y='\033[1;33m' # yellow
|
|
24
|
+
local N='\033[0m' # reset
|
|
25
|
+
local VERSION
|
|
26
|
+
VERSION=$(cat "$ARKA_OS/VERSION" 2>/dev/null || echo "?")
|
|
27
|
+
|
|
28
|
+
# Read user name from profile
|
|
29
|
+
local USER_NAME=""
|
|
30
|
+
if [ -f "$HOME/.arka-os/profile.json" ] && command -v jq &>/dev/null; then
|
|
31
|
+
USER_NAME=$(jq -r '.user_name // ""' "$HOME/.arka-os/profile.json" 2>/dev/null)
|
|
32
|
+
fi
|
|
33
|
+
|
|
34
|
+
echo ""
|
|
35
|
+
echo -e "${C} ╔══════════════════════════════════════════════════════════╗${N}"
|
|
36
|
+
echo -e "${C} ║${N} ${C}║${N}"
|
|
37
|
+
echo -e "${C} ║${N} ${G} █████╗ ██████╗ ██╗ ██╗ █████╗ ██████╗ ███████╗${N} ${C}║${N}"
|
|
38
|
+
echo -e "${C} ║${N} ${G}██╔══██╗██╔══██╗██║ ██╔╝██╔══██╗██╔═══██╗██╔════╝${N} ${C}║${N}"
|
|
39
|
+
echo -e "${C} ║${N} ${G}███████║██████╔╝█████╔╝ ███████║██║ ██║███████╗${N} ${C}║${N}"
|
|
40
|
+
echo -e "${C} ║${N} ${G}██╔══██║██╔══██╗██╔═██╗ ██╔══██║██║ ██║╚════██║${N} ${C}║${N}"
|
|
41
|
+
echo -e "${C} ║${N} ${G}██║ ██║██║ ██║██║ ██╗██║ ██║╚██████╔╝███████║${N} ${C}║${N}"
|
|
42
|
+
echo -e "${C} ║${N} ${G}╚═╝ ╚═╝╚═╝ ╚═╝╚═╝ ╚═╝╚═╝ ╚═╝ ╚═════╝ ╚══════╝${N} ${C}║${N}"
|
|
43
|
+
echo -e "${C} ║${N} ${C}║${N}"
|
|
44
|
+
echo -e "${C} ║${N} ${Y}WizardingCode Company OS${N} v${VERSION} ${C}║${N}"
|
|
45
|
+
if [ -n "$USER_NAME" ]; then
|
|
46
|
+
echo -e "${C} ║${N} Welcome back, ${G}${USER_NAME}${N}! ${C}║${N}"
|
|
47
|
+
fi
|
|
48
|
+
echo -e "${C} ║${N} ${C}║${N}"
|
|
49
|
+
echo -e "${C} ╚══════════════════════════════════════════════════════════╝${N}"
|
|
50
|
+
echo ""
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
case "${1:-}" in
|
|
54
|
+
skill)
|
|
55
|
+
shift
|
|
56
|
+
bash "$HOME/.local/bin/arka-skill" "$@"
|
|
57
|
+
exit $?
|
|
58
|
+
;;
|
|
59
|
+
update)
|
|
60
|
+
cd "$(cat "$ARKA_OS/.repo-path")" && git pull && bash install.sh
|
|
61
|
+
exit $?
|
|
62
|
+
;;
|
|
63
|
+
--version|-v)
|
|
64
|
+
cat "$ARKA_OS/VERSION"
|
|
65
|
+
exit 0
|
|
66
|
+
;;
|
|
67
|
+
doctor)
|
|
68
|
+
shift
|
|
69
|
+
bash "$HOME/.local/bin/arka-doctor" "$@"
|
|
70
|
+
exit $?
|
|
71
|
+
;;
|
|
72
|
+
gotchas)
|
|
73
|
+
shift
|
|
74
|
+
GOTCHAS_FILE="$HOME/.arka-os/gotchas.json"
|
|
75
|
+
case "${1:-}" in
|
|
76
|
+
clear)
|
|
77
|
+
echo '[]' > "$GOTCHAS_FILE"
|
|
78
|
+
echo "Gotchas cleared."
|
|
79
|
+
;;
|
|
80
|
+
--json)
|
|
81
|
+
if [ -f "$GOTCHAS_FILE" ]; then
|
|
82
|
+
cat "$GOTCHAS_FILE"
|
|
83
|
+
else
|
|
84
|
+
echo '[]'
|
|
85
|
+
fi
|
|
86
|
+
;;
|
|
87
|
+
*)
|
|
88
|
+
if [ ! -f "$GOTCHAS_FILE" ] || [ "$(jq 'length' "$GOTCHAS_FILE" 2>/dev/null)" = "0" ]; then
|
|
89
|
+
echo "No gotchas recorded yet."
|
|
90
|
+
exit 0
|
|
91
|
+
fi
|
|
92
|
+
echo ""
|
|
93
|
+
echo -e "\033[0;36m╔══════════════════════════════════════════════════╗\033[0m"
|
|
94
|
+
echo -e "\033[0;36m║\033[0m \033[1mARKA OS Gotchas\033[0m — Recurring Error Patterns \033[0;36m║\033[0m"
|
|
95
|
+
echo -e "\033[0;36m╚══════════════════════════════════════════════════╝\033[0m"
|
|
96
|
+
echo ""
|
|
97
|
+
jq -r '.[:10] | to_entries[] | " \(.key + 1). [\(.value.category)] (×\(.value.count)) \(.value.pattern)\n First: \(.value.first_seen) | Last: \(.value.last_seen)\n Projects: \(.value.projects | join(", "))\n"' "$GOTCHAS_FILE" 2>/dev/null
|
|
98
|
+
TOTAL=$(jq 'length' "$GOTCHAS_FILE" 2>/dev/null || echo "0")
|
|
99
|
+
echo " Total: $TOTAL gotcha(s) tracked"
|
|
100
|
+
echo ""
|
|
101
|
+
;;
|
|
102
|
+
esac
|
|
103
|
+
exit 0
|
|
104
|
+
;;
|
|
105
|
+
metrics)
|
|
106
|
+
METRICS_FILE="$HOME/.arka-os/hook-metrics.json"
|
|
107
|
+
if [ ! -f "$METRICS_FILE" ] || [ "$(jq 'length' "$METRICS_FILE" 2>/dev/null)" = "0" ]; then
|
|
108
|
+
echo "No hook metrics recorded yet."
|
|
109
|
+
exit 0
|
|
110
|
+
fi
|
|
111
|
+
echo ""
|
|
112
|
+
echo -e "\033[0;36m╔══════════════════════════════════════════════════╗\033[0m"
|
|
113
|
+
echo -e "\033[0;36m║\033[0m \033[1mARKA OS Hook Metrics\033[0m — Last 24h \033[0;36m║\033[0m"
|
|
114
|
+
echo -e "\033[0;36m╚══════════════════════════════════════════════════╝\033[0m"
|
|
115
|
+
echo ""
|
|
116
|
+
CUTOFF=$(date -u -v-24H +%Y-%m-%dT%H:%M:%SZ 2>/dev/null || date -u -d '24 hours ago' +%Y-%m-%dT%H:%M:%SZ 2>/dev/null || echo "1970-01-01T00:00:00Z")
|
|
117
|
+
jq -r --arg cutoff "$CUTOFF" '
|
|
118
|
+
[.[] | select(.timestamp >= $cutoff)] | group_by(.hook) | .[] |
|
|
119
|
+
{
|
|
120
|
+
hook: .[0].hook,
|
|
121
|
+
count: length,
|
|
122
|
+
avg: ([.[].duration_ms] | add / length | floor),
|
|
123
|
+
p95: ([.[].duration_ms] | sort | .[length * 95 / 100 | floor] // 0),
|
|
124
|
+
max: ([.[].duration_ms] | max)
|
|
125
|
+
} |
|
|
126
|
+
" \(.hook)\n Count: \(.count) Avg: \(.avg)ms P95: \(.p95)ms Max: \(.max)ms"
|
|
127
|
+
' "$METRICS_FILE" 2>/dev/null
|
|
128
|
+
echo ""
|
|
129
|
+
TOTAL=$(jq 'length' "$METRICS_FILE" 2>/dev/null || echo "0")
|
|
130
|
+
echo " Total entries: $TOTAL (keeps last 500)"
|
|
131
|
+
echo ""
|
|
132
|
+
exit 0
|
|
133
|
+
;;
|
|
134
|
+
commands|registry)
|
|
135
|
+
shift
|
|
136
|
+
REPO_DIR="$(cat "$ARKA_OS/.repo-path" 2>/dev/null)"
|
|
137
|
+
REGISTRY="$REPO_DIR/knowledge/commands-registry.json"
|
|
138
|
+
case "${1:-}" in
|
|
139
|
+
rebuild)
|
|
140
|
+
bash "$REPO_DIR/bin/arka-registry-gen"
|
|
141
|
+
echo "Registry rebuilt: $(jq '._meta.total_commands' "$REGISTRY") commands."
|
|
142
|
+
;;
|
|
143
|
+
--json)
|
|
144
|
+
[ -f "$REGISTRY" ] && cat "$REGISTRY" || echo '{"commands":[]}'
|
|
145
|
+
;;
|
|
146
|
+
*)
|
|
147
|
+
if [ ! -f "$REGISTRY" ]; then
|
|
148
|
+
echo "Registry not found. Run: arka commands rebuild"
|
|
149
|
+
exit 1
|
|
150
|
+
fi
|
|
151
|
+
echo ""
|
|
152
|
+
echo -e "\033[0;36m═══ ARKA OS — Available Commands ═══\033[0m"
|
|
153
|
+
echo ""
|
|
154
|
+
jq -r '.commands | group_by(.department) | .[] |
|
|
155
|
+
" \u001b[1;33m\(.[0].department | ascii_upcase)\u001b[0m\n" +
|
|
156
|
+
([.[] | " \(.command)\t\(.description)"] | join("\n")) + "\n"
|
|
157
|
+
' "$REGISTRY" 2>/dev/null
|
|
158
|
+
TOTAL=$(jq '._meta.total_commands' "$REGISTRY" 2>/dev/null || echo "?")
|
|
159
|
+
echo -e " Total: $TOTAL commands"
|
|
160
|
+
echo -e " Tip: Just describe what you need — no need to memorize commands!"
|
|
161
|
+
echo ""
|
|
162
|
+
;;
|
|
163
|
+
esac
|
|
164
|
+
exit 0
|
|
165
|
+
;;
|
|
166
|
+
providers)
|
|
167
|
+
shift
|
|
168
|
+
REPO_DIR="$(cat "$ARKA_OS/.repo-path" 2>/dev/null)"
|
|
169
|
+
bash "$REPO_DIR/bin/arka-providers" "$@"
|
|
170
|
+
exit $?
|
|
171
|
+
;;
|
|
172
|
+
team-balance)
|
|
173
|
+
REPO_DIR="$(cat "$ARKA_OS/.repo-path" 2>/dev/null)"
|
|
174
|
+
bash "$REPO_DIR/config/disc-team-validator.sh"
|
|
175
|
+
exit $?
|
|
176
|
+
;;
|
|
177
|
+
test)
|
|
178
|
+
shift
|
|
179
|
+
if command -v bats &>/dev/null; then
|
|
180
|
+
REPO_DIR="$(cat "$ARKA_OS/.repo-path" 2>/dev/null)"
|
|
181
|
+
bats "$REPO_DIR/tests/" "$@"
|
|
182
|
+
else
|
|
183
|
+
echo "Error: bats-core not installed. Install: brew install bats-core"
|
|
184
|
+
exit 1
|
|
185
|
+
fi
|
|
186
|
+
exit $?
|
|
187
|
+
;;
|
|
188
|
+
kb)
|
|
189
|
+
shift
|
|
190
|
+
SCRIPTS_DIR="$HOME/.claude/skills/arka-knowledge/scripts"
|
|
191
|
+
# Fallback to repo scripts location
|
|
192
|
+
if [ ! -d "$SCRIPTS_DIR" ]; then
|
|
193
|
+
REPO_DIR="$(cat "$ARKA_OS/.repo-path" 2>/dev/null)"
|
|
194
|
+
SCRIPTS_DIR="$REPO_DIR/departments/kb/scripts"
|
|
195
|
+
fi
|
|
196
|
+
case "${1:-}" in
|
|
197
|
+
queue) bash "$SCRIPTS_DIR/kb-status.sh" "${@:2}" ;;
|
|
198
|
+
status) bash "$SCRIPTS_DIR/kb-status.sh" "${@:2}" ;;
|
|
199
|
+
capabilities) bash "$SCRIPTS_DIR/kb-check-capabilities.sh" ;;
|
|
200
|
+
cleanup) bash "$SCRIPTS_DIR/kb-cleanup.sh" "${@:2}" ;;
|
|
201
|
+
*) claude "/kb $*" ;;
|
|
202
|
+
esac
|
|
203
|
+
exit $?
|
|
204
|
+
;;
|
|
205
|
+
*)
|
|
206
|
+
# Show branded banner for interactive sessions (no arguments)
|
|
207
|
+
if [ $# -eq 0 ]; then
|
|
208
|
+
show_banner
|
|
209
|
+
fi
|
|
210
|
+
|
|
211
|
+
if [ -n "$SYSTEM_PROMPT" ]; then
|
|
212
|
+
if [ $# -gt 0 ]; then
|
|
213
|
+
claude --append-system-prompt "$SYSTEM_PROMPT" "$*"
|
|
214
|
+
else
|
|
215
|
+
claude --append-system-prompt "$SYSTEM_PROMPT"
|
|
216
|
+
fi
|
|
217
|
+
else
|
|
218
|
+
if [ $# -gt 0 ]; then
|
|
219
|
+
claude "$*"
|
|
220
|
+
else
|
|
221
|
+
claude
|
|
222
|
+
fi
|
|
223
|
+
fi
|
|
224
|
+
;;
|
|
225
|
+
esac
|
package/bin/arka-claude
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# ============================================================================
|
|
3
|
+
# ArkaOS — Claude Code Wrapper
|
|
4
|
+
# Displays branded greeting BEFORE Claude starts (deterministic, no LLM)
|
|
5
|
+
# Usage: arka-claude [any claude args...]
|
|
6
|
+
# ============================================================================
|
|
7
|
+
|
|
8
|
+
# ─── Colors ────────────────────────────────────────────────────────────
|
|
9
|
+
GREEN='\033[0;32m'
|
|
10
|
+
WHITE='\033[1;37m'
|
|
11
|
+
DIM='\033[2m'
|
|
12
|
+
CYAN='\033[0;36m'
|
|
13
|
+
YELLOW='\033[1;33m'
|
|
14
|
+
RESET='\033[0m'
|
|
15
|
+
|
|
16
|
+
# ─── Profile ───────────────────────────────────────────────────────────
|
|
17
|
+
NAME="founder"
|
|
18
|
+
COMPANY="WizardingCode"
|
|
19
|
+
VERSION="2.x"
|
|
20
|
+
|
|
21
|
+
if [ -f "$HOME/.arkaos/profile.json" ] && command -v python3 &>/dev/null; then
|
|
22
|
+
NAME=$(python3 -c "import json; p=json.load(open('$HOME/.arkaos/profile.json')); print(p.get('name', p.get('role', 'founder')))" 2>/dev/null || echo "founder")
|
|
23
|
+
COMPANY=$(python3 -c "import json; print(json.load(open('$HOME/.arkaos/profile.json')).get('company', 'WizardingCode'))" 2>/dev/null || echo "WizardingCode")
|
|
24
|
+
fi
|
|
25
|
+
|
|
26
|
+
if [ -f "$HOME/.arkaos/.repo-path" ]; then
|
|
27
|
+
REPO=$(cat "$HOME/.arkaos/.repo-path")
|
|
28
|
+
[ -f "$REPO/VERSION" ] && VERSION=$(cat "$REPO/VERSION" | tr -d '[:space:]')
|
|
29
|
+
fi
|
|
30
|
+
|
|
31
|
+
# ─── Time greeting ─────────────────────────────────────────────────────
|
|
32
|
+
HOUR=$(date +%H)
|
|
33
|
+
if [ "$HOUR" -ge 5 ] && [ "$HOUR" -lt 12 ]; then GREETING="Bom dia"
|
|
34
|
+
elif [ "$HOUR" -ge 12 ] && [ "$HOUR" -lt 19 ]; then GREETING="Boa tarde"
|
|
35
|
+
else GREETING="Boa noite"; fi
|
|
36
|
+
|
|
37
|
+
# ─── Version drift ─────────────────────────────────────────────────────
|
|
38
|
+
DRIFT_MSG=""
|
|
39
|
+
SYNC_STATE="$HOME/.arkaos/sync-state.json"
|
|
40
|
+
if [ -f "$SYNC_STATE" ]; then
|
|
41
|
+
SYNCED=$(python3 -c "import json; print(json.load(open('$SYNC_STATE'))['version'])" 2>/dev/null || echo "none")
|
|
42
|
+
if [ "$SYNCED" != "$VERSION" ]; then
|
|
43
|
+
DRIFT_MSG="\n ${YELLOW}⚠ Update available: run /arka update to sync${RESET}"
|
|
44
|
+
fi
|
|
45
|
+
fi
|
|
46
|
+
|
|
47
|
+
# ─── Display ───────────────────────────────────────────────────────────
|
|
48
|
+
echo ""
|
|
49
|
+
echo -e " ${GREEN}╔══════════════════════════════════════════════╗${RESET}"
|
|
50
|
+
echo -e " ${GREEN}║${RESET} ${GREEN}║${RESET}"
|
|
51
|
+
echo -e " ${GREEN}║${RESET} ${WHITE}A R K A O S${RESET} ${GREEN}║${RESET}"
|
|
52
|
+
echo -e " ${GREEN}║${RESET} ${GREEN}║${RESET}"
|
|
53
|
+
echo -e " ${GREEN}║${RESET} ${DIM}The Operating System for AI Teams${RESET} ${GREEN}║${RESET}"
|
|
54
|
+
echo -e " ${GREEN}║${RESET} ${DIM}by WizardingCode${RESET} ${GREEN}║${RESET}"
|
|
55
|
+
echo -e " ${GREEN}║${RESET} ${GREEN}║${RESET}"
|
|
56
|
+
echo -e " ${GREEN}╚══════════════════════════════════════════════╝${RESET}"
|
|
57
|
+
echo ""
|
|
58
|
+
echo -e " ${CYAN}${GREETING}, ${NAME}${RESET} ${DIM}(${COMPANY})${RESET}"
|
|
59
|
+
echo -e " ${DIM}ArkaOS v${VERSION} │ 65 agents │ 17 departments │ 244+ skills${RESET}"
|
|
60
|
+
echo -e "${DRIFT_MSG}"
|
|
61
|
+
echo ""
|
|
62
|
+
|
|
63
|
+
# ─── Launch Claude ─────────────────────────────────────────────────────
|
|
64
|
+
exec claude "$@"
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
@echo off
|
|
2
|
+
REM ==========================================================================
|
|
3
|
+
REM ArkaOS - Claude Code Wrapper (cmd shim)
|
|
4
|
+
REM
|
|
5
|
+
REM Dispatches to bin\arka-claude.ps1, forwarding all arguments. Using a
|
|
6
|
+
REM .cmd shim means `arka-claude ...` works from cmd.exe, PowerShell, and
|
|
7
|
+
REM Windows Terminal alike, without the caller having to remember the
|
|
8
|
+
REM `powershell -File ...` invocation.
|
|
9
|
+
REM ==========================================================================
|
|
10
|
+
powershell.exe -NoProfile -NonInteractive -ExecutionPolicy Bypass -File "%~dp0arka-claude.ps1" %*
|
|
11
|
+
exit /b %ERRORLEVEL%
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
# ============================================================================
|
|
2
|
+
# ArkaOS - Claude Code Wrapper (Windows / PowerShell 5.1+)
|
|
3
|
+
#
|
|
4
|
+
# Port of bin/arka-claude. Displays the branded greeting deterministically
|
|
5
|
+
# (no LLM involved) and then hands control to `claude` with any forwarded
|
|
6
|
+
# arguments.
|
|
7
|
+
#
|
|
8
|
+
# Usage: arka-claude [any claude args...]
|
|
9
|
+
#
|
|
10
|
+
# This script is normally invoked through its .cmd shim (bin/arka-claude.cmd)
|
|
11
|
+
# so it works from cmd.exe, PowerShell, and Windows Terminal without the
|
|
12
|
+
# caller having to remember the `powershell -File ...` invocation.
|
|
13
|
+
#
|
|
14
|
+
# Pure ASCII on purpose: PS 5.1 reads source files as ANSI by default.
|
|
15
|
+
# Box-drawing characters are built at runtime from [char] codes.
|
|
16
|
+
# ============================================================================
|
|
17
|
+
|
|
18
|
+
$ErrorActionPreference = 'Stop'
|
|
19
|
+
[Console]::OutputEncoding = [System.Text.UTF8Encoding]::new($false)
|
|
20
|
+
|
|
21
|
+
$arkaosHome = Join-Path $env:USERPROFILE '.arkaos'
|
|
22
|
+
|
|
23
|
+
# --- Profile ---------------------------------------------------------------
|
|
24
|
+
$name = 'founder'
|
|
25
|
+
$company = 'WizardingCode'
|
|
26
|
+
$version = '2.x'
|
|
27
|
+
|
|
28
|
+
$profilePath = Join-Path $arkaosHome 'profile.json'
|
|
29
|
+
if (Test-Path -LiteralPath $profilePath) {
|
|
30
|
+
try {
|
|
31
|
+
$arkaosProfile = Get-Content -Raw -LiteralPath $profilePath -Encoding UTF8 | ConvertFrom-Json
|
|
32
|
+
if ($arkaosProfile.name) { $name = [string]$arkaosProfile.name }
|
|
33
|
+
elseif ($arkaosProfile.role) { $name = [string]$arkaosProfile.role }
|
|
34
|
+
if ($arkaosProfile.company) { $company = [string]$arkaosProfile.company }
|
|
35
|
+
} catch { }
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
$repoPathFile = Join-Path $arkaosHome '.repo-path'
|
|
39
|
+
if (Test-Path -LiteralPath $repoPathFile) {
|
|
40
|
+
try {
|
|
41
|
+
$repo = (Get-Content -Raw -LiteralPath $repoPathFile -Encoding UTF8).Trim()
|
|
42
|
+
if ($repo) {
|
|
43
|
+
$versionFile = Join-Path $repo 'VERSION'
|
|
44
|
+
if (Test-Path -LiteralPath $versionFile) {
|
|
45
|
+
$version = (Get-Content -Raw -LiteralPath $versionFile -Encoding UTF8).Trim()
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
} catch { }
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
# --- Time greeting ---------------------------------------------------------
|
|
52
|
+
$hour = [int](Get-Date -Format 'HH')
|
|
53
|
+
if ($hour -ge 5 -and $hour -lt 12) { $greeting = 'Bom dia' }
|
|
54
|
+
elseif ($hour -ge 12 -and $hour -lt 19) { $greeting = 'Boa tarde' }
|
|
55
|
+
else { $greeting = 'Boa noite' }
|
|
56
|
+
|
|
57
|
+
# --- Version drift ---------------------------------------------------------
|
|
58
|
+
$driftMsg = ''
|
|
59
|
+
$syncStatePath = Join-Path $arkaosHome 'sync-state.json'
|
|
60
|
+
if (Test-Path -LiteralPath $syncStatePath) {
|
|
61
|
+
try {
|
|
62
|
+
$ss = Get-Content -Raw -LiteralPath $syncStatePath -Encoding UTF8 | ConvertFrom-Json
|
|
63
|
+
$synced = if ($null -ne $ss.version) { [string]$ss.version } else { 'none' }
|
|
64
|
+
if ($synced -ne $version) {
|
|
65
|
+
$driftMsg = 'Update available: run /arka update to sync'
|
|
66
|
+
}
|
|
67
|
+
} catch { }
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
# --- Build ASCII header ----------------------------------------------------
|
|
71
|
+
# Box drawing chars as runtime literals (not embedded in source).
|
|
72
|
+
$tl = [char]0x2554; $tr = [char]0x2557
|
|
73
|
+
$bl = [char]0x255A; $br = [char]0x255D
|
|
74
|
+
$h = [char]0x2550; $v = [char]0x2551
|
|
75
|
+
$sep = [char]0x2502 # light vertical bar used in the stat line
|
|
76
|
+
$innerWidth = 46
|
|
77
|
+
$barLine = ([string]$h * $innerWidth)
|
|
78
|
+
$emptyBox = "$v" + (' ' * $innerWidth) + "$v"
|
|
79
|
+
|
|
80
|
+
function Pad-Centered([string]$text, [int]$width) {
|
|
81
|
+
$padLeft = [int](($width - $text.Length) / 2)
|
|
82
|
+
$padRight = $width - $text.Length - $padLeft
|
|
83
|
+
return (' ' * $padLeft) + $text + (' ' * $padRight)
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
# --- Display ---------------------------------------------------------------
|
|
87
|
+
Write-Host ''
|
|
88
|
+
Write-Host (" $tl$barLine$tr") -ForegroundColor Green
|
|
89
|
+
Write-Host (" $v" + (' ' * $innerWidth) + "$v") -ForegroundColor Green
|
|
90
|
+
Write-Host (" $v") -NoNewline -ForegroundColor Green
|
|
91
|
+
Write-Host (Pad-Centered 'A R K A O S' $innerWidth) -NoNewline -ForegroundColor White
|
|
92
|
+
Write-Host ("$v") -ForegroundColor Green
|
|
93
|
+
Write-Host (" $v" + (' ' * $innerWidth) + "$v") -ForegroundColor Green
|
|
94
|
+
Write-Host (" $v") -NoNewline -ForegroundColor Green
|
|
95
|
+
Write-Host (Pad-Centered 'The Operating System for AI Teams' $innerWidth) -NoNewline -ForegroundColor DarkGray
|
|
96
|
+
Write-Host ("$v") -ForegroundColor Green
|
|
97
|
+
Write-Host (" $v") -NoNewline -ForegroundColor Green
|
|
98
|
+
Write-Host (Pad-Centered 'by WizardingCode' $innerWidth) -NoNewline -ForegroundColor DarkGray
|
|
99
|
+
Write-Host ("$v") -ForegroundColor Green
|
|
100
|
+
Write-Host (" $v" + (' ' * $innerWidth) + "$v") -ForegroundColor Green
|
|
101
|
+
Write-Host (" $bl$barLine$br") -ForegroundColor Green
|
|
102
|
+
Write-Host ''
|
|
103
|
+
|
|
104
|
+
Write-Host " $greeting, $name " -NoNewline -ForegroundColor Cyan
|
|
105
|
+
Write-Host "($company)" -ForegroundColor DarkGray
|
|
106
|
+
Write-Host (" ArkaOS v$version $sep 65 agents $sep 17 departments $sep 244+ skills") -ForegroundColor DarkGray
|
|
107
|
+
if ($driftMsg) {
|
|
108
|
+
Write-Host ''
|
|
109
|
+
Write-Host " ! $driftMsg" -ForegroundColor Yellow
|
|
110
|
+
}
|
|
111
|
+
Write-Host ''
|
|
112
|
+
|
|
113
|
+
# --- Launch Claude ---------------------------------------------------------
|
|
114
|
+
# The bash wrapper uses `exec claude "$@"` which replaces the shell.
|
|
115
|
+
# PowerShell has no exec equivalent; `& claude @args` spawns a child and
|
|
116
|
+
# blocks until it exits. The net effect for the user is the same.
|
|
117
|
+
$claude = Get-Command claude -ErrorAction SilentlyContinue
|
|
118
|
+
if (-not $claude) {
|
|
119
|
+
Write-Host ''
|
|
120
|
+
Write-Host ' Error: `claude` not found on PATH.' -ForegroundColor Red
|
|
121
|
+
Write-Host ' Install Claude Code for Windows and re-run arka-claude.' -ForegroundColor DarkGray
|
|
122
|
+
exit 127
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
& claude @args
|
|
126
|
+
exit $LASTEXITCODE
|