@zoebuildsai/trace 1.5.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 (130) hide show
  1. package/.gitignore +115 -0
  2. package/.trace/progress.json +22 -0
  3. package/README.md +466 -0
  4. package/RELEASE-NOTES-1.5.0.md +410 -0
  5. package/STATUS.md +245 -0
  6. package/dist/auto-commit.d.ts +66 -0
  7. package/dist/auto-commit.d.ts.map +1 -0
  8. package/dist/auto-commit.js +180 -0
  9. package/dist/auto-commit.js.map +1 -0
  10. package/dist/cli.d.ts +7 -0
  11. package/dist/cli.d.ts.map +1 -0
  12. package/dist/cli.js +246 -0
  13. package/dist/cli.js.map +1 -0
  14. package/dist/commands.d.ts +46 -0
  15. package/dist/commands.d.ts.map +1 -0
  16. package/dist/commands.js +256 -0
  17. package/dist/commands.js.map +1 -0
  18. package/dist/diff.d.ts +23 -0
  19. package/dist/diff.d.ts.map +1 -0
  20. package/dist/diff.js +106 -0
  21. package/dist/diff.js.map +1 -0
  22. package/dist/github.d.ts.map +1 -0
  23. package/dist/github.js.map +1 -0
  24. package/dist/index-cache.d.ts +35 -0
  25. package/dist/index-cache.d.ts.map +1 -0
  26. package/dist/index-cache.js +114 -0
  27. package/dist/index-cache.js.map +1 -0
  28. package/dist/index.d.ts +15 -0
  29. package/dist/index.d.ts.map +1 -0
  30. package/dist/index.js +25 -0
  31. package/dist/index.js.map +1 -0
  32. package/dist/storage.d.ts +45 -0
  33. package/dist/storage.d.ts.map +1 -0
  34. package/dist/storage.js +151 -0
  35. package/dist/storage.js.map +1 -0
  36. package/dist/sync.d.ts +60 -0
  37. package/dist/sync.js +184 -0
  38. package/dist/tags.d.ts +85 -0
  39. package/dist/tags.d.ts.map +1 -0
  40. package/dist/tags.js +219 -0
  41. package/dist/tags.js.map +1 -0
  42. package/dist/types.d.ts +102 -0
  43. package/dist/types.d.ts.map +1 -0
  44. package/dist/types.js +6 -0
  45. package/dist/types.js.map +1 -0
  46. package/docs/.nojekyll +0 -0
  47. package/docs/README.md +73 -0
  48. package/docs/_config.yml +2 -0
  49. package/docs/index.html +960 -0
  50. package/docs-website/package.json +20 -0
  51. package/jest.config.js +21 -0
  52. package/package.json +50 -0
  53. package/scripts/init.ts +290 -0
  54. package/src/agent-audit.ts +270 -0
  55. package/src/agent-checkout.ts +227 -0
  56. package/src/agent-coordination.ts +318 -0
  57. package/src/async-queue.ts +203 -0
  58. package/src/auto-branching.ts +279 -0
  59. package/src/auto-commit.ts +166 -0
  60. package/src/cherry-pick.ts +252 -0
  61. package/src/chunked-upload.ts +224 -0
  62. package/src/cli-v2.ts +335 -0
  63. package/src/cli.ts +318 -0
  64. package/src/cliff-detection.ts +232 -0
  65. package/src/commands.ts +267 -0
  66. package/src/commit-hash-system.ts +351 -0
  67. package/src/compression.ts +176 -0
  68. package/src/conflict-resolution-ui.ts +277 -0
  69. package/src/conflict-visualization.ts +238 -0
  70. package/src/diff-formatter.ts +184 -0
  71. package/src/diff.ts +124 -0
  72. package/src/distributed-coordination.ts +273 -0
  73. package/src/git-interop.ts +316 -0
  74. package/src/index-cache.ts +88 -0
  75. package/src/index.ts +38 -0
  76. package/src/merge-engine.ts +143 -0
  77. package/src/message-search.ts +370 -0
  78. package/src/performance-monitoring.ts +236 -0
  79. package/src/rebase.ts +327 -0
  80. package/src/rollback.ts +215 -0
  81. package/src/semantic-grouping.ts +245 -0
  82. package/src/stage-area.ts +324 -0
  83. package/src/stash.ts +278 -0
  84. package/src/storage.ts +131 -0
  85. package/src/sync.ts +205 -0
  86. package/src/tags.ts +244 -0
  87. package/src/types.ts +119 -0
  88. package/src/webhooks.ts +119 -0
  89. package/src/workspace-isolation.ts +298 -0
  90. package/tests/auto-commit.test.ts +308 -0
  91. package/tests/checkout.test.ts +136 -0
  92. package/tests/commit.test.ts +118 -0
  93. package/tests/diff.test.ts +191 -0
  94. package/tests/github.test.ts +94 -0
  95. package/tests/integration.test.ts +267 -0
  96. package/tests/log.test.ts +125 -0
  97. package/tests/phase2-integration.test.ts +370 -0
  98. package/tests/storage.test.ts +167 -0
  99. package/tests/tags.test.ts +477 -0
  100. package/tests/types.test.ts +75 -0
  101. package/tests/v1.1/agent-audit.test.ts +472 -0
  102. package/tests/v1.1/agent-coordination.test.ts +308 -0
  103. package/tests/v1.1/async-queue.test.ts +253 -0
  104. package/tests/v1.1/comprehensive.test.ts +521 -0
  105. package/tests/v1.1/diff-formatter.test.ts +238 -0
  106. package/tests/v1.1/integration.test.ts +389 -0
  107. package/tests/v1.1/onboarding.test.ts +365 -0
  108. package/tests/v1.1/rollback.test.ts +370 -0
  109. package/tests/v1.1/semantic-grouping.test.ts +230 -0
  110. package/tests/v1.2/chunked-upload.test.ts +301 -0
  111. package/tests/v1.2/cliff-detection.test.ts +272 -0
  112. package/tests/v1.2/commit-hash-system.test.ts +288 -0
  113. package/tests/v1.2/compression.test.ts +220 -0
  114. package/tests/v1.2/conflict-visualization.test.ts +263 -0
  115. package/tests/v1.2/distributed.test.ts +261 -0
  116. package/tests/v1.2/performance-monitoring.test.ts +328 -0
  117. package/tests/v1.3/auto-branching.test.ts +270 -0
  118. package/tests/v1.3/message-search.test.ts +264 -0
  119. package/tests/v1.3/stage-area.test.ts +330 -0
  120. package/tests/v1.3/stash-rebase-cherry-pick.test.ts +361 -0
  121. package/tests/v1.4/cli.test.ts +171 -0
  122. package/tests/v1.4/conflict-resolution-advanced.test.ts +429 -0
  123. package/tests/v1.4/conflict-resolution-ui.test.ts +286 -0
  124. package/tests/v1.4/workspace-isolation-advanced.test.ts +382 -0
  125. package/tests/v1.4/workspace-isolation.test.ts +268 -0
  126. package/tests/v1.5/agent-coordination.real.test.ts +401 -0
  127. package/tests/v1.5/cli-v2.test.ts +354 -0
  128. package/tests/v1.5/git-interop.real.test.ts +358 -0
  129. package/tests/v1.5/integration-testing.real.test.ts +440 -0
  130. package/tsconfig.json +26 -0
@@ -0,0 +1,45 @@
1
+ import { CommitObject } from './types';
2
+ export declare class Storage {
3
+ private basePath;
4
+ private objectsDir;
5
+ private refsDir;
6
+ constructor(basePath?: string);
7
+ private ensureDirectories;
8
+ /**
9
+ * Compute SHA-256 hash of content
10
+ */
11
+ hash(content: string | Buffer): string;
12
+ /**
13
+ * Save commit object to storage
14
+ */
15
+ saveCommit(commit: CommitObject): void;
16
+ /**
17
+ * Load commit object from storage
18
+ */
19
+ loadCommit(hash: string): CommitObject | null;
20
+ /**
21
+ * Save reference (branch/tag)
22
+ */
23
+ saveRef(name: string, hash: string): void;
24
+ /**
25
+ * Load reference
26
+ */
27
+ loadRef(name: string): string | null;
28
+ /**
29
+ * List all commits
30
+ */
31
+ listCommits(): string[];
32
+ /**
33
+ * Delete commit
34
+ */
35
+ deleteCommit(hash: string): void;
36
+ /**
37
+ * Get commit history chain
38
+ */
39
+ getHistory(startHash: string): CommitObject[];
40
+ /**
41
+ * Helper to serialize Maps as objects for JSON
42
+ */
43
+ private replaceMapValues;
44
+ }
45
+ //# sourceMappingURL=storage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../src/storage.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAyB,MAAM,SAAS,CAAC;AAE9D,qBAAa,OAAO;IAClB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,OAAO,CAAS;gBAEZ,QAAQ,GAAE,MAAkE;IAOxF,OAAO,CAAC,iBAAiB;IAQzB;;OAEG;IACH,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM;IAKtC;;OAEG;IACH,UAAU,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI;IAKtC;;OAEG;IACH,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI;IAY7C;;OAEG;IACH,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAMzC;;OAEG;IACH,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAQpC;;OAEG;IACH,WAAW,IAAI,MAAM,EAAE;IAUvB;;OAEG;IACH,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAOhC;;OAEG;IACH,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,YAAY,EAAE;IAe7C;;OAEG;IACH,OAAO,CAAC,gBAAgB;CAUzB"}
@@ -0,0 +1,151 @@
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.Storage = void 0;
37
+ const fs = __importStar(require("fs"));
38
+ const path = __importStar(require("path"));
39
+ const crypto = __importStar(require("crypto"));
40
+ class Storage {
41
+ constructor(basePath = path.join(process.env.HOME || '', '.openclaw/memory-git')) {
42
+ this.basePath = basePath;
43
+ this.objectsDir = path.join(basePath, 'objects');
44
+ this.refsDir = path.join(basePath, 'refs');
45
+ this.ensureDirectories();
46
+ }
47
+ ensureDirectories() {
48
+ [this.basePath, this.objectsDir, this.refsDir].forEach(dir => {
49
+ if (!fs.existsSync(dir)) {
50
+ fs.mkdirSync(dir, { recursive: true });
51
+ }
52
+ });
53
+ }
54
+ /**
55
+ * Compute SHA-256 hash of content
56
+ */
57
+ hash(content) {
58
+ const buffer = typeof content === 'string' ? Buffer.from(content, 'utf-8') : content;
59
+ return crypto.createHash('sha256').update(buffer).digest('hex');
60
+ }
61
+ /**
62
+ * Save commit object to storage
63
+ */
64
+ saveCommit(commit) {
65
+ const commitPath = path.join(this.objectsDir, `${commit.hash}.json`);
66
+ fs.writeFileSync(commitPath, JSON.stringify(commit, this.replaceMapValues, 2));
67
+ }
68
+ /**
69
+ * Load commit object from storage
70
+ */
71
+ loadCommit(hash) {
72
+ const commitPath = path.join(this.objectsDir, `${hash}.json`);
73
+ if (!fs.existsSync(commitPath)) {
74
+ return null;
75
+ }
76
+ const content = fs.readFileSync(commitPath, 'utf-8');
77
+ const commit = JSON.parse(content);
78
+ const filesRecord = commit.tree.files;
79
+ commit.tree.files = new Map(Object.entries(filesRecord));
80
+ return commit;
81
+ }
82
+ /**
83
+ * Save reference (branch/tag)
84
+ */
85
+ saveRef(name, hash) {
86
+ const refPath = path.join(this.refsDir, name);
87
+ fs.mkdirSync(path.dirname(refPath), { recursive: true });
88
+ fs.writeFileSync(refPath, hash);
89
+ }
90
+ /**
91
+ * Load reference
92
+ */
93
+ loadRef(name) {
94
+ const refPath = path.join(this.refsDir, name);
95
+ if (!fs.existsSync(refPath)) {
96
+ return null;
97
+ }
98
+ return fs.readFileSync(refPath, 'utf-8').trim();
99
+ }
100
+ /**
101
+ * List all commits
102
+ */
103
+ listCommits() {
104
+ if (!fs.existsSync(this.objectsDir)) {
105
+ return [];
106
+ }
107
+ return fs
108
+ .readdirSync(this.objectsDir)
109
+ .filter(f => f.endsWith('.json'))
110
+ .map(f => f.replace('.json', ''));
111
+ }
112
+ /**
113
+ * Delete commit
114
+ */
115
+ deleteCommit(hash) {
116
+ const commitPath = path.join(this.objectsDir, `${hash}.json`);
117
+ if (fs.existsSync(commitPath)) {
118
+ fs.unlinkSync(commitPath);
119
+ }
120
+ }
121
+ /**
122
+ * Get commit history chain
123
+ */
124
+ getHistory(startHash) {
125
+ const history = [];
126
+ let current = this.loadCommit(startHash);
127
+ while (current !== null) {
128
+ history.push(current);
129
+ if (current.parent === null) {
130
+ break;
131
+ }
132
+ current = this.loadCommit(current.parent);
133
+ }
134
+ return history;
135
+ }
136
+ /**
137
+ * Helper to serialize Maps as objects for JSON
138
+ */
139
+ replaceMapValues(key, value) {
140
+ if (value instanceof Map) {
141
+ const obj = {};
142
+ value.forEach((v, k) => {
143
+ obj[k] = v;
144
+ });
145
+ return obj;
146
+ }
147
+ return value;
148
+ }
149
+ }
150
+ exports.Storage = Storage;
151
+ //# sourceMappingURL=storage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.js","sourceRoot":"","sources":["../src/storage.ts"],"names":[],"mappings":"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"}
package/dist/sync.d.ts ADDED
@@ -0,0 +1,60 @@
1
+ /**
2
+ * GitHub Integration Layer
3
+ * Handles push/pull with GitHub repositories
4
+ */
5
+ interface Remote {
6
+ name: string;
7
+ url: string;
8
+ }
9
+ export declare class TraceGitHub {
10
+ private repoDir;
11
+ private remoteConfigFile;
12
+ constructor(repoDir?: string);
13
+ /**
14
+ * Initialize git repo if needed
15
+ */
16
+ initRepo(): void;
17
+ /**
18
+ * Add a remote repository
19
+ */
20
+ addRemote(name: string, url: string): void;
21
+ /**
22
+ * List all remotes
23
+ */
24
+ listRemotes(): Remote[];
25
+ /**
26
+ * Push to remote with timeout
27
+ */
28
+ push(remote?: string, timeout?: number): {
29
+ success: boolean;
30
+ message: string;
31
+ };
32
+ /**
33
+ * Pull from remote
34
+ */
35
+ pull(remote?: string): {
36
+ success: boolean;
37
+ message: string;
38
+ };
39
+ /**
40
+ * Stage and commit changes
41
+ */
42
+ stageAndCommit(message: string): {
43
+ success: boolean;
44
+ hash: string;
45
+ };
46
+ /**
47
+ * Commit with optional auto-push
48
+ */
49
+ commitWithAutoPush(message: string, autoPush?: boolean, remote?: string): {
50
+ success: boolean;
51
+ hash: string;
52
+ pushed?: boolean;
53
+ };
54
+ /**
55
+ * Save remote config locally
56
+ */
57
+ private saveRemote;
58
+ }
59
+ export {};
60
+ //# sourceMappingURL=github.d.ts.map
package/dist/sync.js ADDED
@@ -0,0 +1,184 @@
1
+ "use strict";
2
+ /**
3
+ * GitHub Integration Layer
4
+ * Handles push/pull with GitHub repositories
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.TraceGitHub = void 0;
8
+ const child_process_1 = require("child_process");
9
+ const fs_1 = require("fs");
10
+ const path_1 = require("path");
11
+ class TraceGitHub {
12
+ constructor(repoDir = process.cwd()) {
13
+ this.repoDir = repoDir;
14
+ this.remoteConfigFile = (0, path_1.join)(repoDir, '.trace', 'remotes.json');
15
+ }
16
+ /**
17
+ * Initialize git repo if needed
18
+ */
19
+ initRepo() {
20
+ try {
21
+ (0, child_process_1.execSync)('git rev-parse --git-dir', { cwd: this.repoDir, stdio: 'ignore' });
22
+ }
23
+ catch {
24
+ (0, child_process_1.execSync)('git init', { cwd: this.repoDir });
25
+ (0, child_process_1.execSync)('git config user.email "trace@zoebuildsai.com"', { cwd: this.repoDir });
26
+ (0, child_process_1.execSync)('git config user.name "Trace"', { cwd: this.repoDir });
27
+ }
28
+ }
29
+ /**
30
+ * Add a remote repository
31
+ */
32
+ addRemote(name, url) {
33
+ try {
34
+ (0, child_process_1.execSync)(`git remote add ${name} ${url}`, { cwd: this.repoDir });
35
+ }
36
+ catch {
37
+ // Remote may already exist, update it
38
+ (0, child_process_1.execSync)(`git remote set-url ${name} ${url}`, { cwd: this.repoDir });
39
+ }
40
+ this.saveRemote(name, url);
41
+ }
42
+ /**
43
+ * List all remotes
44
+ */
45
+ listRemotes() {
46
+ try {
47
+ const output = (0, child_process_1.execSync)('git remote -v', { cwd: this.repoDir, encoding: 'utf-8' });
48
+ const remotes = new Map();
49
+ for (const line of output.trim().split('\n')) {
50
+ if (!line)
51
+ continue;
52
+ const [name, url] = line.split(/\s+/);
53
+ if (!remotes.has(name)) {
54
+ remotes.set(name, url);
55
+ }
56
+ }
57
+ const result = [];
58
+ for (const [name, url] of remotes) {
59
+ result.push({ name, url });
60
+ }
61
+ return result;
62
+ }
63
+ catch {
64
+ return [];
65
+ }
66
+ }
67
+ /**
68
+ * Push to remote with timeout
69
+ */
70
+ push(remote = 'origin', timeout = 5000) {
71
+ this.initRepo();
72
+ try {
73
+ const cmd = `git push ${remote} --all --tags`;
74
+ const timeoutSec = Math.ceil(timeout / 1000);
75
+ try {
76
+ (0, child_process_1.execSync)(cmd, {
77
+ cwd: this.repoDir,
78
+ timeout: timeout,
79
+ stdio: 'pipe',
80
+ });
81
+ return { success: true, message: `Pushed to ${remote}` };
82
+ }
83
+ catch (err) {
84
+ if (err.killed) {
85
+ // Timeout - return partial success
86
+ return {
87
+ success: false,
88
+ message: `Push timeout after ${timeoutSec}s (may have partially succeeded)`,
89
+ };
90
+ }
91
+ throw err;
92
+ }
93
+ }
94
+ catch (err) {
95
+ return {
96
+ success: false,
97
+ message: `Push failed: ${err.message}`,
98
+ };
99
+ }
100
+ }
101
+ /**
102
+ * Pull from remote
103
+ */
104
+ pull(remote = 'origin') {
105
+ this.initRepo();
106
+ try {
107
+ (0, child_process_1.execSync)(`git pull ${remote} --all`, {
108
+ cwd: this.repoDir,
109
+ stdio: 'pipe',
110
+ });
111
+ return { success: true, message: `Pulled from ${remote}` };
112
+ }
113
+ catch (err) {
114
+ return {
115
+ success: false,
116
+ message: `Pull failed: ${err.message}`,
117
+ };
118
+ }
119
+ }
120
+ /**
121
+ * Stage and commit changes
122
+ */
123
+ stageAndCommit(message) {
124
+ this.initRepo();
125
+ try {
126
+ (0, child_process_1.execSync)('git add -A', { cwd: this.repoDir });
127
+ const output = (0, child_process_1.execSync)(`git commit -m "${message.replace(/"/g, '\\"')}"`, {
128
+ cwd: this.repoDir,
129
+ encoding: 'utf-8',
130
+ });
131
+ // Extract hash from output like "[main abc1234] message"
132
+ const match = output.match(/\[.*?\s+(\w+)\]/);
133
+ const hash = match ? match[1] : 'unknown';
134
+ return { success: true, hash };
135
+ }
136
+ catch (err) {
137
+ const errStr = err.message || err.toString();
138
+ if (errStr.includes('nothing to commit') || errStr.includes('nothing added to commit')) {
139
+ return { success: true, hash: 'none' };
140
+ }
141
+ return { success: false, hash: '' };
142
+ }
143
+ }
144
+ /**
145
+ * Commit with optional auto-push
146
+ */
147
+ commitWithAutoPush(message, autoPush = false, remote = 'origin') {
148
+ const commitResult = this.stageAndCommit(message);
149
+ if (!commitResult.success) {
150
+ return { success: false, hash: '' };
151
+ }
152
+ if (autoPush && commitResult.hash !== 'none') {
153
+ const pushResult = this.push(remote, 5000);
154
+ return {
155
+ success: true,
156
+ hash: commitResult.hash,
157
+ pushed: pushResult.success,
158
+ };
159
+ }
160
+ return { success: true, hash: commitResult.hash };
161
+ }
162
+ /**
163
+ * Save remote config locally
164
+ */
165
+ saveRemote(name, url) {
166
+ const dir = (0, path_1.join)(this.repoDir, '.trace');
167
+ if (!(0, fs_1.existsSync)(dir)) {
168
+ (0, child_process_1.execSync)(`mkdir -p ${dir}`);
169
+ }
170
+ let remotes = {};
171
+ if ((0, fs_1.existsSync)(this.remoteConfigFile)) {
172
+ try {
173
+ remotes = JSON.parse((0, fs_1.readFileSync)(this.remoteConfigFile, 'utf-8'));
174
+ }
175
+ catch {
176
+ remotes = {};
177
+ }
178
+ }
179
+ remotes[name] = url;
180
+ (0, fs_1.writeFileSync)(this.remoteConfigFile, JSON.stringify(remotes, null, 2));
181
+ }
182
+ }
183
+ exports.TraceGitHub = TraceGitHub;
184
+ //# sourceMappingURL=github.js.map
package/dist/tags.d.ts ADDED
@@ -0,0 +1,85 @@
1
+ /**
2
+ * Tags Feature
3
+ *
4
+ * Create, list, delete, and checkout to semantic tags.
5
+ * - Store tags in refs/tags/
6
+ * - Tag metadata (created_at, description, creator)
7
+ * - Fast tag index for <50ms lookups
8
+ * - Unicode and special character support
9
+ */
10
+ import { TraceCommands } from './commands';
11
+ export interface Tag {
12
+ name: string;
13
+ commit_hash: string;
14
+ created_at: number;
15
+ metadata?: Record<string, any>;
16
+ }
17
+ export interface TagListOptions {
18
+ sortBy?: 'created_at' | 'name';
19
+ pattern?: string;
20
+ }
21
+ export interface TagCreateOptions {
22
+ description?: string;
23
+ creator?: string;
24
+ force?: boolean;
25
+ [key: string]: any;
26
+ }
27
+ export interface TagCheckoutOptions {
28
+ force?: boolean;
29
+ }
30
+ export declare class TagManager {
31
+ private commands;
32
+ private tagsDir;
33
+ private tagIndex;
34
+ private indexValid;
35
+ constructor(commands: TraceCommands, basePath?: string);
36
+ /**
37
+ * Create a new tag at current HEAD
38
+ */
39
+ create(name: string, options?: TagCreateOptions): Tag;
40
+ /**
41
+ * Get a tag by name
42
+ */
43
+ get(name: string): Tag | undefined;
44
+ /**
45
+ * List all tags
46
+ */
47
+ list(options?: TagListOptions): Tag[];
48
+ /**
49
+ * Delete a tag
50
+ */
51
+ delete(name: string): void;
52
+ /**
53
+ * Checkout to a tagged commit
54
+ */
55
+ checkout(name: string, options?: TagCheckoutOptions): boolean;
56
+ /**
57
+ * Rebuild the tag index
58
+ */
59
+ rebuildIndex(): void;
60
+ /**
61
+ * Private: Ensure index is valid
62
+ */
63
+ private ensureIndexValid;
64
+ /**
65
+ * Private: Validate tag name
66
+ */
67
+ private validateTagName;
68
+ /**
69
+ * Private: Ensure tags directory exists
70
+ */
71
+ private ensureTagsDir;
72
+ /**
73
+ * Private: Get tag file path
74
+ */
75
+ private getTagPath;
76
+ /**
77
+ * Private: Save tag to disk
78
+ */
79
+ private saveTag;
80
+ /**
81
+ * Private: Convert glob pattern to regex
82
+ */
83
+ private patternToRegex;
84
+ }
85
+ //# sourceMappingURL=tags.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tags.d.ts","sourceRoot":"","sources":["../src/tags.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAKH,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAE/C,MAAM,WAAW,GAAG;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAChC;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,EAAE,YAAY,GAAG,MAAM,CAAC;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,gBAAgB;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAoB;IACpC,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,QAAQ,CAA+B;IAC/C,OAAO,CAAC,UAAU,CAAkB;gBAExB,QAAQ,EAAE,iBAAiB,EAAE,QAAQ,CAAC,EAAE,MAAM;IAW1D;;OAEG;IACH,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,gBAAqB,GAAG,GAAG;IAqCzD;;OAEG;IACH,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,GAAG,GAAG,SAAS;IAKlC;;OAEG;IACH,IAAI,CAAC,OAAO,GAAE,cAAmB,GAAG,GAAG,EAAE;IAqBzC;;OAEG;IACH,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAW1B;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,kBAAuB,GAAG,OAAO;IAYjE;;OAEG;IACH,YAAY,IAAI,IAAI;IAwBpB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAMxB;;OAEG;IACH,OAAO,CAAC,eAAe;IAUvB;;OAEG;IACH,OAAO,CAAC,aAAa;IAMrB;;OAEG;IACH,OAAO,CAAC,UAAU;IAMlB;;OAEG;IACH,OAAO,CAAC,OAAO;IAMf;;OAEG;IACH,OAAO,CAAC,cAAc;CAQvB"}