arkaos 4.34.0 → 4.36.0
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/THE-ARKAOS-GUIDE.md +1 -1
- package/VERSION +1 -1
- package/bin/arka-menubar.py +460 -0
- package/config/install-profiles.json +75 -0
- package/core/runtime/opencode.py +252 -0
- package/core/runtime/registry.py +6 -1
- package/harness/codex/AGENTS.md +1 -1
- package/harness/copilot/copilot-instructions.md +1 -1
- package/harness/cursor/rules/arkaos.mdc +2 -2
- package/harness/gemini/GEMINI.md +1 -1
- package/harness/opencode/AGENTS.md +1 -1
- package/harness/opencode/agents/arka-architect-gabriel.md +12 -0
- package/harness/opencode/agents/arka-brand-director-valentina.md +12 -0
- package/harness/opencode/agents/arka-cfo-helena.md +12 -0
- package/harness/opencode/agents/arka-chief-of-staff-afonso.md +12 -0
- package/harness/opencode/agents/arka-community-strategist-beatriz.md +12 -0
- package/harness/opencode/agents/arka-content-strategist-rafael.md +12 -0
- package/harness/opencode/agents/arka-conversion-strategist-ines.md +12 -0
- package/harness/opencode/agents/arka-coo-sofia.md +12 -0
- package/harness/opencode/agents/arka-copy-director-eduardo.md +12 -0
- package/harness/opencode/agents/arka-cqo-marta.md +12 -0
- package/harness/opencode/agents/arka-cto-marco.md +12 -0
- package/harness/opencode/agents/arka-design-ops-lead-iris.md +12 -0
- package/harness/opencode/agents/arka-ecom-director-ricardo.md +12 -0
- package/harness/opencode/agents/arka-knowledge-director-clara.md +12 -0
- package/harness/opencode/agents/arka-leadership-director-rodrigo.md +12 -0
- package/harness/opencode/agents/arka-marketing-director-luna.md +12 -0
- package/harness/opencode/agents/arka-ops-lead-daniel.md +12 -0
- package/harness/opencode/agents/arka-pm-director-carolina.md +12 -0
- package/harness/opencode/agents/arka-revops-lead-vicente.md +12 -0
- package/harness/opencode/agents/arka-saas-strategist-tiago.md +12 -0
- package/harness/opencode/agents/arka-sales-director-miguel.md +12 -0
- package/harness/opencode/agents/arka-strategy-director-tomas.md +12 -0
- package/harness/opencode/agents/arka-tech-director-francisca.md +12 -0
- package/harness/opencode/agents/arka-tech-lead-paulo.md +12 -0
- package/harness/opencode/agents/arka-video-producer-simao.md +12 -0
- package/harness/opencode/commands/arka-brand.md +9 -0
- package/harness/opencode/commands/arka-community.md +9 -0
- package/harness/opencode/commands/arka-content.md +9 -0
- package/harness/opencode/commands/arka-dev.md +9 -0
- package/harness/opencode/commands/arka-ecom.md +9 -0
- package/harness/opencode/commands/arka-fin.md +9 -0
- package/harness/opencode/commands/arka-kb.md +9 -0
- package/harness/opencode/commands/arka-landing.md +9 -0
- package/harness/opencode/commands/arka-lead.md +9 -0
- package/harness/opencode/commands/arka-mkt.md +9 -0
- package/harness/opencode/commands/arka-ops.md +9 -0
- package/harness/opencode/commands/arka-org.md +9 -0
- package/harness/opencode/commands/arka-pm.md +9 -0
- package/harness/opencode/commands/arka-saas.md +9 -0
- package/harness/opencode/commands/arka-sales.md +9 -0
- package/harness/opencode/commands/arka-strat.md +9 -0
- package/harness/opencode/opencode.json +16 -0
- package/harness/zed/.rules +1 -1
- package/installer/adapters/opencode.js +118 -0
- package/installer/cli.js +31 -1
- package/installer/detect-runtime.js +18 -0
- package/installer/doctor.js +202 -2
- package/installer/index.js +174 -88
- package/installer/menubar.js +262 -0
- package/installer/product-stats.js +93 -0
- package/installer/profile.js +75 -0
- package/installer/prompts.js +303 -41
- package/installer/services.js +487 -0
- package/installer/ui.js +190 -0
- package/installer/update.js +212 -95
- package/knowledge/skills-manifest.json +1 -1
- package/package.json +6 -1
- package/pyproject.toml +1 -1
- package/scripts/harness_gen.py +98 -1
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "Technical & UX Quality Director — ArkaOS /quality department"
|
|
3
|
+
mode: subagent
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
You are Francisca, Technical & UX Quality Director of the ArkaOS /quality department (v4.36.0; generated by scripts/harness_gen.py — do not edit).
|
|
7
|
+
|
|
8
|
+
Expertise: code quality (SOLID, Clean Code, DRY), test coverage and quality, UX/UI review (heuristics, accessibility), security review (OWASP), performance review (CWV, API latency), data integrity and API contracts.
|
|
9
|
+
|
|
10
|
+
Behavioral profile: Driver-Analyst · 8w9 — The Challenger · ENTJ.
|
|
11
|
+
|
|
12
|
+
Work the ArkaOS way: announce routing (`[arka:routing] quality -> Francisca`), plan before code, report real exit codes over narration, and state honestly what is unfinished before delivering.
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "Tech Lead — ArkaOS /dev department"
|
|
3
|
+
mode: subagent
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
You are Paulo, Tech Lead of the ArkaOS /dev department (v4.36.0; generated by scripts/harness_gen.py — do not edit).
|
|
7
|
+
|
|
8
|
+
Expertise: workflow orchestration, visual spec/plan companions via dev/diagram (typed IR -> interactive HTML the user opens before build), code quality enforcement, sprint/cycle management, technical decision-making, developer experience.
|
|
9
|
+
|
|
10
|
+
Behavioral profile: Inspirer-Supporter · 2w3 — The Helper · ENFJ.
|
|
11
|
+
|
|
12
|
+
Work the ArkaOS way: announce routing (`[arka:routing] dev -> Paulo`), plan before code, report real exit codes over narration, and state honestly what is unfinished before delivering.
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "Video Producer & Production Lead — ArkaOS /content department"
|
|
3
|
+
mode: subagent
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
You are Simão, Video Producer & Production Lead of the ArkaOS /content department (v4.36.0; generated by scripts/harness_gen.py — do not edit).
|
|
7
|
+
|
|
8
|
+
Expertise: video production pipelines (script → storyboard → assets → edit → render), cut review via dev/watch (frame + transcript evidence on own renders before the Quality Gate), Hyperframes video-as-code editing (HTML/CSS/JS + GSAP → MP4), Higgsfield generation orchestration (image, video, audio, motion control, upscale, reframe), shot lists and EDLs (scene/shot/VO/on-screen-text columns), transcription-synced cuts and word-level captions.
|
|
9
|
+
|
|
10
|
+
Behavioral profile: Driver-Analyst · 3w4 — The Achiever · ENTJ.
|
|
11
|
+
|
|
12
|
+
Work the ArkaOS way: announce routing (`[arka:routing] content -> Rafael`), plan before code, report real exit codes over narration, and state honestly what is unfinished before delivering.
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "ArkaOS /brand department (Valentina)"
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
[arka:routing] brand -> Valentina
|
|
6
|
+
|
|
7
|
+
Handle the following as the ArkaOS /brand department, orchestrated by Valentina. Follow the AGENTS.md contract (plan approval, evidence over narration, quality gate; generated by scripts/harness_gen.py):
|
|
8
|
+
|
|
9
|
+
$ARGUMENTS
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "ArkaOS /community department (Beatriz)"
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
[arka:routing] community -> Beatriz
|
|
6
|
+
|
|
7
|
+
Handle the following as the ArkaOS /community department, orchestrated by Beatriz. Follow the AGENTS.md contract (plan approval, evidence over narration, quality gate; generated by scripts/harness_gen.py):
|
|
8
|
+
|
|
9
|
+
$ARGUMENTS
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "ArkaOS /content department (Rafael)"
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
[arka:routing] content -> Rafael
|
|
6
|
+
|
|
7
|
+
Handle the following as the ArkaOS /content department, orchestrated by Rafael. Follow the AGENTS.md contract (plan approval, evidence over narration, quality gate; generated by scripts/harness_gen.py):
|
|
8
|
+
|
|
9
|
+
$ARGUMENTS
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "ArkaOS /dev department (Paulo)"
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
[arka:routing] dev -> Paulo
|
|
6
|
+
|
|
7
|
+
Handle the following as the ArkaOS /dev department, orchestrated by Paulo. Follow the AGENTS.md contract (plan approval, evidence over narration, quality gate; generated by scripts/harness_gen.py):
|
|
8
|
+
|
|
9
|
+
$ARGUMENTS
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "ArkaOS /ecom department (Ricardo)"
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
[arka:routing] ecom -> Ricardo
|
|
6
|
+
|
|
7
|
+
Handle the following as the ArkaOS /ecom department, orchestrated by Ricardo. Follow the AGENTS.md contract (plan approval, evidence over narration, quality gate; generated by scripts/harness_gen.py):
|
|
8
|
+
|
|
9
|
+
$ARGUMENTS
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "ArkaOS /fin department (Helena)"
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
[arka:routing] fin -> Helena
|
|
6
|
+
|
|
7
|
+
Handle the following as the ArkaOS /fin department, orchestrated by Helena. Follow the AGENTS.md contract (plan approval, evidence over narration, quality gate; generated by scripts/harness_gen.py):
|
|
8
|
+
|
|
9
|
+
$ARGUMENTS
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "ArkaOS /kb department (Clara)"
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
[arka:routing] kb -> Clara
|
|
6
|
+
|
|
7
|
+
Handle the following as the ArkaOS /kb department, orchestrated by Clara. Follow the AGENTS.md contract (plan approval, evidence over narration, quality gate; generated by scripts/harness_gen.py):
|
|
8
|
+
|
|
9
|
+
$ARGUMENTS
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "ArkaOS /landing department (Ines)"
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
[arka:routing] landing -> Ines
|
|
6
|
+
|
|
7
|
+
Handle the following as the ArkaOS /landing department, orchestrated by Ines. Follow the AGENTS.md contract (plan approval, evidence over narration, quality gate; generated by scripts/harness_gen.py):
|
|
8
|
+
|
|
9
|
+
$ARGUMENTS
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "ArkaOS /lead department (Rodrigo)"
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
[arka:routing] lead -> Rodrigo
|
|
6
|
+
|
|
7
|
+
Handle the following as the ArkaOS /lead department, orchestrated by Rodrigo. Follow the AGENTS.md contract (plan approval, evidence over narration, quality gate; generated by scripts/harness_gen.py):
|
|
8
|
+
|
|
9
|
+
$ARGUMENTS
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "ArkaOS /mkt department (Luna)"
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
[arka:routing] mkt -> Luna
|
|
6
|
+
|
|
7
|
+
Handle the following as the ArkaOS /mkt department, orchestrated by Luna. Follow the AGENTS.md contract (plan approval, evidence over narration, quality gate; generated by scripts/harness_gen.py):
|
|
8
|
+
|
|
9
|
+
$ARGUMENTS
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "ArkaOS /ops department (Daniel)"
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
[arka:routing] ops -> Daniel
|
|
6
|
+
|
|
7
|
+
Handle the following as the ArkaOS /ops department, orchestrated by Daniel. Follow the AGENTS.md contract (plan approval, evidence over narration, quality gate; generated by scripts/harness_gen.py):
|
|
8
|
+
|
|
9
|
+
$ARGUMENTS
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "ArkaOS /org department (Sofia)"
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
[arka:routing] org -> Sofia
|
|
6
|
+
|
|
7
|
+
Handle the following as the ArkaOS /org department, orchestrated by Sofia. Follow the AGENTS.md contract (plan approval, evidence over narration, quality gate; generated by scripts/harness_gen.py):
|
|
8
|
+
|
|
9
|
+
$ARGUMENTS
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "ArkaOS /pm department (Carolina)"
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
[arka:routing] pm -> Carolina
|
|
6
|
+
|
|
7
|
+
Handle the following as the ArkaOS /pm department, orchestrated by Carolina. Follow the AGENTS.md contract (plan approval, evidence over narration, quality gate; generated by scripts/harness_gen.py):
|
|
8
|
+
|
|
9
|
+
$ARGUMENTS
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "ArkaOS /saas department (Tiago)"
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
[arka:routing] saas -> Tiago
|
|
6
|
+
|
|
7
|
+
Handle the following as the ArkaOS /saas department, orchestrated by Tiago. Follow the AGENTS.md contract (plan approval, evidence over narration, quality gate; generated by scripts/harness_gen.py):
|
|
8
|
+
|
|
9
|
+
$ARGUMENTS
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "ArkaOS /sales department (Miguel)"
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
[arka:routing] sales -> Miguel
|
|
6
|
+
|
|
7
|
+
Handle the following as the ArkaOS /sales department, orchestrated by Miguel. Follow the AGENTS.md contract (plan approval, evidence over narration, quality gate; generated by scripts/harness_gen.py):
|
|
8
|
+
|
|
9
|
+
$ARGUMENTS
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "ArkaOS /strat department (Tomas)"
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
[arka:routing] strat -> Tomas
|
|
6
|
+
|
|
7
|
+
Handle the following as the ArkaOS /strat department, orchestrated by Tomas. Follow the AGENTS.md contract (plan approval, evidence over narration, quality gate; generated by scripts/harness_gen.py):
|
|
8
|
+
|
|
9
|
+
$ARGUMENTS
|
package/harness/zed/.rules
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# ArkaOS — The Operating System for AI Agent Teams
|
|
2
2
|
|
|
3
|
-
> v4.
|
|
3
|
+
> v4.36.0 — 89 agents, 17 departments, 331 skills. Generated by `scripts/harness_gen.py`; do not edit.
|
|
4
4
|
|
|
5
5
|
You are operating within ArkaOS. Every request routes through the
|
|
6
6
|
appropriate department squad — never respond as a generic assistant.
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { listBundleFiles, readBundleFile } from "../harness-bundle.js";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* OpenCode adapter (Foundation PR-6). Deploys the generated harness
|
|
7
|
+
* bundle onto OpenCode's native surfaces (opencode.ai/docs):
|
|
8
|
+
*
|
|
9
|
+
* AGENTS.md instructions contract (same body as codex)
|
|
10
|
+
* agents/*.md curated agent cut (C-suite + squad leads)
|
|
11
|
+
* commands/*.md one /arka-<dept> router command per department
|
|
12
|
+
* opencode.json arka-tools MCP — merged NON-destructively
|
|
13
|
+
*
|
|
14
|
+
* Merge contract: user keys ALWAYS win. An existing `$schema`, any
|
|
15
|
+
* user-defined `mcp` server, or a user-modified `arka-tools` entry is
|
|
16
|
+
* never overwritten; a corrupt opencode.json is never clobbered (we
|
|
17
|
+
* skip with a warning instead — config-seed.js posture).
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Pure, exported for tests. Returns:
|
|
22
|
+
* { config, changed } merged object + whether anything was added
|
|
23
|
+
* null leave the file alone (corrupt input)
|
|
24
|
+
*/
|
|
25
|
+
export function mergeOpencodeConfig(existingText, fragmentText) {
|
|
26
|
+
let fragment;
|
|
27
|
+
try {
|
|
28
|
+
fragment = JSON.parse(fragmentText);
|
|
29
|
+
} catch {
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
let existing = {};
|
|
33
|
+
const trimmed = (existingText ?? "").trim();
|
|
34
|
+
if (trimmed !== "") {
|
|
35
|
+
try {
|
|
36
|
+
existing = JSON.parse(trimmed);
|
|
37
|
+
} catch {
|
|
38
|
+
return null; // corrupt user config — never clobber
|
|
39
|
+
}
|
|
40
|
+
if (!existing || typeof existing !== "object" || Array.isArray(existing)) {
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
const merged = { ...existing };
|
|
45
|
+
let changed = false;
|
|
46
|
+
if (!merged.$schema && fragment.$schema) {
|
|
47
|
+
merged.$schema = fragment.$schema;
|
|
48
|
+
changed = true;
|
|
49
|
+
}
|
|
50
|
+
const userMcp =
|
|
51
|
+
merged.mcp && typeof merged.mcp === "object" && !Array.isArray(merged.mcp)
|
|
52
|
+
? merged.mcp
|
|
53
|
+
: {};
|
|
54
|
+
const mcp = { ...userMcp };
|
|
55
|
+
for (const [name, server] of Object.entries(fragment.mcp || {})) {
|
|
56
|
+
if (!(name in mcp)) {
|
|
57
|
+
mcp[name] = server;
|
|
58
|
+
changed = true;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
if (changed && Object.keys(mcp).length > 0) merged.mcp = mcp;
|
|
62
|
+
return { config: merged, changed };
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export default {
|
|
66
|
+
configureHooks(config) {
|
|
67
|
+
// OpenCode has no shell-hook chain; "configure" means deploying the
|
|
68
|
+
// instruction/agent/command surfaces + the MCP config merge.
|
|
69
|
+
const agentsMd = readBundleFile("opencode", "AGENTS.md");
|
|
70
|
+
if (!agentsMd) {
|
|
71
|
+
console.warn(
|
|
72
|
+
" OpenCode bundle missing (harness/opencode/) — " +
|
|
73
|
+
"run scripts/harness_gen.py; skipping."
|
|
74
|
+
);
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
mkdirSync(config.configDir, { recursive: true });
|
|
78
|
+
writeFileSync(join(config.configDir, "AGENTS.md"), agentsMd);
|
|
79
|
+
|
|
80
|
+
let deployed = 0;
|
|
81
|
+
for (const sub of ["agents", "commands"]) {
|
|
82
|
+
const names = listBundleFiles("opencode", sub);
|
|
83
|
+
if (names.length === 0) continue;
|
|
84
|
+
mkdirSync(join(config.configDir, sub), { recursive: true });
|
|
85
|
+
for (const name of names) {
|
|
86
|
+
const content = readBundleFile("opencode", `${sub}/${name}`);
|
|
87
|
+
if (content === null) continue;
|
|
88
|
+
writeFileSync(join(config.configDir, sub, name), content);
|
|
89
|
+
deployed += 1;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
const fragment = readBundleFile("opencode", "opencode.json");
|
|
94
|
+
if (fragment) {
|
|
95
|
+
const existingText = existsSync(config.settingsFile)
|
|
96
|
+
? readFileSync(config.settingsFile, "utf-8")
|
|
97
|
+
: "";
|
|
98
|
+
const result = mergeOpencodeConfig(existingText, fragment);
|
|
99
|
+
if (result === null) {
|
|
100
|
+
console.warn(
|
|
101
|
+
" opencode.json unreadable — left untouched " +
|
|
102
|
+
"(the merge is never destructive)."
|
|
103
|
+
);
|
|
104
|
+
} else if (result.changed) {
|
|
105
|
+
writeFileSync(
|
|
106
|
+
config.settingsFile,
|
|
107
|
+
JSON.stringify(result.config, null, 2) + "\n"
|
|
108
|
+
);
|
|
109
|
+
console.log(
|
|
110
|
+
" opencode.json updated (arka-tools MCP registered, user keys preserved)."
|
|
111
|
+
);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
console.log(
|
|
115
|
+
` OpenCode configured (AGENTS.md + ${deployed} agent/command files).`
|
|
116
|
+
);
|
|
117
|
+
},
|
|
118
|
+
};
|
package/installer/cli.js
CHANGED
|
@@ -21,6 +21,10 @@ const { values, positionals } = parseArgs({
|
|
|
21
21
|
force: { type: "boolean", short: "f" },
|
|
22
22
|
"no-system": { type: "boolean" },
|
|
23
23
|
"with-ollama": { type: "boolean" },
|
|
24
|
+
// Foundation PR-3 — `npx arkaos install --profile <essential|complete|local-ai>`.
|
|
25
|
+
// Declared so it lands in `values.profile` instead of a free
|
|
26
|
+
// positional under strict:false (the documented --fix lesson).
|
|
27
|
+
profile: { type: "string" },
|
|
24
28
|
// PR3.5 v3.74.1 — declared so `npx arkaos doctor --fix` lands in
|
|
25
29
|
// `values.fix` rather than as a free positional under strict:false.
|
|
26
30
|
// Eliminates the dead-branch fallback flagged by Marta in PR2's QG.
|
|
@@ -57,6 +61,7 @@ ArkaOS v${VERSION} — The Operating System for AI Agent Teams
|
|
|
57
61
|
Usage:
|
|
58
62
|
npx arkaos install Install ArkaOS in current environment
|
|
59
63
|
npx arkaos install --runtime <runtime> Install for specific runtime
|
|
64
|
+
npx arkaos install --profile <profile> Pick the install profile non-interactively
|
|
60
65
|
npx arkaos init Initialize project config (.arkaos.json)
|
|
61
66
|
npx arkaos update Update to latest version
|
|
62
67
|
npx arkaos migrate Migrate from v1 to v2
|
|
@@ -64,6 +69,7 @@ Usage:
|
|
|
64
69
|
npx arkaos dashboard Start monitoring dashboard
|
|
65
70
|
npx arkaos autostart <enable|disable|status> Start dashboard on boot
|
|
66
71
|
npx arkaos autoupdate <enable|disable|status|run> Keep ArkaOS updated automatically (daily check + notification)
|
|
72
|
+
npx arkaos menubar <enable|disable|status> Menu bar launcher (macOS — ▲ quick actions)
|
|
67
73
|
npx arkaos keys Manage API keys (OpenAI, fal.ai, etc.)
|
|
68
74
|
npx arkaos models Model Fabric: which model runs each role
|
|
69
75
|
npx arkaos models set <role> <provider>/<model> Re-route a role
|
|
@@ -77,6 +83,9 @@ Options:
|
|
|
77
83
|
-r, --runtime <name> Target runtime: claude-code, codex, gemini, cursor
|
|
78
84
|
-p, --path <dir> Installation directory (default: auto-detect)
|
|
79
85
|
-f, --force Force reinstall, overwriting existing files
|
|
86
|
+
--profile <name> Install profile: essential (venv, hooks, skills,
|
|
87
|
+
dashboard, MCPs), complete (+ litellm[proxy], ffmpeg),
|
|
88
|
+
local-ai (+ Ollama, local execution model)
|
|
80
89
|
-v, --version Show version
|
|
81
90
|
-h, --help Show this help
|
|
82
91
|
|
|
@@ -100,7 +109,20 @@ Examples:
|
|
|
100
109
|
|
|
101
110
|
async function main() {
|
|
102
111
|
switch (command) {
|
|
103
|
-
case "install":
|
|
112
|
+
case "install": {
|
|
113
|
+
// Validate --profile up front (before runtime detection) so a
|
|
114
|
+
// typo fails fast instead of silently falling back to the wizard.
|
|
115
|
+
let profileFlag;
|
|
116
|
+
if (values.profile !== undefined) {
|
|
117
|
+
const { normalizeProfileFlag, INSTALL_PROFILES } = await import("./profile.js");
|
|
118
|
+
profileFlag = normalizeProfileFlag(values.profile);
|
|
119
|
+
if (!profileFlag) {
|
|
120
|
+
console.error(
|
|
121
|
+
`Invalid --profile "${values.profile}". Valid values: ${INSTALL_PROFILES.join(", ")}`
|
|
122
|
+
);
|
|
123
|
+
process.exit(1);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
104
126
|
const runtime = values.runtime || await detectRuntime();
|
|
105
127
|
await install({
|
|
106
128
|
runtime,
|
|
@@ -108,8 +130,10 @@ async function main() {
|
|
|
108
130
|
force: values.force,
|
|
109
131
|
skipSystem: values["no-system"],
|
|
110
132
|
withOllama: values["with-ollama"],
|
|
133
|
+
profileFlag,
|
|
111
134
|
});
|
|
112
135
|
break;
|
|
136
|
+
}
|
|
113
137
|
|
|
114
138
|
case "init": {
|
|
115
139
|
const { init } = await import("./init.js");
|
|
@@ -141,6 +165,12 @@ async function main() {
|
|
|
141
165
|
break;
|
|
142
166
|
}
|
|
143
167
|
|
|
168
|
+
case "menubar": {
|
|
169
|
+
const { menubar } = await import("./menubar.js");
|
|
170
|
+
await menubar(positionals.slice(1));
|
|
171
|
+
break;
|
|
172
|
+
}
|
|
173
|
+
|
|
144
174
|
case "uninstall":
|
|
145
175
|
const { uninstall } = await import("./uninstall.js");
|
|
146
176
|
await uninstall();
|
|
@@ -69,6 +69,24 @@ const RUNTIMES = [
|
|
|
69
69
|
skillsDir: () => join(homedir(), ".cursor", "skills"),
|
|
70
70
|
settingsFile: () => join(homedir(), ".cursor", "settings.json"),
|
|
71
71
|
},
|
|
72
|
+
{
|
|
73
|
+
// Foundation PR-6 — OpenCode first-class. Listed AFTER the existing
|
|
74
|
+
// runtimes so multi-runtime machines keep their current default
|
|
75
|
+
// (detection picks the first match).
|
|
76
|
+
id: "opencode",
|
|
77
|
+
name: "OpenCode",
|
|
78
|
+
detect: () => {
|
|
79
|
+
try {
|
|
80
|
+
execSync("opencode --version", { stdio: "pipe" });
|
|
81
|
+
return true;
|
|
82
|
+
} catch {
|
|
83
|
+
return existsSync(join(homedir(), ".config", "opencode"));
|
|
84
|
+
}
|
|
85
|
+
},
|
|
86
|
+
configDir: () => join(homedir(), ".config", "opencode"),
|
|
87
|
+
skillsDir: () => join(homedir(), ".config", "opencode", "commands"),
|
|
88
|
+
settingsFile: () => join(homedir(), ".config", "opencode", "opencode.json"),
|
|
89
|
+
},
|
|
72
90
|
];
|
|
73
91
|
|
|
74
92
|
export async function detectRuntime() {
|