replit-core-workflow-b
Manage Replit Teams, member permissions, deployment promotion, and bulk Repl admin. Use when managing team access, configuring deployment environments, auditing Repls, or administering organization settings. Trigger with phrases like "replit team management", "replit admin", "replit permissions", "replit bulk operations", "manage replit members".
What this skill does
# Replit Core Workflow B — Teams & Admin
## Overview
Secondary workflow for Replit: team member management, role assignment, deployment promotion (dev to production), custom domain setup, and organizational audit. Complements the app-building workflow in `replit-core-workflow-a`.
## Prerequisites
- Replit Teams or Enterprise plan
- Organization Owner or Admin role
- Team API token stored in `REPLIT_TOKEN`
## Instructions
### Step 1: Team Member Management
```typescript
// src/admin/team-manager.ts
interface TeamMember {
username: string;
email: string;
role: 'owner' | 'admin' | 'member';
lastActive: string;
}
async function listMembers(teamId: string): Promise<TeamMember[]> {
const res = await fetch(`https://replit.com/api/v1/teams/${teamId}/members`, {
headers: { Authorization: `Bearer ${process.env.REPLIT_TOKEN}` },
});
return res.json();
}
async function inviteMember(teamId: string, email: string, role: string) {
return fetch(`https://replit.com/api/v1/teams/${teamId}/members`, {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.REPLIT_TOKEN}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({ email, role }),
});
}
async function removeMember(teamId: string, username: string) {
return fetch(`https://replit.com/api/v1/teams/${teamId}/members/${username}`, {
method: 'DELETE',
headers: { Authorization: `Bearer ${process.env.REPLIT_TOKEN}` },
});
}
```
### Step 2: Seat Audit
```typescript
// Identify inactive members for seat optimization
async function auditSeats(teamId: string) {
const members = await listMembers(teamId);
const thirtyDaysAgo = new Date(Date.now() - 30 * 24 * 60 * 60 * 1000);
const audit = {
total: members.length,
active: members.filter(m => new Date(m.lastActive) > thirtyDaysAgo),
inactive: members.filter(m => new Date(m.lastActive) <= thirtyDaysAgo),
costPerSeat: 25, // USD/month for Teams
};
console.log(`Active: ${audit.active.length}, Inactive: ${audit.inactive.length}`);
console.log(`Potential savings: $${audit.inactive.length * audit.costPerSeat}/month`);
return audit;
}
```
### Step 3: Deployment Promotion
```typescript
// Promote from development to production deployment
async function promoteDeployment(replId: string) {
// Step 1: Verify dev deployment is healthy
const devHealth = await fetch(`https://${replId}.replit.dev/health`);
if (!devHealth.ok) {
throw new Error('Development deployment not healthy. Fix before promoting.');
}
// Step 2: Trigger production deployment
const res = await fetch(`https://replit.com/api/v1/repls/${replId}/deploy`, {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.REPLIT_TOKEN}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
type: 'autoscale', // or 'reserved-vm'
}),
});
const deployment = await res.json();
console.log(`Production URL: ${deployment.url}`);
// Step 3: Verify production health
await new Promise(r => setTimeout(r, 10000)); // Wait for deploy
const prodHealth = await fetch(`${deployment.url}/health`);
if (!prodHealth.ok) {
console.error('Production health check failed. Consider rollback.');
}
return deployment;
}
```
### Step 4: Custom Domain Configuration
```markdown
1. Go to Deployment Settings > Custom Domain
2. Enter your domain: app.example.com
3. Add DNS records at your registrar:
- CNAME: app -> your-repl-slug.replit.app
4. Wait for SSL certificate auto-provisioning (1-5 minutes)
5. Verify: curl -I https://app.example.com
For domains purchased through Replit:
- MX records supported for custom email services
- DNS managed in Replit dashboard
```
### Step 5: Bulk Repl Audit
```typescript
// Audit all team Repls for compliance
async function auditRepls(teamId: string) {
const res = await fetch(`https://replit.com/api/v1/teams/${teamId}/repls`, {
headers: { Authorization: `Bearer ${process.env.REPLIT_TOKEN}` },
});
const repls = await res.json();
const report = {
total: repls.length,
withDeployments: repls.filter((r: any) => r.deployment).length,
publicRepls: repls.filter((r: any) => r.isPublic).length,
staleRepls: repls.filter((r: any) => {
const lastEdit = new Date(r.lastEdited);
return Date.now() - lastEdit.getTime() > 90 * 24 * 60 * 60 * 1000;
}),
};
console.log('Repl Audit Report:');
console.log(` Total: ${report.total}`);
console.log(` Deployed: ${report.withDeployments}`);
console.log(` Public: ${report.publicRepls} (review for secrets exposure)`);
console.log(` Stale (>90 days): ${report.staleRepls.length}`);
return report;
}
```
### Step 6: Activity Monitoring
```bash
# Review recent team activity
curl "https://replit.com/api/v1/teams/TEAM_ID/audit-log?limit=50" \
-H "Authorization: Bearer $REPLIT_TOKEN" | \
jq '.events[] | {user, action, resource, timestamp}'
# Export member activity CSV
curl "https://replit.com/api/v1/teams/TEAM_ID/members" \
-H "Authorization: Bearer $REPLIT_TOKEN" | \
jq -r '.[] | [.username, .email, .role, .lastActive] | @csv' > team-activity.csv
```
## Error Handling
| Error | Cause | Solution |
|-------|-------|----------|
| 403 on member invite | Not an admin | Requires Owner or Admin role |
| Seat limit exceeded | Plan capacity reached | Remove inactive or upgrade plan |
| Deploy promotion fails | Dev not healthy | Fix dev deployment first |
| DNS not resolving | Wrong CNAME record | Verify DNS points to `.replit.app` |
## Resources
- [Replit Teams](https://docs.replit.com/teams/identity-and-access-management/groups-and-permissions)
- [Replit Deployments](https://docs.replit.com/cloud-services/deployments/reserved-vm-deployments)
- Custom Domains
## Next Steps
For common errors, see `replit-common-errors`.
Related in General
modeling-omnistudio-epc-catalog
IncludedSalesforce Industries CME EPC product-modeling skill for Product2-based catalog creation. Use when creating EPC products, configuring product attributes, building offer bundles with Product Child Items, or reviewing EPC DataPack JSON metadata for product catalog changes. TRIGGER when: user creates or updates Product2 EPC records, AttributeAssignment payloads, AttributeMetadata/AttributeDefaultValues, Offer bundles, or ProductChildItem relationships. DO NOT TRIGGER when: designing OmniScripts/FlexCards/Integration Procedures (use building-omnistudio-omniscript, building-omnistudio-flexcard, or building-omnistudio-integration-procedure), implementing Apex business logic (use generating-apex), or troubleshooting deployment pipelines (use deploying-metadata).
relationship-science-coach
IncludedUse this skill for direct, practical adult relationship coaching: couples conflict, repair, trust, marriage, dating, flirting, attachment patterns, emotional connection, sex, desire differences, eroticism, kink negotiation, affection, love languages, breakups, and long-term passion. Draw on Gottman, EFT and Hold Me Tight, attachment science, modern sex research, Perel, Nagoski, Kerner, Schnarch, Love and Stosny, and flexible love-language tools. Be concrete and low-hedge. Redirect only for imminent danger, abuse, coercive control, minors, non-consent, self-harm, stalking, or medical/legal/psychiatric decisions.
building-sf-integrations
IncludedSalesforce integration architecture and runtime plumbing with 120-point scoring. Use this skill to set up Named Credentials, External Credentials, External Services, REST/SOAP callout patterns, Platform Events, and Change Data Capture. TRIGGER when: user sets up Named Credentials, External Services, REST/SOAP callouts, Platform Events, CDC, or touches .namedCredential-meta.xml files. DO NOT TRIGGER when: Connected App/OAuth config (use configuring-connected-apps), Apex-only logic (use generating-apex), or data import/export (use handling-sf-data).
venue-templates
IncludedAccess comprehensive LaTeX templates, formatting requirements, and submission guidelines for major scientific publication venues (Nature, Science, PLOS, IEEE, ACM), academic conferences (NeurIPS, ICML, CVPR, CHI), research posters, and grant proposals (NSF, NIH, DOE, DARPA). This skill should be used when preparing manuscripts for journal submission, conference papers, research posters, or grant proposals and need venue-specific formatting requirements and templates.
let-fate-decide
IncludedDraws the 12 Houses of the Zodiac Tarot spread to inject entropy into planning when prompts are vague, ambiguous, or casually delegated. Interprets the spread to guide next steps. Use when the user says 'let fate decide', 'YOLO', 'whatever', 'idk', or other nonchalant phrases, makes Yu-Gi-Oh references, or when you are about to arbitrarily pick between multiple reasonable approaches. Prefer over ask-questions-if-underspecified when the user's tone is casual or playful rather than precision-seeking.
net-ops
IncludedCross-platform network troubleshooting (Windows, macOS, Linux) via local or remote shell. Use for: DNS broken, can't resolve hostnames, nslookup/dig works but apps fail, NRPT, WFP, scutil, /etc/resolver, systemd-resolved, /etc/resolv.conf, NetworkManager, VPN DNS leak residue (ProtonVPN/Mullvad/WireGuard/AnyConnect), AV/firewall blocking DNS or DoH, Tailscale DNS interaction, intermittent connectivity, remote diagnostics over SSH.