ctxinit 0.1.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 +484 -0
- package/bin/ctx.js +3 -0
- package/dist/analysis/index.d.ts +2 -0
- package/dist/analysis/index.d.ts.map +1 -0
- package/dist/analysis/index.js +18 -0
- package/dist/analysis/index.js.map +1 -0
- package/dist/analysis/static-analysis.d.ts +79 -0
- package/dist/analysis/static-analysis.d.ts.map +1 -0
- package/dist/analysis/static-analysis.js +279 -0
- package/dist/analysis/static-analysis.js.map +1 -0
- package/dist/bootstrap/index.d.ts +8 -0
- package/dist/bootstrap/index.d.ts.map +1 -0
- package/dist/bootstrap/index.js +13 -0
- package/dist/bootstrap/index.js.map +1 -0
- package/dist/bootstrap/orchestrator.d.ts +48 -0
- package/dist/bootstrap/orchestrator.d.ts.map +1 -0
- package/dist/bootstrap/orchestrator.js +363 -0
- package/dist/bootstrap/orchestrator.js.map +1 -0
- package/dist/bootstrap/validator.d.ts +25 -0
- package/dist/bootstrap/validator.d.ts.map +1 -0
- package/dist/bootstrap/validator.js +412 -0
- package/dist/bootstrap/validator.js.map +1 -0
- package/dist/build/atomic.d.ts +74 -0
- package/dist/build/atomic.d.ts.map +1 -0
- package/dist/build/atomic.js +235 -0
- package/dist/build/atomic.js.map +1 -0
- package/dist/build/index.d.ts +10 -0
- package/dist/build/index.d.ts.map +1 -0
- package/dist/build/index.js +26 -0
- package/dist/build/index.js.map +1 -0
- package/dist/build/lock.d.ts +102 -0
- package/dist/build/lock.d.ts.map +1 -0
- package/dist/build/lock.js +297 -0
- package/dist/build/lock.js.map +1 -0
- package/dist/build/manifest.d.ts +138 -0
- package/dist/build/manifest.d.ts.map +1 -0
- package/dist/build/manifest.js +269 -0
- package/dist/build/manifest.js.map +1 -0
- package/dist/build/orchestrator.d.ts +103 -0
- package/dist/build/orchestrator.d.ts.map +1 -0
- package/dist/build/orchestrator.js +524 -0
- package/dist/build/orchestrator.js.map +1 -0
- package/dist/cli/bootstrap.d.ts +77 -0
- package/dist/cli/bootstrap.d.ts.map +1 -0
- package/dist/cli/bootstrap.js +527 -0
- package/dist/cli/bootstrap.js.map +1 -0
- package/dist/cli/build.d.ts +32 -0
- package/dist/cli/build.d.ts.map +1 -0
- package/dist/cli/build.js +156 -0
- package/dist/cli/build.js.map +1 -0
- package/dist/cli/diff.d.ts +23 -0
- package/dist/cli/diff.d.ts.map +1 -0
- package/dist/cli/diff.js +226 -0
- package/dist/cli/diff.js.map +1 -0
- package/dist/cli/hooks.d.ts +29 -0
- package/dist/cli/hooks.d.ts.map +1 -0
- package/dist/cli/hooks.js +176 -0
- package/dist/cli/hooks.js.map +1 -0
- package/dist/cli/init.d.ts +53 -0
- package/dist/cli/init.d.ts.map +1 -0
- package/dist/cli/init.js +254 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/cli/lint.d.ts +46 -0
- package/dist/cli/lint.d.ts.map +1 -0
- package/dist/cli/lint.js +210 -0
- package/dist/cli/lint.js.map +1 -0
- package/dist/cli/migrate.d.ts +28 -0
- package/dist/cli/migrate.d.ts.map +1 -0
- package/dist/cli/migrate.js +350 -0
- package/dist/cli/migrate.js.map +1 -0
- package/dist/cli/verify.d.ts +21 -0
- package/dist/cli/verify.d.ts.map +1 -0
- package/dist/cli/verify.js +209 -0
- package/dist/cli/verify.js.map +1 -0
- package/dist/cli.d.ts +8 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +262 -0
- package/dist/cli.js.map +1 -0
- package/dist/compiler/agents-compiler.d.ts +24 -0
- package/dist/compiler/agents-compiler.d.ts.map +1 -0
- package/dist/compiler/agents-compiler.js +192 -0
- package/dist/compiler/agents-compiler.js.map +1 -0
- package/dist/compiler/base-compiler.d.ts +152 -0
- package/dist/compiler/base-compiler.d.ts.map +1 -0
- package/dist/compiler/base-compiler.js +180 -0
- package/dist/compiler/base-compiler.js.map +1 -0
- package/dist/compiler/claude-compiler.d.ts +24 -0
- package/dist/compiler/claude-compiler.d.ts.map +1 -0
- package/dist/compiler/claude-compiler.js +182 -0
- package/dist/compiler/claude-compiler.js.map +1 -0
- package/dist/compiler/cursor-compiler.d.ts +33 -0
- package/dist/compiler/cursor-compiler.d.ts.map +1 -0
- package/dist/compiler/cursor-compiler.js +136 -0
- package/dist/compiler/cursor-compiler.js.map +1 -0
- package/dist/compiler/index.d.ts +7 -0
- package/dist/compiler/index.d.ts.map +1 -0
- package/dist/compiler/index.js +24 -0
- package/dist/compiler/index.js.map +1 -0
- package/dist/compiler/rule-selector.d.ts +115 -0
- package/dist/compiler/rule-selector.d.ts.map +1 -0
- package/dist/compiler/rule-selector.js +273 -0
- package/dist/compiler/rule-selector.js.map +1 -0
- package/dist/compiler/token-estimator.d.ts +74 -0
- package/dist/compiler/token-estimator.d.ts.map +1 -0
- package/dist/compiler/token-estimator.js +191 -0
- package/dist/compiler/token-estimator.js.map +1 -0
- package/dist/config/index.d.ts +2 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +18 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/loader.d.ts +48 -0
- package/dist/config/loader.d.ts.map +1 -0
- package/dist/config/loader.js +175 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/git/gitignore.d.ts +59 -0
- package/dist/git/gitignore.d.ts.map +1 -0
- package/dist/git/gitignore.js +268 -0
- package/dist/git/gitignore.js.map +1 -0
- package/dist/git/hooks.d.ts +34 -0
- package/dist/git/hooks.d.ts.map +1 -0
- package/dist/git/hooks.js +129 -0
- package/dist/git/hooks.js.map +1 -0
- package/dist/git/husky.d.ts +52 -0
- package/dist/git/husky.d.ts.map +1 -0
- package/dist/git/husky.js +219 -0
- package/dist/git/husky.js.map +1 -0
- package/dist/git/index.d.ts +9 -0
- package/dist/git/index.d.ts.map +1 -0
- package/dist/git/index.js +15 -0
- package/dist/git/index.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +23 -0
- package/dist/index.js.map +1 -0
- package/dist/llm/base-provider.d.ts +43 -0
- package/dist/llm/base-provider.d.ts.map +1 -0
- package/dist/llm/base-provider.js +91 -0
- package/dist/llm/base-provider.js.map +1 -0
- package/dist/llm/index.d.ts +17 -0
- package/dist/llm/index.d.ts.map +1 -0
- package/dist/llm/index.js +36 -0
- package/dist/llm/index.js.map +1 -0
- package/dist/llm/prompts/bootstrap-prompt.d.ts +27 -0
- package/dist/llm/prompts/bootstrap-prompt.d.ts.map +1 -0
- package/dist/llm/prompts/bootstrap-prompt.js +278 -0
- package/dist/llm/prompts/bootstrap-prompt.js.map +1 -0
- package/dist/llm/prompts/index.d.ts +5 -0
- package/dist/llm/prompts/index.d.ts.map +1 -0
- package/dist/llm/prompts/index.js +11 -0
- package/dist/llm/prompts/index.js.map +1 -0
- package/dist/llm/provider-factory.d.ts +27 -0
- package/dist/llm/provider-factory.d.ts.map +1 -0
- package/dist/llm/provider-factory.js +213 -0
- package/dist/llm/provider-factory.js.map +1 -0
- package/dist/llm/providers/claude-api.d.ts +21 -0
- package/dist/llm/providers/claude-api.d.ts.map +1 -0
- package/dist/llm/providers/claude-api.js +110 -0
- package/dist/llm/providers/claude-api.js.map +1 -0
- package/dist/llm/providers/claude-code.d.ts +21 -0
- package/dist/llm/providers/claude-code.d.ts.map +1 -0
- package/dist/llm/providers/claude-code.js +120 -0
- package/dist/llm/providers/claude-code.js.map +1 -0
- package/dist/llm/providers/codex-cli.d.ts +25 -0
- package/dist/llm/providers/codex-cli.d.ts.map +1 -0
- package/dist/llm/providers/codex-cli.js +129 -0
- package/dist/llm/providers/codex-cli.js.map +1 -0
- package/dist/llm/providers/cursor-cli.d.ts +24 -0
- package/dist/llm/providers/cursor-cli.d.ts.map +1 -0
- package/dist/llm/providers/cursor-cli.js +106 -0
- package/dist/llm/providers/cursor-cli.js.map +1 -0
- package/dist/llm/providers/gemini-api.d.ts +20 -0
- package/dist/llm/providers/gemini-api.d.ts.map +1 -0
- package/dist/llm/providers/gemini-api.js +121 -0
- package/dist/llm/providers/gemini-api.js.map +1 -0
- package/dist/llm/providers/gemini-cli.d.ts +20 -0
- package/dist/llm/providers/gemini-cli.d.ts.map +1 -0
- package/dist/llm/providers/gemini-cli.js +109 -0
- package/dist/llm/providers/gemini-cli.js.map +1 -0
- package/dist/llm/providers/interactive.d.ts +42 -0
- package/dist/llm/providers/interactive.d.ts.map +1 -0
- package/dist/llm/providers/interactive.js +200 -0
- package/dist/llm/providers/interactive.js.map +1 -0
- package/dist/llm/providers/openai-api.d.ts +21 -0
- package/dist/llm/providers/openai-api.d.ts.map +1 -0
- package/dist/llm/providers/openai-api.js +107 -0
- package/dist/llm/providers/openai-api.js.map +1 -0
- package/dist/llm/types.d.ts +128 -0
- package/dist/llm/types.d.ts.map +1 -0
- package/dist/llm/types.js +8 -0
- package/dist/llm/types.js.map +1 -0
- package/dist/parser/index.d.ts +3 -0
- package/dist/parser/index.d.ts.map +1 -0
- package/dist/parser/index.js +19 -0
- package/dist/parser/index.js.map +1 -0
- package/dist/parser/path-security.d.ts +40 -0
- package/dist/parser/path-security.d.ts.map +1 -0
- package/dist/parser/path-security.js +183 -0
- package/dist/parser/path-security.js.map +1 -0
- package/dist/parser/rule-parser.d.ts +50 -0
- package/dist/parser/rule-parser.d.ts.map +1 -0
- package/dist/parser/rule-parser.js +203 -0
- package/dist/parser/rule-parser.js.map +1 -0
- package/dist/schemas/config.d.ts +202 -0
- package/dist/schemas/config.d.ts.map +1 -0
- package/dist/schemas/config.js +96 -0
- package/dist/schemas/config.js.map +1 -0
- package/dist/schemas/index.d.ts +3 -0
- package/dist/schemas/index.d.ts.map +1 -0
- package/dist/schemas/index.js +19 -0
- package/dist/schemas/index.js.map +1 -0
- package/dist/schemas/rule.d.ts +67 -0
- package/dist/schemas/rule.d.ts.map +1 -0
- package/dist/schemas/rule.js +44 -0
- package/dist/schemas/rule.js.map +1 -0
- package/package.json +69 -0
- package/templates/architecture.md +35 -0
- package/templates/bootstrap-prompt.md +242 -0
- package/templates/config.yaml +25 -0
- package/templates/project.md +44 -0
- package/templates/rules/example.md +36 -0
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./loader"), exports);
|
|
18
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2CAAyB"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { Config } from '../schemas/config';
|
|
3
|
+
/**
|
|
4
|
+
* Result of loading configuration
|
|
5
|
+
*/
|
|
6
|
+
export interface ConfigLoadResult {
|
|
7
|
+
config: Config;
|
|
8
|
+
source: 'file' | 'defaults';
|
|
9
|
+
warnings: string[];
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Error thrown when configuration is invalid
|
|
13
|
+
*/
|
|
14
|
+
export declare class ConfigError extends Error {
|
|
15
|
+
readonly line?: number | undefined;
|
|
16
|
+
readonly details?: z.ZodError | undefined;
|
|
17
|
+
constructor(message: string, line?: number | undefined, details?: z.ZodError | undefined);
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Load configuration from a .context directory
|
|
21
|
+
*
|
|
22
|
+
* @param projectDir - Project root directory containing .context/
|
|
23
|
+
* @returns Loaded configuration with metadata
|
|
24
|
+
* @throws ConfigError if config file exists but is invalid
|
|
25
|
+
*/
|
|
26
|
+
export declare function loadConfig(projectDir: string): ConfigLoadResult;
|
|
27
|
+
/**
|
|
28
|
+
* Validate a configuration object
|
|
29
|
+
*
|
|
30
|
+
* @param config - Configuration object to validate
|
|
31
|
+
* @returns Validation result
|
|
32
|
+
*/
|
|
33
|
+
export declare function validateConfig(config: unknown): {
|
|
34
|
+
valid: boolean;
|
|
35
|
+
errors: string[];
|
|
36
|
+
};
|
|
37
|
+
/**
|
|
38
|
+
* Get the default configuration
|
|
39
|
+
*/
|
|
40
|
+
export declare function getDefaultConfig(): Config;
|
|
41
|
+
/**
|
|
42
|
+
* Merge partial configuration with defaults
|
|
43
|
+
*
|
|
44
|
+
* @param partial - Partial configuration to merge
|
|
45
|
+
* @returns Complete configuration with defaults filled in
|
|
46
|
+
*/
|
|
47
|
+
export declare function mergeWithDefaults(partial: Partial<Config>): Config;
|
|
48
|
+
//# sourceMappingURL=loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/config/loader.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,MAAM,EAAgC,MAAM,mBAAmB,CAAC;AAEzE;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,GAAG,UAAU,CAAC;IAC5B,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED;;GAEG;AACH,qBAAa,WAAY,SAAQ,KAAK;aAGlB,IAAI,CAAC,EAAE,MAAM;aACb,OAAO,CAAC,EAAE,CAAC,CAAC,QAAQ;gBAFpC,OAAO,EAAE,MAAM,EACC,IAAI,CAAC,EAAE,MAAM,YAAA,EACb,OAAO,CAAC,EAAE,CAAC,CAAC,QAAQ,YAAA;CAKvC;AAED;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,gBAAgB,CA4E/D;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,OAAO,GAAG;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CAapF;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM,CAalE"}
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.ConfigError = void 0;
|
|
37
|
+
exports.loadConfig = loadConfig;
|
|
38
|
+
exports.validateConfig = validateConfig;
|
|
39
|
+
exports.getDefaultConfig = getDefaultConfig;
|
|
40
|
+
exports.mergeWithDefaults = mergeWithDefaults;
|
|
41
|
+
const fs = __importStar(require("fs"));
|
|
42
|
+
const path = __importStar(require("path"));
|
|
43
|
+
const yaml = __importStar(require("yaml"));
|
|
44
|
+
const config_1 = require("../schemas/config");
|
|
45
|
+
/**
|
|
46
|
+
* Error thrown when configuration is invalid
|
|
47
|
+
*/
|
|
48
|
+
class ConfigError extends Error {
|
|
49
|
+
line;
|
|
50
|
+
details;
|
|
51
|
+
constructor(message, line, details) {
|
|
52
|
+
super(message);
|
|
53
|
+
this.line = line;
|
|
54
|
+
this.details = details;
|
|
55
|
+
this.name = 'ConfigError';
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
exports.ConfigError = ConfigError;
|
|
59
|
+
/**
|
|
60
|
+
* Load configuration from a .context directory
|
|
61
|
+
*
|
|
62
|
+
* @param projectDir - Project root directory containing .context/
|
|
63
|
+
* @returns Loaded configuration with metadata
|
|
64
|
+
* @throws ConfigError if config file exists but is invalid
|
|
65
|
+
*/
|
|
66
|
+
function loadConfig(projectDir) {
|
|
67
|
+
const configPath = path.join(projectDir, '.context', 'config.yaml');
|
|
68
|
+
const warnings = [];
|
|
69
|
+
// Check if config file exists
|
|
70
|
+
if (!fs.existsSync(configPath)) {
|
|
71
|
+
return {
|
|
72
|
+
config: config_1.DEFAULT_CONFIG,
|
|
73
|
+
source: 'defaults',
|
|
74
|
+
warnings: ['No config.yaml found, using defaults'],
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
// Read and parse YAML
|
|
78
|
+
let rawContent;
|
|
79
|
+
try {
|
|
80
|
+
rawContent = fs.readFileSync(configPath, 'utf-8');
|
|
81
|
+
}
|
|
82
|
+
catch (error) {
|
|
83
|
+
throw new ConfigError(`Failed to read config file: ${error.message}`);
|
|
84
|
+
}
|
|
85
|
+
// Handle empty file
|
|
86
|
+
if (!rawContent.trim()) {
|
|
87
|
+
return {
|
|
88
|
+
config: config_1.DEFAULT_CONFIG,
|
|
89
|
+
source: 'defaults',
|
|
90
|
+
warnings: ['config.yaml is empty, using defaults'],
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
// Parse YAML
|
|
94
|
+
let parsed;
|
|
95
|
+
try {
|
|
96
|
+
parsed = yaml.parse(rawContent);
|
|
97
|
+
}
|
|
98
|
+
catch (error) {
|
|
99
|
+
const yamlError = error;
|
|
100
|
+
const lineInfo = yamlError.linePos ? ` at line ${yamlError.linePos[0].line}` : '';
|
|
101
|
+
throw new ConfigError(`Invalid YAML syntax${lineInfo}: ${yamlError.message}`);
|
|
102
|
+
}
|
|
103
|
+
// Handle null/undefined parsed result
|
|
104
|
+
if (parsed === null || parsed === undefined) {
|
|
105
|
+
return {
|
|
106
|
+
config: config_1.DEFAULT_CONFIG,
|
|
107
|
+
source: 'defaults',
|
|
108
|
+
warnings: ['config.yaml parsed as empty, using defaults'],
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
// Check for unknown keys (warn but continue)
|
|
112
|
+
if (typeof parsed === 'object' && parsed !== null) {
|
|
113
|
+
const knownKeys = ['version', 'compile', 'conflict_resolution', 'migration'];
|
|
114
|
+
const unknownKeys = Object.keys(parsed).filter((key) => !knownKeys.includes(key));
|
|
115
|
+
if (unknownKeys.length > 0) {
|
|
116
|
+
warnings.push(`Unknown configuration keys will be ignored: ${unknownKeys.join(', ')}`);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
// Validate against schema
|
|
120
|
+
const result = config_1.ConfigSchema.safeParse(parsed);
|
|
121
|
+
if (!result.success) {
|
|
122
|
+
const firstError = result.error.issues[0];
|
|
123
|
+
const path = firstError.path.join('.');
|
|
124
|
+
throw new ConfigError(`Configuration validation failed at '${path}': ${firstError.message}`, undefined, result.error);
|
|
125
|
+
}
|
|
126
|
+
return {
|
|
127
|
+
config: result.data,
|
|
128
|
+
source: 'file',
|
|
129
|
+
warnings,
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Validate a configuration object
|
|
134
|
+
*
|
|
135
|
+
* @param config - Configuration object to validate
|
|
136
|
+
* @returns Validation result
|
|
137
|
+
*/
|
|
138
|
+
function validateConfig(config) {
|
|
139
|
+
const result = config_1.ConfigSchema.safeParse(config);
|
|
140
|
+
if (result.success) {
|
|
141
|
+
return { valid: true, errors: [] };
|
|
142
|
+
}
|
|
143
|
+
const errors = result.error.issues.map((err) => {
|
|
144
|
+
const path = err.path.join('.');
|
|
145
|
+
return `${path}: ${err.message}`;
|
|
146
|
+
});
|
|
147
|
+
return { valid: false, errors };
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Get the default configuration
|
|
151
|
+
*/
|
|
152
|
+
function getDefaultConfig() {
|
|
153
|
+
return { ...config_1.DEFAULT_CONFIG };
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Merge partial configuration with defaults
|
|
157
|
+
*
|
|
158
|
+
* @param partial - Partial configuration to merge
|
|
159
|
+
* @returns Complete configuration with defaults filled in
|
|
160
|
+
*/
|
|
161
|
+
function mergeWithDefaults(partial) {
|
|
162
|
+
return config_1.ConfigSchema.parse({
|
|
163
|
+
...config_1.DEFAULT_CONFIG,
|
|
164
|
+
...partial,
|
|
165
|
+
compile: {
|
|
166
|
+
...config_1.DEFAULT_CONFIG.compile,
|
|
167
|
+
...partial.compile,
|
|
168
|
+
},
|
|
169
|
+
conflict_resolution: {
|
|
170
|
+
...config_1.DEFAULT_CONFIG.conflict_resolution,
|
|
171
|
+
...partial.conflict_resolution,
|
|
172
|
+
},
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
//# sourceMappingURL=loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/config/loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gitignore Manager
|
|
3
|
+
*
|
|
4
|
+
* Manages .gitignore entries for ctx build artifacts.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Gitignore management options
|
|
8
|
+
*/
|
|
9
|
+
export interface GitignoreOptions {
|
|
10
|
+
/** Ignore build manifest (default: true) */
|
|
11
|
+
ignoreBuildManifest?: boolean;
|
|
12
|
+
/** Ignore build lock file (default: true) */
|
|
13
|
+
ignoreBuildLock?: boolean;
|
|
14
|
+
/** Ignore compiled outputs - only if user wants source-of-truth in .context/ */
|
|
15
|
+
ignoreCompiledOutputs?: boolean;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Gitignore Manager class
|
|
19
|
+
*/
|
|
20
|
+
export declare class GitignoreManager {
|
|
21
|
+
private gitignorePath;
|
|
22
|
+
constructor(projectRoot: string);
|
|
23
|
+
/**
|
|
24
|
+
* Check if .gitignore exists
|
|
25
|
+
*/
|
|
26
|
+
exists(): boolean;
|
|
27
|
+
/**
|
|
28
|
+
* Read current .gitignore content
|
|
29
|
+
*/
|
|
30
|
+
read(): Promise<string>;
|
|
31
|
+
/**
|
|
32
|
+
* Check if ctx entries are already present
|
|
33
|
+
*/
|
|
34
|
+
hasCtxEntries(): Promise<boolean>;
|
|
35
|
+
/**
|
|
36
|
+
* Get entries that need to be added
|
|
37
|
+
*/
|
|
38
|
+
getMissingEntries(options?: GitignoreOptions): Promise<string[]>;
|
|
39
|
+
/**
|
|
40
|
+
* Add ctx entries to .gitignore
|
|
41
|
+
*/
|
|
42
|
+
addCtxEntries(options?: GitignoreOptions): Promise<{
|
|
43
|
+
added: string[];
|
|
44
|
+
skipped: string[];
|
|
45
|
+
}>;
|
|
46
|
+
/**
|
|
47
|
+
* Remove ctx entries from .gitignore
|
|
48
|
+
*/
|
|
49
|
+
removeCtxEntries(): Promise<string[]>;
|
|
50
|
+
/**
|
|
51
|
+
* Create .gitignore with ctx entries if it doesn't exist
|
|
52
|
+
*/
|
|
53
|
+
createWithCtxEntries(options?: GitignoreOptions): Promise<boolean>;
|
|
54
|
+
/**
|
|
55
|
+
* Get recommended .gitignore entries as a string
|
|
56
|
+
*/
|
|
57
|
+
static getRecommendedEntries(includeCompiledOutputs?: boolean): string;
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=gitignore.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gitignore.d.ts","sourceRoot":"","sources":["../../src/git/gitignore.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,4CAA4C;IAC5C,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,6CAA6C;IAC7C,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,gFAAgF;IAChF,qBAAqB,CAAC,EAAE,OAAO,CAAC;CACjC;AAsBD;;GAEG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,aAAa,CAAS;gBAElB,WAAW,EAAE,MAAM;IAI/B;;OAEG;IACH,MAAM,IAAI,OAAO;IAIjB;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC;IAO7B;;OAEG;IACG,aAAa,IAAI,OAAO,CAAC,OAAO,CAAC;IAKvC;;OAEG;IACG,iBAAiB,CAAC,OAAO,GAAE,gBAAqB,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAmC1E;;OAEG;IACG,aAAa,CAAC,OAAO,GAAE,gBAAqB,GAAG,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,EAAE,CAAC;QAAC,OAAO,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IAqFpG;;OAEG;IACG,gBAAgB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAuC3C;;OAEG;IACG,oBAAoB,CAAC,OAAO,GAAE,gBAAqB,GAAG,OAAO,CAAC,OAAO,CAAC;IAmC5E;;OAEG;IACH,MAAM,CAAC,qBAAqB,CAAC,sBAAsB,UAAQ,GAAG,MAAM;CAUrE"}
|
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Gitignore Manager
|
|
4
|
+
*
|
|
5
|
+
* Manages .gitignore entries for ctx build artifacts.
|
|
6
|
+
*/
|
|
7
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
8
|
+
if (k2 === undefined) k2 = k;
|
|
9
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
10
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
11
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
12
|
+
}
|
|
13
|
+
Object.defineProperty(o, k2, desc);
|
|
14
|
+
}) : (function(o, m, k, k2) {
|
|
15
|
+
if (k2 === undefined) k2 = k;
|
|
16
|
+
o[k2] = m[k];
|
|
17
|
+
}));
|
|
18
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
19
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
20
|
+
}) : function(o, v) {
|
|
21
|
+
o["default"] = v;
|
|
22
|
+
});
|
|
23
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
24
|
+
var ownKeys = function(o) {
|
|
25
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
26
|
+
var ar = [];
|
|
27
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
28
|
+
return ar;
|
|
29
|
+
};
|
|
30
|
+
return ownKeys(o);
|
|
31
|
+
};
|
|
32
|
+
return function (mod) {
|
|
33
|
+
if (mod && mod.__esModule) return mod;
|
|
34
|
+
var result = {};
|
|
35
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
36
|
+
__setModuleDefault(result, mod);
|
|
37
|
+
return result;
|
|
38
|
+
};
|
|
39
|
+
})();
|
|
40
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
41
|
+
exports.GitignoreManager = void 0;
|
|
42
|
+
const fs = __importStar(require("fs"));
|
|
43
|
+
const path = __importStar(require("path"));
|
|
44
|
+
/**
|
|
45
|
+
* Default entries to add to .gitignore
|
|
46
|
+
*/
|
|
47
|
+
const DEFAULT_IGNORE_ENTRIES = [
|
|
48
|
+
'# ctx build artifacts',
|
|
49
|
+
'.context/.build-manifest.json',
|
|
50
|
+
'.context/.build.lock',
|
|
51
|
+
];
|
|
52
|
+
/**
|
|
53
|
+
* Optional entries for compiled outputs
|
|
54
|
+
*/
|
|
55
|
+
const COMPILED_OUTPUT_ENTRIES = [
|
|
56
|
+
'# ctx compiled outputs (source of truth is in .context/)',
|
|
57
|
+
'# Uncomment if you want to ignore compiled files:',
|
|
58
|
+
'# CLAUDE.md',
|
|
59
|
+
'# AGENTS.md',
|
|
60
|
+
'# .cursor/rules/',
|
|
61
|
+
];
|
|
62
|
+
/**
|
|
63
|
+
* Gitignore Manager class
|
|
64
|
+
*/
|
|
65
|
+
class GitignoreManager {
|
|
66
|
+
gitignorePath;
|
|
67
|
+
constructor(projectRoot) {
|
|
68
|
+
this.gitignorePath = path.join(projectRoot, '.gitignore');
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Check if .gitignore exists
|
|
72
|
+
*/
|
|
73
|
+
exists() {
|
|
74
|
+
return fs.existsSync(this.gitignorePath);
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Read current .gitignore content
|
|
78
|
+
*/
|
|
79
|
+
async read() {
|
|
80
|
+
if (!this.exists()) {
|
|
81
|
+
return '';
|
|
82
|
+
}
|
|
83
|
+
return fs.promises.readFile(this.gitignorePath, 'utf-8');
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Check if ctx entries are already present
|
|
87
|
+
*/
|
|
88
|
+
async hasCtxEntries() {
|
|
89
|
+
const content = await this.read();
|
|
90
|
+
return content.includes('.context/.build-manifest.json');
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Get entries that need to be added
|
|
94
|
+
*/
|
|
95
|
+
async getMissingEntries(options = {}) {
|
|
96
|
+
const { ignoreBuildManifest = true, ignoreBuildLock = true, ignoreCompiledOutputs = false, } = options;
|
|
97
|
+
const content = await this.read();
|
|
98
|
+
const lines = content.split('\n');
|
|
99
|
+
const missing = [];
|
|
100
|
+
// Check default entries
|
|
101
|
+
if (ignoreBuildManifest && !lines.some((l) => l.includes('.build-manifest.json'))) {
|
|
102
|
+
missing.push('.context/.build-manifest.json');
|
|
103
|
+
}
|
|
104
|
+
if (ignoreBuildLock && !lines.some((l) => l.includes('.build.lock'))) {
|
|
105
|
+
missing.push('.context/.build.lock');
|
|
106
|
+
}
|
|
107
|
+
// Check compiled output entries if requested
|
|
108
|
+
if (ignoreCompiledOutputs) {
|
|
109
|
+
if (!lines.some((l) => l.trim() === 'CLAUDE.md')) {
|
|
110
|
+
missing.push('CLAUDE.md');
|
|
111
|
+
}
|
|
112
|
+
if (!lines.some((l) => l.trim() === 'AGENTS.md')) {
|
|
113
|
+
missing.push('AGENTS.md');
|
|
114
|
+
}
|
|
115
|
+
if (!lines.some((l) => l.includes('.cursor/rules'))) {
|
|
116
|
+
missing.push('.cursor/rules/');
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
return missing;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Add ctx entries to .gitignore
|
|
123
|
+
*/
|
|
124
|
+
async addCtxEntries(options = {}) {
|
|
125
|
+
const { ignoreBuildManifest = true, ignoreBuildLock = true, ignoreCompiledOutputs = false, } = options;
|
|
126
|
+
const added = [];
|
|
127
|
+
const skipped = [];
|
|
128
|
+
let content = await this.read();
|
|
129
|
+
const lines = content.split('\n');
|
|
130
|
+
// Build entries to add
|
|
131
|
+
const entriesToAdd = [];
|
|
132
|
+
// Add header if no ctx entries exist
|
|
133
|
+
if (!content.includes('# ctx')) {
|
|
134
|
+
entriesToAdd.push('');
|
|
135
|
+
entriesToAdd.push('# ctx build artifacts');
|
|
136
|
+
}
|
|
137
|
+
// Add build manifest
|
|
138
|
+
if (ignoreBuildManifest) {
|
|
139
|
+
if (!lines.some((l) => l.includes('.build-manifest.json'))) {
|
|
140
|
+
entriesToAdd.push('.context/.build-manifest.json');
|
|
141
|
+
added.push('.context/.build-manifest.json');
|
|
142
|
+
}
|
|
143
|
+
else {
|
|
144
|
+
skipped.push('.context/.build-manifest.json');
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
// Add build lock
|
|
148
|
+
if (ignoreBuildLock) {
|
|
149
|
+
if (!lines.some((l) => l.includes('.build.lock'))) {
|
|
150
|
+
entriesToAdd.push('.context/.build.lock');
|
|
151
|
+
added.push('.context/.build.lock');
|
|
152
|
+
}
|
|
153
|
+
else {
|
|
154
|
+
skipped.push('.context/.build.lock');
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
// Add compiled outputs if requested
|
|
158
|
+
if (ignoreCompiledOutputs) {
|
|
159
|
+
if (!content.includes('# ctx compiled outputs')) {
|
|
160
|
+
entriesToAdd.push('');
|
|
161
|
+
entriesToAdd.push('# ctx compiled outputs');
|
|
162
|
+
}
|
|
163
|
+
if (!lines.some((l) => l.trim() === 'CLAUDE.md')) {
|
|
164
|
+
entriesToAdd.push('CLAUDE.md');
|
|
165
|
+
added.push('CLAUDE.md');
|
|
166
|
+
}
|
|
167
|
+
else {
|
|
168
|
+
skipped.push('CLAUDE.md');
|
|
169
|
+
}
|
|
170
|
+
if (!lines.some((l) => l.trim() === 'AGENTS.md')) {
|
|
171
|
+
entriesToAdd.push('AGENTS.md');
|
|
172
|
+
added.push('AGENTS.md');
|
|
173
|
+
}
|
|
174
|
+
else {
|
|
175
|
+
skipped.push('AGENTS.md');
|
|
176
|
+
}
|
|
177
|
+
if (!lines.some((l) => l.includes('.cursor/rules'))) {
|
|
178
|
+
entriesToAdd.push('.cursor/rules/');
|
|
179
|
+
added.push('.cursor/rules/');
|
|
180
|
+
}
|
|
181
|
+
else {
|
|
182
|
+
skipped.push('.cursor/rules/');
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
// Write updates if there are entries to add
|
|
186
|
+
if (entriesToAdd.length > 0) {
|
|
187
|
+
// Ensure content ends with newline
|
|
188
|
+
if (content.length > 0 && !content.endsWith('\n')) {
|
|
189
|
+
content += '\n';
|
|
190
|
+
}
|
|
191
|
+
content += entriesToAdd.join('\n') + '\n';
|
|
192
|
+
await fs.promises.writeFile(this.gitignorePath, content, 'utf-8');
|
|
193
|
+
}
|
|
194
|
+
return { added, skipped };
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Remove ctx entries from .gitignore
|
|
198
|
+
*/
|
|
199
|
+
async removeCtxEntries() {
|
|
200
|
+
if (!this.exists()) {
|
|
201
|
+
return [];
|
|
202
|
+
}
|
|
203
|
+
const content = await this.read();
|
|
204
|
+
const lines = content.split('\n');
|
|
205
|
+
const removed = [];
|
|
206
|
+
const filteredLines = lines.filter((line) => {
|
|
207
|
+
const trimmed = line.trim();
|
|
208
|
+
// Remove ctx comments
|
|
209
|
+
if (trimmed.startsWith('# ctx')) {
|
|
210
|
+
return false;
|
|
211
|
+
}
|
|
212
|
+
// Remove ctx-specific entries
|
|
213
|
+
if (trimmed === '.context/.build-manifest.json' ||
|
|
214
|
+
trimmed === '.context/.build.lock' ||
|
|
215
|
+
trimmed === 'CLAUDE.md' ||
|
|
216
|
+
trimmed === 'AGENTS.md' ||
|
|
217
|
+
trimmed === '.cursor/rules/' ||
|
|
218
|
+
trimmed === '.cursor/rules') {
|
|
219
|
+
removed.push(trimmed);
|
|
220
|
+
return false;
|
|
221
|
+
}
|
|
222
|
+
return true;
|
|
223
|
+
});
|
|
224
|
+
// Write back
|
|
225
|
+
await fs.promises.writeFile(this.gitignorePath, filteredLines.join('\n'), 'utf-8');
|
|
226
|
+
return removed;
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Create .gitignore with ctx entries if it doesn't exist
|
|
230
|
+
*/
|
|
231
|
+
async createWithCtxEntries(options = {}) {
|
|
232
|
+
if (this.exists()) {
|
|
233
|
+
return false;
|
|
234
|
+
}
|
|
235
|
+
const { ignoreBuildManifest = true, ignoreBuildLock = true, ignoreCompiledOutputs = false, } = options;
|
|
236
|
+
const lines = [];
|
|
237
|
+
lines.push('# ctx build artifacts');
|
|
238
|
+
if (ignoreBuildManifest) {
|
|
239
|
+
lines.push('.context/.build-manifest.json');
|
|
240
|
+
}
|
|
241
|
+
if (ignoreBuildLock) {
|
|
242
|
+
lines.push('.context/.build.lock');
|
|
243
|
+
}
|
|
244
|
+
if (ignoreCompiledOutputs) {
|
|
245
|
+
lines.push('');
|
|
246
|
+
lines.push('# ctx compiled outputs');
|
|
247
|
+
lines.push('CLAUDE.md');
|
|
248
|
+
lines.push('AGENTS.md');
|
|
249
|
+
lines.push('.cursor/rules/');
|
|
250
|
+
}
|
|
251
|
+
lines.push('');
|
|
252
|
+
await fs.promises.writeFile(this.gitignorePath, lines.join('\n'), 'utf-8');
|
|
253
|
+
return true;
|
|
254
|
+
}
|
|
255
|
+
/**
|
|
256
|
+
* Get recommended .gitignore entries as a string
|
|
257
|
+
*/
|
|
258
|
+
static getRecommendedEntries(includeCompiledOutputs = false) {
|
|
259
|
+
const lines = [...DEFAULT_IGNORE_ENTRIES];
|
|
260
|
+
if (includeCompiledOutputs) {
|
|
261
|
+
lines.push('');
|
|
262
|
+
lines.push(...COMPILED_OUTPUT_ENTRIES);
|
|
263
|
+
}
|
|
264
|
+
return lines.join('\n');
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
exports.GitignoreManager = GitignoreManager;
|
|
268
|
+
//# sourceMappingURL=gitignore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gitignore.js","sourceRoot":"","sources":["../../src/git/gitignore.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEH,uCAAyB;AACzB,2CAA6B;AAc7B;;GAEG;AACH,MAAM,sBAAsB,GAAG;IAC7B,uBAAuB;IACvB,+BAA+B;IAC/B,sBAAsB;CACvB,CAAC;AAEF;;GAEG;AACH,MAAM,uBAAuB,GAAG;IAC9B,0DAA0D;IAC1D,mDAAmD;IACnD,aAAa;IACb,aAAa;IACb,kBAAkB;CACnB,CAAC;AAEF;;GAEG;AACH,MAAa,gBAAgB;IACnB,aAAa,CAAS;IAE9B,YAAY,WAAmB;QAC7B,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;IAC5D,CAAC;IAED;;OAEG;IACH,MAAM;QACJ,OAAO,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAC3C,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,IAAI;QACR,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;YACnB,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,OAAO,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;IAC3D,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,aAAa;QACjB,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAClC,OAAO,OAAO,CAAC,QAAQ,CAAC,+BAA+B,CAAC,CAAC;IAC3D,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,iBAAiB,CAAC,UAA4B,EAAE;QACpD,MAAM,EACJ,mBAAmB,GAAG,IAAI,EAC1B,eAAe,GAAG,IAAI,EACtB,qBAAqB,GAAG,KAAK,GAC9B,GAAG,OAAO,CAAC;QAEZ,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAClC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,OAAO,GAAa,EAAE,CAAC;QAE7B,wBAAwB;QACxB,IAAI,mBAAmB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,sBAAsB,CAAC,CAAC,EAAE,CAAC;YAClF,OAAO,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;QAChD,CAAC;QACD,IAAI,eAAe,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC;YACrE,OAAO,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;QACvC,CAAC;QAED,6CAA6C;QAC7C,IAAI,qBAAqB,EAAE,CAAC;YAC1B,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,WAAW,CAAC,EAAE,CAAC;gBACjD,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAC5B,CAAC;YACD,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,WAAW,CAAC,EAAE,CAAC;gBACjD,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAC5B,CAAC;YACD,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC,EAAE,CAAC;gBACpD,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;YACjC,CAAC;QACH,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,aAAa,CAAC,UAA4B,EAAE;QAChD,MAAM,EACJ,mBAAmB,GAAG,IAAI,EAC1B,eAAe,GAAG,IAAI,EACtB,qBAAqB,GAAG,KAAK,GAC9B,GAAG,OAAO,CAAC;QAEZ,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,MAAM,OAAO,GAAa,EAAE,CAAC;QAE7B,IAAI,OAAO,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAChC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAElC,uBAAuB;QACvB,MAAM,YAAY,GAAa,EAAE,CAAC;QAElC,qCAAqC;QACrC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YAC/B,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACtB,YAAY,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;QAC7C,CAAC;QAED,qBAAqB;QACrB,IAAI,mBAAmB,EAAE,CAAC;YACxB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,sBAAsB,CAAC,CAAC,EAAE,CAAC;gBAC3D,YAAY,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;gBACnD,KAAK,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;YAC9C,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;YAChD,CAAC;QACH,CAAC;QAED,iBAAiB;QACjB,IAAI,eAAe,EAAE,CAAC;YACpB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC;gBAClD,YAAY,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;gBAC1C,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;YACrC,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;YACvC,CAAC;QACH,CAAC;QAED,oCAAoC;QACpC,IAAI,qBAAqB,EAAE,CAAC;YAC1B,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,wBAAwB,CAAC,EAAE,CAAC;gBAChD,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACtB,YAAY,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;YAC9C,CAAC;YAED,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,WAAW,CAAC,EAAE,CAAC;gBACjD,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;gBAC/B,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAC1B,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAC5B,CAAC;YAED,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,WAAW,CAAC,EAAE,CAAC;gBACjD,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;gBAC/B,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAC1B,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAC5B,CAAC;YAED,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC,EAAE,CAAC;gBACpD,YAAY,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;gBACpC,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;YAC/B,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;YACjC,CAAC;QACH,CAAC;QAED,4CAA4C;QAC5C,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5B,mCAAmC;YACnC,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;gBAClD,OAAO,IAAI,IAAI,CAAC;YAClB,CAAC;YAED,OAAO,IAAI,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;YAC1C,MAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,aAAa,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QACpE,CAAC;QAED,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;IAC5B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,gBAAgB;QACpB,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;YACnB,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAClC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,OAAO,GAAa,EAAE,CAAC;QAE7B,MAAM,aAAa,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;YAC1C,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YAE5B,sBAAsB;YACtB,IAAI,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;gBAChC,OAAO,KAAK,CAAC;YACf,CAAC;YAED,8BAA8B;YAC9B,IACE,OAAO,KAAK,+BAA+B;gBAC3C,OAAO,KAAK,sBAAsB;gBAClC,OAAO,KAAK,WAAW;gBACvB,OAAO,KAAK,WAAW;gBACvB,OAAO,KAAK,gBAAgB;gBAC5B,OAAO,KAAK,eAAe,EAC3B,CAAC;gBACD,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBACtB,OAAO,KAAK,CAAC;YACf,CAAC;YAED,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;QAEH,aAAa;QACb,MAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,aAAa,EAAE,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;QAEnF,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,oBAAoB,CAAC,UAA4B,EAAE;QACvD,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;YAClB,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,EACJ,mBAAmB,GAAG,IAAI,EAC1B,eAAe,GAAG,IAAI,EACtB,qBAAqB,GAAG,KAAK,GAC9B,GAAG,OAAO,CAAC;QAEZ,MAAM,KAAK,GAAa,EAAE,CAAC;QAE3B,KAAK,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;QACpC,IAAI,mBAAmB,EAAE,CAAC;YACxB,KAAK,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;QAC9C,CAAC;QACD,IAAI,eAAe,EAAE,CAAC;YACpB,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;QACrC,CAAC;QAED,IAAI,qBAAqB,EAAE,CAAC;YAC1B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACf,KAAK,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;YACrC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YACxB,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YACxB,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAC/B,CAAC;QAED,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAEf,MAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,aAAa,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;QAC3E,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,qBAAqB,CAAC,sBAAsB,GAAG,KAAK;QACzD,MAAM,KAAK,GAAG,CAAC,GAAG,sBAAsB,CAAC,CAAC;QAE1C,IAAI,sBAAsB,EAAE,CAAC;YAC3B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACf,KAAK,CAAC,IAAI,CAAC,GAAG,uBAAuB,CAAC,CAAC;QACzC,CAAC;QAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;CACF;AA3PD,4CA2PC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Git Hooks Generator
|
|
3
|
+
*
|
|
4
|
+
* Generates pre-commit hook scripts for ctx integration.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Pre-commit hook options
|
|
8
|
+
*/
|
|
9
|
+
export interface PreCommitOptions {
|
|
10
|
+
/** Use incremental build (default: true) */
|
|
11
|
+
incremental?: boolean;
|
|
12
|
+
/** Auto-stage compiled outputs (default: true) */
|
|
13
|
+
autoStage?: boolean;
|
|
14
|
+
/** Skip validation (not recommended) */
|
|
15
|
+
skipValidation?: boolean;
|
|
16
|
+
/** Verbose output */
|
|
17
|
+
verbose?: boolean;
|
|
18
|
+
/** Quiet output */
|
|
19
|
+
quiet?: boolean;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Generate pre-commit hook script content
|
|
23
|
+
*/
|
|
24
|
+
export declare function generatePreCommitHook(options?: PreCommitOptions): string;
|
|
25
|
+
/**
|
|
26
|
+
* Generate a minimal pre-commit hook (without husky.sh sourcing)
|
|
27
|
+
* For use in non-husky setups
|
|
28
|
+
*/
|
|
29
|
+
export declare function generateStandalonePreCommitHook(options?: PreCommitOptions): string;
|
|
30
|
+
/**
|
|
31
|
+
* Get the list of files that will be auto-staged
|
|
32
|
+
*/
|
|
33
|
+
export declare function getAutoStagedFiles(): string[];
|
|
34
|
+
//# sourceMappingURL=hooks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../src/git/hooks.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,4CAA4C;IAC5C,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,kDAAkD;IAClD,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,wCAAwC;IACxC,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,qBAAqB;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,mBAAmB;IACnB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,GAAE,gBAAqB,GAAG,MAAM,CA4E5E;AAED;;;GAGG;AACH,wBAAgB,+BAA+B,CAAC,OAAO,GAAE,gBAAqB,GAAG,MAAM,CA2CtF;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,EAAE,CAE7C"}
|