Skip to content

Commit 04dc4f2

Browse files
DavidsonGomesclaude
andcommitted
release: v0.17.2 — Settings page + .env editor removal
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent 7047ba4 commit 04dc4f2

14 files changed

Lines changed: 1058 additions & 430 deletions

File tree

CHANGELOG.md

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,25 @@ All notable changes to this project will be documented in this file.
55
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
66
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
77

8+
## [0.17.2] - 2026-04-12
9+
10+
### Added
11+
12+
- **Settings page** — new `/settings` page in the dashboard with three tabs: Workspace config (`workspace.yaml`), Routines management (`routines.yaml`), and Reference (CLAUDE.md, Makefile, Commands)
13+
- **Workspace config UI** — edit workspace name, owner, company, language (20 locales), timezone, and dashboard port
14+
- **Routines toggle & inline edit** — enable/disable routines with toggle switches, edit schedules inline, grouped by frequency (daily/weekly/monthly)
15+
- **Settings backend API** — 9 new endpoints for workspace and routine CRUD with audit logging and scheduler reload via sentinel file
16+
- **API patch method**`api.patch()` added to frontend API helper
17+
18+
### Changed
19+
20+
- **Config page replaced by Settings** — old `/config` removed, `/config` redirects to `/settings`
21+
- **Sidebar updated** — "Settings" added as first item in System group
22+
23+
### Removed
24+
25+
- **.env editor** — removed from both frontend and backend (security risk; use terminal for .env changes)
26+
827
## [0.17.1] - 2026-04-12
928

1029
### Added

cli/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@evoapi/evo-nexus",
3-
"version": "0.17.1",
3+
"version": "0.17.2",
44
"description": "Unofficial open source toolkit for Claude Code — AI-powered business operating system",
55
"keywords": [
66
"claude-code",

dashboard/backend/app.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,7 @@ def auth_middleware():
175175
from routes.triggers import bp as triggers_bp
176176
from routes.backups import bp as backups_bp
177177
from routes.providers import bp as providers_bp
178+
from routes.settings import bp as settings_bp
178179

179180
app.register_blueprint(overview_bp)
180181
app.register_blueprint(workspace_bp)
@@ -196,6 +197,7 @@ def auth_middleware():
196197
app.register_blueprint(triggers_bp)
197198
app.register_blueprint(backups_bp)
198199
app.register_blueprint(providers_bp)
200+
app.register_blueprint(settings_bp)
199201

200202
# --------------- Social Auth blueprints ---------------
201203
from auth.youtube import bp as youtube_auth_bp

dashboard/backend/routes/config.py

Lines changed: 1 addition & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
"""Config endpoint — CLAUDE.md, ROUTINES.md, ROADMAP.md, .env, commands, Makefile."""
22

33
import re
4-
from flask import Blueprint, jsonify, request, Response, abort
5-
from flask_login import login_required
4+
from flask import Blueprint, jsonify, Response, abort
65
from routes._helpers import WORKSPACE, safe_read
76

87
bp = Blueprint("config", __name__)
@@ -74,68 +73,6 @@ def list_commands():
7473
return jsonify(commands)
7574

7675

77-
@bp.route("/api/config/env")
78-
@login_required
79-
def get_env():
80-
"""Read .env file as structured key-value pairs."""
81-
content = safe_read(WORKSPACE / ".env")
82-
if content is None:
83-
return jsonify({"entries": [], "raw": ""})
84-
85-
entries = []
86-
for line in content.splitlines():
87-
stripped = line.strip()
88-
if not stripped or stripped.startswith("#"):
89-
entries.append({"type": "comment", "value": line})
90-
elif "=" in stripped:
91-
key, _, val = stripped.partition("=")
92-
entries.append({"type": "var", "key": key.strip(), "value": val.strip()})
93-
else:
94-
entries.append({"type": "comment", "value": line})
95-
96-
return jsonify({"entries": entries, "raw": content})
97-
98-
99-
@bp.route("/api/config/env", methods=["PUT"])
100-
@login_required
101-
def update_env():
102-
"""Update .env file. Accepts {entries: [...]} or {raw: "..."}."""
103-
from models import has_permission, audit
104-
from flask_login import current_user
105-
106-
if not has_permission(current_user.role, "config", "manage"):
107-
abort(403)
108-
109-
data = request.get_json()
110-
env_path = WORKSPACE / ".env"
111-
112-
if "raw" in data:
113-
# Raw text mode
114-
env_path.write_text(data["raw"])
115-
elif "entries" in data:
116-
# Structured mode
117-
lines = []
118-
for entry in data["entries"]:
119-
if entry.get("type") == "comment":
120-
lines.append(entry.get("value", ""))
121-
else:
122-
key = entry.get("key", "")
123-
val = entry.get("value", "")
124-
if key:
125-
lines.append(f"{key}={val}")
126-
env_path.write_text("\n".join(lines) + "\n")
127-
128-
# Reload dotenv in current process
129-
try:
130-
from dotenv import load_dotenv
131-
load_dotenv(env_path, override=True)
132-
except Exception:
133-
pass
134-
135-
audit(current_user, "env_updated", "config", "Updated .env file")
136-
return jsonify({"status": "saved"})
137-
138-
13976
@bp.route("/api/config/makefile")
14077
def parse_makefile():
14178
content = safe_read(WORKSPACE / "Makefile")

0 commit comments

Comments
 (0)