ghostrail 0.0.0 → 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 (163) hide show
  1. package/README.md +49 -3
  2. package/dist/agent/claude-code.d.ts +10 -0
  3. package/dist/agent/claude-code.d.ts.map +1 -1
  4. package/dist/agent/claude-code.js +20 -0
  5. package/dist/agent/claude-code.js.map +1 -1
  6. package/dist/agent/result.d.ts.map +1 -1
  7. package/dist/agent/result.js +13 -2
  8. package/dist/agent/result.js.map +1 -1
  9. package/dist/backend/container.d.ts +18 -0
  10. package/dist/backend/container.d.ts.map +1 -1
  11. package/dist/backend/container.js +33 -10
  12. package/dist/backend/container.js.map +1 -1
  13. package/dist/backend/git-credentials.d.ts +18 -0
  14. package/dist/backend/git-credentials.d.ts.map +1 -0
  15. package/dist/backend/git-credentials.js +30 -0
  16. package/dist/backend/git-credentials.js.map +1 -0
  17. package/dist/backend/local-worktree.d.ts.map +1 -1
  18. package/dist/backend/local-worktree.js +21 -0
  19. package/dist/backend/local-worktree.js.map +1 -1
  20. package/dist/backend/types.d.ts +12 -1
  21. package/dist/backend/types.d.ts.map +1 -1
  22. package/dist/claude-profile/classify.d.ts +41 -0
  23. package/dist/claude-profile/classify.d.ts.map +1 -0
  24. package/dist/claude-profile/classify.js +103 -0
  25. package/dist/claude-profile/classify.js.map +1 -0
  26. package/dist/claude-profile/index.d.ts +3 -0
  27. package/dist/claude-profile/index.d.ts.map +1 -0
  28. package/dist/claude-profile/index.js +3 -0
  29. package/dist/claude-profile/index.js.map +1 -0
  30. package/dist/claude-profile/setup.d.ts +33 -0
  31. package/dist/claude-profile/setup.d.ts.map +1 -0
  32. package/dist/claude-profile/setup.js +81 -0
  33. package/dist/claude-profile/setup.js.map +1 -0
  34. package/dist/cli/commands.d.ts +67 -2
  35. package/dist/cli/commands.d.ts.map +1 -1
  36. package/dist/cli/commands.js +420 -17
  37. package/dist/cli/commands.js.map +1 -1
  38. package/dist/cli.d.ts.map +1 -1
  39. package/dist/cli.js +13 -1
  40. package/dist/cli.js.map +1 -1
  41. package/dist/commands/help.d.ts.map +1 -1
  42. package/dist/commands/help.js +20 -2
  43. package/dist/commands/help.js.map +1 -1
  44. package/dist/config/load.d.ts.map +1 -1
  45. package/dist/config/load.js +61 -9
  46. package/dist/config/load.js.map +1 -1
  47. package/dist/config/schema.d.ts +51 -3
  48. package/dist/config/schema.d.ts.map +1 -1
  49. package/dist/config/schema.js +4 -0
  50. package/dist/config/schema.js.map +1 -1
  51. package/dist/factory/build.d.ts +24 -0
  52. package/dist/factory/build.d.ts.map +1 -1
  53. package/dist/factory/build.js +80 -11
  54. package/dist/factory/build.js.map +1 -1
  55. package/dist/loop/concurrency.d.ts +13 -0
  56. package/dist/loop/concurrency.d.ts.map +1 -0
  57. package/dist/loop/concurrency.js +27 -0
  58. package/dist/loop/concurrency.js.map +1 -0
  59. package/dist/loop/engine.d.ts.map +1 -1
  60. package/dist/loop/engine.js +19 -14
  61. package/dist/loop/engine.js.map +1 -1
  62. package/dist/loop/index.d.ts +2 -0
  63. package/dist/loop/index.d.ts.map +1 -1
  64. package/dist/loop/index.js +2 -0
  65. package/dist/loop/index.js.map +1 -1
  66. package/dist/loop/ports.d.ts +37 -1
  67. package/dist/loop/ports.d.ts.map +1 -1
  68. package/dist/loop/watch.d.ts +25 -0
  69. package/dist/loop/watch.d.ts.map +1 -0
  70. package/dist/loop/watch.js +45 -0
  71. package/dist/loop/watch.js.map +1 -0
  72. package/dist/publish/gh.d.ts +20 -1
  73. package/dist/publish/gh.d.ts.map +1 -1
  74. package/dist/publish/gh.js +37 -3
  75. package/dist/publish/gh.js.map +1 -1
  76. package/dist/publish/githost.d.ts +12 -0
  77. package/dist/publish/githost.d.ts.map +1 -1
  78. package/dist/publish/githost.js +14 -0
  79. package/dist/publish/githost.js.map +1 -1
  80. package/dist/publish/github-publisher.d.ts +1 -1
  81. package/dist/publish/github-publisher.d.ts.map +1 -1
  82. package/dist/publish/github-publisher.js +6 -5
  83. package/dist/publish/github-publisher.js.map +1 -1
  84. package/dist/respond/respond.d.ts +10 -1
  85. package/dist/respond/respond.d.ts.map +1 -1
  86. package/dist/respond/respond.js +37 -3
  87. package/dist/respond/respond.js.map +1 -1
  88. package/dist/secrets/env-file.d.ts +23 -0
  89. package/dist/secrets/env-file.d.ts.map +1 -0
  90. package/dist/secrets/env-file.js +70 -0
  91. package/dist/secrets/env-file.js.map +1 -0
  92. package/dist/secrets/index.d.ts +4 -0
  93. package/dist/secrets/index.d.ts.map +1 -0
  94. package/dist/secrets/index.js +4 -0
  95. package/dist/secrets/index.js.map +1 -0
  96. package/dist/secrets/load.d.ts +24 -0
  97. package/dist/secrets/load.d.ts.map +1 -0
  98. package/dist/secrets/load.js +43 -0
  99. package/dist/secrets/load.js.map +1 -0
  100. package/dist/skill/install.d.ts +56 -0
  101. package/dist/skill/install.d.ts.map +1 -0
  102. package/dist/skill/install.js +93 -0
  103. package/dist/skill/install.js.map +1 -0
  104. package/dist/source/linear.d.ts +51 -8
  105. package/dist/source/linear.d.ts.map +1 -1
  106. package/dist/source/linear.js +213 -23
  107. package/dist/source/linear.js.map +1 -1
  108. package/dist/triage/apply.d.ts +28 -0
  109. package/dist/triage/apply.d.ts.map +1 -0
  110. package/dist/triage/apply.js +68 -0
  111. package/dist/triage/apply.js.map +1 -0
  112. package/dist/triage/engine.d.ts +31 -0
  113. package/dist/triage/engine.d.ts.map +1 -0
  114. package/dist/triage/engine.js +122 -0
  115. package/dist/triage/engine.js.map +1 -0
  116. package/dist/triage/index.d.ts +4 -0
  117. package/dist/triage/index.d.ts.map +1 -0
  118. package/dist/triage/index.js +4 -0
  119. package/dist/triage/index.js.map +1 -0
  120. package/dist/triage/plan.d.ts +37 -0
  121. package/dist/triage/plan.d.ts.map +1 -0
  122. package/dist/triage/plan.js +75 -0
  123. package/dist/triage/plan.js.map +1 -0
  124. package/dist/vendor/skilltend/apply.d.ts +25 -0
  125. package/dist/vendor/skilltend/apply.d.ts.map +1 -0
  126. package/dist/vendor/skilltend/apply.js +85 -0
  127. package/dist/vendor/skilltend/apply.js.map +1 -0
  128. package/dist/vendor/skilltend/detect.d.ts +35 -0
  129. package/dist/vendor/skilltend/detect.d.ts.map +1 -0
  130. package/dist/vendor/skilltend/detect.js +187 -0
  131. package/dist/vendor/skilltend/detect.js.map +1 -0
  132. package/dist/vendor/skilltend/frontmatter.d.ts +5 -0
  133. package/dist/vendor/skilltend/frontmatter.d.ts.map +1 -0
  134. package/dist/vendor/skilltend/frontmatter.js +59 -0
  135. package/dist/vendor/skilltend/frontmatter.js.map +1 -0
  136. package/dist/vendor/skilltend/fsFacade.d.ts +24 -0
  137. package/dist/vendor/skilltend/fsFacade.d.ts.map +1 -0
  138. package/dist/vendor/skilltend/fsFacade.js +68 -0
  139. package/dist/vendor/skilltend/fsFacade.js.map +1 -0
  140. package/dist/vendor/skilltend/paths.d.ts +28 -0
  141. package/dist/vendor/skilltend/paths.d.ts.map +1 -0
  142. package/dist/vendor/skilltend/paths.js +24 -0
  143. package/dist/vendor/skilltend/paths.js.map +1 -0
  144. package/dist/vendor/skilltend/plan.d.ts +46 -0
  145. package/dist/vendor/skilltend/plan.d.ts.map +1 -0
  146. package/dist/vendor/skilltend/plan.js +79 -0
  147. package/dist/vendor/skilltend/plan.js.map +1 -0
  148. package/dist/vendor/skilltend/registry.d.ts +56 -0
  149. package/dist/vendor/skilltend/registry.d.ts.map +1 -0
  150. package/dist/vendor/skilltend/registry.js +129 -0
  151. package/dist/vendor/skilltend/registry.js.map +1 -0
  152. package/docker/factory.Dockerfile +39 -0
  153. package/package.json +4 -3
  154. package/skill/ghostrail/SKILL.md +145 -0
  155. package/templates/{fix-bugs-local → code-local}/README.md +3 -3
  156. package/templates/code-local/ghostrail.toml +44 -0
  157. package/templates/code-local/prompts/resolve-issue.md +31 -0
  158. package/templates/code-local/prompts/respond.md +27 -0
  159. package/templates/code-local/prompts/triage.md +51 -0
  160. package/templates/content-loop/ghostrail.toml +5 -2
  161. package/templates/content-loop/prompts/respond.md +25 -0
  162. package/templates/fix-bugs-local/ghostrail.toml +0 -37
  163. package/templates/fix-bugs-local/prompts/fix-bug.md +0 -27
@@ -1 +1 @@
1
- {"version":3,"file":"github-publisher.js","sourceRoot":"","sources":["../../src/publish/github-publisher.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAYrD;;;;;GAKG;AACH,MAAM,OAAO,eAAe;IACT,OAAO,CAAU;IACjB,IAAI,CAAU;IACd,UAAU,CAAS;IACnB,MAAM,CAAoB;IAC1B,UAAU,CAAS;IACnB,KAAK,CAAU;IAEhC,YAAY,OAAgB,EAAE,IAAa,EAAE,OAAyB;QACpE,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;QACrC,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,CAAC,WAAW,CAAC,CAAC;QAC9C,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,KAAK,CAAC;QAC9C,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,KAAK,CAAC;IACtC,CAAC;IAED,KAAK,CAAC,eAAe,CACnB,IAAc,EACd,SAAoB,EACpB,OAAe;QAEf,MAAM,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;QACzC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE;YAChD,KAAK;YACL,QAAQ;YACR,IAAI;YACJ,aAAa,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,UAAU,CAAC;SACpD,CAAC,CAAC;QACH,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CACb,0CAA0C,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CACzF,CAAC;QACJ,CAAC;QAED,MAAM,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;QAEtE,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;YACtB,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,UAAU,EAAE,SAAS,CAAC,MAAM;YAC5B,KAAK,EAAE,aAAa,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,UAAU,CAAC;YAC1D,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC;YAC3B,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,KAAK,EAAE,IAAI,CAAC,KAAK;SAClB,CAAC,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,GAAG,CAAC,SAAoB,EAAE,IAAuB;QAC7D,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC;QACpE,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CACb,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAChF,CAAC;QACJ,CAAC;IACH,CAAC;CACF"}
1
+ {"version":3,"file":"github-publisher.js","sourceRoot":"","sources":["../../src/publish/github-publisher.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAYpE;;;;;GAKG;AACH,MAAM,OAAO,eAAe;IACT,OAAO,CAAU;IACjB,IAAI,CAAU;IACd,UAAU,CAAS;IACnB,MAAM,CAAoB;IAC1B,UAAU,CAAS;IACnB,KAAK,CAAU;IAEhC,YAAY,OAAgB,EAAE,IAAa,EAAE,OAAyB;QACpE,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;QACrC,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,CAAC,WAAW,CAAC,CAAC;QAC9C,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,KAAK,CAAC;QAC9C,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,KAAK,CAAC;IACtC,CAAC;IAED,KAAK,CAAC,eAAe,CACnB,IAAc,EACd,SAAoB,EACpB,OAAe,EACf,UAAmB;QAEnB,MAAM,IAAI,GAAG,UAAU,IAAI,IAAI,CAAC,UAAU,CAAC;QAC3C,MAAM,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,aAAa,EAAE,CAAC,CAAC;QAC3C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE;YAChD,KAAK;YACL,QAAQ;YACR,IAAI;YACJ,aAAa,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC;SACzC,CAAC,CAAC;QACH,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CACb,0CAA0C,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CACzF,CAAC;QACJ,CAAC;QAED,MAAM,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;QAEtE,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;YACtB,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,UAAU,EAAE,SAAS,CAAC,MAAM;YAC5B,KAAK,EAAE,aAAa,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC;YAC/C,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC;YAC3B,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,KAAK,EAAE,IAAI,CAAC,KAAK;SAClB,CAAC,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,GAAG,CAAC,SAAoB,EAAE,IAAuB;QAC7D,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC;QACpE,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CACb,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAChF,CAAC;QACJ,CAAC;IACH,CAAC;CACF"}
@@ -1,6 +1,6 @@
1
1
  import type { Backend } from "../backend/types.js";
2
2
  import type { AgentConfig, Guardrails } from "../config/schema.js";
3
- import type { Agent, Logger } from "../loop/ports.js";
3
+ import type { Agent, Logger, Source } from "../loop/ports.js";
4
4
  import { type GitHost, type PrComment } from "../publish/githost.js";
5
5
  import type { WatermarkStore } from "./store.js";
6
6
  /** Where the respond pass drops the human feedback for the agent to read. */
@@ -11,8 +11,17 @@ export interface RespondDeps {
11
11
  backend: Backend;
12
12
  agent: Agent;
13
13
  watermarks: WatermarkStore;
14
+ /** Optional tracker source; when set, the respond pass also folds in new
15
+ * tracker (e.g. Linear) comments on the PR's issue, not just PR comments. */
16
+ source?: Source;
14
17
  logger?: Logger;
15
18
  }
19
+ /**
20
+ * Recover the tracker issue id (e.g. "TJ-123") from a factory branch name, or
21
+ * undefined when the branch does not encode one (so the respond pass simply
22
+ * skips tracker comments for it).
23
+ */
24
+ export declare function extractIssueId(headBranch: string): string | undefined;
16
25
  export interface RespondConfig {
17
26
  /** Label that marks factory PRs, e.g. "ghostrail". */
18
27
  label: string;
@@ -1 +1 @@
1
- {"version":3,"file":"respond.d.ts","sourceRoot":"","sources":["../../src/respond/respond.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAa,MAAM,qBAAqB,CAAC;AAC9D,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACnE,OAAO,KAAK,EAAE,KAAK,EAAgB,MAAM,EAAY,MAAM,kBAAkB,CAAC;AAC9E,OAAO,EAAoB,KAAK,OAAO,EAAe,KAAK,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAEpG,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,6EAA6E;AAC7E,eAAO,MAAM,aAAa,2BAA2B,CAAC;AAItD,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,KAAK,CAAC;IACb,UAAU,EAAE,cAAc,CAAC;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,sDAAsD;IACtD,KAAK,EAAE,MAAM,CAAC;IACd,6CAA6C;IAC7C,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;IAC9B,kFAAkF;IAClF,KAAK,EAAE,WAAW,CAAC;IACnB,UAAU,EAAE,UAAU,CAAC;CACxB;AAED,MAAM,MAAM,YAAY,GAAG,WAAW,GAAG,SAAS,GAAG,MAAM,GAAG,QAAQ,CAAC;AAEvE,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,YAAY,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,8EAA8E;AAC9E,wBAAgB,cAAc,CAAC,QAAQ,EAAE,SAAS,SAAS,EAAE,GAAG,MAAM,CAGrE;AAOD;;;;;;;GAOG;AACH,wBAAsB,WAAW,CAC/B,IAAI,EAAE,WAAW,EACjB,MAAM,EAAE,aAAa,GACpB,OAAO,CAAC,aAAa,EAAE,CAAC,CAU1B"}
1
+ {"version":3,"file":"respond.d.ts","sourceRoot":"","sources":["../../src/respond/respond.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAa,MAAM,qBAAqB,CAAC;AAC9D,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACnE,OAAO,KAAK,EAAE,KAAK,EAAyB,MAAM,EAAE,MAAM,EAAY,MAAM,kBAAkB,CAAC;AAC/F,OAAO,EAEL,KAAK,OAAO,EAEZ,KAAK,SAAS,EAEf,MAAM,uBAAuB,CAAC;AAE/B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,6EAA6E;AAC7E,eAAO,MAAM,aAAa,2BAA2B,CAAC;AAItD,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,KAAK,CAAC;IACb,UAAU,EAAE,cAAc,CAAC;IAC3B;iFAC6E;IAC7E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAKD;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAGrE;AAED,MAAM,WAAW,aAAa;IAC5B,sDAAsD;IACtD,KAAK,EAAE,MAAM,CAAC;IACd,6CAA6C;IAC7C,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;IAC9B,kFAAkF;IAClF,KAAK,EAAE,WAAW,CAAC;IACnB,UAAU,EAAE,UAAU,CAAC;CACxB;AAED,MAAM,MAAM,YAAY,GAAG,WAAW,GAAG,SAAS,GAAG,MAAM,GAAG,QAAQ,CAAC;AAEvE,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,YAAY,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,8EAA8E;AAC9E,wBAAgB,cAAc,CAAC,QAAQ,EAAE,SAAS,SAAS,EAAE,GAAG,MAAM,CAGrE;AAOD;;;;;;;GAOG;AACH,wBAAsB,WAAW,CAC/B,IAAI,EAAE,WAAW,EACjB,MAAM,EAAE,aAAa,GACpB,OAAO,CAAC,aAAa,EAAE,CAAC,CAU1B"}
@@ -1,9 +1,20 @@
1
1
  import { writeWorkspaceFile } from "../backend/fs.js";
2
- import { GHOSTRAIL_MARKER } from "../publish/githost.js";
2
+ import { GHOSTRAIL_MARKER, gitAddAllArgs, } from "../publish/githost.js";
3
3
  import { latestTimestamp, selectNewComments } from "./select.js";
4
4
  /** Where the respond pass drops the human feedback for the agent to read. */
5
5
  export const FEEDBACK_PATH = ".ghostrail/feedback.md";
6
6
  const nullLogger = { info: () => { }, warn: () => { } };
7
+ /** Match the issue id a branch was built for: `<prefix>/<team-number>[-slug]`. */
8
+ const ISSUE_ID_RE = /^[^/]+\/([a-z][a-z0-9]*-\d+)(?:-|$)/;
9
+ /**
10
+ * Recover the tracker issue id (e.g. "TJ-123") from a factory branch name, or
11
+ * undefined when the branch does not encode one (so the respond pass simply
12
+ * skips tracker comments for it).
13
+ */
14
+ export function extractIssueId(headBranch) {
15
+ const id = ISSUE_ID_RE.exec(headBranch)?.[1];
16
+ return id === undefined ? undefined : id.toUpperCase();
17
+ }
7
18
  /** Render fresh human comments into the feedback document the agent reads. */
8
19
  export function renderFeedback(comments) {
9
20
  const blocks = comments.map((c) => `> from @${c.author} at ${c.createdAt}\n\n${c.body.trim()}`);
@@ -31,8 +42,31 @@ export async function respondTick(deps, config) {
31
42
  }
32
43
  return results;
33
44
  }
45
+ /**
46
+ * New tracker (e.g. Linear) comments on the issue a PR was opened for, or an
47
+ * empty list when there is no source or the branch encodes no issue id.
48
+ * Best-effort: a lookup failure logs and yields nothing rather than failing the
49
+ * whole PR (its GitHub comments are still handled).
50
+ */
51
+ async function listTrackerComments(deps, pr, logger) {
52
+ if (deps.source === undefined)
53
+ return [];
54
+ const issueId = extractIssueId(pr.headBranch);
55
+ if (issueId === undefined)
56
+ return [];
57
+ try {
58
+ return await deps.source.listComments({ id: issueId, title: `issue ${issueId}`, url: pr.url });
59
+ }
60
+ catch (error) {
61
+ const message = error instanceof Error ? error.message : String(error);
62
+ logger.warn(`respond #${pr.number}: could not read tracker comments for ${issueId}: ${message}`);
63
+ return [];
64
+ }
65
+ }
34
66
  async function respondToPr(deps, config, pr, logger) {
35
- const comments = await deps.host.listComments(pr.number);
67
+ const prComments = await deps.host.listComments(pr.number);
68
+ const trackerComments = await listTrackerComments(deps, pr, logger);
69
+ const comments = [...prComments, ...trackerComments];
36
70
  const since = await deps.watermarks.get(pr.number);
37
71
  const fresh = selectNewComments(comments, {
38
72
  selfLogins: config.selfLogins,
@@ -110,7 +144,7 @@ async function routeRespond(deps, pr, workspace, outcome, logger) {
110
144
  }
111
145
  /** Commit and push the agent's changes to the PR branch. Returns false if there was nothing to commit. */
112
146
  async function commitAndPush(backend, workspace) {
113
- await backend.exec(workspace, ["git", "add", "-A"]);
147
+ await backend.exec(workspace, ["git", ...gitAddAllArgs()]);
114
148
  const commit = await backend.exec(workspace, [
115
149
  "git",
116
150
  "commit",
@@ -1 +1 @@
1
- {"version":3,"file":"respond.js","sourceRoot":"","sources":["../../src/respond/respond.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"respond.js","sourceRoot":"","sources":["../../src/respond/respond.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Parse a dotenv-style file into key/value pairs.
3
+ *
4
+ * - One `KEY=VALUE` per line; an optional leading `export ` is stripped.
5
+ * - Blank lines and lines whose first non-space character is `#` are ignored.
6
+ * - The key is everything before the first `=`, trimmed. A line with no `=`, or
7
+ * an empty key, is skipped.
8
+ * - The value is everything after the first `=`, trimmed; if it is wholly wrapped
9
+ * in matching single or double quotes, the quotes are removed (and the inner
10
+ * text is not further trimmed). `=` characters in the value are preserved.
11
+ *
12
+ * Pure: no I/O, never throws for any string.
13
+ */
14
+ export declare function parseEnvFile(content: string): Record<string, string>;
15
+ /** True if a variable name denotes a secret (by known name or suffix). */
16
+ export declare function isSecretKey(key: string): boolean;
17
+ /**
18
+ * The distinct secret values in an environment map: the values of keys that
19
+ * denote secrets and are at least 6 characters (shorter values are ignored, to
20
+ * match the redactor). Order follows first appearance.
21
+ */
22
+ export declare function secretValuesOf(env: Record<string, string | undefined>): string[];
23
+ //# sourceMappingURL=env-file.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env-file.d.ts","sourceRoot":"","sources":["../../src/secrets/env-file.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAgBpE;AAwBD,0EAA0E;AAC1E,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAEhD;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,GAAG,MAAM,EAAE,CAUhF"}
@@ -0,0 +1,70 @@
1
+ /**
2
+ * Parse a dotenv-style file into key/value pairs.
3
+ *
4
+ * - One `KEY=VALUE` per line; an optional leading `export ` is stripped.
5
+ * - Blank lines and lines whose first non-space character is `#` are ignored.
6
+ * - The key is everything before the first `=`, trimmed. A line with no `=`, or
7
+ * an empty key, is skipped.
8
+ * - The value is everything after the first `=`, trimmed; if it is wholly wrapped
9
+ * in matching single or double quotes, the quotes are removed (and the inner
10
+ * text is not further trimmed). `=` characters in the value are preserved.
11
+ *
12
+ * Pure: no I/O, never throws for any string.
13
+ */
14
+ export function parseEnvFile(content) {
15
+ const result = {};
16
+ for (const rawLine of content.split("\n")) {
17
+ const line = rawLine.trim();
18
+ if (line.length === 0 || line.startsWith("#"))
19
+ continue;
20
+ const withoutExport = line.startsWith("export ") ? line.slice("export ".length) : line;
21
+ const eq = withoutExport.indexOf("=");
22
+ if (eq === -1)
23
+ continue;
24
+ const key = withoutExport.slice(0, eq).trim();
25
+ if (key.length === 0)
26
+ continue;
27
+ result[key] = unquote(withoutExport.slice(eq + 1).trim());
28
+ }
29
+ return result;
30
+ }
31
+ function unquote(value) {
32
+ if (value.length >= 2) {
33
+ const first = value[0];
34
+ const last = value[value.length - 1];
35
+ if ((first === '"' || first === "'") && last === first) {
36
+ return value.slice(1, -1);
37
+ }
38
+ }
39
+ return value;
40
+ }
41
+ /** Keys whose values are always treated as secrets, in addition to the suffix rule. */
42
+ const KNOWN_SECRET_KEYS = new Set([
43
+ "LINEAR_API_KEY",
44
+ "ANTHROPIC_API_KEY",
45
+ "GH_TOKEN",
46
+ "GITHUB_TOKEN",
47
+ "NPM_TOKEN",
48
+ ]);
49
+ const SECRET_KEY_PATTERN = /(_TOKEN|_KEY|_SECRET|_PASSWORD|APIKEY|PASSWORD)$/i;
50
+ /** True if a variable name denotes a secret (by known name or suffix). */
51
+ export function isSecretKey(key) {
52
+ return KNOWN_SECRET_KEYS.has(key) || SECRET_KEY_PATTERN.test(key);
53
+ }
54
+ /**
55
+ * The distinct secret values in an environment map: the values of keys that
56
+ * denote secrets and are at least 6 characters (shorter values are ignored, to
57
+ * match the redactor). Order follows first appearance.
58
+ */
59
+ export function secretValuesOf(env) {
60
+ const seen = new Set();
61
+ const values = [];
62
+ for (const [key, value] of Object.entries(env)) {
63
+ if (value !== undefined && value.length >= 6 && isSecretKey(key) && !seen.has(value)) {
64
+ seen.add(value);
65
+ values.push(value);
66
+ }
67
+ }
68
+ return values;
69
+ }
70
+ //# sourceMappingURL=env-file.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env-file.js","sourceRoot":"","sources":["../../src/secrets/env-file.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,YAAY,CAAC,OAAe;IAC1C,MAAM,MAAM,GAA2B,EAAE,CAAC;IAC1C,KAAK,MAAM,OAAO,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1C,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS;QAExD,MAAM,aAAa,GAAG,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACvF,MAAM,EAAE,GAAG,aAAa,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACtC,IAAI,EAAE,KAAK,CAAC,CAAC;YAAE,SAAS;QAExB,MAAM,GAAG,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAC9C,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QAE/B,MAAM,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IAC5D,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,OAAO,CAAC,KAAa;IAC5B,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;QACtB,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACvB,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACrC,IAAI,CAAC,KAAK,KAAK,GAAG,IAAI,KAAK,KAAK,GAAG,CAAC,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;YACvD,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,uFAAuF;AACvF,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC;IAChC,gBAAgB;IAChB,mBAAmB;IACnB,UAAU;IACV,cAAc;IACd,WAAW;CACZ,CAAC,CAAC;AAEH,MAAM,kBAAkB,GAAG,mDAAmD,CAAC;AAE/E,0EAA0E;AAC1E,MAAM,UAAU,WAAW,CAAC,GAAW;IACrC,OAAO,iBAAiB,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,kBAAkB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACpE,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,GAAuC;IACpE,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QAC/C,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,IAAI,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YACrF,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YAChB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { isSecretKey, parseEnvFile, secretValuesOf } from "./env-file.js";
2
+ export { applyOverrides, GLOBAL_SECRETS_FILE, type LoadedEnv, loadEnvOverrides, REPO_SECRETS_FILE, } from "./load.js";
3
+ export { REDACTION, redactSecrets } from "./redact.js";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/secrets/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC1E,OAAO,EACL,cAAc,EACd,mBAAmB,EACnB,KAAK,SAAS,EACd,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { isSecretKey, parseEnvFile, secretValuesOf } from "./env-file.js";
2
+ export { applyOverrides, GLOBAL_SECRETS_FILE, loadEnvOverrides, REPO_SECRETS_FILE, } from "./load.js";
3
+ export { REDACTION, redactSecrets } from "./redact.js";
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/secrets/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC1E,OAAO,EACL,cAAc,EACd,mBAAmB,EAEnB,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,24 @@
1
+ /** The account-level secrets file inside the global config dir. */
2
+ export declare const GLOBAL_SECRETS_FILE = "secrets.env";
3
+ /** The repo-local secrets file (gitignored). */
4
+ export declare const REPO_SECRETS_FILE = ".ghostrail.env";
5
+ export interface LoadedEnv {
6
+ /** Merged file overrides, repo winning over global. */
7
+ overrides: Record<string, string>;
8
+ globalPath: string;
9
+ repoPath: string;
10
+ }
11
+ /**
12
+ * Load credential overrides from the global secrets file and then the repo-local
13
+ * file, with the repo file winning over the global one. Either file may be
14
+ * absent. These overrides sit above the process environment (see
15
+ * {@link applyOverrides}), giving the final precedence: repo > global > env.
16
+ */
17
+ export declare function loadEnvOverrides(globalDir: string, repoDir: string): Promise<LoadedEnv>;
18
+ /**
19
+ * Apply overrides onto an environment map in place. The process environment is
20
+ * the base; each override key replaces it, so a file value wins over an ambient
21
+ * env var of the same name (the user's chosen precedence).
22
+ */
23
+ export declare function applyOverrides(env: Record<string, string | undefined>, overrides: Record<string, string>): void;
24
+ //# sourceMappingURL=load.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"load.d.ts","sourceRoot":"","sources":["../../src/secrets/load.ts"],"names":[],"mappings":"AAIA,mEAAmE;AACnE,eAAO,MAAM,mBAAmB,gBAAgB,CAAC;AACjD,gDAAgD;AAChD,eAAO,MAAM,iBAAiB,mBAAmB,CAAC;AAUlD,MAAM,WAAW,SAAS;IACxB,uDAAuD;IACvD,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;;;GAKG;AACH,wBAAsB,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAU7F;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,EACvC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAChC,IAAI,CAIN"}
@@ -0,0 +1,43 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import { join } from "node:path";
3
+ import { parseEnvFile } from "./env-file.js";
4
+ /** The account-level secrets file inside the global config dir. */
5
+ export const GLOBAL_SECRETS_FILE = "secrets.env";
6
+ /** The repo-local secrets file (gitignored). */
7
+ export const REPO_SECRETS_FILE = ".ghostrail.env";
8
+ async function readIfPresent(path) {
9
+ try {
10
+ return await readFile(path, "utf8");
11
+ }
12
+ catch {
13
+ return undefined;
14
+ }
15
+ }
16
+ /**
17
+ * Load credential overrides from the global secrets file and then the repo-local
18
+ * file, with the repo file winning over the global one. Either file may be
19
+ * absent. These overrides sit above the process environment (see
20
+ * {@link applyOverrides}), giving the final precedence: repo > global > env.
21
+ */
22
+ export async function loadEnvOverrides(globalDir, repoDir) {
23
+ const globalPath = join(globalDir, GLOBAL_SECRETS_FILE);
24
+ const repoPath = join(repoDir, REPO_SECRETS_FILE);
25
+ const globalRaw = await readIfPresent(globalPath);
26
+ const repoRaw = await readIfPresent(repoPath);
27
+ const overrides = {
28
+ ...(globalRaw === undefined ? {} : parseEnvFile(globalRaw)),
29
+ ...(repoRaw === undefined ? {} : parseEnvFile(repoRaw)),
30
+ };
31
+ return { overrides, globalPath, repoPath };
32
+ }
33
+ /**
34
+ * Apply overrides onto an environment map in place. The process environment is
35
+ * the base; each override key replaces it, so a file value wins over an ambient
36
+ * env var of the same name (the user's chosen precedence).
37
+ */
38
+ export function applyOverrides(env, overrides) {
39
+ for (const [key, value] of Object.entries(overrides)) {
40
+ env[key] = value;
41
+ }
42
+ }
43
+ //# sourceMappingURL=load.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"load.js","sourceRoot":"","sources":["../../src/secrets/load.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7C,mEAAmE;AACnE,MAAM,CAAC,MAAM,mBAAmB,GAAG,aAAa,CAAC;AACjD,gDAAgD;AAChD,MAAM,CAAC,MAAM,iBAAiB,GAAG,gBAAgB,CAAC;AAElD,KAAK,UAAU,aAAa,CAAC,IAAY;IACvC,IAAI,CAAC;QACH,OAAO,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACtC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AASD;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,SAAiB,EAAE,OAAe;IACvE,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,EAAE,mBAAmB,CAAC,CAAC;IACxD,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC;IAClD,MAAM,SAAS,GAAG,MAAM,aAAa,CAAC,UAAU,CAAC,CAAC;IAClD,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,QAAQ,CAAC,CAAC;IAC9C,MAAM,SAAS,GAAG;QAChB,GAAG,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;QAC3D,GAAG,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;KACxD,CAAC;IACF,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC;AAC7C,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAC5B,GAAuC,EACvC,SAAiC;IAEjC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;QACrD,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IACnB,CAAC;AACH,CAAC"}
@@ -0,0 +1,56 @@
1
+ import { type ApplyResult } from "../vendor/skilltend/apply.js";
2
+ import { type FsFacade } from "../vendor/skilltend/fsFacade.js";
3
+ import type { Scope, SkillTarget } from "../vendor/skilltend/paths.js";
4
+ import type { TargetPlan } from "../vendor/skilltend/plan.js";
5
+ import { type PathCtx } from "../vendor/skilltend/registry.js";
6
+ /**
7
+ * Ghostrail's adapter over the white-label skilltend engine. Everything
8
+ * ghostrail-specific lives here — the skill's identity, where its content ships,
9
+ * and how the plan is worded — so the engine underneath stays generic.
10
+ */
11
+ /** The identity of the skill ghostrail installs. */
12
+ export declare const GHOSTRAIL_SKILL: import("../vendor/skilltend/registry.js").SkillIdentity;
13
+ /** Read the `SKILL.md` bundled in the package. */
14
+ export declare function readBundledSkill(): Promise<string>;
15
+ /** Build the path context the engine resolves agent directories against. */
16
+ export declare function pathCtx(env: Record<string, string | undefined>, cwd: string): PathCtx;
17
+ export interface SkillPlanOptions {
18
+ /** `global` installs under the home dir; `local` commits it with the repo. */
19
+ scope: Scope;
20
+ /** Explicit agent keys; when omitted, detected agents (or the default) are used. */
21
+ agents?: readonly string[];
22
+ /** One shared copy in `.agents/skills`, symlinked from each agent. */
23
+ link?: boolean;
24
+ force?: boolean;
25
+ }
26
+ export interface SkillPlan {
27
+ targets: SkillTarget[];
28
+ plans: TargetPlan[];
29
+ content: string;
30
+ /** True when every target is already current — nothing to do. */
31
+ upToDate: boolean;
32
+ }
33
+ /**
34
+ * Work out which agents to install for and what installing would change.
35
+ * Read-only: nothing is written until {@link applySkillPlan}.
36
+ *
37
+ * When no agents are named we install for the ones actually configured on this
38
+ * machine, falling back to the default agent so a fresh environment still gets
39
+ * something useful rather than silently doing nothing.
40
+ */
41
+ export declare function planSkillInstall(ctx: PathCtx, options: SkillPlanOptions, fs?: FsFacade): Promise<SkillPlan>;
42
+ /** Write a plan produced by {@link planSkillInstall}. */
43
+ export declare function applySkillPlan(plan: SkillPlan, fs?: FsFacade): Promise<ApplyResult>;
44
+ /**
45
+ * Remove ghostrail's skill from every place it is installed under `scope`.
46
+ *
47
+ * Only the paths `scanInstalled` verified as *ours* are removed. It checks each
48
+ * candidate's frontmatter `name` against our identity, so a directory that
49
+ * happens to share the name but holds someone else's skill is left alone. Do not
50
+ * "simplify" this into removing from every agent directory — that deletes
51
+ * foreign files.
52
+ */
53
+ export declare function uninstallSkill(ctx: PathCtx, scope: Scope, fs?: FsFacade): Promise<string[]>;
54
+ /** One human-readable line per target, for the checklist shown before writing. */
55
+ export declare function describePlan(plans: readonly TargetPlan[]): string[];
56
+ //# sourceMappingURL=install.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../src/skill/install.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,KAAK,WAAW,EAIjB,MAAM,8BAA8B,CAAC;AAOtC,OAAO,EAAE,KAAK,QAAQ,EAAU,MAAM,iCAAiC,CAAC;AACxE,OAAO,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAEL,KAAK,OAAO,EAGb,MAAM,iCAAiC,CAAC;AAEzC;;;;GAIG;AAEH,oDAAoD;AACpD,eAAO,MAAM,eAAe,yDAA6B,CAAC;AAE1D,kDAAkD;AAClD,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,MAAM,CAAC,CAKxD;AAED,4EAA4E;AAC5E,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAErF;AAED,MAAM,WAAW,gBAAgB;IAC/B,8EAA8E;IAC9E,KAAK,EAAE,KAAK,CAAC;IACb,oFAAoF;IACpF,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3B,sEAAsE;IACtE,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,iEAAiE;IACjE,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED;;;;;;;GAOG;AACH,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,OAAO,EACZ,OAAO,EAAE,gBAAgB,EACzB,EAAE,GAAE,QAAiB,GACpB,OAAO,CAAC,SAAS,CAAC,CAepB;AAMD,yDAAyD;AACzD,wBAAsB,cAAc,CAAC,IAAI,EAAE,SAAS,EAAE,EAAE,GAAE,QAAiB,GAAG,OAAO,CAAC,WAAW,CAAC,CAEjG;AAED;;;;;;;;GAQG;AACH,wBAAsB,cAAc,CAClC,GAAG,EAAE,OAAO,EACZ,KAAK,EAAE,KAAK,EACZ,EAAE,GAAE,QAAiB,GACpB,OAAO,CAAC,MAAM,EAAE,CAAC,CAQnB;AAED,kFAAkF;AAClF,wBAAgB,YAAY,CAAC,KAAK,EAAE,SAAS,UAAU,EAAE,GAAG,MAAM,EAAE,CAcnE"}
@@ -0,0 +1,93 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import { homedir } from "node:os";
3
+ import { fileURLToPath } from "node:url";
4
+ import { applyPlans, isUpToDate, planTargets, } from "../vendor/skilltend/apply.js";
5
+ import { agentTargets, buildTargets, detectAgents, scanInstalled, } from "../vendor/skilltend/detect.js";
6
+ import { nodeFs } from "../vendor/skilltend/fsFacade.js";
7
+ import { DEFAULT_AGENT, agentByName, skillIdentity, } from "../vendor/skilltend/registry.js";
8
+ /**
9
+ * Ghostrail's adapter over the white-label skilltend engine. Everything
10
+ * ghostrail-specific lives here — the skill's identity, where its content ships,
11
+ * and how the plan is worded — so the engine underneath stays generic.
12
+ */
13
+ /** The identity of the skill ghostrail installs. */
14
+ export const GHOSTRAIL_SKILL = skillIdentity("ghostrail");
15
+ /** Read the `SKILL.md` bundled in the package. */
16
+ export async function readBundledSkill() {
17
+ return readFile(fileURLToPath(new URL("../../skill/ghostrail/SKILL.md", import.meta.url)), "utf8");
18
+ }
19
+ /** Build the path context the engine resolves agent directories against. */
20
+ export function pathCtx(env, cwd) {
21
+ return { home: homedir(), cwd, env };
22
+ }
23
+ /**
24
+ * Work out which agents to install for and what installing would change.
25
+ * Read-only: nothing is written until {@link applySkillPlan}.
26
+ *
27
+ * When no agents are named we install for the ones actually configured on this
28
+ * machine, falling back to the default agent so a fresh environment still gets
29
+ * something useful rather than silently doing nothing.
30
+ */
31
+ export async function planSkillInstall(ctx, options, fs = nodeFs) {
32
+ const content = await readBundledSkill();
33
+ const method = options.link === true ? "link" : "copy";
34
+ let targets;
35
+ if (options.agents !== undefined && options.agents.length > 0) {
36
+ targets = agentTargets([...options.agents], options.scope, ctx, GHOSTRAIL_SKILL, method);
37
+ }
38
+ else {
39
+ const detected = await detectAgents(ctx, fs);
40
+ const agents = detected.length > 0 ? detected : [agentByName(DEFAULT_AGENT)].filter(isEntry);
41
+ targets = buildTargets(agents, options.scope, ctx, GHOSTRAIL_SKILL, method);
42
+ }
43
+ const plans = await planTargets(targets, content, GHOSTRAIL_SKILL, fs, options.force ?? false);
44
+ return { targets, plans, content, upToDate: isUpToDate(plans) };
45
+ }
46
+ function isEntry(value) {
47
+ return value !== undefined;
48
+ }
49
+ /** Write a plan produced by {@link planSkillInstall}. */
50
+ export async function applySkillPlan(plan, fs = nodeFs) {
51
+ return applyPlans(plan.plans, plan.content, fs);
52
+ }
53
+ /**
54
+ * Remove ghostrail's skill from every place it is installed under `scope`.
55
+ *
56
+ * Only the paths `scanInstalled` verified as *ours* are removed. It checks each
57
+ * candidate's frontmatter `name` against our identity, so a directory that
58
+ * happens to share the name but holds someone else's skill is left alone. Do not
59
+ * "simplify" this into removing from every agent directory — that deletes
60
+ * foreign files.
61
+ */
62
+ export async function uninstallSkill(ctx, scope, fs = nodeFs) {
63
+ const found = await scanInstalled(ctx, scope, fs, GHOSTRAIL_SKILL);
64
+ const removed = [];
65
+ for (const target of found) {
66
+ await fs.rm(target.path);
67
+ removed.push(target.path);
68
+ }
69
+ return removed;
70
+ }
71
+ /** One human-readable line per target, for the checklist shown before writing. */
72
+ export function describePlan(plans) {
73
+ return plans.map((p) => {
74
+ const where = `${p.target.label} — ${p.target.managedPath}`;
75
+ switch (p.action) {
76
+ case "create":
77
+ return ` install ${where}`;
78
+ case "update":
79
+ return ` update ${where}${versionArrow(p)}`;
80
+ case "unchanged":
81
+ return ` current ${where}`;
82
+ case "conflict":
83
+ return ` CONFLICT ${where}\n ${p.conflictReason ?? "refusing to overwrite"}`;
84
+ }
85
+ });
86
+ }
87
+ function versionArrow(plan) {
88
+ const { oldVersion, newVersion } = plan;
89
+ if (oldVersion === null && newVersion === null)
90
+ return "";
91
+ return ` (${oldVersion ?? "?"} -> ${newVersion ?? "?"})`;
92
+ }
93
+ //# sourceMappingURL=install.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/skill/install.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import type { EligibleFilter } from "../config/schema.js";
2
- import type { Source, WorkItem } from "../loop/ports.js";
2
+ import type { Comment, SubIssueSpec, TriageSource, WorkItem } from "../loop/ports.js";
3
3
  /**
4
4
  * Issues a Linear GraphQL operation and resolves the `data` payload. Injectable
5
5
  * so the network layer can be faked in tests. Implementations should throw on a
@@ -17,19 +17,57 @@ interface IssueNode {
17
17
  id: string;
18
18
  identifier: string;
19
19
  title: string;
20
- url: string;
20
+ /** Optional: a node is kept even without a url (which is only for display). */
21
+ url?: string;
21
22
  }
22
23
  export declare const ELIGIBLE_ISSUES_QUERY = "\nquery EligibleIssues($filter: IssueFilter!, $first: Int!) {\n issues(filter: $filter, first: $first, orderBy: updatedAt) {\n nodes { id identifier title url }\n }\n}";
24
+ /** Scope in which to build a filter: the team key, optional project, and, when
25
+ * the assignee is `"me"`, the resolved viewer id to match. */
26
+ export interface FilterScope {
27
+ teamKey?: string;
28
+ project?: string;
29
+ viewerId?: string;
30
+ }
31
+ /**
32
+ * Translate an assignee constraint into a Linear `assignee` sub-filter, or
33
+ * undefined when there is nothing to filter. `"unassigned"` matches a null
34
+ * assignee; `"me"` matches `viewerId` (dropped if the viewer is unresolved, so
35
+ * we never accidentally match everyone); anything containing `@` matches by
36
+ * email; otherwise by user id.
37
+ */
38
+ export declare function assigneeClause(assignee: string | undefined, viewerId?: string): Record<string, unknown> | undefined;
23
39
  /**
24
- * Build the Linear `IssueFilter` for an eligibility spec: state name, each label
25
- * (via `and`), unassigned, and optionally scoped to a team key. Only the
26
- * provided fields are included.
40
+ * Build the Linear `IssueFilter` for an eligibility spec. Every provided
41
+ * constraint is combined (implicit AND): team key, project name, state name,
42
+ * assignee, and each label (via `and`). Only the provided fields are included.
27
43
  */
28
- export declare function buildIssueFilter(eligible: EligibleFilter, teamKey?: string): Record<string, unknown>;
44
+ export declare function buildIssueFilter(eligible: EligibleFilter, scope?: FilterScope): Record<string, unknown>;
29
45
  /** Extract issue nodes from an `issues` query payload, ignoring malformed nodes. */
30
46
  export declare function parseIssueNodes(data: Record<string, unknown>): IssueNode[];
47
+ /** Extract child issues from an `issue.children` payload, skipping malformed nodes. */
48
+ export declare function parseChildIssues(data: Record<string, unknown>): IssueNode[];
49
+ /** Extract comments from an `issue.comments` payload, oldest-first as returned. */
50
+ export declare function parseComments(data: Record<string, unknown>): Comment[];
51
+ /** One assignment-relevant issue-history entry. */
52
+ export interface HistoryEntry {
53
+ createdAt: string;
54
+ fromAssigneeId: string | null;
55
+ toAssigneeId: string | null;
56
+ }
57
+ /** Extract assignment history entries from an `issue.history` payload. */
58
+ export declare function parseHistory(data: Record<string, unknown>): HistoryEntry[];
59
+ /**
60
+ * The assignee an issue had immediately before the bot (`botId`) was assigned to
61
+ * it: the `fromAssignee` of the most recent history entry whose `toAssignee` is
62
+ * the bot. Returns null when there was no prior assignee (or no such event), so
63
+ * the caller unassigns.
64
+ */
65
+ export declare function lastAssigneeBeforeBot(history: HistoryEntry[], botId: string): string | null;
31
66
  export interface LinearSourceOptions {
32
- teamKey: string;
67
+ /** The team key, e.g. "TJ". */
68
+ team: string;
69
+ /** Optional Linear project name to scope eligibility to. */
70
+ project?: string;
33
71
  eligible: EligibleFilter;
34
72
  /** State to claim into; defaults to "In Progress". */
35
73
  inProgressState?: string;
@@ -43,7 +81,7 @@ export interface LinearSourceOptions {
43
81
  * in-progress state and assigns it to the acting user, which removes it from the
44
82
  * eligible pool; reset returns it to the reset state, unassigned.
45
83
  */
46
- export declare class LinearSource implements Source {
84
+ export declare class LinearSource implements TriageSource {
47
85
  private readonly request;
48
86
  private readonly opts;
49
87
  private bootstrap?;
@@ -52,8 +90,13 @@ export declare class LinearSource implements Source {
52
90
  listEligible(): Promise<WorkItem[]>;
53
91
  claim(item: WorkItem): Promise<boolean>;
54
92
  comment(item: WorkItem, body: string): Promise<void>;
93
+ listComments(item: WorkItem): Promise<Comment[]>;
55
94
  reassignToHuman(item: WorkItem): Promise<void>;
56
95
  reset(item: WorkItem): Promise<void>;
96
+ listSubIssues(parent: WorkItem): Promise<WorkItem[]>;
97
+ createSubIssue(parent: WorkItem, spec: SubIssueSpec): Promise<WorkItem>;
98
+ linkBlockedBy(blocked: WorkItem, blocker: WorkItem): Promise<void>;
99
+ markDecomposed(parent: WorkItem): Promise<void>;
57
100
  private ensureBootstrap;
58
101
  private uuidFor;
59
102
  }
@@ -1 +1 @@
1
- {"version":3,"file":"linear.d.ts","sourceRoot":"","sources":["../../src/source/linear.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEzD;;;;GAIG;AACH,MAAM,MAAM,eAAe,GAAG,CAC5B,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAC/B,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;AAEtC,eAAO,MAAM,eAAe,mCAAmC,CAAC;AAEhE;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,MAAM,EACd,QAAQ,GAAE,MAAwB,EAClC,SAAS,GAAE,OAAO,KAAa,GAC9B,eAAe,CAgBjB;AAED,oEAAoE;AACpE,UAAU,SAAS;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;CACb;AAED,eAAO,MAAM,qBAAqB,iLAKhC,CAAC;AAEH;;;;GAIG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,cAAc,EACxB,OAAO,CAAC,EAAE,MAAM,GACf,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CASzB;AAED,oFAAoF;AACpF,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EAAE,CAkB1E;AA0BD,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,cAAc,CAAC;IACzB,sDAAsD;IACtD,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,sEAAsE;IACtE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;;GAKG;AACH,qBAAa,YAAa,YAAW,MAAM;IACzC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAkB;IAC1C,OAAO,CAAC,QAAQ,CAAC,IAAI,CAEnB;IACF,OAAO,CAAC,SAAS,CAAC,CAAY;IAC9B,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAA6B;gBAElD,OAAO,EAAE,eAAe,EAAE,IAAI,EAAE,mBAAmB;IAWzD,YAAY,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;IAUnC,KAAK,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC;IAUvC,OAAO,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIpD,eAAe,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ9C,KAAK,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;YAS5B,eAAe;YAmBf,OAAO;CAKtB"}
1
+ {"version":3,"file":"linear.d.ts","sourceRoot":"","sources":["../../src/source/linear.ts"],"names":[],"mappings":"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"}