תיעוד

התיעוד של TeamOnly

ה-CLI, ה-SDK שהאפליקציה משתמשת בו, וקובץ ה-skill שמלמד את ה-AI מה לכתוב. טכני, וקצר. סוכני קוד יכולים לקרוא את הדף הזה כ-Markdown בכתובת /docs.md.

התחלה מהירה

צריך Node.js בגרסה 20 ומעלה. עדיין אין תוכנית? בהתחברות הראשונה אפשר להתחיל תקופת ניסיון של 14 ימים בחינם בלי כרטיס אשראי, או להירשם. אפשר גם להירשם כאן. בתיקייה חדשה, או בפרויקט שכבר יש לכם:

  1. npx teamonly init מוסיפה אפליקציית התחלה ואת ההוראות שכלי ה-AI פועל לפיהן.
  2. npx teamonly login פעם אחת בכל מחשב. מקלידים את מייל העבודה ואת הקוד בן 6 הספרות שנשלח אליכם במייל. אם לחברה עדיין אין תוכנית, מוצעת תקופת ניסיון של 14 ימים בחינם, שמתחילה מיד, או תוכנית עם עמוד תשלום. לחיצה על Enter במקום מייל מחברת דרך הדפדפן.
  3. npx teamonly deploy מעלה את האפליקציה לאוויר בכתובת https://<app>.<company>.teamonly.app.

כך זה נראה:

Terminal~/expenses
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 }.

api/index.tsדוגמה
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(), למשל כדי להודיע למאשר שהוצאה ממתינה לו.

api/index.tsדוגמה
// 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 קורא לכל נתיב בזמנים האלה.

teamonly.jsonדוגמה
{
  "name": "expenses",
  "timezone": "America/New_York",
  "schedules": [
    { "name": "daily-digest", "cron": "0 9 * * 1-5", "path": "/api/cron/daily-digest" }
  ]
}
api/index.tsדוגמה
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. כתובות של החברה בלבד.

Terminal~/expenses
npx teamonly roles add approver dana@acme.comGave dana@acme.com the role approverapprover: dana@acme.com
api/index.tsדוגמה
// 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 עם:

Terminal~/expenses
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 ימים בחינם בלי כרטיס אשראי, או להירשם. בכל מקרה, החברה שלכם מוכנה מיד, ושלוש פקודות מעלות את האפליקציה הראשונה לאוויר.

לנסות 14 ימים בחינםאו להירשם עכשיו

בלי כרטיס אשראי לתקופת הניסיון. אחר כך החל מ-$19 לחודש, ביטול בכל עת.

עוד לא מוכנים? עדכונים במייל

כדאי להשתמש במייל העבודה. אנחנו כותבים לעתים רחוקות, ורק כשיש חדשות ששווה לשלוח.

שאלות שולחים אל hello@teamonly.dev, ובן אדם עונה.