opencarly 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. package/README.md +78 -0
  2. package/bin/install.js +304 -0
  3. package/commands/carly-manager.md +69 -0
  4. package/dist/config/discovery.d.ts +22 -0
  5. package/dist/config/discovery.d.ts.map +1 -0
  6. package/dist/config/discovery.js +43 -0
  7. package/dist/config/discovery.js.map +1 -0
  8. package/dist/config/index.d.ts +7 -0
  9. package/dist/config/index.d.ts.map +1 -0
  10. package/dist/config/index.js +7 -0
  11. package/dist/config/index.js.map +1 -0
  12. package/dist/config/manifest.d.ts +39 -0
  13. package/dist/config/manifest.d.ts.map +1 -0
  14. package/dist/config/manifest.js +139 -0
  15. package/dist/config/manifest.js.map +1 -0
  16. package/dist/config/schema.d.ts +663 -0
  17. package/dist/config/schema.d.ts.map +1 -0
  18. package/dist/config/schema.js +208 -0
  19. package/dist/config/schema.js.map +1 -0
  20. package/dist/engine/brackets.d.ts +26 -0
  21. package/dist/engine/brackets.d.ts.map +1 -0
  22. package/dist/engine/brackets.js +49 -0
  23. package/dist/engine/brackets.js.map +1 -0
  24. package/dist/engine/index.d.ts +8 -0
  25. package/dist/engine/index.d.ts.map +1 -0
  26. package/dist/engine/index.js +8 -0
  27. package/dist/engine/index.js.map +1 -0
  28. package/dist/engine/loader.d.ts +82 -0
  29. package/dist/engine/loader.d.ts.map +1 -0
  30. package/dist/engine/loader.js +147 -0
  31. package/dist/engine/loader.js.map +1 -0
  32. package/dist/engine/matcher.d.ts +43 -0
  33. package/dist/engine/matcher.d.ts.map +1 -0
  34. package/dist/engine/matcher.js +174 -0
  35. package/dist/engine/matcher.js.map +1 -0
  36. package/dist/engine/trimmer.d.ts +91 -0
  37. package/dist/engine/trimmer.d.ts.map +1 -0
  38. package/dist/engine/trimmer.js +236 -0
  39. package/dist/engine/trimmer.js.map +1 -0
  40. package/dist/formatter/formatter.d.ts +23 -0
  41. package/dist/formatter/formatter.d.ts.map +1 -0
  42. package/dist/formatter/formatter.js +129 -0
  43. package/dist/formatter/formatter.js.map +1 -0
  44. package/dist/index.d.ts +15 -0
  45. package/dist/index.d.ts.map +1 -0
  46. package/dist/index.js +484 -0
  47. package/dist/index.js.map +1 -0
  48. package/dist/session/session.d.ts +60 -0
  49. package/dist/session/session.d.ts.map +1 -0
  50. package/dist/session/session.js +394 -0
  51. package/dist/session/session.js.map +1 -0
  52. package/package.json +59 -0
  53. package/templates/.opencarly/commands.json +96 -0
  54. package/templates/.opencarly/context.json +44 -0
  55. package/templates/.opencarly/domains/development.md +13 -0
  56. package/templates/.opencarly/domains/global.md +13 -0
  57. package/templates/.opencarly/domains/security.md +14 -0
  58. package/templates/.opencarly/domains/testing.md +12 -0
  59. package/templates/.opencarly/manifest.json +43 -0
@@ -0,0 +1,139 @@
1
+ /**
2
+ * OpenCarly Config Loader
3
+ *
4
+ * Parses and validates manifest.json, commands.json, and context.json
5
+ * from the discovered .opencarly/ directory.
6
+ * Collects warnings for non-fatal issues instead of silently ignoring them.
7
+ */
8
+ import * as fs from "fs";
9
+ import * as path from "path";
10
+ import { ZodError } from "zod";
11
+ import { ManifestSchema, CommandsFileSchema, ContextFileSchema, } from "./schema";
12
+ /**
13
+ * Read and parse a JSON file. Returns null if file doesn't exist.
14
+ * Throws on invalid JSON.
15
+ */
16
+ function readJsonFile(filePath) {
17
+ if (!fs.existsSync(filePath)) {
18
+ return null;
19
+ }
20
+ const raw = fs.readFileSync(filePath, "utf-8");
21
+ return JSON.parse(raw);
22
+ }
23
+ /**
24
+ * Format Zod errors into human-readable messages.
25
+ */
26
+ function formatZodErrors(error) {
27
+ return error.issues
28
+ .map((issue) => {
29
+ const path = issue.path.length > 0 ? issue.path.join(".") : "(root)";
30
+ return ` ${path}: ${issue.message}`;
31
+ })
32
+ .join("\n");
33
+ }
34
+ /**
35
+ * Load all configuration from a .opencarly/ directory.
36
+ * Validates against Zod schemas. Collects warnings for non-fatal issues.
37
+ * Throws only when manifest.json is missing entirely.
38
+ */
39
+ export function loadConfig(configPath) {
40
+ const warnings = [];
41
+ // manifest.json (required)
42
+ const manifestPath = path.join(configPath, "manifest.json");
43
+ const manifestRaw = readJsonFile(manifestPath);
44
+ if (manifestRaw === null) {
45
+ throw new Error(`OpenCarly: manifest.json not found at ${manifestPath}`);
46
+ }
47
+ let manifest;
48
+ try {
49
+ manifest = ManifestSchema.parse(manifestRaw);
50
+ }
51
+ catch (err) {
52
+ if (err instanceof ZodError) {
53
+ throw new Error(`OpenCarly: manifest.json validation failed:\n${formatZodErrors(err)}`);
54
+ }
55
+ throw err;
56
+ }
57
+ // Validate domain file references exist
58
+ for (const [name, domain] of Object.entries(manifest.domains)) {
59
+ const domainFilePath = path.join(configPath, domain.file);
60
+ if (!fs.existsSync(domainFilePath)) {
61
+ warnings.push(`Domain "${name}" references file "${domain.file}" which does not exist`);
62
+ }
63
+ }
64
+ // commands.json (optional - defaults to empty)
65
+ const commandsPath = path.join(configPath, "commands.json");
66
+ let commands = {};
67
+ const commandsRaw = readJsonFile(commandsPath);
68
+ if (commandsRaw !== null) {
69
+ try {
70
+ commands = CommandsFileSchema.parse(commandsRaw);
71
+ }
72
+ catch (err) {
73
+ if (err instanceof ZodError) {
74
+ warnings.push(`commands.json has validation errors (using defaults):\n${formatZodErrors(err)}`);
75
+ }
76
+ else if (err instanceof SyntaxError) {
77
+ warnings.push(`commands.json has invalid JSON syntax (using defaults)`);
78
+ }
79
+ }
80
+ }
81
+ // context.json (optional - defaults to empty with default thresholds)
82
+ const contextPath = path.join(configPath, "context.json");
83
+ let context = ContextFileSchema.parse({});
84
+ const contextRaw = readJsonFile(contextPath);
85
+ if (contextRaw !== null) {
86
+ try {
87
+ context = ContextFileSchema.parse(contextRaw);
88
+ }
89
+ catch (err) {
90
+ if (err instanceof ZodError) {
91
+ warnings.push(`context.json has validation errors (using defaults):\n${formatZodErrors(err)}`);
92
+ }
93
+ else if (err instanceof SyntaxError) {
94
+ warnings.push(`context.json has invalid JSON syntax (using defaults)`);
95
+ }
96
+ }
97
+ }
98
+ // Validate context thresholds make sense
99
+ if (context.thresholds.moderate >= context.thresholds.depleted) {
100
+ warnings.push(`context.json: moderate threshold (${context.thresholds.moderate}) should be less than depleted (${context.thresholds.depleted})`);
101
+ }
102
+ if (context.thresholds.depleted >= context.thresholds.critical) {
103
+ warnings.push(`context.json: depleted threshold (${context.thresholds.depleted}) should be less than critical (${context.thresholds.critical})`);
104
+ }
105
+ return { manifest, commands, context, configPath, warnings };
106
+ }
107
+ /**
108
+ * Parse a domain rule file (.md).
109
+ *
110
+ * Extracts rules from bullet points (lines starting with "- ").
111
+ * Ignores headings (#), empty lines, and other markdown.
112
+ */
113
+ export function parseDomainFile(filePath) {
114
+ if (!fs.existsSync(filePath)) {
115
+ return [];
116
+ }
117
+ const content = fs.readFileSync(filePath, "utf-8");
118
+ const lines = content.split("\n");
119
+ const rules = [];
120
+ for (const line of lines) {
121
+ const trimmed = line.trim();
122
+ if (trimmed === "")
123
+ continue;
124
+ if (trimmed.startsWith("#"))
125
+ continue;
126
+ if (trimmed.startsWith("- ")) {
127
+ rules.push(trimmed.slice(2).trim());
128
+ }
129
+ }
130
+ return rules;
131
+ }
132
+ /**
133
+ * Reload config from disk. Used when config might have changed
134
+ * (e.g., user edited manifest.json via /carly command).
135
+ */
136
+ export function reloadConfig(configPath) {
137
+ return loadConfig(configPath);
138
+ }
139
+ //# sourceMappingURL=manifest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../src/config/manifest.ts"],"names":[],"mappings":"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"}