@flydocs/cli 0.5.0-beta.11 → 0.5.0-beta.12

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/cli.js CHANGED
@@ -15,7 +15,7 @@ var CLI_VERSION, CLI_NAME, PACKAGE_NAME;
15
15
  var init_constants = __esm({
16
16
  "src/lib/constants.ts"() {
17
17
  "use strict";
18
- CLI_VERSION = "0.5.0-beta.11";
18
+ CLI_VERSION = "0.5.0-beta.12";
19
19
  CLI_NAME = "flydocs";
20
20
  PACKAGE_NAME = "@flydocs/cli";
21
21
  }
@@ -42,9 +42,7 @@ async function ensureDirectories(targetDir, tier) {
42
42
  const dirs = [
43
43
  ".flydocs",
44
44
  ".claude/skills",
45
- ".claude/agents",
46
45
  ".claude/commands",
47
- ".cursor/agents",
48
46
  ".cursor/commands",
49
47
  ".cursor/rules",
50
48
  "flydocs/context",
@@ -168,7 +166,7 @@ function printBanner(version) {
168
166
  ` ${pinkBlock4} ${purpleBlock12} ${bold("FlyDocs")} ${dim("(Beta)")}`
169
167
  );
170
168
  console.log(
171
- ` ${purpleBlock12} ${dim("Spec-Driven Context That Helps Engineers Fly")}`
169
+ ` ${purpleBlock12} ${dim("Structured context for AI coding tools")}`
172
170
  );
173
171
  console.log(` ${purpleBlock4}`);
174
172
  console.log(` ${purpleBlock4} ${dim(`v${version}`)}`);
@@ -192,16 +190,22 @@ function printCompletionBox(title, lines) {
192
190
  }
193
191
  function printBetaCta() {
194
192
  const dim = pc2.dim;
195
- const url = "https://www.flydocs.ai?utm_source=cli&utm_medium=install&utm_campaign=beta";
193
+ const discordUrl = "https://discord.com/invite/YAkjePmZTQ";
194
+ const siteUrl = "https://www.flydocs.ai?utm_source=cli&utm_medium=install&utm_campaign=beta";
196
195
  console.log(
197
196
  dim(" \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500")
198
197
  );
199
198
  console.log();
200
- console.log(` ${pc2.bold("Join the FlyDocs Closed Beta")}`);
201
199
  console.log(
202
- ` ${dim("Early access to cloud features, web portal, and more.")}`
200
+ ` ${pc2.bold("Join the community")} ${dim("\u2014 bugs, ideas, and updates")}`
201
+ );
202
+ console.log(
203
+ ` ${hyperlink(pc2.cyan("discord.com/invite/YAkjePmZTQ"), discordUrl)}`
204
+ );
205
+ console.log();
206
+ console.log(
207
+ ` ${dim("Docs and updates:")} ${hyperlink(pc2.cyan("flydocs.ai"), siteUrl)}`
203
208
  );
204
- console.log(` ${hyperlink(pc2.cyan("https://www.flydocs.ai"), url)}`);
205
209
  console.log();
206
210
  }
207
211
  var init_ui = __esm({
@@ -348,9 +352,9 @@ async function replaceOwnedSkills(templateDir, targetDir, tier) {
348
352
  }
349
353
  }
350
354
  async function copyCursorRules(targetDir) {
351
- const { mkdir: mkdir6 } = await import("fs/promises");
355
+ const { mkdir: mkdir7 } = await import("fs/promises");
352
356
  const rulesDir = join4(targetDir, ".cursor", "rules");
353
- await mkdir6(rulesDir, { recursive: true });
357
+ await mkdir7(rulesDir, { recursive: true });
354
358
  const workflowRule = join4(
355
359
  targetDir,
356
360
  ".claude",
@@ -1578,7 +1582,9 @@ __export(install_exports, {
1578
1582
  import { defineCommand } from "citty";
1579
1583
  import { resolve as resolve2 } from "path";
1580
1584
  import { join as join12 } from "path";
1585
+ import { mkdir as mkdir5 } from "fs/promises";
1581
1586
  import { confirm as confirm2, select, isCancel as isCancel3, cancel as cancel2 } from "@clack/prompts";
1587
+ import pc6 from "picocolors";
1582
1588
  var install_default;
1583
1589
  var init_install = __esm({
1584
1590
  "src/commands/install.ts"() {
@@ -1732,14 +1738,56 @@ var init_install = __esm({
1732
1738
  await installOwnedSkills(templateDir, targetDir, tier);
1733
1739
  printStatus(`Skills installed (tier: ${tier})`);
1734
1740
  console.log();
1735
- console.log("Installing agents and commands...");
1736
- const claudeAgentsSrc = join12(templateDir, ".claude", "agents");
1737
- if (await pathExists(claudeAgentsSrc)) {
1738
- await copyDirectoryContents(
1739
- claudeAgentsSrc,
1740
- join12(targetDir, ".claude", "agents")
1741
- );
1741
+ console.log(` ${pc6.bold(pc6.yellow("Sub-Agents (Recommended)"))}`);
1742
+ console.log();
1743
+ console.log(
1744
+ " Sub-agents are specialized roles (PM, implementation, review,"
1745
+ );
1746
+ console.log(
1747
+ " research) that your AI tool can delegate tasks to. They help"
1748
+ );
1749
+ console.log(
1750
+ " structure work but are not required \u2014 everything works without them."
1751
+ );
1752
+ console.log();
1753
+ let installAgents;
1754
+ if (args.yes) {
1755
+ installAgents = true;
1756
+ console.log(" Auto-accepting (--yes)");
1757
+ } else {
1758
+ const agentConfirm = await confirm2({
1759
+ message: "Install sub-agents?",
1760
+ initialValue: true
1761
+ });
1762
+ if (isCancel3(agentConfirm)) {
1763
+ installAgents = false;
1764
+ } else {
1765
+ installAgents = agentConfirm;
1766
+ }
1742
1767
  }
1768
+ if (installAgents) {
1769
+ const claudeAgentsSrc = join12(templateDir, ".claude", "agents");
1770
+ if (await pathExists(claudeAgentsSrc)) {
1771
+ await mkdir5(join12(targetDir, ".claude", "agents"), { recursive: true });
1772
+ await copyDirectoryContents(
1773
+ claudeAgentsSrc,
1774
+ join12(targetDir, ".claude", "agents")
1775
+ );
1776
+ }
1777
+ const cursorAgentsSrc = join12(templateDir, ".cursor", "agents");
1778
+ if (await pathExists(cursorAgentsSrc)) {
1779
+ await mkdir5(join12(targetDir, ".cursor", "agents"), { recursive: true });
1780
+ await copyDirectoryContents(
1781
+ cursorAgentsSrc,
1782
+ join12(targetDir, ".cursor", "agents")
1783
+ );
1784
+ }
1785
+ printStatus("Sub-agents installed (.claude/agents, .cursor/agents)");
1786
+ } else {
1787
+ printInfo("Skipped sub-agents");
1788
+ }
1789
+ console.log();
1790
+ console.log("Installing commands and settings...");
1743
1791
  await copyDirectoryContents(
1744
1792
  join12(templateDir, ".claude", "commands"),
1745
1793
  join12(targetDir, ".claude", "commands")
@@ -1752,14 +1800,7 @@ var init_install = __esm({
1752
1800
  join12(templateDir, ".claude", "settings.json"),
1753
1801
  join12(targetDir, ".claude", "settings.json")
1754
1802
  );
1755
- printStatus(".claude/ (agents, commands, CLAUDE.md, settings)");
1756
- const cursorAgentsSrc = join12(templateDir, ".cursor", "agents");
1757
- if (await pathExists(cursorAgentsSrc)) {
1758
- await copyDirectoryContents(
1759
- cursorAgentsSrc,
1760
- join12(targetDir, ".cursor", "agents")
1761
- );
1762
- }
1803
+ printStatus(".claude/ (commands, CLAUDE.md, settings)");
1763
1804
  await copyDirectoryContents(
1764
1805
  join12(templateDir, ".claude", "commands"),
1765
1806
  join12(targetDir, ".cursor", "commands")
@@ -1768,7 +1809,7 @@ var init_install = __esm({
1768
1809
  join12(templateDir, ".cursor", "hooks.json"),
1769
1810
  join12(targetDir, ".cursor", "hooks.json")
1770
1811
  );
1771
- printStatus(".cursor/ (agents, commands, hooks)");
1812
+ printStatus(".cursor/ (commands, hooks)");
1772
1813
  await copyCursorRules(targetDir);
1773
1814
  printStatus(".cursor/rules/");
1774
1815
  await copyFile(
@@ -1898,7 +1939,7 @@ var init_install = __esm({
1898
1939
  " 1. Run /flydocs-setup to configure your project",
1899
1940
  " 2. Start working with /start-session",
1900
1941
  "",
1901
- "Documentation: flydocs/README.md"
1942
+ "Docs: https://www.flydocs.ai/docs"
1902
1943
  ] : [
1903
1944
  `Tier: ${tier}`,
1904
1945
  `Version: ${version}`,
@@ -1908,7 +1949,7 @@ var init_install = __esm({
1908
1949
  " 2. Run /flydocs-setup to configure your Linear workspace",
1909
1950
  " 3. Start working with /start-session",
1910
1951
  "",
1911
- "Documentation: flydocs/README.md"
1952
+ "Docs: https://www.flydocs.ai/docs"
1912
1953
  ];
1913
1954
  let copiedToClipboard = false;
1914
1955
  try {
@@ -2039,9 +2080,9 @@ __export(update_exports, {
2039
2080
  });
2040
2081
  import { defineCommand as defineCommand2 } from "citty";
2041
2082
  import { resolve as resolve3, join as join13 } from "path";
2042
- import { mkdir as mkdir5, cp as cp2, readFile as readFile8, readdir as readdir3, rm as rm4 } from "fs/promises";
2083
+ import { mkdir as mkdir6, cp as cp2, readFile as readFile8, readdir as readdir3, rm as rm4 } from "fs/promises";
2043
2084
  import { select as select2, text, confirm as confirm3, isCancel as isCancel4, cancel as cancel3 } from "@clack/prompts";
2044
- import pc6 from "picocolors";
2085
+ import pc7 from "picocolors";
2045
2086
  var update_default;
2046
2087
  var init_update = __esm({
2047
2088
  "src/commands/update.ts"() {
@@ -2189,7 +2230,7 @@ var init_update = __esm({
2189
2230
  const changelogPath = join13(templateDir, "CHANGELOG.md");
2190
2231
  const whatsNew = await getWhatsNew(changelogPath, currentVersion, version);
2191
2232
  if (whatsNew.length > 0) {
2192
- console.log(pc6.cyan("What's new:"));
2233
+ console.log(pc7.cyan("What's new:"));
2193
2234
  console.log();
2194
2235
  for (const entry of whatsNew) {
2195
2236
  console.log(` ${entry}`);
@@ -2199,7 +2240,7 @@ var init_update = __esm({
2199
2240
  const now = /* @__PURE__ */ new Date();
2200
2241
  const ts = `${now.getFullYear()}${String(now.getMonth() + 1).padStart(2, "0")}${String(now.getDate()).padStart(2, "0")}-${String(now.getHours()).padStart(2, "0")}${String(now.getMinutes()).padStart(2, "0")}${String(now.getSeconds()).padStart(2, "0")}`;
2201
2242
  const backupDir = join13(targetDir, ".flydocs", `backup-${ts}`);
2202
- await mkdir5(backupDir, { recursive: true });
2243
+ await mkdir6(backupDir, { recursive: true });
2203
2244
  if (hasConfig) {
2204
2245
  await cp2(
2205
2246
  join13(targetDir, ".flydocs", "config.json"),
@@ -2263,24 +2304,63 @@ var init_update = __esm({
2263
2304
  join13(targetDir, ".flydocs", "scripts")
2264
2305
  );
2265
2306
  printStatus(".flydocs/templates, hooks, scripts");
2266
- const claudeAgentsSrc = join13(templateDir, ".claude", "agents");
2267
- if (await pathExists(claudeAgentsSrc)) {
2268
- await copyDirectoryContents(
2269
- claudeAgentsSrc,
2270
- join13(targetDir, ".claude", "agents")
2307
+ const hasExistingAgents = await pathExists(
2308
+ join13(targetDir, ".claude", "agents")
2309
+ );
2310
+ let installAgents;
2311
+ if (args.yes) {
2312
+ installAgents = hasExistingAgents ? true : true;
2313
+ } else if (hasExistingAgents) {
2314
+ installAgents = true;
2315
+ } else {
2316
+ console.log();
2317
+ console.log(` ${pc7.bold(pc7.yellow("Sub-Agents (Recommended)"))}`);
2318
+ console.log();
2319
+ console.log(
2320
+ " Sub-agents are specialized roles (PM, implementation, review,"
2321
+ );
2322
+ console.log(
2323
+ " research) that your AI tool can delegate tasks to. They help"
2324
+ );
2325
+ console.log(
2326
+ " structure work but are not required \u2014 everything works without them."
2271
2327
  );
2328
+ console.log();
2329
+ const agentConfirm = await confirm3({
2330
+ message: "Install sub-agents?",
2331
+ initialValue: true
2332
+ });
2333
+ if (isCancel4(agentConfirm)) {
2334
+ installAgents = false;
2335
+ } else {
2336
+ installAgents = agentConfirm;
2337
+ }
2272
2338
  }
2273
- printStatus(".claude/agents");
2274
- await replaceOwnedSkills(templateDir, targetDir, effectiveTier);
2275
- printStatus(`.claude/skills (tier: ${effectiveTier})`);
2276
- const cursorAgentsSrc = join13(templateDir, ".cursor", "agents");
2277
- if (await pathExists(cursorAgentsSrc)) {
2278
- await copyDirectoryContents(
2279
- cursorAgentsSrc,
2280
- join13(targetDir, ".cursor", "agents")
2339
+ if (installAgents) {
2340
+ const claudeAgentsSrc = join13(templateDir, ".claude", "agents");
2341
+ if (await pathExists(claudeAgentsSrc)) {
2342
+ await mkdir6(join13(targetDir, ".claude", "agents"), { recursive: true });
2343
+ await copyDirectoryContents(
2344
+ claudeAgentsSrc,
2345
+ join13(targetDir, ".claude", "agents")
2346
+ );
2347
+ }
2348
+ const cursorAgentsSrc = join13(templateDir, ".cursor", "agents");
2349
+ if (await pathExists(cursorAgentsSrc)) {
2350
+ await mkdir6(join13(targetDir, ".cursor", "agents"), { recursive: true });
2351
+ await copyDirectoryContents(
2352
+ cursorAgentsSrc,
2353
+ join13(targetDir, ".cursor", "agents")
2354
+ );
2355
+ }
2356
+ printStatus(
2357
+ hasExistingAgents ? "Sub-agents updated (.claude/agents, .cursor/agents)" : "Sub-agents installed (.claude/agents, .cursor/agents)"
2281
2358
  );
2359
+ } else {
2360
+ printInfo("Skipped sub-agents");
2282
2361
  }
2283
- printStatus(".cursor/agents");
2362
+ await replaceOwnedSkills(templateDir, targetDir, effectiveTier);
2363
+ printStatus(`.claude/skills (tier: ${effectiveTier})`);
2284
2364
  console.log();
2285
2365
  console.log("Replacing framework files...");
2286
2366
  await copyFile(
@@ -2411,7 +2491,7 @@ __export(setup_exports, {
2411
2491
  default: () => setup_default
2412
2492
  });
2413
2493
  import { defineCommand as defineCommand3 } from "citty";
2414
- import pc7 from "picocolors";
2494
+ import pc8 from "picocolors";
2415
2495
  var setup_default;
2416
2496
  var init_setup = __esm({
2417
2497
  "src/commands/setup.ts"() {
@@ -2423,15 +2503,15 @@ var init_setup = __esm({
2423
2503
  },
2424
2504
  run() {
2425
2505
  console.log();
2426
- console.log(` ${pc7.bold("FlyDocs Setup")}`);
2506
+ console.log(` ${pc8.bold("FlyDocs Setup")}`);
2427
2507
  console.log();
2428
2508
  console.log(` Setup runs inside your IDE as an interactive AI command.`);
2429
2509
  console.log();
2430
2510
  console.log(
2431
- ` ${pc7.cyan("Claude Code:")} Type ${pc7.bold("/flydocs-setup")} in chat`
2511
+ ` ${pc8.cyan("Claude Code:")} Type ${pc8.bold("/flydocs-setup")} in chat`
2432
2512
  );
2433
2513
  console.log(
2434
- ` ${pc7.cyan("Cursor:")} Type ${pc7.bold("/flydocs-setup")} in chat`
2514
+ ` ${pc8.cyan("Cursor:")} Type ${pc8.bold("/flydocs-setup")} in chat`
2435
2515
  );
2436
2516
  console.log();
2437
2517
  console.log(` This configures your project context, detects your stack,`);
@@ -2448,7 +2528,7 @@ __export(skills_exports, {
2448
2528
  default: () => skills_default
2449
2529
  });
2450
2530
  import { defineCommand as defineCommand4 } from "citty";
2451
- import pc8 from "picocolors";
2531
+ import pc9 from "picocolors";
2452
2532
  var list, search, add, remove, skills_default;
2453
2533
  var init_skills2 = __esm({
2454
2534
  "src/commands/skills.ts"() {
@@ -2470,19 +2550,19 @@ var init_skills2 = __esm({
2470
2550
  console.log(`${total} skill(s) installed:`);
2471
2551
  if (result.platform.length > 0) {
2472
2552
  console.log();
2473
- console.log(pc8.bold("Platform"));
2553
+ console.log(pc9.bold("Platform"));
2474
2554
  for (const skill of result.platform) {
2475
2555
  console.log(
2476
- ` ${skill.name} ${pc8.dim(`(${skill.triggers} triggers)`)}`
2556
+ ` ${skill.name} ${pc9.dim(`(${skill.triggers} triggers)`)}`
2477
2557
  );
2478
2558
  }
2479
2559
  }
2480
2560
  if (result.community.length > 0) {
2481
2561
  console.log();
2482
- console.log(pc8.bold("Community"));
2562
+ console.log(pc9.bold("Community"));
2483
2563
  for (const skill of result.community) {
2484
2564
  console.log(
2485
- ` ${skill.name} ${pc8.dim(`(${skill.triggers} triggers)`)}`
2565
+ ` ${skill.name} ${pc9.dim(`(${skill.triggers} triggers)`)}`
2486
2566
  );
2487
2567
  }
2488
2568
  }
@@ -2505,18 +2585,18 @@ var init_skills2 = __esm({
2505
2585
  const results = await searchCatalog(args.keyword);
2506
2586
  if (results.length === 0) {
2507
2587
  console.log(`No skills found for "${args.keyword}".`);
2508
- console.log(` Browse the catalog at: ${pc8.cyan("https://skills.sh/")}`);
2588
+ console.log(` Browse the catalog at: ${pc9.cyan("https://skills.sh/")}`);
2509
2589
  return;
2510
2590
  }
2511
2591
  console.log();
2512
2592
  console.log(`${results.length} skill(s) matching "${args.keyword}":`);
2513
2593
  console.log();
2514
2594
  for (const skill of results) {
2515
- console.log(` ${pc8.bold(skill.name)}`);
2595
+ console.log(` ${pc9.bold(skill.name)}`);
2516
2596
  console.log(` ${skill.description}`);
2517
- console.log(` ${pc8.dim(skill.repo)}`);
2597
+ console.log(` ${pc9.dim(skill.repo)}`);
2518
2598
  if (skill.tags.length > 0) {
2519
- console.log(` ${pc8.dim(skill.tags.join(", "))}`);
2599
+ console.log(` ${pc9.dim(skill.tags.join(", "))}`);
2520
2600
  }
2521
2601
  console.log();
2522
2602
  }
@@ -2576,7 +2656,7 @@ __export(connect_exports, {
2576
2656
  });
2577
2657
  import { defineCommand as defineCommand5 } from "citty";
2578
2658
  import { text as text2, confirm as confirm4, isCancel as isCancel5, cancel as cancel4 } from "@clack/prompts";
2579
- import pc9 from "picocolors";
2659
+ import pc10 from "picocolors";
2580
2660
  import { readFile as readFile9, writeFile as writeFile5, appendFile as appendFile2 } from "fs/promises";
2581
2661
  import { join as join14 } from "path";
2582
2662
  var connect_default;
@@ -2616,7 +2696,7 @@ var init_connect = __esm({
2616
2696
  if (!await pathExists(configPath)) {
2617
2697
  printError("Not a FlyDocs project (.flydocs/config.json not found).");
2618
2698
  console.log(
2619
- ` Run ${pc9.cyan("flydocs")} first to install FlyDocs in this project.`
2699
+ ` Run ${pc10.cyan("flydocs")} first to install FlyDocs in this project.`
2620
2700
  );
2621
2701
  process.exit(1);
2622
2702
  }
@@ -2633,10 +2713,10 @@ var init_connect = __esm({
2633
2713
  }
2634
2714
  }
2635
2715
  console.log();
2636
- console.log(` ${pc9.bold("Connect to Linear")}`);
2716
+ console.log(` ${pc10.bold("Connect to Linear")}`);
2637
2717
  console.log();
2638
2718
  console.log(
2639
- ` ${pc9.dim("Get your API key from: Linear \u2192 Settings \u2192 API \u2192 Personal API keys")}`
2719
+ ` ${pc10.dim("Get your API key from: Linear \u2192 Settings \u2192 API \u2192 Personal API keys")}`
2640
2720
  );
2641
2721
  console.log();
2642
2722
  let apiKey = args.key ?? "";
@@ -2676,7 +2756,7 @@ var init_connect = __esm({
2676
2756
  throw new Error("Invalid response");
2677
2757
  }
2678
2758
  const viewer = data.data.viewer;
2679
- printStatus(`Authenticated as ${pc9.bold(viewer.name)} (${viewer.email})`);
2759
+ printStatus(`Authenticated as ${pc10.bold(viewer.name)} (${viewer.email})`);
2680
2760
  } catch {
2681
2761
  printError("Invalid API key or network error.");
2682
2762
  console.log(` Check your key and try again.`);
@@ -2703,7 +2783,7 @@ LINEAR_API_KEY=${apiKey}
2703
2783
  `, "utf-8");
2704
2784
  }
2705
2785
  printStatus(
2706
- `API key stored in ${pc9.dim(targetEnvPath === envLocalPath ? ".env.local" : ".env")}`
2786
+ `API key stored in ${pc10.dim(targetEnvPath === envLocalPath ? ".env.local" : ".env")}`
2707
2787
  );
2708
2788
  const wasLocal = config.tier === "local";
2709
2789
  config.tier = "cloud";
@@ -2736,14 +2816,14 @@ LINEAR_API_KEY=${apiKey}
2736
2816
  }
2737
2817
  console.log();
2738
2818
  console.log(
2739
- ` ${pc9.bold("Connected!")} Your project now syncs with Linear.`
2819
+ ` ${pc10.bold("Connected!")} Your project now syncs with Linear.`
2740
2820
  );
2741
2821
  console.log();
2742
2822
  console.log(` Next steps:`);
2743
2823
  console.log(
2744
- ` 1. Run ${pc9.cyan("/flydocs-setup")} in your IDE to configure your Linear project`
2824
+ ` 1. Run ${pc10.cyan("/flydocs-setup")} in your IDE to configure your Linear project`
2745
2825
  );
2746
- console.log(` 2. Run ${pc9.cyan("/start-session")} to begin working`);
2826
+ console.log(` 2. Run ${pc10.cyan("/start-session")} to begin working`);
2747
2827
  console.log();
2748
2828
  }
2749
2829
  });
@@ -2756,7 +2836,7 @@ __export(upgrade_exports, {
2756
2836
  default: () => upgrade_default
2757
2837
  });
2758
2838
  import { defineCommand as defineCommand6 } from "citty";
2759
- import pc10 from "picocolors";
2839
+ import pc11 from "picocolors";
2760
2840
  var upgrade_default;
2761
2841
  var init_upgrade = __esm({
2762
2842
  "src/commands/upgrade.ts"() {
@@ -2792,37 +2872,37 @@ var init_upgrade = __esm({
2792
2872
  console.log();
2793
2873
  if (currentTier === "cloud") {
2794
2874
  console.log(
2795
- ` ${pc10.green("\u2713")} You're already on the ${pc10.bold("cloud")} tier.`
2875
+ ` ${pc11.green("\u2713")} You're already on the ${pc11.bold("cloud")} tier.`
2796
2876
  );
2797
2877
  console.log();
2798
2878
  console.log(
2799
2879
  ` Your issues sync with Linear via the cloud mechanism skill.`
2800
2880
  );
2801
2881
  console.log(
2802
- ` Run ${pc10.cyan("flydocs connect")} to update your connection settings.`
2882
+ ` Run ${pc11.cyan("flydocs connect")} to update your connection settings.`
2803
2883
  );
2804
2884
  console.log();
2805
2885
  return;
2806
2886
  }
2807
- console.log(` ${pc10.bold("FlyDocs Cloud Tier")}`);
2887
+ console.log(` ${pc11.bold("FlyDocs Cloud Tier")}`);
2808
2888
  console.log();
2809
- console.log(` You're currently on the ${pc10.yellow("local")} tier.`);
2889
+ console.log(` You're currently on the ${pc11.yellow("local")} tier.`);
2810
2890
  console.log(` Upgrade to cloud for:`);
2811
2891
  console.log();
2812
2892
  console.log(
2813
- ` ${pc10.cyan("\u2192")} Issue sync with Linear (Jira coming soon)`
2893
+ ` ${pc11.cyan("\u2192")} Issue sync with Linear (Jira coming soon)`
2814
2894
  );
2815
- console.log(` ${pc10.cyan("\u2192")} Project milestones and cycle management`);
2816
- console.log(` ${pc10.cyan("\u2192")} Team assignment and priority tracking`);
2817
- console.log(` ${pc10.cyan("\u2192")} Project health updates and dashboards`);
2818
- console.log(` ${pc10.cyan("\u2192")} Cross-project issue linking`);
2895
+ console.log(` ${pc11.cyan("\u2192")} Project milestones and cycle management`);
2896
+ console.log(` ${pc11.cyan("\u2192")} Team assignment and priority tracking`);
2897
+ console.log(` ${pc11.cyan("\u2192")} Project health updates and dashboards`);
2898
+ console.log(` ${pc11.cyan("\u2192")} Cross-project issue linking`);
2819
2899
  console.log();
2820
- console.log(` ${pc10.bold("How to upgrade:")}`);
2900
+ console.log(` ${pc11.bold("How to upgrade:")}`);
2821
2901
  console.log();
2822
- console.log(` 1. Sign up at ${pc10.cyan("https://www.flydocs.ai")}`);
2902
+ console.log(` 1. Sign up at ${pc11.cyan("https://www.flydocs.ai")}`);
2823
2903
  console.log(` 2. Get your Linear API key from Linear \u2192 Settings \u2192 API`);
2824
2904
  console.log(
2825
- ` 3. Run ${pc10.cyan("flydocs connect")} to connect your project`
2905
+ ` 3. Run ${pc11.cyan("flydocs connect")} to connect your project`
2826
2906
  );
2827
2907
  console.log();
2828
2908
  }
@@ -2837,7 +2917,7 @@ __export(self_update_exports, {
2837
2917
  });
2838
2918
  import { defineCommand as defineCommand7 } from "citty";
2839
2919
  import { execSync } from "child_process";
2840
- import pc11 from "picocolors";
2920
+ import pc12 from "picocolors";
2841
2921
  var self_update_default;
2842
2922
  var init_self_update = __esm({
2843
2923
  "src/commands/self-update.ts"() {
@@ -2851,7 +2931,7 @@ var init_self_update = __esm({
2851
2931
  },
2852
2932
  async run() {
2853
2933
  console.log();
2854
- console.log(` Updating ${pc11.cyan(PACKAGE_NAME)}...`);
2934
+ console.log(` Updating ${pc12.cyan(PACKAGE_NAME)}...`);
2855
2935
  console.log();
2856
2936
  try {
2857
2937
  execSync(`npm install -g ${PACKAGE_NAME}@beta`, {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flydocs/cli",
3
- "version": "0.5.0-beta.11",
3
+ "version": "0.5.0-beta.12",
4
4
  "type": "module",
5
5
  "description": "FlyDocs AI CLI — install, setup, and manage FlyDocs projects",
6
6
  "bin": {
@@ -1,7 +1,6 @@
1
1
  ---
2
2
  name: implementation-agent
3
3
  description: "Builds features, fixes bugs, writes code. Invoke for implementation, coding, or technical work."
4
- model: opus
5
4
  tools: [Read, Glob, Grep, Bash, Write, Edit, WebFetch, WebSearch]
6
5
  skills:
7
6
  - flydocs-workflow
@@ -1,7 +1,6 @@
1
1
  ---
2
2
  name: pm-agent
3
3
  description: "Specs, workflow, issue management. Invoke for capturing, refining, activating, reviewing, closing, or session management."
4
- model: opus
5
4
  tools: [Read, Glob, Grep, Bash, WebFetch]
6
5
  disallowedTools: [Write, Edit]
7
6
  skills:
@@ -1,7 +1,6 @@
1
1
  ---
2
2
  name: research-agent
3
3
  description: "Codebase exploration and research. Invoke for understanding code structure, finding patterns, or gathering technical context."
4
- model: sonnet
5
4
  tools: [Read, Glob, Grep, WebFetch, WebSearch]
6
5
  disallowedTools: [Bash, Write, Edit]
7
6
  skills:
@@ -1,7 +1,6 @@
1
1
  ---
2
2
  name: review-agent
3
3
  description: "Code review and quality analysis. Invoke for reviewing implementations, checking quality, or validating acceptance criteria."
4
- model: sonnet
5
4
  tools: [Read, Glob, Grep, Bash]
6
5
  disallowedTools: [Write, Edit]
7
6
  skills:
@@ -576,20 +576,21 @@ Stage all new and modified FlyDocs files (`.flydocs/`, `.claude/`, `.cursor/`,
576
576
  If the user declines, remind them to commit before starting work:
577
577
  "No problem — just remember to commit these files before your first session."
578
578
 
579
- ### Step 5: Beta CTA
579
+ ### Step 5: Community CTA
580
580
 
581
- Always end with the beta call-to-action:
581
+ Always end with the community call-to-action:
582
582
 
583
583
  ```
584
584
  ─────────────────────────────────────────────────────
585
585
 
586
- FlyDocs is in active development. Premium features coming soon:
587
- Cloud sync with Linear, Jira, and more
588
- AI-powered skills and automation
589
- Team analytics and cost intelligence
586
+ What's coming next:
587
+ Project management tool sync Linear, Jira, and more
588
+ Web portal project setup, team visibility, session analytics
589
+ Cost intelligence — AI usage tracking and spend analysis
590
590
 
591
- Join the beta for early access and updates:
592
- https://www.flydocs.ai?utm_source=cli&utm_medium=setup&utm_campaign=beta
591
+ Join the community:
592
+ Discord: https://discord.com/invite/YAkjePmZTQ
593
+ Docs & updates: https://www.flydocs.ai
593
594
 
594
595
  ─────────────────────────────────────────────────────
595
596
  ```
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "0.5.0-beta.11",
2
+ "version": "0.5.0-beta.12",
3
3
  "sourceRepo": "github.com/plastrlab/flydocs-core",
4
4
  "tier": "local",
5
5
  "setupComplete": false,
@@ -1 +1 @@
1
- 0.5.0-beta.11
1
+ 0.5.0-beta.12
@@ -7,6 +7,23 @@ Versioning: [Semantic Versioning](https://semver.org/).
7
7
 
8
8
  ---
9
9
 
10
+ ## [0.5.0-beta.12] — 2026-02-24
11
+
12
+ ### Changed
13
+
14
+ - **Optional sub-agents** — sub-agents (PM, implementation, review, research) are now
15
+ an opt-in prompt during install and update. Recommended but not required. Existing
16
+ installs are silently updated on next `flydocs update`.
17
+ - **Removed hardcoded model selections** — Claude Code agent files no longer specify
18
+ `model: opus` or `model: sonnet`. Agents inherit the user's configured model,
19
+ matching the Cursor agent behavior.
20
+ - **CLI copy alignment** — banner tagline updated to "Structured context for AI coding
21
+ tools", beta CTA refocused on Discord community, docs references point to flydocs.ai.
22
+ - **Setup command CTA** — updated to show community links (Discord, flydocs.ai) and
23
+ upcoming features instead of "join the beta" messaging.
24
+
25
+ ---
26
+
10
27
  ## [0.5.0-beta.11] — 2026-02-23
11
28
 
12
29
  ### Fixed
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "0.5.0-beta.11",
2
+ "version": "0.5.0-beta.12",
3
3
  "description": "FlyDocs Core - Manifest of all managed files",
4
4
  "repository": "github.com/plastrlab/flydocs-core",
5
5