Skip to content

Commit 1dd2b2f

Browse files
roodboiclaude
andcommitted
chore: tickets opt-in by default, registry prune, CI + perf cleanup
Tickets integrations (skill install/check, doc upsert) now apply only when the tickets extension is enabled for the scope; hack setup tickets notes optional/legacy status. hack projects prune removes registry entries with missing repo roots and works with docker down; --json emits the standard envelope. findExecutableInPath honors runtime PATH. Deterministic test runner deleted (plain bun test is order-independent now). Planet animation data lazily imported out of the startup module graph. Stale github/linear extension entries disabled in this repo's config. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
1 parent b575b78 commit 1dd2b2f

14 files changed

Lines changed: 767 additions & 354 deletions

File tree

.hack/hack.config.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,13 @@
55
"controlPlane": {
66
"extensions": {
77
"dance.hack.github": {
8-
"enabled": true
8+
"enabled": false
99
},
1010
"dance.hack.tickets": {
1111
"enabled": false
1212
},
1313
"dance.hack.linear": {
14-
"enabled": true
14+
"enabled": false
1515
}
1616
},
1717
"gateway": {

packages/cli/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
"macos:ghostty:setup": "cd ../.. && bun run scripts/macos-ghostty-setup.ts",
2525
"macos:ghostty:bundle": "cd ../.. && bun run scripts/macos-ghostty-bundle.ts",
2626
"typecheck": "bunx tsc -p tsconfig.json --noEmit",
27-
"test": "cd ../.. && bun run scripts/run-tests-deterministic.ts",
27+
"test": "cd ../.. && bun test",
2828
"check": "cd ../.. && bunx ultracite check src packages/cli/index.ts index.ts scripts/build-release.ts scripts/build-node-runtime-image.ts scripts/install-cli.ts scripts/install-status.ts scripts/uninstall-cli.ts scripts/macos-ghostty-bundle.ts scripts/macos-ghostty-setup.ts",
2929
"lint": "bun run check"
3030
}

scripts/run-tests-deterministic.ts

Lines changed: 0 additions & 154 deletions
This file was deleted.

src/cli/integration-sync.ts

Lines changed: 37 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
import { checkClaudeHooks, installClaudeHooks } from "../agents/claude.ts";
22
import { checkCodexSkill, installCodexSkill } from "../agents/codex-skill.ts";
33
import { checkCursorRules, installCursorRules } from "../agents/cursor.ts";
4+
import { resolveTicketsIntegrationEnablement } from "../control-plane/extensions/tickets/enablement.ts";
45
import {
56
checkTicketsSkill,
67
installTicketsSkill,
8+
type TicketsSkillResult,
79
} from "../control-plane/extensions/tickets/tickets-skill.ts";
810
import { findProjectContext } from "../lib/project.ts";
911
import {
@@ -112,6 +114,10 @@ function resolveIntegrationSyncMode(): IntegrationSyncMode {
112114
async function detectIntegrationDrift(opts: {
113115
readonly projectRoot: string;
114116
}): Promise<{ readonly hasDrift: boolean }> {
117+
const ticketsEnablement = await resolveTicketsIntegrationEnablement({
118+
projectRoot: opts.projectRoot,
119+
});
120+
115121
const [
116122
cursorProject,
117123
cursorUser,
@@ -131,8 +137,12 @@ async function detectIntegrationDrift(opts: {
131137
checkClaudeHooks({ scope: "user" }),
132138
checkCodexSkill({ scope: "project", projectRoot: opts.projectRoot }),
133139
checkCodexSkill({ scope: "user" }),
134-
checkTicketsSkill({ scope: "project", projectRoot: opts.projectRoot }),
135-
checkTicketsSkill({ scope: "user" }),
140+
ticketsEnablement.project
141+
? checkTicketsSkill({ scope: "project", projectRoot: opts.projectRoot })
142+
: skippedTicketsResult({ scope: "project" }),
143+
ticketsEnablement.global
144+
? checkTicketsSkill({ scope: "user" })
145+
: skippedTicketsResult({ scope: "user" }),
136146
checkMcpConfig({
137147
scope: "project",
138148
projectRoot: opts.projectRoot,
@@ -172,6 +182,21 @@ function hasSingleCheckDrift(status: string): boolean {
172182
return status !== "noop";
173183
}
174184

185+
/**
186+
* Placeholder result for tickets integrations when the tickets extension is
187+
* disabled for the checked scope. Tickets is optional/legacy: its skill must
188+
* never count as drift (or get auto-installed) unless explicitly enabled.
189+
*/
190+
function skippedTicketsResult(opts: {
191+
readonly scope: "project" | "user";
192+
}): TicketsSkillResult {
193+
return {
194+
scope: opts.scope,
195+
status: "noop",
196+
path: "(tickets extension disabled)",
197+
};
198+
}
199+
175200
function hasMcpDrift(opts: {
176201
readonly checks: readonly McpCheckResult[];
177202
}): boolean {
@@ -187,6 +212,10 @@ function hasDocDrift(opts: {
187212
async function autoSyncIntegrations(opts: {
188213
readonly projectRoot: string;
189214
}): Promise<{ readonly ok: boolean }> {
215+
const ticketsEnablement = await resolveTicketsIntegrationEnablement({
216+
projectRoot: opts.projectRoot,
217+
});
218+
190219
const [
191220
cursorProject,
192221
cursorUser,
@@ -206,8 +235,12 @@ async function autoSyncIntegrations(opts: {
206235
installClaudeHooks({ scope: "user" }),
207236
installCodexSkill({ scope: "project", projectRoot: opts.projectRoot }),
208237
installCodexSkill({ scope: "user" }),
209-
installTicketsSkill({ scope: "project", projectRoot: opts.projectRoot }),
210-
installTicketsSkill({ scope: "user" }),
238+
ticketsEnablement.project
239+
? installTicketsSkill({ scope: "project", projectRoot: opts.projectRoot })
240+
: skippedTicketsResult({ scope: "project" }),
241+
ticketsEnablement.global
242+
? installTicketsSkill({ scope: "user" })
243+
: skippedTicketsResult({ scope: "user" }),
211244
installMcpConfig({
212245
scope: "project",
213246
projectRoot: opts.projectRoot,

src/commands/env.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -770,6 +770,16 @@ function rewriteUrlLikeValueForHostExecution(input: {
770770
return `${prefix}${rewrittenHost}${suffix}`;
771771
}
772772

773+
/**
774+
* @deprecated v2→v3 legacy `.env`→`hack.env` migration shim. Only fires for
775+
* projects that still carry a v2 env contract without the v3 config files.
776+
* The underlying migrator is `migrateLegacyProjectEnv` in
777+
* `src/lib/project-env-config.ts`.
778+
*
779+
* TODO(remove: v3.2): drop this migration path (and its callers in
780+
* project/doctor/session command flows) once v2 projects are no longer
781+
* supported.
782+
*/
773783
async function maybeMigrateLegacyProjectEnv(input: {
774784
readonly project: ProjectContext;
775785
readonly projectName: string;

0 commit comments

Comments
 (0)