Commit Graph

104 Commits

Author SHA1 Message Date
Austin 0a28ef0389 feat: central graphify brain (merged cross-project knowledge graph)
- brain/graph/: build-central.sh (code graph + merge linked projects),
  link-project.sh (register a project graph into the brain),
  serve-brain.sh (HTTP MCP :8090), README.md
- server.py: mount /brain-graph so the brain is browsable from the dashboard
- venv: graphify [mcp] extra installed so HTTP MCP serve works
- hourly rebuild cron (agentic-os-brain-rebuild)

Topology: each project keeps its own graph; they roll up into one
central-graph.json that agents query over MCP. Memory notes become
queryable later via an LLM key (graphify . without --code-only).
2026-07-26 12:44:25 -07:00
Austin fe65acc405 chore: finish stale-reference cleanup + add hourly integrity checker
- docs/index.html, robots.txt: modimihir07 -> zumayaaustin-creator
- server.py: reword terminal comment (no dead 8082 mention)
- scripts/integrity_check.py: new read-only hourly integrity scanner
  (single source of truth = settings.json port 8080, repo zumayaaustin-creator,
   terminal /ws/terminal). Exits 0 clean / 1 findings / 2 error.
2026-07-26 11:06:48 -07:00
Austin 0347501778 docs: refresh stale references (repo, location, ports)
- AGENTS.md/README.md: repo -> zumayaaustin-creator/agentic-os, location -> /home/austin/agentic-os
- docs/README.md, CHANGELOG.md: terminal endpoint -> /ws/terminal on main port (was dead 8082)
- brain/recent-decisions.md: server port 8081 -> 8080 (settings.json is source of truth)
- GRAPHIFY_MEMORY.md 8081 left as-is (graphify viz server is intentionally separate)
2026-07-26 11:04:48 -07:00
Austin aa7fd2b886 fix: enable opencode agent + wire dashboard Terminal to live /ws/terminal
- settings.json: opencode enabled true (binary already installed; was disabled)
- terminal.js: point WebSocket at /ws/terminal on the main server (was dead 8082),
  switch message protocol action:/type: -> type: to match PtySession backend
2026-07-26 10:40:40 -07:00
Austin 2c636d091d fix: unify to single dashboard port (8080) from settings.json as sole source of truth
- server.py: --port default now reads dashboard.port from data/settings.json
- start.sh / start-agentic-os.sh: derive PORT from settings.json
- scheduler.py: SERVER_URL reads port from settings.json
- settings.json: dashboard.port 8081 -> 8080
- docs: refresh stale 8081 references
Resolves drift where launchers forced 8081 while CORS/scheduler/skin/docs expected 8080.
2026-07-26 10:14:41 -07:00
Austin 01dae3a4ac fix(dashboard): serve /dashboard/ index via StaticFiles html=True
Resolves the 404 on a direct hit to /dashboard/ (verified by reliability
sweep: endpoint + dashboard verifiers). / and all assets already worked;
this makes the bare directory path serve index.html too.
2026-07-25 18:37:58 -07:00
Austin 29eaa7f801 feat(orchestration): multi-angle workflow — 5+ parallel subagents, converge, log + index runs
- skills/multi-angle-orchestration/SKILL.md: SOP for single-source fan-out
  (delegate_task leaf workers, NO external AIs) of >=5 angles + converge.
- brain-core: ingest orchestration-runs/*.json as source 'orchestration'
  so past runs are searchable in Brain Search.
- server.py: POST /api/orchestrate (optional headless fan-out of the 3
  built-in agents) + GET /api/orchestrate/runs; persist runs to
  data/orchestration-runs/<id>.json and upsert to brain.
- dashboard/pages/orchestration.js: launch runs + review past runs.
- skills/multi-agent-run/SKILL.md + api helpers + nav entry.
2026-07-25 18:07:51 -07:00
Austin cce56eed02 chore: standardize dashboard port to 8081 across launchers
- start.ps1 fallback 8080 -> 8081 (reads data/settings.json which is now 8081)
- server.py argparse --port default 8080 -> 8081 (bare server.py lands on 8081)
- (desktop Agentic OS.url already points at 127.0.0.1:8081; settings.json
  change kept local since it's git-ignored with api_keys)

Single consistent port story across WSL start.sh, Windows start.ps1,
bare server.py, and the desktop shortcut.
2026-07-25 16:21:47 -07:00
Austin 257d64327a feat(brain): brain search dashboard + scheduled auto-ingest + skill-run auto-upsert
1) Brain Search page (dashboard/pages/brain-search.js): mirrors Agent
   Insights; queries /api/brain-index/search with source filter + live
   index stats; nav entry + PAGE_TITLES added.
2) Scheduled auto-ingest: scheduler gains endpoint-style jobs
   (run_endpoint_via_api) so non-skill maintenance tasks can be cron'd;
   new job brain-index-ingest-job.json re-indexes every 30 min.
3) Agents auto-upsert learnings: run_skill wrap-up now calls
   record_brain_learning() so each skill run is immediately searchable
   in the unified index (best-effort, never breaks the run).

Fixed a regression where AGENT_STATS_FILE def was dropped during the
brain-learning helper insertion (would have broken all skill runs).

Verified live: brain search returns ranked results; run_skill wrap-up
upserts a searchable doc; scheduler imports + job validates.
2026-07-25 15:49:14 -07:00
Austin a36dff7f2c feat(brain): centralized brain — unified information pipeline (brain + skills + chat)
- brain-core/brain_index.py: SQLite+FTS5 index over brain/** markdown,
  skills/*/learnings.md, and data/chat-history.json. Idempotent upsert
  keyed by (source, path, agent, #msg) so re-ingest never duplicates.
- brain-cli.py: ingest / stats / search CLI.
- server.py: /api/brain-index/{ingest,upsert,search,stats} so agents can
  WRITE to the brain (upsert) and you/agents can QUERY it (search).
- .gitignore: exclude the regenerated *.db.

Verified live: ingest 66 docs (16 brain, 32 chat, 18 skill-learnings),
cross-source FTS search, and agent upsert is immediately searchable.
2026-07-25 15:24:40 -07:00
Austin bc8094be77 feat(dashboard): add Agent Insights page — live AI-agent usage analytics
New /api/agent-insights endpoint aggregates real data (chat-history,
cost-history, agent-time, agent-registry, router-keywords) to show:
- which agent you chat with most (user turns)
- which agent spends the most time on tasks (derived agent-time)
- which agent is best suited for what (registry desc + router keywords + roles)
- which models you use most per agent (cost-history)

Dashboard page (agent-insights.js) with stat cards, two Chart.js bar
charts, suite cards, models-per-agent table, and full per-agent
breakdown. Verified live in browser against real data.
2026-07-25 14:34:30 -07:00
Austin 042fd288f8 fix(merge): repair mangled check_agent + remove duplicate/drop standalone 8082 terminal
- check_agent got mangled during conflict resolution (main's builtin logic
  stitched to branch's agent-referencing return -> NameError). Replaced with
  the correct dynamic, registry-based implementation (binary/oauth_file/http/
  custom) including the shlex injection-safe custom check.
- Removed the redundant standalone WebSocket terminal server on port 8082;
  the in-app /ws/terminal PtySession is canonical.
- Verified live: status/agents/integrations/agent-time all 200; double-launch
  guard and shell-injection fix both hold.
2026-07-25 12:31:26 -07:00
Austin e7d3710491 hardening: fix command-injection in agent check_command + add double-launch guard
- check_agent() custom check_type: replace subprocess shell=True with
  shlex.split + shell=False (prevents agent-registry config from injecting
  arbitrary shell). Verified malicious '; touch' no longer executes.
- Add startup port guard in main: probe API port before uvicorn.run;
  exit 1 with clear message if already bound (stops the double-instance
  collision that caused phantom 'register does not persist' bugs).
- start_terminal_server (8082): pre-bind probe + try/except so a taken
  port logs a warning instead of crashing the whole process.
2026-07-25 12:28:59 -07:00
Austin 32153b340f docs(brain): record v0.3.0 wiring work + verification + open caveats 2026-07-25 12:27:27 -07:00
Austin 96d8281b9b Wire up dynamic agent registry, integrations, agent-time tracking, UI modernization
- server.py: dynamic agent execution engine (cli/http/mcp), live agent
  registry (/api/agents register/unregister), integrations API, agent stats
  & skill scoring, kanban task delete, plugin uninstall, agent-time tracking
  + /test page
- dashboard: modernized agent-health, plugins marketplace, smart-router,
  styles; added agent-time monitor page + terminal page
- scheduler.py rewrite; start.sh / start-agentic-os.sh improvements
- skills: added firebase-*, notion-knowledge-capture, xcode-project-setup,
  audit/test plugins; updated learnings across skills
- brain/ docs + data registry files (agent-registry, integrations, router-keywords)
- .gitignore: exclude runtime artifacts (pid, graphify-out, logs)

Verified live on :8081 - all new endpoints return 200 and register/unregister
persists to data/agent-registry.json.
2026-07-25 12:27:26 -07:00
zumayaaustin-creator 701df3e58e Merge pull request #3 from zumayaaustin-creator/codex/add-windows-backup-and-restore-scripts
Add native Windows backup and restore scripts
2026-07-21 03:44:22 -07:00
Austin 82af4268af Merge remote-tracking branch 'origin/main'
# Conflicts:
#	data/kanban/0f822987.json
#	data/kanban/8893ad14.json
2026-07-19 02:11:36 -07:00
Austin 1a8b17d15e devops-audit report, kanban cards, goals, and start.bat launcher
- Add devops audit report and learnings for CloudMart GCP infrastructure
- Add new kanban cards (devops-audit P0 Doing, two additional cards)
- Add new goals (entries 9, 10) to goals.json
- Fix typo in active-projects.md and add active card link
- Add start.bat launcher script
2026-07-19 01:41:04 -07:00
Austin 9c6ec776c6 Agentic OS: staged brain entries, kanban tasks, devops-audit report, and config updates 2026-07-18 23:15:58 -07:00
zumayaaustin-creator d7ea76cf99 Merge pull request #15 from zumayaaustin-creator/claude/agentic-os-setup-5ubuao
Fix critical WebSocket origin bypass and other review findings
2026-07-08 18:47:31 -07:00
zumayaaustin-creator e6c89469f3 Merge pull request #7 from zumayaaustin-creator/codex/update-setup-guidance-and-cli-checks
Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-07-08 18:43:22 -07:00
zumayaaustin-creator 015df05509 Merge pull request #13 from zumayaaustin-creator/devin/1783552139-add-unit-tests
* Add unit test suite for server.py and scheduler.py

Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>

* Avoid URL substring pattern in CORS test to satisfy CodeQL

Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>

---------

Co-authored-by: zumayaaustin <zumayaaustin@gmail.com>
Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-07-08 18:42:39 -07:00
zumayaaustin-creator 1a2e0b2902 Merge pull request #12 from zumayaaustin-creator/devin/1783552096-error-handling
* Improve error handling: propagate corrupt-JSON errors, stop swallowing failures

Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>

* Validate skill name to prevent path traversal (CodeQL)

Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>

* Tighten skill name allowlist to exclude '.' (path traversal)

Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>

* Resolve skill name via directory match to break path-injection taint (CodeQL)

Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>

* Make aggregate listings tolerate a corrupt file (best_effort), keep single GETs strict

Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>

* Move kanban_task_path inside try block in daemon thread

* Resolve existing skills via iterdir match to break path-injection taint (CodeQL)

Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>

* Recompute path in kanban dispatch error handler to avoid unbound local

Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>

* Fix unbound variable in _run_kanban_agent error handler

* Restore kanban dispatch success branch mangled by misapplied review suggestion

Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>

---------

Co-authored-by: zumayaaustin <zumayaaustin@gmail.com>
Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-07-08 18:42:15 -07:00
zumayaaustin 4604b433e8 Restore kanban dispatch success branch mangled by misapplied review suggestion
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-07-09 01:25:29 +00:00
zumayaaustin-creator b93c619551 Fix unbound variable in _run_kanban_agent error handler 2026-07-09 01:24:32 +00:00
zumayaaustin 30d7366a31 Recompute path in kanban dispatch error handler to avoid unbound local
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-07-09 01:18:05 +00:00
zumayaaustin 9e6ec12acd Merge main: consolidate JSON reads into enhanced read_json, keep error-handling improvements
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-07-09 01:15:14 +00:00
zumayaaustin-creator 2d80ab7348 Merge pull request #11 from zumayaaustin-creator/devin/1783551997-fix-backup-restore-path-traversal
* Fix path traversal in /api/backup/restore

Validate the restore filename stays within backups/ and refuse tar members
(and symlinks) that escape the extraction root (CVE-2007-4559 class), using
tarfile's data filter.

Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>

* Resolve backup filename from directory listing (satisfy CodeQL path-injection)

Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>

---------

Co-authored-by: zumayaaustin <zumayaaustin@gmail.com>
Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-07-08 18:11:28 -07:00
zumayaaustin-creator 8253f78e69 Merge pull request #14 from zumayaaustin-creator/devin/1783552205-dedup-shared-utils
* Refactor duplicated patterns into shared utilities

Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>

* Harden user-controlled paths with containment check (CodeQL)

Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>

* Limit shared JSON helpers to fixed-path callers to avoid path-injection alerts

Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>

---------

Co-authored-by: zumayaaustin <zumayaaustin@gmail.com>
Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-07-08 18:10:41 -07:00
zumayaaustin 7b8c81ea49 Resolve existing skills via iterdir match to break path-injection taint (CodeQL)
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-07-09 00:13:39 +00:00
zumayaaustin e3b625a967 Merge remote kanban daemon fix; standardize skill resolution on skill_dir_path
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-07-09 00:10:45 +00:00
zumayaaustin 7f0c104aea Merge origin/main into error-handling branch; standardize on skill_dir_path
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-07-09 00:09:34 +00:00
zumayaaustin 2cb6e4b76f Merge branch 'main' into codex/update-setup-guidance-and-cli-checks
Resolve install.ps1 conflict by adopting main's complete installer (Resolve-Python,
agent checks, desktop shortcut, browser auto-open) and folding in this branch's
winget install hints and optional agent-CLI reminders. Clean up README duplicate
Python/Node prerequisite rows and duplicate Windows Quick Start left over from the
earlier merge.

Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-07-09 00:08:16 +00:00
Claude d149356a22 Fix critical WebSocket origin bypass, zombie processes, and review findings
Addresses findings from Devin and Codex reviews on the merged PR #10:

- CRITICAL: /ws/terminal accepted connections from any origin - Starlette's
  CORSMiddleware does not protect WebSocket handshakes, so any webpage could
  open a socket to the dashboard's terminal and get an interactive shell on
  the user's machine. Now validates the Origin header against the same
  allowed-origins list used for CORS before accepting.
- PtySession.close() sent SIGKILL to the shell's PID but never reaped it via
  os.waitpid(), leaking a zombie process per closed terminal session.
- hermes_available() ran a real subprocess (possibly bridged through WSL) on
  every /api/status poll, which the dashboard hits every 15s. Added a 60s
  TTL cache.
- create_skill() now also creates learnings.md and the context/ directory,
  matching the standard skill template (_template/) instead of only
  writing SKILL.md.
- The '+ New Skill' button stayed visible in the Skills Hub detail view
  since only its sibling filter input was hidden; both now live under a
  shared #skillActions container that's hidden/shown together.

Verified: malicious/missing-origin WebSocket connections are rejected at
the handshake (HTTP 403) before any shell spawns; a valid dashboard origin
still connects and works; closing a session leaves no zombie/orphaned
process; the hermes availability cache avoids repeat subprocess spawns.
2026-07-09 00:07:17 +00:00
zumayaaustin-creator 71650cbc0b Merge pull request #10 from zumayaaustin-creator/claude/agentic-os-setup-5ubuao
* Run dashboard Terminal commands through PowerShell on Windows

subprocess.run(..., shell=True) uses cmd.exe on Windows by default,
which doesn't understand PowerShell syntax like $env:VAR or
$env:USERPROFILE - commands using it failed with 'cannot find the
file specified' since cmd took it as a literal filename. Invoke
powershell.exe explicitly on Windows instead; POSIX behavior is
unchanged.

* Replace command-runner Terminal with a real interactive PTY

The previous Terminal ran one command at a time via subprocess.run
and returned its output - it couldn't run interactive programs
(colors, live input, TUIs like gemini's chat/auth flow), which is
what a terminal actually needs to do.

Backend: new /ws/terminal WebSocket endpoint spawns a real shell
attached to a pseudo-terminal (stdlib pty on POSIX, pywinpty/ConPTY
on Windows) and streams raw I/O bidirectionally, with resize support.
Replaces the old POST /api/terminal/run and GET /api/terminal/session
endpoints entirely.

Frontend: terminal.js now loads xterm.js + the fit addon from CDN
and renders a real terminal emulator wired to the WebSocket, instead
of a scrollback div with a single input line.

Verified on this Linux sandbox via raw WebSocket tests: shell spawns
correctly, commands execute and echo real output, resize propagates
to the PTY (confirmed via ), and closing the connection
cleanly kills the shell process with no orphans (interactive bash
ignores SIGTERM by default, so cleanup uses SIGKILL). Could not
visually verify the xterm.js browser rendering in this sandbox since
its egress policy blocks the CDN (cdn.jsdelivr.net) outright - same
CDN this app already uses for chart.js, so expected to work on a
normal machine; please confirm on Windows.

* Remove demo/sample Kanban tasks

These were placeholder seed data shipped with the repo (a demo
'Fix login bug' task and a 'Test kanban task' with a canned
'Waiting for API review' block reason) - not real tasks. Clearing
them so the board starts empty.

* Add missing DELETE /api/kanban/tasks/{id} endpoint

The Kanban detail modal's Delete button called api.deleteKanbanTask(),
which didn't exist on the client, and there was no backend route for
it either - clicking Delete just threw 'api.deleteKanbanTask is not
a function'. Add both the client method and the backend endpoint.

* Bridge Hermes invocation through WSL when only installed there

The dashboard runs as a native Windows process, but Hermes' official
installer is Bash-only and typically only gets set up inside WSL -
a plain PATH lookup for 'hermes' on Windows will never find it there.

Add hermes_cli_args(), which checks the native PATH first (so Mac/
Linux/WSL-native setups are unaffected) and falls back to routing
through 'wsl -e bash -lc' (a login shell, so PATH additions like
uv's ~/.local/bin are sourced) only when hermes isn't found natively
but wsl.exe is available. Wire both the chat/dispatch invocation and
the agent-health check through it, replacing the plain shutil.which
check that always reported Hermes offline in this setup.

* Make Skills Hub context files editable and add skill creation

Two real gaps: the Skills Hub had no way to create a new skill (with
a SKILL.md) at all - the only 'Install' flow was the Plugin registry,
which just records a name in a JSON file, not an actual skill folder.
And the Context Files panel was read-only, just listing filenames
with no way to view, edit, add, or delete their contents.

Adds POST /api/skills (create, with SKILL.md content), PUT
/api/skills/{name} (edit SKILL.md), and GET/PUT/DELETE
/api/skills/{name}/context/{filename} for context files - all
validated through the same regex-allowlist + resolved-path
containment pattern already used for kanban tasks. Dashboard gets a
'+ New Skill' button, an editable SKILL.md view, and per-file
edit/delete plus 'Add File' in the Context Files panel.

* Verify native hermes is actually the right agent before trusting it

hermes_cli_args() previously trusted any 'hermes' found on native PATH
without checking what it actually was. Windows machines can have an
unrelated tool also named 'hermes' (softwarepub/HERMES, an academic
software-publication tool with harvest/process/curate/deposit
subcommands - confirmed to be what was actually on this machine's
PATH), which would silently get used instead of the real NousResearch
agent installed in WSL, producing the misleading 'Hermes needs setup'
message.

Now check that a native 'hermes' actually exposes the agent's 'chat'
subcommand before using it directly, falling back to the WSL bridge
otherwise.

---------

Co-authored-by: Claude <noreply@anthropic.com>
2026-07-08 17:05:36 -07:00
devin-ai-integration[bot] 467419fdf4 Move kanban_task_path inside try block in daemon thread 2026-07-08 23:59:40 +00:00
zumayaaustin 031884ab6c Make aggregate listings tolerate a corrupt file (best_effort), keep single GETs strict
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-07-08 23:27:58 +00:00
zumayaaustin 13c77b497f Limit shared JSON helpers to fixed-path callers to avoid path-injection alerts
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-07-08 23:19:40 +00:00
zumayaaustin ba0e3d8e0b Resolve skill name via directory match to break path-injection taint (CodeQL)
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-07-08 23:16:47 +00:00
zumayaaustin b6c1cd3389 Harden user-controlled paths with containment check (CodeQL)
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-07-08 23:14:46 +00:00
zumayaaustin b7c7c254b0 Tighten skill name allowlist to exclude '.' (path traversal)
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-07-08 23:13:23 +00:00
zumayaaustin e564fe8229 Avoid URL substring pattern in CORS test to satisfy CodeQL
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-07-08 23:11:24 +00:00
zumayaaustin 5a7bc1639d Validate skill name to prevent path traversal (CodeQL)
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-07-08 23:11:13 +00:00
zumayaaustin 2e7bb73807 Refactor duplicated patterns into shared utilities
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-07-08 23:10:05 +00:00
zumayaaustin 9ba87ddc68 Resolve backup filename from directory listing (satisfy CodeQL path-injection)
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-07-08 23:09:29 +00:00
zumayaaustin 33e792bd42 Add unit test suite for server.py and scheduler.py
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-07-08 23:09:02 +00:00
zumayaaustin 3cf939c403 Improve error handling: propagate corrupt-JSON errors, stop swallowing failures
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-07-08 23:08:16 +00:00
zumayaaustin 780b6efcd9 Fix path traversal in /api/backup/restore
Validate the restore filename stays within backups/ and refuse tar members
(and symlinks) that escape the extraction root (CVE-2007-4559 class), using
tarfile's data filter.

Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-07-08 23:06:37 +00:00
Claude 2d131bfb8a Verify native hermes is actually the right agent before trusting it
hermes_cli_args() previously trusted any 'hermes' found on native PATH
without checking what it actually was. Windows machines can have an
unrelated tool also named 'hermes' (softwarepub/HERMES, an academic
software-publication tool with harvest/process/curate/deposit
subcommands - confirmed to be what was actually on this machine's
PATH), which would silently get used instead of the real NousResearch
agent installed in WSL, producing the misleading 'Hermes needs setup'
message.

Now check that a native 'hermes' actually exposes the agent's 'chat'
subcommand before using it directly, falling back to the WSL bridge
otherwise.
2026-07-08 23:03:44 +00:00
Claude d36785c7ee Make Skills Hub context files editable and add skill creation
Two real gaps: the Skills Hub had no way to create a new skill (with
a SKILL.md) at all - the only 'Install' flow was the Plugin registry,
which just records a name in a JSON file, not an actual skill folder.
And the Context Files panel was read-only, just listing filenames
with no way to view, edit, add, or delete their contents.

Adds POST /api/skills (create, with SKILL.md content), PUT
/api/skills/{name} (edit SKILL.md), and GET/PUT/DELETE
/api/skills/{name}/context/{filename} for context files - all
validated through the same regex-allowlist + resolved-path
containment pattern already used for kanban tasks. Dashboard gets a
'+ New Skill' button, an editable SKILL.md view, and per-file
edit/delete plus 'Add File' in the Context Files panel.
2026-07-07 17:22:41 +00:00