prjct-cli 1.6.3 → 1.6.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.
Files changed (66) hide show
  1. package/CHANGELOG.md +8 -2
  2. package/core/agentic/agent-router.ts +4 -4
  3. package/core/agentic/command-executor.ts +5 -4
  4. package/core/agentic/ground-truth.ts +2 -2
  5. package/core/agentic/orchestrator-executor.ts +2 -2
  6. package/core/agentic/prompt-builder.ts +4 -4
  7. package/core/ai-tools/generator.ts +2 -1
  8. package/core/cli/linear.ts +5 -3
  9. package/core/cli/start.ts +3 -2
  10. package/core/commands/analysis.ts +8 -7
  11. package/core/commands/analytics.ts +5 -4
  12. package/core/commands/cleanup.ts +7 -7
  13. package/core/commands/context.ts +3 -3
  14. package/core/commands/design.ts +3 -2
  15. package/core/commands/planning.ts +13 -12
  16. package/core/commands/registry.ts +2 -1
  17. package/core/commands/setup.ts +2 -1
  18. package/core/commands/shipping.ts +3 -3
  19. package/core/commands/snapshots.ts +11 -11
  20. package/core/commands/uninstall.ts +4 -3
  21. package/core/commands/workflow.ts +13 -12
  22. package/core/context-tools/index.ts +2 -1
  23. package/core/domain/agent-generator.ts +2 -1
  24. package/core/domain/context-estimator.ts +2 -1
  25. package/core/domain/task-stack.ts +3 -3
  26. package/core/index.ts +5 -4
  27. package/core/infrastructure/capability-installer.ts +2 -1
  28. package/core/infrastructure/command-installer.ts +9 -9
  29. package/core/infrastructure/editors-config.ts +6 -5
  30. package/core/infrastructure/setup.ts +11 -11
  31. package/core/infrastructure/update-checker.ts +2 -1
  32. package/core/integrations/issue-tracker/enricher.ts +2 -1
  33. package/core/integrations/issue-tracker/manager.ts +3 -2
  34. package/core/integrations/jira/client.ts +3 -2
  35. package/core/integrations/linear/client.ts +2 -1
  36. package/core/integrations/linear/sync.ts +3 -2
  37. package/core/plugin/builtin/webhook.ts +2 -1
  38. package/core/plugin/hooks.ts +4 -6
  39. package/core/plugin/loader.ts +2 -2
  40. package/core/plugin/registry.ts +3 -3
  41. package/core/server/routes.ts +4 -4
  42. package/core/services/hooks-service.ts +3 -2
  43. package/core/services/memory-service.ts +5 -5
  44. package/core/services/project-service.ts +3 -3
  45. package/core/services/skill-installer.ts +4 -3
  46. package/core/services/staleness-checker.ts +2 -1
  47. package/core/services/sync-service.ts +2 -2
  48. package/core/services/sync-verifier.ts +2 -2
  49. package/core/services/watch-service.ts +2 -1
  50. package/core/session/metrics.ts +3 -3
  51. package/core/session/session-log-manager.ts +2 -1
  52. package/core/session/task-session-manager.ts +2 -2
  53. package/core/types/fs.ts +25 -9
  54. package/core/types/index.ts +2 -0
  55. package/core/types/utils.ts +2 -0
  56. package/core/utils/keychain.ts +2 -1
  57. package/core/utils/project-credentials.ts +2 -1
  58. package/core/utils/session-helper.ts +2 -1
  59. package/core/utils/version.ts +2 -1
  60. package/core/workflow/workflow-preferences.ts +2 -1
  61. package/dist/bin/prjct.mjs +173 -133
  62. package/dist/core/infrastructure/command-installer.js +20 -10
  63. package/dist/core/infrastructure/editors-config.js +15 -5
  64. package/dist/core/infrastructure/setup.js +35 -25
  65. package/dist/core/utils/version.js +11 -1
  66. package/package.json +1 -1
@@ -431,10 +431,20 @@ var import_node_os2 = __toESM(require("node:os"));
431
431
  var import_node_path3 = __toESM(require("node:path"));
432
432
 
433
433
  // core/types/fs.ts
434
+ function isNodeError(error) {
435
+ return error instanceof Error && "code" in error;
436
+ }
437
+ __name(isNodeError, "isNodeError");
434
438
  function isNotFoundError(error) {
435
- return error?.code === "ENOENT";
439
+ return isNodeError(error) && error.code === "ENOENT";
436
440
  }
437
441
  __name(isNotFoundError, "isNotFoundError");
442
+ function getErrorMessage(error) {
443
+ if (error instanceof Error) return error.message;
444
+ if (typeof error === "string") return error;
445
+ return "Unknown error";
446
+ }
447
+ __name(getErrorMessage, "getErrorMessage");
438
448
 
439
449
  // core/utils/version.ts
440
450
  var import_node_fs = __toESM(require("node:fs"));
@@ -476,7 +486,7 @@ function getVersion() {
476
486
  cachedPackageJson = packageJson;
477
487
  return cachedVersion;
478
488
  } catch (error) {
479
- console.error("Failed to read version from package.json:", error.message);
489
+ console.error("Failed to read version from package.json:", getErrorMessage(error));
480
490
  return "0.0.0";
481
491
  }
482
492
  }
@@ -552,7 +562,7 @@ async function installDocs() {
552
562
  }
553
563
  return { success: true };
554
564
  } catch (error) {
555
- return { success: false, error: error.message };
565
+ return { success: false, error: getErrorMessage(error) };
556
566
  }
557
567
  }
558
568
  __name(installDocs, "installDocs");
@@ -650,7 +660,7 @@ ${templateContent}`;
650
660
  } catch (error) {
651
661
  return {
652
662
  success: false,
653
- error: error.message,
663
+ error: getErrorMessage(error),
654
664
  action: "failed"
655
665
  };
656
666
  }
@@ -760,7 +770,7 @@ var CommandInstaller = class {
760
770
  await import_promises2.default.writeFile(destPath, content, "utf-8");
761
771
  installed.push(file.replace(".md", ""));
762
772
  } catch (error) {
763
- errors.push({ file, error: error.message });
773
+ errors.push({ file, error: getErrorMessage(error) });
764
774
  }
765
775
  }
766
776
  return {
@@ -772,7 +782,7 @@ var CommandInstaller = class {
772
782
  } catch (error) {
773
783
  return {
774
784
  success: false,
775
- error: error.message
785
+ error: getErrorMessage(error)
776
786
  };
777
787
  }
778
788
  }
@@ -791,7 +801,7 @@ var CommandInstaller = class {
791
801
  uninstalled.push(file.replace(".md", ""));
792
802
  } catch (error) {
793
803
  if (error.code !== "ENOENT") {
794
- errors.push({ file, error: error.message });
804
+ errors.push({ file, error: getErrorMessage(error) });
795
805
  }
796
806
  }
797
807
  }
@@ -807,7 +817,7 @@ var CommandInstaller = class {
807
817
  } catch (error) {
808
818
  return {
809
819
  success: false,
810
- error: error.message
820
+ error: getErrorMessage(error)
811
821
  };
812
822
  }
813
823
  }
@@ -976,7 +986,7 @@ var CommandInstaller = class {
976
986
  results.updated++;
977
987
  }
978
988
  } catch (error) {
979
- results.errors.push({ file, error: error.message });
989
+ results.errors.push({ file, error: getErrorMessage(error) });
980
990
  }
981
991
  }
982
992
  await this.removeLegacyCommands();
@@ -984,7 +994,7 @@ var CommandInstaller = class {
984
994
  } catch (error) {
985
995
  return {
986
996
  success: false,
987
- error: error.message,
997
+ error: getErrorMessage(error),
988
998
  added: 0,
989
999
  updated: 0,
990
1000
  removed: 0
@@ -37,6 +37,16 @@ module.exports = __toCommonJS(editors_config_exports);
37
37
  var import_promises = __toESM(require("node:fs/promises"));
38
38
  var import_node_os = __toESM(require("node:os"));
39
39
  var import_node_path = __toESM(require("node:path"));
40
+
41
+ // core/types/fs.ts
42
+ function getErrorMessage(error) {
43
+ if (error instanceof Error) return error.message;
44
+ if (typeof error === "string") return error;
45
+ return "Unknown error";
46
+ }
47
+ __name(getErrorMessage, "getErrorMessage");
48
+
49
+ // core/infrastructure/editors-config.ts
40
50
  var EditorsConfig = class {
41
51
  static {
42
52
  __name(this, "EditorsConfig");
@@ -56,7 +66,7 @@ var EditorsConfig = class {
56
66
  try {
57
67
  await import_promises.default.mkdir(this.configDir, { recursive: true });
58
68
  } catch (error) {
59
- console.error("[editors-config] Error creating config directory:", error.message);
69
+ console.error("[editors-config] Error creating config directory:", getErrorMessage(error));
60
70
  }
61
71
  }
62
72
  /**
@@ -70,7 +80,7 @@ var EditorsConfig = class {
70
80
  if (error.code === "ENOENT") {
71
81
  return null;
72
82
  }
73
- console.error("[editors-config] Error loading config:", error.message);
83
+ console.error("[editors-config] Error loading config:", getErrorMessage(error));
74
84
  return null;
75
85
  }
76
86
  }
@@ -91,7 +101,7 @@ var EditorsConfig = class {
91
101
  await import_promises.default.writeFile(this.configFile, JSON.stringify(config, null, 2), "utf-8");
92
102
  return true;
93
103
  } catch (error) {
94
- console.error("[editors-config] Error saving config:", error.message);
104
+ console.error("[editors-config] Error saving config:", getErrorMessage(error));
95
105
  return false;
96
106
  }
97
107
  }
@@ -131,7 +141,7 @@ var EditorsConfig = class {
131
141
  await import_promises.default.writeFile(this.configFile, JSON.stringify(config, null, 2), "utf-8");
132
142
  return true;
133
143
  } catch (error) {
134
- console.error("[editors-config] Error updating version:", error.message);
144
+ console.error("[editors-config] Error updating version:", getErrorMessage(error));
135
145
  return false;
136
146
  }
137
147
  }
@@ -158,7 +168,7 @@ var EditorsConfig = class {
158
168
  }
159
169
  return true;
160
170
  } catch (error) {
161
- console.error("[editors-config] Error deleting config:", error.message);
171
+ console.error("[editors-config] Error deleting config:", getErrorMessage(error));
162
172
  return false;
163
173
  }
164
174
  }
@@ -711,10 +711,20 @@ var DependencyError = class extends Error {
711
711
  var dependencyValidator = new DependencyValidator();
712
712
 
713
713
  // core/types/fs.ts
714
+ function isNodeError(error) {
715
+ return error instanceof Error && "code" in error;
716
+ }
717
+ __name(isNodeError, "isNodeError");
714
718
  function isNotFoundError(error) {
715
- return error?.code === "ENOENT";
719
+ return isNodeError(error) && error.code === "ENOENT";
716
720
  }
717
721
  __name(isNotFoundError, "isNotFoundError");
722
+ function getErrorMessage(error) {
723
+ if (error instanceof Error) return error.message;
724
+ if (typeof error === "string") return error;
725
+ return "Unknown error";
726
+ }
727
+ __name(getErrorMessage, "getErrorMessage");
718
728
 
719
729
  // core/infrastructure/setup.ts
720
730
  init_fs_helpers();
@@ -792,7 +802,7 @@ function getVersion() {
792
802
  cachedPackageJson = packageJson;
793
803
  return cachedVersion;
794
804
  } catch (error) {
795
- console.error("Failed to read version from package.json:", error.message);
805
+ console.error("Failed to read version from package.json:", getErrorMessage(error));
796
806
  return "0.0.0";
797
807
  }
798
808
  }
@@ -868,7 +878,7 @@ async function installDocs() {
868
878
  }
869
879
  return { success: true };
870
880
  } catch (error) {
871
- return { success: false, error: error.message };
881
+ return { success: false, error: getErrorMessage(error) };
872
882
  }
873
883
  }
874
884
  __name(installDocs, "installDocs");
@@ -966,7 +976,7 @@ ${templateContent}`;
966
976
  } catch (error) {
967
977
  return {
968
978
  success: false,
969
- error: error.message,
979
+ error: getErrorMessage(error),
970
980
  action: "failed"
971
981
  };
972
982
  }
@@ -1076,7 +1086,7 @@ var CommandInstaller = class {
1076
1086
  await import_promises2.default.writeFile(destPath, content, "utf-8");
1077
1087
  installed.push(file.replace(".md", ""));
1078
1088
  } catch (error) {
1079
- errors.push({ file, error: error.message });
1089
+ errors.push({ file, error: getErrorMessage(error) });
1080
1090
  }
1081
1091
  }
1082
1092
  return {
@@ -1088,7 +1098,7 @@ var CommandInstaller = class {
1088
1098
  } catch (error) {
1089
1099
  return {
1090
1100
  success: false,
1091
- error: error.message
1101
+ error: getErrorMessage(error)
1092
1102
  };
1093
1103
  }
1094
1104
  }
@@ -1107,7 +1117,7 @@ var CommandInstaller = class {
1107
1117
  uninstalled.push(file.replace(".md", ""));
1108
1118
  } catch (error) {
1109
1119
  if (error.code !== "ENOENT") {
1110
- errors.push({ file, error: error.message });
1120
+ errors.push({ file, error: getErrorMessage(error) });
1111
1121
  }
1112
1122
  }
1113
1123
  }
@@ -1123,7 +1133,7 @@ var CommandInstaller = class {
1123
1133
  } catch (error) {
1124
1134
  return {
1125
1135
  success: false,
1126
- error: error.message
1136
+ error: getErrorMessage(error)
1127
1137
  };
1128
1138
  }
1129
1139
  }
@@ -1292,7 +1302,7 @@ var CommandInstaller = class {
1292
1302
  results.updated++;
1293
1303
  }
1294
1304
  } catch (error) {
1295
- results.errors.push({ file, error: error.message });
1305
+ results.errors.push({ file, error: getErrorMessage(error) });
1296
1306
  }
1297
1307
  }
1298
1308
  await this.removeLegacyCommands();
@@ -1300,7 +1310,7 @@ var CommandInstaller = class {
1300
1310
  } catch (error) {
1301
1311
  return {
1302
1312
  success: false,
1303
- error: error.message,
1313
+ error: getErrorMessage(error),
1304
1314
  added: 0,
1305
1315
  updated: 0,
1306
1316
  removed: 0
@@ -1346,7 +1356,7 @@ var EditorsConfig = class {
1346
1356
  try {
1347
1357
  await import_promises3.default.mkdir(this.configDir, { recursive: true });
1348
1358
  } catch (error) {
1349
- console.error("[editors-config] Error creating config directory:", error.message);
1359
+ console.error("[editors-config] Error creating config directory:", getErrorMessage(error));
1350
1360
  }
1351
1361
  }
1352
1362
  /**
@@ -1360,7 +1370,7 @@ var EditorsConfig = class {
1360
1370
  if (error.code === "ENOENT") {
1361
1371
  return null;
1362
1372
  }
1363
- console.error("[editors-config] Error loading config:", error.message);
1373
+ console.error("[editors-config] Error loading config:", getErrorMessage(error));
1364
1374
  return null;
1365
1375
  }
1366
1376
  }
@@ -1381,7 +1391,7 @@ var EditorsConfig = class {
1381
1391
  await import_promises3.default.writeFile(this.configFile, JSON.stringify(config, null, 2), "utf-8");
1382
1392
  return true;
1383
1393
  } catch (error) {
1384
- console.error("[editors-config] Error saving config:", error.message);
1394
+ console.error("[editors-config] Error saving config:", getErrorMessage(error));
1385
1395
  return false;
1386
1396
  }
1387
1397
  }
@@ -1421,7 +1431,7 @@ var EditorsConfig = class {
1421
1431
  await import_promises3.default.writeFile(this.configFile, JSON.stringify(config, null, 2), "utf-8");
1422
1432
  return true;
1423
1433
  } catch (error) {
1424
- console.error("[editors-config] Error updating version:", error.message);
1434
+ console.error("[editors-config] Error updating version:", getErrorMessage(error));
1425
1435
  return false;
1426
1436
  }
1427
1437
  }
@@ -1448,7 +1458,7 @@ var EditorsConfig = class {
1448
1458
  }
1449
1459
  return true;
1450
1460
  } catch (error) {
1451
- console.error("[editors-config] Error deleting config:", error.message);
1461
+ console.error("[editors-config] Error deleting config:", getErrorMessage(error));
1452
1462
  return false;
1453
1463
  }
1454
1464
  }
@@ -1607,7 +1617,7 @@ async function installGeminiRouter() {
1607
1617
  }
1608
1618
  return false;
1609
1619
  } catch (error) {
1610
- logger_default.warn(`Gemini router warning: ${error.message}`);
1620
+ logger_default.warn(`Gemini router warning: ${getErrorMessage(error)}`);
1611
1621
  return false;
1612
1622
  }
1613
1623
  }
@@ -1657,7 +1667,7 @@ ${templateContent}`;
1657
1667
  await import_promises4.default.writeFile(globalConfigPath, updatedContent, "utf-8");
1658
1668
  return { success: true, action: "updated" };
1659
1669
  } catch (error) {
1660
- logger_default.warn(`Gemini config warning: ${error.message}`);
1670
+ logger_default.warn(`Gemini config warning: ${getErrorMessage(error)}`);
1661
1671
  return { success: false, action: null };
1662
1672
  }
1663
1673
  }
@@ -1678,7 +1688,7 @@ async function installAntigravitySkill() {
1678
1688
  await import_promises4.default.writeFile(skillMdPath, templateContent, "utf-8");
1679
1689
  return { success: true, action: skillExists ? "updated" : "created" };
1680
1690
  } catch (error) {
1681
- logger_default.warn(`Antigravity skill warning: ${error.message}`);
1691
+ logger_default.warn(`Antigravity skill warning: ${getErrorMessage(error)}`);
1682
1692
  return { success: false, action: null };
1683
1693
  }
1684
1694
  }
@@ -1721,7 +1731,7 @@ async function installCursorProject(projectRoot) {
1721
1731
  result.success = result.rulesCreated || result.commandsCreated;
1722
1732
  return result;
1723
1733
  } catch (error) {
1724
- logger_default.warn(`Cursor installation warning: ${error.message}`);
1734
+ logger_default.warn(`Cursor installation warning: ${getErrorMessage(error)}`);
1725
1735
  return result;
1726
1736
  }
1727
1737
  }
@@ -1761,7 +1771,7 @@ ${entriesToAdd.join("\n")}
1761
1771
  await import_promises4.default.writeFile(gitignorePath, newContent, "utf-8");
1762
1772
  return true;
1763
1773
  } catch (error) {
1764
- logger_default.warn(`Gitignore update warning: ${error.message}`);
1774
+ logger_default.warn(`Gitignore update warning: ${getErrorMessage(error)}`);
1765
1775
  return false;
1766
1776
  }
1767
1777
  }
@@ -1816,7 +1826,7 @@ async function installWindsurfProject(projectRoot) {
1816
1826
  result.success = result.rulesCreated || result.workflowsCreated;
1817
1827
  return result;
1818
1828
  } catch (error) {
1819
- logger_default.warn(`Windsurf installation warning: ${error.message}`);
1829
+ logger_default.warn(`Windsurf installation warning: ${getErrorMessage(error)}`);
1820
1830
  return result;
1821
1831
  }
1822
1832
  }
@@ -1856,7 +1866,7 @@ ${entriesToAdd.join("\n")}
1856
1866
  await import_promises4.default.writeFile(gitignorePath, newContent, "utf-8");
1857
1867
  return true;
1858
1868
  } catch (error) {
1859
- logger_default.warn(`Gitignore update warning: ${error.message}`);
1869
+ logger_default.warn(`Gitignore update warning: ${getErrorMessage(error)}`);
1860
1870
  return false;
1861
1871
  }
1862
1872
  }
@@ -1903,7 +1913,7 @@ async function migrateProjectsCliVersion() {
1903
1913
  }
1904
1914
  } catch (error) {
1905
1915
  if (!isNotFoundError(error)) {
1906
- logger_default.warn(`Migration warning: ${error.message}`);
1916
+ logger_default.warn(`Migration warning: ${getErrorMessage(error)}`);
1907
1917
  }
1908
1918
  }
1909
1919
  }
@@ -2029,7 +2039,7 @@ echo "prjct"
2029
2039
  await ensureStatusLineSettings(settingsPath, claudeStatusLinePath);
2030
2040
  } catch (error) {
2031
2041
  if (!isNotFoundError(error)) {
2032
- logger_default.warn(`Status line warning: ${error.message}`);
2042
+ logger_default.warn(`Status line warning: ${getErrorMessage(error)}`);
2033
2043
  }
2034
2044
  }
2035
2045
  }
@@ -2062,7 +2072,7 @@ async function installContext7MCP() {
2062
2072
  await import_promises4.default.writeFile(mcpConfigPath, JSON.stringify(context7Config, null, 2), "utf-8");
2063
2073
  }
2064
2074
  } catch (error) {
2065
- logger_default.warn(`Context7 MCP setup warning: ${error.message}`);
2075
+ logger_default.warn(`Context7 MCP setup warning: ${getErrorMessage(error)}`);
2066
2076
  }
2067
2077
  }
2068
2078
  __name(installContext7MCP, "installContext7MCP");
@@ -44,6 +44,16 @@ __export(version_exports, {
44
44
  module.exports = __toCommonJS(version_exports);
45
45
  var import_node_fs = __toESM(require("node:fs"));
46
46
  var import_node_path = __toESM(require("node:path"));
47
+
48
+ // core/types/fs.ts
49
+ function getErrorMessage(error) {
50
+ if (error instanceof Error) return error.message;
51
+ if (typeof error === "string") return error;
52
+ return "Unknown error";
53
+ }
54
+ __name(getErrorMessage, "getErrorMessage");
55
+
56
+ // core/utils/version.ts
47
57
  var cachedVersion = null;
48
58
  var cachedPackageJson = null;
49
59
  var cachedPackageRoot = null;
@@ -81,7 +91,7 @@ function getVersion() {
81
91
  cachedPackageJson = packageJson;
82
92
  return cachedVersion;
83
93
  } catch (error) {
84
- console.error("Failed to read version from package.json:", error.message);
94
+ console.error("Failed to read version from package.json:", getErrorMessage(error));
85
95
  return "0.0.0";
86
96
  }
87
97
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "prjct-cli",
3
- "version": "1.6.3",
3
+ "version": "1.6.4",
4
4
  "description": "Context layer for AI agents. Project context for Claude Code, Gemini CLI, and more.",
5
5
  "main": "core/index.ts",
6
6
  "bin": {