Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -27,3 +27,5 @@ packages/server/objectstack.config.js

# Vercel
.vercel/
*.tgz
package/
6 changes: 3 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,9 @@
[![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)
![Objects](https://img.shields.io/badge/Objects-~148-brightgreen)
![Tests](https://img.shields.io/badge/Tests-3799%20passing-brightgreen)
![Spec](https://img.shields.io/badge/%40objectstack%2Fspec-v3.0.8-blue)
![Spec](https://img.shields.io/badge/%40objectstack%2Fspec-v3.0.11-blue)

> A world-class Customer Relationship Management system built on @objectstack/spec v3.0.8 protocol with Salesforce-level functionality and Apple/Linear-level UX.
> A world-class Customer Relationship Management system built on @objectstack/spec v3.0.11 protocol with Salesforce-level functionality and Apple/Linear-level UX.

Comment on lines 8 to 12
Copy link

Copilot AI Feb 27, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

README still advertises "3799 passing" tests, but ROADMAP.md in this PR records 3817 tests passing for the v3.0.11 upgrade. Please align the README test badge / stated counts with the updated baseline to keep documentation consistent.

Copilot uses AI. Check for mistakes.
## ⚡ Quick Start in 60 Seconds

Expand All @@ -31,7 +31,7 @@ pnpm test # Vitest — expect 3,799+ tests passing

## 🌟 Overview

HotCRM is a **comprehensive, AI-native enterprise CRM** covering the complete Lead-to-Cash lifecycle. Built on @objectstack/spec v3.0.8:
HotCRM is a **comprehensive, AI-native enterprise CRM** covering the complete Lead-to-Cash lifecycle. Built on @objectstack/spec v3.0.11:

- **~148 Business Objects** across 13 packages: Sales, Marketing, Revenue, Service, HR, AI, Analytics, Integration, Community, Real Estate, Healthcare, Financial Services, Education
- **Metadata-Driven**: All objects defined in TypeScript (`.object.ts`) — the single source of truth
Expand Down
5 changes: 3 additions & 2 deletions ROADMAP.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# HotCRM Development Roadmap

> Comprehensive development plan for HotCRM — the world's first AI-Native CRM.
> Protocol: @objectstack/spec v3.0.8 | Last Updated: February 2026
> Protocol: @objectstack/spec v3.0.11 | Last Updated: February 2026

## Strategic Direction

Expand All @@ -22,7 +22,7 @@

| Metric | Value |
|--------|-------|
| Protocol Version | @objectstack/spec v3.0.8 |
| Protocol Version | @objectstack/spec v3.0.11 |
| Business Objects | ~148 across 13 packages |
| Business Packages | 13 (6 core clouds + AI + Analytics + Integration + Community + 4 verticals) |
| Hook Files | 121+ across 13 packages |
Expand Down Expand Up @@ -211,6 +211,7 @@ These items were deferred during Phase 13 and have been completed:

| Date | From | To | Breaking Changes | Tests |
|------|------|----|-----------------|-------|
| 2026-02-26 | v3.0.8 | v3.0.11 | ViewFilterRule format changed from array tuples to objects `{ field, operator, value }` (34 view files updated) | 3817 ✅ |
| 2026-02-26 | v3.0.8 | v3.0.8 | None (Phase 15: Added EventTypeDefinitionSchema validation to all 9 events.ts files; 100% metadata schema compliance) | 3817 ✅ |
| 2026-02-25 | v3.0.8 | v3.0.8 | None (Phase 15: Fixed tsconfig.json path aliases for node16 ESM module resolution — changed directory paths to explicit index.ts files) | 3813 ✅ |
| 2026-02-21 | v3.0.8 | v3.0.8 | None (Phase 15 continued: Structured pino logging across 154 files, CacheManager test isolation, db.ts deprecation annotations, emoji removal from logs) | 3813 ✅ |
Expand Down
2 changes: 1 addition & 1 deletion content/docs/index.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,7 @@ Explore the six business clouds that power every stage of the customer lifecycle

| Metric | Value |
|--------|-------|
| **Protocol Version** | @objectstack/spec v3.0.8 |
| **Protocol Version** | @objectstack/spec v3.0.11 |
| **Business Packages** | 13 (6 core clouds + AI + Analytics + Integration + Community + 4 verticals) |
| **Business Objects** | ~148 across 13 packages |
| **Server-Side Hooks** | 121+ hooks enforcing business logic |
Expand Down
8 changes: 4 additions & 4 deletions content/docs/roadmap.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ description: Strategic direction and completed development milestones for HotCRM

HotCRM has completed **16 development phases** (1–14 including 10.5, 10.6, 12A-D, and 12E), establishing a full-featured, production-ready **13-package CRM** with **~148 business objects**, AI agent workflows, enterprise security, full UI metadata, Salesforce feature parity (~95%), 4 vertical industry solutions, Activity Feed/Chatter system, Interface Builder, and comprehensive developer tooling.

> **Protocol Version**: @objectstack/spec v3.0.8 | **Tests**: 3,799 passing (192 files) | **Spec Schema Adoption**: ~95 / ~95 (~100%) | **Last Updated**: February 21, 2027
> **Protocol Version**: @objectstack/spec v3.0.11 | **Tests**: 3,799 passing (192 files) | **Spec Schema Adoption**: ~95 / ~95 (~100%) | **Last Updated**: February 21, 2027
Copy link

Copilot AI Feb 27, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This line still states "3,799 passing (192 files)", but ROADMAP.md in this PR records 3817 tests passing for the v3.0.11 upgrade. Please reconcile the docs metrics (tests + file count) so they’re consistent across documentation.

Suggested change
> **Protocol Version**: @objectstack/spec v3.0.11 | **Tests**: 3,799 passing (192 files) | **Spec Schema Adoption**: ~95 / ~95 (~100%) | **Last Updated**: February 21, 2027
> **Protocol Version**: @objectstack/spec v3.0.11 | **Tests**: 3,817 passing (192 files) | **Spec Schema Adoption**: ~95 / ~95 (~100%) | **Last Updated**: February 21, 2027

Copilot uses AI. Check for mistakes.

---

Expand All @@ -16,7 +16,7 @@ HotCRM has completed **16 development phases** (1–14 including 10.5, 10.6, 12A
```
2025 ████████████████████████████████ Phases 1-9: Foundation → AI → Quality → Test → Integration → Schema → v3.0 → UI → DX
2026 Q1-Q4 ████████████████████████████████ Phases 10-12D: Salesforce Parity → Deep Metadata → Forms & Pages → Ecosystem → Verticals ✅ COMPLETE
2027 Q1-Q3 ████████████████████████████████ Phase 13: Module Optimization & Seed Data → Phase 14: v3.0.8 Feed & Interface Builder ✅ COMPLETE
2027 Q1-Q3 ████████████████████████████████ Phase 13: Module Optimization & Seed Data → Phase 14: v3.0.11 Feed & Interface Builder ✅ COMPLETE
2027+ ████████████████████████████████ Phase 12E: Advanced AI & Enterprise Features ✅ COMPLETE
```

Expand All @@ -43,7 +43,7 @@ HotCRM has completed **16 development phases** (1–14 including 10.5, 10.6, 12A
| **11** | Ecosystem & Connectivity | +3 packages (Analytics, Integration, Community); 10 connectors; iPaaS layer |
| **12A-D** | Vertical Solutions | +4 verticals (Real Estate, Healthcare, Financial Services, Education); 28 objects |
| **13** | Module Optimization & Seed Data | 39 seed files, 13/13 plugins registered, metadata equalization, 13 state machines |
| **14** | v3.0.8 Feed & Interface Builder | Activity feed/Chatter across 6 clouds, interface builder, dashboard headers/filters, Feed API, ~100% schema adoption |
| **14** | v3.0.11 Feed & Interface Builder | Activity feed/Chatter across 6 clouds, interface builder, dashboard headers/filters, Feed API, ~100% schema adoption |
| **12E** | Advanced AI & Enterprise | Computer vision, voice AI, anomaly detection, multi-tenancy, SOC 2, marketplace |

---
Expand All @@ -52,7 +52,7 @@ HotCRM has completed **16 development phases** (1–14 including 10.5, 10.6, 12A

| Metric | Value |
|--------|-------|
| Protocol Version | @objectstack/spec v3.0.8 |
| Protocol Version | @objectstack/spec v3.0.11 |
| Business Objects | ~148 across 13 packages |
| Business Packages | 13 (6 core + AI + Analytics + Integration + Community + 4 verticals) |
| Hook Files | 121+ across 13 packages |
Expand Down
14 changes: 7 additions & 7 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -59,13 +59,13 @@
"@changesets/cli": "^2.29.8",
"@hono/node-server": "^1.19.9",
"@object-ui/console": "^3.0.3",
"@objectstack/cli": "^3.0.9",
"@objectstack/driver-memory": "^3.0.8",
"@objectstack/objectql": "^3.0.8",
"@objectstack/plugin-hono-server": "^3.0.8",
"@objectstack/runtime": "^3.0.8",
"@objectstack/spec": "^3.0.8",
"@objectstack/studio": "^3.0.8",
"@objectstack/cli": "^3.0.11",
"@objectstack/driver-memory": "^3.0.11",
"@objectstack/objectql": "^3.0.11",
"@objectstack/plugin-hono-server": "^3.0.11",
"@objectstack/runtime": "^3.0.11",
"@objectstack/spec": "^3.0.11",
"@objectstack/studio": "^3.0.11",
"@types/node": "^25.2.3",
"@typescript-eslint/eslint-plugin": "^7.18.0",
"@typescript-eslint/parser": "^7.18.0",
Expand Down
4 changes: 2 additions & 2 deletions packages/ai/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -34,12 +34,12 @@
],
"author": "HotCRM Team",
"dependencies": {
"@objectstack/spec": "^3.0.8",
"@objectstack/spec": "^3.0.11",
"axios": "^1.13.5",
"zod": "^4.3.6"
},
"devDependencies": {
"@objectstack/cli": "^3.0.9",
"@objectstack/cli": "^3.0.11",
"typescript": "^5.9.3"
}
}
4 changes: 2 additions & 2 deletions packages/analytics/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -36,11 +36,11 @@
"author": "HotCRM Team",
"dependencies": {
"@hotcrm/ai": "workspace:*",
"@objectstack/spec": "^3.0.8",
"@objectstack/spec": "^3.0.11",
"zod": "^4.3.6"
},
"devDependencies": {
"@objectstack/cli": "^3.0.9",
"@objectstack/cli": "^3.0.11",
"typescript": "^5.9.3"
}
}
6 changes: 3 additions & 3 deletions packages/analytics/src/kpi.view.ts
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ export const KPIsAtRiskView = {
type: 'grid' as const,
name: 'kpis_at_risk',
label: 'At Risk',
filter: [['trend', '=', 'declining']],
filter: [{ field: 'trend', operator: '=', value: 'declining' }],
columns: [
{ field: 'name', width: 200, link: true },
{ field: 'current_value', width: 120, align: 'right' as const },
Expand All @@ -60,7 +60,7 @@ export const KPIsOnTrackView = {
type: 'grid' as const,
name: 'kpis_on_track',
label: 'On Track',
filter: [['trend', '=', 'improving']],
filter: [{ field: 'trend', operator: '=', value: 'improving' }],
columns: [
{ field: 'name', width: 200, link: true },
{ field: 'metric_type', width: 120 },
Expand All @@ -79,7 +79,7 @@ export const MyKPIsView = {
type: 'grid' as const,
name: 'my_kpis',
label: 'My KPIs',
filter: [['owner_id', '=', '${currentUser.id}']],
filter: [{ field: 'owner_id', operator: '=', value: '${currentUser.id}' }],
columns: [
{ field: 'name', width: 200, link: true },
{ field: 'metric_type', width: 120 },
Expand Down
6 changes: 3 additions & 3 deletions packages/analytics/src/report.view.ts
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ export const MyReportsView = {
type: 'grid' as const,
name: 'my_reports',
label: 'My Reports',
filter: [['owner_id', '=', '${currentUser.id}']],
filter: [{ field: 'owner_id', operator: '=', value: '${currentUser.id}' }],
columns: [
{ field: 'name', width: 250, link: true },
{ field: 'report_type', width: 120 },
Expand All @@ -51,7 +51,7 @@ export const PublicReportsView = {
type: 'grid' as const,
name: 'public_reports',
label: 'Public Reports',
filter: [['is_public', '=', true]],
filter: [{ field: 'is_public', operator: '=', value: true }],
columns: [
{ field: 'name', width: 250, link: true },
{ field: 'report_type', width: 120 },
Expand All @@ -69,7 +69,7 @@ export const RecentReportsView = {
type: 'grid' as const,
name: 'recent_reports',
label: 'Recently Run',
filter: [['last_run_at', '>=', 'LAST_30_DAYS']],
filter: [{ field: 'last_run_at', operator: '>=', value: 'LAST_30_DAYS' }],
columns: [
{ field: 'name', width: 250, link: true },
{ field: 'report_type', width: 120 },
Expand Down
4 changes: 2 additions & 2 deletions packages/community/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -35,11 +35,11 @@
],
"author": "HotCRM Team",
"dependencies": {
"@objectstack/spec": "^3.0.8",
"@objectstack/spec": "^3.0.11",
"zod": "^4.3.6"
},
"devDependencies": {
"@objectstack/cli": "^3.0.9",
"@objectstack/cli": "^3.0.11",
"typescript": "^5.9.3"
}
}
6 changes: 3 additions & 3 deletions packages/community/src/idea.view.ts
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ export const PlannedIdeasView = {
type: 'grid' as const,
name: 'planned_ideas',
label: 'Planned',
filter: [['status', '=', 'planned']],
filter: [{ field: 'status', operator: '=', value: 'planned' }],
columns: [
{ field: 'title', width: 300, link: true },
{ field: 'category', width: 120 },
Expand All @@ -68,7 +68,7 @@ export const NewSubmissionsView = {
type: 'grid' as const,
name: 'new_submissions',
label: 'New Submissions',
filter: [['status', '=', 'submitted']],
filter: [{ field: 'status', operator: '=', value: 'submitted' }],
columns: [
{ field: 'title', width: 300, link: true },
{ field: 'category', width: 120 },
Expand All @@ -86,7 +86,7 @@ export const ReleasedIdeasView = {
type: 'grid' as const,
name: 'released_ideas',
label: 'Released',
filter: [['status', '=', 'released']],
filter: [{ field: 'status', operator: '=', value: 'released' }],
columns: [
{ field: 'title', width: 300, link: true },
{ field: 'category', width: 120 },
Expand Down
6 changes: 3 additions & 3 deletions packages/community/src/topic.view.ts
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ export const OpenTopicsView = {
type: 'grid' as const,
name: 'open_topics',
label: 'Open Topics',
filter: [['status', '=', 'open']],
filter: [{ field: 'status', operator: '=', value: 'open' }],
columns: [
{ field: 'title', width: 300, link: true },
{ field: 'category_id', width: 150 },
Expand All @@ -51,7 +51,7 @@ export const PinnedTopicsView = {
type: 'grid' as const,
name: 'pinned_topics',
label: 'Pinned Topics',
filter: [['is_pinned', '=', true]],
filter: [{ field: 'is_pinned', operator: '=', value: true }],
columns: [
{ field: 'title', width: 300, link: true },
{ field: 'category_id', width: 150 },
Expand All @@ -68,7 +68,7 @@ export const UnansweredTopicsView = {
type: 'grid' as const,
name: 'unanswered_topics',
label: 'Unanswered',
filter: [['reply_count', '=', 0]],
filter: [{ field: 'reply_count', operator: '=', value: 0 }],
columns: [
{ field: 'title', width: 300, link: true },
{ field: 'category_id', width: 150 },
Expand Down
2 changes: 1 addition & 1 deletion packages/core/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
"build": "tsc"
},
"dependencies": {
"@objectstack/spec": "^3.0.8",
"@objectstack/spec": "^3.0.11",
"zod": "^4.3.6"
}
}
4 changes: 2 additions & 2 deletions packages/crm/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -40,11 +40,11 @@
"author": "HotCRM Team",
"dependencies": {
"@hotcrm/ai": "workspace:*",
"@objectstack/spec": "^3.0.8",
"@objectstack/spec": "^3.0.11",
"zod": "^4.3.6"
},
"devDependencies": {
"@objectstack/cli": "^3.0.9",
"@objectstack/cli": "^3.0.11",
"typescript": "^5.9.3"
}
}
16 changes: 8 additions & 8 deletions packages/crm/src/account.view.ts
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ export const MyAccountsView = {
type: 'grid' as const,
name: 'my_accounts',
label: 'My Accounts',
filter: [['owner', '=', '${currentUser.id}']],
filter: [{ field: 'owner', operator: '=', value: '${currentUser.id}' }],
columns: [
{ field: 'name', width: 250, link: true },
{ field: 'type', width: 120 },
Expand All @@ -53,8 +53,8 @@ export const EnterpriseAccountsView = {
name: 'enterprise_accounts',
label: 'Enterprise Accounts',
filter: [
['annual_revenue', '>', 10000000],
['type', '=', 'customer']
{ field: 'annual_revenue', operator: '>', value: 10000000 },
{ field: 'type', operator: '=', value: 'customer' }
],
columns: [
{ field: 'name', width: 250, link: true },
Expand All @@ -74,7 +74,7 @@ export const RecentlyCreatedView = {
type: 'grid' as const,
name: 'recently_created_accounts',
label: 'Recently Created',
filter: [['created_date', '>=', 'LAST_30_DAYS']],
filter: [{ field: 'created_date', operator: '>=', value: 'LAST_30_DAYS' }],
columns: [
{ field: 'name', width: 250, link: true },
{ field: 'type', width: 120 },
Expand All @@ -93,8 +93,8 @@ export const HotAccountsView = {
name: 'hot_accounts',
label: 'Hot Accounts',
filter: [
['rating', '=', 'Hot'],
['type', 'IN', ['customer', 'prospect']]
{ field: 'rating', operator: '=', value: 'Hot' },
{ field: 'type', operator: 'IN', value: ['customer', 'prospect'] }
],
columns: [
{ field: 'name', width: 250, link: true },
Expand All @@ -117,8 +117,8 @@ export const NeedAttentionView = {
name: 'accounts_need_attention',
label: 'Needs Attention',
filter: [
['last_activity_date', '<', 'LAST_60_DAYS'],
['type', '=', 'customer']
{ field: 'last_activity_date', operator: '<', value: 'LAST_60_DAYS' },
{ field: 'type', operator: '=', value: 'customer' }
],
columns: [
{ field: 'name', width: 250, link: true },
Expand Down
6 changes: 3 additions & 3 deletions packages/crm/src/contact.view.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ export const MyContactsView = {
type: 'grid' as const,
name: 'my_contacts',
label: 'My Contacts',
filter: [['owner', '=', '${currentUser.id}']],
filter: [{ field: 'owner', operator: '=', value: '${currentUser.id}' }],
columns: [
{ field: 'first_name', width: 150, link: true },
{ field: 'last_name', width: 150, link: true },
Expand All @@ -49,7 +49,7 @@ export const DecisionMakersView = {
type: 'grid' as const,
name: 'decision_makers',
label: 'Decision Makers',
filter: [['is_decision_maker', '=', true]],
filter: [{ field: 'is_decision_maker', operator: '=', value: true }],
columns: [
{ field: 'first_name', width: 150, link: true },
{ field: 'last_name', width: 150, link: true },
Expand All @@ -71,7 +71,7 @@ export const RecentContactsView = {
type: 'grid' as const,
name: 'recent_contacts',
label: 'Recent Contacts',
filter: [['last_contact_date', '>=', 'LAST_30_DAYS']],
filter: [{ field: 'last_contact_date', operator: '>=', value: 'LAST_30_DAYS' }],
columns: [
{ field: 'first_name', width: 150, link: true },
{ field: 'last_name', width: 150, link: true },
Expand Down
Loading