@ttctl/cli 0.0.0 → 0.1.0-rc.2
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/README.md +44 -9
- package/dist/commands/applications/index.d.ts +21 -0
- package/dist/commands/applications/index.d.ts.map +1 -0
- package/dist/commands/applications/index.js +87 -0
- package/dist/commands/applications/index.js.map +1 -0
- package/dist/commands/applications/list.d.ts +55 -0
- package/dist/commands/applications/list.d.ts.map +1 -0
- package/dist/commands/applications/list.js +106 -0
- package/dist/commands/applications/list.js.map +1 -0
- package/dist/commands/applications/shared.d.ts +14 -0
- package/dist/commands/applications/shared.d.ts.map +1 -0
- package/dist/commands/applications/shared.js +19 -0
- package/dist/commands/applications/shared.js.map +1 -0
- package/dist/commands/applications/show.d.ts +51 -0
- package/dist/commands/applications/show.d.ts.map +1 -0
- package/dist/commands/applications/show.js +154 -0
- package/dist/commands/applications/show.js.map +1 -0
- package/dist/commands/applications/stats.d.ts +42 -0
- package/dist/commands/applications/stats.d.ts.map +1 -0
- package/dist/commands/applications/stats.js +69 -0
- package/dist/commands/applications/stats.js.map +1 -0
- package/dist/commands/auth/index.d.ts +17 -0
- package/dist/commands/auth/index.d.ts.map +1 -0
- package/dist/commands/auth/index.js +69 -0
- package/dist/commands/auth/index.js.map +1 -0
- package/dist/commands/auth/init.d.ts +98 -0
- package/dist/commands/auth/init.d.ts.map +1 -0
- package/dist/commands/auth/init.js +387 -0
- package/dist/commands/auth/init.js.map +1 -0
- package/dist/commands/auth/signin.d.ts +81 -0
- package/dist/commands/auth/signin.d.ts.map +1 -0
- package/dist/commands/auth/signin.js +145 -0
- package/dist/commands/auth/signin.js.map +1 -0
- package/dist/commands/auth/signout.d.ts +133 -0
- package/dist/commands/auth/signout.d.ts.map +1 -0
- package/dist/commands/auth/signout.js +172 -0
- package/dist/commands/auth/signout.js.map +1 -0
- package/dist/commands/auth/status.d.ts +62 -0
- package/dist/commands/auth/status.d.ts.map +1 -0
- package/dist/commands/auth/status.js +98 -0
- package/dist/commands/auth/status.js.map +1 -0
- package/dist/commands/availability/allocated-hours.d.ts +27 -0
- package/dist/commands/availability/allocated-hours.d.ts.map +1 -0
- package/dist/commands/availability/allocated-hours.js +61 -0
- package/dist/commands/availability/allocated-hours.js.map +1 -0
- package/dist/commands/availability/index.d.ts +30 -0
- package/dist/commands/availability/index.d.ts.map +1 -0
- package/dist/commands/availability/index.js +124 -0
- package/dist/commands/availability/index.js.map +1 -0
- package/dist/commands/availability/shared.d.ts +11 -0
- package/dist/commands/availability/shared.d.ts.map +1 -0
- package/dist/commands/availability/shared.js +30 -0
- package/dist/commands/availability/shared.js.map +1 -0
- package/dist/commands/availability/show.d.ts +32 -0
- package/dist/commands/availability/show.d.ts.map +1 -0
- package/dist/commands/availability/show.js +86 -0
- package/dist/commands/availability/show.js.map +1 -0
- package/dist/commands/availability/working-hours.d.ts +53 -0
- package/dist/commands/availability/working-hours.d.ts.map +1 -0
- package/dist/commands/availability/working-hours.js +151 -0
- package/dist/commands/availability/working-hours.js.map +1 -0
- package/dist/commands/contracts/index.d.ts +69 -0
- package/dist/commands/contracts/index.d.ts.map +1 -0
- package/dist/commands/contracts/index.js +198 -0
- package/dist/commands/contracts/index.js.map +1 -0
- package/dist/commands/engagements/breaks.d.ts +81 -0
- package/dist/commands/engagements/breaks.d.ts.map +1 -0
- package/dist/commands/engagements/breaks.js +229 -0
- package/dist/commands/engagements/breaks.js.map +1 -0
- package/dist/commands/engagements/index.d.ts +29 -0
- package/dist/commands/engagements/index.d.ts.map +1 -0
- package/dist/commands/engagements/index.js +172 -0
- package/dist/commands/engagements/index.js.map +1 -0
- package/dist/commands/engagements/list.d.ts +49 -0
- package/dist/commands/engagements/list.d.ts.map +1 -0
- package/dist/commands/engagements/list.js +95 -0
- package/dist/commands/engagements/list.js.map +1 -0
- package/dist/commands/engagements/shared.d.ts +10 -0
- package/dist/commands/engagements/shared.d.ts.map +1 -0
- package/dist/commands/engagements/shared.js +31 -0
- package/dist/commands/engagements/shared.js.map +1 -0
- package/dist/commands/engagements/show.d.ts +19 -0
- package/dist/commands/engagements/show.d.ts.map +1 -0
- package/dist/commands/engagements/show.js +150 -0
- package/dist/commands/engagements/show.js.map +1 -0
- package/dist/commands/engagements/stats.d.ts +24 -0
- package/dist/commands/engagements/stats.d.ts.map +1 -0
- package/dist/commands/engagements/stats.js +51 -0
- package/dist/commands/engagements/stats.js.map +1 -0
- package/dist/commands/jobs/index.d.ts +49 -0
- package/dist/commands/jobs/index.d.ts.map +1 -0
- package/dist/commands/jobs/index.js +304 -0
- package/dist/commands/jobs/index.js.map +1 -0
- package/dist/commands/jobs/interest.d.ts +65 -0
- package/dist/commands/jobs/interest.d.ts.map +1 -0
- package/dist/commands/jobs/interest.js +172 -0
- package/dist/commands/jobs/interest.js.map +1 -0
- package/dist/commands/jobs/list.d.ts +81 -0
- package/dist/commands/jobs/list.d.ts.map +1 -0
- package/dist/commands/jobs/list.js +157 -0
- package/dist/commands/jobs/list.js.map +1 -0
- package/dist/commands/jobs/search.d.ts +71 -0
- package/dist/commands/jobs/search.d.ts.map +1 -0
- package/dist/commands/jobs/search.js +163 -0
- package/dist/commands/jobs/search.js.map +1 -0
- package/dist/commands/jobs/shared.d.ts +79 -0
- package/dist/commands/jobs/shared.d.ts.map +1 -0
- package/dist/commands/jobs/shared.js +133 -0
- package/dist/commands/jobs/shared.js.map +1 -0
- package/dist/commands/jobs/show.d.ts +20 -0
- package/dist/commands/jobs/show.d.ts.map +1 -0
- package/dist/commands/jobs/show.js +135 -0
- package/dist/commands/jobs/show.js.map +1 -0
- package/dist/commands/payments/index.d.ts +34 -0
- package/dist/commands/payments/index.d.ts.map +1 -0
- package/dist/commands/payments/index.js +160 -0
- package/dist/commands/payments/index.js.map +1 -0
- package/dist/commands/payments/methods.d.ts +17 -0
- package/dist/commands/payments/methods.d.ts.map +1 -0
- package/dist/commands/payments/methods.js +79 -0
- package/dist/commands/payments/methods.js.map +1 -0
- package/dist/commands/payments/payouts.d.ts +44 -0
- package/dist/commands/payments/payouts.d.ts.map +1 -0
- package/dist/commands/payments/payouts.js +147 -0
- package/dist/commands/payments/payouts.js.map +1 -0
- package/dist/commands/payments/rate.d.ts +48 -0
- package/dist/commands/payments/rate.d.ts.map +1 -0
- package/dist/commands/payments/rate.js +229 -0
- package/dist/commands/payments/rate.js.map +1 -0
- package/dist/commands/payments/shared.d.ts +10 -0
- package/dist/commands/payments/shared.d.ts.map +1 -0
- package/dist/commands/payments/shared.js +27 -0
- package/dist/commands/payments/shared.js.map +1 -0
- package/dist/commands/profile/basic/index.d.ts +18 -0
- package/dist/commands/profile/basic/index.d.ts.map +1 -0
- package/dist/commands/profile/basic/index.js +79 -0
- package/dist/commands/profile/basic/index.js.map +1 -0
- package/dist/commands/profile/basic/photo-show.d.ts +28 -0
- package/dist/commands/profile/basic/photo-show.d.ts.map +1 -0
- package/dist/commands/profile/basic/photo-show.js +112 -0
- package/dist/commands/profile/basic/photo-show.js.map +1 -0
- package/dist/commands/profile/basic/photo-upload.d.ts +10 -0
- package/dist/commands/profile/basic/photo-upload.d.ts.map +1 -0
- package/dist/commands/profile/basic/photo-upload.js +61 -0
- package/dist/commands/profile/basic/photo-upload.js.map +1 -0
- package/dist/commands/profile/basic/set.d.ts +54 -0
- package/dist/commands/profile/basic/set.d.ts.map +1 -0
- package/dist/commands/profile/basic/set.js +174 -0
- package/dist/commands/profile/basic/set.js.map +1 -0
- package/dist/commands/profile/basic/show.d.ts +95 -0
- package/dist/commands/profile/basic/show.d.ts.map +1 -0
- package/dist/commands/profile/basic/show.js +310 -0
- package/dist/commands/profile/basic/show.js.map +1 -0
- package/dist/commands/profile/certifications/index.d.ts +40 -0
- package/dist/commands/profile/certifications/index.d.ts.map +1 -0
- package/dist/commands/profile/certifications/index.js +350 -0
- package/dist/commands/profile/certifications/index.js.map +1 -0
- package/dist/commands/profile/education/index.d.ts +37 -0
- package/dist/commands/profile/education/index.d.ts.map +1 -0
- package/dist/commands/profile/education/index.js +331 -0
- package/dist/commands/profile/education/index.js.map +1 -0
- package/dist/commands/profile/employment/index.d.ts +49 -0
- package/dist/commands/profile/employment/index.d.ts.map +1 -0
- package/dist/commands/profile/employment/index.js +425 -0
- package/dist/commands/profile/employment/index.js.map +1 -0
- package/dist/commands/profile/external/_shared.d.ts +35 -0
- package/dist/commands/profile/external/_shared.d.ts.map +1 -0
- package/dist/commands/profile/external/_shared.js +59 -0
- package/dist/commands/profile/external/_shared.js.map +1 -0
- package/dist/commands/profile/external/advanced-wizard-show.d.ts +15 -0
- package/dist/commands/profile/external/advanced-wizard-show.d.ts.map +1 -0
- package/dist/commands/profile/external/advanced-wizard-show.js +82 -0
- package/dist/commands/profile/external/advanced-wizard-show.js.map +1 -0
- package/dist/commands/profile/external/custom-requirements-set.d.ts +32 -0
- package/dist/commands/profile/external/custom-requirements-set.d.ts.map +1 -0
- package/dist/commands/profile/external/custom-requirements-set.js +116 -0
- package/dist/commands/profile/external/custom-requirements-set.js.map +1 -0
- package/dist/commands/profile/external/custom-requirements-show.d.ts +16 -0
- package/dist/commands/profile/external/custom-requirements-show.d.ts.map +1 -0
- package/dist/commands/profile/external/custom-requirements-show.js +84 -0
- package/dist/commands/profile/external/custom-requirements-show.js.map +1 -0
- package/dist/commands/profile/external/index.d.ts +21 -0
- package/dist/commands/profile/external/index.d.ts.map +1 -0
- package/dist/commands/profile/external/index.js +113 -0
- package/dist/commands/profile/external/index.js.map +1 -0
- package/dist/commands/profile/external/readiness.d.ts +15 -0
- package/dist/commands/profile/external/readiness.d.ts.map +1 -0
- package/dist/commands/profile/external/readiness.js +104 -0
- package/dist/commands/profile/external/readiness.js.map +1 -0
- package/dist/commands/profile/external/recommendations.d.ts +17 -0
- package/dist/commands/profile/external/recommendations.d.ts.map +1 -0
- package/dist/commands/profile/external/recommendations.js +97 -0
- package/dist/commands/profile/external/recommendations.js.map +1 -0
- package/dist/commands/profile/external/show.d.ts +22 -0
- package/dist/commands/profile/external/show.d.ts.map +1 -0
- package/dist/commands/profile/external/show.js +83 -0
- package/dist/commands/profile/external/show.js.map +1 -0
- package/dist/commands/profile/external/update.d.ts +37 -0
- package/dist/commands/profile/external/update.d.ts.map +1 -0
- package/dist/commands/profile/external/update.js +125 -0
- package/dist/commands/profile/external/update.js.map +1 -0
- package/dist/commands/profile/index.d.ts +16 -0
- package/dist/commands/profile/index.d.ts.map +1 -0
- package/dist/commands/profile/index.js +81 -0
- package/dist/commands/profile/index.js.map +1 -0
- package/dist/commands/profile/industries/index.d.ts +43 -0
- package/dist/commands/profile/industries/index.d.ts.map +1 -0
- package/dist/commands/profile/industries/index.js +258 -0
- package/dist/commands/profile/industries/index.js.map +1 -0
- package/dist/commands/profile/portfolio/add.d.ts +43 -0
- package/dist/commands/profile/portfolio/add.d.ts.map +1 -0
- package/dist/commands/profile/portfolio/add.js +181 -0
- package/dist/commands/profile/portfolio/add.js.map +1 -0
- package/dist/commands/profile/portfolio/highlight.d.ts +11 -0
- package/dist/commands/profile/portfolio/highlight.d.ts.map +1 -0
- package/dist/commands/profile/portfolio/highlight.js +31 -0
- package/dist/commands/profile/portfolio/highlight.js.map +1 -0
- package/dist/commands/profile/portfolio/index.d.ts +16 -0
- package/dist/commands/profile/portfolio/index.d.ts.map +1 -0
- package/dist/commands/profile/portfolio/index.js +121 -0
- package/dist/commands/profile/portfolio/index.js.map +1 -0
- package/dist/commands/profile/portfolio/list.d.ts +83 -0
- package/dist/commands/profile/portfolio/list.d.ts.map +1 -0
- package/dist/commands/profile/portfolio/list.js +189 -0
- package/dist/commands/profile/portfolio/list.js.map +1 -0
- package/dist/commands/profile/portfolio/remove.d.ts +9 -0
- package/dist/commands/profile/portfolio/remove.d.ts.map +1 -0
- package/dist/commands/profile/portfolio/remove.js +24 -0
- package/dist/commands/profile/portfolio/remove.js.map +1 -0
- package/dist/commands/profile/portfolio/reorder.d.ts +17 -0
- package/dist/commands/profile/portfolio/reorder.d.ts.map +1 -0
- package/dist/commands/profile/portfolio/reorder.js +135 -0
- package/dist/commands/profile/portfolio/reorder.js.map +1 -0
- package/dist/commands/profile/portfolio/shared.d.ts +8 -0
- package/dist/commands/profile/portfolio/shared.d.ts.map +1 -0
- package/dist/commands/profile/portfolio/shared.js +10 -0
- package/dist/commands/profile/portfolio/shared.js.map +1 -0
- package/dist/commands/profile/portfolio/update.d.ts +18 -0
- package/dist/commands/profile/portfolio/update.d.ts.map +1 -0
- package/dist/commands/profile/portfolio/update.js +77 -0
- package/dist/commands/profile/portfolio/update.js.map +1 -0
- package/dist/commands/profile/portfolio/upload.d.ts +8 -0
- package/dist/commands/profile/portfolio/upload.d.ts.map +1 -0
- package/dist/commands/profile/portfolio/upload.js +131 -0
- package/dist/commands/profile/portfolio/upload.js.map +1 -0
- package/dist/commands/profile/resume/cancel-upload.d.ts +9 -0
- package/dist/commands/profile/resume/cancel-upload.d.ts.map +1 -0
- package/dist/commands/profile/resume/cancel-upload.js +30 -0
- package/dist/commands/profile/resume/cancel-upload.js.map +1 -0
- package/dist/commands/profile/resume/index.d.ts +15 -0
- package/dist/commands/profile/resume/index.d.ts.map +1 -0
- package/dist/commands/profile/resume/index.js +42 -0
- package/dist/commands/profile/resume/index.js.map +1 -0
- package/dist/commands/profile/resume/upload.d.ts +16 -0
- package/dist/commands/profile/resume/upload.d.ts.map +1 -0
- package/dist/commands/profile/resume/upload.js +65 -0
- package/dist/commands/profile/resume/upload.js.map +1 -0
- package/dist/commands/profile/reviews/_shared.d.ts +9 -0
- package/dist/commands/profile/reviews/_shared.d.ts.map +1 -0
- package/dist/commands/profile/reviews/_shared.js +15 -0
- package/dist/commands/profile/reviews/_shared.js.map +1 -0
- package/dist/commands/profile/reviews/approve-item.d.ts +30 -0
- package/dist/commands/profile/reviews/approve-item.d.ts.map +1 -0
- package/dist/commands/profile/reviews/approve-item.js +82 -0
- package/dist/commands/profile/reviews/approve-item.js.map +1 -0
- package/dist/commands/profile/reviews/approve-section.d.ts +15 -0
- package/dist/commands/profile/reviews/approve-section.d.ts.map +1 -0
- package/dist/commands/profile/reviews/approve-section.js +67 -0
- package/dist/commands/profile/reviews/approve-section.js.map +1 -0
- package/dist/commands/profile/reviews/index.d.ts +19 -0
- package/dist/commands/profile/reviews/index.d.ts.map +1 -0
- package/dist/commands/profile/reviews/index.js +71 -0
- package/dist/commands/profile/reviews/index.js.map +1 -0
- package/dist/commands/profile/reviews/list.d.ts +17 -0
- package/dist/commands/profile/reviews/list.d.ts.map +1 -0
- package/dist/commands/profile/reviews/list.js +96 -0
- package/dist/commands/profile/reviews/list.js.map +1 -0
- package/dist/commands/profile/reviews/submit-for-review.d.ts +16 -0
- package/dist/commands/profile/reviews/submit-for-review.d.ts.map +1 -0
- package/dist/commands/profile/reviews/submit-for-review.js +65 -0
- package/dist/commands/profile/reviews/submit-for-review.js.map +1 -0
- package/dist/commands/profile/shared.d.ts +46 -0
- package/dist/commands/profile/shared.d.ts.map +1 -0
- package/dist/commands/profile/shared.js +111 -0
- package/dist/commands/profile/shared.js.map +1 -0
- package/dist/commands/profile/skills/index.d.ts +29 -0
- package/dist/commands/profile/skills/index.d.ts.map +1 -0
- package/dist/commands/profile/skills/index.js +475 -0
- package/dist/commands/profile/skills/index.js.map +1 -0
- package/dist/commands/profile/visas/add.d.ts +19 -0
- package/dist/commands/profile/visas/add.d.ts.map +1 -0
- package/dist/commands/profile/visas/add.js +37 -0
- package/dist/commands/profile/visas/add.js.map +1 -0
- package/dist/commands/profile/visas/index.d.ts +13 -0
- package/dist/commands/profile/visas/index.d.ts.map +1 -0
- package/dist/commands/profile/visas/index.js +69 -0
- package/dist/commands/profile/visas/index.js.map +1 -0
- package/dist/commands/profile/visas/list.d.ts +40 -0
- package/dist/commands/profile/visas/list.d.ts.map +1 -0
- package/dist/commands/profile/visas/list.js +115 -0
- package/dist/commands/profile/visas/list.js.map +1 -0
- package/dist/commands/profile/visas/remove.d.ts +8 -0
- package/dist/commands/profile/visas/remove.d.ts.map +1 -0
- package/dist/commands/profile/visas/remove.js +23 -0
- package/dist/commands/profile/visas/remove.js.map +1 -0
- package/dist/commands/profile/visas/shared.d.ts +11 -0
- package/dist/commands/profile/visas/shared.d.ts.map +1 -0
- package/dist/commands/profile/visas/shared.js +16 -0
- package/dist/commands/profile/visas/shared.js.map +1 -0
- package/dist/commands/profile/visas/update.d.ts +13 -0
- package/dist/commands/profile/visas/update.d.ts.map +1 -0
- package/dist/commands/profile/visas/update.js +44 -0
- package/dist/commands/profile/visas/update.js.map +1 -0
- package/dist/commands/timesheet/index.d.ts +24 -0
- package/dist/commands/timesheet/index.d.ts.map +1 -0
- package/dist/commands/timesheet/index.js +98 -0
- package/dist/commands/timesheet/index.js.map +1 -0
- package/dist/commands/timesheet/list.d.ts +40 -0
- package/dist/commands/timesheet/list.d.ts.map +1 -0
- package/dist/commands/timesheet/list.js +79 -0
- package/dist/commands/timesheet/list.js.map +1 -0
- package/dist/commands/timesheet/shared.d.ts +10 -0
- package/dist/commands/timesheet/shared.d.ts.map +1 -0
- package/dist/commands/timesheet/shared.js +35 -0
- package/dist/commands/timesheet/shared.js.map +1 -0
- package/dist/commands/timesheet/show.d.ts +19 -0
- package/dist/commands/timesheet/show.d.ts.map +1 -0
- package/dist/commands/timesheet/show.js +109 -0
- package/dist/commands/timesheet/show.js.map +1 -0
- package/dist/commands/timesheet/submit.d.ts +50 -0
- package/dist/commands/timesheet/submit.d.ts.map +1 -0
- package/dist/commands/timesheet/submit.js +151 -0
- package/dist/commands/timesheet/submit.js.map +1 -0
- package/dist/crash-handlers.d.ts +67 -0
- package/dist/crash-handlers.d.ts.map +1 -0
- package/dist/crash-handlers.js +78 -0
- package/dist/crash-handlers.js.map +1 -0
- package/dist/errors.d.ts +45 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +57 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/config-context.d.ts +41 -0
- package/dist/lib/config-context.d.ts.map +1 -0
- package/dist/lib/config-context.js +74 -0
- package/dist/lib/config-context.js.map +1 -0
- package/dist/lib/dry-run.d.ts +70 -0
- package/dist/lib/dry-run.d.ts.map +1 -0
- package/dist/lib/dry-run.js +114 -0
- package/dist/lib/dry-run.js.map +1 -0
- package/dist/lib/empty-state-cta.d.ts +63 -0
- package/dist/lib/empty-state-cta.d.ts.map +1 -0
- package/dist/lib/empty-state-cta.js +88 -0
- package/dist/lib/empty-state-cta.js.map +1 -0
- package/dist/lib/envelopes.d.ts +540 -0
- package/dist/lib/envelopes.d.ts.map +1 -0
- package/dist/lib/envelopes.js +598 -0
- package/dist/lib/envelopes.js.map +1 -0
- package/dist/lib/error-routing.d.ts +49 -0
- package/dist/lib/error-routing.d.ts.map +1 -0
- package/dist/lib/error-routing.js +72 -0
- package/dist/lib/error-routing.js.map +1 -0
- package/dist/lib/format-helpers.d.ts +65 -0
- package/dist/lib/format-helpers.d.ts.map +1 -0
- package/dist/lib/format-helpers.js +79 -0
- package/dist/lib/format-helpers.js.map +1 -0
- package/dist/lib/format-overrides.d.ts +81 -0
- package/dist/lib/format-overrides.d.ts.map +1 -0
- package/dist/lib/format-overrides.js +55 -0
- package/dist/lib/format-overrides.js.map +1 -0
- package/dist/lib/freetext.d.ts +83 -0
- package/dist/lib/freetext.d.ts.map +1 -0
- package/dist/lib/freetext.js +182 -0
- package/dist/lib/freetext.js.map +1 -0
- package/dist/lib/kill-switch-hook.d.ts +49 -0
- package/dist/lib/kill-switch-hook.d.ts.map +1 -0
- package/dist/lib/kill-switch-hook.js +34 -0
- package/dist/lib/kill-switch-hook.js.map +1 -0
- package/dist/lib/output.d.ts +173 -0
- package/dist/lib/output.d.ts.map +1 -0
- package/dist/lib/output.js +177 -0
- package/dist/lib/output.js.map +1 -0
- package/dist/lib/pagination.d.ts +49 -0
- package/dist/lib/pagination.d.ts.map +1 -0
- package/dist/lib/pagination.js +36 -0
- package/dist/lib/pagination.js.map +1 -0
- package/dist/program.d.ts +80 -0
- package/dist/program.d.ts.map +1 -0
- package/dist/program.js +273 -0
- package/dist/program.js.map +1 -0
- package/package.json +35 -13
- package/index.js +0 -7
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import type { SignOutResult as CoreSignOutResult } from "@ttctl/core";
|
|
2
|
+
import type { OutputFormat } from "../../lib/output.js";
|
|
3
|
+
/**
|
|
4
|
+
* Output format for `ttctl auth signout`. Aligned with the cross-CLI
|
|
5
|
+
* `OutputFormat` post-#126: `pretty` (default) is the human-readable
|
|
6
|
+
* confirmation, `json` and `yaml` emit the machine-readable shape for
|
|
7
|
+
* scripting.
|
|
8
|
+
*/
|
|
9
|
+
export interface AuthSignOutOptions {
|
|
10
|
+
output: OutputFormat;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Server-side LogOut outcome surfaced alongside the local-clear result.
|
|
14
|
+
* Stable strings so scripts can branch on the JSON / YAML output without
|
|
15
|
+
* pattern-matching prose. Maps from `core.signOut()`'s
|
|
16
|
+
* {@link CoreSignOutResult} discriminated union plus the "no token to
|
|
17
|
+
* call with" short-circuit.
|
|
18
|
+
*
|
|
19
|
+
* **Naming is deliberately scoped to "log-out", not "revoke"**. Live
|
|
20
|
+
* evidence (issue #180, 2026-05-12) shows the `LogOut` mutation on
|
|
21
|
+
* `talent_profile/graphql` succeeds but does NOT propagate to bearer
|
|
22
|
+
* invalidation for subsequent `mobile-gateway` calls — the bearer remains
|
|
23
|
+
* valid against `getAuthStatus` across t=0/30/60/180/300s. The 24-72h
|
|
24
|
+
* natural aging-out (CLAUDE.md § Auth Model) is the load-bearing
|
|
25
|
+
* revocation defense. `serverLogOut: "logged-out"` therefore claims only
|
|
26
|
+
* "the LogOut mutation was acknowledged by talent_profile" — NOT "the
|
|
27
|
+
* bearer is now invalid for downstream calls".
|
|
28
|
+
*
|
|
29
|
+
* `logged-out` — talent_profile responded `data.logOut.success === true`;
|
|
30
|
+
* the LogOut flow itself was acknowledged (audit log,
|
|
31
|
+
* web-session/cookie cleanup, defense-in-depth signal).
|
|
32
|
+
* Does NOT imply bearer revocation — see note above.
|
|
33
|
+
* `already-invalid` — bearer was already invalid server-side (HTTP 401/403 or
|
|
34
|
+
* GraphQL auth-revoke code); user intent (kill the bearer)
|
|
35
|
+
* is satisfied transitively.
|
|
36
|
+
* `skipped` — no token to call with (idempotent local-only signout).
|
|
37
|
+
* `unreachable` — could not deliver the LogOut signal (network /
|
|
38
|
+
* HTTP / wire-shape divergence). The local clear still
|
|
39
|
+
* ran; the 24-72h aging-out is the load-bearing defense.
|
|
40
|
+
*/
|
|
41
|
+
export type ServerLogOutOutcome = "logged-out" | "already-invalid" | "skipped" | "unreachable";
|
|
42
|
+
/**
|
|
43
|
+
* Map a {@link CoreSignOutResult} to the CLI's {@link ServerLogOutOutcome}.
|
|
44
|
+
* Collapses the per-reason discriminator of `unreachable` / `invalid` into
|
|
45
|
+
* the four CLI-level outcomes. The full reason is surfaced separately via
|
|
46
|
+
* {@link serverLogOutStderrWarning} for the unreachable path.
|
|
47
|
+
*/
|
|
48
|
+
export declare function mapCoreSignOutResult(result: CoreSignOutResult): ServerLogOutOutcome;
|
|
49
|
+
/**
|
|
50
|
+
* Build a human-readable stderr warning for the `unreachable` server-side
|
|
51
|
+
* outcome. Returns `null` for every other outcome — the success path stays
|
|
52
|
+
* quiet on stderr. The warning text names the reason and tells the user
|
|
53
|
+
* the bearer will age out as the load-bearing defense (24-72h empirical
|
|
54
|
+
* per `research/notes/02-auth-and-clients.md`).
|
|
55
|
+
*/
|
|
56
|
+
export declare function serverLogOutStderrWarning(result: CoreSignOutResult): string | null;
|
|
57
|
+
/**
|
|
58
|
+
* Terminal outcome of `ttctl auth signout`. The `removed` flag distinguishes
|
|
59
|
+
* the case where an auth token existed and was removed from the YAML config
|
|
60
|
+
* from the idempotent no-op (no token field present). Both are success
|
|
61
|
+
* cases — signout MUST be idempotent — but scripts may want to differentiate
|
|
62
|
+
* (e.g. to count active sessions across machines).
|
|
63
|
+
*
|
|
64
|
+
* `path` is the YAML config file path that the `auth.token` field was
|
|
65
|
+
* removed from.
|
|
66
|
+
*
|
|
67
|
+
* `serverLogOut` is the server-side LogOut outcome (post-#180) — see
|
|
68
|
+
* {@link ServerLogOutOutcome}. Always populated on the success branch.
|
|
69
|
+
* `serverLogOut: "unreachable"` is a soft warning — local state is still
|
|
70
|
+
* cleared; the bearer ages out server-side as the load-bearing defense.
|
|
71
|
+
* **Note**: `serverLogOut: "logged-out"` claims only "talent_profile
|
|
72
|
+
* acknowledged the LogOut mutation"; it does NOT claim "the bearer is now
|
|
73
|
+
* invalid for downstream calls". See {@link ServerLogOutOutcome} for the
|
|
74
|
+
* full empirical scope.
|
|
75
|
+
*
|
|
76
|
+
* `error` carries a generic message; the only realistic non-permission
|
|
77
|
+
* failure is a YAML parse error or a write-back contention (mtime drift),
|
|
78
|
+
* which the user must resolve out of band.
|
|
79
|
+
*/
|
|
80
|
+
export type SignOutResult = {
|
|
81
|
+
status: "signed-out";
|
|
82
|
+
removed: boolean;
|
|
83
|
+
path: string;
|
|
84
|
+
serverLogOut: ServerLogOutOutcome;
|
|
85
|
+
} | {
|
|
86
|
+
status: "error";
|
|
87
|
+
message: string;
|
|
88
|
+
};
|
|
89
|
+
/**
|
|
90
|
+
* Render a `SignOutResult` for the human-readable `pretty` format. The
|
|
91
|
+
* success line is "Signed out." regardless of whether a token was
|
|
92
|
+
* removed — the user-facing semantics ("you are no longer signed in")
|
|
93
|
+
* are identical, and the AC explicitly calls out idempotency. Errors
|
|
94
|
+
* surface verbatim.
|
|
95
|
+
*/
|
|
96
|
+
export declare function formatSignOutPretty(result: SignOutResult): string;
|
|
97
|
+
/**
|
|
98
|
+
* Format a `SignOutResult` for the requested output mode. JSON and YAML
|
|
99
|
+
* shapes mirror the discriminated union exactly — `removed` and `path`
|
|
100
|
+
* on success, `message` on error — so scripts can branch on `removed`
|
|
101
|
+
* to detect the no-op case.
|
|
102
|
+
*/
|
|
103
|
+
export declare function formatSignOutOutput(result: SignOutResult, output: OutputFormat): string;
|
|
104
|
+
/**
|
|
105
|
+
* Map a `SignOutResult` to a process exit code. Both success branches
|
|
106
|
+
* (`removed: true` and `removed: false`) return 0 — signout is idempotent
|
|
107
|
+
* by AC. Only filesystem failures other than ENOENT exit non-zero.
|
|
108
|
+
*/
|
|
109
|
+
export declare function exitCodeForSignOutResult(result: SignOutResult): number;
|
|
110
|
+
/**
|
|
111
|
+
* Run the `auth signout` command end-to-end:
|
|
112
|
+
* 1. Resolve `.ttctl.yaml` and read it (in-memory parsed via core).
|
|
113
|
+
* 2. If `auth.token` is present:
|
|
114
|
+
* a. Call `core.signOut(token)` to attempt server-side LogOut via
|
|
115
|
+
* the `LogOut` mutation against talent_profile/graphql.
|
|
116
|
+
* b. Remove the field via `clearAuthToken` (yaml.parseDocument +
|
|
117
|
+
* deleteIn — preserves comments and credentials).
|
|
118
|
+
* c. If the server-side call returned `unreachable`, emit a stderr
|
|
119
|
+
* warning. The local clear still ran — the bearer ages out
|
|
120
|
+
* server-side in 24-72h as the load-bearing defense.
|
|
121
|
+
* 3. If `auth.token` was already absent, exit 0 with `removed: false`
|
|
122
|
+
* and `serverLogOut: "skipped"` (idempotent no-op).
|
|
123
|
+
* 4. Emit the result and exit. Always 0 in the success path — server-
|
|
124
|
+
* side LogOut failure is a soft warning, not an exit-code signal.
|
|
125
|
+
*
|
|
126
|
+
* `clearAuthToken` enforces the same security gates as `persistAuthToken`
|
|
127
|
+
* (symlink refusal, sync-root refusal, atomic write, mode 0600).
|
|
128
|
+
*
|
|
129
|
+
* `core.signOut()` never throws — every failure is classified into
|
|
130
|
+
* `CoreSignOutResult` and surfaced via `mapCoreSignOutResult`.
|
|
131
|
+
*/
|
|
132
|
+
export declare function runAuthSignOut(options: AuthSignOutOptions): Promise<void>;
|
|
133
|
+
//# sourceMappingURL=signout.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signout.d.ts","sourceRoot":"","sources":["../../../src/commands/auth/signout.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,aAAa,IAAI,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAItE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAExD;;;;;GAKG;AACH,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,YAAY,CAAC;CACtB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,MAAM,MAAM,mBAAmB,GAAG,YAAY,GAAG,iBAAiB,GAAG,SAAS,GAAG,aAAa,CAAC;AAE/F;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,iBAAiB,GAAG,mBAAmB,CAUnF;AAED;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,iBAAiB,GAAG,MAAM,GAAG,IAAI,CAsBlF;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,MAAM,aAAa,GACrB;IAAE,MAAM,EAAE,YAAY,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,mBAAmB,CAAA;CAAE,GAC3F;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAEzC;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CAKjE;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,YAAY,GAAG,MAAM,CAQvF;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CAEtE;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAS/E"}
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
// SPDX-License-Identifier: AGPL-3.0-only
|
|
2
|
+
// Copyright (C) 2026 Oleksii PELYKH
|
|
3
|
+
import { AuthTokenPersistError, ConfigError, clearAuthToken, signOut } from "@ttctl/core";
|
|
4
|
+
import { resolveConfigForCli } from "../../lib/config-context.js";
|
|
5
|
+
import { formatYaml } from "../../lib/output.js";
|
|
6
|
+
/**
|
|
7
|
+
* Map a {@link CoreSignOutResult} to the CLI's {@link ServerLogOutOutcome}.
|
|
8
|
+
* Collapses the per-reason discriminator of `unreachable` / `invalid` into
|
|
9
|
+
* the four CLI-level outcomes. The full reason is surfaced separately via
|
|
10
|
+
* {@link serverLogOutStderrWarning} for the unreachable path.
|
|
11
|
+
*/
|
|
12
|
+
export function mapCoreSignOutResult(result) {
|
|
13
|
+
if (result.status === "logged-out")
|
|
14
|
+
return "logged-out";
|
|
15
|
+
if (result.status === "invalid") {
|
|
16
|
+
// no-session is the empty-token short-circuit; the CLI handles that
|
|
17
|
+
// before calling core.signOut(), so it shouldn't surface here. If it
|
|
18
|
+
// does (defensive), treat the same as the local "skipped" branch.
|
|
19
|
+
if (result.reason === "no-session")
|
|
20
|
+
return "skipped";
|
|
21
|
+
return "already-invalid";
|
|
22
|
+
}
|
|
23
|
+
return "unreachable";
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Build a human-readable stderr warning for the `unreachable` server-side
|
|
27
|
+
* outcome. Returns `null` for every other outcome — the success path stays
|
|
28
|
+
* quiet on stderr. The warning text names the reason and tells the user
|
|
29
|
+
* the bearer will age out as the load-bearing defense (24-72h empirical
|
|
30
|
+
* per `research/notes/02-auth-and-clients.md`).
|
|
31
|
+
*/
|
|
32
|
+
export function serverLogOutStderrWarning(result) {
|
|
33
|
+
if (result.status !== "unreachable")
|
|
34
|
+
return null;
|
|
35
|
+
const reason = result.reason;
|
|
36
|
+
let detail;
|
|
37
|
+
switch (reason.kind) {
|
|
38
|
+
case "transport":
|
|
39
|
+
detail = `transport error (${reason.reason})`;
|
|
40
|
+
break;
|
|
41
|
+
case "http-status":
|
|
42
|
+
detail = `HTTP ${reason.status.toString()} from talent_profile/graphql`;
|
|
43
|
+
break;
|
|
44
|
+
case "graphql-error":
|
|
45
|
+
detail = `GraphQL error: ${reason.message}`;
|
|
46
|
+
break;
|
|
47
|
+
case "payload-missing":
|
|
48
|
+
detail = "talent_profile/graphql returned an unrecognized payload shape (missing data.logOut)";
|
|
49
|
+
break;
|
|
50
|
+
case "success-false":
|
|
51
|
+
detail = "talent_profile/graphql returned data.logOut.success: false";
|
|
52
|
+
break;
|
|
53
|
+
}
|
|
54
|
+
return `warning: server-side LogOut could not be delivered (${detail}); local token cleared, the bearer will age out server-side in 24-72h`;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Render a `SignOutResult` for the human-readable `pretty` format. The
|
|
58
|
+
* success line is "Signed out." regardless of whether a token was
|
|
59
|
+
* removed — the user-facing semantics ("you are no longer signed in")
|
|
60
|
+
* are identical, and the AC explicitly calls out idempotency. Errors
|
|
61
|
+
* surface verbatim.
|
|
62
|
+
*/
|
|
63
|
+
export function formatSignOutPretty(result) {
|
|
64
|
+
if (result.status === "signed-out") {
|
|
65
|
+
return "Signed out.";
|
|
66
|
+
}
|
|
67
|
+
return `Sign-out failed: ${result.message}`;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Format a `SignOutResult` for the requested output mode. JSON and YAML
|
|
71
|
+
* shapes mirror the discriminated union exactly — `removed` and `path`
|
|
72
|
+
* on success, `message` on error — so scripts can branch on `removed`
|
|
73
|
+
* to detect the no-op case.
|
|
74
|
+
*/
|
|
75
|
+
export function formatSignOutOutput(result, output) {
|
|
76
|
+
if (output === "json") {
|
|
77
|
+
return JSON.stringify(result);
|
|
78
|
+
}
|
|
79
|
+
if (output === "yaml") {
|
|
80
|
+
return formatYaml(result);
|
|
81
|
+
}
|
|
82
|
+
return formatSignOutPretty(result);
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Map a `SignOutResult` to a process exit code. Both success branches
|
|
86
|
+
* (`removed: true` and `removed: false`) return 0 — signout is idempotent
|
|
87
|
+
* by AC. Only filesystem failures other than ENOENT exit non-zero.
|
|
88
|
+
*/
|
|
89
|
+
export function exitCodeForSignOutResult(result) {
|
|
90
|
+
return result.status === "signed-out" ? 0 : 1;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Run the `auth signout` command end-to-end:
|
|
94
|
+
* 1. Resolve `.ttctl.yaml` and read it (in-memory parsed via core).
|
|
95
|
+
* 2. If `auth.token` is present:
|
|
96
|
+
* a. Call `core.signOut(token)` to attempt server-side LogOut via
|
|
97
|
+
* the `LogOut` mutation against talent_profile/graphql.
|
|
98
|
+
* b. Remove the field via `clearAuthToken` (yaml.parseDocument +
|
|
99
|
+
* deleteIn — preserves comments and credentials).
|
|
100
|
+
* c. If the server-side call returned `unreachable`, emit a stderr
|
|
101
|
+
* warning. The local clear still ran — the bearer ages out
|
|
102
|
+
* server-side in 24-72h as the load-bearing defense.
|
|
103
|
+
* 3. If `auth.token` was already absent, exit 0 with `removed: false`
|
|
104
|
+
* and `serverLogOut: "skipped"` (idempotent no-op).
|
|
105
|
+
* 4. Emit the result and exit. Always 0 in the success path — server-
|
|
106
|
+
* side LogOut failure is a soft warning, not an exit-code signal.
|
|
107
|
+
*
|
|
108
|
+
* `clearAuthToken` enforces the same security gates as `persistAuthToken`
|
|
109
|
+
* (symlink refusal, sync-root refusal, atomic write, mode 0600).
|
|
110
|
+
*
|
|
111
|
+
* `core.signOut()` never throws — every failure is classified into
|
|
112
|
+
* `CoreSignOutResult` and surfaced via `mapCoreSignOutResult`.
|
|
113
|
+
*/
|
|
114
|
+
export async function runAuthSignOut(options) {
|
|
115
|
+
const { result, stderrWarning } = await performSignOut();
|
|
116
|
+
const rendered = formatSignOutOutput(result, options.output);
|
|
117
|
+
const stream = result.status === "signed-out" ? process.stdout : process.stderr;
|
|
118
|
+
if (stderrWarning !== null) {
|
|
119
|
+
process.stderr.write(stderrWarning + "\n");
|
|
120
|
+
}
|
|
121
|
+
stream.write(rendered + "\n");
|
|
122
|
+
process.exit(exitCodeForSignOutResult(result));
|
|
123
|
+
}
|
|
124
|
+
async function performSignOut() {
|
|
125
|
+
let configPath;
|
|
126
|
+
let token;
|
|
127
|
+
try {
|
|
128
|
+
const { config, path } = resolveConfigForCli();
|
|
129
|
+
configPath = path;
|
|
130
|
+
token = config.auth.token;
|
|
131
|
+
}
|
|
132
|
+
catch (err) {
|
|
133
|
+
if (err instanceof ConfigError) {
|
|
134
|
+
return { result: { status: "error", message: err.message }, stderrWarning: null };
|
|
135
|
+
}
|
|
136
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
137
|
+
return { result: { status: "error", message }, stderrWarning: null };
|
|
138
|
+
}
|
|
139
|
+
if (token === undefined) {
|
|
140
|
+
// Idempotent no-op — token field already absent. Don't open the file
|
|
141
|
+
// for write AND don't call talent_profile (nothing to call with). Report
|
|
142
|
+
// success with removed: false / serverLogOut: "skipped" so scripts can
|
|
143
|
+
// detect the no-op case.
|
|
144
|
+
return {
|
|
145
|
+
result: { status: "signed-out", removed: false, path: configPath, serverLogOut: "skipped" },
|
|
146
|
+
stderrWarning: null,
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
// Attempt server-side LogOut BEFORE clearing the local token. The
|
|
150
|
+
// ordering matters: we want the bearer in hand when calling LogOut so
|
|
151
|
+
// talent_profile can authenticate the request. core.signOut()
|
|
152
|
+
// never throws (every failure mode is classified into CoreSignOutResult),
|
|
153
|
+
// so this branch is safe to await without try/catch.
|
|
154
|
+
const coreResult = await signOut(token);
|
|
155
|
+
const serverLogOut = mapCoreSignOutResult(coreResult);
|
|
156
|
+
const stderrWarning = serverLogOutStderrWarning(coreResult);
|
|
157
|
+
try {
|
|
158
|
+
await clearAuthToken(configPath);
|
|
159
|
+
}
|
|
160
|
+
catch (err) {
|
|
161
|
+
if (err instanceof ConfigError || err instanceof AuthTokenPersistError) {
|
|
162
|
+
return { result: { status: "error", message: err.message }, stderrWarning };
|
|
163
|
+
}
|
|
164
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
165
|
+
return { result: { status: "error", message }, stderrWarning };
|
|
166
|
+
}
|
|
167
|
+
return {
|
|
168
|
+
result: { status: "signed-out", removed: true, path: configPath, serverLogOut },
|
|
169
|
+
stderrWarning,
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
//# sourceMappingURL=signout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signout.js","sourceRoot":"","sources":["../../../src/commands/auth/signout.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import type { AuthStatusResult } from "@ttctl/core";
|
|
2
|
+
import type { OutputFormat } from "../../lib/output.js";
|
|
3
|
+
/**
|
|
4
|
+
* Output format for `ttctl auth status`. Aligned with the cross-CLI
|
|
5
|
+
* `OutputFormat` post-#126: `pretty` (default) emits a human-readable
|
|
6
|
+
* single-line summary; `json` emits the `AuthStatusResult` shape
|
|
7
|
+
* verbatim for scripting; `yaml` emits the same shape as block-style
|
|
8
|
+
* YAML.
|
|
9
|
+
*/
|
|
10
|
+
export interface AuthStatusOptions {
|
|
11
|
+
output: OutputFormat;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Map an `AuthStatusResult` to a process exit code:
|
|
15
|
+
* - `valid` → 0 (everything OK)
|
|
16
|
+
* - `invalid` → 1 (auth-related; user must run `ttctl auth signin`)
|
|
17
|
+
* - `unreachable` → 2 (transport-level; transient, retryable)
|
|
18
|
+
*
|
|
19
|
+
* Three distinct codes are deliberate: shell consumers can branch on them
|
|
20
|
+
* without parsing stdout (`if ttctl auth status; then ... else case $? in 1)
|
|
21
|
+
* ... ;; 2) ... ;; esac`).
|
|
22
|
+
*/
|
|
23
|
+
export declare function exitCodeForAuthStatus(result: AuthStatusResult): number;
|
|
24
|
+
/**
|
|
25
|
+
* Render an `AuthStatusResult` for the human-readable `pretty` format.
|
|
26
|
+
* Keeps the user-facing strings here so the CLI surface owns wording
|
|
27
|
+
* (the core library returns stable machine-readable codes; this layer
|
|
28
|
+
* translates them to prose).
|
|
29
|
+
*
|
|
30
|
+
* Both `session-expired` and the rarer 200-with-malformed-payload cases
|
|
31
|
+
* collapse to the same "Session expired" message — from the user's
|
|
32
|
+
* perspective the next action is identical (re-run signin).
|
|
33
|
+
*/
|
|
34
|
+
export declare function formatAuthStatusPretty(result: AuthStatusResult): string;
|
|
35
|
+
/**
|
|
36
|
+
* Format an `AuthStatusResult` for the requested output mode. The JSON
|
|
37
|
+
* and YAML shapes mirror `AuthStatusResult` 1:1 — `email` only on
|
|
38
|
+
* `valid`, `reason` on the other two — which lets callers consume the
|
|
39
|
+
* same discriminated-union structure on the wire.
|
|
40
|
+
*/
|
|
41
|
+
export declare function formatAuthStatusOutput(result: AuthStatusResult, output: OutputFormat): string;
|
|
42
|
+
/**
|
|
43
|
+
* Run the `auth status` command end-to-end:
|
|
44
|
+
* 1. Resolve `.ttctl.yaml` (in-memory parsed via core). A missing/malformed
|
|
45
|
+
* config collapses to `invalid/no-session` — the user-facing
|
|
46
|
+
* "Run `ttctl auth signin`" hint is still the right next step, and
|
|
47
|
+
* surfacing the raw `ConfigError` would be more confusing than helpful
|
|
48
|
+
* in the read-only status path.
|
|
49
|
+
* 2. Read `config.auth.token` directly (no separate file load — the token
|
|
50
|
+
* lives inline in the YAML config post-#107).
|
|
51
|
+
* 3. Probe the gateway for session validity via `getAuthStatus(token)`.
|
|
52
|
+
* No token → invalid/no-session, short-circuited (no network call).
|
|
53
|
+
* 4. Emit the result in the requested format.
|
|
54
|
+
* 5. Exit the process with the corresponding code.
|
|
55
|
+
*
|
|
56
|
+
* `process.exit` is the terminal step: action handlers in commander otherwise
|
|
57
|
+
* resolve to `undefined` and the process keeps the libuv event loop spinning
|
|
58
|
+
* until natural exit, which is fine for CLI usage but loses the explicit
|
|
59
|
+
* exit-code contract this command needs.
|
|
60
|
+
*/
|
|
61
|
+
export declare function runAuthStatus(options: AuthStatusOptions): Promise<void>;
|
|
62
|
+
//# sourceMappingURL=status.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../src/commands/auth/status.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAIpD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAExD;;;;;;GAMG;AACH,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,YAAY,CAAC;CACtB;AAED;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM,CAItE;AAED;;;;;;;;;GASG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM,CAWvE;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,gBAAgB,EAAE,MAAM,EAAE,YAAY,GAAG,MAAM,CAQ7F;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAiB7E"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
// SPDX-License-Identifier: AGPL-3.0-only
|
|
2
|
+
// Copyright (C) 2026 Oleksii PELYKH
|
|
3
|
+
import { ConfigError, getAuthStatus } from "@ttctl/core";
|
|
4
|
+
import { resolveConfigForCli } from "../../lib/config-context.js";
|
|
5
|
+
import { formatYaml } from "../../lib/output.js";
|
|
6
|
+
/**
|
|
7
|
+
* Map an `AuthStatusResult` to a process exit code:
|
|
8
|
+
* - `valid` → 0 (everything OK)
|
|
9
|
+
* - `invalid` → 1 (auth-related; user must run `ttctl auth signin`)
|
|
10
|
+
* - `unreachable` → 2 (transport-level; transient, retryable)
|
|
11
|
+
*
|
|
12
|
+
* Three distinct codes are deliberate: shell consumers can branch on them
|
|
13
|
+
* without parsing stdout (`if ttctl auth status; then ... else case $? in 1)
|
|
14
|
+
* ... ;; 2) ... ;; esac`).
|
|
15
|
+
*/
|
|
16
|
+
export function exitCodeForAuthStatus(result) {
|
|
17
|
+
if (result.status === "valid")
|
|
18
|
+
return 0;
|
|
19
|
+
if (result.status === "invalid")
|
|
20
|
+
return 1;
|
|
21
|
+
return 2;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Render an `AuthStatusResult` for the human-readable `pretty` format.
|
|
25
|
+
* Keeps the user-facing strings here so the CLI surface owns wording
|
|
26
|
+
* (the core library returns stable machine-readable codes; this layer
|
|
27
|
+
* translates them to prose).
|
|
28
|
+
*
|
|
29
|
+
* Both `session-expired` and the rarer 200-with-malformed-payload cases
|
|
30
|
+
* collapse to the same "Session expired" message — from the user's
|
|
31
|
+
* perspective the next action is identical (re-run signin).
|
|
32
|
+
*/
|
|
33
|
+
export function formatAuthStatusPretty(result) {
|
|
34
|
+
if (result.status === "valid") {
|
|
35
|
+
return `Signed in as ${result.email}`;
|
|
36
|
+
}
|
|
37
|
+
if (result.status === "invalid") {
|
|
38
|
+
if (result.reason === "no-session") {
|
|
39
|
+
return "No session found. Run `ttctl auth signin`.";
|
|
40
|
+
}
|
|
41
|
+
return "Session expired. Run `ttctl auth signin`.";
|
|
42
|
+
}
|
|
43
|
+
return "Could not reach Toptal.";
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Format an `AuthStatusResult` for the requested output mode. The JSON
|
|
47
|
+
* and YAML shapes mirror `AuthStatusResult` 1:1 — `email` only on
|
|
48
|
+
* `valid`, `reason` on the other two — which lets callers consume the
|
|
49
|
+
* same discriminated-union structure on the wire.
|
|
50
|
+
*/
|
|
51
|
+
export function formatAuthStatusOutput(result, output) {
|
|
52
|
+
if (output === "json") {
|
|
53
|
+
return JSON.stringify(result);
|
|
54
|
+
}
|
|
55
|
+
if (output === "yaml") {
|
|
56
|
+
return formatYaml(result);
|
|
57
|
+
}
|
|
58
|
+
return formatAuthStatusPretty(result);
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Run the `auth status` command end-to-end:
|
|
62
|
+
* 1. Resolve `.ttctl.yaml` (in-memory parsed via core). A missing/malformed
|
|
63
|
+
* config collapses to `invalid/no-session` — the user-facing
|
|
64
|
+
* "Run `ttctl auth signin`" hint is still the right next step, and
|
|
65
|
+
* surfacing the raw `ConfigError` would be more confusing than helpful
|
|
66
|
+
* in the read-only status path.
|
|
67
|
+
* 2. Read `config.auth.token` directly (no separate file load — the token
|
|
68
|
+
* lives inline in the YAML config post-#107).
|
|
69
|
+
* 3. Probe the gateway for session validity via `getAuthStatus(token)`.
|
|
70
|
+
* No token → invalid/no-session, short-circuited (no network call).
|
|
71
|
+
* 4. Emit the result in the requested format.
|
|
72
|
+
* 5. Exit the process with the corresponding code.
|
|
73
|
+
*
|
|
74
|
+
* `process.exit` is the terminal step: action handlers in commander otherwise
|
|
75
|
+
* resolve to `undefined` and the process keeps the libuv event loop spinning
|
|
76
|
+
* until natural exit, which is fine for CLI usage but loses the explicit
|
|
77
|
+
* exit-code contract this command needs.
|
|
78
|
+
*/
|
|
79
|
+
export async function runAuthStatus(options) {
|
|
80
|
+
let token;
|
|
81
|
+
try {
|
|
82
|
+
const { config } = resolveConfigForCli();
|
|
83
|
+
token = config.auth.token ?? null;
|
|
84
|
+
}
|
|
85
|
+
catch (err) {
|
|
86
|
+
if (err instanceof ConfigError) {
|
|
87
|
+
const noSession = { status: "invalid", reason: "no-session" };
|
|
88
|
+
process.stdout.write(formatAuthStatusOutput(noSession, options.output) + "\n");
|
|
89
|
+
process.exit(exitCodeForAuthStatus(noSession));
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
throw err;
|
|
93
|
+
}
|
|
94
|
+
const result = await getAuthStatus(token);
|
|
95
|
+
process.stdout.write(formatAuthStatusOutput(result, options.output) + "\n");
|
|
96
|
+
process.exit(exitCodeForAuthStatus(result));
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/commands/auth/status.ts"],"names":[],"mappings":"AAAA,yCAAyC;AACzC,oCAAoC;AAEpC,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAGzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAcjD;;;;;;;;;GASG;AACH,MAAM,UAAU,qBAAqB,CAAC,MAAwB;IAC5D,IAAI,MAAM,CAAC,MAAM,KAAK,OAAO;QAAE,OAAO,CAAC,CAAC;IACxC,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS;QAAE,OAAO,CAAC,CAAC;IAC1C,OAAO,CAAC,CAAC;AACX,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,sBAAsB,CAAC,MAAwB;IAC7D,IAAI,MAAM,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;QAC9B,OAAO,gBAAgB,MAAM,CAAC,KAAK,EAAE,CAAC;IACxC,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAChC,IAAI,MAAM,CAAC,MAAM,KAAK,YAAY,EAAE,CAAC;YACnC,OAAO,4CAA4C,CAAC;QACtD,CAAC;QACD,OAAO,2CAA2C,CAAC;IACrD,CAAC;IACD,OAAO,yBAAyB,CAAC;AACnC,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,sBAAsB,CAAC,MAAwB,EAAE,MAAoB;IACnF,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACtB,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAChC,CAAC;IACD,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACtB,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC;IAC5B,CAAC;IACD,OAAO,sBAAsB,CAAC,MAAM,CAAC,CAAC;AACxC,CAAC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAA0B;IAC5D,IAAI,KAAoB,CAAC;IACzB,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,GAAG,mBAAmB,EAAE,CAAC;QACzC,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC;IACpC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,WAAW,EAAE,CAAC;YAC/B,MAAM,SAAS,GAAqB,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC;YAChF,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,sBAAsB,CAAC,SAAS,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC;YAC/E,OAAO,CAAC,IAAI,CAAC,qBAAqB,CAAC,SAAS,CAAC,CAAC,CAAC;YAC/C,OAAO;QACT,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,KAAK,CAAC,CAAC;IAC1C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,sBAAsB,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC;IAC5E,OAAO,CAAC,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC,CAAC;AAC9C,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { OutputFormat } from "../../lib/output.js";
|
|
2
|
+
/**
|
|
3
|
+
* Action handler for `ttctl availability allocated-hours show`. Reads
|
|
4
|
+
* just the viewer-scoped `allocatedHours` value.
|
|
5
|
+
*
|
|
6
|
+
* Throws `AvailabilityError("UNKNOWN")` (via the service) when the
|
|
7
|
+
* viewer-role payload is missing the field — defensive only.
|
|
8
|
+
*/
|
|
9
|
+
export declare function runAllocatedHoursShow(output: OutputFormat): Promise<void>;
|
|
10
|
+
/**
|
|
11
|
+
* Action handler for `ttctl availability allocated-hours set --hours <n>`.
|
|
12
|
+
* Updates the viewer-scoped allocated-hours value via
|
|
13
|
+
* `UpdateAllocatedHours`.
|
|
14
|
+
*
|
|
15
|
+
* The CLI surface is required-arg (`--hours`); commander applies the
|
|
16
|
+
* `--hours` parser before this handler runs, so the value is already a
|
|
17
|
+
* validated non-negative integer.
|
|
18
|
+
*
|
|
19
|
+
* Returns the post-update `{ allocatedHours, hiredHours }` payload in
|
|
20
|
+
* the success-update envelope.
|
|
21
|
+
*/
|
|
22
|
+
export interface AllocatedHoursSetOptions {
|
|
23
|
+
hours: number;
|
|
24
|
+
output: OutputFormat;
|
|
25
|
+
}
|
|
26
|
+
export declare function runAllocatedHoursSet(opts: AllocatedHoursSetOptions): Promise<void>;
|
|
27
|
+
//# sourceMappingURL=allocated-hours.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"allocated-hours.d.ts","sourceRoot":"","sources":["../../../src/commands/availability/allocated-hours.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAIxD;;;;;;GAMG;AACH,wBAAsB,qBAAqB,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAa/E;AAED;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,wBAAwB;IACvC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,YAAY,CAAC;CACtB;AAED,wBAAsB,oBAAoB,CAAC,IAAI,EAAE,wBAAwB,GAAG,OAAO,CAAC,IAAI,CAAC,CAiCxF"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
// SPDX-License-Identifier: AGPL-3.0-only
|
|
2
|
+
// Copyright (C) 2026 Oleksii PELYKH
|
|
3
|
+
import { availability } from "@ttctl/core";
|
|
4
|
+
import { getCliDryRun } from "../../lib/dry-run.js";
|
|
5
|
+
import { emitResult } from "../../lib/output.js";
|
|
6
|
+
import { emitDryRunSuccess, emitUpdateSuccess } from "../../lib/envelopes.js";
|
|
7
|
+
import { handleAvailabilityError, loadAuthTokenOrExit } from "./shared.js";
|
|
8
|
+
/**
|
|
9
|
+
* Action handler for `ttctl availability allocated-hours show`. Reads
|
|
10
|
+
* just the viewer-scoped `allocatedHours` value.
|
|
11
|
+
*
|
|
12
|
+
* Throws `AvailabilityError("UNKNOWN")` (via the service) when the
|
|
13
|
+
* viewer-role payload is missing the field — defensive only.
|
|
14
|
+
*/
|
|
15
|
+
export async function runAllocatedHoursShow(output) {
|
|
16
|
+
const token = await loadAuthTokenOrExit("availability allocated-hours show", output);
|
|
17
|
+
let data;
|
|
18
|
+
try {
|
|
19
|
+
data = await availability.allocatedHours.show(token);
|
|
20
|
+
}
|
|
21
|
+
catch (err) {
|
|
22
|
+
handleAvailabilityError("availability allocated-hours show", err, output);
|
|
23
|
+
}
|
|
24
|
+
emitResult(data, output, {
|
|
25
|
+
pretty: (d) => `Allocated hours: ${d.allocatedHours.toString()} h/week`,
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
export async function runAllocatedHoursSet(opts) {
|
|
29
|
+
const token = await loadAuthTokenOrExit("availability allocated-hours set", opts.output);
|
|
30
|
+
const dryRun = getCliDryRun();
|
|
31
|
+
let outcome;
|
|
32
|
+
try {
|
|
33
|
+
outcome = await availability.allocatedHours.set(token, opts.hours, { dryRun });
|
|
34
|
+
}
|
|
35
|
+
catch (err) {
|
|
36
|
+
handleAvailabilityError("availability allocated-hours set", err, opts.output);
|
|
37
|
+
}
|
|
38
|
+
if (outcome.kind === "preview") {
|
|
39
|
+
emitDryRunSuccess({
|
|
40
|
+
operation: "availability.allocated-hours.set",
|
|
41
|
+
format: opts.output,
|
|
42
|
+
preview: outcome.preview,
|
|
43
|
+
});
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
const updated = outcome.result;
|
|
47
|
+
emitUpdateSuccess({
|
|
48
|
+
operation: "availability.allocated-hours.set",
|
|
49
|
+
format: opts.output,
|
|
50
|
+
updated,
|
|
51
|
+
prettySummary: `allocated hours = ${updated.allocatedHours.toString()} h/week`,
|
|
52
|
+
prettyEntity: (data) => {
|
|
53
|
+
const lines = [`Allocated: ${data.allocatedHours.toString()} h/week`];
|
|
54
|
+
if (data.hiredHours !== null)
|
|
55
|
+
lines.push(`Hired: ${data.hiredHours.toString()} h/week`);
|
|
56
|
+
return lines.join("\n");
|
|
57
|
+
},
|
|
58
|
+
notice: updated.notice ?? undefined,
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=allocated-hours.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"allocated-hours.js","sourceRoot":"","sources":["../../../src/commands/availability/allocated-hours.ts"],"names":[],"mappings":"AAAA,yCAAyC;AACzC,oCAAoC;AAEpC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEjD,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC9E,OAAO,EAAE,uBAAuB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAE3E;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,MAAoB;IAC9D,MAAM,KAAK,GAAG,MAAM,mBAAmB,CAAC,mCAAmC,EAAE,MAAM,CAAC,CAAC;IAErF,IAAI,IAAkE,CAAC;IACvE,IAAI,CAAC;QACH,IAAI,GAAG,MAAM,YAAY,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACvD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,uBAAuB,CAAC,mCAAmC,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;IAC5E,CAAC;IAED,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE;QACvB,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,oBAAoB,CAAC,CAAC,cAAc,CAAC,QAAQ,EAAE,SAAS;KACxE,CAAC,CAAC;AACL,CAAC;AAmBD,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,IAA8B;IACvE,MAAM,KAAK,GAAG,MAAM,mBAAmB,CAAC,kCAAkC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IACzF,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;IAE9B,IAAI,OAA8C,CAAC;IACnD,IAAI,CAAC;QACH,OAAO,GAAG,MAAM,YAAY,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;IACjF,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,uBAAuB,CAAC,kCAAkC,EAAE,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAChF,CAAC;IAED,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC/B,iBAAiB,CAAC;YAChB,SAAS,EAAE,kCAAkC;YAC7C,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,OAAO,EAAE,OAAO,CAAC,OAAO;SACzB,CAAC,CAAC;QACH,OAAO;IACT,CAAC;IAED,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC;IAC/B,iBAAiB,CAAC;QAChB,SAAS,EAAE,kCAAkC;QAC7C,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,OAAO;QACP,aAAa,EAAE,qBAAqB,OAAO,CAAC,cAAc,CAAC,QAAQ,EAAE,SAAS;QAC9E,YAAY,EAAE,CAAC,IAAI,EAAE,EAAE;YACrB,MAAM,KAAK,GAAa,CAAC,cAAc,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;YAChF,IAAI,IAAI,CAAC,UAAU,KAAK,IAAI;gBAAE,KAAK,CAAC,IAAI,CAAC,cAAc,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;YAC5F,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;QACD,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,SAAS;KACpC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
/**
|
|
3
|
+
* Build the `ttctl availability` command tree (#146 amended spec). Five
|
|
4
|
+
* leaves across the top-level group and two nested sub-groups
|
|
5
|
+
* (`working-hours`, `allocated-hours`):
|
|
6
|
+
*
|
|
7
|
+
* | Leaf | Description |
|
|
8
|
+
* |-------------------------------------|------------------------------------------|
|
|
9
|
+
* | `show` | Full availability snapshot |
|
|
10
|
+
* | `working-hours show` | Just the time-zone + daily window subset |
|
|
11
|
+
* | `working-hours set [--start/--end/--time-zone/--flex-start/--flex-end]` | Partial-update working hours |
|
|
12
|
+
* | `allocated-hours show` | Just the allocated-hours value |
|
|
13
|
+
* | `allocated-hours set --hours <n>` | Set allocated-hours |
|
|
14
|
+
*
|
|
15
|
+
* **Vocabulary note**: per-engagement "time off" is owned by
|
|
16
|
+
* `ttctl engagements breaks {list, add, remove}` — there is no parallel
|
|
17
|
+
* `ttctl availability time-off` surface (the underlying API would be
|
|
18
|
+
* identical to the engagement-break one). Booking-page "lead time" /
|
|
19
|
+
* "minimum scheduling notice" is a different surface and is not
|
|
20
|
+
* surfaced in v1.
|
|
21
|
+
*
|
|
22
|
+
* **Out of scope for v1** (per #146 amended spec from 2026-05-11):
|
|
23
|
+
* - Time-off list/add/remove (use `engagements breaks` instead)
|
|
24
|
+
* - Lead-time / minimum-scheduling-notice setting (booking-page
|
|
25
|
+
* follow-up)
|
|
26
|
+
* - Setting `meetingTimeFrom` / `meetingTimeTo` (read-only)
|
|
27
|
+
* - Per-engagement availability overrides (no API support)
|
|
28
|
+
*/
|
|
29
|
+
export declare function buildAvailabilityCommand(): Command;
|
|
30
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/availability/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAgC,MAAM,WAAW,CAAC;AAUlE;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,wBAAwB,IAAI,OAAO,CAuGlD"}
|