@robota-sdk/agent-command 3.0.0-beta.82 → 3.0.0-beta.84

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 (94) hide show
  1. package/CHANGELOG.md +1071 -0
  2. package/README.md +71 -62
  3. package/dist/node/index.cjs +81 -72
  4. package/dist/node/index.d.cts +136 -52
  5. package/dist/node/index.d.cts.map +1 -1
  6. package/dist/node/index.d.ts +136 -52
  7. package/dist/node/index.d.ts.map +1 -1
  8. package/dist/node/index.js +79 -70
  9. package/dist/node/index.js.map +1 -1
  10. package/package.json +16 -10
  11. package/src/agent/__tests__/agent-command.test.ts +62 -0
  12. package/src/agent/agent-command-parser.ts +2 -2
  13. package/src/agent/agent-command.ts +20 -0
  14. package/src/command-module-utils.test.ts +37 -0
  15. package/src/command-module-utils.ts +2 -0
  16. package/src/default/__tests__/__snapshots__/model-exposure.test.ts.snap +2 -2
  17. package/src/default/__tests__/default-command-modules.test.ts +54 -14
  18. package/src/default/__tests__/model-exposure.test.ts +18 -3
  19. package/src/default/__tests__/org-policy-forwarding.test.ts +10 -2
  20. package/src/default/default-command-modules.ts +15 -8
  21. package/src/devices/__tests__/devices-command-module.test.ts +99 -12
  22. package/src/devices/devices-command-module.ts +108 -24
  23. package/src/devices/devices-command-port.ts +62 -1
  24. package/src/devices/index.ts +3 -0
  25. package/src/doctor/doctor-node-deps.ts +6 -7
  26. package/src/editor/editor-command-module.ts +5 -0
  27. package/src/effort/effort-command.test.ts +65 -2
  28. package/src/effort/effort-command.ts +19 -5
  29. package/src/events/__tests__/events-command.test.ts +73 -0
  30. package/src/events/events-command-module.ts +49 -0
  31. package/src/events/events-command.ts +69 -0
  32. package/src/events/index.ts +2 -0
  33. package/src/git/__tests__/fake-git-port.ts +9 -2
  34. package/src/git/__tests__/git-command-module.test.ts +10 -2
  35. package/src/git/git-command-module.ts +3 -4
  36. package/src/git/git-commit.ts +6 -3
  37. package/src/git/index.ts +4 -1
  38. package/src/goal/goal-command.ts +3 -1
  39. package/src/handoff/__tests__/handoff-command-module.test.ts +2 -1
  40. package/src/handoff/handoff-command-module.ts +1 -1
  41. package/src/handoff/handoff-command.ts +2 -2
  42. package/src/help/__tests__/help-command-module.test.ts +3 -0
  43. package/src/help/__tests__/help-command.test.ts +3 -0
  44. package/src/index.ts +14 -0
  45. package/src/keybindings/keybindings-command-module.ts +17 -3
  46. package/src/mcp-activation/__tests__/mcp-activation-command.test.ts +172 -0
  47. package/src/mcp-activation/mcp-activation-command-module.ts +6 -0
  48. package/src/mcp-activation/mcp-activation-command.ts +62 -4
  49. package/src/memory/__tests__/memory-command-module.test.ts +40 -2
  50. package/src/memory/__tests__/memory-command-unavailable.test.ts +63 -0
  51. package/src/memory/memory-command-module.ts +4 -2
  52. package/src/memory/memory-command.ts +42 -2
  53. package/src/mode/__tests__/mode-command-module.test.ts +40 -0
  54. package/src/mode/mode-command.ts +1 -1
  55. package/src/model/__tests__/model-command-module.test.ts +80 -0
  56. package/src/model/__tests__/model-command.test.ts +240 -0
  57. package/src/model/index.ts +6 -0
  58. package/src/model/model-command-module.ts +56 -0
  59. package/src/model/model-command.ts +223 -0
  60. package/src/peers/__tests__/peers-command-module.test.ts +24 -0
  61. package/src/peers/__tests__/peers-command.test.ts +78 -0
  62. package/src/peers/peers-command-module.ts +1 -1
  63. package/src/peers/peers-command.ts +33 -4
  64. package/src/plugin/__tests__/plugin-command-module.test.ts +81 -1
  65. package/src/plugin/plugin-command.ts +47 -4
  66. package/src/provider/__tests__/org-policy.test.ts +4 -0
  67. package/src/provider/__tests__/provider-command-module.test.ts +276 -14
  68. package/src/provider/__tests__/scripted-interaction.ts +12 -2
  69. package/src/provider/provider-command-execution.ts +54 -8
  70. package/src/provider/provider-command-profile-lifecycle.ts +48 -2
  71. package/src/provider/provider-command-profile-operations.ts +14 -0
  72. package/src/provider/provider-command-profile.ts +7 -4
  73. package/src/provider/provider-command-setup.ts +14 -1
  74. package/src/rewind/__tests__/rewind-command-module.test.ts +32 -1
  75. package/src/rewind/rewind-command.ts +23 -2
  76. package/src/schedule/__tests__/loop-command-functional.test.ts +13 -0
  77. package/src/schedule/__tests__/loop-command.test.ts +238 -4
  78. package/src/schedule/__tests__/schedule-redos.test.ts +33 -0
  79. package/src/schedule/loop-command.ts +98 -4
  80. package/src/schedule/schedule-command-module.ts +8 -4
  81. package/src/settings/settings-command-module.ts +2 -2
  82. package/src/shell/shell-command-module.ts +5 -0
  83. package/src/terminal-client/__tests__/terminal-client-commands.test.ts +216 -0
  84. package/src/terminal-client/index.ts +5 -0
  85. package/src/terminal-client/terminal-client-commands.ts +109 -0
  86. package/src/theme/__tests__/theme-command.test.ts +1 -1
  87. package/src/theme/theme-command-module.ts +12 -2
  88. package/src/user-local/__tests__/user-local-command.test.ts +2 -2
  89. package/src/git/__tests__/git-diff.test.ts +0 -125
  90. package/src/git/__tests__/git-process.test.ts +0 -221
  91. package/src/git/__tests__/git-status.test.ts +0 -117
  92. package/src/git/git-diff.ts +0 -129
  93. package/src/git/git-process.ts +0 -169
  94. package/src/git/git-status.ts +0 -134
@@ -1,134 +0,0 @@
1
- /**
2
- * BEHAVIOR-2437: `/git status` — `git status --porcelain=v2 -z --branch`, parsed into the branch and
3
- * the staged, unstaged, untracked (and, when present, conflicted) path sets.
4
- *
5
- * `-z` is what makes a path with a space, a quote, a newline or a non-ASCII character ONE element,
6
- * and it is why a `2` (rename/copy) record is read as TWO NUL-terminated fields — `path`, then
7
- * `origPath` — so the pair stays a pair.
8
- */
9
- import { gitFailureMessage } from './git-process.js';
10
-
11
- import type { IGitProcessPort } from './git-process.js';
12
- import type { ICommandResult } from '@robota-sdk/agent-interface-command';
13
-
14
- export const GIT_STATUS_ARGS: readonly string[] = ['status', '--porcelain=v2', '-z', '--branch'];
15
-
16
- export interface IGitStatusSummary {
17
- /** `branch.head`; `(detached)` when detached; `undefined` when git printed no branch header. */
18
- branch: string | undefined;
19
- /** `branch.oid` is `(initial)` on an unborn branch. */
20
- unborn: boolean;
21
- staged: readonly string[];
22
- unstaged: readonly string[];
23
- untracked: readonly string[];
24
- conflicted: readonly string[];
25
- }
26
-
27
- const ORDINARY = /^1 (\S\S) \S+ \S+ \S+ \S+ \S+ \S+ ([^]*)$/;
28
- const RENAMED = /^2 (\S\S) \S+ \S+ \S+ \S+ \S+ \S+ \S+ ([^]*)$/;
29
- const UNMERGED = /^u \S\S \S+ \S+ \S+ \S+ \S+ \S+ \S+ \S+ ([^]*)$/;
30
-
31
- interface IStatusAccumulator {
32
- branch: string | undefined;
33
- unborn: boolean;
34
- staged: string[];
35
- unstaged: string[];
36
- untracked: string[];
37
- conflicted: string[];
38
- }
39
-
40
- function classify(acc: IStatusAccumulator, xy: string, display: string): void {
41
- if (xy[0] !== '.') acc.staged.push(display);
42
- if (xy[1] !== '.') acc.unstaged.push(display);
43
- }
44
-
45
- function readHeader(acc: IStatusAccumulator, record: string): void {
46
- if (record.startsWith('# branch.head ')) acc.branch = record.slice('# branch.head '.length);
47
- else if (record.startsWith('# branch.oid ')) {
48
- acc.unborn = record.slice('# branch.oid '.length) === '(initial)';
49
- }
50
- }
51
-
52
- /** Reads one record; returns how many EXTRA NUL-terminated fields it consumed (1 for a rename). */
53
- function readRecord(acc: IStatusAccumulator, record: string, next: string | undefined): number {
54
- if (record.startsWith('# ')) {
55
- readHeader(acc, record);
56
- return 0;
57
- }
58
- if (record.startsWith('? ')) {
59
- acc.untracked.push(record.slice(2));
60
- return 0;
61
- }
62
- if (record.startsWith('1 ')) {
63
- const match = ORDINARY.exec(record);
64
- if (match) classify(acc, match[1] ?? '..', match[2] ?? '');
65
- return 0;
66
- }
67
- if (record.startsWith('2 ')) {
68
- // The original path is the NEXT NUL-terminated field.
69
- const match = RENAMED.exec(record);
70
- if (match) classify(acc, match[1] ?? '..', `${match[2] ?? ''} (from ${next ?? ''})`);
71
- return 1;
72
- }
73
- if (record.startsWith('u ')) {
74
- const match = UNMERGED.exec(record);
75
- if (match) acc.conflicted.push(match[1] ?? '');
76
- }
77
- return 0;
78
- }
79
-
80
- export function parseStatusPorcelainV2(stdout: string): IGitStatusSummary {
81
- const fields = stdout.split('\0');
82
- const acc: IStatusAccumulator = {
83
- branch: undefined,
84
- unborn: false,
85
- staged: [],
86
- unstaged: [],
87
- untracked: [],
88
- conflicted: [],
89
- };
90
- for (let index = 0; index < fields.length; index += 1) {
91
- const record = fields[index] ?? '';
92
- if (record.length === 0) continue;
93
- index += readRecord(acc, record, fields[index + 1]);
94
- }
95
- return acc;
96
- }
97
-
98
- function group(label: string, paths: readonly string[]): string {
99
- return `${label} (${paths.length}):${paths.length > 0 ? ` ${paths.join(', ')}` : ''}`;
100
- }
101
-
102
- export function formatGitStatus(summary: IGitStatusSummary): string {
103
- const head =
104
- summary.branch === undefined
105
- ? 'No branch information'
106
- : summary.branch === '(detached)'
107
- ? 'HEAD detached'
108
- : `On branch ${summary.branch}${summary.unborn ? ' (no commits yet)' : ''}`;
109
- const lines = [
110
- head,
111
- group('staged', summary.staged),
112
- group('unstaged', summary.unstaged),
113
- group('untracked', summary.untracked),
114
- ];
115
- if (summary.conflicted.length > 0) lines.push(group('conflicted', summary.conflicted));
116
- return lines.join('\n');
117
- }
118
-
119
- export async function executeGitStatus(
120
- port: IGitProcessPort,
121
- cwd: string,
122
- ): Promise<ICommandResult> {
123
- const outcome = await port.run(GIT_STATUS_ARGS, { cwd });
124
- const failure = gitFailureMessage('status', outcome);
125
- if (failure !== undefined || outcome.kind !== 'exited') {
126
- return { success: false, message: failure ?? 'git status failed' };
127
- }
128
- const summary = parseStatusPorcelainV2(outcome.stdout);
129
- return {
130
- success: true,
131
- message: formatGitStatus(summary),
132
- data: { git: 'status', ...summary },
133
- };
134
- }