chore: initialize EverOS 1.0.0
md-first memory extraction framework for AI agents. Markdown is the single source of truth; SQLite holds state and LanceDB provides the rebuildable vector + BM25 + scalar index. The codebase follows a single-direction DDD layering (entrypoints -> service -> memory -> infra, with component / core / config cross-cutting) enforced by import-linter. Engineering surface: - Coding conventions in .claude/rules/ (path-scoped) and workflows in .claude/skills/ (/commit, /new-branch, /pr). - GitHub Actions CI runs make lint + test + integration; pre-commit mirrors the gates locally (ruff, hygiene hooks, gitlint commit-msg). - Commit messages follow Conventional Commits, enforced by gitlint. - make lint also enforces datetime two-zone discipline and OpenAPI drift.
This commit is contained in:
54
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
Normal file
54
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
Normal file
@ -0,0 +1,54 @@
|
||||
name: Bug report
|
||||
description: Report a reproducible problem in EverOS
|
||||
title: "[Bug]: "
|
||||
labels: ["bug"]
|
||||
body:
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: Thanks for helping improve EverOS. Clear reproduction steps make bugs much faster to fix.
|
||||
- type: dropdown
|
||||
id: area
|
||||
attributes:
|
||||
label: Area
|
||||
options:
|
||||
- methods/EverCore
|
||||
- methods/HyperMem
|
||||
- benchmarks/EverMemBench
|
||||
- benchmarks/EvoAgentBench
|
||||
- use-cases
|
||||
- documentation
|
||||
- other
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
id: problem
|
||||
attributes:
|
||||
label: What happened?
|
||||
description: Describe the bug and the behavior you expected.
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
id: reproduce
|
||||
attributes:
|
||||
label: Steps to reproduce
|
||||
placeholder: |
|
||||
1. Go to ...
|
||||
2. Run ...
|
||||
3. See ...
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
id: environment
|
||||
attributes:
|
||||
label: Environment
|
||||
placeholder: |
|
||||
OS:
|
||||
Python:
|
||||
Node:
|
||||
Docker:
|
||||
Commit:
|
||||
- type: textarea
|
||||
id: logs
|
||||
attributes:
|
||||
label: Logs or screenshots
|
||||
render: shell
|
||||
5
.github/ISSUE_TEMPLATE/config.yml
vendored
Normal file
5
.github/ISSUE_TEMPLATE/config.yml
vendored
Normal file
@ -0,0 +1,5 @@
|
||||
blank_issues_enabled: true
|
||||
contact_links:
|
||||
- name: EverOS Discussions
|
||||
url: https://github.com/EverMind-AI/EverOS/discussions
|
||||
about: Ask questions, share ideas, and discuss roadmap topics.
|
||||
22
.github/ISSUE_TEMPLATE/docs.yml
vendored
Normal file
22
.github/ISSUE_TEMPLATE/docs.yml
vendored
Normal file
@ -0,0 +1,22 @@
|
||||
name: Documentation issue
|
||||
description: Report unclear, missing, or outdated documentation
|
||||
title: "[Docs]: "
|
||||
labels: ["documentation"]
|
||||
body:
|
||||
- type: input
|
||||
id: page
|
||||
attributes:
|
||||
label: Page or file
|
||||
placeholder: README.md, methods/EverCore/docs/...
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
id: issue
|
||||
attributes:
|
||||
label: What should be improved?
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
id: suggestion
|
||||
attributes:
|
||||
label: Suggested wording or structure
|
||||
40
.github/ISSUE_TEMPLATE/feature_request.yml
vendored
Normal file
40
.github/ISSUE_TEMPLATE/feature_request.yml
vendored
Normal file
@ -0,0 +1,40 @@
|
||||
name: Feature request
|
||||
description: Suggest an improvement or new capability
|
||||
title: "[Feature]: "
|
||||
labels: ["enhancement"]
|
||||
body:
|
||||
- type: dropdown
|
||||
id: area
|
||||
attributes:
|
||||
label: Area
|
||||
options:
|
||||
- architecture methods
|
||||
- benchmarks
|
||||
- use cases
|
||||
- developer experience
|
||||
- documentation
|
||||
- other
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
id: problem
|
||||
attributes:
|
||||
label: Problem or opportunity
|
||||
description: What user need, research gap, or workflow pain does this address?
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
id: proposal
|
||||
attributes:
|
||||
label: Proposed solution
|
||||
description: Describe the change you would like to see.
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
id: alternatives
|
||||
attributes:
|
||||
label: Alternatives considered
|
||||
- type: textarea
|
||||
id: context
|
||||
attributes:
|
||||
label: Additional context
|
||||
37
.github/ISSUE_TEMPLATE/use_case.yml
vendored
Normal file
37
.github/ISSUE_TEMPLATE/use_case.yml
vendored
Normal file
@ -0,0 +1,37 @@
|
||||
name: Use-case proposal
|
||||
description: Propose an app, demo, or integration for use-cases/
|
||||
title: "[Use Case]: "
|
||||
labels: ["use case"]
|
||||
body:
|
||||
- type: textarea
|
||||
id: summary
|
||||
attributes:
|
||||
label: Summary
|
||||
description: What does the use case demonstrate?
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
id: memory
|
||||
attributes:
|
||||
label: Memory behavior
|
||||
description: What should the agent remember, retrieve, or evolve over time?
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
id: stack
|
||||
attributes:
|
||||
label: Stack and dependencies
|
||||
description: List frameworks, services, models, or external APIs.
|
||||
- type: textarea
|
||||
id: run
|
||||
attributes:
|
||||
label: Run path
|
||||
description: How should a new developer run or inspect it?
|
||||
- type: checkboxes
|
||||
id: checklist
|
||||
attributes:
|
||||
label: Contribution checklist
|
||||
options:
|
||||
- label: I can include a README with setup instructions.
|
||||
- label: I can avoid committing secrets, generated output, dependency folders, and image files.
|
||||
- label: I can include `.env.example` if configuration is needed.
|
||||
37
.github/PULL_REQUEST_TEMPLATE.md
vendored
Normal file
37
.github/PULL_REQUEST_TEMPLATE.md
vendored
Normal file
@ -0,0 +1,37 @@
|
||||
## Summary
|
||||
|
||||
<!-- What changed, and why? -->
|
||||
|
||||
## Area
|
||||
|
||||
<!-- Mark the relevant option with an x. -->
|
||||
|
||||
- [ ] Architecture method
|
||||
- [ ] Benchmark
|
||||
- [ ] Use case
|
||||
- [ ] Documentation
|
||||
- [ ] Developer experience
|
||||
- [ ] CI, build, or release
|
||||
|
||||
## Verification
|
||||
|
||||
<!-- List commands run, manual checks, screenshots, or reasons verification was not needed. -->
|
||||
|
||||
```text
|
||||
|
||||
```
|
||||
|
||||
## Checklist
|
||||
|
||||
- [ ] I kept the change scoped to the relevant area.
|
||||
- [ ] I updated docs, examples, or setup notes when behavior changed.
|
||||
- [ ] I added or updated tests when the change affects behavior.
|
||||
- [ ] I did not commit secrets, `.env` files, dependency folders, or generated output.
|
||||
- [ ] Active relative links in Markdown files resolve.
|
||||
|
||||
## Notes for Reviewers
|
||||
|
||||
<!-- Anything reviewers should pay special attention to? -->
|
||||
|
||||
By submitting this pull request, I agree that my contribution is licensed under
|
||||
the Apache License 2.0.
|
||||
20
.github/dependabot.yml
vendored
Normal file
20
.github/dependabot.yml
vendored
Normal file
@ -0,0 +1,20 @@
|
||||
version: 2
|
||||
|
||||
updates:
|
||||
# GitHub Actions
|
||||
- package-ecosystem: github-actions
|
||||
directory: /
|
||||
schedule:
|
||||
interval: weekly
|
||||
groups:
|
||||
actions:
|
||||
patterns: ["*"]
|
||||
|
||||
# Python dependencies (pip/uv) at the project root
|
||||
- package-ecosystem: pip
|
||||
directory: /
|
||||
schedule:
|
||||
interval: weekly
|
||||
groups:
|
||||
python-deps:
|
||||
patterns: ["*"]
|
||||
42
.github/workflows/ci.yml
vendored
Normal file
42
.github/workflows/ci.yml
vendored
Normal file
@ -0,0 +1,42 @@
|
||||
name: CI
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [main, dev, master]
|
||||
pull_request:
|
||||
|
||||
# Cancel superseded runs on the same ref to save CI minutes.
|
||||
concurrency:
|
||||
group: ci-${{ github.workflow }}-${{ github.ref }}
|
||||
cancel-in-progress: true
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
ci:
|
||||
name: lint + test + integration
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Install uv
|
||||
uses: astral-sh/setup-uv@v4
|
||||
with:
|
||||
enable-cache: true
|
||||
cache-dependency-glob: uv.lock
|
||||
|
||||
- name: Set up Python
|
||||
run: uv python install 3.12
|
||||
|
||||
- name: Install dependencies (frozen)
|
||||
run: make install-deps
|
||||
|
||||
- name: Lint (ruff + import-linter + datetime + openapi drift)
|
||||
run: make lint
|
||||
|
||||
- name: Unit tests
|
||||
run: make test
|
||||
|
||||
- name: Integration tests
|
||||
run: make integration
|
||||
137
.github/workflows/docs.yml
vendored
Normal file
137
.github/workflows/docs.yml
vendored
Normal file
@ -0,0 +1,137 @@
|
||||
name: Docs
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
paths:
|
||||
- "**/*.md"
|
||||
- ".github/ISSUE_TEMPLATE/**"
|
||||
- ".github/PULL_REQUEST_TEMPLATE.md"
|
||||
- ".github/workflows/docs.yml"
|
||||
push:
|
||||
branches: [main]
|
||||
paths:
|
||||
- "**/*.md"
|
||||
- ".github/ISSUE_TEMPLATE/**"
|
||||
- ".github/PULL_REQUEST_TEMPLATE.md"
|
||||
- ".github/workflows/docs.yml"
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
concurrency:
|
||||
group: docs-${{ github.ref }}
|
||||
cancel-in-progress: true
|
||||
|
||||
jobs:
|
||||
links:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
|
||||
- name: Validate active relative Markdown links
|
||||
run: |
|
||||
python3 - <<'PY'
|
||||
from pathlib import Path
|
||||
import re
|
||||
import sys
|
||||
|
||||
# Validate every Markdown file in the documentation surface. Globbing
|
||||
# (rather than a hand-maintained list) means new docs are covered
|
||||
# automatically and phantom links cannot slip in. Skip vendored trees.
|
||||
skip_dirs = {".git", "node_modules", ".venv", ".uv-cache"}
|
||||
files = sorted(
|
||||
p
|
||||
for p in Path(".").rglob("*.md")
|
||||
if not any(part in skip_dirs for part in p.parts)
|
||||
)
|
||||
|
||||
missing = []
|
||||
for path in files:
|
||||
if not path.exists():
|
||||
continue
|
||||
text = path.read_text()
|
||||
active = re.sub(r"<!--.*?-->", "", text, flags=re.S)
|
||||
for raw in re.findall(r"\[[^\]]*\]\(([^)]+)\)", active):
|
||||
link = raw.split("#", 1)[0]
|
||||
if not link or link.startswith(("http://", "https://", "mailto:")):
|
||||
continue
|
||||
target = (path.parent / link).resolve()
|
||||
try:
|
||||
target.relative_to(Path.cwd().resolve())
|
||||
except ValueError:
|
||||
missing.append((path, raw, "outside repository"))
|
||||
continue
|
||||
if not target.exists():
|
||||
missing.append((path, raw, "missing"))
|
||||
|
||||
if missing:
|
||||
for path, raw, reason in missing:
|
||||
print(f"{path}: {raw} -> {reason}")
|
||||
sys.exit(1)
|
||||
|
||||
print("Active relative Markdown links resolve.")
|
||||
PY
|
||||
|
||||
- name: Validate use-case banner links
|
||||
run: |
|
||||
python3 - <<'PY'
|
||||
from pathlib import Path
|
||||
import re
|
||||
import sys
|
||||
|
||||
files = {
|
||||
Path("README.md"): "## Use Cases",
|
||||
Path("use-cases/README.md"): "## Use Case Catalogue",
|
||||
}
|
||||
|
||||
failures = []
|
||||
warnings = []
|
||||
primary_link_pattern = re.compile(
|
||||
r"^\[(?:Code|Plugin|Live Demo|Learn more)\]\(([^)]+)\)",
|
||||
flags=re.M,
|
||||
)
|
||||
|
||||
for path, heading in files.items():
|
||||
text = path.read_text()
|
||||
start = text.find(heading)
|
||||
if start == -1:
|
||||
failures.append(f"{path}: missing {heading}")
|
||||
continue
|
||||
|
||||
table_start = text.find("<table>", start)
|
||||
table_end = text.find("</table>", table_start)
|
||||
if table_start == -1 or table_end == -1:
|
||||
failures.append(f"{path}: missing use-case table")
|
||||
continue
|
||||
|
||||
table = text[table_start:table_end]
|
||||
cells = re.findall(r"<td[^>]*>(.*?)</td>", table, flags=re.S)
|
||||
for index, cell in enumerate(cells, start=1):
|
||||
title_match = re.search(r"####\s+(.+)", cell)
|
||||
title = title_match.group(1).strip() if title_match else f"use case {index}"
|
||||
banner_match = re.search(r"\[!\[[^\]]*\]\([^)]+\)\]\(([^)]+)\)", cell)
|
||||
primary_match = primary_link_pattern.search(cell)
|
||||
|
||||
if not banner_match and primary_match:
|
||||
warnings.append(f"{path}: {title}: primary link has no linked banner")
|
||||
elif banner_match and not primary_match:
|
||||
failures.append(f"{path}: {title}: missing primary link")
|
||||
elif banner_match and primary_match and banner_match.group(1) != primary_match.group(1):
|
||||
failures.append(
|
||||
f"{path}: {title}: banner link {banner_match.group(1)} "
|
||||
f"does not match primary link {primary_match.group(1)}"
|
||||
)
|
||||
|
||||
if warnings:
|
||||
print("\n".join(f"warning: {warning}" for warning in warnings))
|
||||
|
||||
if failures:
|
||||
print("\n".join(failures))
|
||||
sys.exit(1)
|
||||
|
||||
print("Use-case banner links match primary links.")
|
||||
PY
|
||||
|
||||
- name: Validate issue template YAML
|
||||
run: |
|
||||
ruby -e 'require "yaml"; Dir[".github/ISSUE_TEMPLATE/*.yml"].sort.each { |p| YAML.load_file(p); puts "YAML ok: #{p}" }'
|
||||
Reference in New Issue
Block a user