affitor 0.1.2 → 0.3.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.
Files changed (63) hide show
  1. package/dist/cli.js +28 -1
  2. package/dist/cli.js.map +1 -1
  3. package/dist/commands/init.d.ts.map +1 -1
  4. package/dist/commands/init.js +86 -51
  5. package/dist/commands/init.js.map +1 -1
  6. package/dist/commands/login.d.ts +3 -0
  7. package/dist/commands/login.d.ts.map +1 -0
  8. package/dist/commands/login.js +123 -0
  9. package/dist/commands/login.js.map +1 -0
  10. package/dist/commands/logout.d.ts +3 -0
  11. package/dist/commands/logout.d.ts.map +1 -0
  12. package/dist/commands/logout.js +23 -0
  13. package/dist/commands/logout.js.map +1 -0
  14. package/dist/commands/programs.d.ts +3 -0
  15. package/dist/commands/programs.d.ts.map +1 -0
  16. package/dist/commands/programs.js +54 -0
  17. package/dist/commands/programs.js.map +1 -0
  18. package/dist/commands/setup-stripe.d.ts.map +1 -1
  19. package/dist/commands/setup-stripe.js +51 -35
  20. package/dist/commands/setup-stripe.js.map +1 -1
  21. package/dist/commands/status.d.ts.map +1 -1
  22. package/dist/commands/status.js +38 -32
  23. package/dist/commands/status.js.map +1 -1
  24. package/dist/commands/test.d.ts.map +1 -1
  25. package/dist/commands/test.js +8 -9
  26. package/dist/commands/test.js.map +1 -1
  27. package/dist/commands/whoami.d.ts +3 -0
  28. package/dist/commands/whoami.d.ts.map +1 -0
  29. package/dist/commands/whoami.js +38 -0
  30. package/dist/commands/whoami.js.map +1 -0
  31. package/dist/lib/api-client.d.ts +25 -1
  32. package/dist/lib/api-client.d.ts.map +1 -1
  33. package/dist/lib/api-client.js +26 -1
  34. package/dist/lib/api-client.js.map +1 -1
  35. package/dist/lib/config.d.ts +11 -3
  36. package/dist/lib/config.d.ts.map +1 -1
  37. package/dist/lib/config.js +253 -42
  38. package/dist/lib/config.js.map +1 -1
  39. package/dist/lib/inject.d.ts +27 -0
  40. package/dist/lib/inject.d.ts.map +1 -0
  41. package/dist/lib/inject.js +81 -0
  42. package/dist/lib/inject.js.map +1 -0
  43. package/dist/lib/logger.d.ts +8 -0
  44. package/dist/lib/logger.d.ts.map +1 -1
  45. package/dist/lib/logger.js +72 -0
  46. package/dist/lib/logger.js.map +1 -1
  47. package/dist/lib/server-tracking.d.ts +25 -0
  48. package/dist/lib/server-tracking.d.ts.map +1 -0
  49. package/dist/lib/server-tracking.js +109 -0
  50. package/dist/lib/server-tracking.js.map +1 -0
  51. package/dist/lib/stack-detect.d.ts +18 -0
  52. package/dist/lib/stack-detect.d.ts.map +1 -0
  53. package/dist/lib/stack-detect.js +57 -0
  54. package/dist/lib/stack-detect.js.map +1 -0
  55. package/dist/lib/wizard.d.ts +14 -0
  56. package/dist/lib/wizard.d.ts.map +1 -0
  57. package/dist/lib/wizard.js +166 -0
  58. package/dist/lib/wizard.js.map +1 -0
  59. package/dist/types.d.ts +27 -2
  60. package/dist/types.d.ts.map +1 -1
  61. package/dist/types.js +3 -0
  62. package/dist/types.js.map +1 -1
  63. package/package.json +2 -2
package/dist/cli.js CHANGED
@@ -1,15 +1,20 @@
1
1
  #!/usr/bin/env node
2
2
  import { Command } from "commander";
3
+ import pc from "picocolors";
3
4
  import { setLoggerOptions } from "./lib/logger.js";
5
+ import { registerLoginCommand } from "./commands/login.js";
6
+ import { registerLogoutCommand } from "./commands/logout.js";
7
+ import { registerWhoamiCommand } from "./commands/whoami.js";
4
8
  import { registerInitCommand } from "./commands/init.js";
5
9
  import { registerSetupCommand } from "./commands/setup-stripe.js";
6
10
  import { registerStatusCommand } from "./commands/status.js";
7
11
  import { registerTestCommand } from "./commands/test.js";
12
+ import { registerProgramsCommand } from "./commands/programs.js";
8
13
  const program = new Command();
9
14
  program
10
15
  .name("affitor")
11
16
  .description("CLI-native affiliate tracking. Connect Stripe, track commissions, manage partners.")
12
- .version("0.1.0")
17
+ .version("0.2.0")
13
18
  .option("--json", "Output as JSON (for agent parsing)", false)
14
19
  .option("--no-interactive", "Skip all prompts, fail on missing values")
15
20
  .option("--auto-confirm", "Auto-yes to all confirmation prompts", false)
@@ -24,10 +29,32 @@ program
24
29
  quiet: opts.quiet,
25
30
  verbose: opts.verbose,
26
31
  });
32
+ })
33
+ .addHelpText("beforeAll", () => {
34
+ const opts = program.opts();
35
+ if (opts.json || opts.quiet)
36
+ return "";
37
+ const art = [
38
+ ` ___ _______ __`,
39
+ ` / _ | / _/ _(_) /____ ____`,
40
+ ` / __ | / _/ _/ / __/ _ \\/ __/`,
41
+ `/_/ |_|/_//_//_/\\__/\\___/_/`,
42
+ ];
43
+ const lines = [
44
+ "",
45
+ ...art.map((l) => ` ${pc.cyan(l)}`),
46
+ ` ${pc.dim("CLI-native affiliate tracking")}`,
47
+ "",
48
+ ];
49
+ return lines.join("\n");
27
50
  });
51
+ registerLoginCommand(program);
52
+ registerLogoutCommand(program);
53
+ registerWhoamiCommand(program);
28
54
  registerInitCommand(program);
29
55
  registerSetupCommand(program);
30
56
  registerStatusCommand(program);
31
57
  registerTestCommand(program);
58
+ registerProgramsCommand(program);
32
59
  program.parse();
33
60
  //# sourceMappingURL=cli.js.map
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAEzD,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,SAAS,CAAC;KACf,WAAW,CACV,oFAAoF,CACrF;KACA,OAAO,CAAC,OAAO,CAAC;KAChB,MAAM,CAAC,QAAQ,EAAE,oCAAoC,EAAE,KAAK,CAAC;KAC7D,MAAM,CAAC,kBAAkB,EAAE,0CAA0C,CAAC;KACtE,MAAM,CAAC,gBAAgB,EAAE,sCAAsC,EAAE,KAAK,CAAC;KACvE,MAAM,CAAC,SAAS,EAAE,+BAA+B,EAAE,KAAK,CAAC;KACzD,MAAM,CAAC,iBAAiB,EAAE,8BAA8B,CAAC;KACzD,MAAM,CAAC,iBAAiB,EAAE,6CAA6C,CAAC;KACxE,MAAM,CAAC,WAAW,EAAE,oBAAoB,EAAE,KAAK,CAAC;KAChD,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE;IACtB,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAC5B,gBAAgB,CAAC;QACf,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,OAAO,EAAE,IAAI,CAAC,OAAO;KACtB,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEL,mBAAmB,CAAC,OAAO,CAAC,CAAC;AAC7B,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAC9B,qBAAqB,CAAC,OAAO,CAAC,CAAC;AAC/B,mBAAmB,CAAC,OAAO,CAAC,CAAC;AAE7B,OAAO,CAAC,KAAK,EAAE,CAAC"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AAEjE,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,SAAS,CAAC;KACf,WAAW,CACV,oFAAoF,CACrF;KACA,OAAO,CAAC,OAAO,CAAC;KAChB,MAAM,CAAC,QAAQ,EAAE,oCAAoC,EAAE,KAAK,CAAC;KAC7D,MAAM,CAAC,kBAAkB,EAAE,0CAA0C,CAAC;KACtE,MAAM,CAAC,gBAAgB,EAAE,sCAAsC,EAAE,KAAK,CAAC;KACvE,MAAM,CAAC,SAAS,EAAE,+BAA+B,EAAE,KAAK,CAAC;KACzD,MAAM,CAAC,iBAAiB,EAAE,8BAA8B,CAAC;KACzD,MAAM,CAAC,iBAAiB,EAAE,6CAA6C,CAAC;KACxE,MAAM,CAAC,WAAW,EAAE,oBAAoB,EAAE,KAAK,CAAC;KAChD,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE;IACtB,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAC5B,gBAAgB,CAAC;QACf,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,OAAO,EAAE,IAAI,CAAC,OAAO;KACtB,CAAC,CAAC;AACL,CAAC,CAAC;KACD,WAAW,CAAC,WAAW,EAAE,GAAG,EAAE;IAC7B,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAC5B,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,CAAC;IAEvC,MAAM,GAAG,GAAG;QACV,sBAAsB;QACtB,gCAAgC;QAChC,iCAAiC;QACjC,+BAA+B;KAChC,CAAC;IAEF,MAAM,KAAK,GAAG;QACZ,EAAE;QACF,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;QACpC,KAAK,EAAE,CAAC,GAAG,CAAC,+BAA+B,CAAC,EAAE;QAC9C,EAAE;KACH,CAAC;IACF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC,CAAC,CAAC;AAEL,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAC9B,qBAAqB,CAAC,OAAO,CAAC,CAAC;AAC/B,qBAAqB,CAAC,OAAO,CAAC,CAAC;AAC/B,mBAAmB,CAAC,OAAO,CAAC,CAAC;AAC7B,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAC9B,qBAAqB,CAAC,OAAO,CAAC,CAAC;AAC/B,mBAAmB,CAAC,OAAO,CAAC,CAAC;AAC7B,uBAAuB,CAAC,OAAO,CAAC,CAAC;AAEjC,OAAO,CAAC,KAAK,EAAE,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAwBzC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,QAgBnD"}
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA4BzC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,QAiBnD"}
@@ -1,10 +1,13 @@
1
1
  import * as logger from "../lib/logger.js";
2
2
  import { format } from "../lib/logger.js";
3
3
  import { AffitorAPI, APIError, NetworkError } from "../lib/api-client.js";
4
- import { configExists, writeConfig, writeEnvExample, writeSkillsFile, appendToGitignore, } from "../lib/config.js";
4
+ import { configExists, writeConfig, writeSecrets, writeEnvExample, writeSkillsFile, appendToGitignore, } from "../lib/config.js";
5
5
  import { promptProgramName, promptDomain, promptCommissionType, promptCommissionRate, promptDurationMonths, promptCookieDuration, confirmAction, } from "../lib/prompts.js";
6
6
  import { DEFAULT_API_URL } from "../types.js";
7
7
  import { getFlags } from "../lib/flags.js";
8
+ import { readCredentials } from "../lib/config.js";
9
+ import { runInstallWizard } from "../lib/wizard.js";
10
+ import pc from "picocolors";
8
11
  export function registerInitCommand(program) {
9
12
  program
10
13
  .command("init")
@@ -15,11 +18,24 @@ export function registerInitCommand(program) {
15
18
  .option("--commission-rate <rate>", "Commission rate (% or $)", parseFloat)
16
19
  .option("--cookie-duration <days>", "Cookie duration in days", parseInt)
17
20
  .option("--duration-months <months>", "Commission duration in months (for recurring)", parseInt)
21
+ .option("--no-wizard", "Skip the auto-install wizard and print manual setup steps")
18
22
  .action(async (opts, cmd) => {
19
23
  await runInit(opts, getFlags(cmd));
20
24
  });
21
25
  }
22
26
  async function runInit(opts, flags) {
27
+ // Require login
28
+ const creds = readCredentials();
29
+ if (!creds) {
30
+ logger.error("You must be logged in to create a program.");
31
+ logger.info("");
32
+ logger.info(` Run ${pc.cyan("affitor login")} first.`);
33
+ logger.info("");
34
+ if (flags.json) {
35
+ logger.json({ error: "not_logged_in" });
36
+ }
37
+ process.exit(1);
38
+ }
23
39
  if (configExists()) {
24
40
  logger.error("Affitor already configured in this directory.\n" +
25
41
  " Use `npx affitor status` to check your program.\n" +
@@ -37,10 +53,11 @@ async function runInit(opts, flags) {
37
53
  let cookieDuration = opts.cookieDuration;
38
54
  let durationMonths = opts.durationMonths;
39
55
  if (interactive) {
40
- logger.box([
56
+ logger.banner();
57
+ logger.titledBox("Setup", [
41
58
  "",
42
- " Welcome to Affitor",
43
- " CLI-native affiliate tracking",
59
+ " Configure your affiliate program in under a minute.",
60
+ " You'll need: program name, domain, and commission structure.",
44
61
  "",
45
62
  ]);
46
63
  name ??= await promptProgramName();
@@ -69,11 +86,14 @@ async function runInit(opts, flags) {
69
86
  cookieDuration ??= 90;
70
87
  if (interactive && !flags.autoConfirm) {
71
88
  logger.newline();
72
- logger.info(` Program: ${name}`);
73
- logger.info(` Domain: ${domain}`);
74
- logger.info(` Commission: ${formatCommission(commissionType, commissionRate, durationMonths)}`);
75
- logger.info(` Cookie: ${cookieDuration} days`);
76
- logger.newline();
89
+ logger.titledBox("Review", [
90
+ "",
91
+ ` Program: ${format.bold(name)}`,
92
+ ` Domain: ${format.cyan(domain)}`,
93
+ ` Commission: ${format.green(formatCommission(commissionType, commissionRate, durationMonths))}`,
94
+ ` Cookie: ${cookieDuration} days`,
95
+ "",
96
+ ]);
77
97
  const confirmed = await confirmAction("Create this program?");
78
98
  if (!confirmed) {
79
99
  logger.info("Cancelled.");
@@ -81,8 +101,9 @@ async function runInit(opts, flags) {
81
101
  }
82
102
  }
83
103
  const apiUrl = flags.apiUrl ?? DEFAULT_API_URL;
84
- const api = new AffitorAPI({ apiUrl });
85
- logger.step("Creating program...");
104
+ const api = new AffitorAPI({ apiUrl, apiKey: creds.token });
105
+ const totalSteps = 4;
106
+ logger.newline();
86
107
  let response;
87
108
  try {
88
109
  response = await api.initProgram({
@@ -92,6 +113,7 @@ async function runInit(opts, flags) {
92
113
  commission_rate: commissionRate,
93
114
  cookie_duration: cookieDuration,
94
115
  duration_months: durationMonths,
116
+ advertiser_id: creds.advertiser_id ? parseInt(creds.advertiser_id, 10) : undefined,
95
117
  });
96
118
  }
97
119
  catch (err) {
@@ -112,9 +134,10 @@ async function runInit(opts, flags) {
112
134
  }
113
135
  process.exit(1);
114
136
  }
115
- logger.success("Program created");
137
+ logger.progressStep(1, totalSteps, "Program registered", true);
138
+ // Config v2: secrets go to .env, config.json has no secrets
116
139
  const config = {
117
- version: 1,
140
+ version: 2,
118
141
  program_id: response.program_id,
119
142
  domain,
120
143
  tracking_subdomain: `t.${domain}`,
@@ -128,18 +151,21 @@ async function runInit(opts, flags) {
128
151
  duration_days: cookieDuration,
129
152
  },
130
153
  ref_param: "aff",
131
- stripe_connected: false,
132
- api_key: response.api_key,
133
154
  api_url: apiUrl,
134
155
  created_at: new Date().toISOString(),
135
156
  };
136
157
  writeConfig(config);
137
- logger.success("Config written to .affitor/config.json");
138
- writeEnvExample(config);
139
- logger.success("Env template written to .affitor/.env.example");
140
- writeSkillsFile(config, name);
141
- logger.success("Agent skills written to .affitor/skills.md");
158
+ logger.progressStep(2, totalSteps, "Config written to .affitor/config.json", true);
159
+ // Write secrets to .env (gitignored)
160
+ writeSecrets({
161
+ api_key: response.api_key,
162
+ program_id: response.program_id,
163
+ });
164
+ writeEnvExample(config, response.api_key);
165
+ writeSkillsFile(config, name, response.api_key);
166
+ logger.progressStep(3, totalSteps, "Secrets → .affitor/.env + AGENTS.md", true);
142
167
  appendToGitignore();
168
+ logger.progressStep(4, totalSteps, "Gitignore updated", true);
143
169
  if (flags.json) {
144
170
  logger.json({
145
171
  program_id: response.program_id,
@@ -161,40 +187,49 @@ async function runInit(opts, flags) {
161
187
  });
162
188
  return;
163
189
  }
164
- logger.box([
165
- " Program created!",
190
+ logger.titledBox("Program Created", [
191
+ "",
192
+ ` Program ID: ${format.bold(response.program_id)}`,
193
+ ` API Key: ${format.dim(".affitor/.env (gitignored)")}`,
194
+ ` Domain: ${format.cyan(domain)}`,
195
+ ` Commission: ${format.green(formatCommission(commissionType, commissionRate, durationMonths))}`,
166
196
  "",
167
- ` Program ID: ${response.program_id}`,
168
- ` API Key: ${response.api_key}`,
169
- ` Domain: ${domain}`,
170
- ` Commission: ${formatCommission(commissionType, commissionRate, durationMonths)}`,
171
197
  ]);
172
- logger.info("Next steps:");
173
- logger.newline();
174
- logger.info(" 1. Add click tracking to your site (paste in <head>):");
175
- logger.newline();
176
- logger.info(` ${format.cyan(`<script src="${apiUrl}/js/affitor-tracker.js"`)}`);
177
- logger.info(` ${format.cyan(` data-affitor-program-id="${response.program_id}">`)}`);
178
- logger.info(` ${format.cyan(`</script>`)}`);
179
- logger.newline();
180
- logger.info(" 2. Track signups (call after user registers):");
181
- logger.newline();
182
- logger.info(` ${format.cyan(`window.affitor.signup("user_id", "email@example.com");`)}`);
183
- logger.newline();
184
- logger.info(" 3. Connect Stripe for automatic payment tracking:");
185
- logger.info(" $ npx affitor setup stripe");
186
- logger.newline();
187
- logger.info(" 4. Test your integration:");
188
- logger.info(" $ npx affitor test click");
189
- logger.info(" $ npx affitor test lead");
190
- logger.info(" $ npx affitor test sale");
191
- logger.newline();
192
- logger.info("Files created:");
193
- logger.info(" .affitor/config.json — program configuration");
194
- logger.info(" .affitor/skills.md — tracking snippets + agent instructions");
195
- logger.info(" .affitor/.env.example — environment variables template");
198
+ // AI-install wizard: detect stack → install affitor-sdk → wire tracking
199
+ // (diff-preview + confirm). Falls back to manual steps when skipped or
200
+ // non-interactive. Never runs in --json mode.
201
+ const runWizard = interactive && !flags.json && opts.wizard !== false;
202
+ if (runWizard) {
203
+ await runInstallWizard({
204
+ cwd: process.cwd(),
205
+ programId: response.program_id,
206
+ apiUrl,
207
+ autoConfirm: flags.autoConfirm,
208
+ });
209
+ }
210
+ else {
211
+ logger.titledBox("Tracking setup (manual)", [
212
+ "",
213
+ ` ${format.bold(format.cyan("1"))} Add the tracking script to your ${format.dim("<head>")}:`,
214
+ "",
215
+ ` ${format.cyan(`<script src="${apiUrl}/js/affitor-tracker.js"`)}`,
216
+ ` ${format.cyan(` data-affitor-program-id="${response.program_id}"></script>`)}`,
217
+ "",
218
+ ` ${format.bold(format.cyan("2"))} Track signups ${format.dim("(after a user registers)")}:`,
219
+ "",
220
+ ` ${format.cyan(`window.affitor.signup("user_id", "email@example.com");`)}`,
221
+ "",
222
+ ]);
223
+ }
224
+ logger.titledBox("Then", [
225
+ "",
226
+ ` ${format.bold(format.cyan("→"))} Connect Stripe: ${format.dim("$")} npx affitor setup stripe`,
227
+ ` ${format.bold(format.cyan("→"))} Test it: ${format.dim("$")} npx affitor test click`,
228
+ "",
229
+ ]);
230
+ logger.info(` ${format.dim("Files:")} .affitor/config.json · .env · AGENTS.md · .env.example`);
231
+ logger.info(` ${format.dim("Docs:")} https://docs.affitor.com/advertisers/tracking`);
196
232
  logger.newline();
197
- logger.info(` ${format.dim("Full docs: https://docs.affitor.com/advertisers/tracking")}`);
198
233
  }
199
234
  function formatCommission(type, rate, durationMonths) {
200
235
  const isPercent = type.includes("percent");
@@ -1 +1 @@
1
- {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare function registerLoginCommand(parent: Command): void;
3
+ //# sourceMappingURL=login.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAYpC,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,OAAO,QAQnD"}
@@ -0,0 +1,123 @@
1
+ import pc from "picocolors";
2
+ import { exec } from "node:child_process";
3
+ import { AffitorAPI } from "../lib/api-client.js";
4
+ import { writeCredentials, readCredentials } from "../lib/config.js";
5
+ import * as logger from "../lib/logger.js";
6
+ import { DEFAULT_API_URL } from "../types.js";
7
+ const POLL_INTERVAL_MS = 2000;
8
+ const POLL_TIMEOUT_MS = 5 * 60 * 1000; // 5 minutes
9
+ export function registerLoginCommand(parent) {
10
+ parent
11
+ .command("login")
12
+ .description("Log in to Affitor via your browser")
13
+ .action(async (_opts, cmd) => {
14
+ const flags = cmd.optsWithGlobals();
15
+ await runLogin(flags);
16
+ });
17
+ }
18
+ async function runLogin(flags) {
19
+ // Check if already logged in
20
+ const existing = readCredentials();
21
+ if (existing) {
22
+ if (flags.json) {
23
+ logger.json({ already_logged_in: true, email: existing.email });
24
+ return;
25
+ }
26
+ logger.info("");
27
+ logger.info(` Already logged in as ${pc.cyan(existing.email)}`);
28
+ logger.info(` Run ${pc.dim("affitor logout")} to switch accounts.`);
29
+ logger.info("");
30
+ return;
31
+ }
32
+ const api = new AffitorAPI({ apiUrl: flags.apiUrl ?? DEFAULT_API_URL });
33
+ // Step 1: Start auth session
34
+ logger.info("");
35
+ logger.step("Starting login...");
36
+ const { state, auth_url, expires_at } = await api.authStart();
37
+ // Step 2: Open browser
38
+ logger.info("");
39
+ logger.info(` ${pc.bold("Open this URL to log in:")}`);
40
+ logger.info("");
41
+ logger.info(` ${pc.cyan(auth_url)}`);
42
+ logger.info("");
43
+ openBrowser(auth_url);
44
+ logger.step("Waiting for browser login...");
45
+ // Step 3: Poll until complete or expired
46
+ const deadline = new Date(expires_at).getTime();
47
+ const startTime = Date.now();
48
+ let dots = 0;
49
+ while (Date.now() < deadline && Date.now() - startTime < POLL_TIMEOUT_MS) {
50
+ await sleep(POLL_INTERVAL_MS);
51
+ const result = await api.authPoll(state);
52
+ if (result.status === "complete" && result.token) {
53
+ const creds = {
54
+ token: result.token,
55
+ email: result.email ?? "",
56
+ user_id: "",
57
+ advertiser_id: String(result.advertiser_id ?? ""),
58
+ expires_at: new Date(Date.now() + 90 * 24 * 60 * 60 * 1000).toISOString(),
59
+ created_at: new Date().toISOString(),
60
+ };
61
+ writeCredentials(creds);
62
+ if (flags.json) {
63
+ logger.json({
64
+ logged_in: true,
65
+ email: creds.email,
66
+ advertiser_id: creds.advertiser_id,
67
+ next_steps: [
68
+ "affitor init",
69
+ "affitor programs",
70
+ "affitor status",
71
+ ],
72
+ });
73
+ return;
74
+ }
75
+ logger.info("");
76
+ logger.success(`Logged in as ${pc.cyan(creds.email)}`);
77
+ logger.info("");
78
+ logger.info(` Credentials saved to ${pc.dim("~/.affitor/credentials.json")}`);
79
+ logger.info(` Token expires in 90 days.`);
80
+ logger.titledBox("What's next?", [
81
+ "",
82
+ ` ${pc.cyan("affitor init")} ${pc.dim("Set up a new affiliate program")}`,
83
+ ` ${pc.cyan("affitor programs")} ${pc.dim("List your programs")}`,
84
+ ` ${pc.cyan("affitor status")} ${pc.dim("Check program health")}`,
85
+ ` ${pc.cyan("affitor help")} ${pc.dim("See all commands")}`,
86
+ "",
87
+ ]);
88
+ return;
89
+ }
90
+ if (result.status === "expired") {
91
+ logger.error("Login session expired. Run `affitor login` to try again.");
92
+ process.exit(1);
93
+ }
94
+ if (result.status === "consumed") {
95
+ logger.error("Login session already used. Run `affitor login` to try again.");
96
+ process.exit(1);
97
+ }
98
+ // Show waiting indicator
99
+ dots = (dots + 1) % 4;
100
+ if (!flags.json) {
101
+ process.stdout.write(`\r ${pc.dim("Waiting" + ".".repeat(dots) + " ".repeat(3 - dots))} `);
102
+ }
103
+ }
104
+ logger.info("");
105
+ logger.error("Login timed out. Run `affitor login` to try again.");
106
+ process.exit(1);
107
+ }
108
+ function openBrowser(url) {
109
+ const cmd = process.platform === "darwin"
110
+ ? `open "${url}"`
111
+ : process.platform === "win32"
112
+ ? `start "" "${url}"`
113
+ : `xdg-open "${url}"`;
114
+ exec(cmd, (err) => {
115
+ if (err) {
116
+ logger.debug(`Failed to open browser: ${err.message}`);
117
+ }
118
+ });
119
+ }
120
+ function sleep(ms) {
121
+ return new Promise((r) => setTimeout(r, ms));
122
+ }
123
+ //# sourceMappingURL=login.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare function registerLogoutCommand(parent: Command): void;
3
+ //# sourceMappingURL=logout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logout.d.ts","sourceRoot":"","sources":["../../src/commands/logout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,OAAO,QAqBpD"}
@@ -0,0 +1,23 @@
1
+ import { deleteCredentials, readCredentials } from "../lib/config.js";
2
+ import * as logger from "../lib/logger.js";
3
+ export function registerLogoutCommand(parent) {
4
+ parent
5
+ .command("logout")
6
+ .description("Log out and remove stored credentials")
7
+ .action(async (_opts, cmd) => {
8
+ const flags = cmd.optsWithGlobals();
9
+ const existing = readCredentials();
10
+ deleteCredentials();
11
+ if (flags.json) {
12
+ logger.json({ logged_out: true, email: existing?.email ?? null });
13
+ return;
14
+ }
15
+ if (existing) {
16
+ logger.success(`Logged out (was ${existing.email})`);
17
+ }
18
+ else {
19
+ logger.info(" Not currently logged in.");
20
+ }
21
+ });
22
+ }
23
+ //# sourceMappingURL=logout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logout.js","sourceRoot":"","sources":["../../src/commands/logout.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACtE,OAAO,KAAK,MAAM,MAAM,kBAAkB,CAAC;AAE3C,MAAM,UAAU,qBAAqB,CAAC,MAAe;IACnD,MAAM;SACH,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,uCAAuC,CAAC;SACpD,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QAC3B,MAAM,KAAK,GAAG,GAAG,CAAC,eAAe,EAAE,CAAC;QAEpC,MAAM,QAAQ,GAAG,eAAe,EAAE,CAAC;QACnC,iBAAiB,EAAE,CAAC;QAEpB,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;YACf,MAAM,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,IAAI,IAAI,EAAE,CAAC,CAAC;YAClE,OAAO;QACT,CAAC;QAED,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,CAAC,OAAO,CAAC,mBAAmB,QAAQ,CAAC,KAAK,GAAG,CAAC,CAAC;QACvD,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare function registerProgramsCommand(parent: Command): void;
3
+ //# sourceMappingURL=programs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"programs.d.ts","sourceRoot":"","sources":["../../src/commands/programs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,OAAO,QAQtD"}
@@ -0,0 +1,54 @@
1
+ import pc from "picocolors";
2
+ import { AffitorAPI } from "../lib/api-client.js";
3
+ import { readCredentials } from "../lib/config.js";
4
+ import * as logger from "../lib/logger.js";
5
+ import { DEFAULT_API_URL } from "../types.js";
6
+ export function registerProgramsCommand(parent) {
7
+ parent
8
+ .command("programs")
9
+ .description("List your affiliate programs")
10
+ .action(async (_opts, cmd) => {
11
+ const flags = cmd.optsWithGlobals();
12
+ await runPrograms(flags);
13
+ });
14
+ }
15
+ async function runPrograms(flags) {
16
+ const creds = readCredentials();
17
+ if (!creds) {
18
+ logger.error("You must be logged in to list programs.");
19
+ logger.info("");
20
+ logger.info(` Run ${pc.cyan("affitor login")} first.`);
21
+ logger.info("");
22
+ if (flags.json) {
23
+ logger.json({ error: "not_logged_in" });
24
+ }
25
+ process.exit(1);
26
+ }
27
+ const api = new AffitorAPI({
28
+ apiUrl: flags.apiUrl ?? DEFAULT_API_URL,
29
+ apiKey: creds.token,
30
+ });
31
+ const programs = await api.listPrograms();
32
+ if (flags.json) {
33
+ logger.json({ programs });
34
+ return;
35
+ }
36
+ if (programs.length === 0) {
37
+ logger.info("");
38
+ logger.info(" No programs found.");
39
+ logger.info("");
40
+ logger.info(` Run ${pc.cyan("affitor init")} to create your first program.`);
41
+ logger.info("");
42
+ return;
43
+ }
44
+ logger.info("");
45
+ logger.info(` ${pc.bold("Your Programs")} ${pc.dim(`(${programs.length})`)}`);
46
+ logger.info("");
47
+ for (const prog of programs) {
48
+ const statusColor = prog.status === "active" ? pc.green : pc.yellow;
49
+ logger.info(` ${pc.cyan(String(prog.id).padEnd(6))} ${pc.bold(prog.name.padEnd(24))} ${statusColor(prog.status.padEnd(10))} ${pc.dim(prog.domain)}`);
50
+ logger.info(` ${" ".repeat(6)} ${pc.dim(prog.commission.padEnd(24))} ${pc.dim(`${prog.partners} partners`)}`);
51
+ logger.info("");
52
+ }
53
+ }
54
+ //# sourceMappingURL=programs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"programs.js","sourceRoot":"","sources":["../../src/commands/programs.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"setup-stripe.d.ts","sourceRoot":"","sources":["../../src/commands/setup-stripe.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQzC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,QAoBpD"}
1
+ {"version":3,"file":"setup-stripe.d.ts","sourceRoot":"","sources":["../../src/commands/setup-stripe.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASzC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,QAoBpD"}