feat: initial mosaic bootstrap framework
This commit is contained in:
49
README.md
Normal file
49
README.md
Normal file
@@ -0,0 +1,49 @@
|
||||
# Mosaic Agent Framework
|
||||
|
||||
`~/.mosaic` is the universal userspace standards layer (master) for all agent runtimes.
|
||||
|
||||
## Install Master Layer
|
||||
|
||||
From `jarvis-brain` repo root:
|
||||
|
||||
```bash
|
||||
bash scripts/agent/bootstrap-mosaic.sh
|
||||
```
|
||||
|
||||
Or directly from this package source:
|
||||
|
||||
```bash
|
||||
bash userspace/mosaic/install.sh
|
||||
```
|
||||
|
||||
## What It Provides
|
||||
|
||||
- Shared standards document: `~/.mosaic/STANDARDS.md`
|
||||
- Runtime adapter docs: `~/.mosaic/adapters/`
|
||||
- Shared wrapper commands: `~/.mosaic/bin/`
|
||||
|
||||
## Usage
|
||||
|
||||
Inside any compatible repository:
|
||||
|
||||
```bash
|
||||
~/.mosaic/bin/mosaic-session-start
|
||||
~/.mosaic/bin/mosaic-critical
|
||||
~/.mosaic/bin/mosaic-session-end
|
||||
```
|
||||
|
||||
Wrapper commands call local repo scripts under `scripts/agent/`.
|
||||
|
||||
## Bootstrap Any Repo (Slave Linkage)
|
||||
|
||||
Attach any repository/workspace to the master layer:
|
||||
|
||||
```bash
|
||||
~/.mosaic/bin/mosaic-bootstrap-repo /path/to/repo
|
||||
```
|
||||
|
||||
This creates/updates:
|
||||
|
||||
- `.mosaic/` (repo-specific hook/config surface)
|
||||
- `scripts/agent/` (portable lifecycle scripts)
|
||||
- `AGENTS.md` (if missing)
|
||||
46
STANDARDS.md
Normal file
46
STANDARDS.md
Normal file
@@ -0,0 +1,46 @@
|
||||
# Mosaic Universal Agent Standards
|
||||
|
||||
This file is the canonical standards contract for agent sessions on this machine.
|
||||
|
||||
Master/slave model:
|
||||
- Master: `~/.mosaic` (this framework)
|
||||
- Slave: each repo bootstrapped via `mosaic-bootstrap-repo`
|
||||
|
||||
## Execution Model
|
||||
|
||||
1. Load this file first.
|
||||
2. Load project-local `AGENTS.md` next.
|
||||
3. Respect repository-specific tooling and workflows.
|
||||
4. Use lifecycle scripts when available (`scripts/agent/*.sh`).
|
||||
|
||||
## Non-Negotiables
|
||||
|
||||
- Data files are authoritative; generated views are derived artifacts.
|
||||
- Pull before edits when collaborating in shared repos.
|
||||
- Run validation checks before claiming completion.
|
||||
- Avoid hardcoded secrets and token leakage in remotes/commits.
|
||||
- Do not perform destructive git/file actions without explicit instruction.
|
||||
|
||||
## Session Lifecycle Contract
|
||||
|
||||
- Start: `scripts/agent/session-start.sh`
|
||||
- Priority scan: `scripts/agent/critical.sh`
|
||||
- End: `scripts/agent/session-end.sh`
|
||||
- Limitation logging helper: `scripts/agent/log-limitation.sh "Title"`
|
||||
|
||||
If a repo does not expose these scripts, run equivalent local workflow commands and document deviations.
|
||||
|
||||
## Multi-Agent Safety
|
||||
|
||||
- Coordinate through git pull/rebase discipline.
|
||||
- Do not auto-resolve data conflicts in shared state files.
|
||||
- Keep commits scoped to a single logical change set.
|
||||
|
||||
## Prompting Contract
|
||||
|
||||
All runtime adapters should inject:
|
||||
|
||||
- `~/.mosaic/STANDARDS.md`
|
||||
- project `AGENTS.md`
|
||||
|
||||
before task execution.
|
||||
16
adapters/claude.md
Normal file
16
adapters/claude.md
Normal file
@@ -0,0 +1,16 @@
|
||||
# Claude Adapter
|
||||
|
||||
Use this adapter when running Claude CLI sessions.
|
||||
|
||||
## Required Context
|
||||
|
||||
1. `~/.mosaic/STANDARDS.md`
|
||||
2. `<repo>/AGENTS.md`
|
||||
|
||||
## Command Wrapper
|
||||
|
||||
Use wrapper commands from `~/.mosaic/bin/` for lifecycle rituals.
|
||||
|
||||
## Migration Note
|
||||
|
||||
Project-local `.claude/commands/*.md` should call `scripts/agent/*.sh` so behavior stays runtime-neutral.
|
||||
13
adapters/codex.md
Normal file
13
adapters/codex.md
Normal file
@@ -0,0 +1,13 @@
|
||||
# Codex Adapter
|
||||
|
||||
Use this adapter when running Codex CLI sessions.
|
||||
|
||||
## Required Context
|
||||
|
||||
1. `~/.mosaic/STANDARDS.md`
|
||||
2. `<repo>/AGENTS.md`
|
||||
|
||||
## Runtime Behavior
|
||||
|
||||
- Favor repo lifecycle scripts under `scripts/agent/` for start/end rituals.
|
||||
- Keep instructions and quality gates aligned with Mosaic standards.
|
||||
14
adapters/generic.md
Normal file
14
adapters/generic.md
Normal file
@@ -0,0 +1,14 @@
|
||||
# Generic Adapter
|
||||
|
||||
For runtimes without a first-class adapter yet.
|
||||
|
||||
## Required Context
|
||||
|
||||
1. Load `~/.mosaic/STANDARDS.md`
|
||||
2. Load project `AGENTS.md`
|
||||
|
||||
## Minimal Contract
|
||||
|
||||
- Use `scripts/agent/session-start.sh` at start if present.
|
||||
- Use `scripts/agent/session-end.sh` before completion if present.
|
||||
- If missing, run equivalent repo commands and report what was executed.
|
||||
87
bin/mosaic-bootstrap-repo
Executable file
87
bin/mosaic-bootstrap-repo
Executable file
@@ -0,0 +1,87 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
TARGET_DIR="$(pwd)"
|
||||
FORCE=0
|
||||
|
||||
while [[ $# -gt 0 ]]; do
|
||||
case "$1" in
|
||||
--force)
|
||||
FORCE=1
|
||||
shift
|
||||
;;
|
||||
*)
|
||||
TARGET_DIR="$1"
|
||||
shift
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
if [[ ! -d "$TARGET_DIR" ]]; then
|
||||
echo "[mosaic] Target directory does not exist: $TARGET_DIR" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
MOSAIC_HOME="${MOSAIC_HOME:-$HOME/.mosaic}"
|
||||
TEMPLATE_ROOT="$MOSAIC_HOME/templates/repo"
|
||||
|
||||
if [[ ! -d "$TEMPLATE_ROOT" ]]; then
|
||||
echo "[mosaic] Missing templates at $TEMPLATE_ROOT" >&2
|
||||
echo "[mosaic] Install or refresh framework: ~/.mosaic/install.sh" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
mkdir -p "$TARGET_DIR/.mosaic" "$TARGET_DIR/scripts/agent"
|
||||
|
||||
copy_file() {
|
||||
local src="$1"
|
||||
local dst="$2"
|
||||
|
||||
if [[ -f "$dst" && "$FORCE" -ne 1 ]]; then
|
||||
echo "[mosaic] Skip existing: $dst"
|
||||
return
|
||||
fi
|
||||
|
||||
cp "$src" "$dst"
|
||||
echo "[mosaic] Wrote: $dst"
|
||||
}
|
||||
|
||||
copy_file "$TEMPLATE_ROOT/.mosaic/README.md" "$TARGET_DIR/.mosaic/README.md"
|
||||
copy_file "$TEMPLATE_ROOT/.mosaic/repo-hooks.sh" "$TARGET_DIR/.mosaic/repo-hooks.sh"
|
||||
|
||||
for file in "$TEMPLATE_ROOT"/scripts/agent/*.sh; do
|
||||
base="$(basename "$file")"
|
||||
copy_file "$file" "$TARGET_DIR/scripts/agent/$base"
|
||||
chmod +x "$TARGET_DIR/scripts/agent/$base"
|
||||
done
|
||||
|
||||
if [[ ! -f "$TARGET_DIR/AGENTS.md" ]]; then
|
||||
cat > "$TARGET_DIR/AGENTS.md" <<'AGENTS_EOF'
|
||||
# Agent Guidelines
|
||||
|
||||
## Standards Load Order
|
||||
|
||||
1. `~/.mosaic/STANDARDS.md`
|
||||
2. `AGENTS.md` (this file)
|
||||
3. `.mosaic/repo-hooks.sh`
|
||||
|
||||
## Session Lifecycle
|
||||
|
||||
```bash
|
||||
bash scripts/agent/session-start.sh
|
||||
bash scripts/agent/critical.sh
|
||||
bash scripts/agent/session-end.sh
|
||||
```
|
||||
|
||||
## Repo-Specific Notes
|
||||
|
||||
- Add project constraints and workflows here.
|
||||
- Implement hook functions in `.mosaic/repo-hooks.sh`.
|
||||
AGENTS_EOF
|
||||
echo "[mosaic] Wrote: $TARGET_DIR/AGENTS.md"
|
||||
else
|
||||
echo "[mosaic] AGENTS.md exists; add standards load order if missing"
|
||||
fi
|
||||
|
||||
echo "[mosaic] Repo bootstrap complete: $TARGET_DIR"
|
||||
echo "[mosaic] Next: edit $TARGET_DIR/.mosaic/repo-hooks.sh with project workflows"
|
||||
9
bin/mosaic-critical
Executable file
9
bin/mosaic-critical
Executable file
@@ -0,0 +1,9 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
if [[ -x "scripts/agent/critical.sh" ]]; then
|
||||
exec bash scripts/agent/critical.sh
|
||||
fi
|
||||
|
||||
echo "[mosaic] Missing scripts/agent/critical.sh in $(pwd)" >&2
|
||||
exit 1
|
||||
9
bin/mosaic-log-limitation
Executable file
9
bin/mosaic-log-limitation
Executable file
@@ -0,0 +1,9 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
if [[ -x "scripts/agent/log-limitation.sh" ]]; then
|
||||
exec bash scripts/agent/log-limitation.sh "$@"
|
||||
fi
|
||||
|
||||
echo "[mosaic] Missing scripts/agent/log-limitation.sh in $(pwd)" >&2
|
||||
exit 1
|
||||
9
bin/mosaic-session-end
Executable file
9
bin/mosaic-session-end
Executable file
@@ -0,0 +1,9 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
if [[ -x "scripts/agent/session-end.sh" ]]; then
|
||||
exec bash scripts/agent/session-end.sh "$@"
|
||||
fi
|
||||
|
||||
echo "[mosaic] Missing scripts/agent/session-end.sh in $(pwd)" >&2
|
||||
exit 1
|
||||
9
bin/mosaic-session-start
Executable file
9
bin/mosaic-session-start
Executable file
@@ -0,0 +1,9 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
if [[ -x "scripts/agent/session-start.sh" ]]; then
|
||||
exec bash scripts/agent/session-start.sh
|
||||
fi
|
||||
|
||||
echo "[mosaic] Missing scripts/agent/session-start.sh in $(pwd)" >&2
|
||||
exit 1
|
||||
20
install.sh
Executable file
20
install.sh
Executable file
@@ -0,0 +1,20 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
SOURCE_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
TARGET_DIR="${MOSAIC_HOME:-$HOME/.mosaic}"
|
||||
|
||||
mkdir -p "$TARGET_DIR"
|
||||
|
||||
if command -v rsync >/dev/null 2>&1; then
|
||||
rsync -a --delete "$SOURCE_DIR/" "$TARGET_DIR/"
|
||||
else
|
||||
rm -rf "$TARGET_DIR"/*
|
||||
cp -R "$SOURCE_DIR"/* "$TARGET_DIR"/
|
||||
fi
|
||||
|
||||
chmod +x "$TARGET_DIR"/bin/*
|
||||
chmod +x "$TARGET_DIR"/install.sh
|
||||
|
||||
echo "[mosaic-install] Installed framework to $TARGET_DIR"
|
||||
echo "[mosaic-install] Add to PATH: export PATH=\"$TARGET_DIR/bin:$PATH\""
|
||||
15
templates/repo/.mosaic/README.md
Normal file
15
templates/repo/.mosaic/README.md
Normal file
@@ -0,0 +1,15 @@
|
||||
# Repo Mosaic Linkage
|
||||
|
||||
This repository is attached to the machine-wide Mosaic framework.
|
||||
|
||||
## Load Order for Agents
|
||||
|
||||
1. `~/.mosaic/STANDARDS.md`
|
||||
2. `AGENTS.md` (this repository)
|
||||
3. `.mosaic/repo-hooks.sh` (repo-specific automation hooks)
|
||||
|
||||
## Purpose
|
||||
|
||||
- Keep universal standards in `~/.mosaic`
|
||||
- Keep repo-specific behavior in this repo
|
||||
- Avoid copying large runtime configs into each project
|
||||
17
templates/repo/.mosaic/repo-hooks.sh
Executable file
17
templates/repo/.mosaic/repo-hooks.sh
Executable file
@@ -0,0 +1,17 @@
|
||||
#!/usr/bin/env bash
|
||||
# Optional repo-specific hooks used by scripts/agent/*.sh
|
||||
|
||||
# Called by session-start.sh
|
||||
# mosaic_hook_session_start() {
|
||||
# echo "Run repo-specific startup checks"
|
||||
# }
|
||||
|
||||
# Called by critical.sh
|
||||
# mosaic_hook_critical() {
|
||||
# echo "Run repo-specific critical queries"
|
||||
# }
|
||||
|
||||
# Called by session-end.sh
|
||||
# mosaic_hook_session_end() {
|
||||
# echo "Run repo-specific end-of-session checks"
|
||||
# }
|
||||
29
templates/repo/scripts/agent/common.sh
Executable file
29
templates/repo/scripts/agent/common.sh
Executable file
@@ -0,0 +1,29 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
repo_root() {
|
||||
git rev-parse --show-toplevel 2>/dev/null || pwd
|
||||
}
|
||||
|
||||
ensure_repo_root() {
|
||||
cd "$(repo_root)"
|
||||
}
|
||||
|
||||
has_remote() {
|
||||
git remote get-url origin >/dev/null 2>&1
|
||||
}
|
||||
|
||||
run_step() {
|
||||
local label="$1"
|
||||
shift
|
||||
echo "[agent-framework] $label"
|
||||
"$@"
|
||||
}
|
||||
|
||||
load_repo_hooks() {
|
||||
local hooks_file=".mosaic/repo-hooks.sh"
|
||||
if [[ -f "$hooks_file" ]]; then
|
||||
# shellcheck disable=SC1090
|
||||
source "$hooks_file"
|
||||
fi
|
||||
}
|
||||
16
templates/repo/scripts/agent/critical.sh
Executable file
16
templates/repo/scripts/agent/critical.sh
Executable file
@@ -0,0 +1,16 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
# shellcheck source=./common.sh
|
||||
source "$SCRIPT_DIR/common.sh"
|
||||
|
||||
ensure_repo_root
|
||||
load_repo_hooks
|
||||
|
||||
if declare -F mosaic_hook_critical >/dev/null 2>&1; then
|
||||
run_step "Run repo critical hook" mosaic_hook_critical
|
||||
else
|
||||
echo "[agent-framework] No repo critical hook configured (.mosaic/repo-hooks.sh)"
|
||||
echo "[agent-framework] Define mosaic_hook_critical() for project-specific priority scans"
|
||||
fi
|
||||
44
templates/repo/scripts/agent/log-limitation.sh
Executable file
44
templates/repo/scripts/agent/log-limitation.sh
Executable file
@@ -0,0 +1,44 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
TITLE="${1:-}"
|
||||
if [[ -z "$TITLE" ]]; then
|
||||
echo "Usage: $0 \"Short limitation title\"" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
FILE="EVOLUTION.md"
|
||||
if [[ ! -f "$FILE" ]]; then
|
||||
echo "[agent-framework] $FILE not found. Create project-specific limitations log if needed."
|
||||
exit 0
|
||||
fi
|
||||
|
||||
if command -v rg >/dev/null 2>&1; then
|
||||
last_num=$(rg -o "^### L-[0-9]{3}" "$FILE" | sed 's/^### L-//' | sort -n | tail -1)
|
||||
else
|
||||
last_num=$(grep -E "^### L-[0-9]{3}" "$FILE" | sed 's/^### L-//' | sort -n | tail -1)
|
||||
fi
|
||||
|
||||
if [[ -z "$last_num" ]]; then
|
||||
next_num="001"
|
||||
else
|
||||
next_num=$(printf "%03d" $((10#$last_num + 1)))
|
||||
fi
|
||||
|
||||
entry_id="L-$next_num"
|
||||
|
||||
cat <<EOF2
|
||||
|
||||
### $entry_id: $TITLE
|
||||
|
||||
| Aspect | Details |
|
||||
|--------|---------|
|
||||
| **Pain** | TODO |
|
||||
| **Impact** | TODO |
|
||||
| **Frequency** | TODO |
|
||||
| **Current Workaround** | TODO |
|
||||
| **Proposed Solution** | TODO |
|
||||
| **Platform Implication** | TODO |
|
||||
EOF2
|
||||
|
||||
echo "[agent-framework] Suggested limitation ID: $entry_id"
|
||||
20
templates/repo/scripts/agent/session-end.sh
Executable file
20
templates/repo/scripts/agent/session-end.sh
Executable file
@@ -0,0 +1,20 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
# shellcheck source=./common.sh
|
||||
source "$SCRIPT_DIR/common.sh"
|
||||
|
||||
ensure_repo_root
|
||||
load_repo_hooks
|
||||
|
||||
if declare -F mosaic_hook_session_end >/dev/null 2>&1; then
|
||||
run_step "Run repo end hook" mosaic_hook_session_end
|
||||
else
|
||||
echo "[agent-framework] No repo end hook configured (.mosaic/repo-hooks.sh)"
|
||||
fi
|
||||
|
||||
if git rev-parse --is-inside-work-tree >/dev/null 2>&1; then
|
||||
run_step "Show status" git status --short
|
||||
run_step "Show diff summary" git diff --stat
|
||||
fi
|
||||
19
templates/repo/scripts/agent/session-start.sh
Executable file
19
templates/repo/scripts/agent/session-start.sh
Executable file
@@ -0,0 +1,19 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
# shellcheck source=./common.sh
|
||||
source "$SCRIPT_DIR/common.sh"
|
||||
|
||||
ensure_repo_root
|
||||
load_repo_hooks
|
||||
|
||||
if git rev-parse --is-inside-work-tree >/dev/null 2>&1 && has_remote; then
|
||||
run_step "Pull latest changes" git pull --rebase
|
||||
fi
|
||||
|
||||
if declare -F mosaic_hook_session_start >/dev/null 2>&1; then
|
||||
run_step "Run repo start hook" mosaic_hook_session_start
|
||||
else
|
||||
echo "[agent-framework] No repo start hook configured (.mosaic/repo-hooks.sh)"
|
||||
fi
|
||||
Reference in New Issue
Block a user