jumbo-cli 2.7.1 → 2.8.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/assets/skills/jumbo-add-component/SKILL.md +45 -0
- package/assets/skills/jumbo-add-decision/SKILL.md +42 -0
- package/assets/skills/jumbo-add-dependency/SKILL.md +41 -0
- package/assets/skills/jumbo-add-guideline/SKILL.md +47 -0
- package/assets/skills/jumbo-add-invariant/SKILL.md +44 -0
- package/dist/application/context/audience-pains/add/AddAudiencePainCommandHandler.d.ts +1 -2
- package/dist/application/context/audience-pains/add/AddAudiencePainCommandHandler.d.ts.map +1 -1
- package/dist/application/context/audience-pains/add/AddAudiencePainCommandHandler.js +2 -3
- package/dist/application/context/audience-pains/add/AddAudiencePainCommandHandler.js.map +1 -1
- package/dist/application/context/audiences/add/AddAudienceCommandHandler.d.ts +1 -2
- package/dist/application/context/audiences/add/AddAudienceCommandHandler.d.ts.map +1 -1
- package/dist/application/context/audiences/add/AddAudienceCommandHandler.js +2 -3
- package/dist/application/context/audiences/add/AddAudienceCommandHandler.js.map +1 -1
- package/dist/application/context/components/add/AddComponentCommandHandler.js +2 -2
- package/dist/application/context/components/add/AddComponentCommandHandler.js.map +1 -1
- package/dist/application/context/decisions/add/AddDecisionCommandHandler.js +2 -2
- package/dist/application/context/decisions/add/AddDecisionCommandHandler.js.map +1 -1
- package/dist/application/context/goals/add/AddGoalCommandHandler.js +2 -2
- package/dist/application/context/goals/add/AddGoalCommandHandler.js.map +1 -1
- package/dist/application/context/guidelines/add/AddGuidelineCommandHandler.js +2 -2
- package/dist/application/context/guidelines/add/AddGuidelineCommandHandler.js.map +1 -1
- package/dist/application/context/invariants/add/AddInvariantCommandHandler.js +2 -2
- package/dist/application/context/invariants/add/AddInvariantCommandHandler.js.map +1 -1
- package/dist/application/context/project/init/AgentSelection.d.ts +1 -1
- package/dist/application/context/project/init/AgentSelection.d.ts.map +1 -1
- package/dist/application/context/relations/add/AddRelationCommandHandler.js +2 -2
- package/dist/application/context/relations/add/AddRelationCommandHandler.js.map +1 -1
- package/dist/application/context/sessions/start/StartSessionCommandHandler.js +2 -2
- package/dist/application/context/sessions/start/StartSessionCommandHandler.js.map +1 -1
- package/dist/application/context/value-propositions/add/AddValuePropositionCommandHandler.js +2 -2
- package/dist/application/context/value-propositions/add/AddValuePropositionCommandHandler.js.map +1 -1
- package/dist/application/identity/IdGenerator.d.ts +4 -0
- package/dist/application/identity/IdGenerator.d.ts.map +1 -0
- package/dist/application/identity/IdGenerator.js +11 -0
- package/dist/application/identity/IdGenerator.js.map +1 -0
- package/dist/domain/project/CursorRulesContent.d.ts +32 -0
- package/dist/domain/project/CursorRulesContent.d.ts.map +1 -0
- package/dist/domain/project/CursorRulesContent.js +60 -0
- package/dist/domain/project/CursorRulesContent.js.map +1 -0
- package/dist/infrastructure/context/project/init/AgentFileProtocol.d.ts.map +1 -1
- package/dist/infrastructure/context/project/init/AgentFileProtocol.js +6 -2
- package/dist/infrastructure/context/project/init/AgentFileProtocol.js.map +1 -1
- package/dist/infrastructure/context/project/init/CodexConfigurer.d.ts +34 -0
- package/dist/infrastructure/context/project/init/CodexConfigurer.d.ts.map +1 -0
- package/dist/infrastructure/context/project/init/CodexConfigurer.js +43 -0
- package/dist/infrastructure/context/project/init/CodexConfigurer.js.map +1 -0
- package/dist/infrastructure/context/project/init/CopilotConfigurer.d.ts +14 -4
- package/dist/infrastructure/context/project/init/CopilotConfigurer.d.ts.map +1 -1
- package/dist/infrastructure/context/project/init/CopilotConfigurer.js +97 -4
- package/dist/infrastructure/context/project/init/CopilotConfigurer.js.map +1 -1
- package/dist/infrastructure/context/project/init/CursorConfigurer.d.ts +60 -0
- package/dist/infrastructure/context/project/init/CursorConfigurer.d.ts.map +1 -0
- package/dist/infrastructure/context/project/init/CursorConfigurer.js +236 -0
- package/dist/infrastructure/context/project/init/CursorConfigurer.js.map +1 -0
- package/dist/infrastructure/context/project/init/VibeConfigurer.d.ts +33 -0
- package/dist/infrastructure/context/project/init/VibeConfigurer.d.ts.map +1 -0
- package/dist/infrastructure/context/project/init/VibeConfigurer.js +42 -0
- package/dist/infrastructure/context/project/init/VibeConfigurer.js.map +1 -0
- package/package.json +1 -2
- package/dist/infrastructure/context/project/init/GitHubHooksConfigurer.d.ts +0 -40
- package/dist/infrastructure/context/project/init/GitHubHooksConfigurer.d.ts.map +0 -1
- package/dist/infrastructure/context/project/init/GitHubHooksConfigurer.js +0 -135
- package/dist/infrastructure/context/project/init/GitHubHooksConfigurer.js.map +0 -1
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Infrastructure: Cursor Configurer
|
|
4
|
+
*
|
|
5
|
+
* Encapsulates all knowledge about Cursor configuration:
|
|
6
|
+
* - .cursor/rules/jumbo.mdc with YAML frontmatter (alwaysApply: true) referencing JUMBO.md
|
|
7
|
+
* - .cursor/hooks.json with Cursor-native sessionStart hook
|
|
8
|
+
*
|
|
9
|
+
* Operations are idempotent and gracefully handle errors.
|
|
10
|
+
*/
|
|
11
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.CursorConfigurer = void 0;
|
|
16
|
+
const path_1 = __importDefault(require("path"));
|
|
17
|
+
const fs_extra_1 = __importDefault(require("fs-extra"));
|
|
18
|
+
const CursorRulesContent_js_1 = require("../../../../domain/project/CursorRulesContent.js");
|
|
19
|
+
class CursorConfigurer {
|
|
20
|
+
constructor() {
|
|
21
|
+
this.agent = {
|
|
22
|
+
id: "cursor",
|
|
23
|
+
name: "Cursor",
|
|
24
|
+
};
|
|
25
|
+
this.skillPlatforms = [];
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Configure all Cursor requirements for Jumbo
|
|
29
|
+
*
|
|
30
|
+
* @param projectRoot Absolute path to project root directory
|
|
31
|
+
*/
|
|
32
|
+
async configure(projectRoot) {
|
|
33
|
+
await this.ensureCursorRules(projectRoot);
|
|
34
|
+
await this.ensureCursorHooks(projectRoot);
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Ensure .cursor/rules/jumbo.mdc exists with YAML frontmatter and JUMBO.md reference
|
|
38
|
+
*/
|
|
39
|
+
async ensureCursorRules(projectRoot) {
|
|
40
|
+
const rulesPath = path_1.default.join(projectRoot, ".cursor", "rules", "jumbo.mdc");
|
|
41
|
+
try {
|
|
42
|
+
await fs_extra_1.default.ensureDir(path_1.default.join(projectRoot, ".cursor", "rules"));
|
|
43
|
+
const exists = await fs_extra_1.default.pathExists(rulesPath);
|
|
44
|
+
if (!exists) {
|
|
45
|
+
await fs_extra_1.default.writeFile(rulesPath, CursorRulesContent_js_1.CursorRulesContent.getFullContent(), "utf-8");
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
const content = await fs_extra_1.default.readFile(rulesPath, "utf-8");
|
|
49
|
+
if (!content.includes(CursorRulesContent_js_1.CursorRulesContent.getSectionMarker())) {
|
|
50
|
+
const updatedContent = content.trimEnd() + "\n\n" + CursorRulesContent_js_1.CursorRulesContent.getFullContent();
|
|
51
|
+
await fs_extra_1.default.writeFile(rulesPath, updatedContent, "utf-8");
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
catch (error) {
|
|
55
|
+
console.warn(`Warning: Failed to update .cursor/rules/jumbo.mdc: ${error instanceof Error ? error.message : String(error)}`);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Ensure Cursor hooks are configured in .cursor/hooks.json
|
|
60
|
+
*/
|
|
61
|
+
async ensureCursorHooks(projectRoot) {
|
|
62
|
+
try {
|
|
63
|
+
const hooksPath = path_1.default.join(projectRoot, ".cursor", "hooks.json");
|
|
64
|
+
await fs_extra_1.default.ensureDir(path_1.default.join(projectRoot, ".cursor"));
|
|
65
|
+
const jumboHooks = {
|
|
66
|
+
version: 1,
|
|
67
|
+
hooks: {
|
|
68
|
+
sessionStart: [
|
|
69
|
+
{
|
|
70
|
+
command: "jumbo session start",
|
|
71
|
+
},
|
|
72
|
+
],
|
|
73
|
+
},
|
|
74
|
+
};
|
|
75
|
+
const exists = await fs_extra_1.default.pathExists(hooksPath);
|
|
76
|
+
if (!exists) {
|
|
77
|
+
await fs_extra_1.default.writeFile(hooksPath, JSON.stringify(jumboHooks, null, 2) + "\n", "utf-8");
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
const existingContent = await fs_extra_1.default.readFile(hooksPath, "utf-8");
|
|
81
|
+
let existingHooks = {};
|
|
82
|
+
if (existingContent.trim()) {
|
|
83
|
+
try {
|
|
84
|
+
existingHooks = JSON.parse(existingContent);
|
|
85
|
+
}
|
|
86
|
+
catch {
|
|
87
|
+
await fs_extra_1.default.writeFile(hooksPath, JSON.stringify(jumboHooks, null, 2) + "\n", "utf-8");
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
const normalizedExistingHooks = this.normalizeExistingHooks(existingHooks);
|
|
92
|
+
const mergedHooks = this.mergeHooks(normalizedExistingHooks, jumboHooks);
|
|
93
|
+
await fs_extra_1.default.writeFile(hooksPath, JSON.stringify(mergedHooks, null, 2) + "\n", "utf-8");
|
|
94
|
+
}
|
|
95
|
+
catch (error) {
|
|
96
|
+
console.warn(`Warning: Failed to configure Cursor hooks: ${error instanceof Error ? error.message : String(error)}`);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Merge hooks, preserving existing content and adding missing Jumbo hooks
|
|
101
|
+
*/
|
|
102
|
+
mergeHooks(existing, jumbo) {
|
|
103
|
+
const result = { ...existing };
|
|
104
|
+
if (jumbo.version !== undefined) {
|
|
105
|
+
result.version = jumbo.version;
|
|
106
|
+
}
|
|
107
|
+
if (jumbo.hooks) {
|
|
108
|
+
result.hooks = result.hooks ?? {};
|
|
109
|
+
for (const [hookType, hooks] of Object.entries(jumbo.hooks)) {
|
|
110
|
+
if (hooks && Array.isArray(hooks)) {
|
|
111
|
+
const existingHooks = Array.isArray(result.hooks[hookType]) ? result.hooks[hookType] : [];
|
|
112
|
+
result.hooks[hookType] = this.mergeHookArray(existingHooks, hooks);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
return result;
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Merge hook arrays, deduplicating by command content
|
|
120
|
+
*/
|
|
121
|
+
mergeHookArray(existing, additions) {
|
|
122
|
+
const merged = [...existing];
|
|
123
|
+
const existingCommands = new Set(existing.map((h) => JSON.stringify(h)));
|
|
124
|
+
for (const addition of additions) {
|
|
125
|
+
const additionKey = JSON.stringify(addition);
|
|
126
|
+
if (!existingCommands.has(additionKey)) {
|
|
127
|
+
merged.push(addition);
|
|
128
|
+
existingCommands.add(additionKey);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
return merged;
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Normalize existing hook entries to Cursor's schema and remove stale
|
|
135
|
+
* Jumbo preCompact hooks when no resume trigger exists in Cursor.
|
|
136
|
+
*/
|
|
137
|
+
normalizeExistingHooks(existing) {
|
|
138
|
+
if (!existing || typeof existing !== "object") {
|
|
139
|
+
return {};
|
|
140
|
+
}
|
|
141
|
+
const result = { ...existing };
|
|
142
|
+
const rawHooks = existing.hooks;
|
|
143
|
+
if (!rawHooks || typeof rawHooks !== "object") {
|
|
144
|
+
return result;
|
|
145
|
+
}
|
|
146
|
+
const normalizedHooks = {};
|
|
147
|
+
for (const [hookType, hookEntries] of Object.entries(rawHooks)) {
|
|
148
|
+
if (!Array.isArray(hookEntries)) {
|
|
149
|
+
continue;
|
|
150
|
+
}
|
|
151
|
+
const normalizedEntries = hookEntries
|
|
152
|
+
.map((entry) => this.normalizeHookEntry(entry))
|
|
153
|
+
.filter((entry) => entry !== null)
|
|
154
|
+
.filter((entry) => !(hookType === "preCompact" && this.isJumboPauseHook(entry)));
|
|
155
|
+
if (normalizedEntries.length > 0) {
|
|
156
|
+
normalizedHooks[hookType] = normalizedEntries;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
result.hooks = normalizedHooks;
|
|
160
|
+
return result;
|
|
161
|
+
}
|
|
162
|
+
normalizeHookEntry(entry) {
|
|
163
|
+
if (!entry || typeof entry !== "object") {
|
|
164
|
+
return null;
|
|
165
|
+
}
|
|
166
|
+
const candidate = entry;
|
|
167
|
+
if (typeof candidate.command === "string" && candidate.command.length > 0) {
|
|
168
|
+
return candidate;
|
|
169
|
+
}
|
|
170
|
+
if (typeof candidate.bash === "string" && candidate.bash.length > 0) {
|
|
171
|
+
const normalized = { command: candidate.bash };
|
|
172
|
+
if (typeof candidate.timeoutSec === "number") {
|
|
173
|
+
normalized.timeout = candidate.timeoutSec;
|
|
174
|
+
}
|
|
175
|
+
return normalized;
|
|
176
|
+
}
|
|
177
|
+
return null;
|
|
178
|
+
}
|
|
179
|
+
isJumboPauseHook(entry) {
|
|
180
|
+
return entry.command === "jumbo work pause";
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Repair Cursor configuration by replacing stale content
|
|
184
|
+
*/
|
|
185
|
+
async repair(projectRoot) {
|
|
186
|
+
await this.repairCursorRules(projectRoot);
|
|
187
|
+
await this.ensureCursorHooks(projectRoot);
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Repair .cursor/rules/jumbo.mdc by replacing the Jumbo section with current content
|
|
191
|
+
*/
|
|
192
|
+
async repairCursorRules(projectRoot) {
|
|
193
|
+
const rulesPath = path_1.default.join(projectRoot, ".cursor", "rules", "jumbo.mdc");
|
|
194
|
+
try {
|
|
195
|
+
await fs_extra_1.default.ensureDir(path_1.default.join(projectRoot, ".cursor", "rules"));
|
|
196
|
+
const exists = await fs_extra_1.default.pathExists(rulesPath);
|
|
197
|
+
if (!exists) {
|
|
198
|
+
await fs_extra_1.default.writeFile(rulesPath, CursorRulesContent_js_1.CursorRulesContent.getFullContent(), "utf-8");
|
|
199
|
+
return;
|
|
200
|
+
}
|
|
201
|
+
const content = await fs_extra_1.default.readFile(rulesPath, "utf-8");
|
|
202
|
+
const replaced = CursorRulesContent_js_1.CursorRulesContent.replaceSection(content);
|
|
203
|
+
if (replaced !== null) {
|
|
204
|
+
await fs_extra_1.default.writeFile(rulesPath, replaced, "utf-8");
|
|
205
|
+
}
|
|
206
|
+
else if (!content.includes("JUMBO.md")) {
|
|
207
|
+
const updatedContent = content.trimEnd() + "\n\n" + CursorRulesContent_js_1.CursorRulesContent.getFullContent();
|
|
208
|
+
await fs_extra_1.default.writeFile(rulesPath, updatedContent, "utf-8");
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
catch (error) {
|
|
212
|
+
console.warn(`Warning: Failed to repair .cursor/rules/jumbo.mdc: ${error instanceof Error ? error.message : String(error)}`);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Return what changes this configurer will make without executing.
|
|
217
|
+
*/
|
|
218
|
+
async getPlannedFileChanges(projectRoot) {
|
|
219
|
+
const changes = [];
|
|
220
|
+
const rulesPath = path_1.default.join(projectRoot, ".cursor", "rules", "jumbo.mdc");
|
|
221
|
+
changes.push({
|
|
222
|
+
path: ".cursor/rules/jumbo.mdc",
|
|
223
|
+
action: (await fs_extra_1.default.pathExists(rulesPath)) ? "modify" : "create",
|
|
224
|
+
description: "Add Jumbo instructions with alwaysApply frontmatter",
|
|
225
|
+
});
|
|
226
|
+
const hooksPath = path_1.default.join(projectRoot, ".cursor", "hooks.json");
|
|
227
|
+
changes.push({
|
|
228
|
+
path: ".cursor/hooks.json",
|
|
229
|
+
action: (await fs_extra_1.default.pathExists(hooksPath)) ? "modify" : "create",
|
|
230
|
+
description: "Add Cursor-compatible sessionStart hook",
|
|
231
|
+
});
|
|
232
|
+
return changes;
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
exports.CursorConfigurer = CursorConfigurer;
|
|
236
|
+
//# sourceMappingURL=CursorConfigurer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CursorConfigurer.js","sourceRoot":"","sources":["../../../../../src/infrastructure/context/project/init/CursorConfigurer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Infrastructure: Mistral Vibe Configurer
|
|
3
|
+
*
|
|
4
|
+
* Encapsulates all knowledge about Mistral Vibe configuration:
|
|
5
|
+
* - Skills distributed to .vibe/skills
|
|
6
|
+
*
|
|
7
|
+
* Vibe reads AGENTS.md natively and does not support lifecycle hooks,
|
|
8
|
+
* so configuration is limited to skill distribution.
|
|
9
|
+
*
|
|
10
|
+
* Operations are idempotent and gracefully handle errors.
|
|
11
|
+
*/
|
|
12
|
+
import { IConfigurer } from "./IConfigurer.js";
|
|
13
|
+
import { PlannedFileChange } from "../../../../application/context/project/init/PlannedFileChange.js";
|
|
14
|
+
export declare class VibeConfigurer implements IConfigurer {
|
|
15
|
+
readonly agent: {
|
|
16
|
+
readonly id: "vibe";
|
|
17
|
+
readonly name: "Vibe";
|
|
18
|
+
};
|
|
19
|
+
readonly skillPlatforms: readonly [".vibe/skills"];
|
|
20
|
+
/**
|
|
21
|
+
* Configure all Mistral Vibe requirements for Jumbo.
|
|
22
|
+
* Vibe reads AGENTS.md natively and has no hook system,
|
|
23
|
+
* so no additional configuration files are needed.
|
|
24
|
+
*
|
|
25
|
+
* @param projectRoot Absolute path to project root directory
|
|
26
|
+
*/
|
|
27
|
+
configure(_projectRoot: string): Promise<void>;
|
|
28
|
+
/**
|
|
29
|
+
* Return what changes this configurer will make without executing.
|
|
30
|
+
*/
|
|
31
|
+
getPlannedFileChanges(_projectRoot: string): Promise<PlannedFileChange[]>;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=VibeConfigurer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VibeConfigurer.d.ts","sourceRoot":"","sources":["../../../../../src/infrastructure/context/project/init/VibeConfigurer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,mEAAmE,CAAC;AAEtG,qBAAa,cAAe,YAAW,WAAW;IAChD,QAAQ,CAAC,KAAK;;;MAGH;IAEX,QAAQ,CAAC,cAAc,4BAA6B;IAEpD;;;;;;OAMG;IACG,SAAS,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKpD;;OAEG;IACG,qBAAqB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC;CAGhF"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Infrastructure: Mistral Vibe Configurer
|
|
4
|
+
*
|
|
5
|
+
* Encapsulates all knowledge about Mistral Vibe configuration:
|
|
6
|
+
* - Skills distributed to .vibe/skills
|
|
7
|
+
*
|
|
8
|
+
* Vibe reads AGENTS.md natively and does not support lifecycle hooks,
|
|
9
|
+
* so configuration is limited to skill distribution.
|
|
10
|
+
*
|
|
11
|
+
* Operations are idempotent and gracefully handle errors.
|
|
12
|
+
*/
|
|
13
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
+
exports.VibeConfigurer = void 0;
|
|
15
|
+
class VibeConfigurer {
|
|
16
|
+
constructor() {
|
|
17
|
+
this.agent = {
|
|
18
|
+
id: "vibe",
|
|
19
|
+
name: "Vibe",
|
|
20
|
+
};
|
|
21
|
+
this.skillPlatforms = [".vibe/skills"];
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Configure all Mistral Vibe requirements for Jumbo.
|
|
25
|
+
* Vibe reads AGENTS.md natively and has no hook system,
|
|
26
|
+
* so no additional configuration files are needed.
|
|
27
|
+
*
|
|
28
|
+
* @param projectRoot Absolute path to project root directory
|
|
29
|
+
*/
|
|
30
|
+
async configure(_projectRoot) {
|
|
31
|
+
// Vibe reads AGENTS.md natively - no additional files needed.
|
|
32
|
+
// Skills are installed by AgentFileProtocol via skillPlatforms.
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Return what changes this configurer will make without executing.
|
|
36
|
+
*/
|
|
37
|
+
async getPlannedFileChanges(_projectRoot) {
|
|
38
|
+
return [];
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
exports.VibeConfigurer = VibeConfigurer;
|
|
42
|
+
//# sourceMappingURL=VibeConfigurer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VibeConfigurer.js","sourceRoot":"","sources":["../../../../../src/infrastructure/context/project/init/VibeConfigurer.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;GAUG;;;AAKH,MAAa,cAAc;IAA3B;QACW,UAAK,GAAG;YACf,EAAE,EAAE,MAAM;YACV,IAAI,EAAE,MAAM;SACJ,CAAC;QAEF,mBAAc,GAAG,CAAC,cAAc,CAAU,CAAC;IAoBtD,CAAC;IAlBC;;;;;;OAMG;IACH,KAAK,CAAC,SAAS,CAAC,YAAoB;QAClC,8DAA8D;QAC9D,gEAAgE;IAClE,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,qBAAqB,CAAC,YAAoB;QAC9C,OAAO,EAAE,CAAC;IACZ,CAAC;CACF;AA1BD,wCA0BC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "jumbo-cli",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.8.0",
|
|
4
4
|
"description": "Memory and Context Orchestration for Coding Agents",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"cli",
|
|
@@ -65,7 +65,6 @@
|
|
|
65
65
|
"react-dom": "^17.0.2",
|
|
66
66
|
"reflect-metadata": "^0.2.2",
|
|
67
67
|
"strip-ansi": "^6.0.1",
|
|
68
|
-
"ulid": "^2.3.0",
|
|
69
68
|
"yaml": "^2.8.1"
|
|
70
69
|
},
|
|
71
70
|
"devDependencies": {
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Infrastructure: GitHub Hooks Configurer
|
|
3
|
-
*
|
|
4
|
-
* Encapsulates all knowledge about GitHub hooks configuration:
|
|
5
|
-
* - .github/hooks/hooks.json with SessionStart hooks
|
|
6
|
-
*
|
|
7
|
-
* Operations are idempotent and gracefully handle errors.
|
|
8
|
-
*/
|
|
9
|
-
import { IConfigurer } from "./IConfigurer.js";
|
|
10
|
-
import { PlannedFileChange } from "../../../../application/context/project/init/PlannedFileChange.js";
|
|
11
|
-
export declare class GitHubHooksConfigurer implements IConfigurer {
|
|
12
|
-
readonly agent: {
|
|
13
|
-
readonly id: "github-hooks";
|
|
14
|
-
readonly name: "GitHub Hooks";
|
|
15
|
-
};
|
|
16
|
-
readonly skillPlatforms: readonly [".vibe/skills"];
|
|
17
|
-
/**
|
|
18
|
-
* Configure all GitHub hooks requirements for Jumbo
|
|
19
|
-
*
|
|
20
|
-
* @param projectRoot Absolute path to project root directory
|
|
21
|
-
*/
|
|
22
|
-
configure(projectRoot: string): Promise<void>;
|
|
23
|
-
/**
|
|
24
|
-
* Ensure GitHub hooks are configured in .github/hooks/hooks.json
|
|
25
|
-
*/
|
|
26
|
-
private ensureGitHubHooks;
|
|
27
|
-
/**
|
|
28
|
-
* Merge hooks, preserving existing content and adding missing Jumbo hooks
|
|
29
|
-
*/
|
|
30
|
-
private mergeHooks;
|
|
31
|
-
/**
|
|
32
|
-
* Merge hook arrays, deduplicating by command content
|
|
33
|
-
*/
|
|
34
|
-
private mergeHookArray;
|
|
35
|
-
/**
|
|
36
|
-
* Return what changes this configurer will make without executing.
|
|
37
|
-
*/
|
|
38
|
-
getPlannedFileChanges(projectRoot: string): Promise<PlannedFileChange[]>;
|
|
39
|
-
}
|
|
40
|
-
//# sourceMappingURL=GitHubHooksConfigurer.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"GitHubHooksConfigurer.d.ts","sourceRoot":"","sources":["../../../../../src/infrastructure/context/project/init/GitHubHooksConfigurer.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,mEAAmE,CAAC;AAEtG,qBAAa,qBAAsB,YAAW,WAAW;IACvD,QAAQ,CAAC,KAAK;;;MAGH;IAEX,QAAQ,CAAC,cAAc,4BAA6B;IAEpD;;;;OAIG;IACG,SAAS,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAInD;;OAEG;YACW,iBAAiB;IA0D/B;;OAEG;IACH,OAAO,CAAC,UAAU;IAuBlB;;OAEG;IACH,OAAO,CAAC,cAAc;IAetB;;OAEG;IACG,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC;CAW/E"}
|
|
@@ -1,135 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* Infrastructure: GitHub Hooks Configurer
|
|
4
|
-
*
|
|
5
|
-
* Encapsulates all knowledge about GitHub hooks configuration:
|
|
6
|
-
* - .github/hooks/hooks.json with SessionStart hooks
|
|
7
|
-
*
|
|
8
|
-
* Operations are idempotent and gracefully handle errors.
|
|
9
|
-
*/
|
|
10
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
11
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
12
|
-
};
|
|
13
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
-
exports.GitHubHooksConfigurer = void 0;
|
|
15
|
-
const path_1 = __importDefault(require("path"));
|
|
16
|
-
const fs_extra_1 = __importDefault(require("fs-extra"));
|
|
17
|
-
class GitHubHooksConfigurer {
|
|
18
|
-
constructor() {
|
|
19
|
-
this.agent = {
|
|
20
|
-
id: "github-hooks",
|
|
21
|
-
name: "GitHub Hooks",
|
|
22
|
-
};
|
|
23
|
-
this.skillPlatforms = [".vibe/skills"];
|
|
24
|
-
}
|
|
25
|
-
/**
|
|
26
|
-
* Configure all GitHub hooks requirements for Jumbo
|
|
27
|
-
*
|
|
28
|
-
* @param projectRoot Absolute path to project root directory
|
|
29
|
-
*/
|
|
30
|
-
async configure(projectRoot) {
|
|
31
|
-
await this.ensureGitHubHooks(projectRoot);
|
|
32
|
-
}
|
|
33
|
-
/**
|
|
34
|
-
* Ensure GitHub hooks are configured in .github/hooks/hooks.json
|
|
35
|
-
*/
|
|
36
|
-
async ensureGitHubHooks(projectRoot) {
|
|
37
|
-
try {
|
|
38
|
-
const hooksPath = path_1.default.join(projectRoot, ".github", "hooks", "hooks.json");
|
|
39
|
-
// Ensure .github/hooks directory exists
|
|
40
|
-
await fs_extra_1.default.ensureDir(path_1.default.join(projectRoot, ".github", "hooks"));
|
|
41
|
-
// Define all Jumbo hooks for GitHub
|
|
42
|
-
const jumboHooks = {
|
|
43
|
-
version: 1,
|
|
44
|
-
hooks: {
|
|
45
|
-
sessionStart: [
|
|
46
|
-
{
|
|
47
|
-
type: "command",
|
|
48
|
-
bash: "jumbo session start",
|
|
49
|
-
cwd: ".",
|
|
50
|
-
timeoutSec: 10
|
|
51
|
-
}
|
|
52
|
-
]
|
|
53
|
-
}
|
|
54
|
-
};
|
|
55
|
-
// Check if file exists
|
|
56
|
-
const exists = await fs_extra_1.default.pathExists(hooksPath);
|
|
57
|
-
if (!exists) {
|
|
58
|
-
// File doesn't exist - create with full content
|
|
59
|
-
await fs_extra_1.default.writeFile(hooksPath, JSON.stringify(jumboHooks, null, 2) + "\n", "utf-8");
|
|
60
|
-
return;
|
|
61
|
-
}
|
|
62
|
-
// File exists - merge with existing content
|
|
63
|
-
const existingContent = await fs_extra_1.default.readFile(hooksPath, "utf-8");
|
|
64
|
-
let existingHooks = {};
|
|
65
|
-
if (existingContent.trim()) {
|
|
66
|
-
try {
|
|
67
|
-
existingHooks = JSON.parse(existingContent);
|
|
68
|
-
}
|
|
69
|
-
catch (parseError) {
|
|
70
|
-
// If JSON is malformed, overwrite with our content
|
|
71
|
-
await fs_extra_1.default.writeFile(hooksPath, JSON.stringify(jumboHooks, null, 2) + "\n", "utf-8");
|
|
72
|
-
return;
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
// Merge hooks - ensure sessionStart hooks are present
|
|
76
|
-
const mergedHooks = this.mergeHooks(existingHooks, jumboHooks);
|
|
77
|
-
await fs_extra_1.default.writeFile(hooksPath, JSON.stringify(mergedHooks, null, 2) + "\n", "utf-8");
|
|
78
|
-
}
|
|
79
|
-
catch (error) {
|
|
80
|
-
// Graceful degradation - log but don't throw
|
|
81
|
-
console.warn(`Warning: Failed to configure GitHub hooks: ${error instanceof Error ? error.message : String(error)}`);
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
/**
|
|
85
|
-
* Merge hooks, preserving existing content and adding missing Jumbo hooks
|
|
86
|
-
*/
|
|
87
|
-
mergeHooks(existing, jumbo) {
|
|
88
|
-
const result = { ...existing };
|
|
89
|
-
// Ensure version is set
|
|
90
|
-
if (jumbo.version !== undefined) {
|
|
91
|
-
result.version = jumbo.version;
|
|
92
|
-
}
|
|
93
|
-
// Merge hooks
|
|
94
|
-
if (jumbo.hooks) {
|
|
95
|
-
result.hooks = result.hooks ?? {};
|
|
96
|
-
for (const [hookType, hooks] of Object.entries(jumbo.hooks)) {
|
|
97
|
-
if (hooks && Array.isArray(hooks)) {
|
|
98
|
-
const existingHooks = Array.isArray(result.hooks[hookType]) ? result.hooks[hookType] : [];
|
|
99
|
-
result.hooks[hookType] = this.mergeHookArray(existingHooks, hooks);
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
return result;
|
|
104
|
-
}
|
|
105
|
-
/**
|
|
106
|
-
* Merge hook arrays, deduplicating by command content
|
|
107
|
-
*/
|
|
108
|
-
mergeHookArray(existing, additions) {
|
|
109
|
-
const merged = [...existing];
|
|
110
|
-
const existingCommands = new Set(existing.map(h => JSON.stringify(h)));
|
|
111
|
-
for (const addition of additions) {
|
|
112
|
-
const additionKey = JSON.stringify(addition);
|
|
113
|
-
if (!existingCommands.has(additionKey)) {
|
|
114
|
-
merged.push(addition);
|
|
115
|
-
existingCommands.add(additionKey);
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
return merged;
|
|
119
|
-
}
|
|
120
|
-
/**
|
|
121
|
-
* Return what changes this configurer will make without executing.
|
|
122
|
-
*/
|
|
123
|
-
async getPlannedFileChanges(projectRoot) {
|
|
124
|
-
const hooksPath = path_1.default.join(projectRoot, ".github", "hooks", "hooks.json");
|
|
125
|
-
return [
|
|
126
|
-
{
|
|
127
|
-
path: ".github/hooks/hooks.json",
|
|
128
|
-
action: (await fs_extra_1.default.pathExists(hooksPath)) ? "modify" : "create",
|
|
129
|
-
description: "Add GitHub hooks configuration",
|
|
130
|
-
},
|
|
131
|
-
];
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
exports.GitHubHooksConfigurer = GitHubHooksConfigurer;
|
|
135
|
-
//# sourceMappingURL=GitHubHooksConfigurer.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"GitHubHooksConfigurer.js","sourceRoot":"","sources":["../../../../../src/infrastructure/context/project/init/GitHubHooksConfigurer.ts"],"names":[],"mappings":"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"}
|