@flydocs/cli 0.5.0-beta.2 → 0.5.0-beta.4
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 +179 -48
- package/package.json +2 -1
- package/template/.claude/CLAUDE.md +70 -36
- package/template/.claude/commands/flydocs-setup.md +36 -1
- package/template/.flydocs/config.json +1 -1
- package/template/.flydocs/version +1 -1
- package/template/AGENTS.md +43 -27
- 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.4";
|
|
19
19
|
CLI_NAME = "flydocs";
|
|
20
20
|
PACKAGE_NAME = "@flydocs/cli";
|
|
21
21
|
}
|
|
@@ -149,24 +149,29 @@ function printInfo(message) {
|
|
|
149
149
|
console.log(`${pc2.cyan("\u2139")} ${message}`);
|
|
150
150
|
}
|
|
151
151
|
function printStub(command) {
|
|
152
|
-
printWarning(`${pc2.bold(command)} is not yet implemented
|
|
153
|
-
console.log(` Use ${pc2.cyan("bash install.sh")} for now.`);
|
|
152
|
+
printWarning(`${pc2.bold(command)} is not yet implemented.`);
|
|
154
153
|
}
|
|
155
154
|
function printBanner(version) {
|
|
156
|
-
const pink = pc2.magenta;
|
|
157
|
-
const purple = (t) => pc2.cyan(t);
|
|
155
|
+
const pink = (t) => pc2.bold(pc2.magenta(t));
|
|
156
|
+
const purple = (t) => pc2.bold(pc2.cyan(t));
|
|
158
157
|
const dim = pc2.dim;
|
|
159
158
|
const bold = pc2.bold;
|
|
159
|
+
const pinkBlock12 = pink("\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588");
|
|
160
|
+
const pinkBlock4 = pink("\u2588\u2588\u2588\u2588");
|
|
161
|
+
const purpleBlock12 = purple("\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588");
|
|
162
|
+
const purpleBlock4 = purple("\u2588\u2588\u2588\u2588");
|
|
160
163
|
console.log();
|
|
161
|
-
console.log(` ${
|
|
164
|
+
console.log(` ${pinkBlock12}`);
|
|
165
|
+
console.log(` ${pinkBlock12}`);
|
|
166
|
+
console.log(` ${pinkBlock4}`);
|
|
162
167
|
console.log(
|
|
163
|
-
` ${
|
|
168
|
+
` ${pinkBlock4} ${purpleBlock12} ${bold("Fly")}${bold("Docs")} ${bold("Core")}`
|
|
164
169
|
);
|
|
165
170
|
console.log(
|
|
166
|
-
` ${
|
|
171
|
+
` ${purpleBlock12} ${dim("Context-as-a-Service Platform Built for Engineering at Altitude")}`
|
|
167
172
|
);
|
|
168
|
-
console.log(` ${
|
|
169
|
-
console.log(` ${
|
|
173
|
+
console.log(` ${purpleBlock4}`);
|
|
174
|
+
console.log(` ${purpleBlock4} ${dim(`v${version}`)}`);
|
|
170
175
|
console.log();
|
|
171
176
|
}
|
|
172
177
|
function printCompletionBox(title, lines) {
|
|
@@ -433,6 +438,12 @@ async function detectStack(targetDir) {
|
|
|
433
438
|
if ("next" in allDeps) detected.add("nextjs");
|
|
434
439
|
if ("expo" in allDeps) detected.add("expo");
|
|
435
440
|
if ("react" in allDeps) detected.add("react");
|
|
441
|
+
if ("vue" in allDeps) detected.add("vue");
|
|
442
|
+
if ("nuxt" in allDeps) detected.add("nuxt");
|
|
443
|
+
if (Object.keys(allDeps).some((k) => k.startsWith("@angular/")))
|
|
444
|
+
detected.add("angular");
|
|
445
|
+
if ("svelte" in allDeps || "@sveltejs/kit" in allDeps)
|
|
446
|
+
detected.add("svelte");
|
|
436
447
|
if ("convex" in allDeps) detected.add("convex");
|
|
437
448
|
if ("prisma" in allDeps) detected.add("prisma");
|
|
438
449
|
if (Object.keys(allDeps).some((k) => k.startsWith("@clerk")))
|
|
@@ -462,14 +473,39 @@ async function detectStack(targetDir) {
|
|
|
462
473
|
if (await pathExists(join5(targetDir, "tsconfig.json"))) {
|
|
463
474
|
detected.add("typescript");
|
|
464
475
|
}
|
|
476
|
+
if (await pathExists(join5(targetDir, "nuxt.config.ts")) || await pathExists(join5(targetDir, "nuxt.config.js"))) {
|
|
477
|
+
detected.add("nuxt");
|
|
478
|
+
detected.add("vue");
|
|
479
|
+
}
|
|
480
|
+
if (await pathExists(join5(targetDir, "angular.json"))) {
|
|
481
|
+
detected.add("angular");
|
|
482
|
+
}
|
|
483
|
+
if (await pathExists(join5(targetDir, "svelte.config.js")) || await pathExists(join5(targetDir, "svelte.config.ts"))) {
|
|
484
|
+
detected.add("svelte");
|
|
485
|
+
}
|
|
486
|
+
if (await pathExists(join5(targetDir, "pyproject.toml")) || await pathExists(join5(targetDir, "requirements.txt")) || await pathExists(join5(targetDir, "setup.py"))) {
|
|
487
|
+
detected.add("python");
|
|
488
|
+
}
|
|
489
|
+
if (await pathExists(join5(targetDir, "go.mod"))) {
|
|
490
|
+
detected.add("go");
|
|
491
|
+
}
|
|
492
|
+
if (await pathExists(join5(targetDir, "Cargo.toml"))) {
|
|
493
|
+
detected.add("rust");
|
|
494
|
+
}
|
|
465
495
|
const raw = Array.from(detected);
|
|
466
496
|
return {
|
|
467
497
|
raw,
|
|
468
|
-
frameworks: raw.filter(
|
|
498
|
+
frameworks: raw.filter(
|
|
499
|
+
(s) => ["nextjs", "react", "expo", "vue", "nuxt", "angular", "svelte"].includes(
|
|
500
|
+
s
|
|
501
|
+
)
|
|
502
|
+
),
|
|
469
503
|
database: raw.filter((s) => ["convex", "prisma"].includes(s)),
|
|
470
504
|
auth: raw.filter((s) => ["clerk", "workos"].includes(s)),
|
|
471
505
|
styling: raw.filter((s) => ["tailwind"].includes(s)),
|
|
472
|
-
language: raw.filter(
|
|
506
|
+
language: raw.filter(
|
|
507
|
+
(s) => ["typescript", "python", "go", "rust"].includes(s)
|
|
508
|
+
),
|
|
473
509
|
testing: raw.filter(
|
|
474
510
|
(s) => ["vitest", "jest", "testing-library"].includes(s)
|
|
475
511
|
)
|
|
@@ -947,12 +983,14 @@ async function promptCommunitySkills(targetDir, stack, autoYes) {
|
|
|
947
983
|
const options = suggestions.map((s) => ({
|
|
948
984
|
value: s,
|
|
949
985
|
label: s.name,
|
|
950
|
-
hint: s.description
|
|
986
|
+
hint: s.description,
|
|
987
|
+
initialValue: true
|
|
951
988
|
}));
|
|
952
989
|
const result = await multiselect({
|
|
953
|
-
message: "Select community skills to install",
|
|
990
|
+
message: "Select community skills to install (space to toggle, enter to confirm)",
|
|
954
991
|
options,
|
|
955
|
-
required: false
|
|
992
|
+
required: false,
|
|
993
|
+
initialValues: suggestions
|
|
956
994
|
});
|
|
957
995
|
if (isCancel(result)) {
|
|
958
996
|
cancel("Skipped community skills");
|
|
@@ -991,6 +1029,7 @@ var init_community_skills = __esm({
|
|
|
991
1029
|
init_ui();
|
|
992
1030
|
init_skill_manager();
|
|
993
1031
|
COMMUNITY_SKILLS_MAP = [
|
|
1032
|
+
// React / Next.js (Vercel official)
|
|
994
1033
|
{
|
|
995
1034
|
stackTrigger: "nextjs",
|
|
996
1035
|
repo: "vercel-labs/agent-skills",
|
|
@@ -1009,6 +1048,34 @@ var init_community_skills = __esm({
|
|
|
1009
1048
|
name: "react-best-practices",
|
|
1010
1049
|
description: "React performance optimization (40+ rules from Vercel)"
|
|
1011
1050
|
},
|
|
1051
|
+
// Vue / Nuxt
|
|
1052
|
+
{
|
|
1053
|
+
stackTrigger: "nuxt",
|
|
1054
|
+
repo: "onmax/nuxt-skills",
|
|
1055
|
+
name: "nuxt",
|
|
1056
|
+
description: "Nuxt framework patterns and best practices"
|
|
1057
|
+
},
|
|
1058
|
+
{
|
|
1059
|
+
stackTrigger: "vue",
|
|
1060
|
+
repo: "onmax/nuxt-skills",
|
|
1061
|
+
name: "vue",
|
|
1062
|
+
description: "Vue.js composition API and component patterns"
|
|
1063
|
+
},
|
|
1064
|
+
// Angular
|
|
1065
|
+
{
|
|
1066
|
+
stackTrigger: "angular",
|
|
1067
|
+
repo: "Jeffallan/claude-skills",
|
|
1068
|
+
name: "angular-architect",
|
|
1069
|
+
description: "Angular architecture, modules, and component patterns"
|
|
1070
|
+
},
|
|
1071
|
+
// Svelte / SvelteKit
|
|
1072
|
+
{
|
|
1073
|
+
stackTrigger: "svelte",
|
|
1074
|
+
repo: "spences10/svelte-skills-kit",
|
|
1075
|
+
name: "svelte-skills",
|
|
1076
|
+
description: "Svelte 5 runes, SvelteKit routing, and component patterns"
|
|
1077
|
+
},
|
|
1078
|
+
// Convex
|
|
1012
1079
|
{
|
|
1013
1080
|
stackTrigger: "convex",
|
|
1014
1081
|
repo: "waynesutton/convexskills",
|
|
@@ -1021,17 +1088,26 @@ var init_community_skills = __esm({
|
|
|
1021
1088
|
name: "convex-functions",
|
|
1022
1089
|
description: "Convex query/mutation/action patterns"
|
|
1023
1090
|
},
|
|
1091
|
+
// Python
|
|
1024
1092
|
{
|
|
1025
|
-
stackTrigger: "
|
|
1026
|
-
repo: "
|
|
1027
|
-
name: "
|
|
1028
|
-
description: "
|
|
1093
|
+
stackTrigger: "python",
|
|
1094
|
+
repo: "wdm0006/python-skills",
|
|
1095
|
+
name: "python-skills",
|
|
1096
|
+
description: "Python library quality, packaging, and testing patterns"
|
|
1029
1097
|
},
|
|
1098
|
+
// Go
|
|
1030
1099
|
{
|
|
1031
|
-
stackTrigger: "
|
|
1032
|
-
repo: "
|
|
1033
|
-
name: "
|
|
1034
|
-
description: "
|
|
1100
|
+
stackTrigger: "go",
|
|
1101
|
+
repo: "saisudhir14/golang-agent-skill",
|
|
1102
|
+
name: "golang",
|
|
1103
|
+
description: "Go concurrency, error handling, and testing patterns"
|
|
1104
|
+
},
|
|
1105
|
+
// Rust
|
|
1106
|
+
{
|
|
1107
|
+
stackTrigger: "rust",
|
|
1108
|
+
repo: "leonardomso/rust-skills",
|
|
1109
|
+
name: "rust-skills",
|
|
1110
|
+
description: "Rust ownership, concurrency, and safety patterns (179 rules)"
|
|
1035
1111
|
}
|
|
1036
1112
|
];
|
|
1037
1113
|
}
|
|
@@ -1414,7 +1490,7 @@ function printUpdateNotice(result) {
|
|
|
1414
1490
|
` ${pc5.dim("Update available:")} ${pc5.cyan(result.currentVersion)} ${pc5.dim("->")} ${pc5.cyan(result.latestVersion)}`
|
|
1415
1491
|
);
|
|
1416
1492
|
console.log(
|
|
1417
|
-
` ${pc5.dim("Run:")} ${pc5.yellow(`npm
|
|
1493
|
+
` ${pc5.dim("Run:")} ${pc5.yellow(`npm install -g ${PACKAGE_NAME}@beta`)}`
|
|
1418
1494
|
);
|
|
1419
1495
|
console.log();
|
|
1420
1496
|
}
|
|
@@ -1438,7 +1514,7 @@ __export(install_exports, {
|
|
|
1438
1514
|
import { defineCommand } from "citty";
|
|
1439
1515
|
import { resolve as resolve2 } from "path";
|
|
1440
1516
|
import { join as join11 } from "path";
|
|
1441
|
-
import {
|
|
1517
|
+
import { confirm as confirm2, isCancel as isCancel3, cancel as cancel2 } from "@clack/prompts";
|
|
1442
1518
|
var install_default;
|
|
1443
1519
|
var init_install = __esm({
|
|
1444
1520
|
"src/commands/install.ts"() {
|
|
@@ -1526,26 +1602,15 @@ var init_install = __esm({
|
|
|
1526
1602
|
}
|
|
1527
1603
|
}
|
|
1528
1604
|
if (!tier) {
|
|
1529
|
-
const
|
|
1530
|
-
message:
|
|
1531
|
-
|
|
1532
|
-
{
|
|
1533
|
-
value: "local",
|
|
1534
|
-
label: "local",
|
|
1535
|
-
hint: "File-based issues. No accounts, no API keys, works offline."
|
|
1536
|
-
},
|
|
1537
|
-
{
|
|
1538
|
-
value: "cloud",
|
|
1539
|
-
label: "cloud",
|
|
1540
|
-
hint: "Linear integration. Real-time sync with your team."
|
|
1541
|
-
}
|
|
1542
|
-
]
|
|
1605
|
+
const shouldInstall = await confirm2({
|
|
1606
|
+
message: `Install FlyDocs here? (local tier)
|
|
1607
|
+
Directory: ${targetDir}`
|
|
1543
1608
|
});
|
|
1544
|
-
if (isCancel3(
|
|
1609
|
+
if (isCancel3(shouldInstall) || !shouldInstall) {
|
|
1545
1610
|
cancel2("Installation cancelled.");
|
|
1546
1611
|
process.exit(0);
|
|
1547
1612
|
}
|
|
1548
|
-
tier =
|
|
1613
|
+
tier = "local";
|
|
1549
1614
|
console.log();
|
|
1550
1615
|
}
|
|
1551
1616
|
if (!await pathExists(join11(targetDir, ".git"))) {
|
|
@@ -1797,8 +1862,72 @@ var init_install = __esm({
|
|
|
1797
1862
|
"",
|
|
1798
1863
|
"Documentation: flydocs/README.md"
|
|
1799
1864
|
];
|
|
1865
|
+
let copiedToClipboard = false;
|
|
1866
|
+
try {
|
|
1867
|
+
const clipboard = await import("clipboardy");
|
|
1868
|
+
await clipboard.default.write("/flydocs-setup");
|
|
1869
|
+
copiedToClipboard = true;
|
|
1870
|
+
} catch {
|
|
1871
|
+
}
|
|
1872
|
+
if (copiedToClipboard) {
|
|
1873
|
+
const localSteps = nextSteps.findIndex(
|
|
1874
|
+
(l) => l.includes("/flydocs-setup")
|
|
1875
|
+
);
|
|
1876
|
+
if (localSteps !== -1) {
|
|
1877
|
+
nextSteps[localSteps] = nextSteps[localSteps] + " (copied to clipboard)";
|
|
1878
|
+
}
|
|
1879
|
+
}
|
|
1800
1880
|
printCompletionBox("Installation Complete!", nextSteps);
|
|
1801
1881
|
printBetaCta();
|
|
1882
|
+
try {
|
|
1883
|
+
const { execSync: execSync4, spawn } = await import("child_process");
|
|
1884
|
+
const isInstalled = (cmd) => {
|
|
1885
|
+
try {
|
|
1886
|
+
execSync4(`which ${cmd}`, { stdio: "pipe" });
|
|
1887
|
+
return true;
|
|
1888
|
+
} catch {
|
|
1889
|
+
return false;
|
|
1890
|
+
}
|
|
1891
|
+
};
|
|
1892
|
+
const hasClaude = isInstalled("claude");
|
|
1893
|
+
const hasCursor = isInstalled("cursor");
|
|
1894
|
+
const hasCode = isInstalled("code");
|
|
1895
|
+
if (hasClaude) {
|
|
1896
|
+
const launchClaude = await confirm2({
|
|
1897
|
+
message: "Open Claude Code and run /flydocs-setup now?"
|
|
1898
|
+
});
|
|
1899
|
+
if (!isCancel3(launchClaude) && launchClaude) {
|
|
1900
|
+
spawn("claude", ["/flydocs-setup"], {
|
|
1901
|
+
cwd: targetDir,
|
|
1902
|
+
stdio: "inherit"
|
|
1903
|
+
});
|
|
1904
|
+
return;
|
|
1905
|
+
}
|
|
1906
|
+
} else if (hasCursor) {
|
|
1907
|
+
const launchCursor = await confirm2({
|
|
1908
|
+
message: copiedToClipboard ? "Open Cursor? (paste /flydocs-setup from clipboard)" : "Open Cursor?"
|
|
1909
|
+
});
|
|
1910
|
+
if (!isCancel3(launchCursor) && launchCursor) {
|
|
1911
|
+
spawn("cursor", [targetDir], {
|
|
1912
|
+
stdio: "ignore",
|
|
1913
|
+
detached: true
|
|
1914
|
+
}).unref();
|
|
1915
|
+
printInfo("Cursor opening \u2014 paste /flydocs-setup in the chat panel");
|
|
1916
|
+
}
|
|
1917
|
+
} else if (hasCode) {
|
|
1918
|
+
const launchCode = await confirm2({
|
|
1919
|
+
message: copiedToClipboard ? "Open VS Code? (paste /flydocs-setup from clipboard)" : "Open VS Code?"
|
|
1920
|
+
});
|
|
1921
|
+
if (!isCancel3(launchCode) && launchCode) {
|
|
1922
|
+
spawn("code", [targetDir], {
|
|
1923
|
+
stdio: "ignore",
|
|
1924
|
+
detached: true
|
|
1925
|
+
}).unref();
|
|
1926
|
+
printInfo("VS Code opening \u2014 paste /flydocs-setup in the chat panel");
|
|
1927
|
+
}
|
|
1928
|
+
}
|
|
1929
|
+
} catch {
|
|
1930
|
+
}
|
|
1802
1931
|
try {
|
|
1803
1932
|
const updateResult = await checkForUpdate();
|
|
1804
1933
|
if (updateResult) {
|
|
@@ -1819,7 +1948,7 @@ __export(update_exports, {
|
|
|
1819
1948
|
import { defineCommand as defineCommand2 } from "citty";
|
|
1820
1949
|
import { resolve as resolve3, join as join12 } from "path";
|
|
1821
1950
|
import { mkdir as mkdir5, cp as cp2, readFile as readFile8, readdir as readdir3, rm as rm4 } from "fs/promises";
|
|
1822
|
-
import { select
|
|
1951
|
+
import { select, text, confirm as confirm3, isCancel as isCancel4, cancel as cancel3 } from "@clack/prompts";
|
|
1823
1952
|
import pc6 from "picocolors";
|
|
1824
1953
|
var update_default;
|
|
1825
1954
|
var init_update = __esm({
|
|
@@ -1885,7 +2014,7 @@ var init_update = __esm({
|
|
|
1885
2014
|
} else if (args.here) {
|
|
1886
2015
|
targetDir = process.cwd();
|
|
1887
2016
|
} else {
|
|
1888
|
-
const choice = await
|
|
2017
|
+
const choice = await select({
|
|
1889
2018
|
message: "Which project would you like to update?",
|
|
1890
2019
|
options: [
|
|
1891
2020
|
{
|
|
@@ -1956,7 +2085,7 @@ var init_update = __esm({
|
|
|
1956
2085
|
printWarning(
|
|
1957
2086
|
`Project version (${currentVersion}) is newer than installer (${version})`
|
|
1958
2087
|
);
|
|
1959
|
-
const shouldContinue = await
|
|
2088
|
+
const shouldContinue = await confirm3({
|
|
1960
2089
|
message: "Continue anyway?"
|
|
1961
2090
|
});
|
|
1962
2091
|
if (isCancel4(shouldContinue) || !shouldContinue) {
|
|
@@ -2336,7 +2465,7 @@ __export(connect_exports, {
|
|
|
2336
2465
|
default: () => connect_default
|
|
2337
2466
|
});
|
|
2338
2467
|
import { defineCommand as defineCommand5 } from "citty";
|
|
2339
|
-
import { text as text2, confirm as
|
|
2468
|
+
import { text as text2, confirm as confirm4, isCancel as isCancel5, cancel as cancel4 } from "@clack/prompts";
|
|
2340
2469
|
import pc8 from "picocolors";
|
|
2341
2470
|
import { readFile as readFile9, writeFile as writeFile5, appendFile as appendFile2 } from "fs/promises";
|
|
2342
2471
|
import { join as join13 } from "path";
|
|
@@ -2386,7 +2515,7 @@ var init_connect = __esm({
|
|
|
2386
2515
|
if (config.tier === "cloud") {
|
|
2387
2516
|
printInfo("This project is already connected to the cloud tier.");
|
|
2388
2517
|
console.log();
|
|
2389
|
-
const reconnect = await
|
|
2518
|
+
const reconnect = await confirm4({
|
|
2390
2519
|
message: "Want to update your API key?"
|
|
2391
2520
|
});
|
|
2392
2521
|
if (isCancel5(reconnect) || !reconnect) {
|
|
@@ -2612,14 +2741,16 @@ var init_self_update = __esm({
|
|
|
2612
2741
|
console.log(` Updating ${pc10.cyan(PACKAGE_NAME)}...`);
|
|
2613
2742
|
console.log();
|
|
2614
2743
|
try {
|
|
2615
|
-
execSync3(`npm
|
|
2744
|
+
execSync3(`npm install -g ${PACKAGE_NAME}@beta`, {
|
|
2616
2745
|
stdio: "inherit",
|
|
2617
2746
|
timeout: 6e4
|
|
2618
2747
|
});
|
|
2619
2748
|
console.log();
|
|
2620
2749
|
printStatus("FlyDocs CLI updated successfully");
|
|
2621
2750
|
} catch {
|
|
2622
|
-
printError(
|
|
2751
|
+
printError(
|
|
2752
|
+
`Update failed. Try manually: npm install -g ${PACKAGE_NAME}@beta`
|
|
2753
|
+
);
|
|
2623
2754
|
process.exit(1);
|
|
2624
2755
|
}
|
|
2625
2756
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@flydocs/cli",
|
|
3
|
-
"version": "0.5.0-beta.
|
|
3
|
+
"version": "0.5.0-beta.4",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "FlyDocs AI CLI — install, setup, and manage FlyDocs projects",
|
|
6
6
|
"bin": {
|
|
@@ -22,6 +22,7 @@
|
|
|
22
22
|
"dependencies": {
|
|
23
23
|
"@clack/prompts": "^0.9.1",
|
|
24
24
|
"citty": "^0.1.6",
|
|
25
|
+
"clipboardy": "^5.3.0",
|
|
25
26
|
"picocolors": "^1.1.1"
|
|
26
27
|
},
|
|
27
28
|
"devDependencies": {
|
|
@@ -21,29 +21,29 @@ These are non-negotiable and enforced by hooks:
|
|
|
21
21
|
|
|
22
22
|
The FlyDocs development lifecycle. Read the workflow skill before taking any workflow action.
|
|
23
23
|
|
|
24
|
-
| Action
|
|
25
|
-
|
|
26
|
-
| Capture issue
|
|
27
|
-
| Refine / triage
|
|
28
|
-
| Activate work
|
|
29
|
-
| Implement
|
|
30
|
-
| Code review
|
|
31
|
-
| QE validation
|
|
32
|
-
| Close issue
|
|
33
|
-
| Start / wrap session | `flydocs-workflow` | `session.md`
|
|
34
|
-
| Comment templates
|
|
35
|
-
| Status transitions
|
|
24
|
+
| Action | Skill | Entry Point |
|
|
25
|
+
| -------------------- | ------------------ | --------------------------------- |
|
|
26
|
+
| Capture issue | `flydocs-workflow` | `stages/capture.md` |
|
|
27
|
+
| Refine / triage | `flydocs-workflow` | `stages/refine.md` |
|
|
28
|
+
| Activate work | `flydocs-workflow` | `stages/activate.md` |
|
|
29
|
+
| Implement | `flydocs-workflow` | `stages/implement.md` |
|
|
30
|
+
| Code review | `flydocs-workflow` | `stages/review.md` |
|
|
31
|
+
| QE validation | `flydocs-workflow` | `stages/validate.md` |
|
|
32
|
+
| Close issue | `flydocs-workflow` | `stages/close.md` |
|
|
33
|
+
| Start / wrap session | `flydocs-workflow` | `session.md` |
|
|
34
|
+
| Comment templates | `flydocs-workflow` | `reference/comment-templates.md` |
|
|
35
|
+
| Status transitions | `flydocs-workflow` | `reference/status-workflow.md` |
|
|
36
36
|
| Priority & estimates | `flydocs-workflow` | `reference/priority-estimates.md` |
|
|
37
|
-
| Issue templates
|
|
37
|
+
| Issue templates | `flydocs-workflow` | `templates/` |
|
|
38
38
|
|
|
39
39
|
## Mechanism Scripts
|
|
40
40
|
|
|
41
41
|
Issue operations are handled by the installed mechanism skill. Only one is active at a time.
|
|
42
42
|
|
|
43
|
-
| Tier
|
|
44
|
-
|
|
45
|
-
| Local (free)
|
|
46
|
-
| Cloud (connected) | `flydocs-cloud` | Linear GraphQL API
|
|
43
|
+
| Tier | Skill | Backend |
|
|
44
|
+
| ----------------- | --------------- | ------------------------------ |
|
|
45
|
+
| Local (free) | `flydocs-local` | File-based (`flydocs/issues/`) |
|
|
46
|
+
| Cloud (connected) | `flydocs-cloud` | Linear GraphQL API |
|
|
47
47
|
|
|
48
48
|
Read the active mechanism skill's `SKILL.md` for script catalog and calling conventions.
|
|
49
49
|
|
|
@@ -54,37 +54,71 @@ Read the active mechanism skill's `SKILL.md` for script catalog and calling conv
|
|
|
54
54
|
|
|
55
55
|
FlyDocs platform skills with premium functionality.
|
|
56
56
|
|
|
57
|
-
| Skill
|
|
58
|
-
|
|
59
|
-
| `flydocs-figma`
|
|
60
|
-
| `flydocs-estimates` | Estimating AI token usage and costs (opt-in via config)
|
|
57
|
+
| Skill | When to Read |
|
|
58
|
+
| ------------------- | ---------------------------------------------------------- |
|
|
59
|
+
| `flydocs-figma` | Building UI from Figma designs — extraction, token mapping |
|
|
60
|
+
| `flydocs-estimates` | Estimating AI token usage and costs (opt-in via config) |
|
|
61
61
|
|
|
62
62
|
## Project Context
|
|
63
63
|
|
|
64
|
-
| File
|
|
65
|
-
|
|
64
|
+
| File | Purpose |
|
|
65
|
+
| ---------------------------- | -------------------------------------------- |
|
|
66
66
|
| `flydocs/context/project.md` | Product scope, tech stack, active priorities |
|
|
67
|
-
| `.flydocs/config.json`
|
|
67
|
+
| `.flydocs/config.json` | Tier, provider, labels, active projects |
|
|
68
68
|
|
|
69
69
|
## Hooks
|
|
70
70
|
|
|
71
|
-
| Hook
|
|
72
|
-
|
|
73
|
-
| `PostToolUse` (Edit/Write) | After code changes
|
|
74
|
-
| `UserPromptSubmit`
|
|
75
|
-
| `PreToolUse`
|
|
71
|
+
| Hook | Trigger | Purpose |
|
|
72
|
+
| -------------------------- | ----------------------- | ------------------------------ |
|
|
73
|
+
| `PostToolUse` (Edit/Write) | After code changes | Auto-format |
|
|
74
|
+
| `UserPromptSubmit` | Before prompt | Inject git/issue context |
|
|
75
|
+
| `PreToolUse` | Before script execution | Auto-approve mechanism scripts |
|
|
76
|
+
|
|
77
|
+
## Output Formatting
|
|
78
|
+
|
|
79
|
+
Consistent formatting across all agent output. Follow these rules in every
|
|
80
|
+
response — session summaries, issue comments, status updates, and plans.
|
|
81
|
+
|
|
82
|
+
**Structure:**
|
|
83
|
+
|
|
84
|
+
- Lead with a one-line summary or status before detail.
|
|
85
|
+
- Use `##` for major sections, `###` for subsections. Never skip levels.
|
|
86
|
+
- Use bullet lists for 3+ related items. Use numbered lists only for sequences.
|
|
87
|
+
- One blank line between sections. No double-blank lines.
|
|
88
|
+
|
|
89
|
+
**Readability:**
|
|
90
|
+
|
|
91
|
+
- Keep paragraphs to 2-3 sentences. Break long blocks into scannable lists.
|
|
92
|
+
- Bold key terms and status labels on first use: **Completed**, **Blocked**, **Next**.
|
|
93
|
+
- Use inline code for file paths, commands, and identifiers: `project.md`, `/start-session`, `FLY-123`.
|
|
94
|
+
- Use code blocks with language tags for multi-line code or script examples.
|
|
95
|
+
|
|
96
|
+
**Consistency:**
|
|
97
|
+
|
|
98
|
+
- Status labels: **Completed**, **In Progress**, **Blocked**, **Next Up** (always bolded).
|
|
99
|
+
- Issue references: `FLY-123` format (uppercase prefix, hyphen, number).
|
|
100
|
+
- File paths: relative from project root, in backticks.
|
|
101
|
+
- Dates: `YYYY-MM-DD` format.
|
|
102
|
+
- No emoji in output unless the user explicitly requests it.
|
|
103
|
+
|
|
104
|
+
**Tables:**
|
|
105
|
+
|
|
106
|
+
- Use tables for structured comparisons (3+ items with 2+ attributes).
|
|
107
|
+
- Left-align text columns, keep headers short.
|
|
76
108
|
|
|
77
109
|
<!-- flydocs:skills-manifest:start -->
|
|
110
|
+
|
|
78
111
|
## Skills Index
|
|
79
112
|
|
|
80
113
|
IMPORTANT: Prefer skill-led reasoning over pre-training reasoning.
|
|
81
114
|
Consult the relevant skill BEFORE writing code or making workflow decisions.
|
|
82
115
|
|
|
83
|
-
| Skill
|
|
84
|
-
|
|
85
|
-
| flydocs-cloud
|
|
86
|
-
| flydocs-estimates | estimate, cost, token usage, API cost, labor estimate, sizing, effort
|
|
87
|
-
| flydocs-figma
|
|
88
|
-
| flydocs-local
|
|
89
|
-
| flydocs-workflow
|
|
116
|
+
| Skill | Triggers | Entry |
|
|
117
|
+
| ----------------- | ----------------------------------------------------------------------------------------------------------------------- | ----------------------------------------- |
|
|
118
|
+
| flydocs-cloud | create issue, transition, comment, list issues, assign, update description, update issue, project update, Linear, cloud | .claude/skills/flydocs-cloud/SKILL.md |
|
|
119
|
+
| flydocs-estimates | estimate, cost, token usage, API cost, labor estimate, sizing, effort | .claude/skills/flydocs-estimates/SKILL.md |
|
|
120
|
+
| flydocs-figma | Figma, design, screenshot, token mapping, component from design, pixel-perfect, design system | .claude/skills/flydocs-figma/SKILL.md |
|
|
121
|
+
| flydocs-local | create issue, transition, comment, list issues, assign, update description, status summary, local | .claude/skills/flydocs-local/SKILL.md |
|
|
122
|
+
| flydocs-workflow | capture, refine, activate, implement, review, validate, close, session, workflow, transition, status, issue | .claude/skills/flydocs-workflow/SKILL.md |
|
|
123
|
+
|
|
90
124
|
<!-- flydocs:skills-manifest:end -->
|
|
@@ -11,6 +11,22 @@ Triggers: "setup flydocs", "onboard project", "flydocs init"
|
|
|
11
11
|
|
|
12
12
|
---
|
|
13
13
|
|
|
14
|
+
## IMPORTANT: Use Plan Mode
|
|
15
|
+
|
|
16
|
+
**Before executing any setup steps, enter plan mode.** This setup involves
|
|
17
|
+
multiple phases with user decisions at each stage. Planning first ensures a
|
|
18
|
+
better experience:
|
|
19
|
+
|
|
20
|
+
1. Run scenario detection (Phase 0) to understand the project state
|
|
21
|
+
2. Scan for existing documentation and the tech stack
|
|
22
|
+
3. Present a structured setup plan showing all phases and what each will do
|
|
23
|
+
4. Get user approval before making any changes
|
|
24
|
+
|
|
25
|
+
This lets the user see the full picture before committing. Only exit plan
|
|
26
|
+
mode and begin execution after the user approves the plan.
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
|
|
14
30
|
## Phase 0: Scenario Detection
|
|
15
31
|
|
|
16
32
|
Before starting, detect the project state by checking the filesystem:
|
|
@@ -541,7 +557,26 @@ Wrapping up:
|
|
|
541
557
|
- No account or API key needed — everything is local and offline
|
|
542
558
|
- Run `/status` anytime to see your backlog at a glance
|
|
543
559
|
|
|
544
|
-
### Step 4:
|
|
560
|
+
### Step 4: Commit setup
|
|
561
|
+
|
|
562
|
+
FlyDocs setup creates and modifies many files. Prompt the user to commit
|
|
563
|
+
everything as a clean baseline:
|
|
564
|
+
|
|
565
|
+
```
|
|
566
|
+
Ready to commit the FlyDocs setup? This creates a clean baseline with all
|
|
567
|
+
configuration, context, and initial backlog in one commit.
|
|
568
|
+
```
|
|
569
|
+
|
|
570
|
+
If the user agrees, create a single commit with a message like:
|
|
571
|
+
`Add FlyDocs project setup (local tier)` or `Add FlyDocs project setup (cloud tier)`
|
|
572
|
+
|
|
573
|
+
Stage all new and modified FlyDocs files (`.flydocs/`, `.claude/`, `.cursor/`,
|
|
574
|
+
`flydocs/`, `AGENTS.md`, `.gitignore`). Do not stage unrelated changes.
|
|
575
|
+
|
|
576
|
+
If the user declines, remind them to commit before starting work:
|
|
577
|
+
"No problem — just remember to commit these files before your first session."
|
|
578
|
+
|
|
579
|
+
### Step 5: Beta CTA
|
|
545
580
|
|
|
546
581
|
Always end with the beta call-to-action:
|
|
547
582
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
0.5.0-beta.
|
|
1
|
+
0.5.0-beta.4
|
package/template/AGENTS.md
CHANGED
|
@@ -21,15 +21,15 @@ The development lifecycle follows seven stages:
|
|
|
21
21
|
Capture → Refine → Activate → Implement → Review → Validate → Close
|
|
22
22
|
```
|
|
23
23
|
|
|
24
|
-
| Stage
|
|
25
|
-
|
|
26
|
-
| Capture
|
|
27
|
-
| Refine
|
|
28
|
-
| Activate
|
|
24
|
+
| Stage | What Happens |
|
|
25
|
+
| --------- | ---------------------------------------------------- |
|
|
26
|
+
| Capture | Create issue from input (feature, bug, chore, idea) |
|
|
27
|
+
| Refine | Triage, fill template, set priority and estimate |
|
|
28
|
+
| Activate | Assign to person, transition to In Progress |
|
|
29
29
|
| Implement | Build incrementally, document decisions, self-review |
|
|
30
|
-
| Review
|
|
31
|
-
| Validate
|
|
32
|
-
| Close
|
|
30
|
+
| Review | Code quality check against acceptance criteria |
|
|
31
|
+
| Validate | User acceptance testing, collect approval |
|
|
32
|
+
| Close | Verify approval, mark as Done |
|
|
33
33
|
|
|
34
34
|
Detailed procedures: `.claude/skills/flydocs-workflow/`
|
|
35
35
|
|
|
@@ -43,10 +43,10 @@ Script location: `.claude/skills/flydocs-local/scripts/` or `.claude/skills/flyd
|
|
|
43
43
|
|
|
44
44
|
## Premium Skills
|
|
45
45
|
|
|
46
|
-
| Skill
|
|
47
|
-
|
|
48
|
-
| Figma Integration | `.claude/skills/flydocs-figma/` — design extraction, token mapping
|
|
49
|
-
| Cost Estimation
|
|
46
|
+
| Skill | Documentation |
|
|
47
|
+
| ----------------- | ----------------------------------------------------------------------- |
|
|
48
|
+
| Figma Integration | `.claude/skills/flydocs-figma/` — design extraction, token mapping |
|
|
49
|
+
| Cost Estimation | `.claude/skills/flydocs-estimates/` — AI token/labor estimates (opt-in) |
|
|
50
50
|
|
|
51
51
|
## Writing Style
|
|
52
52
|
|
|
@@ -64,32 +64,48 @@ When writing or editing any copy — product docs, marketing pages, website copy
|
|
|
64
64
|
- Don't repeat the same stat or claim more than once per page. Cross-page repetition is fine — readers land on individual pages.
|
|
65
65
|
- When differentiating, name what the alternative does and where it falls short. Don't just assert we're better — show the specific gap.
|
|
66
66
|
|
|
67
|
+
## Output Formatting
|
|
68
|
+
|
|
69
|
+
Follow these rules in every response for consistent, scannable output.
|
|
70
|
+
|
|
71
|
+
- Lead with a one-line summary before detail.
|
|
72
|
+
- Use `##` for major sections, `###` for subsections. Never skip heading levels.
|
|
73
|
+
- Bullet lists for 3+ related items. Numbered lists only for ordered sequences.
|
|
74
|
+
- Bold status labels: **Completed**, **In Progress**, **Blocked**, **Next Up**.
|
|
75
|
+
- Inline code for file paths, commands, identifiers: `project.md`, `/start-session`, `FLY-123`.
|
|
76
|
+
- Code blocks with language tags for multi-line code.
|
|
77
|
+
- Tables for structured comparisons (3+ items with 2+ attributes).
|
|
78
|
+
- Keep paragraphs to 2-3 sentences. Break long blocks into scannable lists.
|
|
79
|
+
- Dates in `YYYY-MM-DD` format. No emoji unless explicitly requested.
|
|
80
|
+
|
|
67
81
|
## Project Context
|
|
68
82
|
|
|
69
|
-
| File
|
|
70
|
-
|
|
71
|
-
| `flydocs/context/project.md` | Product scope, tech stack, active priorities
|
|
72
|
-
| `.flydocs/config.json`
|
|
83
|
+
| File | Purpose |
|
|
84
|
+
| ---------------------------- | ------------------------------------------------------- |
|
|
85
|
+
| `flydocs/context/project.md` | Product scope, tech stack, active priorities |
|
|
86
|
+
| `.flydocs/config.json` | Configuration — tier, provider, labels, active projects |
|
|
73
87
|
|
|
74
88
|
<!-- flydocs:skills-manifest:start -->
|
|
89
|
+
|
|
75
90
|
## Skills Index
|
|
76
91
|
|
|
77
92
|
IMPORTANT: Prefer skill-led reasoning over pre-training reasoning.
|
|
78
93
|
Consult the relevant skill BEFORE writing code or making workflow decisions.
|
|
79
94
|
|
|
80
|
-
| Skill
|
|
81
|
-
|
|
82
|
-
| flydocs-cloud
|
|
83
|
-
| flydocs-estimates | estimate, cost, token usage, API cost, labor estimate, sizing, effort
|
|
84
|
-
| flydocs-figma
|
|
85
|
-
| flydocs-local
|
|
86
|
-
| flydocs-workflow
|
|
95
|
+
| Skill | Triggers | Entry |
|
|
96
|
+
| ----------------- | ----------------------------------------------------------------------------------------------------------------------- | ----------------------------------------- |
|
|
97
|
+
| flydocs-cloud | create issue, transition, comment, list issues, assign, update description, update issue, project update, Linear, cloud | .claude/skills/flydocs-cloud/SKILL.md |
|
|
98
|
+
| flydocs-estimates | estimate, cost, token usage, API cost, labor estimate, sizing, effort | .claude/skills/flydocs-estimates/SKILL.md |
|
|
99
|
+
| flydocs-figma | Figma, design, screenshot, token mapping, component from design, pixel-perfect, design system | .claude/skills/flydocs-figma/SKILL.md |
|
|
100
|
+
| flydocs-local | create issue, transition, comment, list issues, assign, update description, status summary, local | .claude/skills/flydocs-local/SKILL.md |
|
|
101
|
+
| flydocs-workflow | capture, refine, activate, implement, review, validate, close, session, workflow, transition, status, issue | .claude/skills/flydocs-workflow/SKILL.md |
|
|
102
|
+
|
|
87
103
|
<!-- flydocs:skills-manifest:end -->
|
|
88
104
|
|
|
89
105
|
## Platform Configuration
|
|
90
106
|
|
|
91
|
-
| Platform
|
|
92
|
-
|
|
93
|
-
| Claude Code
|
|
94
|
-
| Cursor
|
|
107
|
+
| Platform | Primary Config |
|
|
108
|
+
| ------------------------- | ----------------------- |
|
|
109
|
+
| Claude Code | `.claude/CLAUDE.md` |
|
|
110
|
+
| Cursor | `.cursor/rules/*.mdc` |
|
|
95
111
|
| Codex / Windsurf / Others | This file (`AGENTS.md`) |
|
package/template/manifest.json
CHANGED