Skip to content

Commit d2be160

Browse files
Contentrainclaude
andcommitted
fix(billing): align Pro seat limit to 10, remove per-seat remnants
Per-seat pricing was removed in e706bcb but Pro team.members limit stayed at 25 while seats_included was 10. With flat-rate billing these must match — Pro now consistently allows 10 seats. Also includes: REST API feature removal from ee/ scope, webhook event emissions for merge/reject/content/model endpoints, and windsurfrules SEO example update. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent e706bcb commit d2be160

12 files changed

Lines changed: 37 additions & 24 deletions

File tree

.contentrain/content/system/plan-features/data.json

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -91,17 +91,6 @@
9191
"starter_value": "100",
9292
"type": "limit"
9393
},
94-
"api-rest": {
95-
"category": "api",
96-
"enterprise_value": "true",
97-
"free_value": "false",
98-
"key": "api.rest",
99-
"name": "Content REST API",
100-
"pro_value": "true",
101-
"sort_order": 5,
102-
"starter_value": "true",
103-
"type": "feature"
104-
},
10594
"api-webhooks": {
10695
"category": "api",
10796
"enterprise_value": "unlimited",
@@ -422,7 +411,7 @@
422411
"free_value": "1",
423412
"key": "team.members",
424413
"name": "Team Members",
425-
"pro_value": "25",
414+
"pro_value": "10",
426415
"sort_order": 3,
427416
"starter_value": "3",
428417
"type": "limit"

.contentrain/context.json

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@
3131
"api-messages-per-month",
3232
"api-webhooks",
3333
"api-custom-instructions",
34-
"api-rest",
3534
"api-webhooks-outbound",
3635
"workflow-review",
3736
"roles-reviewer",

.contentrain/meta/plan-features/en.json

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -39,11 +39,6 @@
3939
"status": "draft",
4040
"updated_by": "contentrain-mcp"
4141
},
42-
"api-rest": {
43-
"source": "agent",
44-
"status": "draft",
45-
"updated_by": "contentrain-mcp"
46-
},
4742
"api-webhooks": {
4843
"source": "agent",
4944
"status": "draft",

.windsurfrules

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ Every rule is mandatory. Violations must be fixed before committing.
2525

2626
- Length: 50-60 characters. Measure before committing.
2727
- Place the primary keyword within the first 30 characters.
28-
- Use action-oriented phrasing: "Build a REST API" not "REST API Overview".
28+
- Use action-oriented phrasing: "Build a Contact Form" not "Contact Form Overview".
2929
- No clickbait: "You Won't Believe..." is forbidden.
3030
- No ALL CAPS titles. Use sentence case or title case per project convention.
3131
- Every title must be unique within its collection.

AGENTS.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -238,7 +238,7 @@ The `ee/` boundary rules are enforced in code and contributor guidance; internal
238238
- Approval chains, scheduled publish
239239
- Audit log, activity feed
240240
- White-label branding
241-
- Outbound webhooks, public REST API
241+
- Outbound webhooks
242242

243243
### What stays in core (AGPL):
244244
- All auth flows, workspace/project CRUD

CLAUDE.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -246,7 +246,7 @@ The `ee/` boundary rules are enforced in code and contributor guidance; internal
246246
- Approval chains, scheduled publish
247247
- Audit log, activity feed
248248
- White-label branding
249-
- Outbound webhooks, public REST API
249+
- Outbound webhooks
250250

251251
### What stays in core (AGPL):
252252
- All auth flows, workspace/project CRUD

server/api/workspaces/[workspaceId]/projects/[projectId]/branches/[branch]/merge.post.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,5 +23,13 @@ export default defineEventHandler(async (event) => {
2323
const { git, contentRoot } = await resolveProjectContext(workspaceId, projectId)
2424

2525
const engine = createContentEngine({ git, contentRoot, projectId })
26-
return engine.mergeBranch(branch)
26+
const mergeResult = await engine.mergeBranch(branch)
27+
28+
// Emit webhook event (fire-and-forget)
29+
emitWebhookEvent(projectId, workspaceId, 'branch.merged', {
30+
branch,
31+
source: 'api',
32+
}).catch(() => {})
33+
34+
return mergeResult
2735
})

server/api/workspaces/[workspaceId]/projects/[projectId]/branches/[branch]/reject.post.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,5 +26,12 @@ export default defineEventHandler(async (event) => {
2626

2727
const engine = createContentEngine({ git, contentRoot, projectId })
2828
await engine.rejectBranch(branch)
29+
30+
// Emit webhook event (fire-and-forget)
31+
emitWebhookEvent(projectId, workspaceId, 'branch.rejected', {
32+
branch,
33+
source: 'api',
34+
}).catch(() => {})
35+
2936
return { rejected: true }
3037
})

server/api/workspaces/[workspaceId]/projects/[projectId]/content/[modelId].post.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,5 +91,13 @@ export default defineEventHandler(async (event) => {
9191
// Usage tracking failure is non-fatal
9292
}
9393

94+
// Emit webhook event (fire-and-forget)
95+
emitWebhookEvent(projectId, workspaceId, 'content.saved', {
96+
models: [modelId],
97+
locale: body.locale ?? 'en',
98+
source: 'api',
99+
merged,
100+
}).catch(() => {})
101+
94102
return { ...result, merged, workflow, pullRequestUrl }
95103
})

server/api/workspaces/[workspaceId]/projects/[projectId]/models/[modelId].patch.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,5 +106,12 @@ export default defineEventHandler(async (event) => {
106106

107107
invalidateBrainCache(projectId)
108108

109+
// Emit webhook event (fire-and-forget)
110+
emitWebhookEvent(projectId, workspaceId, 'model.saved', {
111+
modelId,
112+
source: 'api',
113+
merged,
114+
}).catch(() => {})
115+
109116
return { saved: true, merged, form: mergedForm }
110117
})

0 commit comments

Comments
 (0)