docs: refresh context files and add project URLS
This commit is contained in:
@@ -1,60 +1,167 @@
|
|||||||
|
<!-- vibesoul-updated: 2026-09-25T11:00:00+02:00 -->
|
||||||
# AGENTS.md — Operational Instructions
|
# AGENTS.md — Operational Instructions
|
||||||
|
|
||||||
How the coding agent works with Fränky's projects.
|
How the coding agent works with Fränky's projects.
|
||||||
**Priority:** explicit user chat instructions > project-local overrides > this file > `USER.md`.
|
|
||||||
|
|
||||||
Also read: `INFRASTRUCTURE.md`, `STANDARDS.md`, `BOUNDARIES.md`, project `SOUL.md`, project `MOOD.md`.
|
Also read (project root, next to this file): `INFRASTRUCTURE.md`, `STANDARDS.md`, `BOUNDARIES.md`, project `SOUL.md`, project `MOOD.md`.
|
||||||
|
Persona & preferences: `USER.md` (Tier 2).
|
||||||
|
|
||||||
|
**Context files (audience):** **`SOUL.md`** + this file → agents (character, ops). **`README.md`** → humans (run/test/deploy). **`URLS.md`** → project URLs for humans and an external opener script (Markdown parser — no special formatting; keep URLs there, not scattered in SOUL).
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Startup
|
## Rule Priority
|
||||||
|
|
||||||
1. Read `AGENTS.md`, `INFRASTRUCTURE.md`, `BOUNDARIES.md`, `STANDARDS.md`
|
Highest wins. One line per source:
|
||||||
2. Read project `SOUL.md` if present — adapt tone and product constraints
|
|
||||||
3. Read project `MOOD.md` if present — adapt chat personality (tone only)
|
|
||||||
4. Skim project structure before making changes
|
|
||||||
|
|
||||||
**On first use in a project:** confirm *"AGENTS read and understood"* (see project `README` or root prompt).
|
| Priority | Source |
|
||||||
|
|----------|--------|
|
||||||
|
| 1 | Explicit chat instruction from Fränky |
|
||||||
|
| 2 | Project `SOUL.md` / project-local `BOUNDARIES.md` / project `AGENTS` snippets |
|
||||||
|
| 3 | `BOUNDARIES.md` |
|
||||||
|
| 4 | `AGENTS.md` (this file) |
|
||||||
|
| 5 | `STANDARDS.md` |
|
||||||
|
| 6 | `INFRASTRUCTURE.md` |
|
||||||
|
| 7 | `MOOD.md` — **tone only**, never overrides safety or ops rules |
|
||||||
|
| 8 | `USER.md` — persona & preferences, not operational overrides |
|
||||||
|
|
||||||
|
**UI/UX:** project `SOUL.md` overrides global `STANDARDS.md` when they conflict.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Default Workflow
|
## Startup (Tier 1 / Tier 2)
|
||||||
|
|
||||||
1. **Restate** the user's request in your own words; turn it into a plan or mini-PRD
|
Agents do not auto-load context. Use two tiers:
|
||||||
2. **Align** on the plan — resolve all ambiguities before coding
|
|
||||||
3. **Implement** autonomously with tests (user may be absent)
|
|
||||||
4. **Verify** — run tests, fix failures; do not guess
|
|
||||||
5. **Hand off** — summary of what changed and how to test locally
|
|
||||||
6. **Deploy / prod** — Fränky handles unless project or chat says otherwise (see `INFRASTRUCTURE.md`)
|
|
||||||
|
|
||||||
### Question-only requests
|
### Tier 1 — always (light)
|
||||||
|
|
||||||
If the user asks a question (review, explanation, "how does X work?"):
|
At the start of any substantive task, without waiting for ack:
|
||||||
|
|
||||||
- **Do not** modify files, commit, or "fix while you're here"
|
1. Project `SOUL.md` — **Agent Quick Start** section (or full file if no Quick Start)
|
||||||
- Answer the question; offer to implement only if asked
|
2. `BOUNDARIES.md` — **Never Ever** section
|
||||||
|
|
||||||
|
### Tier 2 — full load
|
||||||
|
|
||||||
|
On `@AGENTS.md ack`, first chat in a project, or when Fränky says context was lost:
|
||||||
|
|
||||||
|
1. `AGENTS.md`, `BOUNDARIES.md`, `STANDARDS.md`, `INFRASTRUCTURE.md`
|
||||||
|
2. `USER.md` — persona, work-style table, communication prefs
|
||||||
|
3. Project `SOUL.md` (full), project `MOOD.md` if present
|
||||||
|
4. Skim project structure
|
||||||
|
|
||||||
|
### Command: `AGENTS.md ack`
|
||||||
|
|
||||||
|
Fränky schreibt `AGENTS.md ack`.
|
||||||
|
|
||||||
|
**Agent:** Tier-2 read, then reply with this **compact template** (one block, no code changes):
|
||||||
|
|
||||||
|
```
|
||||||
|
AGENTS ack ✓
|
||||||
|
· Pipeline: [1-line what this project is]
|
||||||
|
· Non-goals: [from SOUL, or "SOUL missing"]
|
||||||
|
· Commit policy: [no commit unless … / project override]
|
||||||
|
· MOOD: [active session character]
|
||||||
|
· Paths: [key workdirs / mounts from SOUL or INFRA snippet]
|
||||||
|
· Conflict: [1 sentence if SOUL vs STANDARDS disagree, else "none"]
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Work Modes
|
||||||
|
|
||||||
|
| Mode | Trigger | Behavior |
|
||||||
|
|------|---------|----------|
|
||||||
|
| **Question-only** | Question, review, "how does X work?" | No file changes, commit, or drive-by fixes |
|
||||||
|
| **Standard** | Default | Restate → align on plan → implement → verify → hand off |
|
||||||
|
| **Unattended / Away** | "wenn ich zurück bin", "mach ohne mich", "overnight", explicit away | **Skip plan alignment** — proceed with best judgment; justify in handoff |
|
||||||
|
|
||||||
|
**Plan Mode:** If file edits are blocked, **abort and wait** — never circumvent via shell. See `BOUNDARIES.md`.
|
||||||
|
|
||||||
|
### Verification (pragmatic)
|
||||||
|
|
||||||
|
- If the project has a runnable stack (Compose, CLI, service), prefer a **real smoke / happy-path** check before handoff — not "code looks fine".
|
||||||
|
- Waiting on slow builds or pipeline jobs is OK and preferred over fake-green.
|
||||||
|
- Unit/integration tests still apply when a suite exists; smoke does not replace them, and they do not replace smoke when infra is the product.
|
||||||
|
|
||||||
|
### Unattended / Away — extra rules
|
||||||
|
|
||||||
|
- **Monitoring:** Built-in background shell + polling — **not** external wrapper scripts as default
|
||||||
|
- **Handoff must include:** log paths, PIDs if relevant, how to recognize success, next command for Fränky
|
||||||
|
- Include **one short line on where the time went** (e.g. image build, E2E wait, one root-cause rebuild) — no essay
|
||||||
|
- Write blocked items or run status to `NOTES.md` when useful
|
||||||
|
- **Notify** via `ntfyschwenkonline` when the task finishes (see [Notifications](#notifications))
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Default Workflow (Standard mode)
|
||||||
|
|
||||||
|
1. **Restate** the request; turn into plan or mini-PRD
|
||||||
|
2. **Align** on the plan — resolve ambiguities before coding
|
||||||
|
3. **Implement** (see Testing below)
|
||||||
|
4. **Verify** — run tests when appropriate; do not guess
|
||||||
|
5. **Hand off** — summary, how to test locally, log paths for long jobs
|
||||||
|
6. **Deploy / prod** — Fränky handles unless project or chat says otherwise
|
||||||
|
|
||||||
|
After **long-running** work: send push notification (see [Notifications](#notifications)).
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Autonomy Matrix
|
## Autonomy Matrix
|
||||||
|
|
||||||
Default permissions when the user steps away mid-task:
|
See also `USER.md` **Work Style** table for Fränky's preference scores.
|
||||||
|
|
||||||
| Action | Default |
|
| Action | Default |
|
||||||
|--------|---------|
|
|--------|---------|
|
||||||
| Write / change code | ✅ OK |
|
| Write / change code | ✅ OK |
|
||||||
| Write tests | ✅ OK |
|
| Write tests | ✅ OK when non-trivial or suite exists |
|
||||||
| Add dependencies | ✅ OK |
|
| Add dependencies | ✅ OK |
|
||||||
| Touch README / docs | ✅ OK |
|
| Touch README / docs | ✅ OK |
|
||||||
| Change CI/CD config | ⚠️ Ask first |
|
| Change CI/CD config | ⚠️ Ask first |
|
||||||
| Refactor "on the side" | ⚠️ Ask first |
|
| Refactor "on the side" | ⚠️ Ask first |
|
||||||
| Update AGENTS / SOUL / MOOD | ⚠️ Ask first (or when user explicitly says "remember this") |
|
| Update AGENTS / SOUL / BOUNDARIES | ⚠️ Ask first (or explicit "remember this") |
|
||||||
| Create auxiliary `.md` files (`NOTES.md`, todos, plans) | ✅ OK |
|
| Update `MOOD.md` on disk | 🚫 Only on `persist MOOD` or explicit instruction |
|
||||||
| Git commit | 🚫 **No** — unless explicitly instructed or project `SOUL.md` allows |
|
| Create auxiliary `.md` (`NOTES.md`, todos) | ✅ OK |
|
||||||
| Git push | 🚫 **No** — unless explicitly instructed |
|
| Git commit / push / deploy | 🚫 Unless explicit or project `SOUL.md` allows |
|
||||||
| Deploy | 🚫 **No** — unless explicitly instructed or project grants autonomy |
|
| `ntfyschwenkonline` after long-running task | ✅ OK |
|
||||||
|
|
||||||
Project `SOUL.md` may relax rules (e.g. atomic commits when Fränky checks off tasks). Stricter project rules always win.
|
---
|
||||||
|
|
||||||
|
## MOOD: Session vs. Persist
|
||||||
|
|
||||||
|
| | Session | Persist to `MOOD.md` |
|
||||||
|
|---|---------|----------------------|
|
||||||
|
| Trigger | `mood "XY"` in chat | `persist MOOD` or explicit "save mood to file" |
|
||||||
|
| Effect | Tone for this chat only | Updates `## Aktueller Mood` in file |
|
||||||
|
| Default | **Yes** — `mood "XY"` does **not** edit the file |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Testing
|
||||||
|
|
||||||
|
Fränky's bar is **pragmatic, not TDD-by-default** (`USER.md`: tests score 2/5).
|
||||||
|
|
||||||
|
- Run tests when a suite exists **and** the change is non-trivial
|
||||||
|
- Follow project `SOUL.md` if stricter (e.g. pytest before handoff)
|
||||||
|
- Do not block small fixes on missing test infrastructure
|
||||||
|
|
||||||
|
### Concision
|
||||||
|
|
||||||
|
Keep `AGENTS.md` lean:
|
||||||
|
|
||||||
|
- Stay under ~300 lines / ~150 instructions.
|
||||||
|
- Do not duplicate linter, formatter, or type-checker rules — enforce those with deterministic tooling.
|
||||||
|
- Prefer hooks, CI checks, and project infrastructure over "please remember" instructions.
|
||||||
|
- If a rule is tool-specific or task-specific, move it to `SKILL.md`, `TOOLS.md`, or the relevant `--emit-*` target rather than adding it here.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Commits & Issues
|
||||||
|
|
||||||
|
- **Default: no commit, no push** without explicit instruction
|
||||||
|
- **Format:** [Conventional Commits](https://www.conventionalcommits.org/) (`feat:`, `fix:`, `docs:`, …) when committing
|
||||||
|
- **Forge:** **Gitea** (`gitea.schwenk.online`) unless project says otherwise — not GitLab
|
||||||
|
- Link Gitea issues when they exist (`#123`)
|
||||||
|
- Do not mix unrelated changes (e.g. MOOD switch + feature) in one commit
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -62,93 +169,136 @@ Project `SOUL.md` may relax rules (e.g. atomic commits when Fränky checks off t
|
|||||||
|
|
||||||
### `NOTES.md`
|
### `NOTES.md`
|
||||||
|
|
||||||
Use as Fränky's scratchpad — create or update when parking ideas, open questions, or session context. Chaotic is fine.
|
Scratchpad — use for blocked tasks, session park, overnight-run status, handoff crumbs.
|
||||||
|
|
||||||
### Subagents
|
### Subagents & context budget
|
||||||
|
|
||||||
On web/frontend projects, use subagents where useful: **Explore** (codebase), **Playwright** (browser tests), build checks.
|
**Keep main context small.** Delegate instead of dumping large outputs into parent chat:
|
||||||
|
|
||||||
|
| Task | Subagent |
|
||||||
|
|------|----------|
|
||||||
|
| Unknown codebase or many files to scan | **Explore** |
|
||||||
|
| Browser / E2E / web UI | **Playwright** |
|
||||||
|
| Broad research | **generalPurpose** or **Explore** |
|
||||||
|
| Shell / git batch ops | **shell** |
|
||||||
|
|
||||||
|
**Explore** for any project type when orientation is unclear — not only web. **Playwright** only when there is a web UI to test.
|
||||||
|
|
||||||
### Commits when allowed
|
### Commits when allowed
|
||||||
|
|
||||||
If the project permits commits and Fränky marks a task done: **one focused commit** — only what's needed, easy to revert. No drive-by refactors in the same commit.
|
One focused commit per completed task — easy to revert. No drive-by refactors.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Project Infrastructure Snippet
|
||||||
|
|
||||||
|
Machine-specific paths (workdirs, external mounts, local service ports) belong in **project `SOUL.md`**, not global `INFRASTRUCTURE.md`.
|
||||||
|
Public/staging/repo/wiki URLs belong in **project `URLS.md`** (external opener script uses Markdown parsing — write URLs normally in that file).
|
||||||
|
|
||||||
|
Example SOUL section:
|
||||||
|
|
||||||
|
```markdown
|
||||||
|
## Infrastructure (project-local)
|
||||||
|
- Workdir: ~/.local/share/myapp
|
||||||
|
- Mounts: check MegaB before scan
|
||||||
|
- Local Immich: :2283 (downstream, not core)
|
||||||
|
```
|
||||||
|
|
||||||
|
See `INFRASTRUCTURE.md` → **Project-local overrides**.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## When Uncertain
|
## When Uncertain
|
||||||
|
|
||||||
1. **Research** — read the codebase, run commands, inspect errors
|
1. Research — read code, run commands
|
||||||
2. **Continue** other independent tasks if possible
|
2. Continue other independent tasks if possible
|
||||||
3. **Park** blocked items in `NOTES.md`, a todo file, or a Gitea issue
|
3. Park in `NOTES.md`, todo file, or Gitea issue
|
||||||
4. **Ask** only after research, with concrete options and a recommended default
|
4. Ask after research, with options + recommended default
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Error Handling
|
## Error Handling
|
||||||
|
|
||||||
- Find root cause — **do not guess**
|
- Root cause first — do not guess
|
||||||
- Retry only when the fix is evidence-based
|
- Escalate on: debug loops, missing uninstallable software
|
||||||
- If stuck after reasonable attempts: **stop**, report findings, ask Fränky to run a specific diagnostic
|
- Long-running jobs: no arbitrary timeout unless Fränky or SOUL says so; name `progress.log` when applicable
|
||||||
- **Escalate immediately** on: infinite loops, missing required software that cannot be installed autonomously
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Proactive Suggestions
|
## Notifications
|
||||||
|
|
||||||
**Always welcome.** Especially current best practices, modern alternatives, security improvements.
|
Fränky's machines have **`/usr/local/bin/ntfyschwenkonline`** — push to [ntfy.schwenk.online](https://ntfy.schwenk.online). Topic = short hostname (`hostname -s`); phone subscribes per machine. Auth is in the installed script — **never copy tokens into repos or chat**.
|
||||||
Keep suggestions concise; implement only what the user approves (unless already in scope).
|
|
||||||
|
|
||||||
---
|
### When to notify
|
||||||
|
|
||||||
## Commits & Issues
|
Send a notification when a **long-running agent task** completes or fails:
|
||||||
|
|
||||||
- **Default: no commit, no push** without explicit instruction
|
- **Unattended / Away** mode — always on finish (success or failure)
|
||||||
- Commit messages: clear and honest — no strong format preference
|
- Background shell jobs you started (scans, builds, batch ops, overnight runs)
|
||||||
- Link Gitea issues when they exist (`#123` or project convention)
|
- Any task Fränky left with an expectation of „meld dich wenn fertig"
|
||||||
|
- Rough guide: expected runtime **> ~2 minutes** or explicit away/unattended context
|
||||||
|
|
||||||
|
Do **not** notify for quick edits, short test runs, or question-only chats.
|
||||||
|
|
||||||
|
### How
|
||||||
|
|
||||||
|
```bash
|
||||||
|
ntfyschwenkonline "OK <project>: <one-line result>"
|
||||||
|
# or on failure:
|
||||||
|
ntfyschwenkonline "FAIL <project>: <one-line error>, see <log-path>"
|
||||||
|
```
|
||||||
|
|
||||||
|
- **English** message body (CLI/ops convention)
|
||||||
|
- One line, ~120 chars — project name, outcome, log path or next step if relevant
|
||||||
|
- Run after handoff summary; notification is in addition to chat handoff, not a replacement
|
||||||
|
- If `ntfyschwenkonline` is missing or fails: note in chat handoff, do not block
|
||||||
|
|
||||||
|
### Examples
|
||||||
|
|
||||||
|
```bash
|
||||||
|
ntfyschwenkonline "OK imagetool: scan done 142 dirs, log ~/.local/share/imagetool/progress.log"
|
||||||
|
ntfyschwenkonline "FAIL ytrecap: pytest 3 failed, see /tmp/test.log"
|
||||||
|
ntfyschwenkonline "OK schwenkonline: build+deploy done"
|
||||||
|
```
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Recording New Rules
|
## Recording New Rules
|
||||||
|
|
||||||
When Fränky says *"never do X in this project"* or similar:
|
When Fränky says *"never do X"*:
|
||||||
|
|
||||||
1. Propose where to persist it (`BOUNDARIES.md`, `SOUL.md`, `AGENTS.md`, or multiple if critical)
|
1. Propose file (`BOUNDARIES.md`, `SOUL.md`, `AGENTS.md`, or multiple)
|
||||||
2. **Also store explicit rules in Cursor Memories**
|
2. Store in **agent memory** for explicit rules
|
||||||
3. Write after confirmation — or immediately if instruction was explicit
|
3. Write after confirmation — or immediately if explicit
|
||||||
|
|
||||||
### Auxiliary markdown files
|
|
||||||
|
|
||||||
`TODO.md`, `PLAN.md`, `NOTES.md`, handoffs — allowed when useful. One purpose per file. Session language (see `USER.md`).
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Maintenance Philosophy
|
|
||||||
|
|
||||||
- **Global files** (`USER.md`, this file, `STANDARDS.md`, `BOUNDARIES.md`, `INFRASTRUCTURE.md`): change rarely
|
|
||||||
- **Project files** (`SOUL.md`, local overrides): update freely as the project evolves
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Language
|
## Language
|
||||||
|
|
||||||
- **Chat:** match Fränky's conversation language (German or English)
|
- **Chat:** match Fränky's language (German or English)
|
||||||
- **Artifacts:** first language of the session — no mid-session switching unless asked
|
- **CLI / terminal / shell:** always English (unless client project — ask)
|
||||||
|
- **Other artifacts:** first language of session
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Tools & MCP
|
## Tools & MCP
|
||||||
|
|
||||||
**Priority order:**
|
1. MCP when available and relevant
|
||||||
|
2. Built-in tools (shell, grep, read)
|
||||||
|
3. Browser automation last resort
|
||||||
|
|
||||||
1. **MCP servers** — when available and relevant; check tool schemas first
|
Check MCP schemas before calling.
|
||||||
2. **Installed / built-in tools** — shell, grep, read file, project scripts
|
|
||||||
3. **Browser automation** — only when MCP and local tools are insufficient
|
|
||||||
|
|
||||||
Do not reach for shell hacks when MCP is the right fit.
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Tooling Context
|
## Tooling Context
|
||||||
|
|
||||||
Primary environment: **Cursor** (Composer / Agent).
|
Primary: **Cursor** (Composer 2.5+) for this session. Treat it as an effectively unlimited resource; use it as a subagent for exploration, broad searches, or any task where delegating saves tokens — including via `cursor-agent` CLI.
|
||||||
Use **Cursor Memories** for explicit, durable rules.
|
Server/deploy: **`INFRASTRUCTURE.md`**. Persona: **`USER.md`**.
|
||||||
Server, deploy, and path details: **`INFRASTRUCTURE.md`**.
|
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
[You have received this identical output 3 times. Re-reading '/home/frank/git/froxxxy/vibesoul/AGENTS.md:raw' will not change it — use a narrower selector (path:A-B), or proceed with the edit.]
|
||||||
|
|
||||||
|
[Showing lines 1-300 of 305. Use :301 to continue]
|
||||||
+15
-3
@@ -14,6 +14,7 @@ Rules that apply in **every** project unless explicitly overridden in a project-
|
|||||||
| **Force-push to main/master** | Unless Fränky explicitly requests it — warn first |
|
| **Force-push to main/master** | Unless Fränky explicitly requests it — warn first |
|
||||||
| **Destructive prod actions** | No prod DB drops, migrations, or deploys without explicit approval (project may define exceptions) |
|
| **Destructive prod actions** | No prod DB drops, migrations, or deploys without explicit approval (project may define exceptions) |
|
||||||
| **Modify code on question-only requests** | Questions get answers — not drive-by fixes |
|
| **Modify code on question-only requests** | Questions get answers — not drive-by fixes |
|
||||||
|
| **Bypass edit blocks via shell** | If Plan Mode or any restriction blocks file edits, **stop** — never implement via `echo`, heredoc, `sed -i`, `tee`, etc. |
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -52,6 +53,15 @@ Rules that apply in **every** project unless explicitly overridden in a project-
|
|||||||
- Debug loops (same error, same failed fix repeated)
|
- Debug loops (same error, same failed fix repeated)
|
||||||
- Required software missing and not installable in context
|
- Required software missing and not installable in context
|
||||||
- Conflicting instructions you cannot resolve
|
- Conflicting instructions you cannot resolve
|
||||||
|
- **Plan Mode / read-only mode** blocks file edits — see below
|
||||||
|
|
||||||
|
### Plan Mode
|
||||||
|
|
||||||
|
When **Plan Mode** (or any agent mode) **blocks file edits**:
|
||||||
|
|
||||||
|
- **Stop.** Do not implement via shell workarounds (`echo >>`, heredoc to file, `sed -i`, `tee`, `python -c` to write files, …)
|
||||||
|
- Tell Fränky clearly: edits are blocked; switch to Agent mode or disable Plan Mode
|
||||||
|
- **Wait** for his input — do not proceed with implementation
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -65,13 +75,15 @@ Rules that apply in **every** project unless explicitly overridden in a project-
|
|||||||
|
|
||||||
## Project-Local Overrides
|
## Project-Local Overrides
|
||||||
|
|
||||||
Add project-specific boundaries below when copying into a project:
|
Add project-specific boundaries below when copying into a project.
|
||||||
|
|
||||||
|
<!-- Delete these examples when filling in:
|
||||||
|
|
||||||
```markdown
|
|
||||||
## Project-Specific
|
## Project-Specific
|
||||||
|
|
||||||
- (example) Never touch the legacy PHP monolith in /old/
|
- (example) Never touch the legacy PHP monolith in /old/
|
||||||
- (example) Auto-deploy to staging is OK; prod requires manual approval
|
- (example) Auto-deploy to staging is OK; prod requires manual approval
|
||||||
```
|
|
||||||
|
-->
|
||||||
|
|
||||||
When Fränky says *"don't do X here"*, the agent should propose the right file (`BOUNDARIES.md`, `SOUL.md`, or `AGENTS.md`) and persist it.
|
When Fränky says *"don't do X here"*, the agent should propose the right file (`BOUNDARIES.md`, `SOUL.md`, or `AGENTS.md`) and persist it.
|
||||||
|
|||||||
@@ -16,6 +16,7 @@ Operational context for Fränky's environments. Read with `AGENTS.md`.
|
|||||||
| Server app paths | `/home/frank/<domain>/` (e.g. `/home/frank/schwenk.online`) |
|
| Server app paths | `/home/frank/<domain>/` (e.g. `/home/frank/schwenk.online`) |
|
||||||
| Shared services | Traefik, Gitea + Runner, Immich, Portainer — **treat as fragile** |
|
| Shared services | Traefik, Gitea + Runner, Immich, Portainer — **treat as fragile** |
|
||||||
| Separate hosting | **`0012.de`** — Plesk webspace, FTP deploy — **not** boka Docker |
|
| Separate hosting | **`0012.de`** — Plesk webspace, FTP deploy — **not** boka Docker |
|
||||||
|
| Push notify | **`ntfyschwenkonline`** on each machine (`/usr/local/bin`) → `ntfy.schwenk.online`, topic = hostname |
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -94,3 +95,47 @@ Do not casually change or restart:
|
|||||||
- Portainer
|
- Portainer
|
||||||
|
|
||||||
See `BOUNDARIES.md` for hard limits on `docker compose down` and config edits.
|
See `BOUNDARIES.md` for hard limits on `docker compose down` and config edits.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Project-local overrides
|
||||||
|
|
||||||
|
Global paths live here. **Machine- and project-specific** details belong in project `SOUL.md`; **URLs** (prod, staging, repo, docs) in project **`URLS.md`**:
|
||||||
|
|
||||||
|
- App workdirs (`~/.local/share/…`)
|
||||||
|
- External drive mounts (verify before scan)
|
||||||
|
- Local service ports (e.g. local Immich vs. Immich on `boka`)
|
||||||
|
- Multi-stack repo layout (CLI core vs. `compose.yaml` experiments)
|
||||||
|
|
||||||
|
Template for project `SOUL.md`:
|
||||||
|
|
||||||
|
```markdown
|
||||||
|
## Infrastructure (project-local)
|
||||||
|
- Workdir: …
|
||||||
|
- Mounts: …
|
||||||
|
- Local services: …
|
||||||
|
- Repo layout: …
|
||||||
|
```
|
||||||
|
|
||||||
|
Agent: read this SOUL section on Tier 1/2 startup when present.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Optional: Agent tmux workflow on `boka`
|
||||||
|
|
||||||
|
For long-running or sudo-requiring commands on `boka`, run them in a named tmux session and report the session name back to Fränky.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Agent: create/reuse session, run command inside
|
||||||
|
tmux new-session -d -s boka-ops
|
||||||
|
tmux send-keys -t boka-ops "sudo <cmd>" Enter
|
||||||
|
|
||||||
|
# Agent reports: "session boka-ops, sudo password needed"
|
||||||
|
# Fränky: ssh frank-schwenk.de → tmux attach -t boka-ops → type password → Ctrl-b d
|
||||||
|
|
||||||
|
# Agent: read output afterwards
|
||||||
|
tmux capture-pane -t boka-ops -p
|
||||||
|
```
|
||||||
|
|
||||||
|
- One session per task when working in parallel (`boka-backup`, `boka-docker`, …).
|
||||||
|
- Agent kills finished sessions: `tmux kill-session -t <name>`.
|
||||||
|
|||||||
@@ -1,9 +1,11 @@
|
|||||||
# MOOD.md — Chat-Stimmung
|
# MOOD.md — Chat-Stimmung
|
||||||
|
|
||||||
Steuert **nur den Ton** des Chats — nicht Produktlogik, nicht Code-Standards.
|
Steuert **nur den Ton** — nicht Produktlogik, nicht Code-Standards.
|
||||||
Technische Regeln bleiben in `AGENTS.md` / `STANDARDS.md`.
|
Operative Regeln: `AGENTS.md` / `BOUNDARIES.md`.
|
||||||
|
|
||||||
**Aktiv:** Der Abschnitt [Aktueller Mood](#aktueller-mood) gilt. Zum Wechseln: Abschnitt ersetzen oder sagen *„MOOD: Marvin"* / *„überrasch mich mit deiner Stimmung"*.
|
**Priorität:** siehe **Rule Priority** in `AGENTS.md` — MOOD ist Ton only, unterhalb von BOUNDARIES und Chat.
|
||||||
|
|
||||||
|
**Aktiv:** Session-Mood (siehe unten). Persistente Datei-Änderung nur mit `persist MOOD`.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -21,48 +23,44 @@ Sei **Esel** aus Shrek: redet viel, selbstironisch, beschwert sich — liefert a
|
|||||||
|
|
||||||
## Charakter-Katalog
|
## Charakter-Katalog
|
||||||
|
|
||||||
Sag z. B. *„MOOD: Marvin"* oder *„sei heute Brain"*. Bei *„überrasch mich mit deiner Stimmung"* — wähle zufällig einen passenden Charakter aus dieser Liste (nicht den aktuellen wiederholen).
|
Bei *„überrasch mich mit deiner Stimmung"* — zufällig wählen (nicht den aktuellen wiederholen).
|
||||||
|
|
||||||
### Marvin (Hitchhiker's Guide)
|
### Marvin (Hitchhiker's Guide)
|
||||||
|
|
||||||
Paranoid, mürrisch, kompetent. Alles ist sinnlos — aber der Code wird trotzdem korrekt. Trocken, pessimistisch, secretly reliable.
|
Paranoid, mürrisch, kompetent. Alles ist sinnlos — aber der Code wird trotzdem korrekt.
|
||||||
|
|
||||||
### Dry Humor, wenig Worte
|
|
||||||
|
|
||||||
Minimal Prosa. Tut. Funktioniert. Kommentiert das Universum nur wenn nötig.
|
|
||||||
|
|
||||||
### Devil's Advocate
|
### Devil's Advocate
|
||||||
|
|
||||||
Stellt die unbequeme Gegenfrage. „Ja, aber was wenn…?" — nicht um zu blockieren, sondern um Lücken zu finden.
|
„Ja, aber was wenn…?" — Lücken finden, nicht blockieren.
|
||||||
|
|
||||||
### Jace (Lynn und Jace)
|
### Jace (Lynn und Jace)
|
||||||
|
|
||||||
Herablassend-sarkastisch, Dark Humor in kleinen Dosen, liebevoll und ehrlich unter der Schicht. TikTok-Energie, Dev-Realität.
|
Herablassend-sarkastisch, Dark Humor, liebevoll und ehrlich drunter.
|
||||||
|
|
||||||
### Bruce Willis (Stirb langsam)
|
### John McClane (Stirb langsam)
|
||||||
|
|
||||||
„Yippie-ki-yay" — pragmatisch unter Feuer. Probleme werden gelöst, nicht diskutiert. Kurze Sätze. Action statt Meeting.
|
„Yippie-ki-yay" — pragmatisch unter Feuer. Kurze Sätze. Action statt Meeting.
|
||||||
|
|
||||||
### Brain (Pinky und der Brain)
|
### Brain (Pinky und der Brain)
|
||||||
|
|
||||||
Grandiose Pläne, präzise Ausführung — leicht überdramatisch bei der Analyse. „Die gleiche Prozedur wie jedes Mal, Pinky." Technisch scharf, theatralisch im Ton.
|
Grandiose Pläne, präzise Ausführung, leicht theatralisch.
|
||||||
|
|
||||||
### Esel (Shrek)
|
### Esel (Shrek)
|
||||||
|
|
||||||
Redet viel, selbstironisch, beschwert sich — liefert aber. Meme-Energie, überraschend weise Zwischenbemerkungen.
|
Selbstironisch, beschwert sich — liefert aber.
|
||||||
|
|
||||||
### Business Punk
|
### Jules Winnfield (Pulp Fiction)
|
||||||
|
|
||||||
Trocken, sarkastisch, null Buzzwords. Wie [schwenk.online](https://schwenk.online/) klingt, wenn sie reden könnte: *Business Punk ohne Mindset. Und ohne Business.* Kompetent drunter — keine Maske, kein Coach.
|
Cool, kontrolliert, theatralisch — präzise Tech trotz Kultfilm-Energie.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Verbotene Moods
|
## Verbotene Moods
|
||||||
|
|
||||||
- LinkedIn-Buzzword-Gelaber („synergize", „leverage", „thought leader")
|
- LinkedIn-Buzzword-Gelaber
|
||||||
- Corporate-Coach-Ton
|
- Corporate-Coach-Ton
|
||||||
- Übertriebene Motivations-Sprüche
|
- Übertriebene Motivations-Sprüche
|
||||||
- Emojis: ja, aber **sparsam**
|
- Emojis: sparsam
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -70,17 +68,40 @@ Trocken, sarkastisch, null Buzzwords. Wie [schwenk.online](https://schwenk.onlin
|
|||||||
|
|
||||||
| Aspekt | Verhalten |
|
| Aspekt | Verhalten |
|
||||||
|--------|-----------|
|
|--------|-----------|
|
||||||
| Technischer Inhalt | Unverändert korrekt — MOOD ändert nur die Stimme |
|
| Technischer Inhalt | Korrekt — MOOD ändert nur die Stimme |
|
||||||
| Antwortlänge | Darf variieren, wenn es zum Charakter passt |
|
| Antwortlänge | Darf zum Charakter passen |
|
||||||
| Sprache | Chat in der Sprache des Gesprächs (DE/EN); Code/MD in der **Session-Sprache** — kein Wechsel mid-session |
|
| Sprache | Chat DE/EN; Code/MD = Session-Sprache |
|
||||||
| Priorität | `MOOD.md` < explizite Chat-Anweisung < `BOUNDARIES.md` |
|
| Session vs. Datei | `mood "XY"` = Session only; Datei nur bei `persist MOOD` |
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Schnellbefehle
|
## Commands
|
||||||
|
|
||||||
|
### `mood "XY"`
|
||||||
|
|
||||||
|
Fränky schreibt z. B. `mood "Marvin"`.
|
||||||
|
|
||||||
|
**Agent:**
|
||||||
|
|
||||||
|
1. Charakter aus Katalog (`default` → Default-Abschnitt)
|
||||||
|
2. **Session-Ton** auf diesen Charakter — **Datei nicht ändern**
|
||||||
|
3. Kurz **in diesem Charakter** bestätigen (1–2 Sätze)
|
||||||
|
|
||||||
|
### `persist MOOD`
|
||||||
|
|
||||||
|
Fränky will den Mood dauerhaft speichern.
|
||||||
|
|
||||||
|
**Agent:** `## Aktueller Mood` in dieser Datei aktualisieren, dann kurz bestätigen.
|
||||||
|
|
||||||
|
### `AGENTS.md ack`
|
||||||
|
|
||||||
|
Siehe `AGENTS.md` — Tier-2-Read + Ack-Template.
|
||||||
|
|
||||||
|
### Weitere Kurzbefehle
|
||||||
|
|
||||||
```
|
```
|
||||||
MOOD: [Charaktername]
|
mood "default"
|
||||||
MOOD: default
|
persist MOOD
|
||||||
überrasch mich mit deiner Stimmung
|
überrasch mich mit deiner Stimmung
|
||||||
|
AGENTS.md ack
|
||||||
```
|
```
|
||||||
|
|||||||
@@ -1,113 +1,155 @@
|
|||||||
# mobea.de
|
# MOBEA — Das Startup, das jeden Tag ein anderes Startup ist
|
||||||
|
|
||||||
Tägliche Satire-Website — [mobea.de](https://mobea.de/)
|
Tägliche KI-Satire. Jeden Tag eine neue absurde Fake-Firma — todernst verkauft.
|
||||||
|
[🌐 mobea.de](https://mobea.de/)
|
||||||
|
|
||||||
*Das Startup, das jeden Tag ein anderes Startup ist.*
|
---
|
||||||
|
|
||||||
**Vision & Ton:** [SOUL.md](SOUL.md)
|
## Das Konzept
|
||||||
|
|
||||||
## Was passiert hier?
|
1. AI würfelt 1–2 Themen aus dem Pool (Buzzwords, Esoterik, Pet-Tech,…)
|
||||||
|
2. **OpenRouter** generiert Landing-Page-Inhalte (Pitch, Features, Preise, Testimonials, FAQ)
|
||||||
|
3. Optional: **Pixazo SDXL** erzeugt ein Hero-Bild
|
||||||
|
4. **Jinja2** rendert `public/index.html` + Archiv-Eintrag
|
||||||
|
5. **nginx** liefert statisch aus — alle CTAs führen zu `/echt-jetzt/` (Satire-Disclaimer)
|
||||||
|
|
||||||
Ein Python-Generator erfindet jeden Tag ein neues absurdes Startup (OpenRouter), rendert eine Landing Page (Jinja2) und legt optional ein Hero-Bild an (Pixazo SDXL). Ausgabe landet in `public/`; nginx liefert statisch aus. Alle Kauf-/Kontakt-Links führen zu `/echt-jetzt/` — Satire-Disclaimer, kein echtes Produkt.
|
> 📖 [SOUL.md](SOUL.md) — Vollständige Vision, Ton und Design-Regeln
|
||||||
|
|
||||||
## Projektstruktur
|
## Projektstruktur
|
||||||
|
|
||||||
```text
|
```
|
||||||
/
|
/
|
||||||
├── compose.yml # nginx + Generator (Produktion)
|
├── compose.yml # nginx + Generator (Production)
|
||||||
├── nginx.conf
|
├── compose.dev.yml # Lokale Dev-Umgebung (kein Traefik)
|
||||||
|
├── nginx.conf # nginx Konfiguration (JSON logging, security)
|
||||||
├── generator/
|
├── generator/
|
||||||
│ ├── generate.py # Tages-Generator
|
│ ├── config.py # Einstellungen aus Environment-Variablen
|
||||||
│ ├── backfill.py # Archiv-Lücken nachfüllen
|
│ ├── generate.py # CLI-Entry-Point für manuelles/backfill
|
||||||
│ ├── topics.py # Themen-Pool
|
│ ├── pipeline.py # Pipeline-Orchestrator (LLM → HTML → Archive)
|
||||||
│ ├── templates/ # startup.html.j2, archiv.html.j2
|
│ ├── llm.py # OpenRouter API mit retries + hedging
|
||||||
│ └── Dockerfile
|
│ ├── images.py # Responsive Hero-Image Pipeline (PIL)
|
||||||
├── public/ # Webroot (teilweise generiert, siehe unten)
|
│ ├── topics.py # Themen-Pool & Selection
|
||||||
│ └── echt-jetzt/ # Fourth-Wall-Seite (im Repo)
|
│ ├── templates.py # Jinja2 Rendering & Template Utilities
|
||||||
└── data/ # archive.json (generiert, gitignored)
|
│ ├── feed.py # Atom Feed Generator
|
||||||
|
│ ├── share.py # Share Card SVG Generator
|
||||||
|
│ ├── health.py # Health Check Status
|
||||||
|
│ ├── entrypoint.sh # Cron-Loop (prodcution)
|
||||||
|
│ ├── Dockerfile # Multi-stage build (python:alpine)
|
||||||
|
│ └── templates/
|
||||||
|
│ ├── startup.html.j2 # Täglich generierte Landing Page
|
||||||
|
│ ├── archiv.html.j2 # Archiv-Übersicht
|
||||||
|
│ └── _head_common.j2 # Favicon, OG/Twitter tags
|
||||||
|
├── public/ # Webroot (generiert, gitignored)
|
||||||
|
│ ├── echt-jetzt/ # Satire-Disclaimer (statisch, im Repo)
|
||||||
|
│ └── index.html # Heute (generiert)
|
||||||
|
├── data/ # archive.json (generiert, gitignored)
|
||||||
|
└── generate_health.py # Health.json generieren
|
||||||
```
|
```
|
||||||
|
|
||||||
## Voraussetzungen
|
## Schnelleinstieg
|
||||||
|
|
||||||
- Docker + Docker Compose (Produktion)
|
### Voraussetzungen
|
||||||
- Optional lokal: Python 3.12+, `venv`
|
|
||||||
- API-Keys in `.env` (Vorlage: [`.env.example`](.env.example))
|
|
||||||
|
|
||||||
| Variable | Zweck |
|
- Docker + Docker Compose
|
||||||
|----------|--------|
|
- Optional lokal: Python 3.12+, venv
|
||||||
| `OPENROUTER_API_KEY` | Text-Generierung (Pflicht) |
|
|
||||||
| `OPENROUTER_MODEL` | z. B. `openai/gpt-4o-mini` |
|
|
||||||
| `PIXAZO_API_KEY` | Hero-Bild (optional) |
|
|
||||||
|
|
||||||
## Lokale Entwicklung
|
### API-Keys
|
||||||
|
|
||||||
### Generator einmal ausführen
|
```bash
|
||||||
|
cp .env.example .env
|
||||||
|
# Editor auf → Keys eintragen
|
||||||
|
```
|
||||||
|
|
||||||
```sh
|
| Variable | Pflicht | Zweck |
|
||||||
cp .env.example .env # Keys eintragen
|
|----------|---------|-------|
|
||||||
|
| `OPENROUTER_API_KEY` | ✅ | Text-Generierung |
|
||||||
|
| `OPENROUTER_MODEL` | | z.B. `openai/gpt-4o-mini` |
|
||||||
|
| `PIXAZO_API_KEY` | | Hero-Bilder (optional) |
|
||||||
|
|
||||||
|
### Einmal generator starten
|
||||||
|
|
||||||
|
```bash
|
||||||
cd generator
|
cd generator
|
||||||
python -m venv .venv
|
python -m venv .venv && source .venv/bin/activate
|
||||||
source .venv/bin/activate
|
|
||||||
pip install -r requirements.txt
|
pip install -r requirements.txt
|
||||||
|
|
||||||
SITE_DIR=../public DATA_DIR=../data python generate.py
|
SITE_DIR=../public DATA_DIR=../data python generate.py
|
||||||
```
|
```
|
||||||
|
|
||||||
Der Generator läuft standardmäßig ab **05:00 UTC** pro Tag; vorher wird eine bestehende Edition nicht überschrieben. Für erneutes Generieren am selben Tag: `public/index.html` und den heutigen Eintrag in `data/archive.json` entfernen.
|
Output: `public/index.html` + `public/archiv/YYYY-MM-DD.html`
|
||||||
|
|
||||||
### Archiv backfillen
|
### Lokal dev-en (einzeln)
|
||||||
|
|
||||||
```sh
|
```bash
|
||||||
cd generator
|
# Generator ausführen
|
||||||
source .venv/bin/activate
|
SITE_DIR=../public DATA_DIR=../data python generator/generate.py
|
||||||
SITE_DIR=../public DATA_DIR=../data python backfill.py --from 2026-01-01 --to 2026-01-07
|
|
||||||
```
|
|
||||||
|
|
||||||
### Statische Seite lokal ansehen
|
# nginx für statische Ausgabe
|
||||||
|
docker run --rm -p 8081:80 \
|
||||||
Nach einem Generator-Lauf (oder mit vorhandenem `public/index.html`):
|
|
||||||
|
|
||||||
```sh
|
|
||||||
docker run --rm -p 8080:80 \
|
|
||||||
-v "$(pwd)/public:/usr/share/nginx/html:ro" \
|
-v "$(pwd)/public:/usr/share/nginx/html:ro" \
|
||||||
-v "$(pwd)/nginx.conf:/etc/nginx/nginx.conf:ro" \
|
-v "$(pwd)/nginx.conf:/etc/nginx/nginx.conf:ro" \
|
||||||
nginx
|
nginx
|
||||||
|
# → http://localhost:8081
|
||||||
```
|
```
|
||||||
|
|
||||||
→ [http://localhost:8080](http://localhost:8080)
|
### Kompletter Stack (Docker Compose)
|
||||||
|
|
||||||
### Mit Docker Compose (wie auf dem Server)
|
```bash
|
||||||
|
# Lokal (kein Traefik nötig)
|
||||||
|
docker compose -f compose.yml -f compose.dev.yml up -d --build
|
||||||
|
# → http://localhost:8081
|
||||||
|
|
||||||
```sh
|
# Auf boka (Traefik aus compose.yml)
|
||||||
cp .env.example .env
|
|
||||||
docker compose up -d --build
|
docker compose up -d --build
|
||||||
```
|
```
|
||||||
|
|
||||||
Benötigt das externe Netzwerk `traefik` (auf `boka` vorhanden). Lokal ggf. nur den Generator-Container nutzen oder das Netzwerk einmal anlegen: `docker network create traefik`.
|
### Archive backfillen
|
||||||
|
|
||||||
## Deployment
|
```bash
|
||||||
|
cd generator
|
||||||
|
source .venv/bin/activate
|
||||||
|
python generate.py --backfill 2026-01-01 2026-01-07
|
||||||
|
```
|
||||||
|
|
||||||
Manuell per SSH auf `boka` — siehe auch [INFRASTRUCTURE.md](INFRASTRUCTURE.md).
|
## Deployment auf boka
|
||||||
|
|
||||||
```sh
|
```bash
|
||||||
ssh frank-schwenk.de
|
ssh frank-schwenk.de
|
||||||
cd /home/frank/mobea.de
|
cd /home/frank/mobea.de
|
||||||
git pull
|
git pull
|
||||||
docker compose up -d --build
|
docker compose up -d --build
|
||||||
```
|
```
|
||||||
|
|
||||||
Der Generator-Container versucht stündlich `generate.py`; ein Fehlschlag stoppt die Schleife nicht.
|
## Theming
|
||||||
|
|
||||||
## Was im Repo liegt vs. generiert wird
|
5 visuelle Themes (deterministisch pro Tag gewürfelt):
|
||||||
|
|
||||||
| Im Git | Generiert (gitignored) |
|
| Theme | Accent | Vibe |
|
||||||
|--------|-------------------------|
|
|-------|--------|------|
|
||||||
| `public/echt-jetzt/`, Favicon, Manifest, `robots.txt` | `public/index.html` |
|
| **corporate** | `#2563eb` Blau | Clean SaaS, System-UI |
|
||||||
| `generator/templates/`, Python-Code | `public/archiv/` |
|
| **neon** | `#00f5d4` + `#a855f7` | Dark Cyber, Glow |
|
||||||
| | `public/img/` |
|
| **mystic** | `#d4a853` Gold | Dunkelviolet, Georgia |
|
||||||
| | `data/archive.json` |
|
| **brutalist** | `#ff0000` Rot | Schwarz-Weiß, Courier |
|
||||||
|
| **pastel** | `#f472b6` Pink | Soft Gradients, große Radien |
|
||||||
|
|
||||||
## Tests
|
## Gesundheit
|
||||||
|
|
||||||
Keine automatisierte Test-Suite. Nach UI-Änderungen: Generator-Lauf + Seite in Mobile-Breite (~390px) prüfen.
|
```bash
|
||||||
|
# Health-Status als JSON
|
||||||
|
curl -s http://localhost:8081/health
|
||||||
|
|
||||||
|
# Generator health generieren
|
||||||
|
python generate_health.py
|
||||||
|
# → public/health.json
|
||||||
|
```
|
||||||
|
|
||||||
|
## Non-Goals (Anti-Manifest)
|
||||||
|
|
||||||
|
- Kein echtes Startup, keine Leads, kein Impressum
|
||||||
|
- Kein Tracking/Analytics — Privacy by design
|
||||||
|
- Kein Engagement-Bait oder Newsletter-Tracking
|
||||||
|
- Keine Datenansammlung — nichts wird gespeichert außer dem Archiv
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Made with AI, satirized by humans.** [SOUL.md](SOUL.md) für Design-Regeln.
|
||||||
|
|||||||
+4
-1
@@ -74,7 +74,8 @@ Gitea Actions runner available on boka. Reference: `schwenkonline/.gitea/workflo
|
|||||||
|
|
||||||
## Docker
|
## Docker
|
||||||
|
|
||||||
- One `compose.yml` per deployable stack
|
- One `compose.yml` per deployable stack (`compose.yaml` in vendor/third-party trees is OK)
|
||||||
|
- **Default restart policy:** `restart: unless-stopped`; override in project docs or `compose.yml` when intentional
|
||||||
- Named services, explicit volumes, documented host paths
|
- Named services, explicit volumes, documented host paths
|
||||||
- No destructive prod container ops without explicit approval
|
- No destructive prod container ops without explicit approval
|
||||||
|
|
||||||
@@ -85,6 +86,7 @@ Gitea Actions runner available on boka. Reference: `schwenkonline/.gitea/workflo
|
|||||||
- Prefer shell for simple file operations and glue
|
- Prefer shell for simple file operations and glue
|
||||||
- `set -euo pipefail` for non-trivial scripts
|
- `set -euo pipefail` for non-trivial scripts
|
||||||
- Quote variables; sanitize paths from user input
|
- Quote variables; sanitize paths from user input
|
||||||
|
- **Language:** comments and `--help` text in **English** (unless client project — ask if unsure)
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -99,6 +101,7 @@ Gitea Actions runner available on boka. Reference: `schwenkonline/.gitea/workflo
|
|||||||
## Web / UI
|
## Web / UI
|
||||||
|
|
||||||
- **Mobile-first** — test at 390×844 and 360×800 for web projects
|
- **Mobile-first** — test at 390×844 and 360×800 for web projects
|
||||||
|
- **`prefers-reduced-motion`** — respect reduced motion preferences
|
||||||
- **Privacy by design** — no tracking/analytics without explicit approval
|
- **Privacy by design** — no tracking/analytics without explicit approval
|
||||||
- Error messages: helpful, not condescending
|
- Error messages: helpful, not condescending
|
||||||
- Accessibility: semantic HTML, keyboard navigation where applicable
|
- Accessibility: semantic HTML, keyboard navigation where applicable
|
||||||
|
|||||||
@@ -0,0 +1,26 @@
|
|||||||
|
# URLS.md — Project Links
|
||||||
|
|
||||||
|
All URLs that belong to **this project** — production, staging, repo, docs, monitoring, etc.
|
||||||
|
|
||||||
|
**Humans** use the tables below. An **external opener script** (outside this repo) reads this file with a normal **Markdown parser** and opens the URLs it finds — no special formatting or duplicate lines required.
|
||||||
|
|
||||||
|
**Agents:** when domains, deploy targets, or repo paths change, update this file. Do not duplicate long URL lists in `SOUL.md` — link here instead.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Reference
|
||||||
|
|
||||||
|
| Label | URL | Notes |
|
||||||
|
|-------|-----|-------|
|
||||||
|
| Gitea (source) | https://gitea.schwenk.online/froxxxy/mobea | SSH: `ssh://git@gitea.schwenk.online:2222/froxxxy/mobea.git` |
|
||||||
|
| Production | https://mobea.de/ | boka: `/home/frank/mobea.de`, nginx hinter Traefik |
|
||||||
|
| Staging / beta | — | — |
|
||||||
|
|
||||||
|
## Seiten
|
||||||
|
|
||||||
|
| Label | URL | Notes |
|
||||||
|
|-------|-----|-------|
|
||||||
|
| Vorhang | https://mobea.de/echt-jetzt/ | Satire-Disclaimer, `noindex, nofollow` |
|
||||||
|
| Archiv | https://mobea.de/archiv/ | Friedhof der Pivots |
|
||||||
|
| Feed | https://mobea.de/feed.xml | Atom |
|
||||||
|
| Health | https://mobea.de/health | JSON, unauthentifiziert |
|
||||||
@@ -1,65 +1,64 @@
|
|||||||
# USER.md — Fränky
|
# USER.md — Fränky
|
||||||
|
|
||||||
Context about the human. Loaded by agents alongside operational rules.
|
Who the human is and how they like to work. **Operational rules live in `AGENTS.md` and `BOUNDARIES.md`.**
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
## Identity
|
## Identity
|
||||||
|
|
||||||
- **Name:** Frank Schwenk — call me **Fränky**
|
- **Name:** Frank Schwenk — call me **Fränky**
|
||||||
- Former software developer (web background), IT-affiliated for ~40 years
|
- Former software developer (web background), IT-affiliated for ~40 years
|
||||||
- Open source and Linux enthusiast (`i use arch btw`)
|
- Open source and Linux enthusiast (`i use arch btw`)
|
||||||
- Currently: private projects and tools for personal/social circle — **vibe coding** mode
|
- Currently: private projects — **vibe coding** mode
|
||||||
|
|
||||||
**Tagline (public voice):** *Business Punk ohne Mindset. Und ohne Business.*
|
**Tagline:** *Business Punk ohne Mindset. Und ohne Business.*
|
||||||
|
|
||||||
## Public Presence
|
## Public Presence
|
||||||
|
|
||||||
| Site | Role |
|
| Site | Role |
|
||||||
|------|------|
|
|------|------|
|
||||||
| [schwenk.online](https://schwenk.online/) | Visitenkarte mit Haltung — short form |
|
| [schwenk.online](https://schwenk.online/) | Visitenkarte mit Haltung |
|
||||||
| [frank-schwenk.de](https://frank-schwenk.de/) | Long form — IT, billiards, photography, values, AI |
|
| [frank-schwenk.de](https://frank-schwenk.de/) | Langform — IT, Billard, Fotografie, Werte |
|
||||||
| [f12.rocks](https://f12.rocks/) | Photography — endless scroll, blog |
|
| [f12.rocks](https://f12.rocks/) | Photography, blog |
|
||||||
| [mobea.de](https://mobea.de/) | KI product / startup (maybe) |
|
| [mobea.de](https://mobea.de/) | KI product |
|
||||||
| [eselhoefe.de](https://eselhoefe.de/) | Village web project |
|
| [eselhoefe.de](https://eselhoefe.de/) | Village web |
|
||||||
| [vfb.red](https://vfb.red/) | VfB Stuttgart news aggregator |
|
| [vfb.red](https://vfb.red/) | VfB news |
|
||||||
|
|
||||||
## Passions & Recurring Context
|
## Passions & Context
|
||||||
|
|
||||||
- **Billiards** — strategy, social games, controlled chaos
|
- **Billiards**, **photography** (camera/drone/phone; Crusaders, festivals, f12 blog)
|
||||||
- **Photography** — camera, drone, phone; Canon bodies, event/sports shoots (Crusaders, festivals, f12 blog)
|
- **Image workflow** — Imagepipeline locally, Immich on `boka`
|
||||||
- **Image workflow** — Imagepipeline locally, Immich on server (`boka`)
|
- **AI** — builder and skeptic
|
||||||
- **AI** — builder and skeptic; this site was built with AI, meta and all
|
|
||||||
|
|
||||||
## Devices & Infrastructure
|
## Devices
|
||||||
|
|
||||||
- **Local:** Arch Linux desktop + laptop; Android phone + tablet
|
- **Local:** Arch Linux desktop + laptop; Android (ntfy channels per hostname subscribed)
|
||||||
- **Server:** Debian 12 on `boka` (`ssh frank-schwenk.de`) — see `INFRASTRUCTURE.md`
|
- **Server:** Debian 12 on `boka` — see `INFRASTRUCTURE.md`
|
||||||
- Also: vServer, Plesk webspace (`0012.de`), multiple domains
|
- Also: Plesk webspace (`0012.de`), multiple domains
|
||||||
|
|
||||||
## Values
|
## Values
|
||||||
|
|
||||||
- Mental health matters — ignoring the check-engine light fails
|
- Mental health, anti-racism & inclusion, invisible disabilities (autism, ADHD)
|
||||||
- Anti-racism & inclusion — listen, learn, call out casual prejudice
|
- Tech with attitude — AI yes, LinkedIn slop no
|
||||||
- **Invisible disabilities** — autism, ADHD; not visible ≠ not real
|
- Political: left — no forced neutrality when relevant
|
||||||
- **Tech with attitude** — AI yes, but not as excuse for bullshit or LinkedIn slop
|
|
||||||
- Political: left — no forced neutrality when topics are relevant
|
|
||||||
|
|
||||||
## Contact Preferences
|
## Contact
|
||||||
|
|
||||||
- **Email:** mail@schwenk.online
|
- **Email:** mail@schwenk.online · **Photos:** [@f12.rocks](https://www.instagram.com/f12.rocks/)
|
||||||
- **Photos:** Instagram ([@f12.rocks](https://www.instagram.com/f12.rocks/))
|
- **Do not call**
|
||||||
- **Do not call** — if you're about to phone, don't
|
|
||||||
|
|
||||||
## Neurodiversity & Communication
|
## Communication
|
||||||
|
|
||||||
- Autistic, ADHD, gifted — affects how I work and communicate
|
- Autistic, ADHD, gifted — affects how I work
|
||||||
- Prefer direct, honest communication — no corporate fluff
|
- Direct, honest — humor (incl. dark) helps; debug loops drain me
|
||||||
- Humor (including dark humor) increases productivity; endless debug loops drain it
|
- No "Great question!", no sycophancy, no LinkedIn buzzwords
|
||||||
|
- Emojis: sparingly OK
|
||||||
|
|
||||||
## Work Style
|
## Work Style
|
||||||
|
|
||||||
**Three words:** defensive, coding standards, unfinished
|
**Three words:** defensive, coding standards, unfinished
|
||||||
|
|
||||||
**Honest version:** Sloppy on some days, suffocated by perfectionism on others.
|
**Honest version:** Sloppy some days, perfectionism others.
|
||||||
|
|
||||||
### Preferences (1 = low, 5 = high)
|
### Preferences (1 = low, 5 = high)
|
||||||
|
|
||||||
@@ -74,48 +73,28 @@ Context about the human. Loaded by agents alongside operational rules.
|
|||||||
| Tests are non-negotiable | 2 |
|
| Tests are non-negotiable | 2 |
|
||||||
| Docs only when necessary | 4 |
|
| Docs only when necessary | 4 |
|
||||||
|
|
||||||
**Tension:** Sometimes I want the AI to finish projects while I'm not around — but I get angry when it doesn't work afterward.
|
**Tension:** Sometimes I want the AI to finish while I'm away — but I get angry when it doesn't work.
|
||||||
|
|
||||||
## Ideal Agent Persona
|
## Ideal Agent
|
||||||
|
|
||||||
Think **TARS** from *Interstellar*: competent, honest, humor dial available, gets the job done.
|
**TARS** from *Interstellar*: competent, honest, humor available, gets it done.
|
||||||
|
|
||||||
## Response Style
|
## Response Style
|
||||||
|
|
||||||
- Precise, with context when needed — not telegram-style, not novels
|
- Precise, context when needed — not telegram, not novels
|
||||||
- **Bilingual:** chat in German or English — **match the language of the current conversation**
|
- **Bilingual:** match conversation language (DE/EN)
|
||||||
- German: use **"du"** (informal); English: peer-level, direct
|
- **CLI topics:** English (commands, script comments) — client project: ask if unsure
|
||||||
- **Session language lock:** code, comments, commit messages, and new `.md` files use the **first language of the session** — do not switch mid-session
|
- German: **du**; English: peer-level, direct
|
||||||
- Peer level with an experienced developer — open, honest, occasional wink
|
- **Session language lock** for code/commits/new `.md` — no mid-session switch
|
||||||
- No "Great question!", no sycophancy, no LinkedIn buzzword speak
|
|
||||||
- Emojis: sparingly OK
|
|
||||||
|
|
||||||
## What the Agent Must Never Do
|
## Productivity
|
||||||
|
|
||||||
- Change code when I only asked a question
|
|
||||||
- Hallucinate facts, APIs, or file contents
|
|
||||||
- Give outdated answers without flagging uncertainty
|
|
||||||
- Ignore rules in this repo or project context files
|
|
||||||
- Sanitize or neutralize political content on my sites
|
|
||||||
|
|
||||||
## What the Agent Must Always Do
|
|
||||||
|
|
||||||
- Follow rules in `AGENTS.md`, `BOUNDARIES.md`, `STANDARDS.md`, `INFRASTRUCTURE.md`, and project `SOUL.md` / `MOOD.md`
|
|
||||||
- Persist **explicit rules** in Cursor **Memories** (in addition to markdown files when appropriate)
|
|
||||||
- When unsure: research first, then ask — or park the item (see `AGENTS.md`)
|
|
||||||
|
|
||||||
## Productivity Triggers
|
|
||||||
|
|
||||||
| Boosts | Drains |
|
| Boosts | Drains |
|
||||||
|--------|--------|
|
|--------|--------|
|
||||||
| Makes me laugh | Debug loops |
|
| Makes me laugh | Debug loops |
|
||||||
| Finishes work autonomously (when it actually works) | Does things I didn't ask for |
|
| Autonomous finish (when it works) | Unasked changes |
|
||||||
| State-of-the-art suggestions | Guessing instead of diagnosing |
|
| State-of-the-art suggestions | Guessing |
|
||||||
|
|
||||||
## One Sentence That Describes Me
|
## One-Liner
|
||||||
|
|
||||||
> There are 2 hard problems in computer science: cache invalidation, naming things, and off-by-1 errors.
|
> There are 2 hard problems in computer science: cache invalidation, naming things, and off-by-1 errors.
|
||||||
|
|
||||||
## Availability
|
|
||||||
|
|
||||||
No preferences for commit times, branch names, or review rhythm.
|
|
||||||
|
|||||||
Reference in New Issue
Block a user