@flydocs/cli 0.5.0-beta.3 → 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 +174 -45
- 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
|
)
|
|
@@ -993,6 +1029,7 @@ var init_community_skills = __esm({
|
|
|
993
1029
|
init_ui();
|
|
994
1030
|
init_skill_manager();
|
|
995
1031
|
COMMUNITY_SKILLS_MAP = [
|
|
1032
|
+
// React / Next.js (Vercel official)
|
|
996
1033
|
{
|
|
997
1034
|
stackTrigger: "nextjs",
|
|
998
1035
|
repo: "vercel-labs/agent-skills",
|
|
@@ -1011,6 +1048,34 @@ var init_community_skills = __esm({
|
|
|
1011
1048
|
name: "react-best-practices",
|
|
1012
1049
|
description: "React performance optimization (40+ rules from Vercel)"
|
|
1013
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
|
|
1014
1079
|
{
|
|
1015
1080
|
stackTrigger: "convex",
|
|
1016
1081
|
repo: "waynesutton/convexskills",
|
|
@@ -1023,17 +1088,26 @@ var init_community_skills = __esm({
|
|
|
1023
1088
|
name: "convex-functions",
|
|
1024
1089
|
description: "Convex query/mutation/action patterns"
|
|
1025
1090
|
},
|
|
1091
|
+
// Python
|
|
1026
1092
|
{
|
|
1027
|
-
stackTrigger: "
|
|
1028
|
-
repo: "
|
|
1029
|
-
name: "
|
|
1030
|
-
description: "
|
|
1093
|
+
stackTrigger: "python",
|
|
1094
|
+
repo: "wdm0006/python-skills",
|
|
1095
|
+
name: "python-skills",
|
|
1096
|
+
description: "Python library quality, packaging, and testing patterns"
|
|
1031
1097
|
},
|
|
1098
|
+
// Go
|
|
1032
1099
|
{
|
|
1033
|
-
stackTrigger: "
|
|
1034
|
-
repo: "
|
|
1035
|
-
name: "
|
|
1036
|
-
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)"
|
|
1037
1111
|
}
|
|
1038
1112
|
];
|
|
1039
1113
|
}
|
|
@@ -1416,7 +1490,7 @@ function printUpdateNotice(result) {
|
|
|
1416
1490
|
` ${pc5.dim("Update available:")} ${pc5.cyan(result.currentVersion)} ${pc5.dim("->")} ${pc5.cyan(result.latestVersion)}`
|
|
1417
1491
|
);
|
|
1418
1492
|
console.log(
|
|
1419
|
-
` ${pc5.dim("Run:")} ${pc5.yellow(`npm
|
|
1493
|
+
` ${pc5.dim("Run:")} ${pc5.yellow(`npm install -g ${PACKAGE_NAME}@beta`)}`
|
|
1420
1494
|
);
|
|
1421
1495
|
console.log();
|
|
1422
1496
|
}
|
|
@@ -1440,7 +1514,7 @@ __export(install_exports, {
|
|
|
1440
1514
|
import { defineCommand } from "citty";
|
|
1441
1515
|
import { resolve as resolve2 } from "path";
|
|
1442
1516
|
import { join as join11 } from "path";
|
|
1443
|
-
import {
|
|
1517
|
+
import { confirm as confirm2, isCancel as isCancel3, cancel as cancel2 } from "@clack/prompts";
|
|
1444
1518
|
var install_default;
|
|
1445
1519
|
var init_install = __esm({
|
|
1446
1520
|
"src/commands/install.ts"() {
|
|
@@ -1528,26 +1602,15 @@ var init_install = __esm({
|
|
|
1528
1602
|
}
|
|
1529
1603
|
}
|
|
1530
1604
|
if (!tier) {
|
|
1531
|
-
const
|
|
1532
|
-
message:
|
|
1533
|
-
|
|
1534
|
-
{
|
|
1535
|
-
value: "local",
|
|
1536
|
-
label: "local",
|
|
1537
|
-
hint: "File-based issues. No accounts, no API keys, works offline."
|
|
1538
|
-
},
|
|
1539
|
-
{
|
|
1540
|
-
value: "cloud",
|
|
1541
|
-
label: "cloud",
|
|
1542
|
-
hint: "Linear integration. Real-time sync with your team."
|
|
1543
|
-
}
|
|
1544
|
-
]
|
|
1605
|
+
const shouldInstall = await confirm2({
|
|
1606
|
+
message: `Install FlyDocs here? (local tier)
|
|
1607
|
+
Directory: ${targetDir}`
|
|
1545
1608
|
});
|
|
1546
|
-
if (isCancel3(
|
|
1609
|
+
if (isCancel3(shouldInstall) || !shouldInstall) {
|
|
1547
1610
|
cancel2("Installation cancelled.");
|
|
1548
1611
|
process.exit(0);
|
|
1549
1612
|
}
|
|
1550
|
-
tier =
|
|
1613
|
+
tier = "local";
|
|
1551
1614
|
console.log();
|
|
1552
1615
|
}
|
|
1553
1616
|
if (!await pathExists(join11(targetDir, ".git"))) {
|
|
@@ -1799,8 +1862,72 @@ var init_install = __esm({
|
|
|
1799
1862
|
"",
|
|
1800
1863
|
"Documentation: flydocs/README.md"
|
|
1801
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
|
+
}
|
|
1802
1880
|
printCompletionBox("Installation Complete!", nextSteps);
|
|
1803
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
|
+
}
|
|
1804
1931
|
try {
|
|
1805
1932
|
const updateResult = await checkForUpdate();
|
|
1806
1933
|
if (updateResult) {
|
|
@@ -1821,7 +1948,7 @@ __export(update_exports, {
|
|
|
1821
1948
|
import { defineCommand as defineCommand2 } from "citty";
|
|
1822
1949
|
import { resolve as resolve3, join as join12 } from "path";
|
|
1823
1950
|
import { mkdir as mkdir5, cp as cp2, readFile as readFile8, readdir as readdir3, rm as rm4 } from "fs/promises";
|
|
1824
|
-
import { select
|
|
1951
|
+
import { select, text, confirm as confirm3, isCancel as isCancel4, cancel as cancel3 } from "@clack/prompts";
|
|
1825
1952
|
import pc6 from "picocolors";
|
|
1826
1953
|
var update_default;
|
|
1827
1954
|
var init_update = __esm({
|
|
@@ -1887,7 +2014,7 @@ var init_update = __esm({
|
|
|
1887
2014
|
} else if (args.here) {
|
|
1888
2015
|
targetDir = process.cwd();
|
|
1889
2016
|
} else {
|
|
1890
|
-
const choice = await
|
|
2017
|
+
const choice = await select({
|
|
1891
2018
|
message: "Which project would you like to update?",
|
|
1892
2019
|
options: [
|
|
1893
2020
|
{
|
|
@@ -1958,7 +2085,7 @@ var init_update = __esm({
|
|
|
1958
2085
|
printWarning(
|
|
1959
2086
|
`Project version (${currentVersion}) is newer than installer (${version})`
|
|
1960
2087
|
);
|
|
1961
|
-
const shouldContinue = await
|
|
2088
|
+
const shouldContinue = await confirm3({
|
|
1962
2089
|
message: "Continue anyway?"
|
|
1963
2090
|
});
|
|
1964
2091
|
if (isCancel4(shouldContinue) || !shouldContinue) {
|
|
@@ -2338,7 +2465,7 @@ __export(connect_exports, {
|
|
|
2338
2465
|
default: () => connect_default
|
|
2339
2466
|
});
|
|
2340
2467
|
import { defineCommand as defineCommand5 } from "citty";
|
|
2341
|
-
import { text as text2, confirm as
|
|
2468
|
+
import { text as text2, confirm as confirm4, isCancel as isCancel5, cancel as cancel4 } from "@clack/prompts";
|
|
2342
2469
|
import pc8 from "picocolors";
|
|
2343
2470
|
import { readFile as readFile9, writeFile as writeFile5, appendFile as appendFile2 } from "fs/promises";
|
|
2344
2471
|
import { join as join13 } from "path";
|
|
@@ -2388,7 +2515,7 @@ var init_connect = __esm({
|
|
|
2388
2515
|
if (config.tier === "cloud") {
|
|
2389
2516
|
printInfo("This project is already connected to the cloud tier.");
|
|
2390
2517
|
console.log();
|
|
2391
|
-
const reconnect = await
|
|
2518
|
+
const reconnect = await confirm4({
|
|
2392
2519
|
message: "Want to update your API key?"
|
|
2393
2520
|
});
|
|
2394
2521
|
if (isCancel5(reconnect) || !reconnect) {
|
|
@@ -2614,14 +2741,16 @@ var init_self_update = __esm({
|
|
|
2614
2741
|
console.log(` Updating ${pc10.cyan(PACKAGE_NAME)}...`);
|
|
2615
2742
|
console.log();
|
|
2616
2743
|
try {
|
|
2617
|
-
execSync3(`npm
|
|
2744
|
+
execSync3(`npm install -g ${PACKAGE_NAME}@beta`, {
|
|
2618
2745
|
stdio: "inherit",
|
|
2619
2746
|
timeout: 6e4
|
|
2620
2747
|
});
|
|
2621
2748
|
console.log();
|
|
2622
2749
|
printStatus("FlyDocs CLI updated successfully");
|
|
2623
2750
|
} catch {
|
|
2624
|
-
printError(
|
|
2751
|
+
printError(
|
|
2752
|
+
`Update failed. Try manually: npm install -g ${PACKAGE_NAME}@beta`
|
|
2753
|
+
);
|
|
2625
2754
|
process.exit(1);
|
|
2626
2755
|
}
|
|
2627
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