@mc1global/opencode-jarvis 0.9.0 → 0.11.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 (91) hide show
  1. package/QUICK-GUIDE.md +42 -28
  2. package/README.md +288 -165
  3. package/dist/application/azure-sync/push-use-cases.d.ts +6 -1
  4. package/dist/application/azure-sync/push-use-cases.d.ts.map +1 -1
  5. package/dist/application/azure-sync/push-use-cases.js +31 -5
  6. package/dist/application/azure-sync/push-use-cases.js.map +1 -1
  7. package/dist/application/config/config-write-service.d.ts +86 -0
  8. package/dist/application/config/config-write-service.d.ts.map +1 -0
  9. package/dist/application/config/config-write-service.js +237 -0
  10. package/dist/application/config/config-write-service.js.map +1 -0
  11. package/dist/application/config/index.d.ts +2 -0
  12. package/dist/application/config/index.d.ts.map +1 -1
  13. package/dist/application/config/index.js +1 -0
  14. package/dist/application/config/index.js.map +1 -1
  15. package/dist/application/context-memory/execution-journal-use-cases.d.ts +69 -0
  16. package/dist/application/context-memory/execution-journal-use-cases.d.ts.map +1 -0
  17. package/dist/application/context-memory/execution-journal-use-cases.js +89 -0
  18. package/dist/application/context-memory/execution-journal-use-cases.js.map +1 -0
  19. package/dist/cli/config-wizard.d.ts +14 -0
  20. package/dist/cli/config-wizard.d.ts.map +1 -0
  21. package/dist/cli/config-wizard.js +120 -0
  22. package/dist/cli/config-wizard.js.map +1 -0
  23. package/dist/cli/section-editors.d.ts +33 -0
  24. package/dist/cli/section-editors.d.ts.map +1 -0
  25. package/dist/cli/section-editors.js +286 -0
  26. package/dist/cli/section-editors.js.map +1 -0
  27. package/dist/cli/wizard-prompts.d.ts +76 -0
  28. package/dist/cli/wizard-prompts.d.ts.map +1 -0
  29. package/dist/cli/wizard-prompts.js +98 -0
  30. package/dist/cli/wizard-prompts.js.map +1 -0
  31. package/dist/domain/azure-sync/value-objects.d.ts +10 -0
  32. package/dist/domain/azure-sync/value-objects.d.ts.map +1 -1
  33. package/dist/domain/azure-sync/value-objects.js +24 -0
  34. package/dist/domain/azure-sync/value-objects.js.map +1 -1
  35. package/dist/domain/config/index.d.ts +1 -1
  36. package/dist/domain/config/index.d.ts.map +1 -1
  37. package/dist/domain/config/repositories.d.ts +26 -6
  38. package/dist/domain/config/repositories.d.ts.map +1 -1
  39. package/dist/domain/config/repositories.js +6 -6
  40. package/dist/domain/context-memory/entities.d.ts +50 -2
  41. package/dist/domain/context-memory/entities.d.ts.map +1 -1
  42. package/dist/domain/context-memory/entities.js +92 -2
  43. package/dist/domain/context-memory/entities.js.map +1 -1
  44. package/dist/domain/context-memory/repositories.d.ts +15 -2
  45. package/dist/domain/context-memory/repositories.d.ts.map +1 -1
  46. package/dist/domain/context-memory/value-objects.d.ts +18 -1
  47. package/dist/domain/context-memory/value-objects.d.ts.map +1 -1
  48. package/dist/domain/context-memory/value-objects.js +39 -1
  49. package/dist/domain/context-memory/value-objects.js.map +1 -1
  50. package/dist/hooks/config-command.d.ts +37 -0
  51. package/dist/hooks/config-command.d.ts.map +1 -0
  52. package/dist/hooks/config-command.js +68 -0
  53. package/dist/hooks/config-command.js.map +1 -0
  54. package/dist/hooks/execution-journal.d.ts +40 -0
  55. package/dist/hooks/execution-journal.d.ts.map +1 -0
  56. package/dist/hooks/execution-journal.js +102 -0
  57. package/dist/hooks/execution-journal.js.map +1 -0
  58. package/dist/hooks/first-run-guide.d.ts +2 -0
  59. package/dist/hooks/first-run-guide.d.ts.map +1 -1
  60. package/dist/hooks/first-run-guide.js +44 -2
  61. package/dist/hooks/first-run-guide.js.map +1 -1
  62. package/dist/hooks/slash-commands.d.ts +36 -0
  63. package/dist/hooks/slash-commands.d.ts.map +1 -0
  64. package/dist/hooks/slash-commands.js +121 -0
  65. package/dist/hooks/slash-commands.js.map +1 -0
  66. package/dist/index.d.ts.map +1 -1
  67. package/dist/index.js +71 -3
  68. package/dist/index.js.map +1 -1
  69. package/dist/infrastructure/azure-sync/azure-devops-client.d.ts.map +1 -1
  70. package/dist/infrastructure/azure-sync/azure-devops-client.js +9 -10
  71. package/dist/infrastructure/azure-sync/azure-devops-client.js.map +1 -1
  72. package/dist/infrastructure/config/index.d.ts +1 -0
  73. package/dist/infrastructure/config/index.d.ts.map +1 -1
  74. package/dist/infrastructure/config/index.js +1 -0
  75. package/dist/infrastructure/config/index.js.map +1 -1
  76. package/dist/infrastructure/config/yaml-config-writer.d.ts +16 -0
  77. package/dist/infrastructure/config/yaml-config-writer.d.ts.map +1 -0
  78. package/dist/infrastructure/config/yaml-config-writer.js +49 -0
  79. package/dist/infrastructure/config/yaml-config-writer.js.map +1 -0
  80. package/dist/infrastructure/context-memory/execution-journal-repository.d.ts +26 -0
  81. package/dist/infrastructure/context-memory/execution-journal-repository.d.ts.map +1 -0
  82. package/dist/infrastructure/context-memory/execution-journal-repository.js +110 -0
  83. package/dist/infrastructure/context-memory/execution-journal-repository.js.map +1 -0
  84. package/dist/tools/config-tools.d.ts +12 -0
  85. package/dist/tools/config-tools.d.ts.map +1 -0
  86. package/dist/tools/config-tools.js +136 -0
  87. package/dist/tools/config-tools.js.map +1 -0
  88. package/package.json +5 -2
  89. package/scripts/setup/setup-linux.sh +124 -0
  90. package/scripts/setup/setup-macos.sh +137 -0
  91. package/scripts/setup/setup-wsl.sh +175 -0
@@ -0,0 +1,89 @@
1
+ import { ExecutionEntry } from "../../domain/context-memory/entities.js";
2
+ // ── Default retention: 7 days ─────────────────────────────────────────
3
+ const DEFAULT_RETENTION_DAYS = 7;
4
+ // ── Use Cases ─────────────────────────────────────────────────────────
5
+ export class ExecutionJournalUseCases {
6
+ repository;
7
+ constructor(repository) {
8
+ this.repository = repository;
9
+ }
10
+ /**
11
+ * Record the start of a tool execution.
12
+ * Creates a Running entry in the journal.
13
+ * Returns the persisted entry with its real ID for later correlation.
14
+ */
15
+ async recordStart(request) {
16
+ const entry = ExecutionEntry.create({
17
+ toolName: request.toolName,
18
+ argsSummary: request.argsSummary,
19
+ workspace: request.workspace,
20
+ });
21
+ const persisted = await this.repository.save(entry);
22
+ return {
23
+ entryId: persisted.id.value,
24
+ toolName: persisted.toolName,
25
+ state: persisted.state,
26
+ startedAt: persisted.startedAt.toISO(),
27
+ };
28
+ }
29
+ /**
30
+ * Record successful completion of a tool execution.
31
+ */
32
+ async recordSuccess(request) {
33
+ const entry = await this.repository.findById(request.entryId);
34
+ if (entry === null)
35
+ return; // Silently ignore if entry was pruned
36
+ entry.markSuccess();
37
+ await this.repository.update(entry);
38
+ }
39
+ /**
40
+ * Record error completion of a tool execution.
41
+ */
42
+ async recordError(request, errorMessage) {
43
+ const entry = await this.repository.findById(request.entryId);
44
+ if (entry === null)
45
+ return; // Silently ignore if entry was pruned
46
+ entry.markError(errorMessage);
47
+ await this.repository.update(entry);
48
+ }
49
+ /**
50
+ * Detect orphaned running entries from prior sessions.
51
+ * Marks them as Crashed and returns a crash report.
52
+ * Should be called once on plugin initialization.
53
+ */
54
+ async detectCrashes(workspace) {
55
+ const orphaned = await this.repository.findRunning(workspace);
56
+ if (orphaned.length === 0) {
57
+ return { orphanedEntries: [], totalCrashed: 0, summary: "" };
58
+ }
59
+ const crashEntries = [];
60
+ for (const entry of orphaned) {
61
+ entry.markCrashed();
62
+ await this.repository.update(entry);
63
+ crashEntries.push({
64
+ entryId: entry.id.value,
65
+ toolName: entry.toolName,
66
+ argsSummary: entry.argsSummary,
67
+ startedAt: entry.startedAt.toISO(),
68
+ });
69
+ }
70
+ const toolList = crashEntries.map((e) => e.toolName).join(", ");
71
+ const summary = `Crash detected: ${crashEntries.length} tool(s) were interrupted — ${toolList}. ` +
72
+ `These were running when the previous session ended unexpectedly.`;
73
+ return {
74
+ orphanedEntries: crashEntries,
75
+ totalCrashed: crashEntries.length,
76
+ summary,
77
+ };
78
+ }
79
+ /**
80
+ * Prune completed/error/crashed entries older than the retention period.
81
+ * Running entries are never pruned (they indicate ongoing or crashed executions).
82
+ */
83
+ async prune(workspace, retentionDays = DEFAULT_RETENTION_DAYS) {
84
+ const cutoff = new Date();
85
+ cutoff.setDate(cutoff.getDate() - retentionDays);
86
+ return this.repository.pruneOlderThan(workspace, cutoff);
87
+ }
88
+ }
89
+ //# sourceMappingURL=execution-journal-use-cases.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"execution-journal-use-cases.js","sourceRoot":"","sources":["../../../src/application/context-memory/execution-journal-use-cases.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,cAAc,EAAE,MAAM,yCAAyC,CAAC;AAqCzE,yEAAyE;AAEzE,MAAM,sBAAsB,GAAG,CAAC,CAAC;AAEjC,yEAAyE;AAEzE,MAAM,OAAO,wBAAwB;IAEhB;IADnB,YACmB,UAAsC;QAAtC,eAAU,GAAV,UAAU,CAA4B;IACtD,CAAC;IAEJ;;;;OAIG;IACH,KAAK,CAAC,WAAW,CAAC,OAA2B;QAC3C,MAAM,KAAK,GAAG,cAAc,CAAC,MAAM,CAAC;YAClC,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,SAAS,EAAE,OAAO,CAAC,SAAS;SAC7B,CAAC,CAAC;QAEH,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAEpD,OAAO;YACL,OAAO,EAAE,SAAS,CAAC,EAAE,CAAC,KAAK;YAC3B,QAAQ,EAAE,SAAS,CAAC,QAAQ;YAC5B,KAAK,EAAE,SAAS,CAAC,KAAK;YACtB,SAAS,EAAE,SAAS,CAAC,SAAS,CAAC,KAAK,EAAE;SACvC,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,aAAa,CAAC,OAA4B;QAC9C,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAC9D,IAAI,KAAK,KAAK,IAAI;YAAE,OAAO,CAAC,sCAAsC;QAElE,KAAK,CAAC,WAAW,EAAE,CAAC;QACpB,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACtC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW,CACf,OAA4B,EAC5B,YAAoB;QAEpB,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAC9D,IAAI,KAAK,KAAK,IAAI;YAAE,OAAO,CAAC,sCAAsC;QAElE,KAAK,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QAC9B,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACtC,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,aAAa,CAAC,SAAsB;QACxC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;QAE9D,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO,EAAE,eAAe,EAAE,EAAE,EAAE,YAAY,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;QAC/D,CAAC;QAED,MAAM,YAAY,GAAiB,EAAE,CAAC;QAEtC,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;YAC7B,KAAK,CAAC,WAAW,EAAE,CAAC;YACpB,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACpC,YAAY,CAAC,IAAI,CAAC;gBAChB,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK;gBACvB,QAAQ,EAAE,KAAK,CAAC,QAAQ;gBACxB,WAAW,EAAE,KAAK,CAAC,WAAW;gBAC9B,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,KAAK,EAAE;aACnC,CAAC,CAAC;QACL,CAAC;QAED,MAAM,QAAQ,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChE,MAAM,OAAO,GACX,mBAAmB,YAAY,CAAC,MAAM,+BAA+B,QAAQ,IAAI;YACjF,kEAAkE,CAAC;QAErE,OAAO;YACL,eAAe,EAAE,YAAY;YAC7B,YAAY,EAAE,YAAY,CAAC,MAAM;YACjC,OAAO;SACR,CAAC;IACJ,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,KAAK,CACT,SAAsB,EACtB,gBAAwB,sBAAsB;QAE9C,MAAM,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QAC1B,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,aAAa,CAAC,CAAC;QACjD,OAAO,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAC3D,CAAC;CACF"}
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env bun
2
+ import { ConfigService } from "../application/config/config-service.js";
3
+ import { ConfigWriteService } from "../application/config/config-write-service.js";
4
+ import type { PromptPort } from "./wizard-prompts.js";
5
+ /**
6
+ * Run the config wizard loop.
7
+ * Exported for testability — accepts injected dependencies.
8
+ */
9
+ export declare function runWizard(opts: {
10
+ configService: ConfigService;
11
+ configWriteService: ConfigWriteService;
12
+ prompt: PromptPort;
13
+ }): Promise<void>;
14
+ //# sourceMappingURL=config-wizard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-wizard.d.ts","sourceRoot":"","sources":["../../src/cli/config-wizard.ts"],"names":[],"mappings":";AAqBA,OAAO,EAAE,aAAa,EAAE,MAAM,yCAAyC,CAAC;AACxE,OAAO,EAAE,kBAAkB,EAAE,MAAM,+CAA+C,CAAC;AAGnF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAsBtD;;;GAGG;AACH,wBAAsB,SAAS,CAAC,IAAI,EAAE;IACpC,aAAa,EAAE,aAAa,CAAC;IAC7B,kBAAkB,EAAE,kBAAkB,CAAC;IACvC,MAAM,EAAE,UAAU,CAAC;CACpB,GAAG,OAAO,CAAC,IAAI,CAAC,CA6DhB"}
@@ -0,0 +1,120 @@
1
+ #!/usr/bin/env bun
2
+ /**
3
+ * JARVIS Config Wizard — Standalone CLI Entry Point
4
+ *
5
+ * Interactive terminal wizard for configuring JARVIS per-project.
6
+ * Guides users through each config section with prompts, shows current
7
+ * values, validates input, and persists minimal overrides.
8
+ *
9
+ * Usage: jarvis config [--directory <path>]
10
+ *
11
+ * Architecture: Minimal wiring — only config infrastructure is needed.
12
+ * No database, no kanban, no RAG — just YAML read/write + prompts.
13
+ *
14
+ * SOLID: SRP — CLI entry point and orchestration only
15
+ * SOLID: DIP — depends on PromptPort abstraction for testability
16
+ */
17
+ import { resolve, join } from "node:path";
18
+ import { existsSync, mkdirSync } from "node:fs";
19
+ import { YamlConfigRepository } from "../infrastructure/config/yaml-config-repository.js";
20
+ import { YamlConfigWriter } from "../infrastructure/config/yaml-config-writer.js";
21
+ import { ConfigService } from "../application/config/config-service.js";
22
+ import { ConfigWriteService } from "../application/config/config-write-service.js";
23
+ import { ClackPromptAdapter } from "./wizard-prompts.js";
24
+ import { getSectionEntries } from "./section-editors.js";
25
+ // ── CLI Argument Parsing ──────────────────────────────────────────────
26
+ function parseArgs(argv) {
27
+ let directory = process.cwd();
28
+ for (let i = 0; i < argv.length; i++) {
29
+ const arg = argv[i];
30
+ if (arg === "--directory" || arg === "-d") {
31
+ const next = argv[i + 1];
32
+ if (next !== undefined) {
33
+ directory = resolve(next);
34
+ i++;
35
+ }
36
+ }
37
+ }
38
+ return { directory };
39
+ }
40
+ // ── Wizard Orchestration ──────────────────────────────────────────────
41
+ /**
42
+ * Run the config wizard loop.
43
+ * Exported for testability — accepts injected dependencies.
44
+ */
45
+ export async function runWizard(opts) {
46
+ const { configService, configWriteService, prompt } = opts;
47
+ const sections = getSectionEntries();
48
+ prompt.intro("JARVIS Configuration Wizard");
49
+ const configAvailable = configService.isExternalConfigAvailable();
50
+ if (!configAvailable) {
51
+ prompt.log("No config/jarvis.yaml found — using defaults. Changes will create the file.");
52
+ }
53
+ // Main loop — select section, edit, save, repeat
54
+ let running = true;
55
+ while (running) {
56
+ const sectionOptions = [
57
+ ...sections.map((s) => ({
58
+ value: s.name,
59
+ label: s.label,
60
+ hint: s.hint,
61
+ })),
62
+ { value: "__exit__", label: "Exit", hint: "save and quit" },
63
+ ];
64
+ const choice = await prompt.select({
65
+ message: "Select a section to configure",
66
+ options: sectionOptions,
67
+ });
68
+ if (choice === undefined || choice === "__exit__") {
69
+ running = false;
70
+ continue;
71
+ }
72
+ const section = sections.find((s) => s.name === choice);
73
+ if (section === undefined)
74
+ continue;
75
+ // Read current effective config
76
+ const effective = configService.getConfig(choice);
77
+ // Run the section editor
78
+ const changes = await section.editor(effective, prompt);
79
+ if (changes === undefined) {
80
+ prompt.log("No changes made.");
81
+ continue;
82
+ }
83
+ // Persist changes via ConfigWriteService
84
+ try {
85
+ configWriteService.updateContext(choice, changes);
86
+ prompt.log(`Section "${section.label}" updated successfully.`);
87
+ }
88
+ catch (err) {
89
+ const msg = err instanceof Error ? err.message : String(err);
90
+ prompt.warn(`Failed to save: ${msg}`);
91
+ }
92
+ }
93
+ prompt.outro("Configuration saved. Goodbye!");
94
+ }
95
+ // ── Main ──────────────────────────────────────────────────────────────
96
+ async function main() {
97
+ const { directory } = parseArgs(process.argv.slice(2));
98
+ // Ensure config directory exists
99
+ const configDir = join(directory, "config");
100
+ if (!existsSync(configDir)) {
101
+ mkdirSync(configDir, { recursive: true });
102
+ }
103
+ // Wire minimal infrastructure
104
+ const configPath = join(configDir, "jarvis.yaml");
105
+ const configRepo = new YamlConfigRepository(configPath);
106
+ const configWriter = new YamlConfigWriter(configPath);
107
+ const configService = new ConfigService(configRepo);
108
+ const configWriteService = new ConfigWriteService(configRepo, configWriter);
109
+ // Run wizard with production prompt adapter
110
+ await runWizard({
111
+ configService,
112
+ configWriteService,
113
+ prompt: new ClackPromptAdapter(),
114
+ });
115
+ }
116
+ main().catch((err) => {
117
+ console.error("Fatal error:", err);
118
+ process.exit(1);
119
+ });
120
+ //# sourceMappingURL=config-wizard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-wizard.js","sourceRoot":"","sources":["../../src/cli/config-wizard.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Section Editors — Config Section Interactive Editing
3
+ *
4
+ * Each section editor reads the current effective config, presents
5
+ * values to the user via the PromptPort, and returns the partial
6
+ * update object (only changed values). Returns undefined if cancelled.
7
+ *
8
+ * SOLID: SRP — section editing logic only
9
+ * SOLID: OCP — new sections added by creating new editor functions
10
+ * SOLID: DIP — depends on PromptPort abstraction, not clack directly
11
+ */
12
+ import type { PromptPort } from "./wizard-prompts.js";
13
+ /** A section editor function signature. */
14
+ export type SectionEditor = (current: unknown, prompt: PromptPort) => Promise<Record<string, unknown> | undefined>;
15
+ /** Section metadata for the wizard menu. */
16
+ export interface SectionEntry {
17
+ readonly name: string;
18
+ readonly label: string;
19
+ readonly hint: string;
20
+ readonly editor: SectionEditor;
21
+ }
22
+ /**
23
+ * Returns all editable sections with metadata and editor functions.
24
+ */
25
+ export declare function getSectionEntries(): readonly SectionEntry[];
26
+ /** Format a value for display in the current-value summary. */
27
+ export declare function formatDisplayValue(value: unknown): string;
28
+ /** Build a summary of current values for a section. */
29
+ export declare function buildSectionSummary(fields: readonly {
30
+ label: string;
31
+ value: unknown;
32
+ }[]): string;
33
+ //# sourceMappingURL=section-editors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"section-editors.d.ts","sourceRoot":"","sources":["../../src/cli/section-editors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAYtD,2CAA2C;AAC3C,MAAM,MAAM,aAAa,GAAG,CAC1B,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,UAAU,KACf,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC,CAAC;AAElD,4CAA4C;AAC5C,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;CAChC;AAID;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,SAAS,YAAY,EAAE,CAS3D;AAID,+DAA+D;AAC/D,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CASzD;AAED,uDAAuD;AACvD,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,SAAS;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,EAAE,GACnD,MAAM,CAKR"}
@@ -0,0 +1,286 @@
1
+ // ── Section Registry ──────────────────────────────────────────────────
2
+ /**
3
+ * Returns all editable sections with metadata and editor functions.
4
+ */
5
+ export function getSectionEntries() {
6
+ return [
7
+ { name: "azure-sync", label: "Azure DevOps Sync", hint: "org, project, polling", editor: editAzureSync },
8
+ { name: "rag", label: "RAG / Embeddings", hint: "Ollama URL, model, dimensions", editor: editRag },
9
+ { name: "pipeline", label: "CI/CD Pipeline", hint: "timeouts", editor: editPipeline },
10
+ { name: "token-metrics", label: "Token Metrics", hint: "budget, alerts", editor: editTokenMetrics },
11
+ { name: "agent-registry", label: "Agent Registry", hint: "default model", editor: editAgentRegistry },
12
+ { name: "kanban", label: "Kanban", hint: "transition interval", editor: editKanban },
13
+ ];
14
+ }
15
+ // ── Helpers ────────────────────────────────────────────────────────────
16
+ /** Format a value for display in the current-value summary. */
17
+ export function formatDisplayValue(value) {
18
+ if (value === null)
19
+ return "(not set)";
20
+ if (value === undefined)
21
+ return "(not set)";
22
+ if (typeof value === "boolean")
23
+ return value ? "yes" : "no";
24
+ if (typeof value === "number")
25
+ return String(value);
26
+ if (typeof value === "string")
27
+ return value === "" ? "(empty)" : value;
28
+ if (Array.isArray(value))
29
+ return value.length === 0 ? "(empty list)" : value.join(", ");
30
+ if (typeof value === "object")
31
+ return JSON.stringify(value);
32
+ return String(value);
33
+ }
34
+ /** Build a summary of current values for a section. */
35
+ export function buildSectionSummary(fields) {
36
+ const maxLabel = Math.max(...fields.map((f) => f.label.length));
37
+ return fields
38
+ .map((f) => ` ${f.label.padEnd(maxLabel)} ${formatDisplayValue(f.value)}`)
39
+ .join("\n");
40
+ }
41
+ // ── Azure Sync Editor ─────────────────────────────────────────────────
42
+ async function editAzureSync(current, prompt) {
43
+ const c = current;
44
+ const changes = {};
45
+ prompt.note(buildSectionSummary([
46
+ { label: "Organization", value: c.organization },
47
+ { label: "Project", value: c.project },
48
+ { label: "Repository", value: c.repository },
49
+ { label: "Auth method", value: c.authMethod },
50
+ { label: "Sync direction", value: c.defaultSyncDirection },
51
+ { label: "Auto-detect template", value: c.autoDetectTemplate },
52
+ { label: "Poll enabled", value: c.pollEnabled },
53
+ { label: "Poll interval (sec)", value: c.pollIntervalSecs },
54
+ ]), "Azure Sync — Current Values");
55
+ const org = await prompt.text({
56
+ message: "Organization",
57
+ initialValue: c.organization,
58
+ });
59
+ if (org === undefined)
60
+ return undefined;
61
+ if (org !== c.organization)
62
+ changes.organization = org;
63
+ const project = await prompt.text({
64
+ message: "Project",
65
+ initialValue: c.project,
66
+ });
67
+ if (project === undefined)
68
+ return undefined;
69
+ if (project !== c.project)
70
+ changes.project = project;
71
+ const repo = await prompt.text({
72
+ message: "Repository",
73
+ initialValue: c.repository,
74
+ });
75
+ if (repo === undefined)
76
+ return undefined;
77
+ if (repo !== c.repository)
78
+ changes.repository = repo;
79
+ const authMethod = await prompt.select({
80
+ message: "Authentication method",
81
+ options: [
82
+ { value: "az-cli", label: "Azure CLI (az-cli)" },
83
+ { value: "pat", label: "Personal Access Token (pat)" },
84
+ ],
85
+ initialValue: c.authMethod,
86
+ });
87
+ if (authMethod === undefined)
88
+ return undefined;
89
+ if (authMethod !== c.authMethod)
90
+ changes.authMethod = authMethod;
91
+ const syncDir = await prompt.select({
92
+ message: "Default sync direction",
93
+ options: [
94
+ { value: "push", label: "Push (local → Azure)" },
95
+ { value: "pull", label: "Pull (Azure → local)" },
96
+ { value: "bidirectional", label: "Bidirectional" },
97
+ ],
98
+ initialValue: c.defaultSyncDirection,
99
+ });
100
+ if (syncDir === undefined)
101
+ return undefined;
102
+ if (syncDir !== c.defaultSyncDirection)
103
+ changes.defaultSyncDirection = syncDir;
104
+ const autoDetect = await prompt.confirm({
105
+ message: "Auto-detect Azure process template?",
106
+ initialValue: c.autoDetectTemplate,
107
+ });
108
+ if (autoDetect === undefined)
109
+ return undefined;
110
+ if (autoDetect !== c.autoDetectTemplate)
111
+ changes.autoDetectTemplate = autoDetect;
112
+ const pollEnabled = await prompt.confirm({
113
+ message: "Enable background polling for Azure changes?",
114
+ initialValue: c.pollEnabled,
115
+ });
116
+ if (pollEnabled === undefined)
117
+ return undefined;
118
+ if (pollEnabled !== c.pollEnabled)
119
+ changes.pollEnabled = pollEnabled;
120
+ const pollInterval = await prompt.number({
121
+ message: "Poll interval (seconds, minimum 30)",
122
+ initialValue: c.pollIntervalSecs,
123
+ validate: (v) => (v < 30 ? "Must be at least 30 seconds" : undefined),
124
+ });
125
+ if (pollInterval === undefined)
126
+ return undefined;
127
+ if (pollInterval !== c.pollIntervalSecs)
128
+ changes.pollIntervalSecs = pollInterval;
129
+ return Object.keys(changes).length > 0 ? changes : undefined;
130
+ }
131
+ // ── RAG Editor ────────────────────────────────────────────────────────
132
+ async function editRag(current, prompt) {
133
+ const c = current;
134
+ const changes = {};
135
+ prompt.note(buildSectionSummary([
136
+ { label: "Ollama URL", value: c.ollama.url },
137
+ { label: "Embedding model", value: c.ollama.model },
138
+ { label: "Dimensions", value: c.ollama.dimensions },
139
+ { label: "Markdown split by headers", value: c.markdownSplitByHeaders },
140
+ ]), "RAG — Current Values");
141
+ prompt.warn("Chunk sizes per language are not editable here. Edit config/jarvis.yaml directly for advanced tuning.");
142
+ const ollamaChanges = {};
143
+ const url = await prompt.text({
144
+ message: "Ollama URL",
145
+ initialValue: c.ollama.url,
146
+ });
147
+ if (url === undefined)
148
+ return undefined;
149
+ if (url !== c.ollama.url)
150
+ ollamaChanges.url = url;
151
+ const model = await prompt.text({
152
+ message: "Embedding model",
153
+ initialValue: c.ollama.model,
154
+ });
155
+ if (model === undefined)
156
+ return undefined;
157
+ if (model !== c.ollama.model)
158
+ ollamaChanges.model = model;
159
+ const dims = await prompt.number({
160
+ message: "Embedding dimensions",
161
+ initialValue: c.ollama.dimensions,
162
+ validate: (v) => (v <= 0 ? "Must be a positive number" : undefined),
163
+ });
164
+ if (dims === undefined)
165
+ return undefined;
166
+ if (dims !== c.ollama.dimensions)
167
+ ollamaChanges.dimensions = dims;
168
+ if (Object.keys(ollamaChanges).length > 0) {
169
+ changes.ollama = ollamaChanges;
170
+ }
171
+ const mdSplit = await prompt.confirm({
172
+ message: "Split markdown by headers?",
173
+ initialValue: c.markdownSplitByHeaders,
174
+ });
175
+ if (mdSplit === undefined)
176
+ return undefined;
177
+ if (mdSplit !== c.markdownSplitByHeaders)
178
+ changes.markdownSplitByHeaders = mdSplit;
179
+ return Object.keys(changes).length > 0 ? changes : undefined;
180
+ }
181
+ // ── Pipeline Editor ───────────────────────────────────────────────────
182
+ async function editPipeline(current, prompt) {
183
+ const c = current;
184
+ const changes = {};
185
+ prompt.note(buildSectionSummary([
186
+ { label: "Default timeout (ms)", value: c.defaultTimeoutMs },
187
+ { label: "Check timeout (ms)", value: c.checkTimeoutMs },
188
+ ]), "Pipeline — Current Values");
189
+ const defaultTimeout = await prompt.number({
190
+ message: "Default gate timeout (ms, minimum 1000)",
191
+ initialValue: c.defaultTimeoutMs,
192
+ validate: (v) => (v < 1000 ? "Must be at least 1000ms" : undefined),
193
+ });
194
+ if (defaultTimeout === undefined)
195
+ return undefined;
196
+ if (defaultTimeout !== c.defaultTimeoutMs)
197
+ changes.defaultTimeoutMs = defaultTimeout;
198
+ const checkTimeout = await prompt.number({
199
+ message: "Check timeout (ms, minimum 1000)",
200
+ initialValue: c.checkTimeoutMs,
201
+ validate: (v) => (v < 1000 ? "Must be at least 1000ms" : undefined),
202
+ });
203
+ if (checkTimeout === undefined)
204
+ return undefined;
205
+ if (checkTimeout !== c.checkTimeoutMs)
206
+ changes.checkTimeoutMs = checkTimeout;
207
+ return Object.keys(changes).length > 0 ? changes : undefined;
208
+ }
209
+ // ── Token Metrics Editor ──────────────────────────────────────────────
210
+ async function editTokenMetrics(current, prompt) {
211
+ const c = current;
212
+ const changes = {};
213
+ prompt.note(buildSectionSummary([
214
+ { label: "Sprint budget (USD)", value: c.sprintBudgetUsd },
215
+ { label: "Budget alert threshold", value: c.budgetAlertThreshold },
216
+ ]), "Token Metrics — Current Values");
217
+ const hasBudget = await prompt.confirm({
218
+ message: "Set a sprint budget?",
219
+ initialValue: c.sprintBudgetUsd !== null,
220
+ });
221
+ if (hasBudget === undefined)
222
+ return undefined;
223
+ if (hasBudget) {
224
+ const budget = await prompt.number({
225
+ message: "Sprint budget in USD",
226
+ initialValue: c.sprintBudgetUsd ?? 50,
227
+ validate: (v) => (v < 0 ? "Budget must be non-negative" : undefined),
228
+ });
229
+ if (budget === undefined)
230
+ return undefined;
231
+ if (budget !== c.sprintBudgetUsd)
232
+ changes.sprintBudgetUsd = budget;
233
+ }
234
+ else if (c.sprintBudgetUsd !== null) {
235
+ changes.sprintBudgetUsd = null;
236
+ }
237
+ const threshold = await prompt.number({
238
+ message: "Budget alert threshold (0.0 to 1.0)",
239
+ initialValue: c.budgetAlertThreshold,
240
+ validate: (v) => v < 0 || v > 1 ? "Must be between 0.0 and 1.0" : undefined,
241
+ });
242
+ if (threshold === undefined)
243
+ return undefined;
244
+ if (threshold !== c.budgetAlertThreshold)
245
+ changes.budgetAlertThreshold = threshold;
246
+ return Object.keys(changes).length > 0 ? changes : undefined;
247
+ }
248
+ // ── Agent Registry Editor ─────────────────────────────────────────────
249
+ async function editAgentRegistry(current, prompt) {
250
+ const c = current;
251
+ const changes = {};
252
+ prompt.note(buildSectionSummary([
253
+ { label: "Default model", value: c.defaultModel },
254
+ ]), "Agent Registry — Current Values");
255
+ const defaultModel = await prompt.text({
256
+ message: "Default LLM model for agent profiles",
257
+ initialValue: c.defaultModel,
258
+ validate: (v) => (v.trim() === "" ? "Model name cannot be empty" : undefined),
259
+ });
260
+ if (defaultModel === undefined)
261
+ return undefined;
262
+ if (defaultModel !== c.defaultModel)
263
+ changes.defaultModel = defaultModel;
264
+ return Object.keys(changes).length > 0 ? changes : undefined;
265
+ }
266
+ // ── Kanban Editor ─────────────────────────────────────────────────────
267
+ async function editKanban(current, prompt) {
268
+ const c = current;
269
+ const changes = {};
270
+ prompt.note(buildSectionSummary([
271
+ { label: "Min transition interval (sec)", value: c.minTransitionIntervalSecs },
272
+ ]), "Kanban — Current Values");
273
+ prompt.warn("Gate task definitions (gateTasks) are complex nested structures.\n" +
274
+ "Edit config/jarvis.yaml directly to customize gate tasks per phase.");
275
+ const interval = await prompt.number({
276
+ message: "Minimum seconds between card transitions (0 to disable)",
277
+ initialValue: c.minTransitionIntervalSecs,
278
+ validate: (v) => (v < 0 ? "Must be 0 or greater" : undefined),
279
+ });
280
+ if (interval === undefined)
281
+ return undefined;
282
+ if (interval !== c.minTransitionIntervalSecs)
283
+ changes.minTransitionIntervalSecs = interval;
284
+ return Object.keys(changes).length > 0 ? changes : undefined;
285
+ }
286
+ //# sourceMappingURL=section-editors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"section-editors.js","sourceRoot":"","sources":["../../src/cli/section-editors.ts"],"names":[],"mappings":"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"}