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.
Files changed (48) hide show
  1. package/README.md +1 -1
  2. package/VERSION +1 -1
  3. package/arka/SKILL.md +4 -4
  4. package/arka/skills/costs/SKILL.md +1 -1
  5. package/arka/skills/fusion/SKILL.md +3 -3
  6. package/bin/arka +225 -0
  7. package/bin/arka-claude +64 -0
  8. package/bin/arka-claude.cmd +11 -0
  9. package/bin/arka-claude.ps1 +126 -0
  10. package/bin/arka-doctor +391 -0
  11. package/bin/arka-providers +261 -0
  12. package/bin/arka-py +46 -0
  13. package/bin/arka-py.cmd +9 -0
  14. package/bin/arka-py.ps1 +36 -0
  15. package/bin/arka-registry-gen +185 -0
  16. package/bin/arka-skill +300 -0
  17. package/bin/scheduler-daemon.py +48 -0
  18. package/config/claude-agents/marta-cqo.md +1 -1
  19. package/config/claude-agents/paulo-tech-lead.md +1 -1
  20. package/config/constitution.yaml +5 -5
  21. package/config/hooks/_lib/arka_python.ps1 +43 -0
  22. package/config/hooks/_lib/arka_python.sh +63 -0
  23. package/config/hooks/agent-provision.sh +8 -1
  24. package/config/hooks/cwd-changed.sh +6 -2
  25. package/config/hooks/post-tool-use-v2.sh +6 -2
  26. package/config/hooks/post-tool-use.sh +8 -17
  27. package/config/hooks/pre-tool-use.ps1 +8 -6
  28. package/config/hooks/pre-tool-use.sh +8 -17
  29. package/config/hooks/session-start.sh +23 -21
  30. package/config/hooks/stop.ps1 +7 -5
  31. package/config/hooks/stop.sh +8 -17
  32. package/config/hooks/token-hygiene.sh +5 -1
  33. package/config/hooks/user-prompt-submit-v2.sh +13 -9
  34. package/config/hooks/user-prompt-submit.sh +8 -17
  35. package/core/hooks/__pycache__/post_tool_use.cpython-312.pyc +0 -0
  36. package/core/hooks/__pycache__/pre_tool_use.cpython-312.pyc +0 -0
  37. package/core/runtime/__pycache__/cost_governor.cpython-312.pyc +0 -0
  38. package/core/runtime/__pycache__/llm_provider.cpython-312.pyc +0 -0
  39. package/core/runtime/__pycache__/openrouter_provider.cpython-312.pyc +0 -0
  40. package/core/workflow/state_reader.sh +12 -5
  41. package/departments/ops/skills/update/SKILL.md +2 -2
  42. package/departments/ops/skills/update/references/sync-engine.md +1 -1
  43. package/departments/quality/SKILL.md +1 -1
  44. package/installer/index.js +14 -0
  45. package/installer/update.js +31 -0
  46. package/package.json +6 -3
  47. package/pyproject.toml +1 -1
  48. 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
- python -m core.release.preflight_cli --expected-npm-user <user>
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
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 `python -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 `python -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 `python -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 `python -m core.cognition.reorganizer_cli [--since-days N] [--dry-run]`. |
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
- python -m core.runtime.llm_cost_telemetry_cli <period>
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
- python -m core.runtime.model_router_cli discover # Ollama + local models
28
- python -m core.runtime.model_router_cli --json # current routing
29
- python -m core.runtime.model_router_cli usage --period week --json
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
@@ -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