crowdtime-cli 0.6.0__tar.gz → 0.7.0__tar.gz
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.
- {crowdtime_cli-0.6.0 → crowdtime_cli-0.7.0}/PKG-INFO +1 -1
- {crowdtime_cli-0.6.0 → crowdtime_cli-0.7.0}/pyproject.toml +1 -1
- {crowdtime_cli-0.6.0 → crowdtime_cli-0.7.0}/src/crowdtime_cli/__init__.py +1 -1
- {crowdtime_cli-0.6.0 → crowdtime_cli-0.7.0}/src/crowdtime_cli/commands/org_cmd.py +27 -0
- {crowdtime_cli-0.6.0 → crowdtime_cli-0.7.0}/src/crowdtime_cli/skills/crowdtime/SKILL.md +3 -2
- {crowdtime_cli-0.6.0 → crowdtime_cli-0.7.0}/src/crowdtime_cli/skills/crowdtime/references/commands.md +11 -2
- {crowdtime_cli-0.6.0 → crowdtime_cli-0.7.0}/src/crowdtime_cli/skills/crowdtime/references/workflows.md +1 -3
- {crowdtime_cli-0.6.0 → crowdtime_cli-0.7.0}/.gitignore +0 -0
- {crowdtime_cli-0.6.0 → crowdtime_cli-0.7.0}/LICENSE +0 -0
- {crowdtime_cli-0.6.0 → crowdtime_cli-0.7.0}/README.md +0 -0
- {crowdtime_cli-0.6.0 → crowdtime_cli-0.7.0}/src/crowdtime_cli/auth.py +0 -0
- {crowdtime_cli-0.6.0 → crowdtime_cli-0.7.0}/src/crowdtime_cli/client.py +0 -0
- {crowdtime_cli-0.6.0 → crowdtime_cli-0.7.0}/src/crowdtime_cli/commands/__init__.py +0 -0
- {crowdtime_cli-0.6.0 → crowdtime_cli-0.7.0}/src/crowdtime_cli/commands/ai_cmd.py +0 -0
- {crowdtime_cli-0.6.0 → crowdtime_cli-0.7.0}/src/crowdtime_cli/commands/auth_cmd.py +0 -0
- {crowdtime_cli-0.6.0 → crowdtime_cli-0.7.0}/src/crowdtime_cli/commands/billing_cmd.py +0 -0
- {crowdtime_cli-0.6.0 → crowdtime_cli-0.7.0}/src/crowdtime_cli/commands/clients_cmd.py +0 -0
- {crowdtime_cli-0.6.0 → crowdtime_cli-0.7.0}/src/crowdtime_cli/commands/config_cmd.py +0 -0
- {crowdtime_cli-0.6.0 → crowdtime_cli-0.7.0}/src/crowdtime_cli/commands/expense_cmd.py +0 -0
- {crowdtime_cli-0.6.0 → crowdtime_cli-0.7.0}/src/crowdtime_cli/commands/favorites_cmd.py +0 -0
- {crowdtime_cli-0.6.0 → crowdtime_cli-0.7.0}/src/crowdtime_cli/commands/invoice_cmd.py +0 -0
- {crowdtime_cli-0.6.0 → crowdtime_cli-0.7.0}/src/crowdtime_cli/commands/log_cmd.py +0 -0
- {crowdtime_cli-0.6.0 → crowdtime_cli-0.7.0}/src/crowdtime_cli/commands/payroll_cmd.py +0 -0
- {crowdtime_cli-0.6.0 → crowdtime_cli-0.7.0}/src/crowdtime_cli/commands/projects_cmd.py +0 -0
- {crowdtime_cli-0.6.0 → crowdtime_cli-0.7.0}/src/crowdtime_cli/commands/report_cmd.py +0 -0
- {crowdtime_cli-0.6.0 → crowdtime_cli-0.7.0}/src/crowdtime_cli/commands/skill_cmd.py +0 -0
- {crowdtime_cli-0.6.0 → crowdtime_cli-0.7.0}/src/crowdtime_cli/commands/tasks_cmd.py +0 -0
- {crowdtime_cli-0.6.0 → crowdtime_cli-0.7.0}/src/crowdtime_cli/commands/timer_cmd.py +0 -0
- {crowdtime_cli-0.6.0 → crowdtime_cli-0.7.0}/src/crowdtime_cli/commands/timesheet_cmd.py +0 -0
- {crowdtime_cli-0.6.0 → crowdtime_cli-0.7.0}/src/crowdtime_cli/config.py +0 -0
- {crowdtime_cli-0.6.0 → crowdtime_cli-0.7.0}/src/crowdtime_cli/formatters.py +0 -0
- {crowdtime_cli-0.6.0 → crowdtime_cli-0.7.0}/src/crowdtime_cli/main.py +0 -0
- {crowdtime_cli-0.6.0 → crowdtime_cli-0.7.0}/src/crowdtime_cli/models.py +0 -0
- {crowdtime_cli-0.6.0 → crowdtime_cli-0.7.0}/src/crowdtime_cli/oauth.py +0 -0
- {crowdtime_cli-0.6.0 → crowdtime_cli-0.7.0}/src/crowdtime_cli/resolvers.py +0 -0
- {crowdtime_cli-0.6.0 → crowdtime_cli-0.7.0}/src/crowdtime_cli/utils.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: crowdtime-cli
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.7.0
|
|
4
4
|
Summary: AI-powered time tracking CLI — a modern, developer-friendly alternative to Harvest
|
|
5
5
|
Project-URL: Homepage, https://crowdtime.lat
|
|
6
6
|
Project-URL: Documentation, https://crowdtime.lat/docs
|
|
@@ -64,6 +64,33 @@ def list_orgs(
|
|
|
64
64
|
raise typer.Exit(1)
|
|
65
65
|
|
|
66
66
|
|
|
67
|
+
@app.command("create")
|
|
68
|
+
def create_org(
|
|
69
|
+
name: str = typer.Argument(..., help="Name for the new organization."),
|
|
70
|
+
output_json: bool = typer.Option(False, "--json", help="Output as JSON."),
|
|
71
|
+
) -> None:
|
|
72
|
+
"""Create a new organization."""
|
|
73
|
+
client = CrowdTimeClient(require_auth=True, require_org=False)
|
|
74
|
+
|
|
75
|
+
try:
|
|
76
|
+
data = client.post(
|
|
77
|
+
"/api/v1/organizations/create-personal/",
|
|
78
|
+
data={"name": name},
|
|
79
|
+
org_scoped=False,
|
|
80
|
+
)
|
|
81
|
+
org = data.get("organization", {})
|
|
82
|
+
|
|
83
|
+
if output_json:
|
|
84
|
+
print_json(data)
|
|
85
|
+
else:
|
|
86
|
+
slug = org.get("slug", "")
|
|
87
|
+
format_success(f"Organization '{org.get('name', name)}' created (slug: {slug})")
|
|
88
|
+
console.print(f"[dim]Switch to it with: ct org switch {slug}[/dim]")
|
|
89
|
+
except APIError as e:
|
|
90
|
+
format_error(e.message)
|
|
91
|
+
raise typer.Exit(1)
|
|
92
|
+
|
|
93
|
+
|
|
67
94
|
@app.command("switch")
|
|
68
95
|
def switch_org(
|
|
69
96
|
slug: str = typer.Argument(..., help="Organization slug to switch to."),
|
|
@@ -246,7 +246,7 @@ ct payroll payments # List all payments
|
|
|
246
246
|
ct payroll payments --period 2026-03 --status paid
|
|
247
247
|
```
|
|
248
248
|
|
|
249
|
-
**Access**: Only
|
|
249
|
+
**Access**: Only admins and owners can access payroll. Regular members cannot see any payroll data.
|
|
250
250
|
|
|
251
251
|
**Compensation types**: `hourly` (gross = hours × rate) or `salary` (fixed monthly amount, no proration).
|
|
252
252
|
|
|
@@ -255,8 +255,9 @@ ct payroll payments --period 2026-03 --status paid
|
|
|
255
255
|
### Organizations
|
|
256
256
|
```bash
|
|
257
257
|
ct org list # List your organizations
|
|
258
|
+
ct org create "My Company" # Create a new organization
|
|
258
259
|
ct org switch <slug> # Switch active organization
|
|
259
|
-
ct org members # List members
|
|
260
|
+
ct org members # List members (manager+ only)
|
|
260
261
|
ct org invitations # List pending invitations
|
|
261
262
|
ct org invite user@example.com -r member
|
|
262
263
|
ct org invite client@acme.com -r viewer # External client stakeholder (read-only)
|
|
@@ -580,7 +580,7 @@ Endpoint: `GET /billing/events/`
|
|
|
580
580
|
|
|
581
581
|
## ct payroll
|
|
582
582
|
|
|
583
|
-
Access restricted to
|
|
583
|
+
Access restricted to admins and owners.
|
|
584
584
|
|
|
585
585
|
### ct payroll (bare / summary)
|
|
586
586
|
|
|
@@ -984,6 +984,15 @@ ct org list [--json]
|
|
|
984
984
|
Lists organizations you belong to. Marks current with `*`. Non-org-scoped.
|
|
985
985
|
Endpoint: `GET /api/v1/organizations/`
|
|
986
986
|
|
|
987
|
+
### ct org create
|
|
988
|
+
|
|
989
|
+
```
|
|
990
|
+
ct org create NAME [--json]
|
|
991
|
+
```
|
|
992
|
+
|
|
993
|
+
Creates a new organization with the given name. Max 10 organizations per user. Non-org-scoped.
|
|
994
|
+
Endpoint: `POST /api/v1/organizations/create-personal/`
|
|
995
|
+
|
|
987
996
|
### ct org switch
|
|
988
997
|
|
|
989
998
|
```
|
|
@@ -998,7 +1007,7 @@ Switches active organization. Saves to config `defaults.organization`.
|
|
|
998
1007
|
ct org members [--json]
|
|
999
1008
|
```
|
|
1000
1009
|
|
|
1001
|
-
Shows: Name, Email, Role, Status. Endpoint: `GET /members/`
|
|
1010
|
+
Shows: Name, Email, Role, Status. Requires manager+ role. Endpoint: `GET /members/`
|
|
1002
1011
|
|
|
1003
1012
|
### ct org invite
|
|
1004
1013
|
|
|
@@ -700,9 +700,7 @@ ct payroll payments --member alice@company.com
|
|
|
700
700
|
|
|
701
701
|
### Payroll Access Control
|
|
702
702
|
|
|
703
|
-
Only
|
|
704
|
-
- Use the web admin or API to set `is_hr_manager=True` on a member's membership
|
|
705
|
-
- Admins and owners can do this via `PATCH /api/v1/organizations/<slug>/members/<id>/`
|
|
703
|
+
Only admins and owners can access payroll data.
|
|
706
704
|
|
|
707
705
|
---
|
|
708
706
|
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|