@ttctl/cli 0.0.0 → 0.1.0-rc.1
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 +31 -0
- package/dist/commands/profile/certifications/index.d.ts.map +1 -0
- package/dist/commands/profile/certifications/index.js +298 -0
- package/dist/commands/profile/certifications/index.js.map +1 -0
- package/dist/commands/profile/education/index.d.ts +28 -0
- package/dist/commands/profile/education/index.d.ts.map +1 -0
- package/dist/commands/profile/education/index.js +287 -0
- package/dist/commands/profile/education/index.js.map +1 -0
- package/dist/commands/profile/employment/index.d.ts +40 -0
- package/dist/commands/profile/employment/index.d.ts.map +1 -0
- package/dist/commands/profile/employment/index.js +364 -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 +20 -0
- package/dist/commands/profile/external/index.d.ts.map +1 -0
- package/dist/commands/profile/external/index.js +102 -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/update.d.ts +32 -0
- package/dist/commands/profile/external/update.d.ts.map +1 -0
- package/dist/commands/profile/external/update.js +118 -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 +36 -0
- package/dist/commands/profile/industries/index.d.ts.map +1 -0
- package/dist/commands/profile/industries/index.js +230 -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,18 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
/**
|
|
3
|
+
* Build the `ttctl profile basic` command tree. Exposes four leaves:
|
|
4
|
+
*
|
|
5
|
+
* - `show` — print the user's profile summary
|
|
6
|
+
* - `update` — update bio / headline (dispatches to `profile.basic.set()`;
|
|
7
|
+
* CLI verb is `update` per #68 epic verb economy, core
|
|
8
|
+
* function is `set` per #69's `updateProfile` → `set` rename)
|
|
9
|
+
* - `photo show` — print URLs of the user's profile photo variants
|
|
10
|
+
* - `photo upload` — upload a new profile photo from a local file
|
|
11
|
+
*
|
|
12
|
+
* The `photo` group is itself a Commander.js sub-command tree so users
|
|
13
|
+
* type `ttctl profile basic photo show` rather than the flatter
|
|
14
|
+
* `ttctl profile basic photo-show`. MCP tool names use the joined form
|
|
15
|
+
* (`ttctl_profile_basic_photo_show`) per project policy.
|
|
16
|
+
*/
|
|
17
|
+
export declare function buildProfileBasicCommand(): Command;
|
|
18
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/commands/profile/basic/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAU,MAAM,WAAW,CAAC;AAU5C;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,wBAAwB,IAAI,OAAO,CAwElD"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
// SPDX-License-Identifier: AGPL-3.0-only
|
|
2
|
+
// Copyright (C) 2026 Oleksii PELYKH
|
|
3
|
+
import { Command, Option } from "commander";
|
|
4
|
+
import { markMutation } from "../../../lib/dry-run.js";
|
|
5
|
+
import { OUTPUT_FORMATS } from "../../../lib/output.js";
|
|
6
|
+
import { runProfileBasicPhotoShow } from "./photo-show.js";
|
|
7
|
+
import { runProfileBasicPhotoUpload } from "./photo-upload.js";
|
|
8
|
+
import { runProfileBasicShow } from "./show.js";
|
|
9
|
+
import { runProfileBasicUpdate } from "./set.js";
|
|
10
|
+
/**
|
|
11
|
+
* Build the `ttctl profile basic` command tree. Exposes four leaves:
|
|
12
|
+
*
|
|
13
|
+
* - `show` — print the user's profile summary
|
|
14
|
+
* - `update` — update bio / headline (dispatches to `profile.basic.set()`;
|
|
15
|
+
* CLI verb is `update` per #68 epic verb economy, core
|
|
16
|
+
* function is `set` per #69's `updateProfile` → `set` rename)
|
|
17
|
+
* - `photo show` — print URLs of the user's profile photo variants
|
|
18
|
+
* - `photo upload` — upload a new profile photo from a local file
|
|
19
|
+
*
|
|
20
|
+
* The `photo` group is itself a Commander.js sub-command tree so users
|
|
21
|
+
* type `ttctl profile basic photo show` rather than the flatter
|
|
22
|
+
* `ttctl profile basic photo-show`. MCP tool names use the joined form
|
|
23
|
+
* (`ttctl_profile_basic_photo_show`) per project policy.
|
|
24
|
+
*/
|
|
25
|
+
export function buildProfileBasicCommand() {
|
|
26
|
+
const basic = new Command("basic").description("View and update the basic-info section of your profile (bio, headline, photo)");
|
|
27
|
+
basic
|
|
28
|
+
.command("show")
|
|
29
|
+
.description("Print a summary of the signed-in user's Toptal Talent profile")
|
|
30
|
+
.addOption(new Option("-o, --output <format>", "output format")
|
|
31
|
+
.choices(OUTPUT_FORMATS)
|
|
32
|
+
.default("pretty"))
|
|
33
|
+
.action(async (options) => {
|
|
34
|
+
await runProfileBasicShow(options.output);
|
|
35
|
+
});
|
|
36
|
+
// Marked as a mutation (issue #52) so the global `--dry-run` flag
|
|
37
|
+
// routes through to `profile.basic.set()`'s `dryRun` option. The
|
|
38
|
+
// top-level alias `ttctl profile update` (registered in
|
|
39
|
+
// `commands/profile/index.ts`) is also marked. Photo upload (a
|
|
40
|
+
// mutation) is NOT marked yet — until #10 lands the MCP tools and
|
|
41
|
+
// the dry-run path is wired into multipart mutations, the global
|
|
42
|
+
// flag is a no-op there and the read-command stderr note (slightly
|
|
43
|
+
// inaccurate text) fires. Tracked in the same #52 § Out of Scope
|
|
44
|
+
// text and addressable in a follow-up.
|
|
45
|
+
markMutation(basic
|
|
46
|
+
.command("update")
|
|
47
|
+
.description("Update editable fields on the signed-in user's profile (currently bio + headline)")
|
|
48
|
+
.option("--bio <text>", 'long-form bio (inline text, "-" for stdin, or "@path" to read from file)')
|
|
49
|
+
.option("--headline <text>", 'short tagline (inline text, "-" for stdin, or "@path" to read from file)')
|
|
50
|
+
.option("--edit", "open $EDITOR to compose the bio interactively (cannot be combined with --bio)")
|
|
51
|
+
.addOption(new Option("-o, --output <format>", "output format")
|
|
52
|
+
.choices(OUTPUT_FORMATS)
|
|
53
|
+
.default("pretty"))
|
|
54
|
+
.action(async (options) => {
|
|
55
|
+
await runProfileBasicUpdate(options);
|
|
56
|
+
}));
|
|
57
|
+
const photo = new Command("photo").description("View or upload the photo on your profile");
|
|
58
|
+
photo
|
|
59
|
+
.command("show")
|
|
60
|
+
.description("Print the URLs of the signed-in user's profile photo variants")
|
|
61
|
+
.addOption(new Option("-o, --output <format>", "output format")
|
|
62
|
+
.choices(OUTPUT_FORMATS)
|
|
63
|
+
.default("pretty"))
|
|
64
|
+
.action(async (options) => {
|
|
65
|
+
await runProfileBasicPhotoShow(options.output);
|
|
66
|
+
});
|
|
67
|
+
photo
|
|
68
|
+
.command("upload <file>")
|
|
69
|
+
.description("Upload a new profile photo from a local image file (jpg / png / gif / webp)")
|
|
70
|
+
.addOption(new Option("-o, --output <format>", "output format")
|
|
71
|
+
.choices(OUTPUT_FORMATS)
|
|
72
|
+
.default("pretty"))
|
|
73
|
+
.action(async (file, options) => {
|
|
74
|
+
await runProfileBasicPhotoUpload(file, options.output);
|
|
75
|
+
});
|
|
76
|
+
basic.addCommand(photo);
|
|
77
|
+
return basic;
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/commands/profile/basic/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { profile } from "@ttctl/core";
|
|
2
|
+
import type { OutputFormat } from "../../../lib/output.js";
|
|
3
|
+
/**
|
|
4
|
+
* Action handler for `ttctl profile basic photo show`. Loads the persisted
|
|
5
|
+
* auth token and dispatches `profile.basic.photoShow()` to fetch the URLs
|
|
6
|
+
* of the user's profile photo (default / original / small variants plus
|
|
7
|
+
* the server's recommended crop rectangle). Routes the typed payload
|
|
8
|
+
* through `emitResult` (#71) so users can switch between text / JSON /
|
|
9
|
+
* table output.
|
|
10
|
+
*
|
|
11
|
+
* Domain errors are surfaced via `handlePhotoShowError`, which knows how
|
|
12
|
+
* to render `Cf403Error` walkthroughs and `ProfileError` codes.
|
|
13
|
+
*/
|
|
14
|
+
export declare function runProfileBasicPhotoShow(format: OutputFormat): Promise<void>;
|
|
15
|
+
/**
|
|
16
|
+
* Format the typed photo payload as a multi-line summary. Pure function —
|
|
17
|
+
* no I/O — directly unit-testable. Each variant URL gets its own line;
|
|
18
|
+
* the cropped rectangle and resolution-readiness flag are summarised at
|
|
19
|
+
* the bottom for quick visual inspection.
|
|
20
|
+
*/
|
|
21
|
+
export declare function formatPhotoText(payload: profile.basic.PhotoUrl): string;
|
|
22
|
+
/**
|
|
23
|
+
* Format the typed photo payload as a `cli-table3`-rendered key/value
|
|
24
|
+
* table. Same field selection as `formatPhotoText`. Width adapts to the
|
|
25
|
+
* terminal but never narrower than enough for a wrapped URL.
|
|
26
|
+
*/
|
|
27
|
+
export declare function formatPhotoTable(payload: profile.basic.PhotoUrl, terminalWidth?: number): string;
|
|
28
|
+
//# sourceMappingURL=photo-show.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"photo-show.d.ts","sourceRoot":"","sources":["../../../../src/commands/profile/basic/photo-show.ts"],"names":[],"mappings":"AAIA,OAAO,EAAc,OAAO,EAAE,MAAM,aAAa,CAAC;AAMlD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAG3D;;;;;;;;;;GAUG;AACH,wBAAsB,wBAAwB,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAelF;AA8BD;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,QAAQ,GAAG,MAAM,CAcvE;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,QAAQ,EAC/B,aAAa,GAAE,MAAqC,GACnD,MAAM,CAmBR"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
// SPDX-License-Identifier: AGPL-3.0-only
|
|
2
|
+
// Copyright (C) 2026 Oleksii PELYKH
|
|
3
|
+
import Table from "cli-table3";
|
|
4
|
+
import { TtctlError, profile } from "@ttctl/core";
|
|
5
|
+
import { presentTtctlError } from "../../../errors.js";
|
|
6
|
+
import { emitErrorAndExit } from "../../../lib/envelopes.js";
|
|
7
|
+
import { emitResult } from "../../../lib/output.js";
|
|
8
|
+
import { loadAuthTokenOrExit } from "../shared.js";
|
|
9
|
+
/**
|
|
10
|
+
* Action handler for `ttctl profile basic photo show`. Loads the persisted
|
|
11
|
+
* auth token and dispatches `profile.basic.photoShow()` to fetch the URLs
|
|
12
|
+
* of the user's profile photo (default / original / small variants plus
|
|
13
|
+
* the server's recommended crop rectangle). Routes the typed payload
|
|
14
|
+
* through `emitResult` (#71) so users can switch between text / JSON /
|
|
15
|
+
* table output.
|
|
16
|
+
*
|
|
17
|
+
* Domain errors are surfaced via `handlePhotoShowError`, which knows how
|
|
18
|
+
* to render `Cf403Error` walkthroughs and `ProfileError` codes.
|
|
19
|
+
*/
|
|
20
|
+
export async function runProfileBasicPhotoShow(format) {
|
|
21
|
+
const token = await loadAuthTokenOrExit("profile photo show", format);
|
|
22
|
+
let photo;
|
|
23
|
+
try {
|
|
24
|
+
photo = await profile.basic.photoShow(token);
|
|
25
|
+
}
|
|
26
|
+
catch (err) {
|
|
27
|
+
handlePhotoShowError(err, format);
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
emitResult(photo, format, {
|
|
31
|
+
pretty: formatPhotoText,
|
|
32
|
+
table: formatPhotoTable,
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
function handlePhotoShowError(err, format) {
|
|
36
|
+
if (err instanceof TtctlError) {
|
|
37
|
+
if (format === "pretty")
|
|
38
|
+
presentTtctlError(err);
|
|
39
|
+
const errors = [{ code: err.code, message: err.message, hint: err.recovery }];
|
|
40
|
+
emitErrorAndExit({
|
|
41
|
+
operation: "profile.basic.photo.show",
|
|
42
|
+
format,
|
|
43
|
+
errors,
|
|
44
|
+
exitCode: err.code === "CF_403_CLEARANCE" || err.code === "CF_403_PERSISTENT" ? 2 : 1,
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
if (err instanceof profile.basic.ProfileError) {
|
|
48
|
+
emitErrorAndExit({
|
|
49
|
+
operation: "profile.basic.photo.show",
|
|
50
|
+
format,
|
|
51
|
+
errors: [{ code: err.code, message: err.message }],
|
|
52
|
+
prettySummary: `profile photo show failed (${err.code}): ${err.message}`,
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
56
|
+
emitErrorAndExit({
|
|
57
|
+
operation: "profile.basic.photo.show",
|
|
58
|
+
format,
|
|
59
|
+
errors: [{ code: "INTERNAL_ERROR", message }],
|
|
60
|
+
prettySummary: `profile photo show failed: ${message}`,
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Format the typed photo payload as a multi-line summary. Pure function —
|
|
65
|
+
* no I/O — directly unit-testable. Each variant URL gets its own line;
|
|
66
|
+
* the cropped rectangle and resolution-readiness flag are summarised at
|
|
67
|
+
* the bottom for quick visual inspection.
|
|
68
|
+
*/
|
|
69
|
+
export function formatPhotoText(payload) {
|
|
70
|
+
const lines = [];
|
|
71
|
+
if (payload.default !== null)
|
|
72
|
+
lines.push(`default: ${payload.default}`);
|
|
73
|
+
if (payload.original !== null)
|
|
74
|
+
lines.push(`original: ${payload.original}`);
|
|
75
|
+
if (payload.small !== null)
|
|
76
|
+
lines.push(`small: ${payload.small}`);
|
|
77
|
+
if (lines.length === 0) {
|
|
78
|
+
lines.push("(no photo set)");
|
|
79
|
+
}
|
|
80
|
+
if (payload.cropped !== null) {
|
|
81
|
+
const c = payload.cropped;
|
|
82
|
+
lines.push(`cropped: x=${c.x.toString()} y=${c.y.toString()} ${c.width.toString()}×${c.height.toString()}`);
|
|
83
|
+
}
|
|
84
|
+
lines.push(`resolution: ${payload.isResolutionSatisfied ? "OK" : "below requirements"}`);
|
|
85
|
+
return lines.join("\n");
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Format the typed photo payload as a `cli-table3`-rendered key/value
|
|
89
|
+
* table. Same field selection as `formatPhotoText`. Width adapts to the
|
|
90
|
+
* terminal but never narrower than enough for a wrapped URL.
|
|
91
|
+
*/
|
|
92
|
+
export function formatPhotoTable(payload, terminalWidth = process.stdout.columns || 80) {
|
|
93
|
+
// 18 cols leaves room for "resolution_ok" (13 chars) plus cli-table3
|
|
94
|
+
// padding (2 chars per side), the longest key in the table.
|
|
95
|
+
const fieldWidth = 18;
|
|
96
|
+
const valueWidth = Math.max(40, terminalWidth - fieldWidth - 5);
|
|
97
|
+
const table = new Table({
|
|
98
|
+
head: ["Field", "Value"],
|
|
99
|
+
colWidths: [fieldWidth, valueWidth],
|
|
100
|
+
wordWrap: true,
|
|
101
|
+
});
|
|
102
|
+
table.push(["default", payload.default ?? "(unset)"]);
|
|
103
|
+
table.push(["original", payload.original ?? "(unset)"]);
|
|
104
|
+
table.push(["small", payload.small ?? "(unset)"]);
|
|
105
|
+
if (payload.cropped !== null) {
|
|
106
|
+
const c = payload.cropped;
|
|
107
|
+
table.push(["cropped", `x=${c.x.toString()} y=${c.y.toString()} ${c.width.toString()}×${c.height.toString()}`]);
|
|
108
|
+
}
|
|
109
|
+
table.push(["resolution_ok", payload.isResolutionSatisfied ? "true" : "false"]);
|
|
110
|
+
return table.toString();
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=photo-show.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"photo-show.js","sourceRoot":"","sources":["../../../../src/commands/profile/basic/photo-show.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { OutputFormat } from "../../../lib/output.js";
|
|
2
|
+
/**
|
|
3
|
+
* Action handler for `ttctl profile basic photo upload <file>`. Reads the
|
|
4
|
+
* file path the user supplied (commander.js positional argument), loads
|
|
5
|
+
* the persisted auth token, and dispatches `profile.basic.photoUpload()`.
|
|
6
|
+
* Emits the v0.4 update envelope (#128) — photo upload is conceptually a
|
|
7
|
+
* profile-photo update.
|
|
8
|
+
*/
|
|
9
|
+
export declare function runProfileBasicPhotoUpload(filePath: string, format: OutputFormat): Promise<void>;
|
|
10
|
+
//# sourceMappingURL=photo-upload.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"photo-upload.d.ts","sourceRoot":"","sources":["../../../../src/commands/profile/basic/photo-upload.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAI3D;;;;;;GAMG;AACH,wBAAsB,0BAA0B,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAkBtG"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
// SPDX-License-Identifier: AGPL-3.0-only
|
|
2
|
+
// Copyright (C) 2026 Oleksii PELYKH
|
|
3
|
+
import { TtctlError, profile } from "@ttctl/core";
|
|
4
|
+
import { presentTtctlError } from "../../../errors.js";
|
|
5
|
+
import { emitErrorAndExit, emitUpdateSuccess } from "../../../lib/envelopes.js";
|
|
6
|
+
import { loadAuthTokenOrExit } from "../shared.js";
|
|
7
|
+
import { formatPhotoText } from "./photo-show.js";
|
|
8
|
+
/**
|
|
9
|
+
* Action handler for `ttctl profile basic photo upload <file>`. Reads the
|
|
10
|
+
* file path the user supplied (commander.js positional argument), loads
|
|
11
|
+
* the persisted auth token, and dispatches `profile.basic.photoUpload()`.
|
|
12
|
+
* Emits the v0.4 update envelope (#128) — photo upload is conceptually a
|
|
13
|
+
* profile-photo update.
|
|
14
|
+
*/
|
|
15
|
+
export async function runProfileBasicPhotoUpload(filePath, format) {
|
|
16
|
+
const token = await loadAuthTokenOrExit("profile photo upload", format);
|
|
17
|
+
let result;
|
|
18
|
+
try {
|
|
19
|
+
result = await profile.basic.photoUpload(token, { file: filePath });
|
|
20
|
+
}
|
|
21
|
+
catch (err) {
|
|
22
|
+
handlePhotoUploadError(err, format);
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
emitUpdateSuccess({
|
|
26
|
+
operation: "profile.basic.photo-upload",
|
|
27
|
+
format,
|
|
28
|
+
updated: result,
|
|
29
|
+
prettySummary: "Photo updated.",
|
|
30
|
+
prettyEntity: formatPhotoText,
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
function handlePhotoUploadError(err, format) {
|
|
34
|
+
if (err instanceof TtctlError) {
|
|
35
|
+
if (format === "pretty")
|
|
36
|
+
presentTtctlError(err);
|
|
37
|
+
const errors = [{ code: err.code, message: err.message, hint: err.recovery }];
|
|
38
|
+
emitErrorAndExit({
|
|
39
|
+
operation: "profile.basic.photo-upload",
|
|
40
|
+
format,
|
|
41
|
+
errors,
|
|
42
|
+
exitCode: err.code === "CF_403_CLEARANCE" || err.code === "CF_403_PERSISTENT" ? 2 : 1,
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
if (err instanceof profile.basic.ProfileError) {
|
|
46
|
+
emitErrorAndExit({
|
|
47
|
+
operation: "profile.basic.photo-upload",
|
|
48
|
+
format,
|
|
49
|
+
errors: [{ code: err.code, message: err.message }],
|
|
50
|
+
prettySummary: `profile photo upload failed (${err.code}): ${err.message}`,
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
54
|
+
emitErrorAndExit({
|
|
55
|
+
operation: "profile.basic.photo-upload",
|
|
56
|
+
format,
|
|
57
|
+
errors: [{ code: "INTERNAL_ERROR", message }],
|
|
58
|
+
prettySummary: `profile photo upload failed: ${message}`,
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=photo-upload.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"photo-upload.js","sourceRoot":"","sources":["../../../../src/commands/profile/basic/photo-upload.ts"],"names":[],"mappings":"AAAA,yCAAyC;AACzC,oCAAoC;AAEpC,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAElD,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAGhF,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAElD;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAAC,QAAgB,EAAE,MAAoB;IACrF,MAAM,KAAK,GAAG,MAAM,mBAAmB,CAAC,sBAAsB,EAAE,MAAM,CAAC,CAAC;IAExE,IAAI,MAA8B,CAAC;IACnC,IAAI,CAAC;QACH,MAAM,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;IACtE,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,sBAAsB,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QACpC,OAAO;IACT,CAAC;IAED,iBAAiB,CAAC;QAChB,SAAS,EAAE,4BAA4B;QACvC,MAAM;QACN,OAAO,EAAE,MAAM;QACf,aAAa,EAAE,gBAAgB;QAC/B,YAAY,EAAE,eAAe;KAC9B,CAAC,CAAC;AACL,CAAC;AAED,SAAS,sBAAsB,CAAC,GAAY,EAAE,MAAoB;IAChE,IAAI,GAAG,YAAY,UAAU,EAAE,CAAC;QAC9B,IAAI,MAAM,KAAK,QAAQ;YAAE,iBAAiB,CAAC,GAAG,CAAC,CAAC;QAChD,MAAM,MAAM,GAAoB,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC/F,gBAAgB,CAAC;YACf,SAAS,EAAE,4BAA4B;YACvC,MAAM;YACN,MAAM;YACN,QAAQ,EAAE,GAAG,CAAC,IAAI,KAAK,kBAAkB,IAAI,GAAG,CAAC,IAAI,KAAK,mBAAmB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;SACtF,CAAC,CAAC;IACL,CAAC;IACD,IAAI,GAAG,YAAY,OAAO,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC;QAC9C,gBAAgB,CAAC;YACf,SAAS,EAAE,4BAA4B;YACvC,MAAM;YACN,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC;YAClD,aAAa,EAAE,gCAAgC,GAAG,CAAC,IAAI,MAAM,GAAG,CAAC,OAAO,EAAE;SAC3E,CAAC,CAAC;IACL,CAAC;IACD,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACjE,gBAAgB,CAAC;QACf,SAAS,EAAE,4BAA4B;QACvC,MAAM;QACN,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,CAAC;QAC7C,aAAa,EAAE,gCAAgC,OAAO,EAAE;KACzD,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { profile } from "@ttctl/core";
|
|
2
|
+
import type { OutputFormat } from "../../../lib/output.js";
|
|
3
|
+
/**
|
|
4
|
+
* Action handler for `ttctl profile basic update` (also reachable as the
|
|
5
|
+
* short-form `ttctl profile update`). Validates that at least one of
|
|
6
|
+
* `--bio` / `--headline` was supplied (per the issue's AC), loads the
|
|
7
|
+
* persisted auth token, dispatches the mutation via `profile.basic.set()`,
|
|
8
|
+
* then prints either a human-readable confirmation or the raw payload
|
|
9
|
+
* depending on the `--output` format.
|
|
10
|
+
*
|
|
11
|
+
* Both `--bio` and `--headline` accept the four-mode free-text input
|
|
12
|
+
* surface from `lib/freetext.ts` (#70):
|
|
13
|
+
* - inline text (`--bio "..."`)
|
|
14
|
+
* - stdin (`--bio -`)
|
|
15
|
+
* - file (`--bio @path/to/bio.md`)
|
|
16
|
+
* - editor (`--edit`, opens `$EDITOR` on the bio buffer)
|
|
17
|
+
*
|
|
18
|
+
* Free-text resolution happens BEFORE auth/token I/O — input mistakes
|
|
19
|
+
* (missing file, mode conflict) surface as `profile update failed (CODE)`
|
|
20
|
+
* with an actionable code, never as a confusing post-network error.
|
|
21
|
+
*
|
|
22
|
+
* Note on naming: the user-facing CLI verb is `update` (per #69 AC and the
|
|
23
|
+
* #68 epic verb economy `add / remove / update / show / list`); the core
|
|
24
|
+
* function it dispatches to is `profile.basic.set()` (per #69's explicit
|
|
25
|
+
* `updateProfile` → `set` rename to match the core verb economy
|
|
26
|
+
* `add / rm / set / show / list`). The CLI verb mismatch with the core
|
|
27
|
+
* function name is intentional: the CLI surface speaks the user-visible
|
|
28
|
+
* verb economy, the core surface speaks the implementation verb economy.
|
|
29
|
+
*
|
|
30
|
+
* Domain errors are routed through `handleProfileUpdateError`, which knows
|
|
31
|
+
* how to surface `Cf403Error` walkthroughs and `ProfileError` codes.
|
|
32
|
+
*/
|
|
33
|
+
export declare function runProfileBasicUpdate(options: {
|
|
34
|
+
bio?: string;
|
|
35
|
+
headline?: string;
|
|
36
|
+
edit?: boolean;
|
|
37
|
+
output: OutputFormat;
|
|
38
|
+
}): Promise<void>;
|
|
39
|
+
/**
|
|
40
|
+
* Pretty entity preview for the basic-update envelope. Kept separate
|
|
41
|
+
* from the JSON / YAML wire shape: the wire payload is the full
|
|
42
|
+
* `UpdateProfileResult`; this helper only renders the human-readable
|
|
43
|
+
* subset (bio + headline). The notice (when present) flows through
|
|
44
|
+
* the envelope's `notice` field, NOT this body — `emitUpdateSuccess`
|
|
45
|
+
* appends it as a trailing indented line in pretty mode.
|
|
46
|
+
*
|
|
47
|
+
* Lines are truncated at 80 columns (one trailing `…` ellipsis when
|
|
48
|
+
* the source exceeds the limit) so the terminal output stays in a
|
|
49
|
+
* single line per field even for verbose bios.
|
|
50
|
+
*
|
|
51
|
+
* Pure — directly unit-testable.
|
|
52
|
+
*/
|
|
53
|
+
export declare function formatUpdatePrettyEntity(result: profile.basic.UpdateProfileResult): string;
|
|
54
|
+
//# sourceMappingURL=set.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"set.d.ts","sourceRoot":"","sources":["../../../../src/commands/profile/basic/set.ts"],"names":[],"mappings":"AAGA,OAAO,EAAc,OAAO,EAAE,MAAM,aAAa,CAAC;AAOlD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAI3D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,wBAAsB,qBAAqB,CAAC,OAAO,EAAE;IACnD,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,YAAY,CAAC;CACtB,GAAG,OAAO,CAAC,IAAI,CAAC,CA8EhB;AAoCD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,mBAAmB,GAAG,MAAM,CAU1F"}
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
// SPDX-License-Identifier: AGPL-3.0-only
|
|
2
|
+
// Copyright (C) 2026 Oleksii PELYKH
|
|
3
|
+
import { TtctlError, profile } from "@ttctl/core";
|
|
4
|
+
import { presentTtctlError } from "../../../errors.js";
|
|
5
|
+
import { getCliDryRun } from "../../../lib/dry-run.js";
|
|
6
|
+
import { emitDryRunSuccess, emitErrorAndExit, emitUpdateSuccess } from "../../../lib/envelopes.js";
|
|
7
|
+
import { FreeTextError, resolveFreeText } from "../../../lib/freetext.js";
|
|
8
|
+
import { loadAuthTokenOrExit } from "../shared.js";
|
|
9
|
+
import { truncate } from "./show.js";
|
|
10
|
+
/**
|
|
11
|
+
* Action handler for `ttctl profile basic update` (also reachable as the
|
|
12
|
+
* short-form `ttctl profile update`). Validates that at least one of
|
|
13
|
+
* `--bio` / `--headline` was supplied (per the issue's AC), loads the
|
|
14
|
+
* persisted auth token, dispatches the mutation via `profile.basic.set()`,
|
|
15
|
+
* then prints either a human-readable confirmation or the raw payload
|
|
16
|
+
* depending on the `--output` format.
|
|
17
|
+
*
|
|
18
|
+
* Both `--bio` and `--headline` accept the four-mode free-text input
|
|
19
|
+
* surface from `lib/freetext.ts` (#70):
|
|
20
|
+
* - inline text (`--bio "..."`)
|
|
21
|
+
* - stdin (`--bio -`)
|
|
22
|
+
* - file (`--bio @path/to/bio.md`)
|
|
23
|
+
* - editor (`--edit`, opens `$EDITOR` on the bio buffer)
|
|
24
|
+
*
|
|
25
|
+
* Free-text resolution happens BEFORE auth/token I/O — input mistakes
|
|
26
|
+
* (missing file, mode conflict) surface as `profile update failed (CODE)`
|
|
27
|
+
* with an actionable code, never as a confusing post-network error.
|
|
28
|
+
*
|
|
29
|
+
* Note on naming: the user-facing CLI verb is `update` (per #69 AC and the
|
|
30
|
+
* #68 epic verb economy `add / remove / update / show / list`); the core
|
|
31
|
+
* function it dispatches to is `profile.basic.set()` (per #69's explicit
|
|
32
|
+
* `updateProfile` → `set` rename to match the core verb economy
|
|
33
|
+
* `add / rm / set / show / list`). The CLI verb mismatch with the core
|
|
34
|
+
* function name is intentional: the CLI surface speaks the user-visible
|
|
35
|
+
* verb economy, the core surface speaks the implementation verb economy.
|
|
36
|
+
*
|
|
37
|
+
* Domain errors are routed through `handleProfileUpdateError`, which knows
|
|
38
|
+
* how to surface `Cf403Error` walkthroughs and `ProfileError` codes.
|
|
39
|
+
*/
|
|
40
|
+
export async function runProfileBasicUpdate(options) {
|
|
41
|
+
let bio;
|
|
42
|
+
let headline;
|
|
43
|
+
try {
|
|
44
|
+
bio = await resolveFreeText(options.bio, {
|
|
45
|
+
flagName: "bio",
|
|
46
|
+
enableEditor: options.edit ?? false,
|
|
47
|
+
});
|
|
48
|
+
headline = await resolveFreeText(options.headline, { flagName: "headline" });
|
|
49
|
+
}
|
|
50
|
+
catch (err) {
|
|
51
|
+
if (err instanceof FreeTextError) {
|
|
52
|
+
emitErrorAndExit({
|
|
53
|
+
operation: "profile.basic.update",
|
|
54
|
+
format: options.output,
|
|
55
|
+
errors: [{ code: err.code, message: err.message }],
|
|
56
|
+
prettySummary: `profile update failed (${err.code}): ${err.message}`,
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
throw err;
|
|
60
|
+
}
|
|
61
|
+
if (bio === undefined && headline === undefined) {
|
|
62
|
+
emitErrorAndExit({
|
|
63
|
+
operation: "profile.basic.update",
|
|
64
|
+
format: options.output,
|
|
65
|
+
errors: [
|
|
66
|
+
{
|
|
67
|
+
code: "VALIDATION_ERROR",
|
|
68
|
+
message: "profile update requires at least one of --bio, --headline, or --edit.",
|
|
69
|
+
hint: 'ttctl profile update --headline "Senior backend engineer"',
|
|
70
|
+
},
|
|
71
|
+
],
|
|
72
|
+
prettySummary: 'profile update requires at least one of --bio, --headline, or --edit.\nExample: ttctl profile update --headline "Senior backend engineer"',
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
const changes = {};
|
|
76
|
+
if (bio !== undefined)
|
|
77
|
+
changes.bio = bio;
|
|
78
|
+
if (headline !== undefined)
|
|
79
|
+
changes.headline = headline;
|
|
80
|
+
const token = await loadAuthTokenOrExit("profile update", options.output);
|
|
81
|
+
// Route through the core's `dryRun` option (issue #52) when the
|
|
82
|
+
// global `--dry-run` flag is set. The captured value is `false` for
|
|
83
|
+
// normal apply-path invocations — `set()` returns `kind: "applied"`
|
|
84
|
+
// and the existing `emitUpdateSuccess` path runs. With `dryRun: true`,
|
|
85
|
+
// `set()` short-circuits BEFORE any transport call (read or write)
|
|
86
|
+
// and returns `kind: "preview"` carrying a structured
|
|
87
|
+
// `DryRunPreview` — emit it as a `dryRun: true` envelope and exit 0.
|
|
88
|
+
const dryRun = getCliDryRun();
|
|
89
|
+
let outcome;
|
|
90
|
+
try {
|
|
91
|
+
outcome = await profile.basic.set(token, changes, { dryRun });
|
|
92
|
+
}
|
|
93
|
+
catch (err) {
|
|
94
|
+
handleProfileUpdateError(err, options.output);
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
if (outcome.kind === "preview") {
|
|
98
|
+
emitDryRunSuccess({
|
|
99
|
+
operation: "profile.basic.update",
|
|
100
|
+
format: options.output,
|
|
101
|
+
preview: outcome.preview,
|
|
102
|
+
});
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
const { result } = outcome;
|
|
106
|
+
emitUpdateSuccess({
|
|
107
|
+
operation: "profile.basic.update",
|
|
108
|
+
format: options.output,
|
|
109
|
+
updated: result,
|
|
110
|
+
prettySummary: "Profile updated.",
|
|
111
|
+
prettyEntity: formatUpdatePrettyEntity,
|
|
112
|
+
notice: result.notice ?? undefined,
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Route `profile.basic.set()` errors through the envelope ABI (#128).
|
|
117
|
+
* Mirrors `handleProfileShowError` from `show.ts` — kept separate so
|
|
118
|
+
* the user-visible "profile update failed (CODE)" prefix is accurate
|
|
119
|
+
* (vs. a "profile show failed" prefix that would be misleading).
|
|
120
|
+
*/
|
|
121
|
+
function handleProfileUpdateError(err, format) {
|
|
122
|
+
if (err instanceof TtctlError) {
|
|
123
|
+
if (format === "pretty")
|
|
124
|
+
presentTtctlError(err);
|
|
125
|
+
const errors = [{ code: err.code, message: err.message, hint: err.recovery }];
|
|
126
|
+
emitErrorAndExit({
|
|
127
|
+
operation: "profile.basic.update",
|
|
128
|
+
format,
|
|
129
|
+
errors,
|
|
130
|
+
exitCode: err.code === "CF_403_CLEARANCE" || err.code === "CF_403_PERSISTENT" ? 2 : 1,
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
if (err instanceof profile.basic.ProfileError) {
|
|
134
|
+
emitErrorAndExit({
|
|
135
|
+
operation: "profile.basic.update",
|
|
136
|
+
format,
|
|
137
|
+
errors: [{ code: err.code, message: err.message }],
|
|
138
|
+
prettySummary: `profile update failed (${err.code}): ${err.message}`,
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
142
|
+
emitErrorAndExit({
|
|
143
|
+
operation: "profile.basic.update",
|
|
144
|
+
format,
|
|
145
|
+
errors: [{ code: "INTERNAL_ERROR", message }],
|
|
146
|
+
prettySummary: `profile update failed: ${message}`,
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Pretty entity preview for the basic-update envelope. Kept separate
|
|
151
|
+
* from the JSON / YAML wire shape: the wire payload is the full
|
|
152
|
+
* `UpdateProfileResult`; this helper only renders the human-readable
|
|
153
|
+
* subset (bio + headline). The notice (when present) flows through
|
|
154
|
+
* the envelope's `notice` field, NOT this body — `emitUpdateSuccess`
|
|
155
|
+
* appends it as a trailing indented line in pretty mode.
|
|
156
|
+
*
|
|
157
|
+
* Lines are truncated at 80 columns (one trailing `…` ellipsis when
|
|
158
|
+
* the source exceeds the limit) so the terminal output stays in a
|
|
159
|
+
* single line per field even for verbose bios.
|
|
160
|
+
*
|
|
161
|
+
* Pure — directly unit-testable.
|
|
162
|
+
*/
|
|
163
|
+
export function formatUpdatePrettyEntity(result) {
|
|
164
|
+
const { profile: updatedProfile } = result;
|
|
165
|
+
const lines = [];
|
|
166
|
+
if (updatedProfile.about !== null) {
|
|
167
|
+
lines.push(truncate(`bio: ${updatedProfile.about}`, 80));
|
|
168
|
+
}
|
|
169
|
+
if (updatedProfile.quote !== null) {
|
|
170
|
+
lines.push(truncate(`headline: ${updatedProfile.quote}`, 80));
|
|
171
|
+
}
|
|
172
|
+
return lines.join("\n");
|
|
173
|
+
}
|
|
174
|
+
//# sourceMappingURL=set.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"set.js","sourceRoot":"","sources":["../../../../src/commands/profile/basic/set.ts"],"names":[],"mappings":"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"}
|