@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 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.2";
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 in the Node CLI.`);
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(` ${bold(pink("\u2588\u2588\u2588\u2588\u2588\u2588"))}`);
164
+ console.log(` ${pinkBlock12}`);
165
+ console.log(` ${pinkBlock12}`);
166
+ console.log(` ${pinkBlock4}`);
162
167
  console.log(
163
- ` ${bold(pink("\u2588\u2588"))} ${bold(purple("\u2588\u2588\u2588\u2588\u2588\u2588"))} ${bold(pink("Fly"))}${bold(purple("Docs"))} ${bold(pink("Core"))}`
168
+ ` ${pinkBlock4} ${purpleBlock12} ${bold("Fly")}${bold("Docs")} ${bold("Core")}`
164
169
  );
165
170
  console.log(
166
- ` ${bold(purple("\u2588\u2588\u2588\u2588\u2588\u2588"))} ${dim("Context-as-a-Service Platform Built for Engineering at Altitude")}`
171
+ ` ${purpleBlock12} ${dim("Context-as-a-Service Platform Built for Engineering at Altitude")}`
167
172
  );
168
- console.log(` ${bold(purple("\u2588\u2588"))}`);
169
- console.log(` ${bold(purple("\u2588\u2588"))} ${dim(`v${version}`)}`);
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((s) => ["nextjs", "react", "expo"].includes(s)),
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((s) => ["typescript"].includes(s)),
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: "tailwind",
1026
- repo: "blencorp/claude-code-kit",
1027
- name: "tailwind-v4",
1028
- description: "Tailwind CSS v4 patterns and configuration"
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: "clerk",
1032
- repo: "blencorp/claude-code-kit",
1033
- name: "clerk-auth",
1034
- description: "Clerk authentication patterns"
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 update -g ${PACKAGE_NAME}`)}`
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 { select, isCancel as isCancel3, cancel as cancel2 } from "@clack/prompts";
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 tierChoice = await select({
1530
- message: "Select your tier",
1531
- options: [
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(tierChoice)) {
1609
+ if (isCancel3(shouldInstall) || !shouldInstall) {
1545
1610
  cancel2("Installation cancelled.");
1546
1611
  process.exit(0);
1547
1612
  }
1548
- tier = tierChoice;
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 as select2, text, confirm as confirm2, isCancel as isCancel4, cancel as cancel3 } from "@clack/prompts";
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 select2({
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 confirm2({
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 confirm3, isCancel as isCancel5, cancel as cancel4 } from "@clack/prompts";
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 confirm3({
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 update -g ${PACKAGE_NAME}`, {
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(`Update failed. Try manually: npm update -g ${PACKAGE_NAME}`);
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.2",
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 | 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` |
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 | `flydocs-workflow` | `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 | Skill | Backend |
44
- |------|-------|---------|
45
- | Local (free) | `flydocs-local` | File-based (`flydocs/issues/`) |
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 | 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) |
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 | Purpose |
65
- |------|---------|
64
+ | File | Purpose |
65
+ | ---------------------------- | -------------------------------------------- |
66
66
  | `flydocs/context/project.md` | Product scope, tech stack, active priorities |
67
- | `.flydocs/config.json` | Tier, provider, labels, active projects |
67
+ | `.flydocs/config.json` | Tier, provider, labels, active projects |
68
68
 
69
69
  ## Hooks
70
70
 
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 |
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 | Triggers | Entry |
84
- |-------|----------|-------|
85
- | flydocs-cloud | create issue, transition, comment, list issues, assign, update description, update issue, project update, Linear, cloud | .claude/skills/flydocs-cloud/SKILL.md |
86
- | flydocs-estimates | estimate, cost, token usage, API cost, labor estimate, sizing, effort | .claude/skills/flydocs-estimates/SKILL.md |
87
- | flydocs-figma | Figma, design, screenshot, token mapping, component from design, pixel-perfect, design system | .claude/skills/flydocs-figma/SKILL.md |
88
- | flydocs-local | create issue, transition, comment, list issues, assign, update description, status summary, local | .claude/skills/flydocs-local/SKILL.md |
89
- | flydocs-workflow | capture, refine, activate, implement, review, validate, close, session, workflow, transition, status, issue | .claude/skills/flydocs-workflow/SKILL.md |
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: Beta CTA
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,5 +1,5 @@
1
1
  {
2
- "version": "0.5.0-beta.2",
2
+ "version": "0.5.0-beta.4",
3
3
  "sourceRepo": "github.com/plastrlab/flydocs-core",
4
4
  "tier": "cloud",
5
5
  "setupComplete": false,
@@ -1 +1 @@
1
- 0.5.0-beta.2
1
+ 0.5.0-beta.4
@@ -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 | 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 |
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 | Code quality check against acceptance criteria |
31
- | Validate | User acceptance testing, collect approval |
32
- | Close | Verify approval, mark as Done |
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 | 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) |
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 | Purpose |
70
- |------|---------|
71
- | `flydocs/context/project.md` | Product scope, tech stack, active priorities |
72
- | `.flydocs/config.json` | Configuration — tier, provider, labels, active projects |
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 | Triggers | Entry |
81
- |-------|----------|-------|
82
- | flydocs-cloud | create issue, transition, comment, list issues, assign, update description, update issue, project update, Linear, cloud | .claude/skills/flydocs-cloud/SKILL.md |
83
- | flydocs-estimates | estimate, cost, token usage, API cost, labor estimate, sizing, effort | .claude/skills/flydocs-estimates/SKILL.md |
84
- | flydocs-figma | Figma, design, screenshot, token mapping, component from design, pixel-perfect, design system | .claude/skills/flydocs-figma/SKILL.md |
85
- | flydocs-local | create issue, transition, comment, list issues, assign, update description, status summary, local | .claude/skills/flydocs-local/SKILL.md |
86
- | flydocs-workflow | capture, refine, activate, implement, review, validate, close, session, workflow, transition, status, issue | .claude/skills/flydocs-workflow/SKILL.md |
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 | Primary Config |
92
- |----------|----------------|
93
- | Claude Code | `.claude/CLAUDE.md` |
94
- | Cursor | `.cursor/rules/*.mdc` |
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`) |
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "0.5.0-beta.2",
2
+ "version": "0.5.0-beta.4",
3
3
  "description": "FlyDocs Core - Manifest of all managed files",
4
4
  "repository": "github.com/plastrlab/flydocs-core",
5
5