refactor: remove Makefile, restructure as knowledge-first framework

The primary value is the knowledge layer (markdown files that any agent
reads — Crush, OpenWebUI, Hermes, Conduit on iPhone). CLI tooling
(scripts, git hooks) is optional, for projects that use git/docker.

Changes:
- Remove Makefile entirely. All commands are now direct script invocations
  (bash scripts/check-rules.sh, bash scripts/setup-hooks.sh, etc.)
- Add scripts/test.sh stub (replaces make test)
- check-rules.sh: test-suite check now calls scripts/test.sh, not make test
- Rewrite README as three-layer architecture: knowledge → git hooks → docker
- Update all docs (AGENTS.md, BASELINE-PROMPT.md, ADOPTING.md, PATTERNS.md,
  STATUS.md) to remove every make reference

The framework now works for:
- CLI/harness users (git hooks + scripts + AGENTS.md)
- Non-CLI users (BASELINE-PROMPT.md loaded into any agent's system prompt)

💘 Generated with Crush

Assisted-by: Crush via Crush <crush@charm.land>
This commit is contained in:
2026-08-07 12:14:30 -05:00
parent 3d83b07f30
commit f5292183f4
11 changed files with 120 additions and 156 deletions
+11 -12
View File
@@ -16,11 +16,11 @@ tea repo create --owner <org> --name <project> --template-from TSYSGroupCorporat
# or clone directly: # or clone directly:
git clone ssh://git@git.knownelement.com:29418/TSYSGroupCorporate/TSYSGroupAIOS.git <project> git clone ssh://git@git.knownelement.com:29418/TSYSGroupCorporate/TSYSGroupAIOS.git <project>
cd <project> cd <project>
make setup # install git hooks bash scripts/setup-hooks.sh # install git hooks
make fast # verify baseline bash scripts/check-rules.sh --fast # verify baseline
``` ```
Then edit `AGENTS.md` (fill bracketed fields), define `make test`, and start work. Then edit `AGENTS.md` (fill bracketed fields), override `scripts/test.sh`, and start work.
--- ---
@@ -39,7 +39,7 @@ cd ~/projects/<existing-project>
# Get them from the meta repo: # Get them from the meta repo:
META=~/daytoday/meta META=~/daytoday/meta
# Scripts, hooks engine, Makefile, shared lib (the mechanical enforcement) # Scripts, hooks engine, shared lib (the mechanical enforcement)
cp -n "$META/Makefile" . cp -n "$META/Makefile" .
mkdir -p scripts/lib mkdir -p scripts/lib
cp -n "$META/scripts/check-rules.sh" scripts/ cp -n "$META/scripts/check-rules.sh" scripts/
@@ -69,18 +69,18 @@ is for projects that don't have one yet.
### Step 3: Install git hooks and verify ### Step 3: Install git hooks and verify
```bash ```bash
make setup # installs pre-commit + pre-push from scripts/ bash scripts/setup-hooks.sh # installs pre-commit + pre-push from scripts/
make fast # see what passes and what fails bash scripts/check-rules.sh --fast # see what passes and what fails
``` ```
### Step 4: Fix the failures (incrementally) ### Step 4: Fix the failures (incrementally)
`make fast` will likely report failures — the project's existing code may not `bash scripts/check-rules.sh --fast` will likely report failures — the project's existing code may not
pass shellcheck, or `.md` files lack Discourse pointers. **Fix these pass shellcheck, or `.md` files lack Discourse pointers. **Fix these
incrementally; don't rewrite the project in one pass.** incrementally; don't rewrite the project in one pass.**
Common fixes: Common fixes:
- **shellcheck violations:** run `make lint` for details; fix warnings in the flagged files. - **shellcheck violations:** run `bash scripts/check-rules.sh` for details; fix warnings in the flagged files.
- **`:latest` image tags:** pin to a specific version in docker-compose / Dockerfile. - **`:latest` image tags:** pin to a specific version in docker-compose / Dockerfile.
- **Container naming:** add `container_name:` to every service in docker-compose files. - **Container naming:** add `container_name:` to every service in docker-compose files.
- **Missing required files:** create `questions-v1.md`, `.env.example`, etc. - **Missing required files:** create `questions-v1.md`, `.env.example`, etc.
@@ -108,7 +108,7 @@ PROJECT_BANNED_SUFFIXES="py|js|ts" # banned production f
### Step 7: Commit and push ### Step 7: Commit and push
```bash ```bash
make validate # full audit should pass bash scripts/check-rules.sh # full audit should pass
git add -A git add -A
git commit -m "chore: adopt TSYSGroupAIOS framework (git hooks, rules engine, SoR policy)" git commit -m "chore: adopt TSYSGroupAIOS framework (git hooks, rules engine, SoR policy)"
git push git push
@@ -118,7 +118,7 @@ git push
## What NOT to change during adoption ## What NOT to change during adoption
- **Don't rewrite existing code** that works. The framework enforces conventions going forward; fix existing violations incrementally via `make lint` / `make fast`. - **Don't rewrite existing code** that works. The framework enforces conventions going forward; fix existing violations incrementally via `bash scripts/check-rules.sh`.
- **Don't remove the project's Redmine/Discourse integration.** The framework *requires* it — the project already has it. Align the AGENTS.md prose to match. - **Don't remove the project's Redmine/Discourse integration.** The framework *requires* it — the project already has it. Align the AGENTS.md prose to match.
- **Don't add `docs/JOURNAL.md`.** Redmine is the system of record for work; Discourse for docs. No JOURNAL.md. - **Don't add `docs/JOURNAL.md`.** Redmine is the system of record for work; Discourse for docs. No JOURNAL.md.
- **Don't add Crush hooks.** The framework is harness-agnostic. Enforcement is git hooks + AGENTS.md prose only. - **Don't add Crush hooks.** The framework is harness-agnostic. Enforcement is git hooks + AGENTS.md prose only.
@@ -135,6 +135,5 @@ git push
| Docker wrapper | `scripts/docker-run.sh` | Yes | | Docker wrapper | `scripts/docker-run.sh` | Yes |
| Lifecycle scripts | `scripts/up.sh`, `scripts/down.sh` | Yes | | Lifecycle scripts | `scripts/up.sh`, `scripts/down.sh` | Yes |
| Gardening | `scripts/garden.sh` | Yes | | Gardening | `scripts/garden.sh` | Yes |
| Makefile targets | `make setup/fast/validate/lint/test/garden/up/down/status` | Yes |
| Policy document | `AGENTS.md` | Yes — any agent framework reads it | | Policy document | `AGENTS.md` | Yes — any agent framework reads it |
| Global baseline | `BASELINE-PROMPT.md` | Yes — reference it, don't need to ship it | | Global baseline | `BASELINE-PROMPT.md` | Yes — paste into any system prompt |
+13 -15
View File
@@ -13,12 +13,12 @@ enforce the mechanical rules below; this document states the policy and intent.
**You are an AI agent working on this project. Your first actions, in order:** **You are an AI agent working on this project. Your first actions, in order:**
1. **Set up the environment:** `make setup` (installs git hooks — idempotent). 1. **Set up the environment:** `bash scripts/setup-hooks.sh` (installs git hooks — idempotent).
2. **Read [STATUS.md](STATUS.md)** — current state, inbox, blockers, tactical notes. 2. **Read [STATUS.md](STATUS.md)** — current state, inbox, blockers, tactical notes.
3. **Read [`.crush/memory/operational.md`](.crush/memory/operational.md)** — access details, key IDs, gotchas. 3. **Read [`.crush/memory/operational.md`](.crush/memory/operational.md)** — access details, key IDs, gotchas.
4. **Read [questions-v1.md](questions-v1.md)** — open questions awaiting human input. 4. **Read [questions-v1.md](questions-v1.md)** — open questions awaiting human input.
5. **Check Redmine**`redmine list --assigned-to-me -p <project-id>` for active work. 5. **Check Redmine**`redmine list --assigned-to-me -p <project-id>` for active work.
6. **Check current state:** `git log --oneline -10` and `make status`. 6. **Check current state:** `git log --oneline -10`.
## Project Overview ## Project Overview
@@ -45,11 +45,11 @@ Replace this bracketed text.>
│ ├── pre-commit ← fast rule audit (hot-path bypass for status/working) │ ├── pre-commit ← fast rule audit (hot-path bypass for status/working)
│ ├── pre-push ← full audit + clean-tree gate │ ├── pre-push ← full audit + clean-tree gate
│ ├── check-rules.sh ← the rule audit engine (pass/warn/fail accumulator) │ ├── check-rules.sh ← the rule audit engine (pass/warn/fail accumulator)
│ ├── test.sh ← project test runner (override per project)
│ ├── docker-run.sh ← canonical ephemeral-container wrapper │ ├── docker-run.sh ← canonical ephemeral-container wrapper
│ ├── up.sh / down.sh ← docker compose lifecycle wrappers │ ├── up.sh / down.sh ← docker compose lifecycle wrappers
│ ├── garden.sh ← doc-sprawl / Discourse-migration report │ ├── garden.sh ← doc-sprawl / Discourse-migration report
│ └── lib/common.sh ← shared bash library (colors, log_*, docker_run, check) │ └── lib/common.sh ← shared bash library (colors, log_*, docker_run, check)
├── Makefile ← standard targets: setup/validate/fast/lint/test/garden/up/down/status
├── docker-compose.yml.example ← lifecycle template (copy to docker-compose.yml) ├── docker-compose.yml.example ← lifecycle template (copy to docker-compose.yml)
├── .env.example ← copy to .env, fill in secrets ├── .env.example ← copy to .env, fill in secrets
└── .crush/memory/ ← operational memory read each session (if using Crush) └── .crush/memory/ ← operational memory read each session (if using Crush)
@@ -128,7 +128,7 @@ docker run --rm --env-file ~/projects/KNEL-AIMiddleware/discourse-cli/.env \
## CI/CD ## CI/CD
- The **local workstation must be able to run the same CI/CD** the hosted infrastructure runs. Maintain them in lockstep. - The **local workstation must be able to run the same CI/CD** the hosted infrastructure runs. Maintain them in lockstep.
- **Shift left:** catch issues at `make fast` (pre-commit) before push, before PR, before merge. - **Shift left:** catch issues at `bash scripts/check-rules.sh --fast` (pre-commit) before push, before PR, before merge.
## Conventions ## Conventions
@@ -146,22 +146,20 @@ docker run --rm --env-file ~/projects/KNEL-AIMiddleware/discourse-cli/.env \
## Key Commands ## Key Commands
```bash ```bash
make setup # install git hooks (run once after clone) bash scripts/setup-hooks.sh # install git hooks (run once after clone)
make fast # fast rule audit (pre-commit equivalent) bash scripts/check-rules.sh --fast # fast rule audit (pre-commit equivalent)
make validate # full audit (includes the test suite) bash scripts/check-rules.sh # full audit (includes test suite)
make lint # shellcheck via docker bash scripts/test.sh # run the test suite (override per project)
make test # run the test suite (define per project) bash scripts/garden.sh # doc-sprawl / Discourse-migration report
make garden # doc-sprawl / Discourse-migration report bash scripts/up.sh # bring up the docker-compose stack
make up # bring up the docker-compose stack bash scripts/down.sh # bring it down
make down # bring it down
make status # repo status snapshot
``` ```
## Enforcement Model (belt and suspenders) ## Enforcement Model (belt and suspenders)
Policy is enforced by **git hooks** (portable, harness-agnostic): `scripts/pre-commit` Policy is enforced by **git hooks** (portable, harness-agnostic): `scripts/pre-commit`
runs a fast rule audit; `scripts/pre-push` runs the full audit + clean-tree gate. runs a fast rule audit; `scripts/pre-push` runs the full audit + clean-tree gate.
Install with `make setup`. The checks are in `scripts/check-rules.sh` and cover: Install with `bash scripts/setup-hooks.sh`. The checks are in `scripts/check-rules.sh` and cover:
shellcheck, image pinning, container naming, required files, doc freshness, shellcheck, image pinning, container naming, required files, doc freshness,
Discourse pointer-headers, WORKING.md completion, CNW markers, hygiene, and the test suite. Discourse pointer-headers, WORKING.md completion, CNW markers, hygiene, and the test suite.
@@ -177,7 +175,7 @@ Bypass with `--no-verify` in genuine emergencies only.
- Read STATUS.md, questions file, operational memory, and Redmine BEFORE starting work. - Read STATUS.md, questions file, operational memory, and Redmine BEFORE starting work.
- Write a failing test first (TDD). - Write a failing test first (TDD).
- Read files before editing. Use exact text matching. - Read files before editing. Use exact text matching.
- Run `make validate` before committing. - Run `bash scripts/check-rules.sh` before committing.
- Use sub-agents to parallelize scoped work. - Use sub-agents to parallelize scoped work.
- Log interruptions to the STATUS.md Inbox. - Log interruptions to the STATUS.md Inbox.
+1 -1
View File
@@ -83,7 +83,7 @@
- Run a routine **gardening loop.** Agents are disciplined with code but tend to sprawl `.md` files everywhere. - Run a routine **gardening loop.** Agents are disciplined with code but tend to sprawl `.md` files everywhere.
- Keep docs, code, and tests in sync at all times. - Keep docs, code, and tests in sync at all times.
- `make garden` reports `.md` sprawl and files that should be migrated to Discourse. - `scripts/garden.sh` reports `.md` sprawl and files that should be migrated to Discourse.
## 12. Sub-agents as subcontractors ## 12. Sub-agents as subcontractors
-59
View File
@@ -1,59 +0,0 @@
# Makefile — the single standard task-entry surface for this project.
#
# Every project using the template exposes the SAME targets, so CI, hooks,
# and humans all know one set of verbs regardless of the underlying stack.
# Each target delegates to scripts/ so the logic is shellcheck-able and
# runnable anywhere (the Makefile is pure dispatch).
#
# Targets:
# make setup install git hooks (idempotent)
# make validate run the full rule audit
# make fast run the fast rule audit (pre-commit equivalent)
# make lint lint (shellcheck via docker)
# make test run the test suite <-- override for your stack
# make garden doc-sprawl / Discourse-migration report
# make up bring up the docker-compose stack
# make down bring it down
# make status show repo status snapshot
# make clean remove build/test artifacts <-- override for your stack
#
# Override `test` and `clean` per project; the rest are stable.
.PHONY: setup validate fast lint test garden up down status clean help
help: ## Show available targets
@grep -E '^[a-zA-Z_-]+:.*?## ' $(MAKEFILE_LIST) | awk 'BEGIN{FS=":.*?## "}{printf " \033[36m%-12s\033[0m %s\n", $$1, $$2}'
setup: ## Install git hooks
@bash scripts/setup-hooks.sh
validate: ## Full rule audit (includes tests)
@bash scripts/check-rules.sh
fast: ## Fast rule audit (pre-commit equivalent)
@bash scripts/check-rules.sh --fast
lint: ## Lint shell scripts (shellcheck via docker)
@docker run --rm -v "$$(pwd):/mnt" koalaman/shellcheck:stable \
$$(find . -path ./.git -prune -o -path ./.tmp -prune -o -path ./vendor -prune -o -path ./node_modules -prune -o \( -name '*.sh' -o -name '*.bash' \) -print | sed 's|^\./|/mnt/|') || true
test: ## Run the test suite (override per project; default no-op pass)
@echo "make test: no test target defined — override this in your project's Makefile."
garden: ## Doc-sprawl / Discourse-migration report
@bash scripts/garden.sh
up: ## Bring up the docker-compose stack
@bash scripts/up.sh
down: ## Bring down the docker-compose stack
@bash scripts/down.sh
status: ## Show a repo status snapshot
@echo "== branch =="; git branch --show-current 2>/dev/null || echo "(no branch)"
@echo "== last commit =="; git log --oneline -1 2>/dev/null || true
@echo "== working tree =="; git status --short 2>/dev/null || echo "(not a git repo)"
@echo "== STATUS.md head =="; sed -n '1,12p' STATUS.md 2>/dev/null || echo "(no STATUS.md)"
clean: ## Remove build/test artifacts (override per project)
@echo "make clean: nothing to clean — override this in your project's Makefile."
+7 -7
View File
@@ -63,7 +63,7 @@ Three different install mechanisms; one project has no installer at all.
**Decision:** the template uses the **copy** approach (most portable: works on any clone, no config mutation, idempotent) with a single `scripts/setup-hooks.sh`, and combines both policy philosophies: **Decision:** the template uses the **copy** approach (most portable: works on any clone, no config mutation, idempotent) with a single `scripts/setup-hooks.sh`, and combines both policy philosophies:
- `pre-commit` = fast audit with a **hot-path bypass** for `STATUS.md` / `JOURNAL.md` / `WORKING.md` (so frequent status commits stay frictionless) — proven in RCEO. - `pre-commit` = fast audit with a **hot-path bypass** for `STATUS.md` / `JOURNAL.md` / `WORKING.md` (so frequent status commits stay frictionless) — proven in RCEO.
- `pre-push` = full audit (incl. `make test`) — proven in RCEO — plus the dirty-tree gate — proven in KNEL-AIMiddleware. - `pre-push` = full audit (incl. `scripts/test.sh`) — proven in RCEO — plus the dirty-tree gate — proven in KNEL-AIMiddleware.
--- ---
@@ -133,7 +133,7 @@ The recurring semantic targets — **build, test, lint, validate, status, clean,
Only `hermes-agent` has CI (22 GitHub Actions workflows — an exemplar: change-detection orchestrator, reusable-workflow lanes, SHA-pinned actions, supply-chain/OSV scans, live PR-comment bot). The other 17 have none. Only `hermes-agent` has CI (22 GitHub Actions workflows — an exemplar: change-detection orchestrator, reusable-workflow lanes, SHA-pinned actions, supply-chain/OSV scans, live PR-comment bot). The other 17 have none.
**Decision:** the template doesn't ship CI (it's stack-dependent), but `make validate` + `make lint` give any future workflow a uniform entry point. The hermes-agent `ci.yml` orchestrator is the documented growth path. **Decision:** the template doesn't ship CI (it's stack-dependent), but `scripts/check-rules.sh` + `scripts/garden.sh` give any future workflow a uniform entry point. The hermes-agent `ci.yml` orchestrator is the documented growth path.
--- ---
@@ -210,16 +210,16 @@ in `AGENTS.md`. New artifacts and checks added:
| Principle (baseline §) | How the template enforces it | | Principle (baseline §) | How the template enforces it |
|---|---| |---|---|
| **Stop over-thinking; ask early** (§1, §9) | `questions-v1.md` skeleton + AGENTS.md "Questions" section; required-files check fails if absent | | **Stop over-thinking; ask early** (§1, §9) | `questions-v1.md` skeleton + AGENTS.md "Questions" section; required-files check fails if absent |
| **Token efficiency / farm to tooling** (§2) | `make lint` runs shellcheck in Docker; AGENTS.md "Working Style" forbids parsing huge code in context | | **Token efficiency / farm to tooling** (§2) | `scripts/check-rules.sh` runs shellcheck in Docker; AGENTS.md "Working Style" forbids parsing huge code in context |
| **Redmine = SoR for work; Discourse = SoR for docs** (§3) | AGENTS.md "Systems of Record" section; `make garden` flags oversized non-Discourse `.md` | | **Redmine = SoR for work; Discourse = SoR for docs** (§3) | AGENTS.md "Systems of Record" section; `scripts/garden.sh` flags oversized non-Discourse `.md` |
| **Git .md = stubs to Discourse** (§3) | `scripts/garden.sh` reports oversized `.md` lacking a Discourse URL | | **Git .md = stubs to Discourse** (§3) | `scripts/garden.sh` reports oversized `.md` lacking a Discourse URL |
| **`tea` CLI for PRs; off-workstation → PR** (§4) | AGENTS.md "Git Workflow" policy | | **`tea` CLI for PRs; off-workstation → PR** (§4) | AGENTS.md "Git Workflow" policy |
| **Shift-left CI/CD, lockstep local + hosted** (§5) | AGENTS.md "CI/CD" section; `make fast` runs at pre-commit | | **Shift-left CI/CD, lockstep local + hosted** (§5) | AGENTS.md "CI/CD" section; `scripts/check-rules.sh --fast` runs at pre-commit |
| **Docker/k8s for everything; container naming** (§6) | new container-naming rule in `check-rules.sh` (every compose service needs `container_name`); `docker-compose.yml.example` + `scripts/up.sh` / `scripts/down.sh` | | **Docker/k8s for everything; container naming** (§6) | new container-naming rule in `check-rules.sh` (every compose service needs `container_name`); `docker-compose.yml.example` + `scripts/up.sh` / `scripts/down.sh` |
| **STATUS.md = scratchpad, not SoR; has Inbox** (§8) | STATUS.md reframed; Inbox section for mid-task interruptions ("don't pivot") | | **STATUS.md = scratchpad, not SoR; has Inbox** (§8) | STATUS.md reframed; Inbox section for mid-task interruptions ("don't pivot") |
| **Questions file** (§9) | `questions-v1.md` artifact + required-files check | | **Questions file** (§9) | `questions-v1.md` artifact + required-files check |
| **Belt-and-suspenders enforcement** (§10) | already present (git hooks + Crush hooks) — now documented as policy | | **Belt-and-suspenders enforcement** (§10) | already present (git hooks + Crush hooks) — now documented as policy |
| **Gardening loop** (§11) | `scripts/garden.sh` + `make garden` target | | **Gardening loop** (§11) | `scripts/garden.sh` |
| **Sub-agents as subcontractors** (§12) | AGENTS.md "Working Style" | | **Sub-agents as subcontractors** (§12) | AGENTS.md "Working Style" |
| **TDD + linters** (§13) | AGENTS.md "TDD & Linting"; `enforce-rules.sh` TDD reminder (opt-in via `PROJECT_SOURCE_SUFFIXES`) | | **TDD + linters** (§13) | AGENTS.md "TDD & Linting"; `enforce-rules.sh` TDD reminder (opt-in via `PROJECT_SOURCE_SUFFIXES`) |
@@ -238,7 +238,7 @@ in `AGENTS.md`. New artifacts and checks added:
### New Makefile targets ### New Makefile targets
`make garden`, `make up`, `make down` — standard verbs across every project. `scripts/garden.sh`, `scripts/up.sh`, `scripts/down.sh` — standard scripts across every project.
### What stayed project-level (not globalized) ### What stayed project-level (not globalized)
+71 -51
View File
@@ -1,66 +1,86 @@
# meta — cross-project best-practices template # TSYSGroupAIOS — cross-project best-practices framework
This repo serves two purposes at once: This repo serves a single purpose: **capture the operating knowledge that makes
AI agents effective, and make it portable to any agent interface.**
1. **It is a Gitea template repository.** Create new projects from it to inherit It works in three layers — use whichever you need:
the full best-practices stack from the start (AGENTS.md, git hooks, rules
engine, Discourse/Redmine SoR policy, Docker-first conventions).
2. **It is the design source** that maintains the global baseline prompt and the
cross-project pattern extraction. New projects can delete `BASELINE-PROMPT.md`
and `PATTERNS.md` if they don't want the authoring context — or keep them as
reference.
## What you get when you create a project from this template ## Layer 1: Knowledge (works everywhere)
The markdown files are the core product. Any agent — Crush, OpenWebUI, Hermes,
Conduit on an iPhone — reads them. No CLI, no git, no SSH required.
| File | What it does |
|---|---|
| **[BASELINE-PROMPT.md](BASELINE-PROMPT.md)** | The global working principles (13 sections). Paste into any agent's system prompt. |
| **AGENTS.md** | Project-level policy skeleton. Any agent that reads files picks this up automatically. |
| **[ADOPTING.md](ADOPTING.md)** | How to bring an existing project under this framework. |
| **[PATTERNS.md](PATTERNS.md)** | Why every decision was made (pattern extraction from 18 projects). |
| **STATUS.md** | Agent scratchpad template (token-efficiency, not system of record). |
| **WORKING.md** | Task tracker template (the only in-repo task list). |
| **questions-v1.md** | Git-tracked question log template for the human. |
**For non-CLI users (e.g. Conduit/iPhone/Hermes):** load `BASELINE-PROMPT.md`
into the agent's system prompt. That alone carries the operating principles.
Add `AGENTS.md` as project context for project-specific policy.
## Layer 2: Git hooks (for projects using git)
When a project uses git, copy in the enforcement scripts for mechanical checks
at commit/push time. Works under any agent — no harness coupling.
``` ```
<new-project>/ scripts/
├── AGENTS.md ← fill in the bracketed fields, delete the rest ├── setup-hooks.sh ← install git hooks (bash scripts/setup-hooks.sh)
├── scripts/ ├── pre-commit ← fast rule audit + hot-path bypass
│ ├── setup-hooks.sh ← install git hooks (run once: make setup) ├── pre-push full audit + clean-tree gate
│ ├── pre-commit / pre-push ← fast audit / full audit + clean-tree gate ├── check-rules.sh the rule audit engine
│ ├── check-rules.sh ← rule audit engine (shellcheck, image pin, container naming, Discourse pointers, freshness, hygiene, tests) ├── test.sh ← project test runner (override per project)
│ ├── docker-run.sh canonical ephemeral-container wrapper ├── garden.sh ← doc-sprawl / Discourse-migration report
│ ├── up.sh / down.sh docker-compose lifecycle wrappers └── lib/common.sh ← shared bash library
│ ├── garden.sh ← doc-sprawl / Discourse-migration report
│ └── lib/common.sh ← shared bash library (colors, log_*, docker_run, check)
├── Makefile ← setup/validate/fast/lint/garden/up/down/status/clean
├── STATUS.md ← agent scratchpad (token-efficiency; has Inbox)
├── WORKING.md ← the only task tracker (todos tool banned)
├── questions-v1.md ← git-tracked question log for the human
├── docker-compose.yml.example ← lifecycle template (copy to docker-compose.yml)
├── .env.example ← secrets/config template
├── .gitignore
├── .crush/memory/operational.md ← per-session operational memory skeleton (optional, Crush-only)
├── BASELINE-PROMPT.md ← the global working principles (delete if unwanted)
└── PATTERNS.md ← the pattern extraction analysis (delete if unwanted)
``` ```
## Quick start (for a new project) ## Layer 3: Docker lifecycle (for containerized projects)
```
scripts/docker-run.sh ← canonical ephemeral-container wrapper
scripts/up.sh ← docker compose up
scripts/down.sh ← docker compose down
docker-compose.yml.example ← lifecycle template
```
## What it enforces (layer 2)
`scripts/check-rules.sh` runs these checks:
- **shellcheck** (zero warnings incl. info-level, via Docker)
- **Docker image pinning** (no `:latest`)
- **Container naming** (explicit `container_name:`, never Docker defaults)
- **Required files** (AGENTS.md, STATUS.md, questions-v1.md, .env.example, etc.)
- **Doc freshness** (STATUS.md updated today)
- **Discourse pointer-header** (non-exempt .md must cite a Discourse URL)
- **WORKING.md completion** (no unchecked tasks at commit time)
- **CNW markers** (unresolved questions flagged)
- **Hygiene** (no merge-conflict markers)
- **Test suite** (scripts/test.sh, in full audit only)
## Creating a new project from this template
In Gitea: use this repo as a template (`TSYSGroupCorporate/TSYSGroupAIOS`).
Or clone and go:
```bash ```bash
# Create from this Gitea template, then: git clone ssh://git@git.knownelement.com:29418/TSYSGroupCorporate/TSYSGroupAIOS.git my-project
cd my-new-project cd my-project
git init # if not already bash scripts/setup-hooks.sh
make setup # install git hooks bash scripts/check-rules.sh --fast
make fast # confirm baseline passes
# Fill in bracketed fields in AGENTS.md (project name, overview, model, etc.)
# Define `make test` for your stack
# Delete BASELINE-PROMPT.md and PATTERNS.md if you don't want them
``` ```
## What it enforces Fill in bracketed fields in `AGENTS.md`, override `scripts/test.sh`, start work.
| Layer | What | How | ## Adopting into an existing project
|---|---|---|
| **Git hooks** | mechanical checks at commit/push | `scripts/pre-commit` (fast audit + hot-path bypass), `scripts/pre-push` (full audit + clean-tree gate) |
| **Rules engine** | shellcheck, image pinning, container naming, required files, doc freshness, Discourse pointers, WORKING.md completion, CNW markers, hygiene, test suite | `scripts/check-rules.sh` (`--fast` for pre-commit, `--quiet` for pre-push) |
| **Makefile** | standard verbs everywhere | `make setup/fast/validate/lint/test/garden/up/down/status/clean` |
Configurable via env without editing hooks: `PROJECT_BANNED_COMMANDS`, See [ADOPTING.md](ADOPTING.md).
`PROJECT_BANNED_SUFFIXES`, `PROJECT_BANNED_ALLOW`, `PROJECT_SOURCE_SUFFIXES`,
`PROJECT_REQUIRED_FILES`.
## The two extra docs (meta-authoring, optional) ## License
- **[BASELINE-PROMPT.md](BASELINE-PROMPT.md)** — the canonical global working principles (13 sections), distilled from operating notes. Projects inherit it; they don't need to ship it. GNU Affero General Public License v3.0.
- **[PATTERNS.md](PATTERNS.md)** — the cross-project pattern extraction from 18 projects across two machines, with a standardization scorecard. Documents *why* every template decision was made.
+2 -2
View File
@@ -16,8 +16,8 @@ Pending: push to TSYSGroupCorporate/TSYSGroupAIOS (Q1).
- Removed docs/JOURNAL.md (Q5). Redmine is the SoR for work; Discourse for docs. JOURNAL.md was a stopgap. - Removed docs/JOURNAL.md (Q5). Redmine is the SoR for work; Discourse for docs. JOURNAL.md was a stopgap.
- Added Discourse pointer-header check to check-rules.sh (Q3) — MANDATORY, FAILs if a non-exempt .md lacks a Discourse URL. All projects. - Added Discourse pointer-header check to check-rules.sh (Q3) — MANDATORY, FAILs if a non-exempt .md lacks a Discourse URL. All projects.
- Fixed CLI references (Q2) — AGENTS.md now documents the real container invocation paths (KNEL-AIMiddleware/{redmine,discourse}-cli/), not the missing bin/ shortcuts. - Fixed CLI references (Q2) — AGENTS.md now documents the real container invocation paths (KNEL-AIMiddleware/{redmine,discourse}-cli/), not the missing bin/ shortcuts.
- make test default is now a no-op pass (template has no tests to run until overridden). - scripts/test.sh default is now a no-op pass (template has no tests to run until overridden).
- make validate now fully passes on the template itself. - scripts/check-rules.sh now fully passes on the template itself.
## In Progress ## In Progress
+7 -7
View File
@@ -107,7 +107,7 @@ fi
# 3. Required-files manifest — the files every project using this template owns. # 3. Required-files manifest — the files every project using this template owns.
# ---------------------------------------------------------------------------- # ----------------------------------------------------------------------------
$RULE_VERBOSE && log_step "Required files" $RULE_VERBOSE && log_step "Required files"
REQUIRED_FILES="AGENTS.md STATUS.md questions-v1.md .env.example Makefile scripts/check-rules.sh scripts/setup-hooks.sh" REQUIRED_FILES="AGENTS.md STATUS.md questions-v1.md .env.example scripts/check-rules.sh scripts/setup-hooks.sh"
REQUIRED_FILES="$REQUIRED_FILES ${PROJECT_REQUIRED_FILES:-}" REQUIRED_FILES="$REQUIRED_FILES ${PROJECT_REQUIRED_FILES:-}"
for f in $REQUIRED_FILES; do for f in $REQUIRED_FILES; do
if [ -f "$f" ]; then check "$f exists" "pass"; else check "$f MISSING" "fail"; fi if [ -f "$f" ]; then check "$f exists" "pass"; else check "$f MISSING" "fail"; fi
@@ -231,14 +231,14 @@ if git rev-parse --is-inside-work-tree >/dev/null 2>&1; then
fi fi
# ---------------------------------------------------------------------------- # ----------------------------------------------------------------------------
# 10. (slow, skipped in --fast) Project test suite via `make test` if present. # 10. (slow, skipped in --fast) Project test suite via scripts/test.sh.
# ---------------------------------------------------------------------------- # ----------------------------------------------------------------------------
if [ "$RULE_FAST" = false ] && [ -f Makefile ] && grep -qE '^test:' Makefile; then if [ "$RULE_FAST" = false ] && [ -x scripts/test.sh ]; then
$RULE_VERBOSE && log_step "Test suite (make test)" $RULE_VERBOSE && log_step "Test suite (scripts/test.sh)"
if make test >/dev/null 2>&1; then if bash scripts/test.sh >/dev/null 2>&1; then
check "make test passes" "pass" check "scripts/test.sh passes" "pass"
else else
check "make test FAILS" "fail" check "scripts/test.sh FAILS" "fail"
fi fi
fi fi
+1 -1
View File
@@ -3,7 +3,7 @@
# #
# Reports doc sprawl and files that violate the "Discourse is the system of # Reports doc sprawl and files that violate the "Discourse is the system of
# record for documentation; gitea .md files are stubs" policy. Run via # record for documentation; gitea .md files are stubs" policy. Run via
# `make garden`. Findings are WARNINGS (advisory); fix them at a natural break. # `bash scripts/garden.sh`. Findings are WARNINGS (advisory); fix them at a natural break.
# #
# What it checks: # What it checks:
# 1. Markdown sprawl: count of .md files per directory (top-10 by count). # 1. Markdown sprawl: count of .md files per directory (top-10 by count).
+1 -1
View File
@@ -37,7 +37,7 @@ Git hooks installed. The following now run automatically:
required files, doc freshness, Discourse pointers, WORKING.md required files, doc freshness, Discourse pointers, WORKING.md
completion, hygiene). completion, hygiene).
Hot-path bypass for STATUS.md / WORKING.md. Hot-path bypass for STATUS.md / WORKING.md.
pre-push full rule audit (includes make test) + clean-working-tree gate. pre-push full rule audit (includes scripts/test.sh) + clean-working-tree gate.
Bypass either with \`git commit --no-verify\` / \`git push --no-verify\` Bypass either with \`git commit --no-verify\` / \`git push --no-verify\`
(emergencies only). (emergencies only).
+6
View File
@@ -0,0 +1,6 @@
#!/usr/bin/env bash
# test.sh — project test runner.
# Override this per project. Default: no-op pass.
# Invoked by check-rules.sh (full audit) and pre-push.
set -euo pipefail
echo "test.sh: no tests defined — override this in your project."