Skip to content

Commit 39f2ba9

Browse files
talionwarclaude
andcommitted
feat: v0.6.0 — make all 8 agents free, remove licensing system
Remove Open Core model: all agents are now free and open source. Deleted HMAC license validation, PRO tier gating, and --free CLI flag. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent 9278154 commit 39f2ba9

18 files changed

Lines changed: 44 additions & 255 deletions

CHANGELOG.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,18 @@
22

33
All notable changes to Fondamenta ArchCode are documented here.
44

5+
## [0.6.0] - 2026-03-16
6+
7+
### Changed
8+
- **All 8 agents are now free** — removed Open Core licensing, all agents available without license key
9+
- Removed `license.ts` (HMAC validation), `--free` CLI flag, license config field, tier badges
10+
- Version bump to 0.6.0
11+
12+
### Removed
13+
- PRO/free tier distinction — all agents are now tier `free`
14+
- License validation system (HMAC-based)
15+
- `validateLicense()` and `generateLicenseKey()` exports
16+
517
## [0.4.0] - 2026-03-12
618

719
### Added

README.md

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -173,27 +173,21 @@ Zero runtime dependencies after analysis — output is plain Markdown.
173173

174174
### `fondamenta agents`
175175

176-
Run 8 code health agents (3 free, 5 PRO) that analyze your project graph and produce actionable findings.
176+
Run 8 code health agents that analyze your project graph and produce actionable findings. All agents are free and open source.
177177

178178
```bash
179-
fondamenta agents # All available agents
180-
fondamenta agents --free # Free agents only
179+
fondamenta agents # All agents
181180
fondamenta agents --agent dead-code # Single agent
182181
fondamenta agents --ci # Exit code 1 if errors found
183182
fondamenta agents --report # Generate AGENTS-REPORT.md
184-
fondamenta agents --list # List all agents with tier
183+
fondamenta agents --list # List all agents
185184
```
186185

187-
**Free agents:**
188186
| Agent | What it checks |
189187
|-------|---------------|
190188
| `dead-code` | Orphan components, unused exports, unreferenced lib files |
191189
| `circular-deps` | Circular import chains (DFS cycle detection) |
192190
| `architecture-guard` | Oversized files, god components, unprotected mutation routes |
193-
194-
**PRO agents** (license required):
195-
| Agent | What it checks |
196-
|-------|---------------|
197191
| `security-scanner` | Auth gaps, env var leaks, insecure patterns |
198192
| `schema-drift` | Code↔schema model mismatches |
199193
| `performance-sentinel` | Heavy pages, unnecessary client components, API waterfalls |
@@ -292,15 +286,13 @@ git add .planning/
292286
- [x] `fondamenta watch` (incremental rebuild)
293287
- [x] `fondamenta diff` (show changes since last analysis)
294288
- [x] AI context generation (`.cursorrules`, `CLAUDE.md`, copilot instructions)
295-
- [x] Code health agents (8 agents: dead code, circular deps, security, performance, etc.)
296-
- [x] Open Core licensing (3 free + 5 PRO)
289+
- [x] Code health agents (8 agents, all free: dead code, circular deps, security, performance, etc.)
297290
- [x] Manual sections preservation (marker-based + split-point)
298291
- [x] Incremental mode (`--incremental` via git diff)
299292
- [x] writeIfChanged (zero-noise git diffs)
300293
- [x] Test suite (120+ tests, CI with GitHub Actions)
301294
- [ ] GitHub Action (marketplace)
302295
- [ ] Multi-framework support (Nuxt, SvelteKit, Remix)
303-
- [ ] Ed25519 license validation (upgrade from HMAC)
304296

305297
## Contributing
306298

examples/demo-fullstack/README.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -72,11 +72,11 @@ Key findings:
7272
| 5 | Agent: dead-code | `components/OrphanCard.tsx`, `lib/unused-helper.ts` | Orphan component + orphan libs |
7373
| 6 | Agent: circular-deps | `circular/module-a.ts → b → c → a` | 3-file import cycle |
7474
| 7 | Agent: architecture-guard | `app/dashboard/page.tsx` (19 imports) | God component warning |
75-
| 8 | Agent: security-scanner | `app/api/orders/route.ts` (no auth) | Unprotected mutation (PRO) |
76-
| 9 | Agent: schema-drift | `lib/payments.ts` (uses `Payment` model) | Model not in schema (PRO) |
77-
| 10 | Agent: performance-sentinel | `app/dashboard/page.tsx` (19 imports) | Heavy page (PRO) |
78-
| 11 | Agent: convention-enforcer | `components/DashboardStats.tsx` (PascalCase) | Naming check (PRO) |
79-
| 12 | Agent: impact-analyzer | `components/ui/Button.tsx` (high fan-in) | Hub component (PRO) |
75+
| 8 | Agent: security-scanner | `app/api/orders/route.ts` (no auth) | Unprotected mutation |
76+
| 9 | Agent: schema-drift | `lib/payments.ts` (uses `Payment` model) | Model not in schema |
77+
| 10 | Agent: performance-sentinel | `app/dashboard/page.tsx` (19 imports) | Heavy page |
78+
| 11 | Agent: convention-enforcer | `components/DashboardStats.tsx` (PascalCase) | Naming check |
79+
| 12 | Agent: impact-analyzer | `components/ui/Button.tsx` (high fan-in) | Hub component |
8080
| 13 | Watch mode | Run: `fondamenta watch` | Auto-regenerate on file changes |
8181
| 14 | Diff mode | `.planning/.fondamenta-state.json` | `fondamenta diff` shows changes |
8282
| 15 | AI context | `CLAUDE.md` (pre-generated) | AI-readable project summary |

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "fondamenta-archcode",
3-
"version": "0.5.0",
3+
"version": "0.6.0",
44
"description": "Zero-dependency codebase intelligence for AI agents. Static analysis → structured Markdown.",
55
"type": "module",
66
"bin": {

src/agents/index.ts

Lines changed: 2 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,9 @@
1-
import type { Agent, AgentResult, AgentsRunSummary, AgentsConfig } from './types.js';
1+
import type { Agent, AgentResult, AgentsRunSummary } from './types.js';
22
import type { ProjectGraph, FondamentaConfig } from '../types/index.js';
3-
import { validateLicense } from './license.js';
43

5-
// Free agents
64
import { deadCodeAgent } from './free/dead-code.js';
75
import { circularDepsAgent } from './free/circular-deps.js';
86
import { architectureGuardAgent } from './free/architecture-guard.js';
9-
10-
// PRO agents
117
import { securityScannerAgent } from './pro/security-scanner.js';
128
import { schemaDriftAgent } from './pro/schema-drift.js';
139
import { performanceSentinelAgent } from './pro/performance-sentinel.js';
@@ -17,11 +13,9 @@ import { impactAnalyzerAgent } from './pro/impact-analyzer.js';
1713
// --- Registry ---
1814

1915
export const ALL_AGENTS: Agent[] = [
20-
// Free
2116
deadCodeAgent,
2217
circularDepsAgent,
2318
architectureGuardAgent,
24-
// PRO
2519
securityScannerAgent,
2620
schemaDriftAgent,
2721
performanceSentinelAgent,
@@ -40,7 +34,6 @@ export function listAgents(): Agent[] {
4034
// --- Runner ---
4135

4236
export interface RunAgentsOptions {
43-
freeOnly?: boolean;
4437
agentIds?: string[];
4538
}
4639

@@ -50,7 +43,6 @@ export function runAgents(
5043
options: RunAgentsOptions = {},
5144
): AgentsRunSummary {
5245
const start = Date.now();
53-
const license = validateLicense(config.agents?.license);
5446
const results: AgentResult[] = [];
5547

5648
let agents = ALL_AGENTS;
@@ -60,11 +52,6 @@ export function runAgents(
6052
agents = agents.filter((a) => options.agentIds!.includes(a.id));
6153
}
6254

63-
// Filter by free only
64-
if (options.freeOnly) {
65-
agents = agents.filter((a) => a.tier === 'free');
66-
}
67-
6855
// Filter by config exclude
6956
const excluded = new Set(config.agents?.exclude ?? []);
7057

@@ -82,19 +69,6 @@ export function runAgents(
8269
continue;
8370
}
8471

85-
// Skip PRO agents without valid license
86-
if (agent.tier === 'pro' && !license.valid) {
87-
results.push({
88-
agentId: agent.id,
89-
tier: agent.tier,
90-
findings: [],
91-
durationMs: 0,
92-
skipped: true,
93-
skipReason: 'PRO license required',
94-
});
95-
continue;
96-
}
97-
9872
// Run the agent
9973
const agentStart = Date.now();
10074
try {
@@ -139,6 +113,5 @@ export function runAgents(
139113
}
140114

141115
// Re-exports
142-
export type { Agent, AgentFinding, AgentResult, AgentsRunSummary, AgentsConfig, LicenseInfo } from './types.js';
143-
export { validateLicense, generateLicenseKey } from './license.js';
116+
export type { Agent, AgentFinding, AgentResult, AgentsRunSummary } from './types.js';
144117
export { printAgentResult, printFindings, printSummary, generateAgentsReport } from './reporter.js';

src/agents/license.ts

Lines changed: 0 additions & 78 deletions
This file was deleted.

src/agents/pro/convention-enforcer.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ export const conventionEnforcerAgent: Agent = {
55
id: 'convention-enforcer',
66
name: 'Convention Enforcer',
77
description: 'Checks naming conventions, barrel exports, and consistency of auth patterns',
8-
tier: 'pro',
8+
tier: 'free',
99

1010
run(graph: ProjectGraph, _config: FondamentaConfig): AgentFinding[] {
1111
const findings: AgentFinding[] = [];

src/agents/pro/impact-analyzer.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ export const impactAnalyzerAgent: Agent = {
88
id: 'impact-analyzer',
99
name: 'Impact Analyzer',
1010
description: 'Identifies high fan-in/fan-out nodes, hub components, and articulation points in the graph',
11-
tier: 'pro',
11+
tier: 'free',
1212

1313
run(graph: ProjectGraph, _config: FondamentaConfig): AgentFinding[] {
1414
const findings: AgentFinding[] = [];

src/agents/pro/performance-sentinel.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ export const performanceSentinelAgent: Agent = {
55
id: 'performance-sentinel',
66
name: 'Performance Sentinel',
77
description: 'Detects heavy pages, unnecessary client components, and API call waterfalls',
8-
tier: 'pro',
8+
tier: 'free',
99

1010
run(graph: ProjectGraph, config: FondamentaConfig): AgentFinding[] {
1111
const maxPageImports = config.agents?.thresholds?.maxPageImports ?? 20;

src/agents/pro/schema-drift.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ export const schemaDriftAgent: Agent = {
55
id: 'schema-drift',
66
name: 'Schema Drift Detector',
77
description: 'Finds models referenced in code but missing from schema, and schema models never used in code',
8-
tier: 'pro',
8+
tier: 'free',
99

1010
run(graph: ProjectGraph, _config: FondamentaConfig): AgentFinding[] {
1111
const findings: AgentFinding[] = [];

0 commit comments

Comments
 (0)