Skip to content

Commit f2585c0

Browse files
author
Paul Kyle
committed
release: v0.8.5
1 parent 080a222 commit f2585c0

71 files changed

Lines changed: 7944 additions & 215 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/ci.yml

Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
1+
# CI pipeline for Palinode — runs on every push and pull_request to any branch.
2+
#
3+
# Jobs:
4+
# 1. unit-tests — fast feedback on core logic (no external services)
5+
# 2. integration — tests/integration/ (may need Ollama; continue-on-error)
6+
# 3. security-scan — bandit (code) + pip-audit (dependencies)
7+
8+
name: CI
9+
10+
env:
11+
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true
12+
13+
on:
14+
push:
15+
pull_request:
16+
17+
jobs:
18+
# ---------------------------------------------------------------------------
19+
# Unit tests — should never need network access or Ollama.
20+
# All embeddings / LLM calls are mocked in the test suite.
21+
# ---------------------------------------------------------------------------
22+
unit-tests:
23+
runs-on: ubuntu-latest
24+
25+
strategy:
26+
matrix:
27+
python-version: ["3.11", "3.12"]
28+
29+
steps:
30+
- uses: actions/checkout@v4
31+
32+
- name: Set up Python ${{ matrix.python-version }}
33+
uses: actions/setup-python@v5
34+
with:
35+
python-version: ${{ matrix.python-version }}
36+
cache: "pip"
37+
38+
- name: Install dependencies
39+
run: |
40+
python -m pip install --upgrade pip
41+
pip install -e ".[dev]"
42+
43+
- name: Assert palinode resolves to the checked-out tree
44+
# Regression guard for editable installs: palinode.__file__ must
45+
# resolve under GITHUB_WORKSPACE, not some other site-packages path.
46+
run: |
47+
RESOLVED=$(python -c "import palinode; print(palinode.__file__)")
48+
echo "palinode.__file__ = $RESOLVED"
49+
if [[ "$RESOLVED" != "$GITHUB_WORKSPACE"/* ]]; then
50+
echo "ERROR: palinode resolves outside the workspace ($GITHUB_WORKSPACE)"
51+
echo " Got: $RESOLVED"
52+
exit 1
53+
fi
54+
55+
- name: Run unit tests (excluding integration)
56+
run: python -m pytest tests/ -x -q --ignore=tests/integration --ignore=tests/live
57+
58+
# ---------------------------------------------------------------------------
59+
# Integration tests — run against tests/integration/.
60+
#
61+
# These tests do not require Ollama directly (embeddings are stubbed), but
62+
# they do spin up FastAPI in-process and exercise the full save/search loop
63+
# against a real SQLite database in a temp directory.
64+
#
65+
# continue-on-error: true — any test tagged @pytest.mark.slow that needs
66+
# a live Ollama instance will fail here; that is expected in CI.
67+
# Run the full suite locally against a host with Ollama for full coverage.
68+
# ---------------------------------------------------------------------------
69+
integration-tests:
70+
runs-on: ubuntu-latest
71+
72+
env:
73+
PALINODE_DIR: /tmp/palinode-ci-test
74+
75+
steps:
76+
- uses: actions/checkout@v4
77+
78+
- name: Set up Python
79+
uses: actions/setup-python@v5
80+
with:
81+
python-version: "3.11"
82+
cache: "pip"
83+
84+
- name: Install dependencies
85+
run: |
86+
python -m pip install --upgrade pip
87+
pip install -e ".[dev]"
88+
89+
- name: Run integration tests
90+
# Integration tests that need Ollama will be skipped in CI;
91+
# run locally against a host with Ollama for full Ollama-backed coverage.
92+
run: python -m pytest tests/integration/ -x -q
93+
continue-on-error: true
94+
95+
# ---------------------------------------------------------------------------
96+
# Security scans — informational (continue-on-error: true on pip-audit).
97+
#
98+
# bandit: static analysis for common Python security issues
99+
# pip-audit: checks installed packages against known vulnerability databases
100+
# ---------------------------------------------------------------------------
101+
security-scan:
102+
runs-on: ubuntu-latest
103+
104+
steps:
105+
- uses: actions/checkout@v4
106+
107+
- name: Set up Python
108+
uses: actions/setup-python@v5
109+
with:
110+
python-version: "3.11"
111+
cache: "pip"
112+
113+
- name: Install dependencies
114+
run: |
115+
python -m pip install --upgrade pip
116+
pip install -e ".[dev]"
117+
pip install bandit pip-audit
118+
119+
- name: Run bandit (static security analysis)
120+
# -r: recursive, -ll: medium+ severity, -q: quiet output
121+
run: bandit -r palinode/ -ll -q
122+
123+
- name: Run pip-audit (dependency vulnerability check)
124+
# continue-on-error: known-vulnerability lists drift; treat as informational
125+
run: pip-audit
126+
continue-on-error: true

.github/workflows/main-ci.yml

Lines changed: 131 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,131 @@
1+
# Rationale: Option B (post-merge sweep) from dev#198.
2+
# Option A (require branch-up-to-date before merge) is enforced
3+
# in GitHub repo settings → Branches → main branch protection.
4+
# This file is the backstop if that check is bypassed (admin merge, etc.).
5+
#
6+
# Triggered only on push to main (not on PRs — those are covered by ci.yml).
7+
# On any failure, opens a GitHub issue to flag the regression.
8+
9+
name: Main CI (post-merge sweep)
10+
11+
env:
12+
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true
13+
14+
on:
15+
push:
16+
branches: [main]
17+
18+
jobs:
19+
# ---------------------------------------------------------------------------
20+
# Unit tests — mirrors ci.yml; catches interaction bugs that slip through
21+
# independent-PR CI (the failure mode documented in #198).
22+
# ---------------------------------------------------------------------------
23+
unit-tests:
24+
runs-on: ubuntu-latest
25+
26+
strategy:
27+
matrix:
28+
python-version: ["3.11", "3.12"]
29+
30+
steps:
31+
- uses: actions/checkout@v4
32+
33+
- name: Set up Python ${{ matrix.python-version }}
34+
uses: actions/setup-python@v5
35+
with:
36+
python-version: ${{ matrix.python-version }}
37+
cache: "pip"
38+
39+
- name: Install dependencies
40+
run: |
41+
python -m pip install --upgrade pip
42+
pip install -e ".[dev]"
43+
44+
- name: Assert palinode resolves to the checked-out tree
45+
run: |
46+
RESOLVED=$(python -c "import palinode; print(palinode.__file__)")
47+
echo "palinode.__file__ = $RESOLVED"
48+
if [[ "$RESOLVED" != "$GITHUB_WORKSPACE"/* ]]; then
49+
echo "ERROR: palinode resolves outside the workspace ($GITHUB_WORKSPACE)"
50+
echo " Got: $RESOLVED"
51+
exit 1
52+
fi
53+
54+
- name: Run unit tests (excluding integration)
55+
run: python -m pytest tests/ -x -q --ignore=tests/integration --ignore=tests/live
56+
57+
# ---------------------------------------------------------------------------
58+
# Integration tests — informational backstop on main.
59+
# continue-on-error: true because Ollama is not available in CI runners.
60+
# ---------------------------------------------------------------------------
61+
integration-tests:
62+
runs-on: ubuntu-latest
63+
64+
env:
65+
PALINODE_DIR: /tmp/palinode-ci-test
66+
67+
steps:
68+
- uses: actions/checkout@v4
69+
70+
- name: Set up Python
71+
uses: actions/setup-python@v5
72+
with:
73+
python-version: "3.11"
74+
cache: "pip"
75+
76+
- name: Install dependencies
77+
run: |
78+
python -m pip install --upgrade pip
79+
pip install -e ".[dev]"
80+
81+
- name: Run integration tests
82+
run: python -m pytest tests/integration/ -x -q
83+
continue-on-error: true
84+
85+
# ---------------------------------------------------------------------------
86+
# Security scan — same as ci.yml.
87+
# ---------------------------------------------------------------------------
88+
security-scan:
89+
runs-on: ubuntu-latest
90+
91+
steps:
92+
- uses: actions/checkout@v4
93+
94+
- name: Set up Python
95+
uses: actions/setup-python@v5
96+
with:
97+
python-version: "3.11"
98+
cache: "pip"
99+
100+
- name: Install dependencies
101+
run: |
102+
python -m pip install --upgrade pip
103+
pip install -e ".[dev]"
104+
pip install bandit pip-audit
105+
106+
- name: Run bandit (static security analysis)
107+
run: bandit -r palinode/ -ll -q
108+
109+
- name: Run pip-audit (dependency vulnerability check)
110+
run: pip-audit
111+
continue-on-error: true
112+
113+
# ---------------------------------------------------------------------------
114+
# Regression reporter — fires only when a job above fails.
115+
# Opens a GitHub issue so the regression is visible outside the Actions UI.
116+
# ---------------------------------------------------------------------------
117+
report-regression:
118+
runs-on: ubuntu-latest
119+
needs: [unit-tests, integration-tests, security-scan]
120+
if: failure()
121+
122+
steps:
123+
- name: Report regression
124+
if: failure()
125+
env:
126+
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
127+
run: |
128+
gh issue create \
129+
--title "CI regression on main: ${{ github.sha }}" \
130+
--body "Commit ${{ github.sha }} broke CI on main. Run: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}" \
131+
--label "bug"

.gitignore

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,3 +61,7 @@ nohup.out
6161

6262
# Launch-posts working draft — local-only, not for git
6363
artifacts/launch-posts.md
64+
65+
# Test-rig deploy-key material (.claude/plans/test-rigs/) — never commit secrets
66+
.claude/plans/test-rigs/group_vars/all.vault.yml
67+
.claude/plans/palinode-test-env/group_vars/all.vault.yml

README.md

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,21 @@ Your agent's memory is a folder of markdown files. Palinode indexes them with hy
1616

1717
---
1818

19+
## Supported Platforms
20+
21+
| Platform | Session Skill Path | MCP Config |
22+
|----------|--------------------|------------|
23+
| **Claude Code CLI** | `~/.claude/skills/` | `~/.claude.json` |
24+
| **Claude Desktop** | `~/.claude/skills/` | `claude_desktop_config.json` |
25+
| **Cursor** | `.cursor/skills/` | `.cursor/mcp.json` |
26+
| **VS Code + Claude** (Continue / Cline) | `~/.claude/skills/` | see [MCP-INSTALL-RECIPES.md](docs/MCP-INSTALL-RECIPES.md) |
27+
| **JetBrains + Claude** | `~/.claude/skills/` | `~/.claude.json` |
28+
| **Codex CLI** | N/A (no skills) | `~/.codex/config.toml` |
29+
30+
All platforms share the same MCP server — install once on your server, connect from any IDE. See [docs/MCP-SETUP.md](docs/MCP-SETUP.md) and [docs/MCP-INSTALL-RECIPES.md](docs/MCP-INSTALL-RECIPES.md) for per-client config snippets.
31+
32+
---
33+
1934
## The Idea
2035

2136
Most agent memory is a black box. You can't read it, you can't diff it, you can't `grep` it when the vector DB is down. Palinode bets on **plain files as the source of truth** and builds everything else as a derived index.
@@ -50,12 +65,12 @@ Set up once on a server. Connect from any machine, any IDE, any agent framework.
5065
```json
5166
{
5267
"mcpServers": {
53-
"palinode": { "url": "http://your-server:6341/mcp/" }
68+
"palinode": { "type": "http", "url": "http://your-server:6341/mcp/" }
5469
}
5570
}
5671
```
5772

58-
That's the entire client config. Works with Claude Code, Claude Desktop, Cursor, Windsurf, Zed, and VS Code (Continue/Cline). See [docs/MCP-SETUP.md](docs/MCP-SETUP.md) for editor-specific install recipes.
73+
That's the entire client config. Works with Claude Code, Claude Desktop, Cursor, Windsurf, Zed, and VS Code (Continue/Cline). `palinode-mcp-sse` serves **streamable-HTTP** at `/mcp/` — the binary name is historical; use `"type": "http"`, not `"type": "sse"`. Always include the trailing slash in the URL. See [docs/MCP-SETUP.md](docs/MCP-SETUP.md) for editor-specific install recipes.
5974

6075
---
6176

@@ -117,7 +132,7 @@ cp /path/to/palinode/palinode.config.yaml.example palinode.config.yaml # adjust
117132
# Start services
118133
PALINODE_DIR=~/.palinode palinode-api # REST API on :6340
119134
PALINODE_DIR=~/.palinode palinode-watcher # auto-indexes on file save
120-
PALINODE_DIR=~/.palinode palinode-mcp-sse # MCP server on :6341 (optional)
135+
PALINODE_DIR=~/.palinode palinode-mcp-sse # MCP server on :6341 (streamable-HTTP at /mcp/; optional)
121136

122137
# Verify
123138
curl http://localhost:6340/status
@@ -166,7 +181,7 @@ palinode diff --days 7
166181

167182
## Tools
168183

169-
21 tools available through every interface:
184+
25 tools available through every interface:
170185

171186
| Tool | What It Does |
172187
|------|-------------|

0 commit comments

Comments
 (0)