@halyard/cli 0.1.2 → 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 (141) hide show
  1. package/README.md +88 -1
  2. package/dist/cli.js +27 -4
  3. package/dist/cli.js.map +1 -1
  4. package/dist/commands/api-keys.d.ts +3 -0
  5. package/dist/commands/api-keys.d.ts.map +1 -0
  6. package/dist/commands/api-keys.js +90 -0
  7. package/dist/commands/api-keys.js.map +1 -0
  8. package/dist/commands/hook.d.ts +6 -0
  9. package/dist/commands/hook.d.ts.map +1 -0
  10. package/dist/commands/hook.js +106 -0
  11. package/dist/commands/hook.js.map +1 -0
  12. package/dist/commands/login.d.ts +17 -0
  13. package/dist/commands/login.d.ts.map +1 -1
  14. package/dist/commands/login.js +111 -14
  15. package/dist/commands/login.js.map +1 -1
  16. package/dist/commands/orgs.d.ts +3 -0
  17. package/dist/commands/orgs.d.ts.map +1 -0
  18. package/dist/commands/orgs.js +102 -0
  19. package/dist/commands/orgs.js.map +1 -0
  20. package/dist/commands/push.d.ts.map +1 -1
  21. package/dist/commands/push.js +29 -6
  22. package/dist/commands/push.js.map +1 -1
  23. package/dist/commands/sessions.d.ts +3 -0
  24. package/dist/commands/sessions.d.ts.map +1 -0
  25. package/dist/commands/sessions.js +139 -0
  26. package/dist/commands/sessions.js.map +1 -0
  27. package/dist/commands/setup.d.ts.map +1 -1
  28. package/dist/commands/setup.js +28 -3
  29. package/dist/commands/setup.js.map +1 -1
  30. package/dist/commands/skills.d.ts +12 -0
  31. package/dist/commands/skills.d.ts.map +1 -0
  32. package/dist/commands/skills.js +171 -0
  33. package/dist/commands/skills.js.map +1 -0
  34. package/dist/commands/sync.d.ts.map +1 -1
  35. package/dist/commands/sync.js +51 -49
  36. package/dist/commands/sync.js.map +1 -1
  37. package/dist/commands/users.d.ts +13 -0
  38. package/dist/commands/users.d.ts.map +1 -0
  39. package/dist/commands/users.js +205 -0
  40. package/dist/commands/users.js.map +1 -0
  41. package/dist/commands/whoami.d.ts +21 -0
  42. package/dist/commands/whoami.d.ts.map +1 -0
  43. package/dist/commands/whoami.js +77 -0
  44. package/dist/commands/whoami.js.map +1 -0
  45. package/dist/lib/api-client.d.ts +64 -2
  46. package/dist/lib/api-client.d.ts.map +1 -1
  47. package/dist/lib/api-client.js +32 -7
  48. package/dist/lib/api-client.js.map +1 -1
  49. package/dist/lib/auth.d.ts +42 -6
  50. package/dist/lib/auth.d.ts.map +1 -1
  51. package/dist/lib/auth.js +101 -27
  52. package/dist/lib/auth.js.map +1 -1
  53. package/dist/lib/config-files.d.ts +6 -0
  54. package/dist/lib/config-files.d.ts.map +1 -0
  55. package/dist/lib/config-files.js +27 -0
  56. package/dist/lib/config-files.js.map +1 -0
  57. package/dist/lib/config.d.ts +13 -7
  58. package/dist/lib/config.d.ts.map +1 -1
  59. package/dist/lib/config.js +22 -8
  60. package/dist/lib/config.js.map +1 -1
  61. package/dist/lib/copilot-export.d.ts +31 -0
  62. package/dist/lib/copilot-export.d.ts.map +1 -0
  63. package/dist/lib/copilot-export.js +129 -0
  64. package/dist/lib/copilot-export.js.map +1 -0
  65. package/dist/lib/discovery.d.ts +60 -2
  66. package/dist/lib/discovery.d.ts.map +1 -1
  67. package/dist/lib/discovery.js +187 -15
  68. package/dist/lib/discovery.js.map +1 -1
  69. package/dist/lib/hook-discovery.d.ts +43 -0
  70. package/dist/lib/hook-discovery.d.ts.map +1 -0
  71. package/dist/lib/hook-discovery.js +90 -0
  72. package/dist/lib/hook-discovery.js.map +1 -0
  73. package/dist/lib/hook-input.d.ts +36 -0
  74. package/dist/lib/hook-input.d.ts.map +1 -0
  75. package/dist/lib/hook-input.js +161 -0
  76. package/dist/lib/hook-input.js.map +1 -0
  77. package/dist/lib/hook-runner.d.ts +48 -0
  78. package/dist/lib/hook-runner.d.ts.map +1 -0
  79. package/dist/lib/hook-runner.js +306 -0
  80. package/dist/lib/hook-runner.js.map +1 -0
  81. package/dist/lib/http.d.ts +18 -0
  82. package/dist/lib/http.d.ts.map +1 -0
  83. package/dist/lib/http.js +54 -0
  84. package/dist/lib/http.js.map +1 -0
  85. package/dist/lib/opencode-export.d.ts +22 -0
  86. package/dist/lib/opencode-export.d.ts.map +1 -0
  87. package/dist/lib/opencode-export.js +53 -0
  88. package/dist/lib/opencode-export.js.map +1 -0
  89. package/dist/lib/output.d.ts +27 -0
  90. package/dist/lib/output.d.ts.map +1 -0
  91. package/dist/lib/output.js +74 -0
  92. package/dist/lib/output.js.map +1 -0
  93. package/dist/lib/preflight.d.ts +35 -0
  94. package/dist/lib/preflight.d.ts.map +1 -0
  95. package/dist/lib/preflight.js +54 -0
  96. package/dist/lib/preflight.js.map +1 -0
  97. package/dist/lib/repo-binding.d.ts +43 -0
  98. package/dist/lib/repo-binding.d.ts.map +1 -0
  99. package/dist/lib/repo-binding.js +158 -0
  100. package/dist/lib/repo-binding.js.map +1 -0
  101. package/dist/lib/repo-identity.d.ts +29 -0
  102. package/dist/lib/repo-identity.d.ts.map +1 -0
  103. package/dist/lib/repo-identity.js +113 -0
  104. package/dist/lib/repo-identity.js.map +1 -0
  105. package/dist/lib/setup-hooks.d.ts +41 -0
  106. package/dist/lib/setup-hooks.d.ts.map +1 -0
  107. package/dist/lib/setup-hooks.js +276 -0
  108. package/dist/lib/setup-hooks.js.map +1 -0
  109. package/dist/lib/setup.d.ts +4 -1
  110. package/dist/lib/setup.d.ts.map +1 -1
  111. package/dist/lib/setup.js +20 -31
  112. package/dist/lib/setup.js.map +1 -1
  113. package/dist/lib/skill-batches.d.ts +16 -0
  114. package/dist/lib/skill-batches.d.ts.map +1 -0
  115. package/dist/lib/skill-batches.js +35 -0
  116. package/dist/lib/skill-batches.js.map +1 -0
  117. package/dist/lib/skill-files.d.ts +4 -0
  118. package/dist/lib/skill-files.d.ts.map +1 -0
  119. package/dist/lib/skill-files.js +36 -0
  120. package/dist/lib/skill-files.js.map +1 -0
  121. package/dist/lib/skill-fingerprint.d.ts +55 -0
  122. package/dist/lib/skill-fingerprint.d.ts.map +1 -0
  123. package/dist/lib/skill-fingerprint.js +204 -0
  124. package/dist/lib/skill-fingerprint.js.map +1 -0
  125. package/dist/lib/skills-discovery.d.ts +57 -0
  126. package/dist/lib/skills-discovery.d.ts.map +1 -0
  127. package/dist/lib/skills-discovery.js +157 -0
  128. package/dist/lib/skills-discovery.js.map +1 -0
  129. package/dist/lib/skills-sync.d.ts +66 -0
  130. package/dist/lib/skills-sync.d.ts.map +1 -0
  131. package/dist/lib/skills-sync.js +251 -0
  132. package/dist/lib/skills-sync.js.map +1 -0
  133. package/dist/lib/sync-runner.d.ts +56 -0
  134. package/dist/lib/sync-runner.d.ts.map +1 -0
  135. package/dist/lib/sync-runner.js +106 -0
  136. package/dist/lib/sync-runner.js.map +1 -0
  137. package/dist/lib/sync-state.d.ts +36 -6
  138. package/dist/lib/sync-state.d.ts.map +1 -1
  139. package/dist/lib/sync-state.js +41 -11
  140. package/dist/lib/sync-state.js.map +1 -1
  141. package/package.json +10 -5
@@ -1,37 +1,67 @@
1
1
  import { readFileSync, writeFileSync } from 'node:fs';
2
2
  import { createHash } from 'node:crypto';
3
- import { SYNC_STATE_PATH, ensureHalyardDir } from './config.js';
3
+ import { syncStatePath, ensureHalyardDir } from './config.js';
4
+ /**
5
+ * What a skill upload carries. Bumped when the payload gains something the
6
+ * server cannot recover from an older upload (v2: file contents + raw
7
+ * front-matter), so every machine re-sends each skill exactly once after
8
+ * upgrading — the server still answers `unchanged` when nothing moved.
9
+ */
10
+ export const SKILL_PAYLOAD_VERSION = 2;
4
11
  /**
5
12
  * Read the current sync state from disk.
13
+ *
14
+ * A legacy v1 file (top-level `files`, no org keying) is discarded and
15
+ * replaced with an empty v2 state. This is safe because server ingest
16
+ * dedupes on the unique (orgId, source, localSessionId) tuple - re-uploading
17
+ * a previously synced file just returns 'duplicate' and re-marks it here.
6
18
  */
7
19
  export function readSyncState() {
8
20
  try {
9
- const raw = readFileSync(SYNC_STATE_PATH, 'utf-8');
10
- return JSON.parse(raw);
21
+ const raw = readFileSync(syncStatePath(), 'utf-8');
22
+ const parsed = JSON.parse(raw);
23
+ if (parsed.version === 2 && parsed.orgs && typeof parsed.orgs === 'object') {
24
+ return { version: 2, orgs: parsed.orgs };
25
+ }
26
+ return emptyState();
11
27
  }
12
28
  catch {
13
- return { files: {} };
29
+ return emptyState();
14
30
  }
15
31
  }
32
+ function emptyState() {
33
+ return { version: 2, orgs: {} };
34
+ }
16
35
  /**
17
36
  * Write sync state to disk.
18
37
  */
19
38
  export function writeSyncState(state) {
20
39
  ensureHalyardDir();
21
- writeFileSync(SYNC_STATE_PATH, JSON.stringify(state, null, 2), { mode: 0o600 });
40
+ writeFileSync(syncStatePath(), JSON.stringify(state, null, 2), { mode: 0o600 });
22
41
  }
23
42
  /**
24
- * Check if a file has already been uploaded (by content hash).
43
+ * Check if a file has already been uploaded to an org (by content hash).
25
44
  */
26
- export function isUploaded(state, filePath, hash) {
27
- const entry = state.files[filePath];
45
+ export function isUploaded(state, orgKey, filePath, hash) {
46
+ const entry = state.orgs[orgKey]?.files[filePath];
28
47
  return !!entry && entry.hash === hash;
29
48
  }
30
49
  /**
31
- * Mark a file as uploaded in the sync state.
50
+ * Mark a file as uploaded to an org in the sync state.
32
51
  */
33
- export function markUploaded(state, filePath, info) {
34
- state.files[filePath] = info;
52
+ export function markUploaded(state, orgKey, filePath, info) {
53
+ const org = (state.orgs[orgKey] ??= { files: {} });
54
+ org.files[filePath] = info;
55
+ }
56
+ /** Has a skill already been synced to an org at this fingerprint, with the current payload shape? */
57
+ export function isSkillSynced(state, orgKey, ledgerKey, hash) {
58
+ const entry = state.orgs[orgKey]?.skills?.[ledgerKey];
59
+ return !!entry && entry.hash === hash && entry.payloadVersion === SKILL_PAYLOAD_VERSION;
60
+ }
61
+ /** Record a skill as synced to an org with the current payload shape. */
62
+ export function markSkillSynced(state, orgKey, ledgerKey, info) {
63
+ const org = (state.orgs[orgKey] ??= { files: {} });
64
+ (org.skills ??= {})[ledgerKey] = { ...info, payloadVersion: SKILL_PAYLOAD_VERSION };
35
65
  }
36
66
  /**
37
67
  * Compute a hash of a file's contents for change detection.
@@ -1 +1 @@
1
- {"version":3,"file":"sync-state.js","sourceRoot":"","sources":["../../src/lib/sync-state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAc/D;;GAEG;AACH,MAAM,UAAU,aAAa;IAC3B,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CAAC,eAAe,EAAE,OAAO,CAAC,CAAA;QAClD,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAc,CAAA;IACrC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,CAAA;IACtB,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,KAAgB;IAC7C,gBAAgB,EAAE,CAAA;IAClB,aAAa,CAAC,eAAe,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAA;AACjF,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,KAAgB,EAAE,QAAgB,EAAE,IAAY;IACzE,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAA;IACnC,OAAO,CAAC,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,IAAI,CAAA;AACvC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,KAAgB,EAAE,QAAgB,EAAE,IAAe;IAC9E,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAA;AAC9B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAAe;IAC9C,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;AACxE,CAAC"}
1
+ {"version":3,"file":"sync-state.js","sourceRoot":"","sources":["../../src/lib/sync-state.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@halyard/cli",
3
- "version": "0.1.2",
3
+ "version": "0.2.0",
4
4
  "description": "CLI for setting up Halyard in Claude/Cursor/Codex and syncing coding session logs",
5
5
  "type": "module",
6
6
  "bin": {
@@ -14,8 +14,11 @@
14
14
  "build": "tsc",
15
15
  "build:binary": "bun build src/cli.ts --compile --outfile dist/halyard",
16
16
  "test": "tsx --test src/**/*.test.ts",
17
- "typecheck": "tsc --noEmit",
18
- "prepublishOnly": "tsc"
17
+ "typecheck": "tsgo --noEmit",
18
+ "typecheck:tsc": "tsc --noEmit",
19
+ "prepublishOnly": "tsc",
20
+ "lint": "eslint src",
21
+ "lint:fix": "eslint src --fix"
19
22
  },
20
23
  "dependencies": {
21
24
  "commander": "^13.0.0",
@@ -23,10 +26,12 @@
23
26
  "smol-toml": "^1.6.1"
24
27
  },
25
28
  "devDependencies": {
29
+ "@halyard/eslint-config": "workspace:*",
26
30
  "@halyard/prettier-config": "workspace:*",
27
31
  "@halyard/tsconfig": "workspace:*",
28
- "typescript": "^5.7.0",
29
- "tsx": "^4.19.0"
32
+ "eslint": "^9.17.0",
33
+ "tsx": "^4.19.0",
34
+ "typescript": "^5.7.0"
30
35
  },
31
36
  "prettier": "@halyard/prettier-config",
32
37
  "publishConfig": {