@aligndottech/cli 0.32.2 → 0.33.0
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/commands/decisions/index.d.ts.map +1 -1
- package/dist/commands/decisions/index.js +9 -2
- package/dist/commands/decisions/index.js.map +1 -1
- package/dist/commands/default-action.d.ts.map +1 -1
- package/dist/commands/default-action.js +6 -3
- package/dist/commands/default-action.js.map +1 -1
- package/dist/commands/import/confluence.d.ts.map +1 -1
- package/dist/commands/import/confluence.js +7 -2
- package/dist/commands/import/confluence.js.map +1 -1
- package/dist/commands/import/docs.d.ts.map +1 -1
- package/dist/commands/import/docs.js +7 -2
- package/dist/commands/import/docs.js.map +1 -1
- package/dist/commands/import/git.d.ts.map +1 -1
- package/dist/commands/import/git.js +15 -2
- package/dist/commands/import/git.js.map +1 -1
- package/dist/commands/import/github.d.ts.map +1 -1
- package/dist/commands/import/github.js +7 -2
- package/dist/commands/import/github.js.map +1 -1
- package/dist/commands/import/gitlab.d.ts.map +1 -1
- package/dist/commands/import/gitlab.js +7 -2
- package/dist/commands/import/gitlab.js.map +1 -1
- package/dist/commands/import/jira.d.ts.map +1 -1
- package/dist/commands/import/jira.js +7 -2
- package/dist/commands/import/jira.js.map +1 -1
- package/dist/commands/import/linear.d.ts.map +1 -1
- package/dist/commands/import/linear.js +7 -2
- package/dist/commands/import/linear.js.map +1 -1
- package/dist/commands/import/notion.d.ts.map +1 -1
- package/dist/commands/import/notion.js +7 -2
- package/dist/commands/import/notion.js.map +1 -1
- package/dist/commands/import/slack.d.ts.map +1 -1
- package/dist/commands/import/slack.js +8 -3
- package/dist/commands/import/slack.js.map +1 -1
- package/dist/commands/import/teams.d.ts.map +1 -1
- package/dist/commands/import/teams.js +7 -2
- package/dist/commands/import/teams.js.map +1 -1
- package/dist/commands/import/zoom.d.ts.map +1 -1
- package/dist/commands/import/zoom.js +7 -2
- package/dist/commands/import/zoom.js.map +1 -1
- package/dist/commands/setup.d.ts.map +1 -1
- package/dist/commands/setup.js +76 -33
- package/dist/commands/setup.js.map +1 -1
- package/dist/commands/why.d.ts.map +1 -1
- package/dist/commands/why.js +100 -16
- package/dist/commands/why.js.map +1 -1
- package/dist/lib/capture-report.d.ts +45 -0
- package/dist/lib/capture-report.d.ts.map +1 -0
- package/dist/lib/capture-report.js +50 -0
- package/dist/lib/capture-report.js.map +1 -0
- package/dist/lib/capture-sources.d.ts +57 -0
- package/dist/lib/capture-sources.d.ts.map +1 -0
- package/dist/lib/capture-sources.js +24 -0
- package/dist/lib/capture-sources.js.map +1 -0
- package/dist/lib/commit-shape.d.ts +18 -0
- package/dist/lib/commit-shape.d.ts.map +1 -0
- package/dist/lib/commit-shape.js +23 -0
- package/dist/lib/commit-shape.js.map +1 -0
- package/dist/lib/fetchers/capture.d.ts +60 -0
- package/dist/lib/fetchers/capture.d.ts.map +1 -0
- package/dist/lib/fetchers/capture.js +27 -0
- package/dist/lib/fetchers/capture.js.map +1 -0
- package/dist/lib/fetchers/confluence.d.ts +2 -2
- package/dist/lib/fetchers/confluence.d.ts.map +1 -1
- package/dist/lib/fetchers/confluence.js +2 -1
- package/dist/lib/fetchers/confluence.js.map +1 -1
- package/dist/lib/fetchers/docs.d.ts +12 -2
- package/dist/lib/fetchers/docs.d.ts.map +1 -1
- package/dist/lib/fetchers/docs.js +46 -6
- package/dist/lib/fetchers/docs.js.map +1 -1
- package/dist/lib/fetchers/git.d.ts +28 -2
- package/dist/lib/fetchers/git.d.ts.map +1 -1
- package/dist/lib/fetchers/git.js +50 -2
- package/dist/lib/fetchers/git.js.map +1 -1
- package/dist/lib/fetchers/github.d.ts +2 -2
- package/dist/lib/fetchers/github.d.ts.map +1 -1
- package/dist/lib/fetchers/github.js +2 -1
- package/dist/lib/fetchers/github.js.map +1 -1
- package/dist/lib/fetchers/gitlab.d.ts +2 -2
- package/dist/lib/fetchers/gitlab.d.ts.map +1 -1
- package/dist/lib/fetchers/gitlab.js +2 -1
- package/dist/lib/fetchers/gitlab.js.map +1 -1
- package/dist/lib/fetchers/jira.d.ts +2 -2
- package/dist/lib/fetchers/jira.d.ts.map +1 -1
- package/dist/lib/fetchers/jira.js +2 -1
- package/dist/lib/fetchers/jira.js.map +1 -1
- package/dist/lib/fetchers/linear.d.ts +2 -2
- package/dist/lib/fetchers/linear.d.ts.map +1 -1
- package/dist/lib/fetchers/linear.js +2 -1
- package/dist/lib/fetchers/linear.js.map +1 -1
- package/dist/lib/fetchers/notion.d.ts +2 -2
- package/dist/lib/fetchers/notion.d.ts.map +1 -1
- package/dist/lib/fetchers/notion.js +2 -1
- package/dist/lib/fetchers/notion.js.map +1 -1
- package/dist/lib/fetchers/slack.d.ts +2 -2
- package/dist/lib/fetchers/slack.d.ts.map +1 -1
- package/dist/lib/fetchers/slack.js +2 -1
- package/dist/lib/fetchers/slack.js.map +1 -1
- package/dist/lib/fetchers/teams.d.ts +2 -2
- package/dist/lib/fetchers/teams.d.ts.map +1 -1
- package/dist/lib/fetchers/teams.js +2 -1
- package/dist/lib/fetchers/teams.js.map +1 -1
- package/dist/lib/fetchers/zoom.d.ts +2 -2
- package/dist/lib/fetchers/zoom.d.ts.map +1 -1
- package/dist/lib/fetchers/zoom.js +2 -1
- package/dist/lib/fetchers/zoom.js.map +1 -1
- package/dist/lib/gateway-client.d.ts +8 -0
- package/dist/lib/gateway-client.d.ts.map +1 -1
- package/dist/lib/gateway-client.js +11 -1
- package/dist/lib/gateway-client.js.map +1 -1
- package/dist/lib/git.d.ts.map +1 -1
- package/dist/lib/git.js +9 -2
- package/dist/lib/git.js.map +1 -1
- package/dist/lib/import-defaults.d.ts +29 -0
- package/dist/lib/import-defaults.d.ts.map +1 -0
- package/dist/lib/import-defaults.js +29 -0
- package/dist/lib/import-defaults.js.map +1 -0
- package/dist/lib/local-db.d.ts +35 -1
- package/dist/lib/local-db.d.ts.map +1 -1
- package/dist/lib/local-db.js +123 -7
- package/dist/lib/local-db.js.map +1 -1
- package/dist/lib/local-gateway-client.d.ts +9 -5
- package/dist/lib/local-gateway-client.d.ts.map +1 -1
- package/dist/lib/local-gateway-client.js +16 -2
- package/dist/lib/local-gateway-client.js.map +1 -1
- package/dist/lib/local-llm.d.ts +17 -0
- package/dist/lib/local-llm.d.ts.map +1 -1
- package/dist/lib/local-llm.js +22 -1
- package/dist/lib/local-llm.js.map +1 -1
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"slack.d.ts","sourceRoot":"","sources":["../../../src/commands/import/slack.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"slack.d.ts","sourceRoot":"","sources":["../../../src/commands/import/slack.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAyBzC,wBAAgB,0BAA0B,CAAC,SAAS,EAAE,OAAO,GAAG,IAAI,CAyDnE"}
|
|
@@ -7,16 +7,19 @@ import { resolveImportEnv } from '../../lib/resolve-env.js';
|
|
|
7
7
|
import { resolveAppUrl } from '../../lib/env-resolver.js';
|
|
8
8
|
import { fetchSlackItems } from '../../lib/fetchers/slack.js';
|
|
9
9
|
import { runPersonalImport } from '../../lib/personal-import.js';
|
|
10
|
+
import { renderCaptureReport, toCaptureSource } from '../../lib/capture-report.js';
|
|
11
|
+
import { CAPTURE_SOURCES } from '../../lib/capture-sources.js';
|
|
10
12
|
import { personalCredsForImport } from '../../lib/personal-oauth.js';
|
|
11
13
|
import { commandIntro } from '../../lib/brand.js';
|
|
14
|
+
import { IMPORT_LIMITS, SLACK_DAYS_BACK } from '../../lib/import-defaults.js';
|
|
12
15
|
export function registerImportSlackCommand(importCmd) {
|
|
13
16
|
importCmd
|
|
14
17
|
.command('slack')
|
|
15
18
|
.description('Import decision threads from Slack (xoxp- user token) [experimental]')
|
|
16
19
|
.option('--token <token>', 'Slack user OAuth token (xoxp-...)')
|
|
17
20
|
.option('--personal', 'Connect your own Slack via browser OAuth (Align personal app) instead of a token')
|
|
18
|
-
.option('--limit <n>', 'Max threads to import',
|
|
19
|
-
.option('--days-back <n>', 'How many days back to scan',
|
|
21
|
+
.option('--limit <n>', 'Max threads to import', String(IMPORT_LIMITS.slack))
|
|
22
|
+
.option('--days-back <n>', 'How many days back to scan', String(SLACK_DAYS_BACK))
|
|
20
23
|
.option('--approve', 'Skip confirmation prompt')
|
|
21
24
|
.option('--env <env>', 'Environment')
|
|
22
25
|
.action(async (_opts, cmd) => {
|
|
@@ -47,13 +50,15 @@ export function registerImportSlackCommand(importCmd) {
|
|
|
47
50
|
const spinner = p.spinner();
|
|
48
51
|
spinner.start('Fetching decision threads from Slack...');
|
|
49
52
|
try {
|
|
50
|
-
const
|
|
53
|
+
const fetched = await fetchSlackItems({
|
|
51
54
|
token,
|
|
52
55
|
limit: parseInt(opts.limit, 10),
|
|
53
56
|
daysBack: parseInt(opts.daysBack, 10),
|
|
54
57
|
});
|
|
58
|
+
const { items } = fetched;
|
|
55
59
|
spinner.stop(`Found ${items.length} threads`);
|
|
56
60
|
await runPersonalImport(items, client, { label: 'Slack', approve: opts.approve, appUrl: resolveAppUrl(env), funnel: { env, source: 'slack' } });
|
|
61
|
+
console.log(`${renderCaptureReport([toCaptureSource(CAPTURE_SOURCES.slack, fetched)])}\n`);
|
|
57
62
|
}
|
|
58
63
|
catch (err) {
|
|
59
64
|
spinner.stop('');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"slack.js","sourceRoot":"","sources":["../../../src/commands/import/slack.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,KAAK,CAAC,MAAM,gBAAgB,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,iBAAiB,EAAgB,MAAM,qBAAqB,CAAC;AACtE,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"slack.js","sourceRoot":"","sources":["../../../src/commands/import/slack.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"teams.d.ts","sourceRoot":"","sources":["../../../src/commands/import/teams.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"teams.d.ts","sourceRoot":"","sources":["../../../src/commands/import/teams.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAuBzC,wBAAgB,0BAA0B,CAAC,SAAS,EAAE,OAAO,GAAG,IAAI,CAsDnE"}
|
|
@@ -6,15 +6,18 @@ import { resolveImportEnv } from '../../lib/resolve-env.js';
|
|
|
6
6
|
import { resolveAppUrl } from '../../lib/env-resolver.js';
|
|
7
7
|
import { fetchTeamsItems } from '../../lib/fetchers/teams.js';
|
|
8
8
|
import { runPersonalImport } from '../../lib/personal-import.js';
|
|
9
|
+
import { renderCaptureReport, toCaptureSource } from '../../lib/capture-report.js';
|
|
10
|
+
import { CAPTURE_SOURCES } from '../../lib/capture-sources.js';
|
|
9
11
|
import { personalCredsForImport } from '../../lib/personal-oauth.js';
|
|
10
12
|
import { commandIntro } from '../../lib/brand.js';
|
|
13
|
+
import { IMPORT_LIMITS } from '../../lib/import-defaults.js';
|
|
11
14
|
export function registerImportTeamsCommand(importCmd) {
|
|
12
15
|
importCmd
|
|
13
16
|
.command('teams')
|
|
14
17
|
.description('Import channel messages from Microsoft Teams')
|
|
15
18
|
.option('--token <token>', 'Microsoft Graph API delegated access token')
|
|
16
19
|
.option('--personal', 'Connect via browser OAuth (Align Teams app) instead of pasting a Graph token')
|
|
17
|
-
.option('--limit <n>', 'Max messages to import',
|
|
20
|
+
.option('--limit <n>', 'Max messages to import', String(IMPORT_LIMITS.teams))
|
|
18
21
|
.option('--approve', 'Skip confirmation prompt')
|
|
19
22
|
.option('--env <env>', 'Environment')
|
|
20
23
|
.action(async (_opts, cmd) => {
|
|
@@ -44,12 +47,14 @@ export function registerImportTeamsCommand(importCmd) {
|
|
|
44
47
|
const spinner = p.spinner();
|
|
45
48
|
spinner.start('Fetching channel messages from Microsoft Teams...');
|
|
46
49
|
try {
|
|
47
|
-
const
|
|
50
|
+
const fetched = await fetchTeamsItems({
|
|
48
51
|
token,
|
|
49
52
|
limit: parseInt(opts.limit, 10),
|
|
50
53
|
});
|
|
54
|
+
const { items } = fetched;
|
|
51
55
|
spinner.stop(`Found ${items.length} messages`);
|
|
52
56
|
await runPersonalImport(items, client, { label: 'Teams', approve: opts.approve, appUrl: resolveAppUrl(env), funnel: { env, source: 'teams' } });
|
|
57
|
+
console.log(`${renderCaptureReport([toCaptureSource(CAPTURE_SOURCES.teams, fetched)])}\n`);
|
|
53
58
|
}
|
|
54
59
|
catch (err) {
|
|
55
60
|
spinner.stop('');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"teams.js","sourceRoot":"","sources":["../../../src/commands/import/teams.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,KAAK,CAAC,MAAM,gBAAgB,CAAC;AACpC,OAAO,EAAE,iBAAiB,EAAgB,MAAM,qBAAqB,CAAC;AACtE,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"teams.js","sourceRoot":"","sources":["../../../src/commands/import/teams.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,KAAK,CAAC,MAAM,gBAAgB,CAAC;AACpC,OAAO,EAAE,iBAAiB,EAAgB,MAAM,qBAAqB,CAAC;AACtE,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AACnF,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAU7D,MAAM,UAAU,0BAA0B,CAAC,SAAkB;IAC3D,SAAS;SACN,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,8CAA8C,CAAC;SAC3D,MAAM,CAAC,iBAAiB,EAAE,4CAA4C,CAAC;SACvE,MAAM,CAAC,YAAY,EAAE,8EAA8E,CAAC;SACpG,MAAM,CAAC,aAAa,EAAE,wBAAwB,EAAE,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;SAC5E,MAAM,CAAC,WAAW,EAAE,0BAA0B,CAAC;SAC/C,MAAM,CAAC,aAAa,EAAE,aAAa,CAAC;SACpC,MAAM,CAAC,KAAK,EAAE,KAAsB,EAAE,GAAY,EAAE,EAAE;QACrD,MAAM,IAAI,GAAG,cAAc,CAAkB,GAAG,CAAC,CAAC;QAClD,CAAC,CAAC,GAAG,CAAC,IAAI,CACR,4EAA4E;YAC5E,2EAA2E;YAC3E,gEAAgE,CACjE,CAAC;QAEF,MAAM,MAAM,GAAG,iBAAiB,EAAE,CAAC;QACnC,MAAM,OAAO,GAAG,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC3C,MAAM,GAAG,GAAG,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;QAC3C,MAAM,MAAM,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC;QAExC,IAAI,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QACvB,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC5B,IAAI,CAAC;gBACH,CAAC,EAAE,KAAK,EAAE,GAAG,MAAM,sBAAsB,CAAC,OAAO,EAAE,iBAAiB,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;YAC3G,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,CAAC,CAAC,GAAG,CAAC,KAAK,CAAE,GAAa,CAAC,OAAO,CAAC,CAAC;gBACpC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;QACD,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,+FAA+F,CAAC,CAAC;YAC7G,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC,oBAAoB,CAAC,CAAC,CAAC;QAC5C,MAAM,OAAO,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC;QAC5B,OAAO,CAAC,KAAK,CAAC,mDAAmD,CAAC,CAAC;QACnE,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC;gBACpC,KAAK;gBACL,KAAK,EAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC;aAChC,CAAC,CAAC;YACH,MAAM,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC;YAC1B,OAAO,CAAC,IAAI,CAAC,SAAS,KAAK,CAAC,MAAM,WAAW,CAAC,CAAC;YAC/C,MAAM,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,aAAa,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC;YAChJ,OAAO,CAAC,GAAG,CAAC,GAAG,mBAAmB,CAAC,CAAC,eAAe,CAAC,eAAe,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC7F,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACjB,CAAC,CAAC,GAAG,CAAC,KAAK,CAAE,GAAa,CAAC,OAAO,CAAC,CAAC;YACpC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"zoom.d.ts","sourceRoot":"","sources":["../../../src/commands/import/zoom.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"zoom.d.ts","sourceRoot":"","sources":["../../../src/commands/import/zoom.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAuBzC,wBAAgB,yBAAyB,CAAC,SAAS,EAAE,OAAO,GAAG,IAAI,CAgDlE"}
|
|
@@ -6,15 +6,18 @@ import { resolveImportEnv } from '../../lib/resolve-env.js';
|
|
|
6
6
|
import { resolveAppUrl } from '../../lib/env-resolver.js';
|
|
7
7
|
import { fetchZoomItems } from '../../lib/fetchers/zoom.js';
|
|
8
8
|
import { runPersonalImport } from '../../lib/personal-import.js';
|
|
9
|
+
import { renderCaptureReport, toCaptureSource } from '../../lib/capture-report.js';
|
|
10
|
+
import { CAPTURE_SOURCES } from '../../lib/capture-sources.js';
|
|
9
11
|
import { personalCredsForImport } from '../../lib/personal-oauth.js';
|
|
10
12
|
import { commandIntro } from '../../lib/brand.js';
|
|
13
|
+
import { IMPORT_LIMITS } from '../../lib/import-defaults.js';
|
|
11
14
|
export function registerImportZoomCommand(importCmd) {
|
|
12
15
|
importCmd
|
|
13
16
|
.command('zoom')
|
|
14
17
|
.description('Import cloud recording transcripts from Zoom')
|
|
15
18
|
.option('--token <token>', 'Zoom OAuth access token')
|
|
16
19
|
.option('--personal', 'Connect via browser OAuth (Align Zoom app) instead of pasting a token')
|
|
17
|
-
.option('--limit <n>', 'Max recordings to import',
|
|
20
|
+
.option('--limit <n>', 'Max recordings to import', String(IMPORT_LIMITS.zoom))
|
|
18
21
|
.option('--approve', 'Skip confirmation prompt')
|
|
19
22
|
.option('--env <env>', 'Environment')
|
|
20
23
|
.action(async (_opts, cmd) => {
|
|
@@ -41,12 +44,14 @@ export function registerImportZoomCommand(importCmd) {
|
|
|
41
44
|
const spinner = p.spinner();
|
|
42
45
|
spinner.start('Fetching cloud recording transcripts from Zoom...');
|
|
43
46
|
try {
|
|
44
|
-
const
|
|
47
|
+
const fetched = await fetchZoomItems({
|
|
45
48
|
token,
|
|
46
49
|
limit: parseInt(opts.limit, 10),
|
|
47
50
|
});
|
|
51
|
+
const { items } = fetched;
|
|
48
52
|
spinner.stop(`Found ${items.length} recordings with transcripts`);
|
|
49
53
|
await runPersonalImport(items, client, { label: 'Zoom', approve: opts.approve, appUrl: resolveAppUrl(env), funnel: { env, source: 'zoom' } });
|
|
54
|
+
console.log(`${renderCaptureReport([toCaptureSource(CAPTURE_SOURCES.zoom, fetched)])}\n`);
|
|
50
55
|
}
|
|
51
56
|
catch (err) {
|
|
52
57
|
spinner.stop('');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"zoom.js","sourceRoot":"","sources":["../../../src/commands/import/zoom.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,KAAK,CAAC,MAAM,gBAAgB,CAAC;AACpC,OAAO,EAAE,iBAAiB,EAAgB,MAAM,qBAAqB,CAAC;AACtE,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"zoom.js","sourceRoot":"","sources":["../../../src/commands/import/zoom.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/commands/setup.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMzC,OAAO,EAAqB,KAAK,OAAO,EAAkB,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/commands/setup.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMzC,OAAO,EAAqB,KAAK,OAAO,EAAkB,MAAM,kBAAkB,CAAC;AA4WnF;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,MAAM,CAE1E;AA0YD,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAS3D;AAED;;;;;;;;GAQG;AACH,wBAAsB,QAAQ,CAC5B,IAAI,GAAE;IAAE,GAAG,CAAC,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAO,GAChF,OAAO,CAAC,IAAI,CAAC,CAkDf"}
|
package/dist/commands/setup.js
CHANGED
|
@@ -13,6 +13,9 @@ import { isGitRepo } from '../lib/git.js';
|
|
|
13
13
|
import { fetchDocsItems } from '../lib/fetchers/docs.js';
|
|
14
14
|
import { createLocalDb } from '../lib/local-db.js';
|
|
15
15
|
import { buildFoundSummary, renderFoundSummary } from '../lib/found-summary.js';
|
|
16
|
+
import { createCaptureCollector, toCaptureSource } from '../lib/capture-report.js';
|
|
17
|
+
import { CAPTURE_SOURCES } from '../lib/capture-sources.js';
|
|
18
|
+
import { IMPORT_LIMITS, SLACK_DAYS_BACK } from '../lib/import-defaults.js';
|
|
16
19
|
import { initLocalMode } from '../lib/local-mode.js';
|
|
17
20
|
import { loginInteractive } from '../lib/login-flow.js';
|
|
18
21
|
import { resolveAppUrl } from '../lib/env-resolver.js';
|
|
@@ -34,17 +37,17 @@ function buildSources(gitAvailable) {
|
|
|
34
37
|
if (gitAvailable) {
|
|
35
38
|
sources.push({
|
|
36
39
|
id: 'git',
|
|
37
|
-
|
|
40
|
+
...CAPTURE_SOURCES.git,
|
|
38
41
|
description: 'Commit history from this repo - no token needed',
|
|
39
42
|
fetch: async () => {
|
|
40
43
|
const { fetchGitItems } = await import('../lib/fetchers/git.js');
|
|
41
|
-
return fetchGitItems({ limit:
|
|
44
|
+
return fetchGitItems({ limit: IMPORT_LIMITS.git });
|
|
42
45
|
},
|
|
43
46
|
});
|
|
44
47
|
}
|
|
45
48
|
sources.push({
|
|
46
49
|
id: 'github',
|
|
47
|
-
|
|
50
|
+
...CAPTURE_SOURCES.github,
|
|
48
51
|
description: 'Your PRs and issues',
|
|
49
52
|
tier: 'personal',
|
|
50
53
|
oauthKey: 'github-personal',
|
|
@@ -62,11 +65,11 @@ function buildSources(gitAvailable) {
|
|
|
62
65
|
'&contents=read&issues=read&pull_requests=read',
|
|
63
66
|
fetch: async (t) => {
|
|
64
67
|
const { fetchGitHubItems } = await import('../lib/fetchers/github.js');
|
|
65
|
-
return fetchGitHubItems({ token: t['token'], limit:
|
|
68
|
+
return fetchGitHubItems({ token: t['token'], limit: IMPORT_LIMITS.github });
|
|
66
69
|
},
|
|
67
70
|
}, {
|
|
68
71
|
id: 'jira',
|
|
69
|
-
|
|
72
|
+
...CAPTURE_SOURCES.jira,
|
|
70
73
|
description: 'Your issues',
|
|
71
74
|
tier: 'site',
|
|
72
75
|
// Personal/CLI tier is read-only (no write:jira-work). The team/org
|
|
@@ -82,11 +85,11 @@ function buildSources(gitAvailable) {
|
|
|
82
85
|
],
|
|
83
86
|
fetch: async (t) => {
|
|
84
87
|
const { fetchJiraItems } = await import('../lib/fetchers/jira.js');
|
|
85
|
-
return fetchJiraItems({ token: t['token'], cloudId: t['cloudId'], email: t['email'], domain: t['domain'], limit:
|
|
88
|
+
return fetchJiraItems({ token: t['token'], cloudId: t['cloudId'], email: t['email'], domain: t['domain'], limit: IMPORT_LIMITS.jira });
|
|
86
89
|
},
|
|
87
90
|
}, {
|
|
88
91
|
id: 'confluence',
|
|
89
|
-
|
|
92
|
+
...CAPTURE_SOURCES.confluence,
|
|
90
93
|
description: 'Your pages and documentation',
|
|
91
94
|
tier: 'site',
|
|
92
95
|
// Read-only personal/CLI tier. See ALI-94.
|
|
@@ -101,11 +104,11 @@ function buildSources(gitAvailable) {
|
|
|
101
104
|
],
|
|
102
105
|
fetch: async (t) => {
|
|
103
106
|
const { fetchConfluenceItems } = await import('../lib/fetchers/confluence.js');
|
|
104
|
-
return fetchConfluenceItems({ token: t['token'], cloudId: t['cloudId'], email: t['email'], domain: t['domain'], limit:
|
|
107
|
+
return fetchConfluenceItems({ token: t['token'], cloudId: t['cloudId'], email: t['email'], domain: t['domain'], limit: IMPORT_LIMITS.confluence });
|
|
105
108
|
},
|
|
106
109
|
}, {
|
|
107
110
|
id: 'slack',
|
|
108
|
-
|
|
111
|
+
...CAPTURE_SOURCES.slack,
|
|
109
112
|
description: 'Decision threads from your channels - may need workspace admin [experimental]',
|
|
110
113
|
tier: 'workspace',
|
|
111
114
|
// Read-only personal/CLI tier (no chat:write). The team/org bot keeps
|
|
@@ -117,31 +120,31 @@ function buildSources(gitAvailable) {
|
|
|
117
120
|
tokenUrl: 'https://api.slack.com/apps',
|
|
118
121
|
fetch: async (t) => {
|
|
119
122
|
const { fetchSlackItems } = await import('../lib/fetchers/slack.js');
|
|
120
|
-
return fetchSlackItems({ token: t['token'], limit:
|
|
123
|
+
return fetchSlackItems({ token: t['token'], limit: IMPORT_LIMITS.slack, daysBack: SLACK_DAYS_BACK });
|
|
121
124
|
},
|
|
122
125
|
}, {
|
|
123
126
|
id: 'teams',
|
|
124
|
-
|
|
127
|
+
...CAPTURE_SOURCES.teams,
|
|
125
128
|
description: 'Channel messages and decisions - may need org/workspace admin consent',
|
|
126
129
|
tier: 'workspace',
|
|
127
130
|
oauthKey: 'teams',
|
|
128
131
|
fetch: async (t) => {
|
|
129
132
|
const { fetchTeamsItems } = await import('../lib/fetchers/teams.js');
|
|
130
|
-
return fetchTeamsItems({ token: t['token'], limit:
|
|
133
|
+
return fetchTeamsItems({ token: t['token'], limit: IMPORT_LIMITS.teams });
|
|
131
134
|
},
|
|
132
135
|
}, {
|
|
133
136
|
id: 'zoom',
|
|
134
|
-
|
|
137
|
+
...CAPTURE_SOURCES.zoom,
|
|
135
138
|
description: 'Cloud recording transcripts from your meetings',
|
|
136
139
|
tier: 'personal',
|
|
137
140
|
oauthKey: 'zoom',
|
|
138
141
|
fetch: async (t) => {
|
|
139
142
|
const { fetchZoomItems } = await import('../lib/fetchers/zoom.js');
|
|
140
|
-
return fetchZoomItems({ token: t['token'], limit:
|
|
143
|
+
return fetchZoomItems({ token: t['token'], limit: IMPORT_LIMITS.zoom });
|
|
141
144
|
},
|
|
142
145
|
}, {
|
|
143
146
|
id: 'gitlab',
|
|
144
|
-
|
|
147
|
+
...CAPTURE_SOURCES.gitlab,
|
|
145
148
|
description: 'Your merge requests',
|
|
146
149
|
tier: 'personal',
|
|
147
150
|
// gitlab.com → read-only browser OAuth (scope read_api, ALI-102). A
|
|
@@ -164,11 +167,11 @@ function buildSources(gitAvailable) {
|
|
|
164
167
|
],
|
|
165
168
|
fetch: async (t) => {
|
|
166
169
|
const { fetchGitLabItems } = await import('../lib/fetchers/gitlab.js');
|
|
167
|
-
return fetchGitLabItems({ token: t['token'], domain: t['domain'] || undefined, limit:
|
|
170
|
+
return fetchGitLabItems({ token: t['token'], domain: t['domain'] || undefined, limit: IMPORT_LIMITS.gitlab });
|
|
168
171
|
},
|
|
169
172
|
}, {
|
|
170
173
|
id: 'linear',
|
|
171
|
-
|
|
174
|
+
...CAPTURE_SOURCES.linear,
|
|
172
175
|
description: 'Your issues and project discussions',
|
|
173
176
|
tier: 'personal',
|
|
174
177
|
// Read-only personal/CLI tier via browser OAuth (scope `read`), replacing the
|
|
@@ -184,11 +187,11 @@ function buildSources(gitAvailable) {
|
|
|
184
187
|
tokenUrl: 'https://linear.app/settings/account/security/api-keys/new',
|
|
185
188
|
fetch: async (t) => {
|
|
186
189
|
const { fetchLinearItems } = await import('../lib/fetchers/linear.js');
|
|
187
|
-
return fetchLinearItems({ token: t['token'], limit:
|
|
190
|
+
return fetchLinearItems({ token: t['token'], limit: IMPORT_LIMITS.linear });
|
|
188
191
|
},
|
|
189
192
|
}, {
|
|
190
193
|
id: 'notion',
|
|
191
|
-
|
|
194
|
+
...CAPTURE_SOURCES.notion,
|
|
192
195
|
description: 'Your pages and databases',
|
|
193
196
|
tier: 'personal',
|
|
194
197
|
// Read-only personal/CLI tier via browser OAuth (public integration),
|
|
@@ -207,7 +210,7 @@ function buildSources(gitAvailable) {
|
|
|
207
210
|
tokenUrl: 'https://app.notion.com/developers/tokens',
|
|
208
211
|
fetch: async (t) => {
|
|
209
212
|
const { fetchNotionItems } = await import('../lib/fetchers/notion.js');
|
|
210
|
-
return fetchNotionItems({ token: t['token'], limit:
|
|
213
|
+
return fetchNotionItems({ token: t['token'], limit: IMPORT_LIMITS.notion });
|
|
211
214
|
},
|
|
212
215
|
});
|
|
213
216
|
return sources;
|
|
@@ -339,6 +342,7 @@ async function runLocalValuePhase(opts = {}) {
|
|
|
339
342
|
const config = createConfigStore();
|
|
340
343
|
const localEnv = config.getEnvironment('local');
|
|
341
344
|
const localClient = createGatewayClient(localEnv);
|
|
345
|
+
const capture = createCaptureCollector();
|
|
342
346
|
// ALI-794: value before questions. Git needs no credential and no consent, so it runs
|
|
343
347
|
// before anything is asked - the found-decisions summary below is what "here is what I
|
|
344
348
|
// found" means, and it has to exist before the agent-wiring/consent/connector steps that
|
|
@@ -351,7 +355,9 @@ async function runLocalValuePhase(opts = {}) {
|
|
|
351
355
|
gitSpinner.start('Scanning git history...');
|
|
352
356
|
try {
|
|
353
357
|
const gitSource = buildSources(true).find(s => s.id === 'git');
|
|
354
|
-
const
|
|
358
|
+
const fetched = await gitSource.fetch({});
|
|
359
|
+
capture.add(toCaptureSource(gitSource, fetched));
|
|
360
|
+
const { items } = fetched;
|
|
355
361
|
if (items.length) {
|
|
356
362
|
gitSpinner.stop(`Found ${items.length} commits worth importing`);
|
|
357
363
|
// quiet: the found-summary box right below replaces the full table + tip block
|
|
@@ -412,7 +418,9 @@ async function runLocalValuePhase(opts = {}) {
|
|
|
412
418
|
const localDocsSpinner = p.spinner();
|
|
413
419
|
localDocsSpinner.start('Reading ADRs and CLAUDE.md/AGENTS.md...');
|
|
414
420
|
try {
|
|
415
|
-
const
|
|
421
|
+
const docs = await fetchDocsItems({ limit: IMPORT_LIMITS.docs });
|
|
422
|
+
capture.add(toCaptureSource(CAPTURE_SOURCES.docs, docs));
|
|
423
|
+
const docsItems = docs.items;
|
|
416
424
|
if (docsItems.length) {
|
|
417
425
|
localDocsSpinner.stop(`Found ${docsItems.length} item(s) worth importing`);
|
|
418
426
|
await runPersonalImport(docsItems, localClient, {
|
|
@@ -448,7 +456,7 @@ async function runLocalValuePhase(opts = {}) {
|
|
|
448
456
|
// is the only thing that can ever turn this on - see usage-telemetry.ts's local-embedded
|
|
449
457
|
// branch, which reads this same stored decision.
|
|
450
458
|
await maybeRequestTelemetryConsent(config, Boolean(interactive));
|
|
451
|
-
return { interactive, config, localEnv, localClient, dbPath, opts };
|
|
459
|
+
return { interactive, config, localEnv, localClient, dbPath, opts, capture };
|
|
452
460
|
}
|
|
453
461
|
/**
|
|
454
462
|
* The connector-picker tail, shared by every path that reaches local mode: `--local`
|
|
@@ -459,7 +467,7 @@ async function runLocalValuePhase(opts = {}) {
|
|
|
459
467
|
* move changes only how code is reached, never what it does).
|
|
460
468
|
*/
|
|
461
469
|
async function runLocalConnectorPhase(ctx) {
|
|
462
|
-
const { interactive, config, localEnv, localClient, dbPath, opts } = ctx;
|
|
470
|
+
const { interactive, config, localEnv, localClient, dbPath, opts, capture } = ctx;
|
|
463
471
|
// Connectors: local mode connects by a read-only token the user mints themselves,
|
|
464
472
|
// for every connector - their personal graph, their credential. OAuth belongs to
|
|
465
473
|
// the personal-cloud path, where the hosted broker holds the client secrets. (This
|
|
@@ -580,7 +588,9 @@ async function runLocalConnectorPhase(ctx) {
|
|
|
580
588
|
const spinner = p.spinner();
|
|
581
589
|
spinner.start(`Fetching from ${source.label}...`);
|
|
582
590
|
try {
|
|
583
|
-
const
|
|
591
|
+
const fetched = await source.fetch(tokens);
|
|
592
|
+
capture.add(toCaptureSource(source, fetched));
|
|
593
|
+
const { items } = fetched;
|
|
584
594
|
// Saved only once the fetch it unlocked has succeeded. A token that never worked is not
|
|
585
595
|
// worth remembering, and storing one would turn the next run's honest "paste a token"
|
|
586
596
|
// into a silent empty import. Re-saving an already-saved token is a harmless no-op, so
|
|
@@ -601,6 +611,16 @@ async function runLocalConnectorPhase(ctx) {
|
|
|
601
611
|
spinner.stop(`Skipped ${source.label} - ${e.message}`);
|
|
602
612
|
}
|
|
603
613
|
}
|
|
614
|
+
// ALI-827: what each source fetched and what it could not reach - once, after every
|
|
615
|
+
// import has printed its own line, so the numbers sit together. A source whose fetch
|
|
616
|
+
// THREW is not in it: its spinner line above already named the error, and a row of
|
|
617
|
+
// zeros beside it would read as "fetched nothing" rather than "could not fetch". Empty
|
|
618
|
+
// only when nothing was fetched at all (no git repo, no docs, nothing connected).
|
|
619
|
+
const captureText = capture.render();
|
|
620
|
+
if (captureText) {
|
|
621
|
+
console.log('');
|
|
622
|
+
console.log(captureText);
|
|
623
|
+
}
|
|
604
624
|
// Which graph does a BARE command read after this? resolveEnv with the
|
|
605
625
|
// most local-favouring read preference is the truth: a no-account user is
|
|
606
626
|
// redirected to local and there is nothing to say; a cloud token (or an
|
|
@@ -731,10 +751,18 @@ export async function runSetup(opts = {}) {
|
|
|
731
751
|
*/
|
|
732
752
|
async function runFreshSetup(ctx) {
|
|
733
753
|
const phase = await runLocalValuePhase({ approve: ctx.opts.approve });
|
|
754
|
+
// The value phase's capture report is printed by runLocalConnectorPhase, so choosing
|
|
755
|
+
// cloud below drops it - deliberately: runCloudSetup re-imports git and docs into the
|
|
756
|
+
// cloud tenant and prints its own report, which is the one that describes that graph.
|
|
734
757
|
// Framed by what the graph is missing, not "how are you using Align" in the abstract -
|
|
735
758
|
// there is already a local graph on screen, so the question is whether to extend it.
|
|
759
|
+
//
|
|
760
|
+
// "A path to team sharing", never "for team sharing": choosing cloud creates a
|
|
761
|
+
// PERSONAL tenant (the option's hint says so) and a team is a separate join/upgrade
|
|
762
|
+
// later. The question and the option below must keep agreeing on that - the question
|
|
763
|
+
// overclaimed for a while and a live tester read it as sharing starting here.
|
|
736
764
|
const choice = await p.select({
|
|
737
|
-
message: 'Stay local, or sync to the cloud for
|
|
765
|
+
message: 'Stay local, or sync to the cloud for backup, richer detection, and a path to team sharing?',
|
|
738
766
|
options: [
|
|
739
767
|
{ value: 'local', label: 'Stay local - keep what you just built, private and offline', hint: 'no account' },
|
|
740
768
|
{ value: 'cloud', label: 'Sync to the cloud - backup, team upgrade path, richer detection', hint: 'personal tenant' },
|
|
@@ -905,13 +933,16 @@ async function runCloudSetup(ctx) {
|
|
|
905
933
|
let totalDecisions = 0;
|
|
906
934
|
const sourcesImported = [];
|
|
907
935
|
const gitAvailable = await isGitRepo();
|
|
936
|
+
const capture = createCaptureCollector();
|
|
908
937
|
if (gitAvailable) {
|
|
909
938
|
console.log('');
|
|
910
939
|
const gitSpinner = p.spinner();
|
|
911
940
|
gitSpinner.start('Scanning git history...');
|
|
912
941
|
try {
|
|
913
942
|
const gitSource = buildSources(true).find(s => s.id === 'git');
|
|
914
|
-
const
|
|
943
|
+
const fetched = await gitSource.fetch({});
|
|
944
|
+
capture.add(toCaptureSource(gitSource, fetched));
|
|
945
|
+
const { items } = fetched;
|
|
915
946
|
// Stop the scan spinner before runPersonalImport - it starts its own
|
|
916
947
|
// progress spinner, and two animated spinners on one line flicker.
|
|
917
948
|
if (items.length) {
|
|
@@ -940,7 +971,9 @@ async function runCloudSetup(ctx) {
|
|
|
940
971
|
const docsSpinner = p.spinner();
|
|
941
972
|
docsSpinner.start('Reading ADRs and CLAUDE.md/AGENTS.md...');
|
|
942
973
|
try {
|
|
943
|
-
const
|
|
974
|
+
const docs = await fetchDocsItems({ limit: IMPORT_LIMITS.docs });
|
|
975
|
+
capture.add(toCaptureSource(CAPTURE_SOURCES.docs, docs));
|
|
976
|
+
const docsItems = docs.items;
|
|
944
977
|
if (docsItems.length) {
|
|
945
978
|
docsSpinner.stop(`Found ${docsItems.length} item(s) worth importing`);
|
|
946
979
|
const ingested = await runPersonalImport(docsItems, client, {
|
|
@@ -969,7 +1002,7 @@ async function runCloudSetup(ctx) {
|
|
|
969
1002
|
// connector, not just the Atlassian fetchers that throw the typed AuthExpiredError.
|
|
970
1003
|
const fetched = await Promise.all(readyConnectors.map(async ({ source, tokens }) => {
|
|
971
1004
|
try {
|
|
972
|
-
return { source,
|
|
1005
|
+
return { source, fetched: await source.fetch(tokens) };
|
|
973
1006
|
}
|
|
974
1007
|
catch (err) {
|
|
975
1008
|
if (source.oauthKey && isAuthExpiry(err)) {
|
|
@@ -984,9 +1017,11 @@ async function runCloudSetup(ctx) {
|
|
|
984
1017
|
const ready = [];
|
|
985
1018
|
for (const result of fetched) {
|
|
986
1019
|
const source = result.source;
|
|
987
|
-
if ('
|
|
988
|
-
|
|
989
|
-
|
|
1020
|
+
if ('fetched' in result) {
|
|
1021
|
+
capture.add(toCaptureSource(source, result.fetched));
|
|
1022
|
+
const { items } = result.fetched;
|
|
1023
|
+
if (items.length)
|
|
1024
|
+
ready.push({ source, items });
|
|
990
1025
|
else
|
|
991
1026
|
p.log.warn(`No items found in ${source.label}.`);
|
|
992
1027
|
}
|
|
@@ -1013,7 +1048,9 @@ async function runCloudSetup(ctx) {
|
|
|
1013
1048
|
const retrySpinner = p.spinner();
|
|
1014
1049
|
retrySpinner.start(`Retrying ${source.label}...`);
|
|
1015
1050
|
try {
|
|
1016
|
-
const
|
|
1051
|
+
const fetched = await source.fetch(fresh);
|
|
1052
|
+
capture.add(toCaptureSource(source, fetched));
|
|
1053
|
+
const { items } = fetched;
|
|
1017
1054
|
retrySpinner.stop(`Found ${items.length} items`);
|
|
1018
1055
|
if (items.length)
|
|
1019
1056
|
ready.push({ source, items });
|
|
@@ -1063,6 +1100,12 @@ async function runCloudSetup(ctx) {
|
|
|
1063
1100
|
console.log(chalk.dim('Query your graph: align ask "..." or align decisions list'));
|
|
1064
1101
|
console.log('');
|
|
1065
1102
|
}
|
|
1103
|
+
// ALI-827: the capture report, once, after every source has imported.
|
|
1104
|
+
const captureText = capture.render();
|
|
1105
|
+
if (captureText) {
|
|
1106
|
+
console.log(captureText);
|
|
1107
|
+
console.log('');
|
|
1108
|
+
}
|
|
1066
1109
|
// ---- Outro ----
|
|
1067
1110
|
const decisionsLine = totalDecisions > 0
|
|
1068
1111
|
? ` ${totalDecisions} decisions in your graph`
|