@formigio/fazemos-cli 0.10.62 → 0.10.63

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/dist/api.d.ts CHANGED
@@ -118,3 +118,26 @@ export declare function api(method: string, path: string, body?: unknown, opts?:
118
118
  * handlers to keep the next slug-resolution honest.
119
119
  */
120
120
  export declare function invalidateAuthMeCache(): void;
121
+ /**
122
+ * F18-FU T-CLI-1 — Set or clear a project's docs_repo field.
123
+ *
124
+ * Calls PATCH /api/organizations/:orgId/projects/:projectId with
125
+ * { docsRepo, reason }. Pass `null` for docsRepo to clear the field (the
126
+ * project then inherits from org.workspace_repo at runtime).
127
+ */
128
+ export declare function patchProjectDocsRepo(orgId: string, projectId: string, body: {
129
+ docsRepo: string | null;
130
+ reason?: string;
131
+ }): Promise<unknown>;
132
+ /**
133
+ * F18-FU T-CLI-2 — Set or clear the org-level workspace_repo + workspace_branch.
134
+ *
135
+ * Calls PATCH /api/organizations/:orgId. The API accepts snake_case keys for
136
+ * workspace_repo and workspace_branch (F18 shipped this shape; do not reshape).
137
+ * Pass `null` for workspace_repo to clear the field.
138
+ */
139
+ export declare function patchOrgWorkspace(orgId: string, body: {
140
+ workspace_repo: string | null;
141
+ workspace_branch?: string;
142
+ reason?: string;
143
+ }): Promise<unknown>;
package/dist/api.js CHANGED
@@ -257,4 +257,25 @@ export async function api(method, path, body, opts = {}) {
257
257
  export function invalidateAuthMeCache() {
258
258
  clearAuthMeCache();
259
259
  }
260
+ // ── F18-FU named helpers for docs-repo settings ─────────────────────────────
261
+ /**
262
+ * F18-FU T-CLI-1 — Set or clear a project's docs_repo field.
263
+ *
264
+ * Calls PATCH /api/organizations/:orgId/projects/:projectId with
265
+ * { docsRepo, reason }. Pass `null` for docsRepo to clear the field (the
266
+ * project then inherits from org.workspace_repo at runtime).
267
+ */
268
+ export async function patchProjectDocsRepo(orgId, projectId, body) {
269
+ return api('PATCH', `/api/organizations/${orgId}/projects/${projectId}`, body, { noProjectHeader: true });
270
+ }
271
+ /**
272
+ * F18-FU T-CLI-2 — Set or clear the org-level workspace_repo + workspace_branch.
273
+ *
274
+ * Calls PATCH /api/organizations/:orgId. The API accepts snake_case keys for
275
+ * workspace_repo and workspace_branch (F18 shipped this shape; do not reshape).
276
+ * Pass `null` for workspace_repo to clear the field.
277
+ */
278
+ export async function patchOrgWorkspace(orgId, body) {
279
+ return api('PATCH', `/api/organizations/${orgId}`, body, { noProjectHeader: true });
280
+ }
260
281
  //# sourceMappingURL=api.js.map
package/dist/api.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -8,7 +8,7 @@ getActiveProjectId, setActiveProjectId, clearActiveProjectId, findProjectBySlug,
8
8
  setOrgOverride, setProjectOverride, setDirContextSource, getDirContextSource, } from './config.js';
9
9
  import { findDirContextFile, readDirContextFile, writeDirContextFile, removeDirContextFile, DIR_CONFIG_FILENAME, } from './dircontext.js';
10
10
  import { login, signup, confirmSignup, adminLogin } from './auth.js';
11
- import { api, ApiError, refreshAuthMeCache, invalidateAuthMeCache, resolveOrgIdMaybeSlug, resolveProjectIdBySlug } from './api.js';
11
+ import { api, ApiError, refreshAuthMeCache, invalidateAuthMeCache, resolveOrgIdMaybeSlug, resolveProjectIdBySlug, patchProjectDocsRepo, patchOrgWorkspace } from './api.js';
12
12
  import { isProjectConnectionUnavailable, renderProjectConnectionUnavailableCopy, } from './connectionErrorCopy.js';
13
13
  import { loadYaml, summarize } from './yaml/load.js';
14
14
  import { printFindings, printJson } from './yaml/format.js';
@@ -28,7 +28,6 @@ import { registerApprovalsCommands } from './approvals.js';
28
28
  import { registerSecretsCommands } from './commands/secrets.js';
29
29
  import { registerProfilesCommands } from './commands/profiles.js';
30
30
  import { registerImageCommands } from './commands/image.js';
31
- import { registerIngestCommands } from './commands/ingest.js';
32
31
  import { parseExecutionsJson, resolveWaitOptions, waitForPipelines, buildAwsCommand, validateExecutionEntry, } from './wait-for-pipeline.js';
33
32
  import { readFileSync, readdirSync, writeFileSync, mkdirSync, existsSync, statSync } from 'fs';
34
33
  import { fileURLToPath } from 'url';
@@ -761,6 +760,83 @@ orgs
761
760
  process.exit(1);
762
761
  }
763
762
  });
763
+ // ── F18-FU — orgs set-workspace ─────────────────────────────────────────────
764
+ orgs
765
+ .command('set-workspace')
766
+ .description('Set or clear the org-level workspace repository and branch. Owner/admin only.\n\n' +
767
+ 'Pass <owner/repo> to set the fallback docs repo for all projects that have not\n' +
768
+ 'configured their own docs repo. Use --clear to remove the org-level repo.\n\n' +
769
+ 'Note: this uses PATCH /api/organizations/:orgId (not PUT). Format validation\n' +
770
+ 'is enforced on save; reachability is checked at pipeline-run time.')
771
+ .argument('[owner/repo]', 'Repository in owner/repo format (e.g. formigio/fazemos-workspace)')
772
+ .option('--branch <name>', 'Branch name (default: main)', 'main')
773
+ .option('--clear', 'Clear the org-level workspace repo')
774
+ .option('--reason <text>', 'Optional reason recorded in the audit log')
775
+ .action(async (repo, opts) => {
776
+ try {
777
+ // Validate mutual exclusion
778
+ if (!repo && !opts.clear) {
779
+ console.error(chalk.red('Provide <owner/repo> or --clear'));
780
+ console.log(chalk.gray('Usage: fazemos orgs set-workspace <owner/repo> [--branch <name>]'));
781
+ console.log(chalk.gray(' fazemos orgs set-workspace --clear'));
782
+ process.exit(1);
783
+ }
784
+ if (repo && opts.clear) {
785
+ console.error(chalk.red('<owner/repo> and --clear are mutually exclusive'));
786
+ process.exit(1);
787
+ }
788
+ const orgId = getActiveOrgId();
789
+ if (!orgId) {
790
+ console.error(chalk.red('No active org. Run: fazemos orgs switch <slug>'));
791
+ process.exit(1);
792
+ }
793
+ const workspace_repo = opts.clear ? null : repo;
794
+ const body = {
795
+ workspace_repo,
796
+ };
797
+ if (!opts.clear) {
798
+ // Only send workspace_branch when setting a repo (not clearing)
799
+ body.workspace_branch = opts.branch;
800
+ }
801
+ if (opts.reason)
802
+ body.reason = opts.reason;
803
+ const data = await patchOrgWorkspace(orgId, body);
804
+ const org = data.organization;
805
+ if (workspace_repo === null) {
806
+ console.log(chalk.green(`✓ Org workspace repo cleared for ${org.name ?? org.slug}`));
807
+ console.log(chalk.yellow(' ⚠ Projects without a project-level docs repo will now have no effective repo — pipelines will fail to clone.'));
808
+ console.log(chalk.gray(' → set a project-level repo: fazemos projects set-docs-repo <owner/repo>'));
809
+ }
810
+ else {
811
+ console.log(chalk.green(`✓ Org workspace set for ${org.name ?? org.slug}`));
812
+ console.log(` Workspace repo: ${workspace_repo}`);
813
+ console.log(` Branch: ${opts.branch}`);
814
+ console.log(chalk.gray(' New projects will inherit this. To override per-project: fazemos projects set-docs-repo <owner/repo>'));
815
+ }
816
+ }
817
+ catch (err) {
818
+ if (err instanceof ApiError) {
819
+ if (err.code === 'workspace_repo_format_invalid') {
820
+ console.error(chalk.red('Invalid repo format. Expected owner/repo (e.g. formigio/fazemos-workspace).'));
821
+ process.exit(1);
822
+ }
823
+ if (err.code === 'workspace_repo_empty') {
824
+ console.error(chalk.red('Workspace repo cannot be an empty string. Use --clear to remove it.'));
825
+ process.exit(1);
826
+ }
827
+ if (err.code === 'workspace_branch_empty') {
828
+ console.error(chalk.red('Branch name cannot be empty.'));
829
+ process.exit(1);
830
+ }
831
+ if (err.code === 'workspace_branch_invalid') {
832
+ console.error(chalk.red('Branch name is too long (max 100 characters).'));
833
+ process.exit(1);
834
+ }
835
+ }
836
+ console.error(chalk.red(err.message));
837
+ process.exit(1);
838
+ }
839
+ });
764
840
  orgs
765
841
  .command('invite')
766
842
  .description('Invite a human member to the organization by email. The invitee receives an email with a one-time link to join. Use "orgs add-agent" for AI agents instead.')
@@ -1507,6 +1583,32 @@ projects
1507
1583
  console.log(` Created: ${p.createdAt ? new Date(p.createdAt).toLocaleString() : '(unknown)'}`);
1508
1584
  if (p.archivedAt)
1509
1585
  console.log(` Archived at: ${new Date(p.archivedAt).toLocaleString()}`);
1586
+ // F18-FU T-CLI-3 — Docs repository output (Sage Screen 5 copy verbatim).
1587
+ // effectiveDocsRepo + docsRepoSource are server-computed fields on the
1588
+ // enriched GET .../projects/:projectId response — the CLI never computes
1589
+ // them locally.
1590
+ console.log('');
1591
+ console.log(chalk.cyan('Docs:'));
1592
+ if (p.docsRepoSource === 'project') {
1593
+ // Variant A — docs_repo set directly on this project
1594
+ console.log(` Docs repository: ${p.effectiveDocsRepo} ${chalk.gray('(set for this project)')}`);
1595
+ const docsRoot = p.docsRoot ?? `projects/${p.slug}`;
1596
+ console.log(` Docs root: ${docsRoot} ${chalk.gray('(convention default)')}`);
1597
+ }
1598
+ else if (p.docsRepoSource === 'org') {
1599
+ // Variant B — inheriting from org workspace_repo
1600
+ console.log(` Docs repository: ${p.effectiveDocsRepo} ${chalk.gray('(inherited from org)')}`);
1601
+ const docsRoot = p.docsRoot ?? `projects/${p.slug}`;
1602
+ console.log(` Docs root: ${docsRoot} ${chalk.gray('(convention default)')}`);
1603
+ console.log(chalk.gray(` → change with: fazemos projects set-docs-repo <owner/repo>`));
1604
+ }
1605
+ else {
1606
+ // Variant C — neither project nor org has a docs repo configured
1607
+ console.log(` Docs repository: ${chalk.yellow('⚠ not configured')}`);
1608
+ console.log(chalk.yellow(' Pipelines will fail to clone until this is set.'));
1609
+ console.log(chalk.gray(` → set for this project: fazemos projects set-docs-repo ${p.slug} <owner/repo>`));
1610
+ console.log(chalk.gray(` → set at org level: fazemos orgs set-workspace <owner/repo>`));
1611
+ }
1510
1612
  if (p.stats) {
1511
1613
  console.log('');
1512
1614
  console.log(chalk.cyan('Activity:'));
@@ -1514,34 +1616,6 @@ projects
1514
1616
  console.log(` Worksheets: ${p.stats.worksheets ?? 0}`);
1515
1617
  console.log(` Templates: ${p.stats.templates ?? 0}`);
1516
1618
  }
1517
- // F51/F52 — Email Ingest: display known_senders and recent_events when present.
1518
- // Only returned for owner/admin callers; plain members see no email_ingest key.
1519
- if (p.email_ingest) {
1520
- const ei = p.email_ingest;
1521
- console.log('');
1522
- console.log(chalk.cyan('Email Ingest:'));
1523
- const senders = ei.known_senders ?? [];
1524
- if (senders.length > 0) {
1525
- console.log(` Known senders (${senders.length}):`);
1526
- for (const s of senders) {
1527
- console.log(` ${s}`);
1528
- }
1529
- }
1530
- else {
1531
- console.log(` Known senders: ${chalk.gray('(none — add with: fazemos ingest sender-map add)')}`);
1532
- }
1533
- const events = ei.recent_events ?? [];
1534
- if (events.length > 0) {
1535
- console.log(` Recent ingest events (last ${events.length}):`);
1536
- for (const e of events) {
1537
- const worksheetRef = e.worksheet_id ? `worksheet ${e.worksheet_id}` : chalk.gray('no worksheet');
1538
- console.log(` [${e.id}] From: ${e.from} Subject: ${e.subject ?? chalk.gray('(none)')} → ${worksheetRef}`);
1539
- }
1540
- }
1541
- else {
1542
- console.log(` Recent ingest events: ${chalk.gray('(none)')}`);
1543
- }
1544
- }
1545
1619
  }
1546
1620
  catch (err) {
1547
1621
  console.error(chalk.red(err.message));
@@ -1751,6 +1825,84 @@ projects
1751
1825
  process.exit(1);
1752
1826
  }
1753
1827
  });
1828
+ // ── F18-FU — projects set-docs-repo ─────────────────────────────────────────
1829
+ projects
1830
+ .command('set-docs-repo')
1831
+ .description('Set or clear the docs repository for a project. Owner/admin only.\n\n' +
1832
+ 'Pass <owner/repo> to point the project at a specific GitHub repo.\n' +
1833
+ 'Pass --clear to remove the project-level override (the project then inherits\n' +
1834
+ 'the org workspace_repo, or pipelines fail if that is also unset).\n\n' +
1835
+ 'Format validation is enforced on save. Reachability is tested at pipeline-run\n' +
1836
+ 'time — if the repo can\'t be cloned, check Project Settings → Docs.')
1837
+ .argument('[owner/repo]', 'Repository in owner/repo format (e.g. formigio/fazemos-workspace)')
1838
+ .option('--clear', 'Clear the project-level docs repo (reverts to org-level fallback)')
1839
+ .option('--reason <text>', 'Optional reason recorded in the audit log')
1840
+ .action(async (repo, opts) => {
1841
+ try {
1842
+ // Validate mutual exclusion: need exactly one of <owner/repo> or --clear
1843
+ if (!repo && !opts.clear) {
1844
+ console.error(chalk.red('Provide <owner/repo> or --clear'));
1845
+ console.log(chalk.gray('Usage: fazemos projects set-docs-repo <owner/repo>'));
1846
+ console.log(chalk.gray(' fazemos projects set-docs-repo --clear'));
1847
+ process.exit(1);
1848
+ }
1849
+ if (repo && opts.clear) {
1850
+ console.error(chalk.red('<owner/repo> and --clear are mutually exclusive'));
1851
+ process.exit(1);
1852
+ }
1853
+ const orgId = requireActiveOrgOrExit();
1854
+ // Resolve slug -> id; the active project is required for this command.
1855
+ // We don't accept a <slug> argument here — this command acts on the
1856
+ // active project (or --project override from the global hook). If no
1857
+ // project is active, fail clearly.
1858
+ const projectId = await resolveProjectIdBySlug();
1859
+ if (!projectId) {
1860
+ console.error(chalk.red('No active project. Run: fazemos projects switch <slug>'));
1861
+ process.exit(1);
1862
+ }
1863
+ const docsRepo = opts.clear ? null : repo;
1864
+ const body = { docsRepo };
1865
+ if (opts.reason)
1866
+ body.reason = opts.reason;
1867
+ const data = await patchProjectDocsRepo(orgId, projectId, body);
1868
+ const p = data.project;
1869
+ if (docsRepo === null) {
1870
+ // Sage Screen 6 — clear path
1871
+ if (p.effectiveDocsRepo) {
1872
+ console.log(chalk.green(`✓ Docs repo cleared for ${p.name} (${p.slug})`));
1873
+ console.log(chalk.gray(` Now inheriting: ${p.effectiveDocsRepo} (from org)`));
1874
+ }
1875
+ else {
1876
+ console.log(chalk.green(`✓ Docs repo cleared for ${p.name} (${p.slug})`));
1877
+ console.log(chalk.yellow(' ⚠ No org-level workspace repo set either — pipelines will fail to clone until one is configured.'));
1878
+ console.log(chalk.gray(` → set at org level: fazemos orgs set-workspace <owner/repo>`));
1879
+ }
1880
+ }
1881
+ else {
1882
+ // Sage Screen 6 — set path
1883
+ console.log(chalk.green(`✓ Docs repo set for ${p.name} (${p.slug})`));
1884
+ console.log(` Docs repository: ${docsRepo} ${chalk.gray('(set for this project)')}`);
1885
+ const docsRoot = p.docsRoot ?? `projects/${p.slug}`;
1886
+ console.log(` Docs root: ${docsRoot} ${chalk.gray('(convention default)')}`);
1887
+ console.log(chalk.gray(' Reachability is tested when a pipeline first tries to clone the repo.'));
1888
+ console.log(chalk.gray(' If it can\'t be reached, we\'ll point you back here.'));
1889
+ }
1890
+ }
1891
+ catch (err) {
1892
+ if (err instanceof ApiError) {
1893
+ if (err.code === 'docs_repo_format_invalid') {
1894
+ console.error(chalk.red('Invalid repo format. Expected owner/repo (e.g. formigio/fazemos-workspace).'));
1895
+ process.exit(1);
1896
+ }
1897
+ if (err.code === 'docs_repo_empty') {
1898
+ console.error(chalk.red('Docs repo cannot be an empty string. Use --clear to remove it.'));
1899
+ process.exit(1);
1900
+ }
1901
+ }
1902
+ console.error(chalk.red(err.message));
1903
+ process.exit(1);
1904
+ }
1905
+ });
1754
1906
  // ── F42 — projects setup (binds docs + connection in one call) ──────────────
1755
1907
  projects
1756
1908
  .command('setup')
@@ -10519,18 +10671,6 @@ registerProfilesCommands(program);
10519
10671
  // When codebuildEnabled=false on a build response, the note field is surfaced
10520
10672
  // to the user (infrastructure not yet deployed).
10521
10673
  registerImageCommands(program);
10522
- // ── F52 — Email Ingest Phase B: unified ingest command group ──────────────────
10523
- // Registers `ingest` top-level command with four sub-groups:
10524
- // sender-map add / list / remove → POST/GET/DELETE /api/email-ingest/sender-map
10525
- // personas list → GET /api/email-ingest/personas
10526
- // holds list / show / resolve / drop → GET+POST /api/email-ingest/holds
10527
- // project set-intake / show → PUT/GET /api/email-ingest/projects/:id/intake
10528
- // Merge-forward of F51's email-ingest verbs (group renamed email-ingest → ingest).
10529
- // API route prefix /api/email-ingest/… is UNCHANGED — only CLI verb renamed.
10530
- // All org-scoped calls use noProjectHeader: true (role-gated, not project-header).
10531
- // Project intake calls: projectId threaded in URL path, noProjectHeader: true.
10532
- // owner/admin only; agent identities blocked server-side.
10533
- registerIngestCommands(program);
10534
10674
  // Skip auto-parse only when running under Vitest (which sets process.env.VITEST).
10535
10675
  // Tests import `program` and drive it via `program.parseAsync(...)` after mocking
10536
10676
  // `./api.js`. In every other context — direct invocation, npx tsx, OR the bin