@itznexus/itznexus-cli 1.142.0 → 1.144.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/agents/project-stack.d.ts +2 -0
- package/dist/commands/agents/project-stack.js +101 -0
- package/dist/commands/agents/project-stack.js.map +1 -0
- package/dist/commands/api/outreach-catalog.d.ts +2 -0
- package/dist/commands/api/outreach-catalog.js +167 -0
- package/dist/commands/api/outreach-catalog.js.map +1 -0
- package/dist/commands/api/outreach-companies.d.ts +2 -0
- package/dist/commands/api/outreach-companies.js +93 -0
- package/dist/commands/api/outreach-companies.js.map +1 -0
- package/dist/commands/api/outreach-company-writes.d.ts +2 -0
- package/dist/commands/api/outreach-company-writes.js +101 -0
- package/dist/commands/api/outreach-company-writes.js.map +1 -0
- package/dist/commands/api/outreach-enrollment-writes.d.ts +2 -0
- package/dist/commands/api/outreach-enrollment-writes.js +144 -0
- package/dist/commands/api/outreach-enrollment-writes.js.map +1 -0
- package/dist/commands/api/outreach-enrollments.d.ts +2 -0
- package/dist/commands/api/outreach-enrollments.js +92 -0
- package/dist/commands/api/outreach-enrollments.js.map +1 -0
- package/dist/commands/api/outreach-prospect-writes.d.ts +2 -0
- package/dist/commands/api/outreach-prospect-writes.js +139 -0
- package/dist/commands/api/outreach-prospect-writes.js.map +1 -0
- package/dist/commands/api/outreach-prospects.d.ts +2 -0
- package/dist/commands/api/outreach-prospects.js +96 -0
- package/dist/commands/api/outreach-prospects.js.map +1 -0
- package/dist/commands/api/outreach-settings.d.ts +2 -0
- package/dist/commands/api/outreach-settings.js +193 -0
- package/dist/commands/api/outreach-settings.js.map +1 -0
- package/dist/commands/api/outreach-shared.d.ts +24 -0
- package/dist/commands/api/outreach-shared.js +34 -0
- package/dist/commands/api/outreach-shared.js.map +1 -0
- package/dist/commands/api/outreach-signals.d.ts +2 -0
- package/dist/commands/api/outreach-signals.js +80 -0
- package/dist/commands/api/outreach-signals.js.map +1 -0
- package/dist/commands/api/outreach.d.ts +2 -0
- package/dist/commands/api/outreach.js +21 -0
- package/dist/commands/api/outreach.js.map +1 -0
- package/dist/commands/api/projects.js +2 -0
- package/dist/commands/api/projects.js.map +1 -1
- package/dist/commands/api/seo-backlinks.js +1 -1
- package/dist/commands/api/seo-backlinks.js.map +1 -1
- package/dist/commands/api/seo-catalog.js +1 -1
- package/dist/commands/api/seo-catalog.js.map +1 -1
- package/dist/commands/api/seo-changes.js +1 -1
- package/dist/commands/api/seo-changes.js.map +1 -1
- package/dist/commands/api/seo-data.js +1 -1
- package/dist/commands/api/seo-data.js.map +1 -1
- package/dist/commands/api/seo-keyword-writes.js +1 -1
- package/dist/commands/api/seo-keyword-writes.js.map +1 -1
- package/dist/commands/api/seo-keywords.js +1 -1
- package/dist/commands/api/seo-keywords.js.map +1 -1
- package/dist/commands/api/seo-offers.js +1 -1
- package/dist/commands/api/seo-offers.js.map +1 -1
- package/dist/commands/api/seo-page-writes.js +1 -1
- package/dist/commands/api/seo-page-writes.js.map +1 -1
- package/dist/commands/api/seo-pages.js +1 -1
- package/dist/commands/api/seo-pages.js.map +1 -1
- package/dist/commands/api/seo-settings.js +1 -1
- package/dist/commands/api/seo-settings.js.map +1 -1
- package/dist/commands/api/seo-site.js +1 -1
- package/dist/commands/api/seo-site.js.map +1 -1
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -1
- package/dist/{commands/api/seo-shared.d.ts → lib/command-helpers.d.ts} +1 -1
- package/dist/{commands/api/seo-shared.js → lib/command-helpers.js} +8 -8
- package/dist/lib/command-helpers.js.map +1 -0
- package/dist/lib/stack/driver.d.ts +14 -0
- package/dist/lib/stack/driver.js +228 -0
- package/dist/lib/stack/driver.js.map +1 -0
- package/dist/lib/stack/manifest.d.ts +28 -0
- package/dist/lib/stack/manifest.js +182 -0
- package/dist/lib/stack/manifest.js.map +1 -0
- package/dist/lib/stack/processes.d.ts +11 -0
- package/dist/lib/stack/processes.js +139 -0
- package/dist/lib/stack/processes.js.map +1 -0
- package/dist/lib/stack/registry.d.ts +24 -0
- package/dist/lib/stack/registry.js +37 -0
- package/dist/lib/stack/registry.js.map +1 -0
- package/package.json +3 -2
- package/dist/commands/api/seo-shared.js.map +0 -1
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import chalk from "chalk";
|
|
3
|
+
import { api } from "../../lib/api.js";
|
|
4
|
+
import { handleError, printList } from "../../lib/format.js";
|
|
5
|
+
import { compact, csv, done, nullable, printJson, readJsonObject, } from "../../lib/command-helpers.js";
|
|
6
|
+
const THRESHOLD_KEYS = "dailyMessage1Cap, dailySendCeiling, bounceRateCeiling (fraction), spamRateCeiling (fraction), draftStaleDays, finderScoreFloor, reEnrollmentMonths, lateReplyDays";
|
|
7
|
+
function printSettings(data) {
|
|
8
|
+
const lines = [
|
|
9
|
+
["mailbox", data.mailbox],
|
|
10
|
+
["signature", data.signature],
|
|
11
|
+
["catchAllPolicy", data.catchAllPolicy],
|
|
12
|
+
["forbiddenTerms", data.forbiddenTerms.join(", ") || null],
|
|
13
|
+
];
|
|
14
|
+
for (const [key, value] of lines) {
|
|
15
|
+
console.log(` ${key.padEnd(30)} ${value ?? chalk.dim("-")}`);
|
|
16
|
+
}
|
|
17
|
+
for (const [key, value] of Object.entries(data.thresholds)) {
|
|
18
|
+
const changed = data.defaults[key] !== value;
|
|
19
|
+
const suffix = changed ? chalk.dim(` (default ${data.defaults[key]})`) : "";
|
|
20
|
+
console.log(` ${key.padEnd(30)} ${value}${suffix}`);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
function parseThresholds(pairs) {
|
|
24
|
+
const thresholds = {};
|
|
25
|
+
for (const pair of pairs) {
|
|
26
|
+
const [key, value] = pair.split("=");
|
|
27
|
+
if (!key || value === undefined) {
|
|
28
|
+
throw new Error(`Expected key=value, got "${pair}"`);
|
|
29
|
+
}
|
|
30
|
+
const n = Number(value.trim());
|
|
31
|
+
if (value.trim() === "" || !Number.isFinite(n)) {
|
|
32
|
+
throw new Error(`${key} must be a number`);
|
|
33
|
+
}
|
|
34
|
+
thresholds[key.trim()] = n;
|
|
35
|
+
}
|
|
36
|
+
return thresholds;
|
|
37
|
+
}
|
|
38
|
+
const settingsGet = new Command("get")
|
|
39
|
+
.description("Show the Outreach settings: mailbox, signature, forbidden terms, catch-all policy, thresholds (with defaults)")
|
|
40
|
+
.option("--json", "Output as JSON")
|
|
41
|
+
.action(async (opts) => {
|
|
42
|
+
try {
|
|
43
|
+
const data = await api.get("/outreach/settings");
|
|
44
|
+
if (opts.json)
|
|
45
|
+
printJson(data);
|
|
46
|
+
else
|
|
47
|
+
printSettings(data);
|
|
48
|
+
}
|
|
49
|
+
catch (err) {
|
|
50
|
+
handleError(err);
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
const settingsSet = new Command("set")
|
|
54
|
+
.description("Change one or more Outreach settings; unset ones keep their value")
|
|
55
|
+
.option("--mailbox <email>", 'Sending mailbox ("null" to clear)')
|
|
56
|
+
.option("--signature <text>", 'Signature appended to drafts ("null" to clear)')
|
|
57
|
+
.option("--forbidden-terms <list>", 'Comma-separated terms no draft may contain, replaces the list ("none" to clear)')
|
|
58
|
+
.option("--catch-all-policy <policy>", "pattern-confirmed | never")
|
|
59
|
+
.option("--threshold <key=value...>", `Threshold to set, repeatable (e.g. --threshold dailyMessage1Cap=8); keys: ${THRESHOLD_KEYS}`)
|
|
60
|
+
.option("--file <path>", "JSON object with any of the fields above (camelCase, thresholds as an object); flags win")
|
|
61
|
+
.option("--json", "Output as JSON")
|
|
62
|
+
.action(async (opts) => {
|
|
63
|
+
try {
|
|
64
|
+
const fromFile = opts.file ? readJsonObject(opts.file) : {};
|
|
65
|
+
const body = {
|
|
66
|
+
...fromFile,
|
|
67
|
+
...compact({
|
|
68
|
+
mailbox: nullable(opts.mailbox),
|
|
69
|
+
signature: nullable(opts.signature),
|
|
70
|
+
forbiddenTerms: opts.forbiddenTerms === undefined
|
|
71
|
+
? undefined
|
|
72
|
+
: opts.forbiddenTerms === "none"
|
|
73
|
+
? []
|
|
74
|
+
: csv(opts.forbiddenTerms),
|
|
75
|
+
catchAllPolicy: opts.catchAllPolicy,
|
|
76
|
+
thresholds: opts.threshold
|
|
77
|
+
? {
|
|
78
|
+
...fromFile.thresholds,
|
|
79
|
+
...parseThresholds(opts.threshold),
|
|
80
|
+
}
|
|
81
|
+
: undefined,
|
|
82
|
+
}),
|
|
83
|
+
};
|
|
84
|
+
if (!Object.keys(body).length) {
|
|
85
|
+
throw new Error("Nothing to set: pass at least one option");
|
|
86
|
+
}
|
|
87
|
+
const data = await api.post("/outreach/settings", body);
|
|
88
|
+
if (opts.json)
|
|
89
|
+
printJson(data);
|
|
90
|
+
else
|
|
91
|
+
printSettings(data);
|
|
92
|
+
}
|
|
93
|
+
catch (err) {
|
|
94
|
+
handleError(err);
|
|
95
|
+
}
|
|
96
|
+
});
|
|
97
|
+
const settingsCommand = new Command("settings")
|
|
98
|
+
.description("Outreach settings: mailbox, signature, forbidden terms, catch-all policy, thresholds")
|
|
99
|
+
.addCommand(settingsGet)
|
|
100
|
+
.addCommand(settingsSet);
|
|
101
|
+
const sourceList = new Command("list")
|
|
102
|
+
.description("List data sources with their last successful pull")
|
|
103
|
+
.option("--json", "Output as JSON")
|
|
104
|
+
.action(async (opts) => {
|
|
105
|
+
try {
|
|
106
|
+
const data = await api.get("/outreach/data-sources");
|
|
107
|
+
printList(data, [
|
|
108
|
+
{ key: "source", label: "Source", width: 14 },
|
|
109
|
+
{ key: "lastSuccessAt", label: "Last success", width: 26 },
|
|
110
|
+
{ key: "lastAttemptAt", label: "Last attempt", width: 26 },
|
|
111
|
+
{ key: "lastError", label: "Last error", width: 40 },
|
|
112
|
+
], opts);
|
|
113
|
+
}
|
|
114
|
+
catch (err) {
|
|
115
|
+
handleError(err);
|
|
116
|
+
}
|
|
117
|
+
});
|
|
118
|
+
const sourceStamp = new Command("stamp")
|
|
119
|
+
.description("Record the outcome of a pull from a data source")
|
|
120
|
+
.argument("<source>", "Data source: gmail | hunter | sirene | bodacc | pappers | lbr | linkedin | wttj | funding-feeds | postmaster")
|
|
121
|
+
.requiredOption("--outcome <outcome>", "success | failure")
|
|
122
|
+
.option("--error <text>", "What failed (required with --outcome failure)")
|
|
123
|
+
.option("--at <iso>", "When the pull ran (ISO datetime, defaults to now)")
|
|
124
|
+
.option("--json", "Output as JSON")
|
|
125
|
+
.action(async (source, opts) => {
|
|
126
|
+
try {
|
|
127
|
+
const data = await api.post(`/outreach/data-sources/${source}/stamp`, compact({ outcome: opts.outcome, error: opts.error, at: opts.at }));
|
|
128
|
+
done(data, opts, `Stamped ${source}: ${opts.outcome}`);
|
|
129
|
+
}
|
|
130
|
+
catch (err) {
|
|
131
|
+
handleError(err);
|
|
132
|
+
}
|
|
133
|
+
});
|
|
134
|
+
const sourceCommand = new Command("source")
|
|
135
|
+
.description("Data-source status, stamped by the skill that ran each pull")
|
|
136
|
+
.addCommand(sourceList)
|
|
137
|
+
.addCommand(sourceStamp);
|
|
138
|
+
const accessList = new Command("list")
|
|
139
|
+
.description("List the users holding Outreach access")
|
|
140
|
+
.option("--json", "Output as JSON")
|
|
141
|
+
.action(async (opts) => {
|
|
142
|
+
try {
|
|
143
|
+
const data = await api.get("/outreach/access");
|
|
144
|
+
printList(data, [
|
|
145
|
+
{ key: "email", label: "Email", width: 32 },
|
|
146
|
+
{ key: "name", label: "Name", width: 20 },
|
|
147
|
+
{ key: "type", label: "Type", width: 8 },
|
|
148
|
+
{ key: "userId", label: "User id", width: 36 },
|
|
149
|
+
], opts);
|
|
150
|
+
}
|
|
151
|
+
catch (err) {
|
|
152
|
+
handleError(err);
|
|
153
|
+
}
|
|
154
|
+
});
|
|
155
|
+
const accessGrant = new Command("grant")
|
|
156
|
+
.description("Grant Outreach access to an internal user (human callers only)")
|
|
157
|
+
.argument("<user>", "User id or email")
|
|
158
|
+
.option("--json", "Output as JSON")
|
|
159
|
+
.action(async (user, opts) => {
|
|
160
|
+
try {
|
|
161
|
+
const data = await api.post("/outreach/access", {
|
|
162
|
+
user,
|
|
163
|
+
});
|
|
164
|
+
done(data, opts, `Outreach access granted to ${data.email}`);
|
|
165
|
+
}
|
|
166
|
+
catch (err) {
|
|
167
|
+
handleError(err);
|
|
168
|
+
}
|
|
169
|
+
});
|
|
170
|
+
const accessRevoke = new Command("revoke")
|
|
171
|
+
.description("Revoke a user's Outreach access (human callers only; the last human grant stays)")
|
|
172
|
+
.argument("<userId>", "User id")
|
|
173
|
+
.option("--json", "Output as JSON")
|
|
174
|
+
.action(async (userId, opts) => {
|
|
175
|
+
try {
|
|
176
|
+
const data = await api.delete(`/outreach/access/${userId}`);
|
|
177
|
+
done(data, opts, `Outreach access revoked for ${userId}`);
|
|
178
|
+
}
|
|
179
|
+
catch (err) {
|
|
180
|
+
handleError(err);
|
|
181
|
+
}
|
|
182
|
+
});
|
|
183
|
+
const accessCommand = new Command("access")
|
|
184
|
+
.description("Who can read and write Outreach data (per-user grants)")
|
|
185
|
+
.addCommand(accessList)
|
|
186
|
+
.addCommand(accessGrant)
|
|
187
|
+
.addCommand(accessRevoke);
|
|
188
|
+
export const outreachSettingsCommands = [
|
|
189
|
+
settingsCommand,
|
|
190
|
+
sourceCommand,
|
|
191
|
+
accessCommand,
|
|
192
|
+
];
|
|
193
|
+
//# sourceMappingURL=outreach-settings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"outreach-settings.js","sourceRoot":"","sources":["../../../src/commands/api/outreach-settings.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EACL,OAAO,EACP,GAAG,EACH,IAAI,EAEJ,QAAQ,EACR,SAAS,EACT,cAAc,GACf,MAAM,8BAA8B,CAAC;AA2BtC,MAAM,cAAc,GAClB,mKAAmK,CAAC;AAEtK,SAAS,aAAa,CAAC,IAAsB;IAC3C,MAAM,KAAK,GAA8B;QACvC,CAAC,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC;QACzB,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC;QAC7B,CAAC,gBAAgB,EAAE,IAAI,CAAC,cAAc,CAAC;QACvC,CAAC,gBAAgB,EAAE,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC;KAC3D,CAAC;IACF,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,KAAK,EAAE,CAAC;QACjC,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,KAAK,IAAI,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChE,CAAC;IACD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;QAC3D,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC;QAC7C,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,aAAa,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5E,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,KAAK,GAAG,MAAM,EAAE,CAAC,CAAC;IACvD,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CAAC,KAAe;IACtC,MAAM,UAAU,GAA2B,EAAE,CAAC;IAC9C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACrC,IAAI,CAAC,GAAG,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YAChC,MAAM,IAAI,KAAK,CAAC,4BAA4B,IAAI,GAAG,CAAC,CAAC;QACvD,CAAC;QACD,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;QAC/B,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/C,MAAM,IAAI,KAAK,CAAC,GAAG,GAAG,mBAAmB,CAAC,CAAC;QAC7C,CAAC;QACD,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC;IAC7B,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,MAAM,WAAW,GAAG,IAAI,OAAO,CAAC,KAAK,CAAC;KACnC,WAAW,CACV,+GAA+G,CAChH;KACA,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;KAClC,MAAM,CAAC,KAAK,EAAE,IAAa,EAAE,EAAE;IAC9B,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,GAAG,CAAmB,oBAAoB,CAAC,CAAC;QACnE,IAAI,IAAI,CAAC,IAAI;YAAE,SAAS,CAAC,IAAI,CAAC,CAAC;;YAC1B,aAAa,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,WAAW,CAAC,GAAG,CAAC,CAAC;IACnB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,MAAM,WAAW,GAAG,IAAI,OAAO,CAAC,KAAK,CAAC;KACnC,WAAW,CACV,mEAAmE,CACpE;KACA,MAAM,CAAC,mBAAmB,EAAE,mCAAmC,CAAC;KAChE,MAAM,CACL,oBAAoB,EACpB,gDAAgD,CACjD;KACA,MAAM,CACL,0BAA0B,EAC1B,iFAAiF,CAClF;KACA,MAAM,CAAC,6BAA6B,EAAE,2BAA2B,CAAC;KAClE,MAAM,CACL,4BAA4B,EAC5B,6EAA6E,cAAc,EAAE,CAC9F;KACA,MAAM,CACL,eAAe,EACf,0FAA0F,CAC3F;KACA,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;KAClC,MAAM,CACL,KAAK,EACH,IAOC,EACD,EAAE;IACF,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5D,MAAM,IAAI,GAAG;YACX,GAAG,QAAQ;YACX,GAAG,OAAO,CAAC;gBACT,OAAO,EAAE,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC;gBAC/B,SAAS,EAAE,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC;gBACnC,cAAc,EACZ,IAAI,CAAC,cAAc,KAAK,SAAS;oBAC/B,CAAC,CAAC,SAAS;oBACX,CAAC,CAAC,IAAI,CAAC,cAAc,KAAK,MAAM;wBAC9B,CAAC,CAAC,EAAE;wBACJ,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC;gBAChC,cAAc,EAAE,IAAI,CAAC,cAAc;gBACnC,UAAU,EAAE,IAAI,CAAC,SAAS;oBACxB,CAAC,CAAC;wBACE,GAAI,QAAQ,CAAC,UAAiC;wBAC9C,GAAG,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC;qBACnC;oBACH,CAAC,CAAC,SAAS;aACd,CAAC;SACH,CAAC;QACF,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC;YAC9B,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;QAC9D,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,CACzB,oBAAoB,EACpB,IAAI,CACL,CAAC;QACF,IAAI,IAAI,CAAC,IAAI;YAAE,SAAS,CAAC,IAAI,CAAC,CAAC;;YAC1B,aAAa,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,WAAW,CAAC,GAAG,CAAC,CAAC;IACnB,CAAC;AACH,CAAC,CACF,CAAC;AAEJ,MAAM,eAAe,GAAG,IAAI,OAAO,CAAC,UAAU,CAAC;KAC5C,WAAW,CACV,sFAAsF,CACvF;KACA,UAAU,CAAC,WAAW,CAAC;KACvB,UAAU,CAAC,WAAW,CAAC,CAAC;AAE3B,MAAM,UAAU,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC;KACnC,WAAW,CAAC,mDAAmD,CAAC;KAChE,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;KAClC,MAAM,CAAC,KAAK,EAAE,IAAa,EAAE,EAAE;IAC9B,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,GAAG,CAAe,wBAAwB,CAAC,CAAC;QACnE,SAAS,CACP,IAAI,EACJ;YACE,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,EAAE;YAC7C,EAAE,GAAG,EAAE,eAAe,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,EAAE,EAAE;YAC1D,EAAE,GAAG,EAAE,eAAe,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,EAAE,EAAE;YAC1D,EAAE,GAAG,EAAE,WAAW,EAAE,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,EAAE,EAAE;SACrD,EACD,IAAI,CACL,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,WAAW,CAAC,GAAG,CAAC,CAAC;IACnB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,MAAM,WAAW,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC;KACrC,WAAW,CAAC,iDAAiD,CAAC;KAC9D,QAAQ,CACP,UAAU,EACV,8GAA8G,CAC/G;KACA,cAAc,CAAC,qBAAqB,EAAE,mBAAmB,CAAC;KAC1D,MAAM,CAAC,gBAAgB,EAAE,+CAA+C,CAAC;KACzE,MAAM,CAAC,YAAY,EAAE,mDAAmD,CAAC;KACzE,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;KAClC,MAAM,CACL,KAAK,EACH,MAAc,EACd,IAAgE,EAChE,EAAE;IACF,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,CACzB,0BAA0B,MAAM,QAAQ,EACxC,OAAO,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CACnE,CAAC;QACF,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,WAAW,MAAM,KAAK,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;IACzD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,WAAW,CAAC,GAAG,CAAC,CAAC;IACnB,CAAC;AACH,CAAC,CACF,CAAC;AAEJ,MAAM,aAAa,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC;KACxC,WAAW,CAAC,6DAA6D,CAAC;KAC1E,UAAU,CAAC,UAAU,CAAC;KACtB,UAAU,CAAC,WAAW,CAAC,CAAC;AAE3B,MAAM,UAAU,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC;KACnC,WAAW,CAAC,wCAAwC,CAAC;KACrD,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;KAClC,MAAM,CAAC,KAAK,EAAE,IAAa,EAAE,EAAE;IAC9B,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,GAAG,CAAgB,kBAAkB,CAAC,CAAC;QAC9D,SAAS,CACP,IAAI,EACJ;YACE,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE;YAC3C,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE;YACzC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE;YACxC,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,EAAE;SAC/C,EACD,IAAI,CACL,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,WAAW,CAAC,GAAG,CAAC,CAAC;IACnB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,MAAM,WAAW,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC;KACrC,WAAW,CAAC,gEAAgE,CAAC;KAC7E,QAAQ,CAAC,QAAQ,EAAE,kBAAkB,CAAC;KACtC,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;KAClC,MAAM,CAAC,KAAK,EAAE,IAAY,EAAE,IAAa,EAAE,EAAE;IAC5C,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,CAAoB,kBAAkB,EAAE;YACjE,IAAI;SACL,CAAC,CAAC;QACH,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,8BAA8B,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;IAC/D,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,WAAW,CAAC,GAAG,CAAC,CAAC;IACnB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,MAAM,YAAY,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC;KACvC,WAAW,CACV,kFAAkF,CACnF;KACA,QAAQ,CAAC,UAAU,EAAE,SAAS,CAAC;KAC/B,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;KAClC,MAAM,CAAC,KAAK,EAAE,MAAc,EAAE,IAAa,EAAE,EAAE;IAC9C,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,MAAM,CAAU,oBAAoB,MAAM,EAAE,CAAC,CAAC;QACrE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,+BAA+B,MAAM,EAAE,CAAC,CAAC;IAC5D,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,WAAW,CAAC,GAAG,CAAC,CAAC;IACnB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,MAAM,aAAa,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC;KACxC,WAAW,CAAC,wDAAwD,CAAC;KACrE,UAAU,CAAC,UAAU,CAAC;KACtB,UAAU,CAAC,WAAW,CAAC;KACvB,UAAU,CAAC,YAAY,CAAC,CAAC;AAE5B,MAAM,CAAC,MAAM,wBAAwB,GAAG;IACtC,eAAe;IACf,aAAa;IACb,aAAa;CACd,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import { type JsonOpt } from "../../lib/command-helpers.js";
|
|
3
|
+
export declare const LANGUAGES = "en | fr";
|
|
4
|
+
export declare const SIGNALS = "hiring | fundraise | registration | cohort | agency | warm | event | partner";
|
|
5
|
+
export declare const CHANNELS = "email | linkedin";
|
|
6
|
+
type Column = {
|
|
7
|
+
key: string;
|
|
8
|
+
label: string;
|
|
9
|
+
width?: number;
|
|
10
|
+
};
|
|
11
|
+
export type PageOpts = JsonOpt & {
|
|
12
|
+
page?: string;
|
|
13
|
+
pageSize?: string;
|
|
14
|
+
};
|
|
15
|
+
export type DroppedDraft = {
|
|
16
|
+
enrollmentId: string;
|
|
17
|
+
n: number;
|
|
18
|
+
gmailDraftId: string | null;
|
|
19
|
+
};
|
|
20
|
+
export declare function withPageOptions(cmd: Command): Command;
|
|
21
|
+
export declare function printPage<T>(path: string, columns: Column[], opts: JsonOpt, shape: (row: T) => Record<string, unknown>): Promise<void>;
|
|
22
|
+
export declare function fullName(first: string, last: string | null): string;
|
|
23
|
+
export declare function printDroppedDrafts(drafts: DroppedDraft[]): void;
|
|
24
|
+
export {};
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
import { api } from "../../lib/api.js";
|
|
3
|
+
import { printList } from "../../lib/format.js";
|
|
4
|
+
import { printJson } from "../../lib/command-helpers.js";
|
|
5
|
+
export const LANGUAGES = "en | fr";
|
|
6
|
+
export const SIGNALS = "hiring | fundraise | registration | cohort | agency | warm | event | partner";
|
|
7
|
+
export const CHANNELS = "email | linkedin";
|
|
8
|
+
export function withPageOptions(cmd) {
|
|
9
|
+
return cmd
|
|
10
|
+
.option("--page <n>", "Page number (default 1)")
|
|
11
|
+
.option("--page-size <n>", "Page size (default 100, max 1000)")
|
|
12
|
+
.option("--json", "Output as JSON ({ data, meta })");
|
|
13
|
+
}
|
|
14
|
+
export async function printPage(path, columns, opts, shape) {
|
|
15
|
+
const { data, meta } = await api.getWithMeta(path);
|
|
16
|
+
if (opts.json) {
|
|
17
|
+
printJson({ data, meta });
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
printList(data.map(shape), columns, opts);
|
|
21
|
+
if (meta) {
|
|
22
|
+
console.log(chalk.dim(`page ${meta.page}/${meta.totalPages}, ${meta.total} total`));
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
export function fullName(first, last) {
|
|
26
|
+
return last ? `${first} ${last}` : first;
|
|
27
|
+
}
|
|
28
|
+
// The API never calls Gmail: the caller deletes these drafts there.
|
|
29
|
+
export function printDroppedDrafts(drafts) {
|
|
30
|
+
for (const d of drafts) {
|
|
31
|
+
console.log(chalk.yellow(` dropped draft: enrollment ${d.enrollmentId} step ${d.n}, Gmail draft ${d.gmailDraftId ?? "-"}`));
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=outreach-shared.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"outreach-shared.js","sourceRoot":"","sources":["../../../src/commands/api/outreach-shared.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAgB,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAEvE,MAAM,CAAC,MAAM,SAAS,GAAG,SAAS,CAAC;AACnC,MAAM,CAAC,MAAM,OAAO,GAClB,8EAA8E,CAAC;AACjF,MAAM,CAAC,MAAM,QAAQ,GAAG,kBAAkB,CAAC;AAmB3C,MAAM,UAAU,eAAe,CAAC,GAAY;IAC1C,OAAO,GAAG;SACP,MAAM,CAAC,YAAY,EAAE,yBAAyB,CAAC;SAC/C,MAAM,CAAC,iBAAiB,EAAE,mCAAmC,CAAC;SAC9D,MAAM,CAAC,QAAQ,EAAE,iCAAiC,CAAC,CAAC;AACzD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,IAAY,EACZ,OAAiB,EACjB,IAAa,EACb,KAA0C;IAE1C,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,MAAM,GAAG,CAAC,WAAW,CAAgB,IAAI,CAAC,CAAC;IAClE,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,SAAS,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1B,OAAO;IACT,CAAC;IACD,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;IAC1C,IAAI,IAAI,EAAE,CAAC;QACT,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,GAAG,CAAC,QAAQ,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,UAAU,KAAK,IAAI,CAAC,KAAK,QAAQ,CAAC,CACvE,CAAC;IACJ,CAAC;AACH,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,KAAa,EAAE,IAAmB;IACzD,OAAO,IAAI,CAAC,CAAC,CAAC,GAAG,KAAK,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;AAC3C,CAAC;AAED,oEAAoE;AACpE,MAAM,UAAU,kBAAkB,CAAC,MAAsB;IACvD,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,MAAM,CACV,+BAA+B,CAAC,CAAC,YAAY,SAAS,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,YAAY,IAAI,GAAG,EAAE,CAClG,CACF,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import { api } from "../../lib/api.js";
|
|
3
|
+
import { handleError } from "../../lib/format.js";
|
|
4
|
+
import { compact, done, qs, readJsonRows, } from "../../lib/command-helpers.js";
|
|
5
|
+
import { printPage, SIGNALS, withPageOptions, } from "./outreach-shared.js";
|
|
6
|
+
// The API's per-request cap on a signal import; larger files are chunked here.
|
|
7
|
+
const SIGNALS_PER_REQUEST = 500;
|
|
8
|
+
const listCmd = withPageOptions(new Command("list")
|
|
9
|
+
.description("List signal hits, newest first")
|
|
10
|
+
.option("--status <status>", "new | kept | dropped | duplicate")
|
|
11
|
+
.option("--source <source>", "Source that produced the hit (kebab-case)")
|
|
12
|
+
.option("--signal <signal>", SIGNALS)
|
|
13
|
+
.option("--company-id <id>", "Hits linked to one company")).action(async (opts) => {
|
|
14
|
+
try {
|
|
15
|
+
await printPage(`/outreach/signals${qs({
|
|
16
|
+
status: opts.status,
|
|
17
|
+
source: opts.source,
|
|
18
|
+
signal: opts.signal,
|
|
19
|
+
companyId: opts.companyId,
|
|
20
|
+
page: opts.page,
|
|
21
|
+
pageSize: opts.pageSize,
|
|
22
|
+
})}`, [
|
|
23
|
+
{ key: "firstSeenAt", label: "First seen", width: 24 },
|
|
24
|
+
{ key: "source", label: "Source", width: 14 },
|
|
25
|
+
{ key: "signal", label: "Signal", width: 12 },
|
|
26
|
+
{ key: "marketCode", label: "Mkt", width: 3 },
|
|
27
|
+
{ key: "state", label: "Status", width: 20 },
|
|
28
|
+
{ key: "companyName", label: "Company", width: 24 },
|
|
29
|
+
{ key: "title", label: "Title", width: 40 },
|
|
30
|
+
{ key: "id", label: "Id", width: 36 },
|
|
31
|
+
], opts, (s) => ({
|
|
32
|
+
...s,
|
|
33
|
+
state: s.dropReason ? `${s.status} (${s.dropReason})` : s.status,
|
|
34
|
+
}));
|
|
35
|
+
}
|
|
36
|
+
catch (err) {
|
|
37
|
+
handleError(err);
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
const importCmd = new Command("import")
|
|
41
|
+
.description("Upsert signal hits from a JSON file, keyed by (source, externalId); a hit seen again refreshes its fields, never its status")
|
|
42
|
+
.requiredOption("--file <path>", "JSON array (or {signals}) of {source, externalId, signal, marketCode?, url, title?, companyName?, companyDomain?, payload?, seenAt?}")
|
|
43
|
+
.option("--json", "Output as JSON")
|
|
44
|
+
.action(async (opts) => {
|
|
45
|
+
try {
|
|
46
|
+
const signals = readJsonRows(opts.file, "signals");
|
|
47
|
+
const total = { created: 0, updated: 0 };
|
|
48
|
+
for (let i = 0; i < signals.length; i += SIGNALS_PER_REQUEST) {
|
|
49
|
+
const res = await api.post("/outreach/signals", { signals: signals.slice(i, i + SIGNALS_PER_REQUEST) });
|
|
50
|
+
total.created += res.created;
|
|
51
|
+
total.updated += res.updated;
|
|
52
|
+
}
|
|
53
|
+
done(total, opts, `Signals imported: ${total.created} created, ${total.updated} updated`);
|
|
54
|
+
}
|
|
55
|
+
catch (err) {
|
|
56
|
+
handleError(err);
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
const decideCmd = new Command("decide")
|
|
60
|
+
.description("Decide a signal hit: kept (with the company it produced), dropped (with a reason), or duplicate")
|
|
61
|
+
.argument("<id>", "Signal id")
|
|
62
|
+
.argument("<status>", "kept | dropped | duplicate")
|
|
63
|
+
.option("--reason <text>", "Why (required for dropped)")
|
|
64
|
+
.option("--company-id <id>", "Company the hit produced (required for kept)")
|
|
65
|
+
.option("--json", "Output as JSON")
|
|
66
|
+
.action(async (id, status, opts) => {
|
|
67
|
+
try {
|
|
68
|
+
const data = await api.post(`/outreach/signals/${id}/decision`, compact({ status, reason: opts.reason, companyId: opts.companyId }));
|
|
69
|
+
done(data, opts, `Signal ${data.id}: ${data.status}`);
|
|
70
|
+
}
|
|
71
|
+
catch (err) {
|
|
72
|
+
handleError(err);
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
export const outreachSignalCommand = new Command("signal")
|
|
76
|
+
.description("Signal hits (hiring, fundraise, registration...) pulled from the data sources, triaged into companies")
|
|
77
|
+
.addCommand(listCmd)
|
|
78
|
+
.addCommand(importCmd)
|
|
79
|
+
.addCommand(decideCmd);
|
|
80
|
+
//# sourceMappingURL=outreach-signals.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"outreach-signals.js","sourceRoot":"","sources":["../../../src/commands/api/outreach-signals.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import { outreachSettingsCommands } from "./outreach-settings.js";
|
|
3
|
+
import { outreachCatalogCommands } from "./outreach-catalog.js";
|
|
4
|
+
import { outreachSignalCommand } from "./outreach-signals.js";
|
|
5
|
+
import { outreachCompanyCommand } from "./outreach-companies.js";
|
|
6
|
+
import { outreachProspectCommand } from "./outreach-prospects.js";
|
|
7
|
+
import { outreachEnrollmentCommand } from "./outreach-enrollments.js";
|
|
8
|
+
// `itznexus outreach ...`: the Outreach section (every /outreach route needs
|
|
9
|
+
// an Outreach access grant, reads included).
|
|
10
|
+
export const outreachCommand = new Command("outreach").description("Outreach section: settings, markets, sequences, signals, companies, prospects, enrollments");
|
|
11
|
+
for (const cmd of [
|
|
12
|
+
...outreachSettingsCommands,
|
|
13
|
+
...outreachCatalogCommands,
|
|
14
|
+
outreachSignalCommand,
|
|
15
|
+
outreachCompanyCommand,
|
|
16
|
+
outreachProspectCommand,
|
|
17
|
+
outreachEnrollmentCommand,
|
|
18
|
+
]) {
|
|
19
|
+
outreachCommand.addCommand(cmd);
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=outreach.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"outreach.js","sourceRoot":"","sources":["../../../src/commands/api/outreach.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,EAAE,yBAAyB,EAAE,MAAM,2BAA2B,CAAC;AAEtE,6EAA6E;AAC7E,6CAA6C;AAC7C,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,OAAO,CAAC,UAAU,CAAC,CAAC,WAAW,CAChE,4FAA4F,CAC7F,CAAC;AAEF,KAAK,MAAM,GAAG,IAAI;IAChB,GAAG,wBAAwB;IAC3B,GAAG,uBAAuB;IAC1B,qBAAqB;IACrB,sBAAsB;IACtB,uBAAuB;IACvB,yBAAyB;CAC1B,EAAE,CAAC;IACF,eAAe,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;AAClC,CAAC"}
|
|
@@ -8,6 +8,7 @@ import { printList, printDetail, handleError } from "../../lib/format.js";
|
|
|
8
8
|
import { cleanupStaleInstructionFiles, fetchProjectByRef, fetchRenderedInstructions, findInstructionConflicts, syncInstructionFiles, } from "../../lib/project-context.js";
|
|
9
9
|
import { cleanupStaleEnvFiles, fetchRenderedEnvFiles, findEnvConflicts, syncEnvFiles, } from "../../lib/project-env-files.js";
|
|
10
10
|
import { instructionsCommand } from "./project-instructions.js";
|
|
11
|
+
import { stackCommand } from "../agents/project-stack.js";
|
|
11
12
|
import { projectEnvCommand } from "./project-env.js";
|
|
12
13
|
import { projectCapabilityCommand } from "./project-capabilities.js";
|
|
13
14
|
import { projectArtifactCommand } from "./project-artifacts.js";
|
|
@@ -1095,6 +1096,7 @@ export const projectCommand = new Command("project")
|
|
|
1095
1096
|
.addCommand(descriptionCommand)
|
|
1096
1097
|
.addCommand(technicalDescriptionCommand)
|
|
1097
1098
|
.addCommand(instructionsCommand)
|
|
1099
|
+
.addCommand(stackCommand)
|
|
1098
1100
|
.addCommand(organizationCommand)
|
|
1099
1101
|
.addCommand(personCommand)
|
|
1100
1102
|
.addCommand(leadCommand)
|