contextgit 0.0.2 → 0.0.4

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 (163) hide show
  1. package/dist/bootstrap.d.ts +10 -0
  2. package/dist/bootstrap.d.ts.map +1 -0
  3. package/dist/bootstrap.js +43 -0
  4. package/dist/bootstrap.js.map +1 -0
  5. package/dist/commands/branch.d.ts +13 -0
  6. package/dist/commands/branch.d.ts.map +1 -0
  7. package/dist/commands/branch.js +52 -0
  8. package/dist/commands/branch.js.map +1 -0
  9. package/dist/commands/claim.d.ts +15 -0
  10. package/dist/commands/claim.d.ts.map +1 -0
  11. package/dist/commands/claim.js +60 -0
  12. package/dist/commands/claim.js.map +1 -0
  13. package/dist/commands/commit.d.ts +17 -0
  14. package/dist/commands/commit.d.ts.map +1 -0
  15. package/dist/commands/commit.js +83 -0
  16. package/dist/commands/commit.js.map +1 -0
  17. package/dist/commands/context.d.ts +9 -0
  18. package/dist/commands/context.d.ts.map +1 -0
  19. package/dist/commands/context.js +38 -0
  20. package/dist/commands/context.js.map +1 -0
  21. package/dist/commands/doctor.d.ts +6 -0
  22. package/dist/commands/doctor.d.ts.map +1 -0
  23. package/dist/commands/doctor.js +84 -0
  24. package/dist/commands/doctor.js.map +1 -0
  25. package/dist/commands/init.d.ts +10 -0
  26. package/dist/commands/init.d.ts.map +1 -0
  27. package/dist/commands/init.js +184 -0
  28. package/dist/commands/init.js.map +1 -0
  29. package/dist/commands/keygen.d.ts +10 -0
  30. package/dist/commands/keygen.d.ts.map +1 -0
  31. package/dist/commands/keygen.js +57 -0
  32. package/dist/commands/keygen.js.map +1 -0
  33. package/dist/commands/log.d.ts +13 -0
  34. package/dist/commands/log.d.ts.map +1 -0
  35. package/dist/commands/log.js +91 -0
  36. package/dist/commands/log.js.map +1 -0
  37. package/dist/commands/merge.d.ts +12 -0
  38. package/dist/commands/merge.d.ts.map +1 -0
  39. package/dist/commands/merge.js +29 -0
  40. package/dist/commands/merge.js.map +1 -0
  41. package/dist/commands/pull.d.ts +10 -0
  42. package/dist/commands/pull.d.ts.map +1 -0
  43. package/dist/commands/pull.js +123 -0
  44. package/dist/commands/pull.js.map +1 -0
  45. package/dist/commands/push.d.ts +10 -0
  46. package/dist/commands/push.d.ts.map +1 -0
  47. package/dist/commands/push.js +141 -0
  48. package/dist/commands/push.js.map +1 -0
  49. package/dist/commands/remote-show.d.ts +6 -0
  50. package/dist/commands/remote-show.d.ts.map +1 -0
  51. package/dist/commands/remote-show.js +71 -0
  52. package/dist/commands/remote-show.js.map +1 -0
  53. package/dist/commands/search.d.ts +11 -0
  54. package/dist/commands/search.d.ts.map +1 -0
  55. package/dist/commands/search.js +47 -0
  56. package/dist/commands/search.js.map +1 -0
  57. package/dist/commands/serve.d.ts +9 -0
  58. package/dist/commands/serve.d.ts.map +1 -0
  59. package/dist/commands/serve.js +51 -0
  60. package/dist/commands/serve.js.map +1 -0
  61. package/dist/commands/set-remote.d.ts +9 -0
  62. package/dist/commands/set-remote.d.ts.map +1 -0
  63. package/dist/commands/set-remote.js +26 -0
  64. package/dist/commands/set-remote.js.map +1 -0
  65. package/dist/commands/status.d.ts +6 -0
  66. package/dist/commands/status.d.ts.map +1 -0
  67. package/dist/commands/status.js +54 -0
  68. package/dist/commands/status.js.map +1 -0
  69. package/dist/commands/unclaim.d.ts +9 -0
  70. package/dist/commands/unclaim.d.ts.map +1 -0
  71. package/dist/commands/unclaim.js +22 -0
  72. package/dist/commands/unclaim.js.map +1 -0
  73. package/dist/config.d.ts +19 -0
  74. package/dist/config.d.ts.map +1 -0
  75. package/dist/config.js +58 -0
  76. package/dist/config.js.map +1 -0
  77. package/dist/git-hooks.d.ts +6 -0
  78. package/dist/git-hooks.d.ts.map +1 -0
  79. package/dist/git-hooks.js +58 -0
  80. package/dist/git-hooks.js.map +1 -0
  81. package/package.json +24 -18
  82. package/.claude/settings.local.json +0 -41
  83. package/.contextgit/config.json +0 -10
  84. package/.contextgit/system-prompt.md +0 -4
  85. package/.github/workflows/contextgit-ci.yml +0 -40
  86. package/CLAUDE.md +0 -123
  87. package/CLAUDE.md.next +0 -65
  88. package/docs/ContextGit_ARCHITECTURE_v3.md +0 -1141
  89. package/docs/ContextGit_DELTA.md +0 -84
  90. package/docs/ContextGit_PHASE1_PLAN.md +0 -177
  91. package/docs/ContextGit_PHASE2_PLAN.md +0 -535
  92. package/docs/ContextGit_PRD_v4.md +0 -488
  93. package/docs/decisions.md +0 -370
  94. package/packages/api/package.json +0 -25
  95. package/packages/api/src/bootstrap.ts +0 -64
  96. package/packages/api/src/config.ts +0 -45
  97. package/packages/api/src/index.ts +0 -17
  98. package/packages/api/src/middleware/auth.test.ts +0 -83
  99. package/packages/api/src/middleware/auth.ts +0 -41
  100. package/packages/api/src/remote-store.test.ts +0 -301
  101. package/packages/api/src/router.ts +0 -121
  102. package/packages/api/src/server-config.ts +0 -34
  103. package/packages/api/src/server.ts +0 -38
  104. package/packages/api/src/store-router.ts +0 -241
  105. package/packages/api/tsconfig.json +0 -8
  106. package/packages/cli/package.json +0 -29
  107. package/packages/cli/src/bootstrap.ts +0 -68
  108. package/packages/cli/src/commands/branch.ts +0 -58
  109. package/packages/cli/src/commands/claim.ts +0 -58
  110. package/packages/cli/src/commands/commit.ts +0 -79
  111. package/packages/cli/src/commands/context.ts +0 -46
  112. package/packages/cli/src/commands/doctor.ts +0 -99
  113. package/packages/cli/src/commands/init.ts +0 -141
  114. package/packages/cli/src/commands/keygen.ts +0 -65
  115. package/packages/cli/src/commands/log.ts +0 -103
  116. package/packages/cli/src/commands/merge.ts +0 -36
  117. package/packages/cli/src/commands/pull.ts +0 -145
  118. package/packages/cli/src/commands/push.ts +0 -158
  119. package/packages/cli/src/commands/remote-show.ts +0 -87
  120. package/packages/cli/src/commands/search.ts +0 -54
  121. package/packages/cli/src/commands/serve.ts +0 -61
  122. package/packages/cli/src/commands/set-remote.ts +0 -30
  123. package/packages/cli/src/commands/status.ts +0 -62
  124. package/packages/cli/src/commands/unclaim.ts +0 -28
  125. package/packages/cli/src/config.ts +0 -64
  126. package/packages/cli/src/git-hooks.ts +0 -61
  127. package/packages/cli/tsconfig.json +0 -9
  128. package/packages/core/package.json +0 -28
  129. package/packages/core/src/embeddings.test.ts +0 -58
  130. package/packages/core/src/embeddings.ts +0 -75
  131. package/packages/core/src/engine.ts +0 -274
  132. package/packages/core/src/index.ts +0 -6
  133. package/packages/core/src/snapshot.ts +0 -82
  134. package/packages/core/src/summarizer.test.ts +0 -120
  135. package/packages/core/src/summarizer.ts +0 -113
  136. package/packages/core/src/threads.ts +0 -29
  137. package/packages/core/src/types.ts +0 -240
  138. package/packages/core/tsconfig.json +0 -9
  139. package/packages/mcp/package.json +0 -31
  140. package/packages/mcp/src/auto-snapshot.ts +0 -83
  141. package/packages/mcp/src/config.ts +0 -53
  142. package/packages/mcp/src/git-sync.ts +0 -94
  143. package/packages/mcp/src/index.ts +0 -19
  144. package/packages/mcp/src/server.ts +0 -377
  145. package/packages/mcp/tsconfig.json +0 -9
  146. package/packages/store/package.json +0 -30
  147. package/packages/store/src/branch-merge.test.ts +0 -127
  148. package/packages/store/src/engine-integration.test.ts +0 -93
  149. package/packages/store/src/index.ts +0 -3
  150. package/packages/store/src/interface.ts +0 -62
  151. package/packages/store/src/local/claims.test.ts +0 -190
  152. package/packages/store/src/local/index.ts +0 -380
  153. package/packages/store/src/local/local-store.test.ts +0 -164
  154. package/packages/store/src/local/migrations.ts +0 -99
  155. package/packages/store/src/local/queries.ts +0 -760
  156. package/packages/store/src/local/schema.ts +0 -157
  157. package/packages/store/src/remote/index.ts +0 -300
  158. package/packages/store/tsconfig.json +0 -9
  159. package/pnpm-workspace.yaml +0 -2
  160. package/scripts/build.sh +0 -28
  161. package/tsconfig.base.json +0 -14
  162. package/vitest.config.ts +0 -15
  163. /package/{packages/cli/bin → bin}/run.js +0 -0
@@ -0,0 +1,10 @@
1
+ import { ContextEngine } from '@contextgit/core';
2
+ import type { ContextStore } from '@contextgit/store';
3
+ export interface CliContext {
4
+ engine: ContextEngine;
5
+ store: ContextStore;
6
+ projectId: string;
7
+ branchId: string;
8
+ }
9
+ export declare function bootstrap(): Promise<CliContext>;
10
+ //# sourceMappingURL=bootstrap.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../src/bootstrap.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAEhD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAGrD,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,aAAa,CAAA;IACrB,KAAK,EAAE,YAAY,CAAA;IACnB,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;CACjB;AA4BD,wBAAsB,SAAS,IAAI,OAAO,CAAC,UAAU,CAAC,CAwBrD"}
@@ -0,0 +1,43 @@
1
+ // bootstrap.ts — shared setup for commit/context commands.
2
+ // Loads config, opens LocalStore, detects git branch, initializes ContextEngine.
3
+ import os from 'os';
4
+ import { simpleGit } from 'simple-git';
5
+ import { ContextEngine } from '@contextgit/core';
6
+ import { LocalStore, RemoteStore } from '@contextgit/store';
7
+ import { loadConfig } from './config.js';
8
+ async function detectGitBranch() {
9
+ try {
10
+ const git = simpleGit(process.cwd());
11
+ const result = await git.revparse(['--abbrev-ref', 'HEAD']);
12
+ return result.trim();
13
+ }
14
+ catch {
15
+ return 'main';
16
+ }
17
+ }
18
+ async function resolveContextBranch(store, projectId, gitBranch) {
19
+ const existing = await store.getBranchByGitName(projectId, gitBranch);
20
+ if (existing)
21
+ return existing.id;
22
+ const created = await store.createBranch({
23
+ projectId,
24
+ name: `Context: ${gitBranch}`,
25
+ gitBranch,
26
+ });
27
+ return created.id;
28
+ }
29
+ export async function bootstrap() {
30
+ const config = loadConfig();
31
+ const { projectId } = config;
32
+ const store = config.store && config.store !== 'local'
33
+ ? new RemoteStore(config.store)
34
+ : new LocalStore(projectId);
35
+ const gitBranch = await detectGitBranch();
36
+ const branchId = await resolveContextBranch(store, projectId, gitBranch);
37
+ const hostname = os.hostname();
38
+ const agentId = `${hostname}-cli-interactive`;
39
+ const engine = new ContextEngine(store, agentId, config.agentRole ?? 'solo', 'contextgit-cli', config.workflowType ?? 'interactive');
40
+ await engine.init(projectId, branchId);
41
+ return { engine, store, projectId, branchId };
42
+ }
43
+ //# sourceMappingURL=bootstrap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../src/bootstrap.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAC3D,iFAAiF;AAEjF,OAAO,EAAE,MAAM,IAAI,CAAA;AACnB,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAChD,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAE3D,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AASxC,KAAK,UAAU,eAAe;IAC5B,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,SAAS,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAA;QACpC,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC,CAAA;QAC3D,OAAO,MAAM,CAAC,IAAI,EAAE,CAAA;IACtB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,MAAM,CAAA;IACf,CAAC;AACH,CAAC;AAED,KAAK,UAAU,oBAAoB,CACjC,KAAmB,EACnB,SAAiB,EACjB,SAAiB;IAEjB,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,kBAAkB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAA;IACrE,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAC,EAAE,CAAA;IAEhC,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,YAAY,CAAC;QACvC,SAAS;QACT,IAAI,EAAE,YAAY,SAAS,EAAE;QAC7B,SAAS;KACV,CAAC,CAAA;IACF,OAAO,OAAO,CAAC,EAAE,CAAA;AACnB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS;IAC7B,MAAM,MAAM,GAAG,UAAU,EAAE,CAAA;IAC3B,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,CAAA;IAE5B,MAAM,KAAK,GACT,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,KAAK,OAAO;QACtC,CAAC,CAAC,IAAI,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC;QAC/B,CAAC,CAAC,IAAI,UAAU,CAAC,SAAS,CAAC,CAAA;IAC/B,MAAM,SAAS,GAAG,MAAM,eAAe,EAAE,CAAA;IACzC,MAAM,QAAQ,GAAG,MAAM,oBAAoB,CAAC,KAAK,EAAE,SAAS,EAAE,SAAS,CAAC,CAAA;IAExE,MAAM,QAAQ,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAA;IAC9B,MAAM,OAAO,GAAG,GAAG,QAAQ,kBAAkB,CAAA;IAE7C,MAAM,MAAM,GAAG,IAAI,aAAa,CAC9B,KAAK,EACL,OAAO,EACP,MAAM,CAAC,SAAS,IAAI,MAAM,EAC1B,gBAAgB,EAChB,MAAM,CAAC,YAAY,IAAI,aAAa,CACrC,CAAA;IACD,MAAM,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAA;IAEtC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAA;AAC/C,CAAC"}
@@ -0,0 +1,13 @@
1
+ import { Command } from '@oclif/core';
2
+ export default class BranchCmd extends Command {
3
+ static description: string;
4
+ static args: {
5
+ name: import("@oclif/core/lib/interfaces/parser.js").Arg<string, Record<string, unknown>>;
6
+ };
7
+ static flags: {
8
+ git: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
9
+ parent: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
10
+ };
11
+ run(): Promise<void>;
12
+ }
13
+ //# sourceMappingURL=branch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"branch.d.ts","sourceRoot":"","sources":["../../src/commands/branch.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAe,MAAM,aAAa,CAAA;AAalD,MAAM,CAAC,OAAO,OAAO,SAAU,SAAQ,OAAO;IAC5C,MAAM,CAAC,WAAW,SAAgC;IAElD,MAAM,CAAC,IAAI;;MAKV;IAED,MAAM,CAAC,KAAK;;;MASX;IAEK,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAqB3B"}
@@ -0,0 +1,52 @@
1
+ // branch — create a new context branch.
2
+ import { Command, Args, Flags } from '@oclif/core';
3
+ import { simpleGit } from 'simple-git';
4
+ import { LocalStore } from '@contextgit/store';
5
+ import { loadConfig } from '../config.js';
6
+ async function currentGitBranch(cwd) {
7
+ try {
8
+ return (await simpleGit(cwd).revparse(['--abbrev-ref', 'HEAD'])).trim();
9
+ }
10
+ catch {
11
+ return 'main';
12
+ }
13
+ }
14
+ export default class BranchCmd extends Command {
15
+ static description = 'Create a new context branch';
16
+ static args = {
17
+ name: Args.string({
18
+ description: 'Branch name (human-readable label)',
19
+ required: true,
20
+ }),
21
+ };
22
+ static flags = {
23
+ git: Flags.string({
24
+ description: 'Git branch name to associate (defaults to current git branch)',
25
+ required: false,
26
+ }),
27
+ parent: Flags.string({
28
+ description: 'Parent branch ID',
29
+ required: false,
30
+ }),
31
+ };
32
+ async run() {
33
+ const { args, flags } = await this.parse(BranchCmd);
34
+ const config = loadConfig();
35
+ const store = new LocalStore(config.projectId);
36
+ const cwd = process.cwd();
37
+ const gitBranch = flags.git ?? (await currentGitBranch(cwd));
38
+ const branch = await store.createBranch({
39
+ projectId: config.projectId,
40
+ name: args.name,
41
+ gitBranch,
42
+ parentBranchId: flags.parent,
43
+ });
44
+ this.log(`Branch created.`);
45
+ this.log(`ID: ${branch.id}`);
46
+ this.log(`Name: ${branch.name}`);
47
+ this.log(`Git: ${branch.gitBranch}`);
48
+ if (branch.parentBranchId)
49
+ this.log(`Parent: ${branch.parentBranchId}`);
50
+ }
51
+ }
52
+ //# sourceMappingURL=branch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"branch.js","sourceRoot":"","sources":["../../src/commands/branch.ts"],"names":[],"mappings":"AAAA,wCAAwC;AAExC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAEzC,KAAK,UAAU,gBAAgB,CAAC,GAAW;IACzC,IAAI,CAAC;QACH,OAAO,CAAC,MAAM,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;IACzE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,MAAM,CAAA;IACf,CAAC;AACH,CAAC;AAED,MAAM,CAAC,OAAO,OAAO,SAAU,SAAQ,OAAO;IAC5C,MAAM,CAAC,WAAW,GAAG,6BAA6B,CAAA;IAElD,MAAM,CAAC,IAAI,GAAG;QACZ,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC;YAChB,WAAW,EAAE,oCAAoC;YACjD,QAAQ,EAAE,IAAI;SACf,CAAC;KACH,CAAA;IAED,MAAM,CAAC,KAAK,GAAG;QACb,GAAG,EAAE,KAAK,CAAC,MAAM,CAAC;YAChB,WAAW,EAAE,+DAA+D;YAC5E,QAAQ,EAAE,KAAK;SAChB,CAAC;QACF,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC;YACnB,WAAW,EAAE,kBAAkB;YAC/B,QAAQ,EAAE,KAAK;SAChB,CAAC;KACH,CAAA;IAED,KAAK,CAAC,GAAG;QACP,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAA;QACnD,MAAM,MAAM,GAAG,UAAU,EAAE,CAAA;QAC3B,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;QAC9C,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAA;QAEzB,MAAM,SAAS,GAAG,KAAK,CAAC,GAAG,IAAI,CAAC,MAAM,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAA;QAE5D,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,YAAY,CAAC;YACtC,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,SAAS;YACT,cAAc,EAAE,KAAK,CAAC,MAAM;SAC7B,CAAC,CAAA;QAEF,IAAI,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAA;QAC3B,IAAI,CAAC,GAAG,CAAC,YAAY,MAAM,CAAC,EAAE,EAAE,CAAC,CAAA;QACjC,IAAI,CAAC,GAAG,CAAC,YAAY,MAAM,CAAC,IAAI,EAAE,CAAC,CAAA;QACnC,IAAI,CAAC,GAAG,CAAC,YAAY,MAAM,CAAC,SAAS,EAAE,CAAC,CAAA;QACxC,IAAI,MAAM,CAAC,cAAc;YAAE,IAAI,CAAC,GAAG,CAAC,YAAY,MAAM,CAAC,cAAc,EAAE,CAAC,CAAA;IAC1E,CAAC"}
@@ -0,0 +1,15 @@
1
+ import { Command } from '@oclif/core';
2
+ export default class ClaimCmd extends Command {
3
+ static description: string;
4
+ static args: {
5
+ task: import("@oclif/core/lib/interfaces/parser.js").Arg<string, Record<string, unknown>>;
6
+ };
7
+ static flags: {
8
+ ttl: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<number, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
9
+ status: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
10
+ 'for-agent-id': import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
11
+ 'thread-id': import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
12
+ };
13
+ run(): Promise<void>;
14
+ }
15
+ //# sourceMappingURL=claim.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claim.d.ts","sourceRoot":"","sources":["../../src/commands/claim.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAe,MAAM,aAAa,CAAA;AAIlD,MAAM,CAAC,OAAO,OAAO,QAAS,SAAQ,OAAO;IAC3C,MAAM,CAAC,WAAW,SAA2E;IAE7F,MAAM,CAAC,IAAI;;MAKV;IAED,MAAM,CAAC,KAAK;;;;;MAkBX;IAEK,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAgC3B"}
@@ -0,0 +1,60 @@
1
+ // claim — create a task claim to prevent concurrent agent work.
2
+ import { Command, Args, Flags } from '@oclif/core';
3
+ import { LocalStore } from '@contextgit/store';
4
+ import { loadConfig } from '../config.js';
5
+ export default class ClaimCmd extends Command {
6
+ static description = 'Claim a task to prevent other agents from picking it up simultaneously';
7
+ static args = {
8
+ task: Args.string({
9
+ description: 'Short description of the task being claimed',
10
+ required: true,
11
+ }),
12
+ };
13
+ static flags = {
14
+ ttl: Flags.integer({
15
+ description: 'Time-to-live in hours before the claim auto-expires',
16
+ default: 2,
17
+ }),
18
+ status: Flags.string({
19
+ description: "Claim status: 'proposed' (plan mode) or 'active' (approved, work in progress)",
20
+ default: 'proposed',
21
+ options: ['proposed', 'active'],
22
+ }),
23
+ 'for-agent-id': Flags.string({
24
+ description: 'Claim on behalf of this agent ID (pre-claiming by orchestrator)',
25
+ required: false,
26
+ }),
27
+ 'thread-id': Flags.string({
28
+ description: 'Direct thread ID link for this claim',
29
+ required: false,
30
+ }),
31
+ };
32
+ async run() {
33
+ const { args, flags } = await this.parse(ClaimCmd);
34
+ const config = loadConfig();
35
+ const store = new LocalStore(config.projectId);
36
+ const branches = await store.listBranches(config.projectId);
37
+ const activeBranch = branches.find((b) => b.status === 'active') ?? branches[0];
38
+ if (!activeBranch) {
39
+ this.error('No branch found. Run contextgit init first.');
40
+ }
41
+ const agentId = flags['for-agent-id'] ?? `cli-${process.env.USER ?? 'unknown'}`;
42
+ const claim = await store.claimTask(config.projectId, activeBranch.id, {
43
+ task: args.task,
44
+ agentId,
45
+ role: config.agentRole ?? 'solo',
46
+ status: flags.status,
47
+ ttl: flags.ttl * 3_600_000,
48
+ threadId: flags['thread-id'],
49
+ });
50
+ this.log(`Claimed.`);
51
+ this.log(`ID: ${claim.id}`);
52
+ this.log(`Task: ${claim.task}`);
53
+ this.log(`Agent: ${claim.agentId}`);
54
+ this.log(`Thread ID: ${claim.threadId ?? '(none)'}`);
55
+ this.log(`Status: ${claim.status}`);
56
+ this.log(`TTL: ${flags.ttl}h`);
57
+ store.close();
58
+ }
59
+ }
60
+ //# sourceMappingURL=claim.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claim.js","sourceRoot":"","sources":["../../src/commands/claim.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import { Command } from '@oclif/core';
2
+ export default class CommitCmd extends Command {
3
+ static description: string;
4
+ static args: {
5
+ message: import("@oclif/core/lib/interfaces/parser.js").Arg<string | undefined, Record<string, unknown>>;
6
+ };
7
+ static flags: {
8
+ message: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
9
+ content: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
10
+ thread: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string[] | undefined, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
11
+ close: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string[] | undefined, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
12
+ 'ci-run-id': import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
13
+ pipeline: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
14
+ };
15
+ run(): Promise<void>;
16
+ }
17
+ //# sourceMappingURL=commit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commit.d.ts","sourceRoot":"","sources":["../../src/commands/commit.ts"],"names":[],"mappings":"AAEA,OAAO,EAAQ,OAAO,EAAS,MAAM,aAAa,CAAA;AAYlD,MAAM,CAAC,OAAO,OAAO,SAAU,SAAQ,OAAO;IAC5C,MAAM,CAAC,WAAW,SAA4B;IAG9C,MAAM,CAAC,IAAI;;MAKV;IAED,MAAM,CAAC,KAAK;;;;;;;MAgCX;IAEK,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAkC3B"}
@@ -0,0 +1,83 @@
1
+ // commit — record a context commit via engine.commit().
2
+ import { Args, Command, Flags } from '@oclif/core';
3
+ import { simpleGit } from 'simple-git';
4
+ import { bootstrap } from '../bootstrap.js';
5
+ async function captureGitSha(cwd) {
6
+ try {
7
+ return (await simpleGit(cwd).revparse(['HEAD'])).trim();
8
+ }
9
+ catch {
10
+ return undefined;
11
+ }
12
+ }
13
+ export default class CommitCmd extends Command {
14
+ static description = 'Record a context commit';
15
+ // Positional arg — mirrors git commit behaviour: contextgit commit "message"
16
+ static args = {
17
+ message: Args.string({
18
+ description: 'Short commit message (what was accomplished)',
19
+ required: false,
20
+ }),
21
+ };
22
+ static flags = {
23
+ message: Flags.string({
24
+ char: 'm',
25
+ description: 'Short commit message — alternative to positional arg',
26
+ required: false,
27
+ }),
28
+ content: Flags.string({
29
+ char: 'c',
30
+ description: 'Detailed commit content. Defaults to the message if omitted.',
31
+ required: false,
32
+ }),
33
+ thread: Flags.string({
34
+ char: 't',
35
+ description: 'Open a new thread (can be repeated)',
36
+ multiple: true,
37
+ required: false,
38
+ }),
39
+ close: Flags.string({
40
+ description: 'Close a thread by ID (can be repeated)',
41
+ multiple: true,
42
+ required: false,
43
+ }),
44
+ 'ci-run-id': Flags.string({
45
+ description: 'CI run ID (e.g. GitHub Actions run ID)',
46
+ required: false,
47
+ env: 'GITHUB_RUN_ID',
48
+ }),
49
+ pipeline: Flags.string({
50
+ description: 'CI pipeline / workflow name',
51
+ required: false,
52
+ env: 'GITHUB_WORKFLOW',
53
+ }),
54
+ };
55
+ async run() {
56
+ const { args, flags } = await this.parse(CommitCmd);
57
+ // Positional arg takes precedence; -m flag is the fallback for scripts/hooks
58
+ const message = args.message ?? flags.message;
59
+ if (!message) {
60
+ this.error('A commit message is required. Usage: contextgit commit "your message" or contextgit commit -m "your message"');
61
+ }
62
+ const ctx = await bootstrap();
63
+ const threads = {};
64
+ if (flags.thread?.length)
65
+ threads.open = flags.thread;
66
+ if (flags.close?.length) {
67
+ threads.close = flags.close.map(id => ({ id, note: 'Closed via CLI' }));
68
+ }
69
+ const gitCommitSha = await captureGitSha(process.cwd());
70
+ const commit = await ctx.engine.commit({
71
+ message,
72
+ content: flags.content ?? message,
73
+ gitCommitSha,
74
+ ciRunId: flags['ci-run-id'],
75
+ pipelineName: flags.pipeline,
76
+ ...(Object.keys(threads).length > 0 ? { threads } : {}),
77
+ });
78
+ this.log(`Commit recorded.`);
79
+ this.log(`ID: ${commit.id}`);
80
+ this.log(`Message: ${commit.message}`);
81
+ }
82
+ }
83
+ //# sourceMappingURL=commit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commit.js","sourceRoot":"","sources":["../../src/commands/commit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { Command } from '@oclif/core';
2
+ export default class ContextCmd extends Command {
3
+ static description: string;
4
+ static flags: {
5
+ format: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
6
+ };
7
+ run(): Promise<void>;
8
+ }
9
+ //# sourceMappingURL=context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/commands/context.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAS,MAAM,aAAa,CAAA;AAM5C,MAAM,CAAC,OAAO,OAAO,UAAW,SAAQ,OAAO;IAC7C,MAAM,CAAC,WAAW,SAA+C;IAEjE,MAAM,CAAC,KAAK;;MAOX;IAEK,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAyB3B"}
@@ -0,0 +1,38 @@
1
+ // context — print the current project snapshot to stdout.
2
+ import { Command, Flags } from '@oclif/core';
3
+ import { simpleGit } from 'simple-git';
4
+ import { LocalStore } from '@contextgit/store';
5
+ import { loadConfig } from '../config.js';
6
+ export default class ContextCmd extends Command {
7
+ static description = 'Print the current project context snapshot';
8
+ static flags = {
9
+ format: Flags.string({
10
+ char: 'f',
11
+ description: 'Output format',
12
+ options: ['agents-md', 'json', 'text'],
13
+ default: 'text',
14
+ }),
15
+ };
16
+ async run() {
17
+ const { flags } = await this.parse(ContextCmd);
18
+ const config = loadConfig();
19
+ const store = new LocalStore(config.projectId);
20
+ // Detect current git branch
21
+ let gitBranch = 'main';
22
+ try {
23
+ const git = simpleGit(process.cwd());
24
+ gitBranch = (await git.revparse(['--abbrev-ref', 'HEAD'])).trim();
25
+ }
26
+ catch {
27
+ // fallback to 'main'
28
+ }
29
+ const branch = await store.getBranchByGitName(config.projectId, gitBranch);
30
+ if (!branch) {
31
+ this.error(`No context branch found for git branch '${gitBranch}'. Run 'contextgit init' first.`);
32
+ }
33
+ const format = (flags.format ?? 'text');
34
+ const snapshot = await store.getFormattedSnapshot(config.projectId, branch.id, format);
35
+ this.log(snapshot);
36
+ }
37
+ }
38
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/commands/context.ts"],"names":[],"mappings":"AAAA,0DAA0D;AAE1D,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAE9C,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAEzC,MAAM,CAAC,OAAO,OAAO,UAAW,SAAQ,OAAO;IAC7C,MAAM,CAAC,WAAW,GAAG,4CAA4C,CAAA;IAEjE,MAAM,CAAC,KAAK,GAAG;QACb,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC;YACnB,IAAI,EAAE,GAAG;YACT,WAAW,EAAE,eAAe;YAC5B,OAAO,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,CAAC;YACtC,OAAO,EAAE,MAAM;SAChB,CAAC;KACH,CAAA;IAED,KAAK,CAAC,GAAG;QACP,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAA;QAC9C,MAAM,MAAM,GAAG,UAAU,EAAE,CAAA;QAC3B,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;QAE9C,4BAA4B;QAC5B,IAAI,SAAS,GAAG,MAAM,CAAA;QACtB,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,SAAS,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAA;YACpC,SAAS,GAAG,CAAC,MAAM,GAAG,CAAC,QAAQ,CAAC,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;QACnE,CAAC;QAAC,MAAM,CAAC;YACP,qBAAqB;QACvB,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,kBAAkB,CAAC,MAAM,CAAC,SAAS,EAAE,SAAS,CAAC,CAAA;QAC1E,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,IAAI,CAAC,KAAK,CACR,2CAA2C,SAAS,iCAAiC,CACtF,CAAA;QACH,CAAC;QAED,MAAM,MAAM,GAAG,CAAC,KAAK,CAAC,MAAM,IAAI,MAAM,CAAmB,CAAA;QACzD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,oBAAoB,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,CAAA;QACtF,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;IACpB,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { Command } from '@oclif/core';
2
+ export default class DoctorCmd extends Command {
3
+ static description: string;
4
+ run(): Promise<void>;
5
+ }
6
+ //# sourceMappingURL=doctor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAMrC,MAAM,CAAC,OAAO,OAAO,SAAU,SAAQ,OAAO;IAC5C,MAAM,CAAC,WAAW,SAA+C;IAE3D,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAoF3B"}
@@ -0,0 +1,84 @@
1
+ // doctor — diagnose the ContextGit installation and report issues.
2
+ import os from 'os';
3
+ import { join, resolve } from 'path';
4
+ import { existsSync, readFileSync } from 'fs';
5
+ import { Command } from '@oclif/core';
6
+ import { LocalStore } from '@contextgit/store';
7
+ import { findConfigPath } from '../config.js';
8
+ const SENTINEL = '# contextgit';
9
+ export default class DoctorCmd extends Command {
10
+ static description = 'Check ContextGit setup and diagnose issues';
11
+ async run() {
12
+ this.log('ContextGit Doctor\n');
13
+ let passed = 0;
14
+ let failed = 0;
15
+ const check = (label, ok, hint) => {
16
+ const icon = ok ? '✓' : '✗';
17
+ this.log(` [${icon}] ${label}`);
18
+ if (!ok && hint)
19
+ this.log(` → ${hint}`);
20
+ ok ? passed++ : failed++;
21
+ };
22
+ // ── 1. Config file ────────────────────────────────────────────────────────
23
+ let configPath = null;
24
+ let config = null;
25
+ try {
26
+ configPath = findConfigPath(process.cwd());
27
+ config = JSON.parse(readFileSync(configPath, 'utf-8'));
28
+ check('Config file found and valid JSON', true);
29
+ }
30
+ catch {
31
+ check('Config file found and valid JSON', false, 'Run: contextgit init');
32
+ }
33
+ // ── 2. DB reachable ───────────────────────────────────────────────────────
34
+ if (config?.projectId) {
35
+ try {
36
+ const store = new LocalStore(config.projectId);
37
+ await store.getProject(config.projectId);
38
+ check('Local DB reachable', true);
39
+ }
40
+ catch {
41
+ check('Local DB reachable', false, 'DB file may be corrupted — try: contextgit init');
42
+ }
43
+ }
44
+ else {
45
+ check('Local DB reachable', false, 'No config to check DB against');
46
+ }
47
+ // ── 3. Git hooks installed ────────────────────────────────────────────────
48
+ const gitHooksDir = resolve(process.cwd(), '.git', 'hooks');
49
+ const postCommitPath = join(gitHooksDir, 'post-commit');
50
+ const hooksInstalled = existsSync(postCommitPath) &&
51
+ readFileSync(postCommitPath, 'utf-8').includes(SENTINEL);
52
+ check('Git hooks installed', hooksInstalled, 'Run: contextgit init --hooks');
53
+ // ── 4. API key configured (only relevant if remote is set) ────────────────
54
+ const remote = config?.remote;
55
+ if (remote) {
56
+ const serverCfgPath = join(os.homedir(), '.contextgit', 'server.json');
57
+ let hasKey = false;
58
+ try {
59
+ const cfg = JSON.parse(readFileSync(serverCfgPath, 'utf-8'));
60
+ hasKey = typeof cfg['keyHash'] === 'string' && cfg['keyHash'].length > 0;
61
+ }
62
+ catch { /* not configured */ }
63
+ check(`API key configured (remote: ${remote})`, hasKey, 'Run: contextgit keygen --save');
64
+ }
65
+ else {
66
+ check('API key (no remote configured — skipped)', true);
67
+ }
68
+ // ── 5. MCP registered in ~/.claude.json ───────────────────────────────────
69
+ const claudeJsonPath = join(os.homedir(), '.claude.json');
70
+ let mcpRegistered = false;
71
+ try {
72
+ const raw = readFileSync(claudeJsonPath, 'utf-8');
73
+ mcpRegistered = raw.includes('contextgit');
74
+ }
75
+ catch { /* file missing */ }
76
+ check('MCP server registered in ~/.claude.json', mcpRegistered, 'Add contextgit to mcpServers in ~/.claude.json');
77
+ // ── Summary ───────────────────────────────────────────────────────────────
78
+ this.log('');
79
+ this.log(`${passed} passed, ${failed} failed`);
80
+ if (failed > 0)
81
+ process.exitCode = 1;
82
+ }
83
+ }
84
+ //# sourceMappingURL=doctor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAAA,mEAAmE;AAEnE,OAAO,EAAE,MAAM,IAAI,CAAA;AACnB,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAA;AACpC,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,IAAI,CAAA;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AACrC,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAE7C,MAAM,QAAQ,GAAG,cAAc,CAAA;AAE/B,MAAM,CAAC,OAAO,OAAO,SAAU,SAAQ,OAAO;IAC5C,MAAM,CAAC,WAAW,GAAG,4CAA4C,CAAA;IAEjE,KAAK,CAAC,GAAG;QACP,IAAI,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAA;QAE/B,IAAI,MAAM,GAAG,CAAC,CAAA;QACd,IAAI,MAAM,GAAG,CAAC,CAAA;QAEd,MAAM,KAAK,GAAG,CAAC,KAAa,EAAE,EAAW,EAAE,IAAa,EAAE,EAAE;YAC1D,MAAM,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAA;YAC3B,IAAI,CAAC,GAAG,CAAC,MAAM,IAAI,KAAK,KAAK,EAAE,CAAC,CAAA;YAChC,IAAI,CAAC,EAAE,IAAI,IAAI;gBAAE,IAAI,CAAC,GAAG,CAAC,aAAa,IAAI,EAAE,CAAC,CAAA;YAC9C,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,CAAA;QAC1B,CAAC,CAAA;QAED,6EAA6E;QAC7E,IAAI,UAAU,GAAkB,IAAI,CAAA;QACpC,IAAI,MAAM,GAAmC,IAAI,CAAA;QACjD,IAAI,CAAC;YACH,UAAU,GAAG,cAAc,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAA;YAC1C,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAA4B,CAAA;YACjF,KAAK,CAAC,kCAAkC,EAAE,IAAI,CAAC,CAAA;QACjD,CAAC;QAAC,MAAM,CAAC;YACP,KAAK,CAAC,kCAAkC,EAAE,KAAK,EAAE,sBAAsB,CAAC,CAAA;QAC1E,CAAC;QAED,6EAA6E;QAC7E,IAAI,MAAM,EAAE,SAAS,EAAE,CAAC;YACtB,IAAI,CAAC;gBACH,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,SAAmB,CAAC,CAAA;gBACxD,MAAM,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,SAAmB,CAAC,CAAA;gBAClD,KAAK,CAAC,oBAAoB,EAAE,IAAI,CAAC,CAAA;YACnC,CAAC;YAAC,MAAM,CAAC;gBACP,KAAK,CAAC,oBAAoB,EAAE,KAAK,EAAE,iDAAiD,CAAC,CAAA;YACvF,CAAC;QACH,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,oBAAoB,EAAE,KAAK,EAAE,+BAA+B,CAAC,CAAA;QACrE,CAAC;QAED,6EAA6E;QAC7E,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,CAAA;QAC3D,MAAM,cAAc,GAAG,IAAI,CAAC,WAAW,EAAE,aAAa,CAAC,CAAA;QACvD,MAAM,cAAc,GAAG,UAAU,CAAC,cAAc,CAAC;YAC/C,YAAY,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;QAC1D,KAAK,CACH,qBAAqB,EACrB,cAAc,EACd,8BAA8B,CAC/B,CAAA;QAED,6EAA6E;QAC7E,MAAM,MAAM,GAAG,MAAM,EAAE,MAA4B,CAAA;QACnD,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,aAAa,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,aAAa,CAAC,CAAA;YACtE,IAAI,MAAM,GAAG,KAAK,CAAA;YAClB,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,aAAa,EAAE,OAAO,CAAC,CAA4B,CAAA;gBACvF,MAAM,GAAG,OAAO,GAAG,CAAC,SAAS,CAAC,KAAK,QAAQ,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC,MAAM,GAAG,CAAC,CAAA;YAC1E,CAAC;YAAC,MAAM,CAAC,CAAC,oBAAoB,CAAC,CAAC;YAChC,KAAK,CACH,+BAA+B,MAAM,GAAG,EACxC,MAAM,EACN,+BAA+B,CAChC,CAAA;QACH,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,0CAA0C,EAAE,IAAI,CAAC,CAAA;QACzD,CAAC;QAED,6EAA6E;QAC7E,MAAM,cAAc,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,cAAc,CAAC,CAAA;QACzD,IAAI,aAAa,GAAG,KAAK,CAAA;QACzB,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,YAAY,CAAC,cAAc,EAAE,OAAO,CAAC,CAAA;YACjD,aAAa,GAAG,GAAG,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAA;QAC5C,CAAC;QAAC,MAAM,CAAC,CAAC,kBAAkB,CAAC,CAAC;QAC9B,KAAK,CACH,yCAAyC,EACzC,aAAa,EACb,gDAAgD,CACjD,CAAA;QAED,6EAA6E;QAC7E,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QACZ,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,YAAY,MAAM,SAAS,CAAC,CAAA;QAC9C,IAAI,MAAM,GAAG,CAAC;YAAE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAA;IACtC,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { Command } from '@oclif/core';
2
+ export default class Init extends Command {
3
+ static description: string;
4
+ static flags: {
5
+ name: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
6
+ hooks: import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
7
+ };
8
+ run(): Promise<void>;
9
+ }
10
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAS,MAAM,aAAa,CAAA;AAgD5C,MAAM,CAAC,OAAO,OAAO,IAAK,SAAQ,OAAO;IACvC,MAAM,CAAC,WAAW,SAA0C;IAE5D,MAAM,CAAC,KAAK;;;MAWX;IAEK,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CA0G3B"}