@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 +163 -83
- package/package.json +1 -1
- package/template/.claude/agents/implementation-agent.md +0 -1
- package/template/.claude/agents/pm-agent.md +0 -1
- package/template/.claude/agents/research-agent.md +0 -1
- package/template/.claude/agents/review-agent.md +0 -1
- package/template/.claude/commands/flydocs-setup.md +9 -8
- package/template/.flydocs/config.json +1 -1
- package/template/.flydocs/version +1 -1
- package/template/CHANGELOG.md +17 -0
- package/template/manifest.json +1 -1
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.
|
|
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("
|
|
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
|
|
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
|
-
` ${
|
|
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:
|
|
355
|
+
const { mkdir: mkdir7 } = await import("fs/promises");
|
|
352
356
|
const rulesDir = join4(targetDir, ".cursor", "rules");
|
|
353
|
-
await
|
|
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("
|
|
1736
|
-
|
|
1737
|
-
|
|
1738
|
-
|
|
1739
|
-
|
|
1740
|
-
|
|
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/ (
|
|
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/ (
|
|
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
|
-
"
|
|
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
|
-
"
|
|
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
|
|
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
|
|
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(
|
|
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
|
|
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
|
|
2267
|
-
|
|
2268
|
-
|
|
2269
|
-
|
|
2270
|
-
|
|
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
|
-
|
|
2274
|
-
|
|
2275
|
-
|
|
2276
|
-
|
|
2277
|
-
|
|
2278
|
-
|
|
2279
|
-
|
|
2280
|
-
|
|
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
|
-
|
|
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
|
|
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(` ${
|
|
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
|
-
` ${
|
|
2511
|
+
` ${pc8.cyan("Claude Code:")} Type ${pc8.bold("/flydocs-setup")} in chat`
|
|
2432
2512
|
);
|
|
2433
2513
|
console.log(
|
|
2434
|
-
` ${
|
|
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
|
|
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(
|
|
2553
|
+
console.log(pc9.bold("Platform"));
|
|
2474
2554
|
for (const skill of result.platform) {
|
|
2475
2555
|
console.log(
|
|
2476
|
-
` ${skill.name} ${
|
|
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(
|
|
2562
|
+
console.log(pc9.bold("Community"));
|
|
2483
2563
|
for (const skill of result.community) {
|
|
2484
2564
|
console.log(
|
|
2485
|
-
` ${skill.name} ${
|
|
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: ${
|
|
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(` ${
|
|
2595
|
+
console.log(` ${pc9.bold(skill.name)}`);
|
|
2516
2596
|
console.log(` ${skill.description}`);
|
|
2517
|
-
console.log(` ${
|
|
2597
|
+
console.log(` ${pc9.dim(skill.repo)}`);
|
|
2518
2598
|
if (skill.tags.length > 0) {
|
|
2519
|
-
console.log(` ${
|
|
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
|
|
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 ${
|
|
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(` ${
|
|
2716
|
+
console.log(` ${pc10.bold("Connect to Linear")}`);
|
|
2637
2717
|
console.log();
|
|
2638
2718
|
console.log(
|
|
2639
|
-
` ${
|
|
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 ${
|
|
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 ${
|
|
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
|
-
` ${
|
|
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 ${
|
|
2824
|
+
` 1. Run ${pc10.cyan("/flydocs-setup")} in your IDE to configure your Linear project`
|
|
2745
2825
|
);
|
|
2746
|
-
console.log(` 2. Run ${
|
|
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
|
|
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
|
-
` ${
|
|
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 ${
|
|
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(` ${
|
|
2887
|
+
console.log(` ${pc11.bold("FlyDocs Cloud Tier")}`);
|
|
2808
2888
|
console.log();
|
|
2809
|
-
console.log(` You're currently on the ${
|
|
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
|
-
` ${
|
|
2893
|
+
` ${pc11.cyan("\u2192")} Issue sync with Linear (Jira coming soon)`
|
|
2814
2894
|
);
|
|
2815
|
-
console.log(` ${
|
|
2816
|
-
console.log(` ${
|
|
2817
|
-
console.log(` ${
|
|
2818
|
-
console.log(` ${
|
|
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(` ${
|
|
2900
|
+
console.log(` ${pc11.bold("How to upgrade:")}`);
|
|
2821
2901
|
console.log();
|
|
2822
|
-
console.log(` 1. Sign up at ${
|
|
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 ${
|
|
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
|
|
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 ${
|
|
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,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:
|
|
@@ -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:
|
|
579
|
+
### Step 5: Community CTA
|
|
580
580
|
|
|
581
|
-
Always end with the
|
|
581
|
+
Always end with the community call-to-action:
|
|
582
582
|
|
|
583
583
|
```
|
|
584
584
|
─────────────────────────────────────────────────────
|
|
585
585
|
|
|
586
|
-
|
|
587
|
-
→
|
|
588
|
-
→
|
|
589
|
-
→
|
|
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
|
|
592
|
-
https://
|
|
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 +1 @@
|
|
|
1
|
-
0.5.0-beta.
|
|
1
|
+
0.5.0-beta.12
|
package/template/CHANGELOG.md
CHANGED
|
@@ -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
|
package/template/manifest.json
CHANGED