@hamzaashergill/mateos 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 MateOS contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,158 @@
1
+ # MateOS
2
+
3
+ MateOS is an open-source assistant operations platform for teams that manage bookings, appointments, reception workflows, and customer communication.
4
+
5
+ It currently ships with starter patterns for:
6
+
7
+ - Restaurants and food
8
+ - Dental and doctors
9
+ - Coaches and consultants
10
+
11
+ MateOS includes:
12
+
13
+ - A React admin dashboard for operators
14
+ - An Express API server
15
+ - PostgreSQL persistence with Drizzle ORM
16
+ - AI-assisted scheduling, conversation relay, and workflow tools
17
+ - Optional Microsoft, Twilio, ElevenLabs, Hume, and Telegram integrations
18
+
19
+ ## Short Install Command
20
+
21
+ Once the CLI is published to npm, the short install command is:
22
+
23
+ ```bash
24
+ npx mateos
25
+ ```
26
+
27
+ Or install into a custom directory:
28
+
29
+ ```bash
30
+ npx mateos my-mateos
31
+ ```
32
+
33
+ ## GitHub Install
34
+
35
+ Today, the GitHub bootstrap command is:
36
+
37
+ ```bash
38
+ bash <(curl -fsSL https://raw.githubusercontent.com/logicbaseio/MateOS/main/install.sh)
39
+ ```
40
+
41
+ Both install paths do the same bootstrap work:
42
+
43
+ - clones the MateOS repo locally
44
+ - creates `.env` from `.env.example`
45
+ - installs workspace dependencies with `pnpm`
46
+ - starts PostgreSQL with Docker Compose
47
+ - applies the database schema
48
+ - shows the MateOS terminal logo and next steps
49
+
50
+ After install, MateOS also ships with a local CLI:
51
+
52
+ ```bash
53
+ cd MateOS
54
+ node ./bin/mateos.mjs doctor
55
+ node ./bin/mateos.mjs dev
56
+ ```
57
+
58
+ ## Workspace Layout
59
+
60
+ ```text
61
+ MateOS/
62
+ ├── artifacts/api-server # Express API
63
+ ├── artifacts/bot-manager # React dashboard
64
+ ├── lib/db # Database schema and Drizzle config
65
+ ├── lib/api-spec # OpenAPI contract
66
+ ├── lib/api-client-react # Generated frontend client
67
+ ├── lib/api-zod # Generated API schemas
68
+ ├── docs # Open-source documentation
69
+ └── starter-configs # Vertical starter templates
70
+ ```
71
+
72
+ ## Quick Start
73
+
74
+ ### 1. Install dependencies
75
+
76
+ ```bash
77
+ pnpm install
78
+ ```
79
+
80
+ ### 2. Start PostgreSQL
81
+
82
+ ```bash
83
+ docker compose up -d
84
+ ```
85
+
86
+ ### 3. Create your local env file
87
+
88
+ ```bash
89
+ cp .env.example .env
90
+ ```
91
+
92
+ ### 4. Push the schema
93
+
94
+ ```bash
95
+ pnpm db:push
96
+ ```
97
+
98
+ ### 5. Start the API
99
+
100
+ ```bash
101
+ pnpm dev:api
102
+ ```
103
+
104
+ ### 6. Start the dashboard
105
+
106
+ ```bash
107
+ pnpm dev:web
108
+ ```
109
+
110
+ Open [http://localhost:5173](http://localhost:5173).
111
+
112
+ ### 7. Or start both with the MateOS CLI
113
+
114
+ ```bash
115
+ node ./bin/mateos.mjs dev
116
+ ```
117
+
118
+ ## Authentication Modes
119
+
120
+ MateOS now supports an installable default path:
121
+
122
+ - `MATEOS_AUTH_MODE=local`
123
+ Default. Local single-admin mode for self-hosting and development.
124
+ - `MATEOS_AUTH_MODE=oidc`
125
+ Optional generic OIDC mode for teams that want hosted sign-in.
126
+
127
+ When using OIDC, set:
128
+
129
+ - `OIDC_CLIENT_ID`
130
+ - `OIDC_ISSUER_URL`
131
+ - optional provider-specific secrets as needed
132
+
133
+ ## Vertical Starter Configs
134
+
135
+ Starter templates live in [`starter-configs/`](./starter-configs).
136
+
137
+ - [restaurant-food.json](./starter-configs/restaurant-food.json)
138
+ - [dental-doctors.json](./starter-configs/dental-doctors.json)
139
+ - [coaches-consultants.json](./starter-configs/coaches-consultants.json)
140
+
141
+ Use them as starting points for:
142
+
143
+ - default assistant naming
144
+ - scheduling windows
145
+ - intake rules
146
+ - customer notes
147
+ - workflow tone
148
+
149
+ ## Repository Notes
150
+
151
+ - The scheduling/reception stack is the primary MateOS surface.
152
+ - The alerts/routing module is still present and can be reused as a general operations inbox.
153
+ - Some internal concepts still use `boss` naming in code and database fields. That is behavioral debt, not a blocker for open-source release.
154
+
155
+ ## Docs
156
+
157
+ - [Open Source Audit](./docs/open-source-audit.md)
158
+ - [Architecture](./docs/architecture.md)
package/bin/mateos ADDED
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ import "./mateos.mjs";
package/bin/mateos.mjs ADDED
@@ -0,0 +1,273 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { copyFileSync, existsSync, readFileSync } from "node:fs";
4
+ import { spawn } from "node:child_process";
5
+ import { dirname, resolve, join } from "node:path";
6
+ import { fileURLToPath } from "node:url";
7
+
8
+ const PACKAGE_ROOT = resolve(dirname(fileURLToPath(import.meta.url)), "..");
9
+ const DEFAULT_REPO_URL = "https://github.com/logicbaseio/MateOS.git";
10
+ const GREEN = "\x1b[38;5;46m";
11
+ const CYAN = "\x1b[38;5;51m";
12
+ const DIM = "\x1b[2m";
13
+ const RESET = "\x1b[0m";
14
+
15
+ const LOGO = [
16
+ "## ## #### ##### ###### #### ####",
17
+ "### ### ## ## ## ## ## ## ##",
18
+ "## # ## ###### ## #### ## ## ####",
19
+ "## ## ## ## ## ## ## ## ##",
20
+ "## ## ## ## ## ###### #### ####",
21
+ ];
22
+
23
+ function printLogo() {
24
+ process.stdout.write(`\n${GREEN}${LOGO.join("\n")}${RESET}\n`);
25
+ process.stdout.write(`${CYAN}MateOS${RESET} ${DIM}assistant operations platform${RESET}\n\n`);
26
+ }
27
+
28
+ function printUsage() {
29
+ printLogo();
30
+ console.log("Usage: mateos [directory]");
31
+ console.log(" or: mateos <command>");
32
+ console.log("");
33
+ console.log("Commands:");
34
+ console.log(" create Clone and bootstrap MateOS locally");
35
+ console.log(" logo Show the MateOS terminal logo");
36
+ console.log(" init Create .env from .env.example if needed");
37
+ console.log(" doctor Check local prerequisites");
38
+ console.log(" dev Start API and dashboard together");
39
+ }
40
+
41
+ function runCommand(command, args, options = {}) {
42
+ return new Promise((resolvePromise, rejectPromise) => {
43
+ const child = spawn(command, args, {
44
+ cwd: options.cwd ?? process.cwd(),
45
+ stdio: "inherit",
46
+ shell: false,
47
+ ...options,
48
+ });
49
+
50
+ child.on("error", rejectPromise);
51
+ child.on("exit", (code, signal) => {
52
+ if (signal) {
53
+ rejectPromise(new Error(`${command} exited via signal ${signal}`));
54
+ return;
55
+ }
56
+ resolvePromise(code ?? 0);
57
+ });
58
+ });
59
+ }
60
+
61
+ function findProjectRoot(startDir) {
62
+ let current = resolve(startDir);
63
+ while (true) {
64
+ const pkgPath = join(current, "package.json");
65
+ const workspacePath = join(current, "pnpm-workspace.yaml");
66
+ const apiPath = join(current, "artifacts", "api-server");
67
+ if (existsSync(pkgPath) && existsSync(workspacePath) && existsSync(apiPath)) {
68
+ try {
69
+ const pkg = JSON.parse(readFileSync(pkgPath, "utf8"));
70
+ if (pkg?.name === "mateos") return current;
71
+ } catch {
72
+ return current;
73
+ }
74
+ }
75
+ const parent = dirname(current);
76
+ if (parent === current) return null;
77
+ current = parent;
78
+ }
79
+ }
80
+
81
+ function requireProjectRoot() {
82
+ const projectRoot = findProjectRoot(process.cwd());
83
+ if (!projectRoot) {
84
+ console.error("This command must be run inside a MateOS checkout.");
85
+ console.error("Use `npx mateos` first to create one.");
86
+ process.exit(1);
87
+ }
88
+ return projectRoot;
89
+ }
90
+
91
+ async function ensurePnpm() {
92
+ try {
93
+ await runCommand("pnpm", ["--version"], { stdio: "pipe" });
94
+ return;
95
+ } catch {
96
+ try {
97
+ await runCommand("corepack", ["enable"]);
98
+ await runCommand("corepack", ["prepare", "pnpm@latest", "--activate"]);
99
+ } catch {
100
+ console.error("pnpm is required. Install pnpm or enable it through corepack.");
101
+ process.exit(1);
102
+ }
103
+ }
104
+ }
105
+
106
+ async function commandCreate(targetDir = "MateOS") {
107
+ printLogo();
108
+ const repoUrl = process.env.MATEOS_REPO_URL ?? DEFAULT_REPO_URL;
109
+
110
+ if (existsSync(resolve(process.cwd(), targetDir))) {
111
+ console.error(`Target already exists: ${targetDir}`);
112
+ process.exit(1);
113
+ }
114
+
115
+ for (const [command, args] of [["git", ["--version"]], ["node", ["--version"]], ["docker", ["--version"]]]) {
116
+ try {
117
+ await runCommand(command, args, { stdio: "pipe" });
118
+ } catch {
119
+ console.error(`Missing required command: ${command}`);
120
+ process.exit(1);
121
+ }
122
+ }
123
+
124
+ await ensurePnpm();
125
+
126
+ console.log(`Cloning MateOS into ${targetDir}`);
127
+ await runCommand("git", ["clone", repoUrl, targetDir]);
128
+
129
+ const projectRoot = resolve(process.cwd(), targetDir);
130
+ const envPath = resolve(projectRoot, ".env");
131
+ const envExamplePath = resolve(projectRoot, ".env.example");
132
+ if (!existsSync(envPath) && existsSync(envExamplePath)) {
133
+ copyFileSync(envExamplePath, envPath);
134
+ console.log("Created .env from .env.example");
135
+ }
136
+
137
+ console.log("Installing workspace dependencies");
138
+ await runCommand("pnpm", ["install"], { cwd: projectRoot });
139
+
140
+ console.log("Starting PostgreSQL with Docker Compose");
141
+ await runCommand("docker", ["compose", "up", "-d"], { cwd: projectRoot });
142
+
143
+ console.log("Applying database schema");
144
+ await runCommand("pnpm", ["db:push"], { cwd: projectRoot });
145
+
146
+ console.log("");
147
+ console.log("MateOS is installed.");
148
+ console.log(`Next steps:`);
149
+ console.log(` cd ${targetDir}`);
150
+ console.log(" node ./bin/mateos.mjs doctor");
151
+ console.log(" node ./bin/mateos.mjs dev");
152
+ }
153
+
154
+ async function commandInit() {
155
+ printLogo();
156
+ const root = requireProjectRoot();
157
+ const envPath = resolve(root, ".env");
158
+ const envExamplePath = resolve(root, ".env.example");
159
+
160
+ if (existsSync(envPath)) {
161
+ console.log(".env already exists. Nothing changed.");
162
+ return;
163
+ }
164
+
165
+ copyFileSync(envExamplePath, envPath);
166
+ console.log("Created .env from .env.example");
167
+ }
168
+
169
+ async function commandDoctor() {
170
+ printLogo();
171
+ const root = requireProjectRoot();
172
+
173
+ const checks = [
174
+ ["node", ["--version"]],
175
+ ["pnpm", ["--version"]],
176
+ ["docker", ["--version"]],
177
+ ];
178
+
179
+ let failed = false;
180
+
181
+ for (const [command, args] of checks) {
182
+ try {
183
+ const code = await runCommand(command, args, { cwd: root, stdio: "pipe" });
184
+ if (code === 0) {
185
+ console.log(`${command}: ok`);
186
+ } else {
187
+ failed = true;
188
+ console.log(`${command}: failed`);
189
+ }
190
+ } catch {
191
+ failed = true;
192
+ console.log(`${command}: missing`);
193
+ }
194
+ }
195
+
196
+ console.log("");
197
+ if (failed) {
198
+ console.log("Install the missing prerequisites, then rerun `mateos doctor`.");
199
+ process.exitCode = 1;
200
+ return;
201
+ }
202
+
203
+ console.log("Local prerequisites look good.");
204
+ }
205
+
206
+ async function commandDev() {
207
+ printLogo();
208
+ const root = requireProjectRoot();
209
+ if (!existsSync(resolve(root, ".env"))) {
210
+ copyFileSync(resolve(root, ".env.example"), resolve(root, ".env"));
211
+ console.log("Created .env from .env.example");
212
+ }
213
+
214
+ const api = spawn("pnpm", ["dev:api"], {
215
+ cwd: root,
216
+ stdio: "inherit",
217
+ shell: false,
218
+ });
219
+
220
+ const web = spawn("pnpm", ["dev:web"], {
221
+ cwd: root,
222
+ stdio: "inherit",
223
+ shell: false,
224
+ });
225
+
226
+ const shutdown = (code = 0) => {
227
+ api.kill("SIGTERM");
228
+ web.kill("SIGTERM");
229
+ process.exit(code);
230
+ };
231
+
232
+ process.on("SIGINT", () => shutdown(0));
233
+ process.on("SIGTERM", () => shutdown(0));
234
+
235
+ api.on("exit", (code) => {
236
+ if (code && code !== 0) shutdown(code);
237
+ });
238
+
239
+ web.on("exit", (code) => {
240
+ if (code && code !== 0) shutdown(code);
241
+ });
242
+ }
243
+
244
+ const firstArg = process.argv[2];
245
+ const knownCommands = new Set(["create", "logo", "init", "doctor", "dev", "help", "--help", "-h"]);
246
+ const command = knownCommands.has(firstArg ?? "") ? firstArg : "create";
247
+ const createTarget = command === "create" && firstArg && !knownCommands.has(firstArg) ? firstArg : process.argv[3];
248
+
249
+ switch (command) {
250
+ case "create":
251
+ await commandCreate(createTarget || "MateOS");
252
+ break;
253
+ case "logo":
254
+ printLogo();
255
+ break;
256
+ case "init":
257
+ await commandInit();
258
+ break;
259
+ case "doctor":
260
+ await commandDoctor();
261
+ break;
262
+ case "dev":
263
+ await commandDev();
264
+ break;
265
+ case "help":
266
+ case "--help":
267
+ case "-h":
268
+ printUsage();
269
+ break;
270
+ default:
271
+ printUsage();
272
+ process.exitCode = command === "usage" ? 0 : 1;
273
+ }
package/package.json ADDED
@@ -0,0 +1,46 @@
1
+ {
2
+ "name": "@hamzaashergill/mateos",
3
+ "version": "0.1.0",
4
+ "license": "MIT",
5
+ "type": "module",
6
+ "description": "MateOS bootstrap CLI and open-source assistant operations platform",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "git+https://github.com/logicbaseio/MateOS.git"
10
+ },
11
+ "homepage": "https://github.com/logicbaseio/MateOS",
12
+ "bugs": {
13
+ "url": "https://github.com/logicbaseio/MateOS/issues"
14
+ },
15
+ "keywords": [
16
+ "mateos",
17
+ "assistant",
18
+ "appointments",
19
+ "bookings",
20
+ "reception",
21
+ "scheduling"
22
+ ],
23
+ "bin": "bin/mateos",
24
+ "files": [
25
+ "bin",
26
+ "README.md",
27
+ "LICENSE"
28
+ ],
29
+ "publishConfig": {
30
+ "access": "public"
31
+ },
32
+ "scripts": {
33
+ "mateos": "node ./bin/mateos.mjs",
34
+ "dev:api": "pnpm --filter @workspace/api-server dev",
35
+ "dev:web": "pnpm --filter @workspace/bot-manager dev",
36
+ "db:push": "pnpm --filter @workspace/db push",
37
+ "codegen": "pnpm --filter @workspace/api-spec run codegen",
38
+ "build": "pnpm run typecheck && pnpm -r --if-present run build",
39
+ "typecheck:libs": "tsc --build",
40
+ "typecheck": "pnpm run typecheck:libs && pnpm -r --filter \"./artifacts/**\" --filter \"./scripts\" --if-present run typecheck"
41
+ },
42
+ "devDependencies": {
43
+ "prettier": "^3.8.1",
44
+ "typescript": "~5.9.2"
45
+ }
46
+ }