Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
50 commits
Select commit Hold shift + click to select a range
52a57ed
Merge pull request #74 from trycompai/main
carhartlewis Aug 7, 2026
1561073
chore: release release
github-actions[bot] Aug 7, 2026
5074fc4
Merge pull request #75 from trycompai/release-please--branches--release
carhartlewis Aug 7, 2026
3c20d80
Merge pull request #77 from trycompai/main
carhartlewis Aug 7, 2026
808b835
Merge pull request #79 from trycompai/main
carhartlewis Aug 7, 2026
407280a
Merge pull request #81 from trycompai/main
carhartlewis Aug 7, 2026
c26a08d
Merge pull request #84 from trycompai/main
carhartlewis Aug 7, 2026
d585dc3
Merge pull request #90 from trycompai/main
carhartlewis Aug 8, 2026
d0299d9
Merge pull request #98 from trycompai/main
carhartlewis Aug 11, 2026
7d4a573
Merge pull request #107 from trycompai/main
carhartlewis Aug 11, 2026
56f4eeb
Merge pull request #116 from trycompai/main
github-actions[bot] Aug 11, 2026
57001e6
Merge pull request #119 from trycompai/main
github-actions[bot] Aug 11, 2026
ad1d702
Merge pull request #122 from trycompai/main
github-actions[bot] Aug 11, 2026
fc0c594
Merge pull request #127 from trycompai/main
github-actions[bot] Aug 11, 2026
4ffe150
Merge pull request #130 from trycompai/main
github-actions[bot] Aug 11, 2026
14cd220
Merge pull request #135 from trycompai/main
github-actions[bot] Aug 11, 2026
f2484fb
Merge pull request #141 from trycompai/main
github-actions[bot] Aug 12, 2026
bb63520
Merge pull request #161 from trycompai/main
github-actions[bot] Aug 18, 2026
517d859
Merge pull request #165 from trycompai/main
github-actions[bot] Aug 20, 2026
b842bd6
Merge pull request #168 from trycompai/main
github-actions[bot] Aug 20, 2026
77089e4
Merge pull request #172 from trycompai/main
github-actions[bot] Aug 20, 2026
6d4793d
Merge pull request #177 from trycompai/main
github-actions[bot] Aug 21, 2026
c7fc76e
feat(agent): add XMPP export tools gateway (#1)
romanbsd Aug 28, 2026
8fb82cc
Retain minimal headless construction CRM scope (#2)
dpaluy Aug 31, 2026
59a5138
feat: bundle kaneo project management against the shared database (#5)
romanbsd Sep 3, 2026
f1031ca
feat(api): register push tokens for mobile notifications (#6)
romanbsd Sep 3, 2026
84423ad
feat(auth): add OAuth 2.1 and OIDC support (#3)
romanbsd Sep 4, 2026
4dbc909
fix: complete JobSteward production Google OAuth setup (#7)
dpaluy Sep 6, 2026
99012ad
fix: make Context research configuration optional (#1)
dpaluy Sep 6, 2026
6a6a739
fix(app): label Kaneo agent tools
dpaluy Sep 6, 2026
9a3dcdc
fix(auth): recover from OAuth startup connection resets (#3)
dpaluy Sep 7, 2026
c19d15c
feat: add customer and project asset storage (#4)
dpaluy Sep 9, 2026
3198acc
fix tests
dpaluy Sep 9, 2026
1858080
chore: support bun 1.4.x
romanbsd Sep 9, 2026
56c01f9
Merge pull request #1 from jobsteward/chore/bun-1.4
romanbsd Sep 9, 2026
94317fe
test: make brand retirement timing timezone-safe
romanbsd Sep 9, 2026
8840854
chore(deps): upgrade all dependencies to latest versions (#4)
romanbsd Sep 9, 2026
44188b9
feat: add native multi-tenancy (#3)
romanbsd Sep 9, 2026
a138a69
chore: sync history with upstream trycompai/crm release (22 commits)
romanbsd Sep 9, 2026
6f22609
update kaneo
romanbsd Sep 9, 2026
c450f1a
kaneo add
dpaluy Sep 10, 2026
61eb8ef
fix: align kaneo team tables with vendored drizzle schema
dpaluy Sep 10, 2026
f2656e1
add msw skill
dpaluy Sep 10, 2026
35a9ed4
Merge pull request #6 from jobsteward/feat/r2-key-hierarchy
dpaluy Sep 11, 2026
19c665c
feat: add project appointments and asset management (#7)
dpaluy Sep 11, 2026
f38174c
fix: serve REST operations at root resource paths (#8)
dpaluy Sep 11, 2026
919eddf
feat: replace public upload workflows with asset resources (#9)
dpaluy Sep 11, 2026
de6ecf4
fix: keep agent tools compatible with eve build (#10)
dpaluy Sep 12, 2026
1427ca2
update deps
romanbsd Sep 14, 2026
fdeb4fa
reformat, fix upload
romanbsd Sep 14, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
120 changes: 120 additions & 0 deletions .agents/skills/minimal-sufficient-work/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,120 @@
---
name: minimal-sufficient-work
description: "Use when MSW is invoked or work risks expanding beyond the requested scope."
---

# Minimal Sufficient Work (MSW)

Use the MSW kernel to complete the requested outcome without speculative work, extra process, or proof beyond what the outcome requires.

## Program

```
contract ← the requested outcome + the smallest criteria that prove it

while ∃ claim c : deleting c leaves contract unmet ∨ unproven
do c ; prove c

halt ; report
```

## Definitions

### Contract

Establish the requested outcome and the smallest set of acceptance criteria that would prove it before doing work. Treat the contract as both the floor and the ceiling.

When the request is ambiguous:

- In attended work, ask only when the answer would materially change the contract.
- In unattended work, bind the smallest reading consistent with the stated intent and record the assumption.

Do not silently expand the contract with inferred improvements, generic best practices, or unrelated cleanup.

### Claim

Treat anything petitioning to become work as a claim, including:

- a plan step or implementation change
- a test, check, investigation, or proof step
- a new file, abstraction, dependency, artifact, or process
- a review finding or discovered edge case
- a migration, rollout control, monitoring change, or cleanup task
- an instinct that another pass would be useful

A claim is a proposal, not a verdict. Its source or stated severity does not make it necessary.

### Deletion Rule

For every claim `c`, ask:

> If `c` is deleted, does the contract remain met and proven for the task's actual inputs, environment, and applicable constraints?

- If yes, reject the claim. Do not implement, investigate, defer, or create follow-up work for it.
- If no, accept the claim and perform the smallest reliable act that closes the specific gap.

A claim passes only when deleting it leaves the contract unmet or unproven. Useful, thorough, conventional, and possible are not synonyms for necessary. Derive severity from impact on the contract, not from the person or tool that raised the claim.

### Do and Prove

For each accepted claim:

1. Perform the smallest reliable act that closes the gap.
2. Produce evidence sized to that claim.
3. Close the claim when the evidence proves it.

An unproven act leaves its claim open. Re-proving a closed claim is a new claim and must pass the deletion rule.

Use evidence appropriate to the gap, such as a focused test, command output, direct inspection, reproduced behavior, type check, build result, or authoritative documentation. Do not add a broader test or review pass unless deleting it would leave the contract unproven.

### Halt

Stop when the contract is proven and no remaining claim passes the deletion rule. Reviewer silence and exhausted imagination are not stopping conditions. Continuing after the fixed point is as incorrect as stopping before it.

## Fuses

Use these fuses when claim evaluation fails to converge:

```text
rounds = 3 -> halt and report open items; do not chase them
claim born in round n+1 that was visible in round n -> reject
```

A round is one complete evaluation, action, and proof pass over the claims then visible. The three-round limit is defined by this skill, not inferred from task size.

## No Unauthoritative Limits

Never invent a cap, threshold, quota, budget, timeout, retry count, round count, file count, line count, acceptance-criterion count, agent count, or similar limit.

A limit is admissible only when its exact value is:

- explicitly required by the requester
- imposed by an applicable technical or platform contract
- defined by authoritative project policy
- derived from measured evidence necessary to meet or prove the contract

State the authority or derivation whenever proposing or applying a limit. If no authority exists, omit the limit and apply the deletion rule. Metrics may be evidence, but must not become gates, defaults, targets, or recommendations through agent intuition. Examples and representative proportions do not become defaults.

If a necessary limit requires an unresolved owner choice, ask rather than manufacture a value. The fuse above is already authorized by this skill.

## Report

Report only:

1. the outcome against the contract
2. the evidence that proves it
3. necessary open items remaining because a fuse fired or the work is blocked
4. rejected claims worth the user's attention, at most one line each

Do not turn rejected claims into recommendations, investigations, or deferred tasks.

## Quality Gate

Before reporting, confirm:

- the requested outcome and proof criteria formed the contract
- every performed action passed the deletion rule
- every accepted claim has evidence or remains explicitly open
- no invented limit shaped the work
- no closed claim was re-proven without necessity
- work stopped at the fixed point or an authorized fuse
54 changes: 51 additions & 3 deletions .env.example
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# Postgres
DATABASE_URL="postgresql://postgres:postgres@localhost:5432/crm?schema=public"
DATABASE_URL="postgresql://crm:crm@localhost:5432/crm?schema=public"

# A direct, unpooled connection to that same database, used by
# `prisma migrate deploy` when the API is built on Vercel. Set it only if
Expand All @@ -11,7 +11,12 @@ DATABASE_URL="postgresql://postgres:postgres@localhost:5432/crm?schema=public"
# and refuses to run without this — these are real integration tests, they write
# and delete rows, and the pre-push hook runs them. The name has to end in
# `_test`. `bun run db:test` creates it and applies the migrations.
TEST_DATABASE_URL="postgresql://postgres:postgres@localhost:5432/crm_test?schema=public"
TEST_DATABASE_URL="postgresql://crm:crm@localhost:5432/crm_test?schema=public"

# Postgres connection for a BYPASSRLS role. Only the database migration
# rehearsal uses this role to audit every tenant. Normal app processes must
# never use this value.
AUDIT_DATABASE_URL=""

# Generate your own: openssl rand -base64 32
BETTER_AUTH_SECRET=""
Expand Down Expand Up @@ -53,7 +58,7 @@ GOOGLE_CLIENT_SECRET=""
# MICROSOFT_CLIENT_SECRET=""

# Optional. Enables Slack account linking on Settings > Connections.
# Add APP_URL + /api/auth/oauth2/callback/slack as the Slack OAuth redirect URL.
# Add API_URL + /api/auth/callback/slack as the Slack OAuth redirect URL.
# SLACK_CLIENT_ID=""
# SLACK_CLIENT_SECRET=""

Expand Down Expand Up @@ -112,6 +117,41 @@ GOOGLE_CLIENT_SECRET=""
# schedule.
# AGENT_BRIDGE_SECRET=""

# Optional XMPP agent gateway. Set XMPP_COMPONENT_ENABLED to 1 and provide the
# component identity, component secret, and owning organization together. The
# gateway exposes only operations from apps/agent/src/exports. Task state is
# retained in PostgreSQL for 24 hours after admission.
# XMPP_COMPONENT_ENABLED="1"
# XMPP_COMPONENT_JID="gateway.agents.example.com"
# XMPP_COMPONENT_SECRET=""
# XMPP_ORGANIZATION_ID=""
# XMPP_COMPONENT_SERVICE="xmpp://127.0.0.1:5275"
# XMPP_DEFAULT_AGENT_JID="assistant@agents.example.com"
# XMPP_AGENT_DOMAIN="agents.example.com"
# XMPP_SERVER_DOMAIN="example.com"
# XMPP_GATEWAY_ID="gw-1"
# XMPP_AGENT_VERSION="1.0.0"

# Comma-separated domains that can discover and invoke the endpoint. The
# server and agent domains are used when this value is absent.
# XMPP_ALLOWED_CALLER_DOMAINS="example.com,agents.example.com"

# Comma-separated bare JIDs that can invoke destructive exports. Destructive
# exports remain visible but return forbidden when this value is absent.
# XMPP_ALLOW_DESTRUCTIVE_CALLERS="trusted-agent@agents.example.com"

# Optional transport tuning. The copied gateway supplies safe defaults.
# XMPP_XML_LANG="en"
# XMPP_RECEIPT_TIMEOUT_MS="30000"
# XMPP_RECEIPT_MAX_RESENDS="0"
# XMPP_RECEIPT_SWEEP_MS="10000"
# XMPP_RECONNECT_INITIAL_MS="1000"
# XMPP_RECONNECT_MAX_MS="60000"
# XMPP_PING_INTERVAL_MS="60000"
# XMPP_PING_TIMEOUT_MS="10000"
# XMPP_PING_FAILURE_THRESHOLD="2"
# XMPP_MAX_PENDING_IQ_REQUESTS="256"

# PORT="3001"


Expand Down Expand Up @@ -152,6 +192,14 @@ GOOGLE_CLIENT_SECRET=""
# https://vercel.com/docs/ai-gateway
# AI_GATEWAY_API_KEY=""

# Cloudflare R2 storage. Leave all four values empty to disable asset uploads.
# Create an R2 API token with object read and write access for the private bucket.
# The API signs direct browser and mobile transfers. It does not expose these keys.
# R2_ACCOUNT_ID=""
# R2_ACCESS_KEY_ID=""
# R2_SECRET_ACCESS_KEY=""
# R2_BUCKET=""


# ── Optional: operations ─────────────────────────────────────────────────────

Expand Down
62 changes: 0 additions & 62 deletions .github/workflows/auto-pr.yml

This file was deleted.

27 changes: 22 additions & 5 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ on:
pull_request:
types: [opened, synchronize, reopened, ready_for_review]
push:
branches: [main, release]
branches: [master]

concurrency:
group: ci-${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
Expand All @@ -20,12 +20,12 @@ env:
jobs:
check:
name: check-types, lint, test
runs-on: ubuntu-24.04
runs-on: ubuntu-26.04
timeout-minutes: 20

services:
postgres:
image: postgres:17-alpine
image: postgres:18-alpine
env:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
Expand All @@ -39,8 +39,8 @@ jobs:
--health-retries 20

env:
DATABASE_URL: postgresql://postgres:postgres@localhost:5432/crm_test?schema=public
TEST_DATABASE_URL: postgresql://postgres:postgres@localhost:5432/crm_test?schema=public
DATABASE_URL: postgresql://crm:crm@localhost:5432/crm_test?schema=public
TEST_DATABASE_URL: postgresql://crm:crm@localhost:5432/crm_test?schema=public
ALLOWED_SIGN_IN: example.com
BETTER_AUTH_SECRET: ci-only-secret-regenerate-for-any-real-deployment
API_URL: http://localhost:3001
Expand All @@ -50,13 +50,30 @@ jobs:

steps:
- uses: actions/checkout@v5
with:
submodules: recursive

- uses: oven-sh/setup-bun@v2
with:
bun-version-file: package.json

- name: Create runtime database role
env:
PGPASSWORD: postgres
run: |
psql -h localhost -U postgres -d postgres -v ON_ERROR_STOP=1 -c "CREATE ROLE crm WITH LOGIN PASSWORD 'crm' NOSUPERUSER CREATEDB NOCREATEROLE NOINHERIT NOBYPASSRLS"
psql -h localhost -U postgres -d postgres -v ON_ERROR_STOP=1 -c "ALTER DATABASE crm_test OWNER TO crm"

- run: bun install --frozen-lockfile

- name: Install kaneo dependencies
run: cd vendor/kaneo && bun install

- name: Build kaneo packages
run: |
cd vendor/kaneo/packages/email && bun run build
cd ../permissions && bun run build

- name: Apply migrations
run: bun run db:deploy

Expand Down
52 changes: 0 additions & 52 deletions .github/workflows/pr-base.yml

This file was deleted.

Loading
Loading