@workit-dev/core 0.0.1 → 1.0.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 (234) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +22 -43
  3. package/package.json +56 -6
  4. package/schemas/config.json +74 -0
  5. package/schemas/vcs.json +79 -0
  6. package/schemas/workspaces.json +1029 -0
  7. package/schemas/youtrack.json +84 -0
  8. package/scripts/analyze-release-scope.ts +215 -0
  9. package/scripts/bundled-deps.json +131 -0
  10. package/scripts/fixtures/sample-plan.md +15 -0
  11. package/scripts/fixtures/sample-sdd/progress.md +2 -0
  12. package/scripts/install-codex-plugin.sh +28 -0
  13. package/scripts/install-cursor-plugin.sh +146 -0
  14. package/scripts/install-opencode-plugin.sh +79 -0
  15. package/scripts/install-pi-package.sh +56 -0
  16. package/scripts/lib/config-dir.sh +28 -0
  17. package/scripts/publish-changed-packages.ts +395 -0
  18. package/scripts/rewrite-workspace-deps.ts +53 -0
  19. package/scripts/run-cursor-mcp.sh +6 -0
  20. package/scripts/sync-release-manifests.ts +82 -0
  21. package/scripts/sync-runtime.sh +142 -0
  22. package/scripts/validate-cursor-marketplace.ts +171 -0
  23. package/scripts/verify-bundle-sources.ts +134 -0
  24. package/scripts/write-schemas.ts +16 -0
  25. package/skills/workit-architecture/SKILL.md +72 -0
  26. package/skills/workit-architecture/agents/openai.yaml +3 -0
  27. package/skills/workit-architecture/references/instruction-files.md +52 -0
  28. package/skills/workit-architecture/references/vocabulary.md +53 -0
  29. package/skills/workit-bdd/SKILL.md +53 -0
  30. package/skills/workit-continue/SKILL.md +54 -0
  31. package/skills/workit-debug/SKILL.md +45 -0
  32. package/skills/workit-deslop/SKILL.md +58 -0
  33. package/skills/workit-fanout/SKILL.md +71 -0
  34. package/skills/workit-fanout/references/brief.md +141 -0
  35. package/skills/workit-fanout/references/orchestration.md +169 -0
  36. package/skills/workit-implement/SKILL.md +71 -0
  37. package/skills/workit-retro/SKILL.md +72 -0
  38. package/skills/workit-retro/agents/openai.yaml +3 -0
  39. package/skills/workit-retro/references/sources.md +35 -0
  40. package/skills/workit-retro/references/steering.md +39 -0
  41. package/skills/workit-review/SKILL.md +66 -0
  42. package/skills/workit-review/references/impact.md +24 -0
  43. package/skills/workit-shape/SKILL.md +71 -0
  44. package/skills/workit-shape/references/diagrams.md +17 -0
  45. package/skills/workit-shape/references/knowledge.md +61 -0
  46. package/skills/workit-shape/references/mockups.md +15 -0
  47. package/skills/workit-shape/references/slicing.md +44 -0
  48. package/skills/workit-ship/SKILL.md +71 -0
  49. package/skills/workit-ship/references/changelog.md +44 -0
  50. package/skills/workit-ship/references/pr-body.md +32 -0
  51. package/skills/workit-ship/references/release.md +39 -0
  52. package/skills/workit-test-audit/SKILL.md +54 -0
  53. package/skills/workit-verify-app/SKILL.md +68 -0
  54. package/skills/workit-verify-app/references/template.md +51 -0
  55. package/src/autonomy.ts +910 -0
  56. package/src/check-config.ts +613 -0
  57. package/src/checks.ts +534 -0
  58. package/src/ci-waiter.ts +159 -0
  59. package/src/core/boundary.ts +55 -0
  60. package/src/core/branch-policy.ts +112 -0
  61. package/src/core/branch.ts +1192 -0
  62. package/src/core/changelog-gate.ts +349 -0
  63. package/src/core/changelog-merge.ts +214 -0
  64. package/src/core/changelog.ts +392 -0
  65. package/src/core/cleanup.ts +638 -0
  66. package/src/core/cli-locate.ts +173 -0
  67. package/src/core/commit-flavors.ts +65 -0
  68. package/src/core/config-schemas.ts +653 -0
  69. package/src/core/config.ts +351 -0
  70. package/src/core/context-read.ts +144 -0
  71. package/src/core/docs-gate.ts +69 -0
  72. package/src/core/finding-evidence.ts +89 -0
  73. package/src/core/finding-queue.ts +36 -0
  74. package/src/core/git.ts +73 -0
  75. package/src/core/gitignore.ts +52 -0
  76. package/src/core/heavy-eta.ts +170 -0
  77. package/src/core/heavy-lease.ts +290 -0
  78. package/src/core/heavy-rules.ts +373 -0
  79. package/src/core/heavy-scope.ts +131 -0
  80. package/src/core/heavy-words.ts +83 -0
  81. package/src/core/heavy.ts +535 -0
  82. package/src/core/hygiene.ts +149 -0
  83. package/src/core/init.ts +218 -0
  84. package/src/core/live-session.ts +333 -0
  85. package/src/core/logger.ts +310 -0
  86. package/src/core/methods.ts +185 -0
  87. package/src/core/model-fallback.ts +208 -0
  88. package/src/core/node-resolve.mjs +249 -0
  89. package/src/core/operation-input.ts +632 -0
  90. package/src/core/package-root.ts +28 -0
  91. package/src/core/policy/attributes.ts +97 -0
  92. package/src/core/policy/bookkeeping.ts +119 -0
  93. package/src/core/policy/carry.ts +122 -0
  94. package/src/core/policy/check-evidence.ts +115 -0
  95. package/src/core/policy/current-judgment.ts +20 -0
  96. package/src/core/policy/derive.ts +387 -0
  97. package/src/core/policy/judgment.ts +246 -0
  98. package/src/core/policy/lane.ts +562 -0
  99. package/src/core/policy/pr-lane.ts +32 -0
  100. package/src/core/policy/substance.ts +365 -0
  101. package/src/core/policy-resolver.ts +94 -0
  102. package/src/core/pr-create.ts +448 -0
  103. package/src/core/pr-template.ts +162 -0
  104. package/src/core/release-notes.ts +197 -0
  105. package/src/core/release-tracks.ts +779 -0
  106. package/src/core/remotes.ts +436 -0
  107. package/src/core/repo-context.ts +542 -0
  108. package/src/core/repo-paths.ts +29 -0
  109. package/src/core/resources.ts +1299 -0
  110. package/src/core/role-models.ts +603 -0
  111. package/src/core/route-intent.ts +305 -0
  112. package/src/core/rules.ts +65 -0
  113. package/src/core/runtime-identity.ts +63 -0
  114. package/src/core/safe-write.ts +87 -0
  115. package/src/core/scope-glob.ts +56 -0
  116. package/src/core/scripts.ts +6 -0
  117. package/src/core/skill-manifests.ts +173 -0
  118. package/src/core/store-lock.ts +374 -0
  119. package/src/core/support-matrix.ts +24 -0
  120. package/src/core/task-context.ts +247 -0
  121. package/src/core/task-contract.ts +1279 -0
  122. package/src/core/task-delivery.ts +109 -0
  123. package/src/core/task-engine.ts +2248 -0
  124. package/src/core/task-evaluation.ts +1147 -0
  125. package/src/core/task-store.ts +2649 -0
  126. package/src/core/task-view.ts +180 -0
  127. package/src/core/templates.ts +22 -0
  128. package/src/core/tracker-issues.ts +174 -0
  129. package/src/core/vcs-config.ts +540 -0
  130. package/src/core/workers.ts +62 -0
  131. package/src/core/workit-paths.mjs +242 -0
  132. package/src/core/workspace-branch-policy.ts +123 -0
  133. package/src/core/workspaces.ts +1745 -0
  134. package/src/core/youtrack-backend.ts +288 -0
  135. package/src/core/youtrack-tools.ts +260 -0
  136. package/src/core/youtrack-writes.ts +73 -0
  137. package/src/core/youtrack-ytrack.ts +217 -0
  138. package/src/core/youtrack.ts +454 -0
  139. package/src/core/ytrack-skill.ts +297 -0
  140. package/src/core.ts +171 -0
  141. package/src/deslop/lex.ts +271 -0
  142. package/src/deslop/scan.ts +232 -0
  143. package/src/duration.ts +27 -0
  144. package/src/fanout-brief.ts +486 -0
  145. package/src/fanout-check.ts +455 -0
  146. package/src/fanout-landed.ts +370 -0
  147. package/src/fanout-stack.ts +108 -0
  148. package/src/fanout-status.ts +362 -0
  149. package/src/fanout-worktree.ts +893 -0
  150. package/src/fanout.ts +1473 -0
  151. package/src/forge/exec.ts +385 -0
  152. package/src/forge/github.ts +831 -0
  153. package/src/forge/gitlab.ts +906 -0
  154. package/src/forge/issue-forge.ts +209 -0
  155. package/src/forge/issue-link.ts +468 -0
  156. package/src/forge/issue-ops.ts +314 -0
  157. package/src/forge/merge-gate-base-red.ts +72 -0
  158. package/src/forge/pr-body.ts +100 -0
  159. package/src/forge/pr-edit.ts +292 -0
  160. package/src/forge/pr-ops.ts +1109 -0
  161. package/src/forge/pr-status.ts +10 -0
  162. package/src/forge/redact.ts +195 -0
  163. package/src/forge/report.ts +994 -0
  164. package/src/forge/reruns.ts +132 -0
  165. package/src/forge/resolve.ts +509 -0
  166. package/src/forge/types.ts +242 -0
  167. package/src/forge/verify.ts +398 -0
  168. package/src/git/default-base.ts +130 -0
  169. package/src/git/env-redirect.ts +28 -0
  170. package/src/git/facts.ts +122 -0
  171. package/src/git/ops.ts +1823 -0
  172. package/src/git/refs-read.ts +332 -0
  173. package/src/git/release.ts +1020 -0
  174. package/src/git/rev.ts +1175 -0
  175. package/src/git/session-hook.ts +597 -0
  176. package/src/git/stage.ts +63 -0
  177. package/src/hooks/agent-model.ts +149 -0
  178. package/src/hooks/budget-signal.ts +284 -0
  179. package/src/hooks/context.ts +461 -0
  180. package/src/hooks/cwd-normalize.ts +79 -0
  181. package/src/hooks/deadline.ts +228 -0
  182. package/src/hooks/delivery-verbs.ts +182 -0
  183. package/src/hooks/descriptor.ts +124 -0
  184. package/src/hooks/handle.ts +433 -0
  185. package/src/hooks/heavy-gate.ts +99 -0
  186. package/src/hooks/hook-runs.ts +130 -0
  187. package/src/hooks/hosts/claude-code.ts +380 -0
  188. package/src/hooks/hosts/codex.ts +372 -0
  189. package/src/hooks/hosts/cursor.ts +419 -0
  190. package/src/hooks/hosts/fields.ts +98 -0
  191. package/src/hooks/hosts/opencode.ts +79 -0
  192. package/src/hooks/hosts/pi.ts +78 -0
  193. package/src/hooks/index.ts +60 -0
  194. package/src/hooks/model-limit.ts +378 -0
  195. package/src/hooks/model-switch.ts +35 -0
  196. package/src/hooks/policy.ts +29 -0
  197. package/src/hooks/process.ts +48 -0
  198. package/src/hooks/protocol.ts +135 -0
  199. package/src/hooks/raw-git.ts +2289 -0
  200. package/src/hooks/repeat-failure.ts +115 -0
  201. package/src/hooks/run.ts +54 -0
  202. package/src/hooks/session-marker.ts +151 -0
  203. package/src/hooks/shell-words.ts +532 -0
  204. package/src/hooks/skill-nudge.ts +295 -0
  205. package/src/hooks/spawn-gate.ts +72 -0
  206. package/src/hooks/standing-signal.ts +99 -0
  207. package/src/hooks/standing.ts +225 -0
  208. package/src/hooks/steering.ts +74 -0
  209. package/src/hooks/stop.ts +408 -0
  210. package/src/hooks/worktree-confine.ts +415 -0
  211. package/src/hooks/write-gate.ts +1174 -0
  212. package/src/host-session.ts +459 -0
  213. package/src/knowledge.ts +368 -0
  214. package/src/ledger.ts +2913 -0
  215. package/src/stack.ts +2570 -0
  216. package/src/store/event-log.ts +217 -0
  217. package/src/store/notes.ts +29 -0
  218. package/src/store/patch.ts +135 -0
  219. package/src/store/paths.ts +368 -0
  220. package/src/store/reduce.ts +203 -0
  221. package/src/test-audit-mocks.ts +309 -0
  222. package/src/verdict-cover.ts +151 -0
  223. package/src/worktree-deps.ts +142 -0
  224. package/templates/headers.md +3 -0
  225. package/templates/hygiene/.editorconfig +8 -0
  226. package/templates/hygiene/.gitattributes +3 -0
  227. package/templates/hygiene/CHANGELOG.md +14 -0
  228. package/templates/hygiene/CONTRIBUTING.md +3 -0
  229. package/templates/hygiene/LICENSE +21 -0
  230. package/templates/hygiene/README.md +3 -0
  231. package/templates/issue-update.md +5 -0
  232. package/templates/plan-template.md +26 -0
  233. package/templates/spec-template.md +64 -0
  234. package/templates/workit-contract.md +13 -0
@@ -0,0 +1,55 @@
1
+ import { statSync } from "node:fs";
2
+ import type { JsonValue } from "./logger";
3
+
4
+ // Named diagnostic boundary events (DG-04) shared by all adapters so event
5
+ // names stay consolidated across OpenCode, Cursor, and the CLI.
6
+ export const EVENT = {
7
+ initialization: "initialization",
8
+ provenance: "provenance",
9
+ assets: "assets",
10
+ configurationSource: "configuration_source",
11
+ hooks: "hooks",
12
+ mcpConnection: "mcp_connection",
13
+ installSteps: "install_steps",
14
+ uncaughtFailure: "uncaught_failure",
15
+ toolsFailed: "tools_failed",
16
+ doctor: "doctor",
17
+ } as const;
18
+
19
+ // Safe error metadata for log events: name + message only. The message passes
20
+ // through the logger's value redaction (tokens, key=value secrets, URL queries,
21
+ // home prefixes); the raw stack never enters a context.
22
+ export const errorDetail = (err: unknown): Record<string, JsonValue> => {
23
+ if (err instanceof Error) {
24
+ return { error_name: err.name, error: err.message };
25
+ }
26
+ return { error_name: "unknown", error: String(err) };
27
+ };
28
+
29
+ export type SourceMarker = { loadedAt: number; files: string[] };
30
+
31
+ /**
32
+ * Long-lived adapters (OpenCode plugin, MCP servers) load core once per
33
+ * process. A marker plus changedSourcesSinceLoad lets them warn once when the
34
+ * checkout sources move underneath the live process, instead of running stale
35
+ * behavior silently. Warning-only: it never blocks a call.
36
+ */
37
+ export const markSourcesLoaded = (
38
+ files: string[],
39
+ loadedAt: number = Date.now(),
40
+ ): SourceMarker => ({
41
+ loadedAt,
42
+ files: [...files],
43
+ });
44
+
45
+ export const changedSourcesSinceLoad = (marker: SourceMarker): string[] => {
46
+ const changed: string[] = [];
47
+ for (const file of marker.files) {
48
+ try {
49
+ if (statSync(file).mtimeMs > marker.loadedAt) changed.push(file);
50
+ } catch {
51
+ // A missing source tells nothing; ignore it.
52
+ }
53
+ }
54
+ return changed;
55
+ };
@@ -0,0 +1,112 @@
1
+ import { spawnSync } from "node:child_process";
2
+ import { PRESETS, type BranchPreset } from "./config";
3
+ import type { IntegrationMode } from "./workspaces";
4
+
5
+ const PREFIXES = {
6
+ feature: "feature/*",
7
+ bugfix: "bugfix/*",
8
+ release: "release/*",
9
+ hotfix: "hotfix/*",
10
+ };
11
+
12
+ /**
13
+ * Local branch names plus origin's remote-tracking ones (`origin/develop`
14
+ * counts as `develop`; a fork or mirror remote's branches do not).
15
+ */
16
+ export const branchNames = (workspaceRoot: string): Set<string> => {
17
+ const r = spawnSync(
18
+ "git",
19
+ ["for-each-ref", "--format=%(refname)", "refs/heads", "refs/remotes/origin"],
20
+ { cwd: workspaceRoot, encoding: "utf8" },
21
+ );
22
+ if (r.status !== 0) return new Set();
23
+ return new Set(
24
+ (r.stdout ?? "")
25
+ .split("\n")
26
+ .filter(Boolean)
27
+ .map((ref) =>
28
+ ref.startsWith("refs/heads/")
29
+ ? ref.slice("refs/heads/".length)
30
+ : ref.slice("refs/remotes/origin/".length),
31
+ ),
32
+ );
33
+ };
34
+
35
+ /**
36
+ * The git-flow production branch: main when it exists (locally or on
37
+ * origin), else master, else main.
38
+ */
39
+ export const productionBranchOf = (names: ReadonlySet<string>): string =>
40
+ names.has("main") ? "main" : names.has("master") ? "master" : "main";
41
+
42
+ export const detectBranchPolicy = (workspaceRoot: string) => {
43
+ const names = branchNames(workspaceRoot);
44
+ const develop = names.has("develop");
45
+ const main = names.has("main");
46
+ const master = names.has("master");
47
+ const root = main ? "main" : master ? "master" : null;
48
+
49
+ if (develop) {
50
+ return {
51
+ preset: "gitflow" as BranchPreset,
52
+ developBranch: "develop",
53
+ integration: "merge" as IntegrationMode,
54
+ protected: root ? [root, "develop"] : ["develop"],
55
+ allowed: [...PRESETS.gitflow.allowed],
56
+ prefixes: PREFIXES,
57
+ };
58
+ }
59
+ if (root === "main") {
60
+ return {
61
+ preset: "github-flow" as BranchPreset,
62
+ developBranch: null,
63
+ integration: "pr" as IntegrationMode,
64
+ protected: [root],
65
+ allowed: ["*"],
66
+ prefixes: PREFIXES,
67
+ };
68
+ }
69
+ if (root === "master") {
70
+ return {
71
+ preset: "trunk-based" as BranchPreset,
72
+ developBranch: null,
73
+ integration: "pr" as IntegrationMode,
74
+ protected: [root],
75
+ allowed: ["*"],
76
+ prefixes: PREFIXES,
77
+ };
78
+ }
79
+ return {
80
+ preset: "gitflow" as BranchPreset,
81
+ developBranch: null,
82
+ integration: "merge" as IntegrationMode,
83
+ protected: [],
84
+ allowed: [],
85
+ prefixes: PREFIXES,
86
+ };
87
+ };
88
+
89
+ /**
90
+ * The preset this repository's branches imply (develop -> gitflow, main ->
91
+ * github-flow, master -> trunk-based), or null when they imply none. Used
92
+ * only when no branch policy is configured anywhere (core/config.ts).
93
+ */
94
+ export const repoBranchPreset = (workspaceRoot: string): BranchPreset | null => {
95
+ const detected = detectBranchPolicy(workspaceRoot);
96
+ return detected.developBranch || detected.allowed.length ? detected.preset : null;
97
+ };
98
+
99
+ /**
100
+ * The release tag prefix (`v` in `v1.4.0`): the branch policy's
101
+ * `releaseTagPrefix` when it names one, else git-flow's own
102
+ * `gitflow.prefix.versiontag` (set but empty is a valid prefix: tags like
103
+ * `1.4.0`), else `v`.
104
+ */
105
+ export const releaseTagPrefixOf = (workspaceRoot: string, policyPrefix?: unknown): string => {
106
+ if (typeof policyPrefix === "string") return policyPrefix.trim();
107
+ const r = spawnSync("git", ["config", "--get", "gitflow.prefix.versiontag"], {
108
+ cwd: workspaceRoot,
109
+ encoding: "utf8",
110
+ });
111
+ return r.status === 0 ? (r.stdout ?? "").trim() : "v";
112
+ };