@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.
- package/LICENSE +21 -0
- package/README.md +22 -43
- package/package.json +56 -6
- package/schemas/config.json +74 -0
- package/schemas/vcs.json +79 -0
- package/schemas/workspaces.json +1029 -0
- package/schemas/youtrack.json +84 -0
- package/scripts/analyze-release-scope.ts +215 -0
- package/scripts/bundled-deps.json +131 -0
- package/scripts/fixtures/sample-plan.md +15 -0
- package/scripts/fixtures/sample-sdd/progress.md +2 -0
- package/scripts/install-codex-plugin.sh +28 -0
- package/scripts/install-cursor-plugin.sh +146 -0
- package/scripts/install-opencode-plugin.sh +79 -0
- package/scripts/install-pi-package.sh +56 -0
- package/scripts/lib/config-dir.sh +28 -0
- package/scripts/publish-changed-packages.ts +395 -0
- package/scripts/rewrite-workspace-deps.ts +53 -0
- package/scripts/run-cursor-mcp.sh +6 -0
- package/scripts/sync-release-manifests.ts +82 -0
- package/scripts/sync-runtime.sh +142 -0
- package/scripts/validate-cursor-marketplace.ts +171 -0
- package/scripts/verify-bundle-sources.ts +134 -0
- package/scripts/write-schemas.ts +16 -0
- package/skills/workit-architecture/SKILL.md +72 -0
- package/skills/workit-architecture/agents/openai.yaml +3 -0
- package/skills/workit-architecture/references/instruction-files.md +52 -0
- package/skills/workit-architecture/references/vocabulary.md +53 -0
- package/skills/workit-bdd/SKILL.md +53 -0
- package/skills/workit-continue/SKILL.md +54 -0
- package/skills/workit-debug/SKILL.md +45 -0
- package/skills/workit-deslop/SKILL.md +58 -0
- package/skills/workit-fanout/SKILL.md +71 -0
- package/skills/workit-fanout/references/brief.md +141 -0
- package/skills/workit-fanout/references/orchestration.md +169 -0
- package/skills/workit-implement/SKILL.md +71 -0
- package/skills/workit-retro/SKILL.md +72 -0
- package/skills/workit-retro/agents/openai.yaml +3 -0
- package/skills/workit-retro/references/sources.md +35 -0
- package/skills/workit-retro/references/steering.md +39 -0
- package/skills/workit-review/SKILL.md +66 -0
- package/skills/workit-review/references/impact.md +24 -0
- package/skills/workit-shape/SKILL.md +71 -0
- package/skills/workit-shape/references/diagrams.md +17 -0
- package/skills/workit-shape/references/knowledge.md +61 -0
- package/skills/workit-shape/references/mockups.md +15 -0
- package/skills/workit-shape/references/slicing.md +44 -0
- package/skills/workit-ship/SKILL.md +71 -0
- package/skills/workit-ship/references/changelog.md +44 -0
- package/skills/workit-ship/references/pr-body.md +32 -0
- package/skills/workit-ship/references/release.md +39 -0
- package/skills/workit-test-audit/SKILL.md +54 -0
- package/skills/workit-verify-app/SKILL.md +68 -0
- package/skills/workit-verify-app/references/template.md +51 -0
- package/src/autonomy.ts +910 -0
- package/src/check-config.ts +613 -0
- package/src/checks.ts +534 -0
- package/src/ci-waiter.ts +159 -0
- package/src/core/boundary.ts +55 -0
- package/src/core/branch-policy.ts +112 -0
- package/src/core/branch.ts +1192 -0
- package/src/core/changelog-gate.ts +349 -0
- package/src/core/changelog-merge.ts +214 -0
- package/src/core/changelog.ts +392 -0
- package/src/core/cleanup.ts +638 -0
- package/src/core/cli-locate.ts +173 -0
- package/src/core/commit-flavors.ts +65 -0
- package/src/core/config-schemas.ts +653 -0
- package/src/core/config.ts +351 -0
- package/src/core/context-read.ts +144 -0
- package/src/core/docs-gate.ts +69 -0
- package/src/core/finding-evidence.ts +89 -0
- package/src/core/finding-queue.ts +36 -0
- package/src/core/git.ts +73 -0
- package/src/core/gitignore.ts +52 -0
- package/src/core/heavy-eta.ts +170 -0
- package/src/core/heavy-lease.ts +290 -0
- package/src/core/heavy-rules.ts +373 -0
- package/src/core/heavy-scope.ts +131 -0
- package/src/core/heavy-words.ts +83 -0
- package/src/core/heavy.ts +535 -0
- package/src/core/hygiene.ts +149 -0
- package/src/core/init.ts +218 -0
- package/src/core/live-session.ts +333 -0
- package/src/core/logger.ts +310 -0
- package/src/core/methods.ts +185 -0
- package/src/core/model-fallback.ts +208 -0
- package/src/core/node-resolve.mjs +249 -0
- package/src/core/operation-input.ts +632 -0
- package/src/core/package-root.ts +28 -0
- package/src/core/policy/attributes.ts +97 -0
- package/src/core/policy/bookkeeping.ts +119 -0
- package/src/core/policy/carry.ts +122 -0
- package/src/core/policy/check-evidence.ts +115 -0
- package/src/core/policy/current-judgment.ts +20 -0
- package/src/core/policy/derive.ts +387 -0
- package/src/core/policy/judgment.ts +246 -0
- package/src/core/policy/lane.ts +562 -0
- package/src/core/policy/pr-lane.ts +32 -0
- package/src/core/policy/substance.ts +365 -0
- package/src/core/policy-resolver.ts +94 -0
- package/src/core/pr-create.ts +448 -0
- package/src/core/pr-template.ts +162 -0
- package/src/core/release-notes.ts +197 -0
- package/src/core/release-tracks.ts +779 -0
- package/src/core/remotes.ts +436 -0
- package/src/core/repo-context.ts +542 -0
- package/src/core/repo-paths.ts +29 -0
- package/src/core/resources.ts +1299 -0
- package/src/core/role-models.ts +603 -0
- package/src/core/route-intent.ts +305 -0
- package/src/core/rules.ts +65 -0
- package/src/core/runtime-identity.ts +63 -0
- package/src/core/safe-write.ts +87 -0
- package/src/core/scope-glob.ts +56 -0
- package/src/core/scripts.ts +6 -0
- package/src/core/skill-manifests.ts +173 -0
- package/src/core/store-lock.ts +374 -0
- package/src/core/support-matrix.ts +24 -0
- package/src/core/task-context.ts +247 -0
- package/src/core/task-contract.ts +1279 -0
- package/src/core/task-delivery.ts +109 -0
- package/src/core/task-engine.ts +2248 -0
- package/src/core/task-evaluation.ts +1147 -0
- package/src/core/task-store.ts +2649 -0
- package/src/core/task-view.ts +180 -0
- package/src/core/templates.ts +22 -0
- package/src/core/tracker-issues.ts +174 -0
- package/src/core/vcs-config.ts +540 -0
- package/src/core/workers.ts +62 -0
- package/src/core/workit-paths.mjs +242 -0
- package/src/core/workspace-branch-policy.ts +123 -0
- package/src/core/workspaces.ts +1745 -0
- package/src/core/youtrack-backend.ts +288 -0
- package/src/core/youtrack-tools.ts +260 -0
- package/src/core/youtrack-writes.ts +73 -0
- package/src/core/youtrack-ytrack.ts +217 -0
- package/src/core/youtrack.ts +454 -0
- package/src/core/ytrack-skill.ts +297 -0
- package/src/core.ts +171 -0
- package/src/deslop/lex.ts +271 -0
- package/src/deslop/scan.ts +232 -0
- package/src/duration.ts +27 -0
- package/src/fanout-brief.ts +486 -0
- package/src/fanout-check.ts +455 -0
- package/src/fanout-landed.ts +370 -0
- package/src/fanout-stack.ts +108 -0
- package/src/fanout-status.ts +362 -0
- package/src/fanout-worktree.ts +893 -0
- package/src/fanout.ts +1473 -0
- package/src/forge/exec.ts +385 -0
- package/src/forge/github.ts +831 -0
- package/src/forge/gitlab.ts +906 -0
- package/src/forge/issue-forge.ts +209 -0
- package/src/forge/issue-link.ts +468 -0
- package/src/forge/issue-ops.ts +314 -0
- package/src/forge/merge-gate-base-red.ts +72 -0
- package/src/forge/pr-body.ts +100 -0
- package/src/forge/pr-edit.ts +292 -0
- package/src/forge/pr-ops.ts +1109 -0
- package/src/forge/pr-status.ts +10 -0
- package/src/forge/redact.ts +195 -0
- package/src/forge/report.ts +994 -0
- package/src/forge/reruns.ts +132 -0
- package/src/forge/resolve.ts +509 -0
- package/src/forge/types.ts +242 -0
- package/src/forge/verify.ts +398 -0
- package/src/git/default-base.ts +130 -0
- package/src/git/env-redirect.ts +28 -0
- package/src/git/facts.ts +122 -0
- package/src/git/ops.ts +1823 -0
- package/src/git/refs-read.ts +332 -0
- package/src/git/release.ts +1020 -0
- package/src/git/rev.ts +1175 -0
- package/src/git/session-hook.ts +597 -0
- package/src/git/stage.ts +63 -0
- package/src/hooks/agent-model.ts +149 -0
- package/src/hooks/budget-signal.ts +284 -0
- package/src/hooks/context.ts +461 -0
- package/src/hooks/cwd-normalize.ts +79 -0
- package/src/hooks/deadline.ts +228 -0
- package/src/hooks/delivery-verbs.ts +182 -0
- package/src/hooks/descriptor.ts +124 -0
- package/src/hooks/handle.ts +433 -0
- package/src/hooks/heavy-gate.ts +99 -0
- package/src/hooks/hook-runs.ts +130 -0
- package/src/hooks/hosts/claude-code.ts +380 -0
- package/src/hooks/hosts/codex.ts +372 -0
- package/src/hooks/hosts/cursor.ts +419 -0
- package/src/hooks/hosts/fields.ts +98 -0
- package/src/hooks/hosts/opencode.ts +79 -0
- package/src/hooks/hosts/pi.ts +78 -0
- package/src/hooks/index.ts +60 -0
- package/src/hooks/model-limit.ts +378 -0
- package/src/hooks/model-switch.ts +35 -0
- package/src/hooks/policy.ts +29 -0
- package/src/hooks/process.ts +48 -0
- package/src/hooks/protocol.ts +135 -0
- package/src/hooks/raw-git.ts +2289 -0
- package/src/hooks/repeat-failure.ts +115 -0
- package/src/hooks/run.ts +54 -0
- package/src/hooks/session-marker.ts +151 -0
- package/src/hooks/shell-words.ts +532 -0
- package/src/hooks/skill-nudge.ts +295 -0
- package/src/hooks/spawn-gate.ts +72 -0
- package/src/hooks/standing-signal.ts +99 -0
- package/src/hooks/standing.ts +225 -0
- package/src/hooks/steering.ts +74 -0
- package/src/hooks/stop.ts +408 -0
- package/src/hooks/worktree-confine.ts +415 -0
- package/src/hooks/write-gate.ts +1174 -0
- package/src/host-session.ts +459 -0
- package/src/knowledge.ts +368 -0
- package/src/ledger.ts +2913 -0
- package/src/stack.ts +2570 -0
- package/src/store/event-log.ts +217 -0
- package/src/store/notes.ts +29 -0
- package/src/store/patch.ts +135 -0
- package/src/store/paths.ts +368 -0
- package/src/store/reduce.ts +203 -0
- package/src/test-audit-mocks.ts +309 -0
- package/src/verdict-cover.ts +151 -0
- package/src/worktree-deps.ts +142 -0
- package/templates/headers.md +3 -0
- package/templates/hygiene/.editorconfig +8 -0
- package/templates/hygiene/.gitattributes +3 -0
- package/templates/hygiene/CHANGELOG.md +14 -0
- package/templates/hygiene/CONTRIBUTING.md +3 -0
- package/templates/hygiene/LICENSE +21 -0
- package/templates/hygiene/README.md +3 -0
- package/templates/issue-update.md +5 -0
- package/templates/plan-template.md +26 -0
- package/templates/spec-template.md +64 -0
- 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
|
+
};
|