תיעוד
התיעוד של TeamOnly
ה-CLI, ה-SDK שהאפליקציה משתמשת בו, וקובץ ה-skill שמלמד את ה-AI מה לכתוב. טכני, וקצר. סוכני קוד יכולים לקרוא את הדף הזה כ-Markdown בכתובת /docs.md.
התחלה מהירה
צריך Node.js בגרסה 20 ומעלה. עדיין אין תוכנית? בהתחברות הראשונה אפשר להתחיל תקופת ניסיון של 14 ימים בחינם בלי כרטיס אשראי, או להירשם. אפשר גם להירשם כאן. בתיקייה חדשה, או בפרויקט שכבר יש לכם:
npx teamonly initמוסיפה אפליקציית התחלה ואת ההוראות שכלי ה-AI פועל לפיהן.npx teamonly loginפעם אחת בכל מחשב. מקלידים את מייל העבודה ואת הקוד בן 6 הספרות שנשלח אליכם במייל. אם לחברה עדיין אין תוכנית, מוצעת תקופת ניסיון של 14 ימים בחינם, שמתחילה מיד, או תוכנית עם עמוד תשלום. לחיצה על Enter במקום מייל מחברת דרך הדפדפן.npx teamonly deployמעלה את האפליקציה לאוויר בכתובתhttps://<app>.<company>.teamonly.app.
כך זה נראה:
npx teamonly initAdded the TeamOnly skill, Cursor rules and SDKתבנה כלי לאישור הוצאות(ה-AI בונה את האפליקציה)npx teamonly loginSigned in as dana@acme.comnpx teamonly deployLive at https://expenses.acme.teamonly.appOnly @acme.com accounts can sign inהפריסה הראשונה יוצרת את האפליקציה, את מסד הנתונים שלה ואת אחסון הקבצים שלה. פריסות מאוחרות יותר מעדכנות את אותה אפליקציה באותה כתובת.
פקודות CLI
npx teamonly login- התחברות ל-TeamOnly מהמחשב הזה, פעם אחת בכל מחשב. מקלידים את מייל העבודה ואת הקוד בן 6 הספרות שנשלח אליכם, או לוחצים Enter כדי להתחבר דרך הדפדפן.
--emailו---codeעושים את אותו הדבר בלי שאלות, לכלי AI ולסקריפטים. npx teamonly trial --company "Acme"- מתחילים את תקופת הניסיון של 14 ימים בחינם לחברה, בלי כרטיס אשראי. משתמשים בזה אחרי
loginכשלחברה עדיין אין תוכנית. תקופת ניסיון אחת לכל דומיין מייל של חברה. npx teamonly subscribe --plan builder- נרשמים, או מפעילים מחדש את האפליקציות אחרי תקופת הניסיון. בוחרים
builder,teamאוbusiness. נפתח עמוד תשלום, ואחרי התשלום אתם מחוברים כאן. npx teamonly init- הגדרת התיקייה הזו: אפליקציית התחלה, או ההוראות של TeamOnly לכלי ה-AI (skill ל-Claude Code, rules ל-Cursor, AGENTS.md) וה-SDK בפרויקט קיים.
npx teamonly deploy- בונה את האפליקציה ומעלה אותה לאוויר. יוצרת את מסד הנתונים ואת אחסון הקבצים בפריסה הראשונה. מדפיסה את הכתובת של האפליקציה.
npx teamonly access- מציגה מי יכול לפתוח את האפליקציה. מוסיפים
only,addאוremoveעם כתובות מייל כדי להשתמש ברשימה, אוeveryoneלכל החברה. npx teamonly roles- נותנת לאנשים תפקידים בתוך האפליקציה, כמו מאשר או כספים.
roles add approver dana@acme.comנותן תפקיד,roles removeלוקח אותו, ו-rolesלבד מציג למי יש איזה תפקיד. כתובות של החברה בלבד. npx teamonly secrets set NAME- שומרת סוד לאפליקציה הזו. הערך מתבקש בהנחיה, כך שהוא אף פעם לא נשמר בהיסטוריה של ה-shell.
npx teamonly logs- צפייה בבקשות, בפלט של
console.logובשגיאות של האפליקציה החיה, ברגע שהם קורים. Ctrl+C כדי לעצור. npx teamonly whoami- מציגה בתור מי אתם מחוברים, את המסלול ואת האפליקציות שלכם.
npx teamonly delete- מוחקת את האפליקציה החיה עם מסד הנתונים והקבצים שלה. היא מבקשת להקליד קודם את שם האפליקציה.
npx teamonly logout- התנתקות מ-TeamOnly במחשב הזה.
SDK
ה-API שלכם הוא אפליקציית Hono. ה-middleware של ה-SDK נותן לכל בקשה context בכתובת c.var.ctx:
ctx.user- האדם המחובר:
email,name,isOwnerלמי שפרס את האפליקציה לראשונה, ו-roles, התפקידים של האדם באפליקציה הזו. מאומת על ידי TeamOnly לפני שהקוד שלכם רץ. אף פעם לא לקרוא זהות מכותרות בעצמכם. ctx.db- מסד נתונים SQL של האפליקציה הזו בלבד (SQLite, על Cloudflare D1). נוצר בפריסה הראשונה.
ctx.files- אחסון הקבצים של האפליקציה הזו:
put,get,list,delete. ctx.secrets- ערכים שהוגדרו עם
npx teamonly secrets set. קוראים אותם עםctx.secrets.get(name). ctx.email- שולח מיילים לעמיתים:
send({ to, subject, text, html?, replyTo? }). ראו מיילים. ctx.schedule- השם של המשימה כש-TeamOnly מריץ משימה מתוזמנת, אחרת
undefined. ראו משימות מתוזמנות.
בדפדפן, useUser() מ-teamonly/react מחזיר { email, name, roles }.
import { Hono } from 'hono'
import { teamonly, type TeamOnly } from 'teamonly/server'
const app = new Hono<TeamOnly>()
app.use('*', teamonly())
// Who is signed in. Verified before your code runs.
app.get('/api/me', (c) => {
return c.json(c.var.ctx.user) // { email: 'dana@acme.com', name: 'Dana Okafor', isOwner: false, roles: ['approver'] }
})
// Save to this app's own database.
app.post('/api/expenses', async (c) => {
const { db, user } = c.var.ctx
const { amount, reason } = await c.req.json()
await db
.prepare('INSERT INTO expenses (amount, reason, submitted_by) VALUES (?, ?, ?)')
.bind(amount, reason, user.email)
.run()
return c.json({ ok: true })
})
// Store an uploaded receipt in this app's file storage.
app.put('/api/receipts/:id', async (c) => {
await c.var.ctx.files.put(`receipts/${c.req.param('id')}`, c.req.raw.body)
return c.json({ ok: true })
})
// Read a secret set with: npx teamonly secrets set QUICKBOOKS_KEY
app.get('/api/sync', async (c) => {
const key = c.var.ctx.secrets.get('QUICKBOOKS_KEY')
// ...
})
export default appמיילים
אפליקציה יכולה לשלוח מייל לאנשים בחברה עם ctx.email.send(), למשל כדי להודיע למאשר שהוצאה ממתינה לו.
// Tell the approver an expense is waiting.
await c.var.ctx.email.send({
to: 'priya@acme.com', // one address or a list, up to 50
subject: 'An expense is waiting for you',
text: 'Dana sent a $42 expense. Review it: https://expenses.acme.teamonly.app',
})- רק לכתובות בדומיינים של המייל של החברה, אותם אנשים שיכולים להתחבר. כל כתובת אחרת נדחית ושום דבר לא נשלח.
- נשלח מ-
notify@teamonly.appבשם האפליקציה בחברה, למשל “Expenses at Acme”. תשובות מגיעות לבעלים של האפליקציה, אלא אם מגדיריםreplyTo(גם היא כתובת של החברה). - בכל מייל יש שורה שאומרת איזו אפליקציה שלחה אותו.
- מגבלות לכל אפליקציה: 100 נמענים בשעה ו-500 ביום, ועד 50 נמענים במייל אחד.
- עמוד האפליקציה בלוח הבקרה מראה כמה מיילים היא שלחה ב-30 הימים האחרונים.
- מקומית, עם
npm run dev, המיילים מודפסים בטרמינל ולא נשלחים. - מיילים לאנשים מחוץ לחברה לא נתמכים.
משימות מתוזמנות
לסיכומים יומיים, תזכורות ודוחות סוף חודש, רושמים את המשימות ב-teamonly.json. TeamOnly קורא לכל נתיב בזמנים האלה.
{
"name": "expenses",
"timezone": "America/New_York",
"schedules": [
{ "name": "daily-digest", "cron": "0 9 * * 1-5", "path": "/api/cron/daily-digest" }
]
}import { scheduled } from 'teamonly/server'
// Runs at 9am New York time, Monday to Friday.
app.post('/api/cron/daily-digest', scheduled(async (c) => {
const { db, email } = c.var.ctx
// ...find what is waiting, then email each approver
return c.json({ ok: true })
}))- ל-
cronיש חמישה שדות: דקה, שעה, יום בחודש, חודש, יום בשבוע. משימות רצות בכל 5 דקות עגולות, ולכן הדקות חייבות להיות כפולות של 5. timezoneהוא אופציונלי, וברירת המחדל היא UTC.- עוטפים את הנתיב ב-
scheduled(...)מ-teamonly/server. מי שפותח את הכתובת מקבל 404. - עמוד האפליקציה בלוח הבקרה מראה את ההרצה האחרונה של כל משימה ואם היא הצליחה.
- המשימות מושהות כשתקופת ניסיון חינם הסתיימה.
תפקידים
תפקידים כמו מאשר, כספים או אדמין נשמרים ב-TeamOnly, לא בקוד. הבעלים של האפליקציה או מנהל מערכת נותנים אותם בעמוד האפליקציה בלוח הבקרה, או עם npx teamonly roles. כתובות של החברה בלבד.
npx teamonly roles add approver dana@acme.comGave dana@acme.com the role approverapprover: dana@acme.com// Only approvers can approve.
app.post('/api/expenses/:id/approve', async (c) => {
const { user } = c.var.ctx
if (!user.roles.includes('approver')) return c.json({ error: 'Approvers only' }, 403)
// ...
})האפליקציה קוראת אותם בתור ctx.user.roles ומחליטה מה כל תפקיד יכול לעשות. עדיין אין קוד התחברות לכתוב.
קובץ ה-skill
init מוסיפה קובץ skill ל-Claude Code ואת אותו תוכן כקובץ rules ל-Cursor. כלי ה-AI קורא אותו לפני שהוא כותב קוד. הוא מלמד:
- את מבנה האפליקציה היחיד הנתמך (למטה), ולהישאר בתוכו.
- להשתמש ב-
ctx.userלזהות ואף פעם לא לכתוב מסכי התחברות, הרשמה או סיסמה משלו. - להשתמש ב-
ctx.dbוב-ctx.filesבמקום להוסיף שירות מסד נתונים, Express, Supabase או Firebase. - לשמור מפתחות API ב-
ctx.secrets, אף פעם לא בקוד. - לשלוח מיילים עם
ctx.email, להריץ עבודה לפי זמנים כמשימות מתוזמנות, ולבדוק אתctx.user.rolesבשרת. - איך להריץ
deployולתקן את מה שהיא מדווחת.
כל העניין הוא שהפריסה הראשונה תעבוד. אם ה-AI ממשיך לפנות למשהו שאנחנו לא מריצים, ספרו לנו; זה באג בקובץ ה-skill.
שרת MCP
החבילה teamonly מריצה גם שרת MCP, לכלי AI שמעדיפים כלים על פני פקודות טרמינל, כמו Claude Desktop או ה-agent של Cursor בלי טרמינל. הוא רץ במחשב שלכם, כי הפריסה קוראת את הקבצים של הפרויקט. מוסיפים אותו ל-Claude Code עם:
claude mcp add teamonly -- npx -y teamonly mcp- Cursor, Claude Desktop ו-Windsurf: מוסיפים
{ "mcpServers": { "teamonly": { "command": "npx", "args": ["-y", "teamonly", "mcp"] } } }להגדרות ה-MCP שלהם. - VS Code: ב-
.vscode/mcp.jsonהמפתח הואservers, עם"type": "stdio". - 12 הכלים שלו:
get_app_rules,init,deploy,status,logs,access,roles,set_secret,sign_in,start_trial,subscribe,delete_app. - רשום ב-MCP Registry הרשמי בשם
dev.teamonly/teamonly.
קובץ ה-skill וה-rules נשארים הדרך העיקרית שבה ה-AI לומד את ה-stack, וה-CLI עובד בדיוק כמו קודם. הגדרה לכל כלי, עם כפתור בלחיצה אחת ל-Cursor: שרת ה-MCP של TeamOnly.
מבנה האפליקציה הנתמך
- ממשק: React, בנוי עם Vite, מוגש כקבצים סטטיים.
- API: אפליקציית Hono ב-TypeScript או ב-JavaScript, תחת
/api, באותה כתובת. - סביבת ריצה: Cloudflare Workers. ממשקי web API סטנדרטיים; רוב המודולים המובנים של Node דרך שכבת תאימות, אבל בלי מודולים native ובלי תהליכים שרצים לאורך זמן.
- לא נתמך: Python, Ruby, PHP, קונטיינרים של Docker, WebSockets ועדכונים בזמן אמת, תהליכי רקע, מיילים לאנשים מחוץ לחברה, חיבור לשרתים ברשת הפרטית של החברה, דומיינים מותאמים, אפליקציות ציבוריות.
מגבלות
המגבלות היום:
- Builder: בונה אחד, 3 אפליקציות. Team: בונים ואפליקציות ללא הגבלה.
- מסד הנתונים ואחסון הקבצים של כל אפליקציה כפופים למגבלות של Cloudflare D1 ו-R2.
- בקשות רצות תחת המגבלות של Cloudflare Workers על זמן CPU וזיכרון.
עוד על איך הכול מתחבר: איך זה עובד ואבטחה.
גישה מוקדמת
הכלי הראשון שלכם באוויר עוד השבוע.
TeamOnly בגישה מוקדמת, וכל המסלולים פתוחים עכשיו. אפשר לנסות 14 ימים בחינם בלי כרטיס אשראי, או להירשם. בכל מקרה, החברה שלכם מוכנה מיד, ושלוש פקודות מעלות את האפליקציה הראשונה לאוויר.
בלי כרטיס אשראי לתקופת הניסיון. אחר כך החל מ-$19 לחודש, ביטול בכל עת.
עוד לא מוכנים? עדכונים במייל
שאלות שולחים אל hello@teamonly.dev, ובן אדם עונה.