@frehilm/ordna-cli 0.1.4 → 0.2.0

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.
Files changed (62) hide show
  1. package/dist/cli.d.ts.map +1 -1
  2. package/dist/cli.js +14 -1
  3. package/dist/cli.js.map +1 -1
  4. package/dist/commands/assign.d.ts.map +1 -1
  5. package/dist/commands/assign.js +3 -2
  6. package/dist/commands/assign.js.map +1 -1
  7. package/dist/commands/commit.d.ts.map +1 -1
  8. package/dist/commands/commit.js +3 -2
  9. package/dist/commands/commit.js.map +1 -1
  10. package/dist/commands/create.d.ts.map +1 -1
  11. package/dist/commands/create.js +8 -3
  12. package/dist/commands/create.js.map +1 -1
  13. package/dist/commands/init.d.ts +15 -1
  14. package/dist/commands/init.d.ts.map +1 -1
  15. package/dist/commands/init.js +67 -17
  16. package/dist/commands/init.js.map +1 -1
  17. package/dist/commands/list.d.ts.map +1 -1
  18. package/dist/commands/list.js +3 -2
  19. package/dist/commands/list.js.map +1 -1
  20. package/dist/commands/move.d.ts.map +1 -1
  21. package/dist/commands/move.js +3 -2
  22. package/dist/commands/move.js.map +1 -1
  23. package/dist/commands/show.d.ts.map +1 -1
  24. package/dist/commands/show.js +3 -2
  25. package/dist/commands/show.js.map +1 -1
  26. package/dist/lib/ensure-context.d.ts +19 -0
  27. package/dist/lib/ensure-context.d.ts.map +1 -0
  28. package/dist/lib/ensure-context.js +39 -0
  29. package/dist/lib/ensure-context.js.map +1 -0
  30. package/dist/lib/prompt-mode.d.ts +12 -0
  31. package/dist/lib/prompt-mode.d.ts.map +1 -0
  32. package/dist/lib/prompt-mode.js +43 -0
  33. package/dist/lib/prompt-mode.js.map +1 -0
  34. package/dist/tui/App.d.ts.map +1 -1
  35. package/dist/tui/App.js +39 -1
  36. package/dist/tui/App.js.map +1 -1
  37. package/dist/tui/LineInput.d.ts +26 -0
  38. package/dist/tui/LineInput.d.ts.map +1 -0
  39. package/dist/tui/LineInput.js +114 -0
  40. package/dist/tui/LineInput.js.map +1 -0
  41. package/dist/tui/SetupModal.d.ts +14 -0
  42. package/dist/tui/SetupModal.d.ts.map +1 -0
  43. package/dist/tui/SetupModal.js +67 -0
  44. package/dist/tui/SetupModal.js.map +1 -0
  45. package/dist/tui/TaskDetail.d.ts.map +1 -1
  46. package/dist/tui/TaskDetail.js +1 -1
  47. package/dist/tui/TaskDetail.js.map +1 -1
  48. package/dist/tui/TaskEditor.d.ts.map +1 -1
  49. package/dist/tui/TaskEditor.js +96 -28
  50. package/dist/tui/TaskEditor.js.map +1 -1
  51. package/dist/tui/TextPrompt.d.ts.map +1 -1
  52. package/dist/tui/TextPrompt.js +2 -2
  53. package/dist/tui/TextPrompt.js.map +1 -1
  54. package/dist/tui/hooks.d.ts +17 -0
  55. package/dist/tui/hooks.d.ts.map +1 -1
  56. package/dist/tui/hooks.js +53 -1
  57. package/dist/tui/hooks.js.map +1 -1
  58. package/dist/tui/index.d.ts.map +1 -1
  59. package/dist/tui/index.js +38 -3
  60. package/dist/tui/index.js.map +1 -1
  61. package/package.json +3 -3
  62. package/templates/AGENTS.md +25 -0
package/dist/cli.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAYpC,wBAAgB,YAAY,IAAI,OAAO,CAkGtC"}
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAYpC,wBAAgB,YAAY,IAAI,OAAO,CAqHtC"}
package/dist/cli.js CHANGED
@@ -17,7 +17,20 @@ export function buildProgram() {
17
17
  program
18
18
  .command("init")
19
19
  .description("Create .ordna/config.yaml and tasks/ if missing")
20
- .action(() => runInit());
20
+ .option("-s, --storage <mode>", "explicit storage mode: file | hybrid | namespace (skips auto-detect)")
21
+ .action(async (opts) => {
22
+ const storage = opts.storage === "file" ||
23
+ opts.storage === "hybrid" ||
24
+ opts.storage === "namespace"
25
+ ? opts.storage
26
+ : undefined;
27
+ if (opts.storage && !storage) {
28
+ console.error(`Invalid --storage value: "${opts.storage}". Use file, hybrid, or namespace.`);
29
+ process.exitCode = 1;
30
+ return;
31
+ }
32
+ await runInit(storage ? { storage } : {});
33
+ });
21
34
  program
22
35
  .command("list")
23
36
  .alias("ls")
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAElD,MAAM,UAAU,YAAY;IAC3B,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;IAE9B,OAAO;SACL,IAAI,CAAC,OAAO,CAAC;SACb,WAAW,CAAC,mDAAmD,CAAC;SAChE,OAAO,CAAC,OAAO,CAAC,CAAC;IAEnB,OAAO;SACL,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,iDAAiD,CAAC;SAC9D,MAAM,CACN,sBAAsB,EACtB,sEAAsE,CACtE;SACA,MAAM,CAAC,KAAK,EAAE,IAA0B,EAAE,EAAE;QAC5C,MAAM,OAAO,GACZ,IAAI,CAAC,OAAO,KAAK,MAAM;YACvB,IAAI,CAAC,OAAO,KAAK,QAAQ;YACzB,IAAI,CAAC,OAAO,KAAK,WAAW;YAC3B,CAAC,CAAC,IAAI,CAAC,OAAO;YACd,CAAC,CAAC,SAAS,CAAC;QACd,IAAI,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC;YAC9B,OAAO,CAAC,KAAK,CACZ,6BAA6B,IAAI,CAAC,OAAO,oCAAoC,CAC7E,CAAC;YACF,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACR,CAAC;QACD,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEJ,OAAO;SACL,OAAO,CAAC,MAAM,CAAC;SACf,KAAK,CAAC,IAAI,CAAC;SACX,WAAW,CAAC,YAAY,CAAC;SACzB,MAAM,CAAC,uBAAuB,EAAE,kBAAkB,CAAC;SACnD,MAAM,CAAC,uBAAuB,EAAE,oBAAoB,CAAC;SACrD,MAAM,CAAC,iBAAiB,EAAE,eAAe,CAAC;SAC1C,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IAElC,OAAO;SACL,OAAO,CAAC,WAAW,CAAC;SACpB,WAAW,CAAC,aAAa,CAAC;SAC1B,MAAM,CAAC,CAAC,EAAU,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;IAEtC,OAAO;SACL,OAAO,CAAC,mBAAmB,CAAC;SAC5B,WAAW,CAAC,mBAAmB,CAAC;SAChC,MAAM,CAAC,uBAAuB,EAAE,UAAU,CAAC;SAC3C,MAAM,CAAC,wBAAwB,EAAE,qBAAqB,CAAC;SACvD,MAAM,CAAC,oBAAoB,EAAE,kBAAkB,CAAC;SAChD,MAAM,CAAC,0BAA0B,EAAE,4BAA4B,CAAC;SAChE,MAAM,CAAC,uBAAuB,EAAE,gBAAgB,CAAC;SACjD,MAAM,CAAC,CAAC,UAAoB,EAAE,IAAI,EAAE,EAAE,CACtC,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;QAC/B,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,QAAQ,EAAE,IAAI,CAAC,QAAgC;QAC/C,IAAI,EAAE,IAAI,CAAC,GAAG;QACd,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,MAAM,EAAE,IAAI,CAAC,MAAM;KACnB,CAAC,CACF,CAAC;IAEH,OAAO;SACL,OAAO,CAAC,oBAAoB,CAAC;SAC7B,WAAW,CAAC,mCAAmC,CAAC;SAChD,MAAM,CAAC,CAAC,EAAU,EAAE,MAAc,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC;IAE9D,OAAO;SACL,OAAO,CAAC,oBAAoB,CAAC;SAC7B,WAAW,CAAC,uCAAuC,CAAC;SACpD,MAAM,CAAC,CAAC,EAAU,EAAE,IAAa,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC;IAE7D,OAAO;SACL,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,6BAA6B,CAAC;SAC1C,MAAM,CAAC,qBAAqB,EAAE,gBAAgB,EAAE,sBAAsB,CAAC;SACvE,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IAE5C,OAAO;SACL,OAAO,CAAC,KAAK,CAAC;SACd,WAAW,CAAC,4CAA4C,CAAC;SACzD,MAAM,CAAC,mBAAmB,EAAE,4BAA4B,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;SACxF,MAAM,CAAC,mBAAmB,EAAE,MAAM,EAAE,WAAW,CAAC;SAChD,MAAM,CAAC,WAAW,EAAE,qBAAqB,CAAC;SAC1C,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC;IAExC,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,WAAW,CAAC,0CAA0C,CAAC,CAAC;IAC/F,KAAK;SACH,OAAO,CAAC,SAAS,CAAC;SAClB,WAAW,CAAC,kEAAkE,CAAC;SAC/E,MAAM,CAAC,kBAAkB,EAAE,yCAAyC,CAAC;SACrE,MAAM,CAAC,cAAc,EAAE,4DAA4D,CAAC;SACpF,MAAM,CAAC,aAAa,EAAE,gDAAgD,CAAC;SACvE,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAChB,eAAe,CAAC;QACf,GAAG,EAAE,IAAI,CAAC,GAAG;QACb,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,KAAK,EAAE,IAAI,CAAC,KAAK;KACjB,CAAC,CACF,CAAC;IAEH,OAAO;SACL,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,+BAA+B,CAAC;SAC5C,MAAM,CAAC,KAAK,IAAI,EAAE;QAClB,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,CAAC;QACpD,MAAM,QAAQ,EAAE,CAAC;IAClB,CAAC,CAAC,CAAC;IAEJ,OAAO,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE;QACzB,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,CAAC;QACpD,MAAM,QAAQ,EAAE,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,OAAO,OAAO,CAAC;AAChB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"assign.d.ts","sourceRoot":"","sources":["../../src/commands/assign.ts"],"names":[],"mappings":"AAGA,wBAAsB,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAWvF"}
1
+ {"version":3,"file":"assign.d.ts","sourceRoot":"","sources":["../../src/commands/assign.ts"],"names":[],"mappings":"AAIA,wBAAsB,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAWvF"}
@@ -1,7 +1,8 @@
1
- import { createContext, updateTask } from "@frehilm/ordna-core";
1
+ import { updateTask } from "@frehilm/ordna-core";
2
+ import { ensureContextOrExit } from "../lib/ensure-context.js";
2
3
  import { c } from "../colors.js";
3
4
  export async function runAssign(id, assignee) {
4
- const ctx = createContext();
5
+ const ctx = await ensureContextOrExit();
5
6
  const value = assignee && assignee.length > 0 ? assignee : null;
6
7
  try {
7
8
  const task = await updateTask(id, { assignee: value }, ctx);
@@ -1 +1 @@
1
- {"version":3,"file":"assign.js","sourceRoot":"","sources":["../../src/commands/assign.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,EAAE,CAAC,EAAE,MAAM,cAAc,CAAC;AAEjC,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,EAAU,EAAE,QAA4B;IACvE,MAAM,GAAG,GAAG,aAAa,EAAE,CAAC;IAC5B,MAAM,KAAK,GAAG,QAAQ,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC;IAChE,IAAI,CAAC;QACJ,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,GAAG,CAAC,CAAC;QAC5D,IAAI,KAAK,KAAK,IAAI;YAAE,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC;;YAC5D,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;IACpE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAE,KAAe,CAAC,OAAO,CAAC,CAAC,CAAC;QAC/C,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACtB,CAAC;AACF,CAAC"}
1
+ {"version":3,"file":"assign.js","sourceRoot":"","sources":["../../src/commands/assign.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,CAAC,EAAE,MAAM,cAAc,CAAC;AAEjC,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,EAAU,EAAE,QAA4B;IACvE,MAAM,GAAG,GAAG,MAAM,mBAAmB,EAAE,CAAC;IACxC,MAAM,KAAK,GAAG,QAAQ,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC;IAChE,IAAI,CAAC;QACJ,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,GAAG,CAAC,CAAC;QAC5D,IAAI,KAAK,KAAK,IAAI;YAAE,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC;;YAC5D,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;IACpE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAE,KAAe,CAAC,OAAO,CAAC,CAAC,CAAC;QAC/C,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACtB,CAAC;AACF,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"commit.d.ts","sourceRoot":"","sources":["../../src/commands/commit.ts"],"names":[],"mappings":"AAGA,wBAAsB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAS1E"}
1
+ {"version":3,"file":"commit.d.ts","sourceRoot":"","sources":["../../src/commands/commit.ts"],"names":[],"mappings":"AAIA,wBAAsB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAS1E"}
@@ -1,7 +1,8 @@
1
- import { commitTasks, createContext } from "@frehilm/ordna-core";
1
+ import { commitTasks } from "@frehilm/ordna-core";
2
+ import { ensureContextOrExit } from "../lib/ensure-context.js";
2
3
  import { c } from "../colors.js";
3
4
  export async function runCommit(message) {
4
- const ctx = createContext();
5
+ const ctx = await ensureContextOrExit();
5
6
  try {
6
7
  await commitTasks(ctx, message);
7
8
  console.log(c.green("Committed."));
@@ -1 +1 @@
1
- {"version":3,"file":"commit.js","sourceRoot":"","sources":["../../src/commands/commit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACjE,OAAO,EAAE,CAAC,EAAE,MAAM,cAAc,CAAC;AAEjC,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,OAA2B;IAC1D,MAAM,GAAG,GAAG,aAAa,EAAE,CAAC;IAC5B,IAAI,CAAC;QACJ,MAAM,WAAW,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAChC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC;IACpC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAE,KAAe,CAAC,OAAO,CAAC,CAAC,CAAC;QAC/C,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACtB,CAAC;AACF,CAAC"}
1
+ {"version":3,"file":"commit.js","sourceRoot":"","sources":["../../src/commands/commit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,CAAC,EAAE,MAAM,cAAc,CAAC;AAEjC,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,OAA2B;IAC1D,MAAM,GAAG,GAAG,MAAM,mBAAmB,EAAE,CAAC;IACxC,IAAI,CAAC;QACJ,MAAM,WAAW,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAChC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC;IACpC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAE,KAAe,CAAC,OAAO,CAAC,CAAC,CAAC;QAC/C,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACtB,CAAC;AACF,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../src/commands/create.ts"],"names":[],"mappings":"AAAA,OAAO,EAA6B,KAAK,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAG/E,MAAM,WAAW,aAAa;IAC7B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAoBzF"}
1
+ {"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../src/commands/create.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,KAAK,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAIhE,MAAM,WAAW,aAAa;IAC7B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAwBzF"}
@@ -1,4 +1,5 @@
1
- import { createContext, createTask } from "@frehilm/ordna-core";
1
+ import { createTask } from "@frehilm/ordna-core";
2
+ import { ensureContextOrExit } from "../lib/ensure-context.js";
2
3
  import { c } from "../colors.js";
3
4
  export async function runCreate(title, options = {}) {
4
5
  if (!title || title.trim().length === 0) {
@@ -6,7 +7,7 @@ export async function runCreate(title, options = {}) {
6
7
  process.exitCode = 1;
7
8
  return;
8
9
  }
9
- const ctx = createContext();
10
+ const ctx = await ensureContextOrExit();
10
11
  const task = await createTask({
11
12
  title,
12
13
  assignee: options.assignee ?? null,
@@ -16,6 +17,10 @@ export async function runCreate(title, options = {}) {
16
17
  status: options.status,
17
18
  }, ctx);
18
19
  console.log(c.green(`Created ${c.bold(task.id)}: ${task.title}`));
19
- console.log(c.dim(` ${task.filePath}`));
20
+ // Namespace-mode tasks have no on-disk path — skip the path line
21
+ // rather than printing `undefined`. The id is the durable handle.
22
+ if (task.filePath) {
23
+ console.log(c.dim(` ${task.filePath}`));
24
+ }
20
25
  }
21
26
  //# sourceMappingURL=create.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"create.js","sourceRoot":"","sources":["../../src/commands/create.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,UAAU,EAAiB,MAAM,qBAAqB,CAAC;AAC/E,OAAO,EAAE,CAAC,EAAE,MAAM,cAAc,CAAC;AAUjC,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,KAAa,EAAE,UAAyB,EAAE;IACzE,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC,CAAC;QAC3C,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACR,CAAC;IACD,MAAM,GAAG,GAAG,aAAa,EAAE,CAAC;IAC5B,MAAM,IAAI,GAAG,MAAM,UAAU,CAC5B;QACC,KAAK;QACL,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,IAAI;QAClC,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,IAAI;QAClC,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,EAAE;QACxB,UAAU,EAAE,OAAO,CAAC,SAAS,IAAI,EAAE;QACnC,MAAM,EAAE,OAAO,CAAC,MAAM;KACtB,EACD,GAAG,CACH,CAAC;IACF,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IAClE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;AAC1C,CAAC"}
1
+ {"version":3,"file":"create.js","sourceRoot":"","sources":["../../src/commands/create.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAiB,MAAM,qBAAqB,CAAC;AAChE,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,CAAC,EAAE,MAAM,cAAc,CAAC;AAUjC,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,KAAa,EAAE,UAAyB,EAAE;IACzE,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC,CAAC;QAC3C,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACR,CAAC;IACD,MAAM,GAAG,GAAG,MAAM,mBAAmB,EAAE,CAAC;IACxC,MAAM,IAAI,GAAG,MAAM,UAAU,CAC5B;QACC,KAAK;QACL,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,IAAI;QAClC,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,IAAI;QAClC,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,EAAE;QACxB,UAAU,EAAE,OAAO,CAAC,SAAS,IAAI,EAAE;QACnC,MAAM,EAAE,OAAO,CAAC,MAAM;KACtB,EACD,GAAG,CACH,CAAC;IACF,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IAClE,iEAAiE;IACjE,kEAAkE;IAClE,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QACnB,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;IAC1C,CAAC;AACF,CAAC"}
@@ -1,2 +1,16 @@
1
- export declare function runInit(cwd?: string): void;
1
+ export interface InitOptions {
2
+ storage?: "file" | "hybrid" | "namespace";
3
+ }
4
+ /**
5
+ * Initialise Ordna in the current directory.
6
+ *
7
+ * - `--storage=file|hybrid|namespace` skips detection entirely and
8
+ * writes the chosen mode (the chosen mode dictates whether
9
+ * `tasks/` is created).
10
+ * - Without `--storage`, runs detection. Confident modes auto-write.
11
+ * On the "ask" branch (git repo, no signals), prompts the user.
12
+ * - If `.ordna/config.yaml` already exists, this is a no-op (preserves
13
+ * existing behaviour).
14
+ */
15
+ export declare function runInit(options?: InitOptions, cwd?: string): Promise<void>;
2
16
  //# sourceMappingURL=init.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAaA,wBAAgB,OAAO,CAAC,GAAG,GAAE,MAAsB,GAAG,IAAI,CA0BzD"}
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,WAAW;IAC3B,OAAO,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,WAAW,CAAC;CAC1C;AAYD;;;;;;;;;;GAUG;AACH,wBAAsB,OAAO,CAC5B,OAAO,GAAE,WAAgB,EACzB,GAAG,GAAE,MAAsB,GACzB,OAAO,CAAC,IAAI,CAAC,CAoEf"}
@@ -1,7 +1,10 @@
1
1
  import { existsSync, mkdirSync, writeFileSync } from "node:fs";
2
2
  import { join } from "node:path";
3
+ import { detectStorageMode, writeStorageConfig, } from "@frehilm/ordna-core";
3
4
  import { c } from "../colors.js";
4
- const TEMPLATE = `# Ordna config — all keys optional.
5
+ import { promptStorageMode } from "../lib/prompt-mode.js";
6
+ const FILE_MODE_TEMPLATE = `# Ordna config — all keys optional.
7
+ storage: file
5
8
  tasksDir: tasks
6
9
  schema: ordna
7
10
  statuses: [todo, doing, done]
@@ -9,29 +12,76 @@ idPrefix: T
9
12
  zeroPaddedIds: 3
10
13
  webPort: 7420
11
14
  `;
12
- export function runInit(cwd = process.cwd()) {
15
+ /**
16
+ * Initialise Ordna in the current directory.
17
+ *
18
+ * - `--storage=file|hybrid|namespace` skips detection entirely and
19
+ * writes the chosen mode (the chosen mode dictates whether
20
+ * `tasks/` is created).
21
+ * - Without `--storage`, runs detection. Confident modes auto-write.
22
+ * On the "ask" branch (git repo, no signals), prompts the user.
23
+ * - If `.ordna/config.yaml` already exists, this is a no-op (preserves
24
+ * existing behaviour).
25
+ */
26
+ export async function runInit(options = {}, cwd = process.cwd()) {
13
27
  const configDir = join(cwd, ".ordna");
14
28
  const configFile = join(configDir, "config.yaml");
15
- const tasksDir = join(cwd, "tasks");
16
- let created = 0;
29
+ if (existsSync(configFile)) {
30
+ console.log(c.dim("Ordna already initialized in this repo."));
31
+ return;
32
+ }
33
+ // Decide storage mode: explicit flag, then detection, then prompt.
34
+ let storage;
35
+ if (options.storage) {
36
+ storage = options.storage;
37
+ }
38
+ else {
39
+ const detected = await detectStorageMode(cwd);
40
+ if (detected.mode === "ask") {
41
+ if (process.stdin.isTTY) {
42
+ storage = await promptStorageMode();
43
+ }
44
+ else {
45
+ console.error(c.red("This directory is a git repo with no storage signals, and this isn't an interactive shell."));
46
+ console.error(c.dim(" Re-run with `ordna init --storage=file|hybrid|namespace`."));
47
+ process.exit(1);
48
+ }
49
+ }
50
+ else if (detected.mode === "default-file") {
51
+ storage = "file";
52
+ }
53
+ else {
54
+ storage = detected.mode;
55
+ }
56
+ }
17
57
  if (!existsSync(configDir)) {
18
58
  mkdirSync(configDir, { recursive: true });
19
- created++;
20
59
  }
21
- if (!existsSync(configFile)) {
22
- writeFileSync(configFile, TEMPLATE, "utf8");
23
- created++;
60
+ // File mode keeps the full default template (visible defaults are
61
+ // good docs for new users). Hybrid + namespace get the minimal
62
+ // config from `writeStorageConfig` (just the storage key).
63
+ if (storage === "file") {
64
+ writeFileSync(configFile, FILE_MODE_TEMPLATE, "utf8");
65
+ const tasksDir = join(cwd, "tasks");
66
+ if (!existsSync(tasksDir)) {
67
+ mkdirSync(tasksDir, { recursive: true });
68
+ }
24
69
  }
25
- if (!existsSync(tasksDir)) {
26
- mkdirSync(tasksDir, { recursive: true });
27
- created++;
70
+ else {
71
+ writeStorageConfig(cwd, storage);
72
+ if (storage === "hybrid") {
73
+ // Hybrid still uses files; create the tasks/ dir so subsequent
74
+ // `ordna create` calls find a writable location.
75
+ const tasksDir = join(cwd, "tasks");
76
+ if (!existsSync(tasksDir)) {
77
+ mkdirSync(tasksDir, { recursive: true });
78
+ }
79
+ }
28
80
  }
29
- if (created === 0) {
30
- console.log(c.dim("Ordna already initialized in this repo."));
31
- return;
32
- }
33
- console.log(c.green("Initialized Ordna."));
81
+ console.log(c.green(`Initialized Ordna (storage: ${c.bold(storage)}).`));
34
82
  console.log(c.dim(` ${configFile}`));
35
- console.log(c.dim(` ${tasksDir}/`));
83
+ if (storage !== "namespace") {
84
+ console.log(c.dim(` ${join(cwd, "tasks")}/`));
85
+ }
36
86
  }
37
87
  //# sourceMappingURL=init.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC/D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,CAAC,EAAE,MAAM,cAAc,CAAC;AAEjC,MAAM,QAAQ,GAAG;;;;;;;CAOhB,CAAC;AAEF,MAAM,UAAU,OAAO,CAAC,MAAc,OAAO,CAAC,GAAG,EAAE;IAClD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IACtC,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;IAClD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IAEpC,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC5B,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1C,OAAO,EAAE,CAAC;IACX,CAAC;IACD,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC7B,aAAa,CAAC,UAAU,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;QAC5C,OAAO,EAAE,CAAC;IACX,CAAC;IACD,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC3B,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACzC,OAAO,EAAE,CAAC;IACX,CAAC;IAED,IAAI,OAAO,KAAK,CAAC,EAAE,CAAC;QACnB,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC,CAAC;QAC9D,OAAO;IACR,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC,CAAC;IAC3C,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,UAAU,EAAE,CAAC,CAAC,CAAC;IACtC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,QAAQ,GAAG,CAAC,CAAC,CAAC;AACtC,CAAC"}
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,WAAW;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;CACb;AAED,wBAAsB,OAAO,CAAC,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAUtE"}
1
+ {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,WAAW;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;CACb;AAED,wBAAsB,OAAO,CAAC,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAUtE"}
@@ -1,8 +1,9 @@
1
- import { createContext, listTasks } from "@frehilm/ordna-core";
1
+ import { listTasks } from "@frehilm/ordna-core";
2
+ import { ensureContextOrExit } from "../lib/ensure-context.js";
2
3
  import { c } from "../colors.js";
3
4
  import { formatListRow, summarizeStatuses } from "../format.js";
4
5
  export async function runList(options = {}) {
5
- const ctx = createContext();
6
+ const ctx = await ensureContextOrExit();
6
7
  const tasks = await listTasks(ctx, options);
7
8
  if (tasks.length === 0) {
8
9
  console.log(c.dim("No tasks. Create one with `ordna create \"title\"`."));
@@ -1 +1 @@
1
- {"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,CAAC,EAAE,MAAM,cAAc,CAAC;AACjC,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAQhE,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,UAAuB,EAAE;IACtD,MAAM,GAAG,GAAG,aAAa,EAAE,CAAC;IAC5B,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IAC5C,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,qDAAqD,CAAC,CAAC,CAAC;QAC1E,OAAO;IACR,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,KAAK;QAAE,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC;IAC3D,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;AACnD,CAAC"}
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,CAAC,EAAE,MAAM,cAAc,CAAC;AACjC,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAQhE,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,UAAuB,EAAE;IACtD,MAAM,GAAG,GAAG,MAAM,mBAAmB,EAAE,CAAC;IACxC,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IAC5C,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,qDAAqD,CAAC,CAAC,CAAC;QAC1E,OAAO;IACR,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,KAAK;QAAE,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC;IAC3D,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;AACnD,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"move.d.ts","sourceRoot":"","sources":["../../src/commands/move.ts"],"names":[],"mappings":"AAIA,wBAAsB,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CASvE"}
1
+ {"version":3,"file":"move.d.ts","sourceRoot":"","sources":["../../src/commands/move.ts"],"names":[],"mappings":"AAKA,wBAAsB,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CASvE"}
@@ -1,8 +1,9 @@
1
- import { createContext, moveTask } from "@frehilm/ordna-core";
1
+ import { moveTask } from "@frehilm/ordna-core";
2
+ import { ensureContextOrExit } from "../lib/ensure-context.js";
2
3
  import { c } from "../colors.js";
3
4
  import { colorStatus } from "../format.js";
4
5
  export async function runMove(id, status) {
5
- const ctx = createContext();
6
+ const ctx = await ensureContextOrExit();
6
7
  try {
7
8
  const task = await moveTask(id, status, ctx);
8
9
  console.log(`${c.bold(task.id)} → ${colorStatus(task.status)}`);
@@ -1 +1 @@
1
- {"version":3,"file":"move.js","sourceRoot":"","sources":["../../src/commands/move.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,EAAE,CAAC,EAAE,MAAM,cAAc,CAAC;AACjC,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,EAAU,EAAE,MAAc;IACvD,MAAM,GAAG,GAAG,aAAa,EAAE,CAAC;IAC5B,IAAI,CAAC;QACJ,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;QAC7C,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACjE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAE,KAAe,CAAC,OAAO,CAAC,CAAC,CAAC;QAC/C,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACtB,CAAC;AACF,CAAC"}
1
+ {"version":3,"file":"move.js","sourceRoot":"","sources":["../../src/commands/move.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,CAAC,EAAE,MAAM,cAAc,CAAC;AACjC,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,EAAU,EAAE,MAAc;IACvD,MAAM,GAAG,GAAG,MAAM,mBAAmB,EAAE,CAAC;IACxC,IAAI,CAAC;QACJ,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;QAC7C,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACjE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAE,KAAe,CAAC,OAAO,CAAC,CAAC,CAAC;QAC/C,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACtB,CAAC;AACF,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"show.d.ts","sourceRoot":"","sources":["../../src/commands/show.ts"],"names":[],"mappings":"AAIA,wBAAsB,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAQvD"}
1
+ {"version":3,"file":"show.d.ts","sourceRoot":"","sources":["../../src/commands/show.ts"],"names":[],"mappings":"AAKA,wBAAsB,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAQvD"}
@@ -1,8 +1,9 @@
1
- import { createContext, getTask } from "@frehilm/ordna-core";
1
+ import { getTask } from "@frehilm/ordna-core";
2
+ import { ensureContextOrExit } from "../lib/ensure-context.js";
2
3
  import { c } from "../colors.js";
3
4
  import { formatTask } from "../format.js";
4
5
  export async function runShow(id) {
5
- const task = await getTask(id, createContext());
6
+ const task = await getTask(id, await ensureContextOrExit());
6
7
  if (!task) {
7
8
  console.error(c.red(`Task ${id} not found.`));
8
9
  process.exitCode = 1;
@@ -1 +1 @@
1
- {"version":3,"file":"show.js","sourceRoot":"","sources":["../../src/commands/show.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,CAAC,EAAE,MAAM,cAAc,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,EAAU;IACvC,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,EAAE,EAAE,aAAa,EAAE,CAAC,CAAC;IAChD,IAAI,CAAC,IAAI,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC;QAC9C,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACR,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;AAC/B,CAAC"}
1
+ {"version":3,"file":"show.js","sourceRoot":"","sources":["../../src/commands/show.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,CAAC,EAAE,MAAM,cAAc,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,EAAU;IACvC,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,EAAE,EAAE,MAAM,mBAAmB,EAAE,CAAC,CAAC;IAC5D,IAAI,CAAC,IAAI,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC;QAC9C,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACR,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;AAC/B,CAAC"}
@@ -0,0 +1,19 @@
1
+ import { type StoreContext } from "@frehilm/ordna-core";
2
+ /**
3
+ * Wrap `createContext` with the auto-detect + prompt flow used by
4
+ * every one-shot CLI command. Handles three cases:
5
+ *
6
+ * 1. **Storage already known** (config file present OR `ORDNA_STORAGE`
7
+ * env var set OR detection lands on a confident mode) — runs as
8
+ * today, no interaction.
9
+ * 2. **`NeedsModeSelection` + TTY** — prompt the user 1/2/3, write
10
+ * the chosen config, retry.
11
+ * 3. **`NeedsModeSelection` + non-TTY** — print a clear error pointing
12
+ * at `ordna init` and the `ORDNA_STORAGE` env var, then exit with
13
+ * code 1.
14
+ *
15
+ * Returns the constructed `StoreContext` on success, or never returns
16
+ * when it exits the process on the non-TTY path.
17
+ */
18
+ export declare function ensureContextOrExit(): Promise<StoreContext>;
19
+ //# sourceMappingURL=ensure-context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ensure-context.d.ts","sourceRoot":"","sources":["../../src/lib/ensure-context.ts"],"names":[],"mappings":"AAAA,OAAO,EAIN,KAAK,YAAY,EAEjB,MAAM,qBAAqB,CAAC;AAI7B;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,YAAY,CAAC,CAwBjE"}
@@ -0,0 +1,39 @@
1
+ import { createContext, ensureStorageConfig, NeedsModeSelection, writeStorageConfig, } from "@frehilm/ordna-core";
2
+ import { c } from "../colors.js";
3
+ import { promptStorageMode } from "./prompt-mode.js";
4
+ /**
5
+ * Wrap `createContext` with the auto-detect + prompt flow used by
6
+ * every one-shot CLI command. Handles three cases:
7
+ *
8
+ * 1. **Storage already known** (config file present OR `ORDNA_STORAGE`
9
+ * env var set OR detection lands on a confident mode) — runs as
10
+ * today, no interaction.
11
+ * 2. **`NeedsModeSelection` + TTY** — prompt the user 1/2/3, write
12
+ * the chosen config, retry.
13
+ * 3. **`NeedsModeSelection` + non-TTY** — print a clear error pointing
14
+ * at `ordna init` and the `ORDNA_STORAGE` env var, then exit with
15
+ * code 1.
16
+ *
17
+ * Returns the constructed `StoreContext` on success, or never returns
18
+ * when it exits the process on the non-TTY path.
19
+ */
20
+ export async function ensureContextOrExit() {
21
+ try {
22
+ await ensureStorageConfig(process.cwd());
23
+ return createContext();
24
+ }
25
+ catch (err) {
26
+ if (!(err instanceof NeedsModeSelection))
27
+ throw err;
28
+ if (process.stdin.isTTY) {
29
+ const mode = await promptStorageMode();
30
+ writeStorageConfig(process.cwd(), mode);
31
+ return createContext();
32
+ }
33
+ // Non-TTY: be explicit about how to recover.
34
+ console.error(c.red("No .ordna/config.yaml found and this isn't an interactive shell."));
35
+ console.error(c.dim(" Run `ordna init` from a terminal, or set ORDNA_STORAGE=file|hybrid|namespace to skip the prompt."));
36
+ process.exit(1);
37
+ }
38
+ }
39
+ //# sourceMappingURL=ensure-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ensure-context.js","sourceRoot":"","sources":["../../src/lib/ensure-context.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,aAAa,EACb,mBAAmB,EACnB,kBAAkB,EAElB,kBAAkB,GAClB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,CAAC,EAAE,MAAM,cAAc,CAAC;AACjC,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAErD;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB;IACxC,IAAI,CAAC;QACJ,MAAM,mBAAmB,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QACzC,OAAO,aAAa,EAAE,CAAC;IACxB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACd,IAAI,CAAC,CAAC,GAAG,YAAY,kBAAkB,CAAC;YAAE,MAAM,GAAG,CAAC;QACpD,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YACzB,MAAM,IAAI,GAAG,MAAM,iBAAiB,EAAE,CAAC;YACvC,kBAAkB,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC;YACxC,OAAO,aAAa,EAAE,CAAC;QACxB,CAAC;QACD,6CAA6C;QAC7C,OAAO,CAAC,KAAK,CACZ,CAAC,CAAC,GAAG,CACJ,kEAAkE,CAClE,CACD,CAAC;QACF,OAAO,CAAC,KAAK,CACZ,CAAC,CAAC,GAAG,CACJ,oGAAoG,CACpG,CACD,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjB,CAAC;AACF,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Interactive prompt asking the user to pick one of the three storage
3
+ * modes. Used by `ordna init` (no `--storage` flag) and by every
4
+ * one-shot CLI command via `ensureContextOrExit` when detection
5
+ * lands on `ask`.
6
+ *
7
+ * Terse by design: three numbered options, two-line description, an
8
+ * inline 1/2/3 prompt. Trade-off discussion belongs in the README,
9
+ * not the prompt.
10
+ */
11
+ export declare function promptStorageMode(): Promise<"file" | "hybrid" | "namespace">;
12
+ //# sourceMappingURL=prompt-mode.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt-mode.d.ts","sourceRoot":"","sources":["../../src/lib/prompt-mode.ts"],"names":[],"mappings":"AAGA;;;;;;;;;GASG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CACjD,MAAM,GAAG,QAAQ,GAAG,WAAW,CAC/B,CAkCA"}
@@ -0,0 +1,43 @@
1
+ import { createInterface } from "node:readline/promises";
2
+ import { c } from "../colors.js";
3
+ /**
4
+ * Interactive prompt asking the user to pick one of the three storage
5
+ * modes. Used by `ordna init` (no `--storage` flag) and by every
6
+ * one-shot CLI command via `ensureContextOrExit` when detection
7
+ * lands on `ask`.
8
+ *
9
+ * Terse by design: three numbered options, two-line description, an
10
+ * inline 1/2/3 prompt. Trade-off discussion belongs in the README,
11
+ * not the prompt.
12
+ */
13
+ export async function promptStorageMode() {
14
+ console.log("");
15
+ console.log(c.bold("Pick a storage mode for this project."));
16
+ console.log("");
17
+ console.log(` 1) ${c.bold("file")} Tasks as markdown in tasks/ ${c.dim("(default, recommended)")}`);
18
+ console.log(` 2) ${c.bold("hybrid")} Tasks as files + synced ID allocator + audit log in git`);
19
+ console.log(` 3) ${c.bold("namespace")} Tasks as git refs; working tree stays clean`);
20
+ console.log("");
21
+ const rl = createInterface({
22
+ input: process.stdin,
23
+ output: process.stdout,
24
+ });
25
+ try {
26
+ while (true) {
27
+ const answer = (await rl.question(c.dim("Pick a storage mode [1/2/3, default 1]: ")))
28
+ .trim()
29
+ .toLowerCase();
30
+ if (answer === "" || answer === "1" || answer === "file")
31
+ return "file";
32
+ if (answer === "2" || answer === "hybrid")
33
+ return "hybrid";
34
+ if (answer === "3" || answer === "namespace")
35
+ return "namespace";
36
+ console.log(c.dim(" Please enter 1, 2, or 3."));
37
+ }
38
+ }
39
+ finally {
40
+ rl.close();
41
+ }
42
+ }
43
+ //# sourceMappingURL=prompt-mode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt-mode.js","sourceRoot":"","sources":["../../src/lib/prompt-mode.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,CAAC,EAAE,MAAM,cAAc,CAAC;AAEjC;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB;IAGtC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAC,CAAC;IAC7D,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CACV,QAAQ,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,sCAAsC,CAAC,CAAC,GAAG,CAAC,wBAAwB,CAAC,EAAE,CAC7F,CAAC;IACF,OAAO,CAAC,GAAG,CACV,QAAQ,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,6DAA6D,CACrF,CAAC;IACF,OAAO,CAAC,GAAG,CACV,QAAQ,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,8CAA8C,CACzE,CAAC;IACF,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,MAAM,EAAE,GAAG,eAAe,CAAC;QAC1B,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,MAAM,EAAE,OAAO,CAAC,MAAM;KACtB,CAAC,CAAC;IACH,IAAI,CAAC;QACJ,OAAO,IAAI,EAAE,CAAC;YACb,MAAM,MAAM,GAAG,CACd,MAAM,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC,CACpE;iBACC,IAAI,EAAE;iBACN,WAAW,EAAE,CAAC;YAChB,IAAI,MAAM,KAAK,EAAE,IAAI,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,MAAM;gBAAE,OAAO,MAAM,CAAC;YACxE,IAAI,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,QAAQ;gBAAE,OAAO,QAAQ,CAAC;YAC3D,IAAI,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,WAAW;gBAAE,OAAO,WAAW,CAAC;YACjE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC,CAAC;QAClD,CAAC;IACF,CAAC;YAAS,CAAC;QACV,EAAE,CAAC,KAAK,EAAE,CAAC;IACZ,CAAC;AACF,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"App.d.ts","sourceRoot":"","sources":["../../src/tui/App.tsx"],"names":[],"mappings":"AAcA,OAAO,KAMN,MAAM,OAAO,CAAC;AACf,OAAO,EAAE,KAAK,eAAe,EAA4B,MAAM,aAAa,CAAC;AAoE7E,MAAM,WAAW,QAAQ;IACxB,SAAS,CAAC,EAAE,eAAe,GAAG,IAAI,CAAC;CACnC;AAED,wBAAgB,GAAG,CAAC,EAAE,SAAS,EAAE,aAAa,EAAE,GAAE,QAAa,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAkrBlF"}
1
+ {"version":3,"file":"App.d.ts","sourceRoot":"","sources":["../../src/tui/App.tsx"],"names":[],"mappings":"AAgBA,OAAO,KAMN,MAAM,OAAO,CAAC;AACf,OAAO,EAAE,KAAK,eAAe,EAA4B,MAAM,aAAa,CAAC;AAoE7E,MAAM,WAAW,QAAQ;IACxB,SAAS,CAAC,EAAE,eAAe,GAAG,IAAI,CAAC;CACnC;AAED,wBAAgB,GAAG,CAAC,EAAE,SAAS,EAAE,aAAa,EAAE,GAAE,QAAa,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAutBlF"}
package/dist/tui/App.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { spawn } from "node:child_process";
3
- import { ARCHIVED_STATUS, createContext as createStoreContext, createTask, listTasks, moveTask, updateTask, watchTasks, } from "@frehilm/ordna-core";
3
+ import { ARCHIVED_STATUS, canFetch, createContext as createStoreContext, createTask, fetchTasks, listTasks, moveTask, updateTask, watchTasks, } from "@frehilm/ordna-core";
4
4
  import { Box, Text, useApp, useInput, useStdin } from "ink";
5
5
  import React, { startTransition, useCallback, useEffect, useMemo, useState, } from "react";
6
6
  import { loadAgentHook, sendAgent } from "../agent.js";
@@ -97,6 +97,18 @@ export function App({ agentHook: agentHookProp } = {}) {
97
97
  if (event.type === "removed") {
98
98
  setTasks((prev) => removeTaskByPath(prev, event.filePath));
99
99
  }
100
+ else if (event.type === "renamed") {
101
+ // Drop the entry under the old id (if it's still there)
102
+ // and re-insert the renamed task under its new id. A toast
103
+ // nudges the user about the auto-renumber.
104
+ setTasks((prev) => {
105
+ const withoutOld = prev.filter((t) => t.id !== event.oldId);
106
+ return mergeTask(withoutOld, event.task);
107
+ });
108
+ const msg = `Renamed ${event.oldId} → ${event.newId}`;
109
+ setToast(msg);
110
+ setTimeout(() => setToast((t) => (t === msg ? null : t)), 2500);
111
+ }
100
112
  else {
101
113
  setTasks((prev) => mergeTask(prev, event.task));
102
114
  }
@@ -155,6 +167,13 @@ export function App({ agentHook: agentHookProp } = {}) {
155
167
  const visibleCount = filteredTasks.length;
156
168
  const totalCount = useMemo(() => tasks.filter((t) => t.status !== ARCHIVED_STATUS).length, [tasks]);
157
169
  const launchEditor = useCallback((task) => {
170
+ // Namespace-mode tasks live as git blobs and have no on-disk
171
+ // path — there's nothing to open in `$EDITOR`. Show a toast
172
+ // rather than spawning the editor with `undefined`.
173
+ if (!task.filePath) {
174
+ flashToast(`${task.id} has no on-disk file (namespace mode).`);
175
+ return;
176
+ }
158
177
  const editor = process.env.EDITOR || process.env.VISUAL || "vi";
159
178
  setRawMode?.(false);
160
179
  const proc = spawn(editor, [task.filePath], { stdio: "inherit" });
@@ -225,6 +244,21 @@ export function App({ agentHook: agentHookProp } = {}) {
225
244
  flashToast(error.message);
226
245
  }
227
246
  };
247
+ const fetchSupported = canFetch(ctx);
248
+ const runFetch = async () => {
249
+ if (!fetchSupported)
250
+ return;
251
+ flashToast("Fetching…");
252
+ try {
253
+ const result = await fetchTasks(ctx);
254
+ flashToast(result.refsUpdated === 0
255
+ ? `Up to date · ${result.durationMs}ms`
256
+ : `Fetched ${result.refsUpdated} ref${result.refsUpdated === 1 ? "" : "s"} · ${result.durationMs}ms`);
257
+ }
258
+ catch (error) {
259
+ flashToast(error.message);
260
+ }
261
+ };
228
262
  const applySidebarFocused = () => {
229
263
  if (sidebarFocusedKey === null)
230
264
  return;
@@ -358,6 +392,9 @@ export function App({ agentHook: agentHookProp } = {}) {
358
392
  setSidebarPinned((p) => !p);
359
393
  setSidebarPeek(false);
360
394
  }
395
+ else if (input === "r" && canFetch(ctx)) {
396
+ void runFetch();
397
+ }
361
398
  else if (input === "/") {
362
399
  setMode({ kind: "search" });
363
400
  }
@@ -541,6 +578,7 @@ export function App({ agentHook: agentHookProp } = {}) {
541
578
  { keys: "E", label: "$EDITOR" },
542
579
  { keys: "x", label: "archive" },
543
580
  ...(agentHook ? [{ keys: "g", label: agentHook.label.toLowerCase() }] : []),
581
+ ...(fetchSupported ? [{ keys: "r", label: "fetch" }] : []),
544
582
  { keys: "/", label: "find" },
545
583
  { keys: "q", label: "quit" },
546
584
  ];