arkaos 4.13.0 → 4.13.2

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 (36) hide show
  1. package/VERSION +1 -1
  2. package/bin/arka-doctor +15 -1
  3. package/core/governance/__pycache__/evidence_checks.cpython-313.pyc +0 -0
  4. package/core/governance/evidence_checks.py +85 -4
  5. package/core/workflow/__pycache__/design_authorization.cpython-313.pyc +0 -0
  6. package/core/workflow/__pycache__/frontend_gate.cpython-313.pyc +0 -0
  7. package/core/workflow/design_authorization.py +106 -0
  8. package/core/workflow/frontend_gate.py +54 -22
  9. package/dashboard/app/app.config.ts +2 -2
  10. package/dashboard/app/assets/css/main.css +285 -13
  11. package/dashboard/app/components/ArkaConstellation.vue +239 -0
  12. package/dashboard/app/components/ArkaCountUp.vue +35 -0
  13. package/dashboard/app/components/ArkaGlowCard.vue +25 -0
  14. package/dashboard/app/components/ArkaLiveFeed.vue +122 -0
  15. package/dashboard/app/components/ArkaNavGroupLabel.vue +11 -0
  16. package/dashboard/app/components/ArkaPageHero.vue +42 -0
  17. package/dashboard/app/components/ArkaSection.vue +20 -0
  18. package/dashboard/app/components/ArkaStarfield.vue +3 -0
  19. package/dashboard/app/components/ArkaStatCard.vue +38 -0
  20. package/dashboard/app/components/ArkaSystemPill.vue +54 -0
  21. package/dashboard/app/components/ArkaTrendChart.vue +68 -0
  22. package/dashboard/app/composables/useCountUp.ts +30 -0
  23. package/dashboard/app/composables/useDashboard.ts +2 -1
  24. package/dashboard/app/composables/useTaskStream.ts +39 -0
  25. package/dashboard/app/layouts/default.vue +11 -2
  26. package/dashboard/app/pages/design-lab.vue +257 -0
  27. package/dashboard/app/pages/index.vue +268 -213
  28. package/dashboard/nuxt.config.ts +21 -0
  29. package/dashboard/package.json +1 -0
  30. package/departments/content/skills/video-produce/SKILL.md +9 -1
  31. package/departments/content/skills/video-setup/SKILL.md +15 -4
  32. package/installer/core-snapshot.js +44 -20
  33. package/installer/doctor.js +13 -8
  34. package/package.json +1 -1
  35. package/pyproject.toml +1 -1
  36. package/scripts/start-dashboard.sh +3 -1
@@ -61,7 +61,15 @@ tier PER CAPABILITY. Print the matrix, state the tiers chosen, proceed
61
61
  `upscale`/`reframe`. → **user approval on generated assets —
62
62
  Higgsfield credits are metered; NEVER regenerate in a loop without
63
63
  explicit approval.**
64
- 6. **Edit / render** — load the `/hyperframes` router skill, pick the
64
+ 6. **Edit / render** — PREFLIGHT (one line, mandatory before the Full
65
+ tier): if `ls ~/.claude/skills | grep -qi hyperframes` fails, STOP
66
+ with the exact message "Hyperframes não instalado — corre
67
+ /content video-setup" — NEVER load `/hyperframes` blind or improvise
68
+ what Hyperframes might be. (Tier degradation is a Phase 0 decision;
69
+ reaching this step on the Full tier with the skills missing means
70
+ setup drift: the honest move is the stop + fix command, or an
71
+ explicitly re-stated downgrade to the Degraded/Manual tier.)
72
+ Full tier: load the `/hyperframes` router skill, pick the
65
73
  workflow (`/talking-head-recut`, `/faceless-explainer`,
66
74
  `/product-launch-video`…), compose in HTML+GSAP (load `gsap-core` +
67
75
  `gsap-timeline` for motion graphics; `gsap-plugins` for kinetic
@@ -47,10 +47,21 @@ installer side — this skill is the interactive fix path.
47
47
  `/faceless-explainer`, `/product-launch-video`, `/motion-graphics`,
48
48
  `/embedded-captions`, `/media-use`. Keep fresh later with
49
49
  `npx hyperframes skills update <workflow>`.
50
- 2. **Agent-Reach CLI** (MIT, beta): install into an isolated tool env —
51
- `pipx install agent-reach` (or `uv tool install agent-reach`),
52
- NEVER a bare global pip (python-core rule: virtual environments
53
- only). Then run `agent-reach doctor` and show the user which of the
50
+ 2. **Agent-Reach CLI** (MIT, beta THIRD-PARTY GitHub code, NOT on
51
+ PyPI): the package `agent-reach` does NOT exist in any registry —
52
+ `pipx install agent-reach` / `uv tool install agent-reach` fail with
53
+ "not found in registry" (verified 2026-07-11). The only source is
54
+ the external third-party repo `github.com/Panniantong/Agent-Reach`
55
+ (author: Panniantong, MIT license). Installing it runs code straight
56
+ from that repo, so this step is DOUBLE-gated: show the user the
57
+ source URL and license, and only after their explicit confirmation
58
+ run, into an isolated tool env — NEVER a bare global pip
59
+ (python-core rule: virtual environments only):
60
+ ```
61
+ uv tool install "git+https://github.com/Panniantong/Agent-Reach"
62
+ ```
63
+ (or `pipx install "git+https://github.com/Panniantong/Agent-Reach"`).
64
+ Then run `agent-reach doctor` and show the user which of the
54
65
  15 platform backends are live; cookie/browser-session platforms
55
66
  (X, Reddit, IG, FB) need the user's own logged sessions and stay
56
67
  optional.
@@ -8,14 +8,22 @@ import {
8
8
  } from "node:fs";
9
9
  import { join, basename } from "node:path";
10
10
 
11
- // Deploys a stable snapshot of the Python core package (+ VERSION) into
11
+ // Deploys a stable snapshot of the ArkaOS root (+ VERSION) into
12
12
  // ~/.arkaos/lib. `.repo-path` points at whichever npx cache last ran an
13
13
  // install/update — a location `npm cache clean` can purge at any time.
14
14
  // When that happens, every `arka-py -m core.*` entrypoint (hooks,
15
- // /arka update, telemetry CLIs) loses the core package unless it runs
16
- // from a dev checkout. The snapshot is the always-present fallback that
15
+ // /arka update, telemetry CLIs) loses the package unless it runs from a
16
+ // dev checkout. The snapshot is the always-present fallback that
17
17
  // bin/arka-py and core/hooks/_shared.py validate against.
18
18
  //
19
+ // The snapshot must contain every directory the Python core reads
20
+ // root-relative, not just core/ itself — resolve_arkaos_root() hands the
21
+ // snapshot out as a full package root. Known readers: config/
22
+ // (content_syncer, policy_loader, settings_syncer), departments/
23
+ // (agent_provisioner), knowledge/ (registry_gen, registry/generator).
24
+ // A core/-only snapshot broke /arka update on a purged npx cache
25
+ // (v4.13.0: 75× missing user-claude.md, 704× missing agent files).
26
+ //
19
27
  // core/sync/__init__.py is the validation marker: it distinguishes the
20
28
  // full package from the cognitive scheduler's minimal core/ copy in
21
29
  // ~/.arkaos/core (cognition + workflow only).
@@ -23,31 +31,47 @@ import { join, basename } from "node:path";
23
31
  // Shared by installer/index.js (fresh install) and installer/update.js —
24
32
  // same single-implementation rationale as hook-lib.js: the v4.3.2
25
33
  // regression existed because two deploy loops drifted.
34
+ // core/ is deployed LAST: its sync/__init__.py is the validation marker
35
+ // resolve_arkaos_root() checks, so a crash mid-deploy on a fresh install
36
+ // leaves a snapshot that fails validation instead of a core-only root
37
+ // that validates but lacks config/departments/knowledge.
38
+ const SNAPSHOT_DIRS = ["config", "departments", "knowledge", "core"];
39
+
26
40
  export function deployCoreSnapshot(arkaosRoot, installDir) {
27
- const srcCore = join(arkaosRoot, "core");
28
- if (!existsSync(join(srcCore, "sync", "__init__.py"))) return false;
41
+ if (!existsSync(join(arkaosRoot, "core", "sync", "__init__.py"))) return false;
29
42
 
30
43
  const libDir = join(installDir, "lib");
31
- const destCore = join(libDir, "core");
32
- const staging = join(libDir, ".core.staging");
33
- const previous = join(libDir, ".core.previous");
44
+ for (const dir of SNAPSHOT_DIRS) {
45
+ const src = join(arkaosRoot, dir);
46
+ // Only core/ is guaranteed by the marker check above; a source
47
+ // missing an optional dir keeps whatever snapshot already exists
48
+ // rather than deleting it.
49
+ if (!existsSync(src)) continue;
50
+ swapInto(src, libDir, dir);
51
+ }
52
+
53
+ const versionFile = join(arkaosRoot, "VERSION");
54
+ if (existsSync(versionFile)) copyFileSync(versionFile, join(libDir, "VERSION"));
55
+ return true;
56
+ }
57
+
58
+ // Stage + swap so a crash at any point never destroys the last good
59
+ // snapshot: the new tree is fully written to staging first, the old
60
+ // snapshot is only moved aside (not deleted) before the swap, and its
61
+ // removal is the final step.
62
+ function swapInto(src, libDir, dir) {
63
+ const dest = join(libDir, dir);
64
+ const staging = join(libDir, `.${dir}.staging`);
65
+ const previous = join(libDir, `.${dir}.previous`);
34
66
 
35
- // Stage + swap so a crash at any point never destroys the last good
36
- // snapshot: the new tree is fully written to staging first, the old
37
- // snapshot is only moved aside (not deleted) before the swap, and its
38
- // removal is the final step.
39
67
  rmSync(staging, { recursive: true, force: true });
40
68
  rmSync(previous, { recursive: true, force: true });
41
69
  mkdirSync(staging, { recursive: true });
42
- cpSync(srcCore, staging, {
70
+ cpSync(src, staging, {
43
71
  recursive: true,
44
- filter: (src) => basename(src) !== "__pycache__",
72
+ filter: (path) => basename(path) !== "__pycache__",
45
73
  });
46
- if (existsSync(destCore)) renameSync(destCore, previous);
47
- renameSync(staging, destCore);
74
+ if (existsSync(dest)) renameSync(dest, previous);
75
+ renameSync(staging, dest);
48
76
  rmSync(previous, { recursive: true, force: true });
49
-
50
- const versionFile = join(arkaosRoot, "VERSION");
51
- if (existsSync(versionFile)) copyFileSync(versionFile, join(libDir, "VERSION"));
52
- return true;
53
77
  }
@@ -23,6 +23,17 @@ function commandExists(cmd) {
23
23
  }
24
24
  }
25
25
 
26
+ // Sentinel for the Hyperframes skill bundle. `npx skills add
27
+ // heygen-com/hyperframes` lands skills under ~/.claude/skills/<name>;
28
+ // the router skill is the sentinel. skillsDir is injectable for tests.
29
+ export function hyperframesSkillsInstalled(
30
+ skillsDir = join(homedir(), ".claude", "skills")
31
+ ) {
32
+ return ["hyperframes", "hyperframes-core"].some((name) =>
33
+ existsSync(join(skillsDir, name, "SKILL.md"))
34
+ );
35
+ }
36
+
26
37
  export const checks = [
27
38
  {
28
39
  name: "install-dir",
@@ -255,19 +266,13 @@ export const checks = [
255
266
  description: "Agent-Reach CLI present (multi-platform source pulls for the content trend and research skills)",
256
267
  severity: "warn",
257
268
  check: () => commandExists("agent-reach"),
258
- fix: () => "Install: pipx install agent-reach (or uv tool install agent-reach), then run: agent-reach doctor",
269
+ fix: () => 'Not on PyPI — install from the third-party GitHub repo (confirm the source first): uv tool install "git+https://github.com/Panniantong/Agent-Reach", then run: agent-reach doctor',
259
270
  },
260
271
  {
261
272
  name: "hyperframes-skills",
262
273
  description: "Hyperframes skills installed (video-as-code editing for /content video)",
263
274
  severity: "warn",
264
- check: () => {
265
- // `npx skills add heygen-com/hyperframes` lands skills under
266
- // ~/.claude/skills/<name>; the router skill is the sentinel.
267
- return ["hyperframes", "hyperframes-core"].some((name) =>
268
- existsSync(join(homedir(), ".claude", "skills", name, "SKILL.md"))
269
- );
270
- },
275
+ check: () => hyperframesSkillsInstalled(),
271
276
  fix: () => "Run /content video-setup in Claude Code, or: npx skills add heygen-com/hyperframes --full-depth --yes",
272
277
  },
273
278
  {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "arkaos",
3
- "version": "4.13.0",
3
+ "version": "4.13.2",
4
4
  "description": "The Operating System for AI Agent Teams",
5
5
  "type": "module",
6
6
  "bin": {
package/pyproject.toml CHANGED
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "arkaos-core"
3
- version = "4.13.0"
3
+ version = "4.13.2"
4
4
  description = "Core engine for ArkaOS — The Operating System for AI Agent Teams"
5
5
  readme = "README.md"
6
6
  license = {text = "MIT"}
@@ -67,7 +67,9 @@ fi
67
67
  # ── Find available ports ──
68
68
  find_port() {
69
69
  local port=$1
70
- while lsof -i :"$port" >/dev/null 2>&1; do
70
+ # LISTEN-only: a lingering client socket (e.g. a browser tab in
71
+ # CLOSED/TIME_WAIT to :3333) must not push the UI off its port.
72
+ while lsof -iTCP:"$port" -sTCP:LISTEN >/dev/null 2>&1; do
71
73
  port=$((port + 1))
72
74
  done
73
75
  echo "$port"