@kynetic-ai/spec 0.1.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.
- package/README.md +263 -0
- package/dist/acp/client.d.ts +159 -0
- package/dist/acp/client.d.ts.map +1 -0
- package/dist/acp/client.js +255 -0
- package/dist/acp/client.js.map +1 -0
- package/dist/acp/framing.d.ts +119 -0
- package/dist/acp/framing.d.ts.map +1 -0
- package/dist/acp/framing.js +302 -0
- package/dist/acp/framing.js.map +1 -0
- package/dist/acp/index.d.ts +14 -0
- package/dist/acp/index.d.ts.map +1 -0
- package/dist/acp/index.js +13 -0
- package/dist/acp/index.js.map +1 -0
- package/dist/acp/types.d.ts +89 -0
- package/dist/acp/types.d.ts.map +1 -0
- package/dist/acp/types.js +99 -0
- package/dist/acp/types.js.map +1 -0
- package/dist/agents/adapters.d.ts +55 -0
- package/dist/agents/adapters.d.ts.map +1 -0
- package/dist/agents/adapters.js +84 -0
- package/dist/agents/adapters.js.map +1 -0
- package/dist/agents/index.d.ts +8 -0
- package/dist/agents/index.d.ts.map +1 -0
- package/dist/agents/index.js +10 -0
- package/dist/agents/index.js.map +1 -0
- package/dist/agents/spawner.d.ts +53 -0
- package/dist/agents/spawner.d.ts.map +1 -0
- package/dist/agents/spawner.js +83 -0
- package/dist/agents/spawner.js.map +1 -0
- package/dist/cli/batch.d.ts +82 -0
- package/dist/cli/batch.d.ts.map +1 -0
- package/dist/cli/batch.js +162 -0
- package/dist/cli/batch.js.map +1 -0
- package/dist/cli/commands/clone-for-testing.d.ts +6 -0
- package/dist/cli/commands/clone-for-testing.d.ts.map +1 -0
- package/dist/cli/commands/clone-for-testing.js +176 -0
- package/dist/cli/commands/clone-for-testing.js.map +1 -0
- package/dist/cli/commands/derive.d.ts +6 -0
- package/dist/cli/commands/derive.d.ts.map +1 -0
- package/dist/cli/commands/derive.js +450 -0
- package/dist/cli/commands/derive.js.map +1 -0
- package/dist/cli/commands/help.d.ts +6 -0
- package/dist/cli/commands/help.d.ts.map +1 -0
- package/dist/cli/commands/help.js +196 -0
- package/dist/cli/commands/help.js.map +1 -0
- package/dist/cli/commands/inbox.d.ts +6 -0
- package/dist/cli/commands/inbox.d.ts.map +1 -0
- package/dist/cli/commands/inbox.js +235 -0
- package/dist/cli/commands/inbox.js.map +1 -0
- package/dist/cli/commands/index.d.ts +20 -0
- package/dist/cli/commands/index.d.ts.map +1 -0
- package/dist/cli/commands/index.js +21 -0
- package/dist/cli/commands/index.js.map +1 -0
- package/dist/cli/commands/init.d.ts +6 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +245 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/item.d.ts +6 -0
- package/dist/cli/commands/item.d.ts.map +1 -0
- package/dist/cli/commands/item.js +1311 -0
- package/dist/cli/commands/item.js.map +1 -0
- package/dist/cli/commands/link.d.ts +6 -0
- package/dist/cli/commands/link.d.ts.map +1 -0
- package/dist/cli/commands/link.js +288 -0
- package/dist/cli/commands/link.js.map +1 -0
- package/dist/cli/commands/log.d.ts +16 -0
- package/dist/cli/commands/log.d.ts.map +1 -0
- package/dist/cli/commands/log.js +291 -0
- package/dist/cli/commands/log.js.map +1 -0
- package/dist/cli/commands/meta.d.ts +15 -0
- package/dist/cli/commands/meta.d.ts.map +1 -0
- package/dist/cli/commands/meta.js +1378 -0
- package/dist/cli/commands/meta.js.map +1 -0
- package/dist/cli/commands/module.d.ts +6 -0
- package/dist/cli/commands/module.d.ts.map +1 -0
- package/dist/cli/commands/module.js +102 -0
- package/dist/cli/commands/module.js.map +1 -0
- package/dist/cli/commands/ralph.d.ts +9 -0
- package/dist/cli/commands/ralph.d.ts.map +1 -0
- package/dist/cli/commands/ralph.js +465 -0
- package/dist/cli/commands/ralph.js.map +1 -0
- package/dist/cli/commands/search.d.ts +6 -0
- package/dist/cli/commands/search.d.ts.map +1 -0
- package/dist/cli/commands/search.js +134 -0
- package/dist/cli/commands/search.js.map +1 -0
- package/dist/cli/commands/session.d.ts +164 -0
- package/dist/cli/commands/session.d.ts.map +1 -0
- package/dist/cli/commands/session.js +745 -0
- package/dist/cli/commands/session.js.map +1 -0
- package/dist/cli/commands/setup.d.ts +26 -0
- package/dist/cli/commands/setup.d.ts.map +1 -0
- package/dist/cli/commands/setup.js +586 -0
- package/dist/cli/commands/setup.js.map +1 -0
- package/dist/cli/commands/shadow.d.ts +6 -0
- package/dist/cli/commands/shadow.d.ts.map +1 -0
- package/dist/cli/commands/shadow.js +299 -0
- package/dist/cli/commands/shadow.js.map +1 -0
- package/dist/cli/commands/task.d.ts +6 -0
- package/dist/cli/commands/task.d.ts.map +1 -0
- package/dist/cli/commands/task.js +1514 -0
- package/dist/cli/commands/task.js.map +1 -0
- package/dist/cli/commands/tasks.d.ts +6 -0
- package/dist/cli/commands/tasks.d.ts.map +1 -0
- package/dist/cli/commands/tasks.js +347 -0
- package/dist/cli/commands/tasks.js.map +1 -0
- package/dist/cli/commands/trait.d.ts +10 -0
- package/dist/cli/commands/trait.d.ts.map +1 -0
- package/dist/cli/commands/trait.js +295 -0
- package/dist/cli/commands/trait.js.map +1 -0
- package/dist/cli/commands/validate.d.ts +6 -0
- package/dist/cli/commands/validate.d.ts.map +1 -0
- package/dist/cli/commands/validate.js +626 -0
- package/dist/cli/commands/validate.js.map +1 -0
- package/dist/cli/exit-codes.d.ts +62 -0
- package/dist/cli/exit-codes.d.ts.map +1 -0
- package/dist/cli/exit-codes.js +65 -0
- package/dist/cli/exit-codes.js.map +1 -0
- package/dist/cli/help/content.d.ts +35 -0
- package/dist/cli/help/content.d.ts.map +1 -0
- package/dist/cli/help/content.js +312 -0
- package/dist/cli/help/content.js.map +1 -0
- package/dist/cli/index.d.ts +5 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +85 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/introspection.d.ts +87 -0
- package/dist/cli/introspection.d.ts.map +1 -0
- package/dist/cli/introspection.js +127 -0
- package/dist/cli/introspection.js.map +1 -0
- package/dist/cli/output.d.ts +56 -0
- package/dist/cli/output.d.ts.map +1 -0
- package/dist/cli/output.js +467 -0
- package/dist/cli/output.js.map +1 -0
- package/dist/cli/suggest.d.ts +16 -0
- package/dist/cli/suggest.d.ts.map +1 -0
- package/dist/cli/suggest.js +72 -0
- package/dist/cli/suggest.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -0
- package/dist/parser/alignment.d.ts +113 -0
- package/dist/parser/alignment.d.ts.map +1 -0
- package/dist/parser/alignment.js +261 -0
- package/dist/parser/alignment.js.map +1 -0
- package/dist/parser/assess.d.ts +81 -0
- package/dist/parser/assess.d.ts.map +1 -0
- package/dist/parser/assess.js +197 -0
- package/dist/parser/assess.js.map +1 -0
- package/dist/parser/convention-validation.d.ts +48 -0
- package/dist/parser/convention-validation.d.ts.map +1 -0
- package/dist/parser/convention-validation.js +167 -0
- package/dist/parser/convention-validation.js.map +1 -0
- package/dist/parser/fix.d.ts +38 -0
- package/dist/parser/fix.d.ts.map +1 -0
- package/dist/parser/fix.js +185 -0
- package/dist/parser/fix.js.map +1 -0
- package/dist/parser/index.d.ts +12 -0
- package/dist/parser/index.d.ts.map +1 -0
- package/dist/parser/index.js +13 -0
- package/dist/parser/index.js.map +1 -0
- package/dist/parser/items.d.ts +138 -0
- package/dist/parser/items.d.ts.map +1 -0
- package/dist/parser/items.js +321 -0
- package/dist/parser/items.js.map +1 -0
- package/dist/parser/meta.d.ts +120 -0
- package/dist/parser/meta.d.ts.map +1 -0
- package/dist/parser/meta.js +441 -0
- package/dist/parser/meta.js.map +1 -0
- package/dist/parser/refs.d.ts +185 -0
- package/dist/parser/refs.d.ts.map +1 -0
- package/dist/parser/refs.js +404 -0
- package/dist/parser/refs.js.map +1 -0
- package/dist/parser/shadow.d.ts +253 -0
- package/dist/parser/shadow.d.ts.map +1 -0
- package/dist/parser/shadow.js +1053 -0
- package/dist/parser/shadow.js.map +1 -0
- package/dist/parser/traits.d.ts +72 -0
- package/dist/parser/traits.d.ts.map +1 -0
- package/dist/parser/traits.js +120 -0
- package/dist/parser/traits.js.map +1 -0
- package/dist/parser/validate.d.ts +89 -0
- package/dist/parser/validate.d.ts.map +1 -0
- package/dist/parser/validate.js +817 -0
- package/dist/parser/validate.js.map +1 -0
- package/dist/parser/yaml.d.ts +326 -0
- package/dist/parser/yaml.d.ts.map +1 -0
- package/dist/parser/yaml.js +1383 -0
- package/dist/parser/yaml.js.map +1 -0
- package/dist/ralph/cli-renderer.d.ts +20 -0
- package/dist/ralph/cli-renderer.d.ts.map +1 -0
- package/dist/ralph/cli-renderer.js +179 -0
- package/dist/ralph/cli-renderer.js.map +1 -0
- package/dist/ralph/events.d.ts +65 -0
- package/dist/ralph/events.d.ts.map +1 -0
- package/dist/ralph/events.js +397 -0
- package/dist/ralph/events.js.map +1 -0
- package/dist/ralph/index.d.ts +8 -0
- package/dist/ralph/index.d.ts.map +1 -0
- package/dist/ralph/index.js +10 -0
- package/dist/ralph/index.js.map +1 -0
- package/dist/schema/common.d.ts +46 -0
- package/dist/schema/common.d.ts.map +1 -0
- package/dist/schema/common.js +71 -0
- package/dist/schema/common.js.map +1 -0
- package/dist/schema/inbox.d.ts +90 -0
- package/dist/schema/inbox.d.ts.map +1 -0
- package/dist/schema/inbox.js +30 -0
- package/dist/schema/inbox.js.map +1 -0
- package/dist/schema/index.d.ts +6 -0
- package/dist/schema/index.d.ts.map +1 -0
- package/dist/schema/index.js +7 -0
- package/dist/schema/index.js.map +1 -0
- package/dist/schema/meta.d.ts +762 -0
- package/dist/schema/meta.d.ts.map +1 -0
- package/dist/schema/meta.js +144 -0
- package/dist/schema/meta.js.map +1 -0
- package/dist/schema/spec.d.ts +912 -0
- package/dist/schema/spec.d.ts.map +1 -0
- package/dist/schema/spec.js +104 -0
- package/dist/schema/spec.js.map +1 -0
- package/dist/schema/task.d.ts +664 -0
- package/dist/schema/task.d.ts.map +1 -0
- package/dist/schema/task.js +130 -0
- package/dist/schema/task.js.map +1 -0
- package/dist/sessions/index.d.ts +11 -0
- package/dist/sessions/index.d.ts.map +1 -0
- package/dist/sessions/index.js +13 -0
- package/dist/sessions/index.js.map +1 -0
- package/dist/sessions/store.d.ts +144 -0
- package/dist/sessions/store.d.ts.map +1 -0
- package/dist/sessions/store.js +325 -0
- package/dist/sessions/store.js.map +1 -0
- package/dist/sessions/types.d.ts +157 -0
- package/dist/sessions/types.d.ts.map +1 -0
- package/dist/sessions/types.js +90 -0
- package/dist/sessions/types.js.map +1 -0
- package/dist/strings/errors.d.ts +420 -0
- package/dist/strings/errors.d.ts.map +1 -0
- package/dist/strings/errors.js +282 -0
- package/dist/strings/errors.js.map +1 -0
- package/dist/strings/guidance.d.ts +65 -0
- package/dist/strings/guidance.d.ts.map +1 -0
- package/dist/strings/guidance.js +66 -0
- package/dist/strings/guidance.js.map +1 -0
- package/dist/strings/index.d.ts +12 -0
- package/dist/strings/index.d.ts.map +1 -0
- package/dist/strings/index.js +12 -0
- package/dist/strings/index.js.map +1 -0
- package/dist/strings/labels.d.ts +74 -0
- package/dist/strings/labels.d.ts.map +1 -0
- package/dist/strings/labels.js +75 -0
- package/dist/strings/labels.js.map +1 -0
- package/dist/strings/validation.d.ts +126 -0
- package/dist/strings/validation.d.ts.map +1 -0
- package/dist/strings/validation.js +135 -0
- package/dist/strings/validation.js.map +1 -0
- package/dist/utils/commit.d.ts +23 -0
- package/dist/utils/commit.d.ts.map +1 -0
- package/dist/utils/commit.js +67 -0
- package/dist/utils/commit.js.map +1 -0
- package/dist/utils/git.d.ts +57 -0
- package/dist/utils/git.d.ts.map +1 -0
- package/dist/utils/git.js +192 -0
- package/dist/utils/git.js.map +1 -0
- package/dist/utils/grep.d.ts +28 -0
- package/dist/utils/grep.d.ts.map +1 -0
- package/dist/utils/grep.js +86 -0
- package/dist/utils/grep.js.map +1 -0
- package/dist/utils/index.d.ts +8 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +6 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/time.d.ts +18 -0
- package/dist/utils/time.d.ts.map +1 -0
- package/dist/utils/time.js +61 -0
- package/dist/utils/time.js.map +1 -0
- package/package.json +62 -0
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Validation warning and status messages
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Alignment validation messages
|
|
6
|
+
*/
|
|
7
|
+
export declare const alignment: {
|
|
8
|
+
readonly ok: string;
|
|
9
|
+
readonly warnings: (count: number) => string;
|
|
10
|
+
readonly orphanedSpecs: {
|
|
11
|
+
readonly header: string;
|
|
12
|
+
readonly item: (ref: string, title: string) => string;
|
|
13
|
+
readonly truncated: (remaining: number) => string;
|
|
14
|
+
};
|
|
15
|
+
readonly statusMismatches: {
|
|
16
|
+
readonly header: string;
|
|
17
|
+
readonly item: (ref: string, title: string, taskStatus: string, specImpl: string) => string;
|
|
18
|
+
};
|
|
19
|
+
readonly staleImplementation: {
|
|
20
|
+
readonly header: string;
|
|
21
|
+
readonly item: (ref: string, title: string) => string;
|
|
22
|
+
};
|
|
23
|
+
readonly noFixes: string;
|
|
24
|
+
readonly fixesApplied: (count: number, files: number) => string;
|
|
25
|
+
};
|
|
26
|
+
/**
|
|
27
|
+
* Shadow branch status messages
|
|
28
|
+
*/
|
|
29
|
+
export declare const shadowBranch: {
|
|
30
|
+
readonly header: string;
|
|
31
|
+
readonly healthy: string;
|
|
32
|
+
readonly notInitialized: {
|
|
33
|
+
readonly status: string;
|
|
34
|
+
readonly hint: string;
|
|
35
|
+
};
|
|
36
|
+
readonly hasIssues: {
|
|
37
|
+
readonly status: string;
|
|
38
|
+
readonly repair: string;
|
|
39
|
+
readonly reinitialize: string;
|
|
40
|
+
};
|
|
41
|
+
};
|
|
42
|
+
/**
|
|
43
|
+
* General validation messages
|
|
44
|
+
*/
|
|
45
|
+
export declare const validation: {
|
|
46
|
+
readonly noManifest: "No kspec manifest found";
|
|
47
|
+
readonly initHint: "Run `kspec init` to create a new project";
|
|
48
|
+
readonly failed: "Validation failed";
|
|
49
|
+
readonly lintFailed: "Lint failed";
|
|
50
|
+
readonly revalidating: string;
|
|
51
|
+
readonly nowPasses: string;
|
|
52
|
+
readonly issuesRemain: string;
|
|
53
|
+
readonly alignmentStats: (specsWithTasks: number, totalSpecs: number, aligned: number) => string;
|
|
54
|
+
};
|
|
55
|
+
/**
|
|
56
|
+
* Shadow command messages
|
|
57
|
+
*/
|
|
58
|
+
export declare const shadowCommands: {
|
|
59
|
+
readonly notGitRepo: "Not a git repository";
|
|
60
|
+
readonly statusFailed: "Failed to get shadow status";
|
|
61
|
+
readonly repair: {
|
|
62
|
+
readonly alreadyHealthy: "Shadow branch is already healthy, nothing to repair";
|
|
63
|
+
readonly branchNotExist: "Shadow branch does not exist";
|
|
64
|
+
readonly initHint: string;
|
|
65
|
+
readonly repairing: "Repairing shadow branch worktree...";
|
|
66
|
+
readonly stillHealthy: "Shadow branch is already healthy";
|
|
67
|
+
readonly repaired: "Shadow branch repaired";
|
|
68
|
+
readonly worktreeCreated: (dir: string) => string;
|
|
69
|
+
readonly failed: (error: string) => string;
|
|
70
|
+
readonly commandFailed: "Failed to repair shadow branch";
|
|
71
|
+
};
|
|
72
|
+
readonly log: {
|
|
73
|
+
readonly branchNotExist: "Shadow branch does not exist";
|
|
74
|
+
readonly initHint: string;
|
|
75
|
+
readonly hasIssues: "Shadow branch has issues";
|
|
76
|
+
readonly repairHint: string;
|
|
77
|
+
readonly noCommits: "No commits in shadow branch";
|
|
78
|
+
readonly failed: "Failed to get shadow log";
|
|
79
|
+
};
|
|
80
|
+
readonly resolve: {
|
|
81
|
+
readonly notHealthy: "Shadow branch not healthy";
|
|
82
|
+
readonly repairHint: string;
|
|
83
|
+
readonly acceptingRemote: "Accepting remote changes...";
|
|
84
|
+
readonly acceptedRemote: "Resolved: accepted all remote changes";
|
|
85
|
+
readonly keepingLocal: "Keeping local changes...";
|
|
86
|
+
readonly keptLocal: "Resolved: kept local changes and pushed to remote";
|
|
87
|
+
readonly pushFailed: "Could not push local changes to remote";
|
|
88
|
+
readonly localPreserved: string;
|
|
89
|
+
readonly failed: "Failed to resolve conflicts";
|
|
90
|
+
readonly interactive: {
|
|
91
|
+
readonly header: string;
|
|
92
|
+
readonly separator: string;
|
|
93
|
+
readonly rebaseInProgress: string;
|
|
94
|
+
readonly options: "Options:";
|
|
95
|
+
readonly theirs: {
|
|
96
|
+
readonly command: string;
|
|
97
|
+
readonly description: string;
|
|
98
|
+
};
|
|
99
|
+
readonly ours: {
|
|
100
|
+
readonly command: string;
|
|
101
|
+
readonly description: string;
|
|
102
|
+
};
|
|
103
|
+
readonly manual: {
|
|
104
|
+
readonly header: string;
|
|
105
|
+
readonly cdCommand: (dir: string) => string;
|
|
106
|
+
readonly rebaseSteps: readonly [string, string, string];
|
|
107
|
+
readonly pullSteps: readonly [string, string, string];
|
|
108
|
+
};
|
|
109
|
+
};
|
|
110
|
+
};
|
|
111
|
+
readonly sync: {
|
|
112
|
+
readonly notHealthy: "Shadow branch not healthy";
|
|
113
|
+
readonly repairHint: string;
|
|
114
|
+
readonly noRemote: "No remote tracking configured for shadow branch";
|
|
115
|
+
readonly localOnly: string;
|
|
116
|
+
readonly syncing: "Syncing shadow branch...";
|
|
117
|
+
readonly conflictDetected: "Sync conflict detected";
|
|
118
|
+
readonly resolveHint: string;
|
|
119
|
+
readonly syncedBoth: "Shadow branch synced (pulled and pushed)";
|
|
120
|
+
readonly syncedPull: "Shadow branch synced (pulled, nothing to push)";
|
|
121
|
+
readonly syncedPush: "Shadow branch synced (pushed, nothing to pull)";
|
|
122
|
+
readonly alreadyInSync: "Shadow branch already in sync";
|
|
123
|
+
readonly failed: "Failed to sync shadow branch";
|
|
124
|
+
};
|
|
125
|
+
};
|
|
126
|
+
//# sourceMappingURL=validation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/strings/validation.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH;;GAEG;AACH,eAAO,MAAM,SAAS;;+BAEF,MAAM;;;6BAIV,MAAM,SAAS,MAAM;wCACV,MAAM;;;;6BAMjB,MAAM,SAAS,MAAM,cAAc,MAAM,YAAY,MAAM;;;;6BAM3D,MAAM,SAAS,MAAM;;;mCAIb,MAAM,SAAS,MAAM;CAEnC,CAAC;AAEX;;GAEG;AACH,eAAO,MAAM,YAAY;;;;;;;;;;;;CAef,CAAC;AAEX;;GAEG;AACH,eAAO,MAAM,UAAU;;;;;;;;8CAUY,MAAM,cAAc,MAAM,WAAW,MAAM;CAIpE,CAAC;AAEX;;GAEG;AACH,eAAO,MAAM,cAAc;;;;;;;;;;wCAWA,MAAM;iCACb,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;0CAwCD,MAAM;;;;;;;;;;;;;;;;;;;;CA6BrB,CAAC"}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Validation warning and status messages
|
|
3
|
+
*/
|
|
4
|
+
import chalk from 'chalk';
|
|
5
|
+
/**
|
|
6
|
+
* Alignment validation messages
|
|
7
|
+
*/
|
|
8
|
+
export const alignment = {
|
|
9
|
+
ok: chalk.green('Alignment: OK'),
|
|
10
|
+
warnings: (count) => chalk.yellow(`Alignment warnings: ${count}`),
|
|
11
|
+
orphanedSpecs: {
|
|
12
|
+
header: chalk.yellow('\nOrphaned specs (no implementation status):'),
|
|
13
|
+
item: (ref, title) => ` ${ref}: ${title}`,
|
|
14
|
+
truncated: (remaining) => chalk.gray(` ... and ${remaining} more (use --verbose to see all)`),
|
|
15
|
+
},
|
|
16
|
+
statusMismatches: {
|
|
17
|
+
header: chalk.yellow('\nStatus mismatches (task status != spec implementation):'),
|
|
18
|
+
item: (ref, title, taskStatus, specImpl) => ` ${ref}: ${title} (task=${taskStatus}, spec=${specImpl})`,
|
|
19
|
+
},
|
|
20
|
+
staleImplementation: {
|
|
21
|
+
header: chalk.yellow('\nStale implementation status (task completed but spec not implemented):'),
|
|
22
|
+
item: (ref, title) => ` ${ref}: ${title}`,
|
|
23
|
+
},
|
|
24
|
+
noFixes: chalk.gray('No auto-fixable issues found.'),
|
|
25
|
+
fixesApplied: (count, files) => chalk.cyan(`✓ Applied ${count} fix(es) to ${files} file(s):`),
|
|
26
|
+
};
|
|
27
|
+
/**
|
|
28
|
+
* Shadow branch status messages
|
|
29
|
+
*/
|
|
30
|
+
export const shadowBranch = {
|
|
31
|
+
header: chalk.bold('Shadow Branch Status'),
|
|
32
|
+
healthy: chalk.green.bold('✓ Shadow branch is healthy'),
|
|
33
|
+
notInitialized: {
|
|
34
|
+
status: chalk.yellow('○ Shadow branch not initialized'),
|
|
35
|
+
hint: chalk.gray('Run `kspec init` to set up shadow branch'),
|
|
36
|
+
},
|
|
37
|
+
hasIssues: {
|
|
38
|
+
status: chalk.red.bold('✗ Shadow branch has issues'),
|
|
39
|
+
repair: chalk.gray('Run `kspec shadow repair` to fix issues'),
|
|
40
|
+
reinitialize: chalk.gray('Or `kspec init --force` to reinitialize'),
|
|
41
|
+
},
|
|
42
|
+
};
|
|
43
|
+
/**
|
|
44
|
+
* General validation messages
|
|
45
|
+
*/
|
|
46
|
+
export const validation = {
|
|
47
|
+
noManifest: 'No kspec manifest found',
|
|
48
|
+
initHint: 'Run `kspec init` to create a new project',
|
|
49
|
+
failed: 'Validation failed',
|
|
50
|
+
lintFailed: 'Lint failed',
|
|
51
|
+
revalidating: chalk.gray('\nRe-validating after fixes...'),
|
|
52
|
+
nowPasses: chalk.green.bold('✓ Validation now passes'),
|
|
53
|
+
issuesRemain: chalk.yellow('Some issues remain after auto-fix'),
|
|
54
|
+
alignmentStats: (specsWithTasks, totalSpecs, aligned) => chalk.gray(`\nAlignment stats: ${specsWithTasks}/${totalSpecs} specs have tasks, ${aligned} aligned`),
|
|
55
|
+
};
|
|
56
|
+
/**
|
|
57
|
+
* Shadow command messages
|
|
58
|
+
*/
|
|
59
|
+
export const shadowCommands = {
|
|
60
|
+
notGitRepo: 'Not a git repository',
|
|
61
|
+
statusFailed: 'Failed to get shadow status',
|
|
62
|
+
repair: {
|
|
63
|
+
alreadyHealthy: 'Shadow branch is already healthy, nothing to repair',
|
|
64
|
+
branchNotExist: 'Shadow branch does not exist',
|
|
65
|
+
initHint: chalk.gray('Run `kspec init` to create a new shadow branch'),
|
|
66
|
+
repairing: 'Repairing shadow branch worktree...',
|
|
67
|
+
stillHealthy: 'Shadow branch is already healthy',
|
|
68
|
+
repaired: 'Shadow branch repaired',
|
|
69
|
+
worktreeCreated: (dir) => chalk.green(` ✓ Recreated worktree: ${dir}/`),
|
|
70
|
+
failed: (error) => `Repair failed: ${error}`,
|
|
71
|
+
commandFailed: 'Failed to repair shadow branch',
|
|
72
|
+
},
|
|
73
|
+
log: {
|
|
74
|
+
branchNotExist: 'Shadow branch does not exist',
|
|
75
|
+
initHint: chalk.gray('Run `kspec init` to set up shadow branch'),
|
|
76
|
+
hasIssues: 'Shadow branch has issues',
|
|
77
|
+
repairHint: chalk.gray('Run `kspec shadow repair` to fix'),
|
|
78
|
+
noCommits: 'No commits in shadow branch',
|
|
79
|
+
failed: 'Failed to get shadow log',
|
|
80
|
+
},
|
|
81
|
+
resolve: {
|
|
82
|
+
notHealthy: 'Shadow branch not healthy',
|
|
83
|
+
repairHint: chalk.gray('Run `kspec shadow repair` first'),
|
|
84
|
+
acceptingRemote: 'Accepting remote changes...',
|
|
85
|
+
acceptedRemote: 'Resolved: accepted all remote changes',
|
|
86
|
+
keepingLocal: 'Keeping local changes...',
|
|
87
|
+
keptLocal: 'Resolved: kept local changes and pushed to remote',
|
|
88
|
+
pushFailed: 'Could not push local changes to remote',
|
|
89
|
+
localPreserved: chalk.gray('Local changes are preserved, but remote may differ'),
|
|
90
|
+
failed: 'Failed to resolve conflicts',
|
|
91
|
+
interactive: {
|
|
92
|
+
header: chalk.bold('Shadow Branch Conflict Resolution'),
|
|
93
|
+
separator: chalk.gray('─'.repeat(40)),
|
|
94
|
+
rebaseInProgress: chalk.yellow('A rebase is currently in progress.'),
|
|
95
|
+
options: 'Options:',
|
|
96
|
+
theirs: {
|
|
97
|
+
command: chalk.cyan(' kspec shadow resolve --theirs'),
|
|
98
|
+
description: chalk.gray(' Accept all remote changes, discard local uncommitted work'),
|
|
99
|
+
},
|
|
100
|
+
ours: {
|
|
101
|
+
command: chalk.cyan(' kspec shadow resolve --ours'),
|
|
102
|
+
description: chalk.gray(' Keep local changes and force-push to remote'),
|
|
103
|
+
},
|
|
104
|
+
manual: {
|
|
105
|
+
header: chalk.cyan(' Manual resolution:'),
|
|
106
|
+
cdCommand: (dir) => chalk.gray(` cd ${dir}`),
|
|
107
|
+
rebaseSteps: [
|
|
108
|
+
chalk.gray(' # Edit conflicting files'),
|
|
109
|
+
chalk.gray(' git add <resolved-files>'),
|
|
110
|
+
chalk.gray(' git rebase --continue'),
|
|
111
|
+
],
|
|
112
|
+
pullSteps: [
|
|
113
|
+
chalk.gray(' git pull --rebase'),
|
|
114
|
+
chalk.gray(' # Resolve any conflicts, then:'),
|
|
115
|
+
chalk.gray(' git push'),
|
|
116
|
+
],
|
|
117
|
+
},
|
|
118
|
+
},
|
|
119
|
+
},
|
|
120
|
+
sync: {
|
|
121
|
+
notHealthy: 'Shadow branch not healthy',
|
|
122
|
+
repairHint: chalk.gray('Run `kspec shadow repair` first'),
|
|
123
|
+
noRemote: 'No remote tracking configured for shadow branch',
|
|
124
|
+
localOnly: chalk.gray('Shadow changes are local only'),
|
|
125
|
+
syncing: 'Syncing shadow branch...',
|
|
126
|
+
conflictDetected: 'Sync conflict detected',
|
|
127
|
+
resolveHint: chalk.gray('Run `kspec shadow resolve` to fix'),
|
|
128
|
+
syncedBoth: 'Shadow branch synced (pulled and pushed)',
|
|
129
|
+
syncedPull: 'Shadow branch synced (pulled, nothing to push)',
|
|
130
|
+
syncedPush: 'Shadow branch synced (pushed, nothing to pull)',
|
|
131
|
+
alreadyInSync: 'Shadow branch already in sync',
|
|
132
|
+
failed: 'Failed to sync shadow branch',
|
|
133
|
+
},
|
|
134
|
+
};
|
|
135
|
+
//# sourceMappingURL=validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/strings/validation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Commit message formatting utilities
|
|
3
|
+
*/
|
|
4
|
+
import type { Task } from '../schema/index.js';
|
|
5
|
+
export interface CommitGuidance {
|
|
6
|
+
/** Suggested commit message subject line */
|
|
7
|
+
message: string;
|
|
8
|
+
/** Trailers to append (e.g., Task: @slug, Spec: @ref) */
|
|
9
|
+
trailers: string[];
|
|
10
|
+
/** Whether spec gap warning should be shown */
|
|
11
|
+
hasSpecGap: boolean;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Generate commit guidance for a task
|
|
15
|
+
*/
|
|
16
|
+
export declare function formatCommitGuidance(task: Task, options?: {
|
|
17
|
+
wip?: boolean;
|
|
18
|
+
}): CommitGuidance;
|
|
19
|
+
/**
|
|
20
|
+
* Output commit guidance to console
|
|
21
|
+
*/
|
|
22
|
+
export declare function printCommitGuidance(guidance: CommitGuidance): void;
|
|
23
|
+
//# sourceMappingURL=commit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commit.d.ts","sourceRoot":"","sources":["../../src/utils/commit.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAE/C,MAAM,WAAW,cAAc;IAC7B,4CAA4C;IAC5C,OAAO,EAAE,MAAM,CAAC;IAChB,yDAAyD;IACzD,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,+CAA+C;IAC/C,UAAU,EAAE,OAAO,CAAC;CACrB;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,IAAI,EACV,OAAO,GAAE;IAAE,GAAG,CAAC,EAAE,OAAO,CAAA;CAAO,GAC9B,cAAc,CAoBhB;AAsBD;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,cAAc,GAAG,IAAI,CAelE"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Commit message formatting utilities
|
|
3
|
+
*/
|
|
4
|
+
import chalk from 'chalk';
|
|
5
|
+
/**
|
|
6
|
+
* Generate commit guidance for a task
|
|
7
|
+
*/
|
|
8
|
+
export function formatCommitGuidance(task, options = {}) {
|
|
9
|
+
const prefix = options.wip ? 'wip' : inferCommitType(task);
|
|
10
|
+
// Remove "Implement: " prefix if present (from derive command)
|
|
11
|
+
const subject = task.title.replace(/^Implement:\s*/i, '');
|
|
12
|
+
const trailers = [];
|
|
13
|
+
const taskRef = task.slugs[0] ? `@${task.slugs[0]}` : `@${task._ulid.slice(0, 8)}`;
|
|
14
|
+
trailers.push(`Task: ${taskRef}`);
|
|
15
|
+
if (task.spec_ref) {
|
|
16
|
+
trailers.push(`Spec: ${task.spec_ref}`);
|
|
17
|
+
}
|
|
18
|
+
const message = `${prefix}: ${subject}`;
|
|
19
|
+
return {
|
|
20
|
+
message,
|
|
21
|
+
trailers,
|
|
22
|
+
hasSpecGap: !task.spec_ref,
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Infer conventional commit type from task metadata
|
|
27
|
+
*/
|
|
28
|
+
function inferCommitType(task) {
|
|
29
|
+
// Check task type first
|
|
30
|
+
if (task.type === 'bug')
|
|
31
|
+
return 'fix';
|
|
32
|
+
if (task.type === 'infra')
|
|
33
|
+
return 'chore';
|
|
34
|
+
// Check tags
|
|
35
|
+
const tags = task.tags.map((t) => t.toLowerCase());
|
|
36
|
+
if (tags.includes('docs') || tags.includes('documentation'))
|
|
37
|
+
return 'docs';
|
|
38
|
+
if (tags.includes('test') || tags.includes('testing'))
|
|
39
|
+
return 'test';
|
|
40
|
+
if (tags.includes('refactor'))
|
|
41
|
+
return 'refactor';
|
|
42
|
+
if (tags.includes('perf') || tags.includes('performance'))
|
|
43
|
+
return 'perf';
|
|
44
|
+
if (tags.includes('chore'))
|
|
45
|
+
return 'chore';
|
|
46
|
+
// Default to feat for features and other tasks
|
|
47
|
+
return 'feat';
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Output commit guidance to console
|
|
51
|
+
*/
|
|
52
|
+
export function printCommitGuidance(guidance) {
|
|
53
|
+
console.log('');
|
|
54
|
+
console.log(chalk.gray('--- Suggested Commit ---'));
|
|
55
|
+
console.log(chalk.cyan(guidance.message));
|
|
56
|
+
console.log('');
|
|
57
|
+
for (const trailer of guidance.trailers) {
|
|
58
|
+
console.log(chalk.gray(trailer));
|
|
59
|
+
}
|
|
60
|
+
if (guidance.hasSpecGap) {
|
|
61
|
+
console.log('');
|
|
62
|
+
console.log(chalk.yellow('This task has no spec_ref.'));
|
|
63
|
+
console.log(chalk.gray('Is this a spec gap? Consider: kspec item add --under @parent ...'));
|
|
64
|
+
console.log(chalk.gray('Or is this intentional (infra/cleanup)?'));
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=commit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commit.js","sourceRoot":"","sources":["../../src/utils/commit.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Git integration utilities
|
|
3
|
+
*/
|
|
4
|
+
export interface GitCommit {
|
|
5
|
+
hash: string;
|
|
6
|
+
fullHash: string;
|
|
7
|
+
date: Date;
|
|
8
|
+
message: string;
|
|
9
|
+
author: string;
|
|
10
|
+
}
|
|
11
|
+
export interface GitFileStatus {
|
|
12
|
+
path: string;
|
|
13
|
+
status: 'modified' | 'added' | 'deleted' | 'renamed' | 'untracked';
|
|
14
|
+
staged: boolean;
|
|
15
|
+
}
|
|
16
|
+
export interface GitWorkingTree {
|
|
17
|
+
clean: boolean;
|
|
18
|
+
staged: GitFileStatus[];
|
|
19
|
+
unstaged: GitFileStatus[];
|
|
20
|
+
untracked: string[];
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Check if current directory is in a git repository
|
|
24
|
+
*/
|
|
25
|
+
export declare function isGitRepo(cwd?: string): boolean;
|
|
26
|
+
/**
|
|
27
|
+
* Get the current git branch name
|
|
28
|
+
*/
|
|
29
|
+
export declare function getCurrentBranch(cwd?: string): string | null;
|
|
30
|
+
/**
|
|
31
|
+
* Get recent git commits
|
|
32
|
+
*
|
|
33
|
+
* @param options.limit Number of commits to return
|
|
34
|
+
* @param options.since Only commits after this date
|
|
35
|
+
* @param options.cwd Working directory
|
|
36
|
+
*/
|
|
37
|
+
export declare function getRecentCommits(options: {
|
|
38
|
+
limit?: number;
|
|
39
|
+
since?: Date;
|
|
40
|
+
cwd?: string;
|
|
41
|
+
}): GitCommit[];
|
|
42
|
+
/**
|
|
43
|
+
* Get the working tree status (staged, unstaged, untracked files)
|
|
44
|
+
*/
|
|
45
|
+
export declare function getWorkingTreeStatus(cwd?: string): GitWorkingTree;
|
|
46
|
+
/**
|
|
47
|
+
* Get git diff since a specific timestamp
|
|
48
|
+
*
|
|
49
|
+
* Returns unified diff output showing all changes made after the given timestamp.
|
|
50
|
+
* Includes both committed changes and working tree changes.
|
|
51
|
+
*
|
|
52
|
+
* @param since - Date to get changes since
|
|
53
|
+
* @param cwd - Working directory
|
|
54
|
+
* @returns Diff output as string, or null if no changes or error
|
|
55
|
+
*/
|
|
56
|
+
export declare function getDiffSince(since: Date, cwd?: string): string | null;
|
|
57
|
+
//# sourceMappingURL=git.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../../src/utils/git.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,IAAI,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,UAAU,GAAG,OAAO,GAAG,SAAS,GAAG,SAAS,GAAG,WAAW,CAAC;IACnE,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,aAAa,EAAE,CAAC;IACxB,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAW/C;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAY5D;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE;IACxC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,IAAI,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;CACd,GAAG,SAAS,EAAE,CAiCd;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,cAAc,CA0DjE;AAED;;;;;;;;;GASG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CA6CrE"}
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Git integration utilities
|
|
3
|
+
*/
|
|
4
|
+
import { execSync } from 'node:child_process';
|
|
5
|
+
/**
|
|
6
|
+
* Check if current directory is in a git repository
|
|
7
|
+
*/
|
|
8
|
+
export function isGitRepo(cwd) {
|
|
9
|
+
try {
|
|
10
|
+
execSync('git rev-parse --git-dir', {
|
|
11
|
+
cwd,
|
|
12
|
+
encoding: 'utf-8',
|
|
13
|
+
stdio: ['pipe', 'pipe', 'ignore'],
|
|
14
|
+
});
|
|
15
|
+
return true;
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
return false;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Get the current git branch name
|
|
23
|
+
*/
|
|
24
|
+
export function getCurrentBranch(cwd) {
|
|
25
|
+
try {
|
|
26
|
+
return (execSync('git branch --show-current', {
|
|
27
|
+
cwd,
|
|
28
|
+
encoding: 'utf-8',
|
|
29
|
+
stdio: ['pipe', 'pipe', 'ignore'],
|
|
30
|
+
}).trim() || null);
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
return null;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Get recent git commits
|
|
38
|
+
*
|
|
39
|
+
* @param options.limit Number of commits to return
|
|
40
|
+
* @param options.since Only commits after this date
|
|
41
|
+
* @param options.cwd Working directory
|
|
42
|
+
*/
|
|
43
|
+
export function getRecentCommits(options) {
|
|
44
|
+
const { limit = 10, since, cwd } = options;
|
|
45
|
+
try {
|
|
46
|
+
// Format: hash|ISO date|subject|author name
|
|
47
|
+
// Using %aI for ISO 8601 author date
|
|
48
|
+
let cmd = `git log --format="%H|%aI|%s|%an" -n ${limit}`;
|
|
49
|
+
if (since) {
|
|
50
|
+
cmd += ` --since="${since.toISOString()}"`;
|
|
51
|
+
}
|
|
52
|
+
const output = execSync(cmd, {
|
|
53
|
+
cwd,
|
|
54
|
+
encoding: 'utf-8',
|
|
55
|
+
stdio: ['pipe', 'pipe', 'ignore'],
|
|
56
|
+
}).trim();
|
|
57
|
+
if (!output)
|
|
58
|
+
return [];
|
|
59
|
+
return output.split('\n').map((line) => {
|
|
60
|
+
const [fullHash, dateStr, message, author] = line.split('|');
|
|
61
|
+
return {
|
|
62
|
+
hash: fullHash.slice(0, 7),
|
|
63
|
+
fullHash,
|
|
64
|
+
date: new Date(dateStr),
|
|
65
|
+
message,
|
|
66
|
+
author,
|
|
67
|
+
};
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
return [];
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Get the working tree status (staged, unstaged, untracked files)
|
|
76
|
+
*/
|
|
77
|
+
export function getWorkingTreeStatus(cwd) {
|
|
78
|
+
const result = {
|
|
79
|
+
clean: true,
|
|
80
|
+
staged: [],
|
|
81
|
+
unstaged: [],
|
|
82
|
+
untracked: [],
|
|
83
|
+
};
|
|
84
|
+
try {
|
|
85
|
+
const output = execSync('git status --porcelain', {
|
|
86
|
+
cwd,
|
|
87
|
+
encoding: 'utf-8',
|
|
88
|
+
stdio: ['pipe', 'pipe', 'ignore'],
|
|
89
|
+
}).trim();
|
|
90
|
+
if (!output) {
|
|
91
|
+
return result;
|
|
92
|
+
}
|
|
93
|
+
result.clean = false;
|
|
94
|
+
for (const line of output.split('\n')) {
|
|
95
|
+
if (!line)
|
|
96
|
+
continue;
|
|
97
|
+
const indexStatus = line[0];
|
|
98
|
+
const workTreeStatus = line[1];
|
|
99
|
+
// Path starts after status codes - trim to normalize
|
|
100
|
+
const path = line.slice(2).trim();
|
|
101
|
+
// Untracked files
|
|
102
|
+
if (indexStatus === '?' && workTreeStatus === '?') {
|
|
103
|
+
result.untracked.push(path);
|
|
104
|
+
continue;
|
|
105
|
+
}
|
|
106
|
+
// Staged changes (index has changes)
|
|
107
|
+
if (indexStatus !== ' ' && indexStatus !== '?') {
|
|
108
|
+
result.staged.push({
|
|
109
|
+
path,
|
|
110
|
+
status: parseStatusCode(indexStatus),
|
|
111
|
+
staged: true,
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
// Unstaged changes (work tree has changes)
|
|
115
|
+
if (workTreeStatus !== ' ' && workTreeStatus !== '?') {
|
|
116
|
+
result.unstaged.push({
|
|
117
|
+
path,
|
|
118
|
+
status: parseStatusCode(workTreeStatus),
|
|
119
|
+
staged: false,
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
return result;
|
|
124
|
+
}
|
|
125
|
+
catch {
|
|
126
|
+
return result;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Get git diff since a specific timestamp
|
|
131
|
+
*
|
|
132
|
+
* Returns unified diff output showing all changes made after the given timestamp.
|
|
133
|
+
* Includes both committed changes and working tree changes.
|
|
134
|
+
*
|
|
135
|
+
* @param since - Date to get changes since
|
|
136
|
+
* @param cwd - Working directory
|
|
137
|
+
* @returns Diff output as string, or null if no changes or error
|
|
138
|
+
*/
|
|
139
|
+
export function getDiffSince(since, cwd) {
|
|
140
|
+
try {
|
|
141
|
+
// Get the commit hash at the given time
|
|
142
|
+
const sinceCommit = execSync(`git log --format="%H" --before="${since.toISOString()}" -n 1`, {
|
|
143
|
+
cwd,
|
|
144
|
+
encoding: 'utf-8',
|
|
145
|
+
stdio: ['pipe', 'pipe', 'ignore'],
|
|
146
|
+
}).trim();
|
|
147
|
+
if (!sinceCommit) {
|
|
148
|
+
// No commit before this time, diff from the beginning
|
|
149
|
+
// Using Git's magic empty tree hash - this is the hash of an empty tree object
|
|
150
|
+
// that exists conceptually in every Git repo (commonly used for initial diffs)
|
|
151
|
+
const diff = execSync('git diff 4b825dc642cb6eb9a060e54bf8d69288fbee4904..HEAD', {
|
|
152
|
+
cwd,
|
|
153
|
+
encoding: 'utf-8',
|
|
154
|
+
stdio: ['pipe', 'pipe', 'ignore'],
|
|
155
|
+
}).trim();
|
|
156
|
+
return diff || null;
|
|
157
|
+
}
|
|
158
|
+
// Get diff from that commit to HEAD (includes committed changes)
|
|
159
|
+
const committedDiff = execSync(`git diff ${sinceCommit}..HEAD`, {
|
|
160
|
+
cwd,
|
|
161
|
+
encoding: 'utf-8',
|
|
162
|
+
stdio: ['pipe', 'pipe', 'ignore'],
|
|
163
|
+
}).trim();
|
|
164
|
+
// Get diff for working tree changes (uncommitted)
|
|
165
|
+
const workingTreeDiff = execSync('git diff HEAD', {
|
|
166
|
+
cwd,
|
|
167
|
+
encoding: 'utf-8',
|
|
168
|
+
stdio: ['pipe', 'pipe', 'ignore'],
|
|
169
|
+
}).trim();
|
|
170
|
+
// Combine both diffs
|
|
171
|
+
const combined = [committedDiff, workingTreeDiff].filter(Boolean).join('\n\n');
|
|
172
|
+
return combined || null;
|
|
173
|
+
}
|
|
174
|
+
catch {
|
|
175
|
+
return null;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
function parseStatusCode(code) {
|
|
179
|
+
switch (code) {
|
|
180
|
+
case 'M':
|
|
181
|
+
return 'modified';
|
|
182
|
+
case 'A':
|
|
183
|
+
return 'added';
|
|
184
|
+
case 'D':
|
|
185
|
+
return 'deleted';
|
|
186
|
+
case 'R':
|
|
187
|
+
return 'renamed';
|
|
188
|
+
default:
|
|
189
|
+
return 'modified';
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
//# sourceMappingURL=git.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/utils/git.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAuB9C;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,GAAY;IACpC,IAAI,CAAC;QACH,QAAQ,CAAC,yBAAyB,EAAE;YAClC,GAAG;YACH,QAAQ,EAAE,OAAO;YACjB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC;SAClC,CAAC,CAAC;QACH,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,GAAY;IAC3C,IAAI,CAAC;QACH,OAAO,CACL,QAAQ,CAAC,2BAA2B,EAAE;YACpC,GAAG;YACH,QAAQ,EAAE,OAAO;YACjB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC;SAClC,CAAC,CAAC,IAAI,EAAE,IAAI,IAAI,CAClB,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAIhC;IACC,MAAM,EAAE,KAAK,GAAG,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC;IAE3C,IAAI,CAAC;QACH,4CAA4C;QAC5C,qCAAqC;QACrC,IAAI,GAAG,GAAG,uCAAuC,KAAK,EAAE,CAAC;QAEzD,IAAI,KAAK,EAAE,CAAC;YACV,GAAG,IAAI,aAAa,KAAK,CAAC,WAAW,EAAE,GAAG,CAAC;QAC7C,CAAC;QAED,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,EAAE;YAC3B,GAAG;YACH,QAAQ,EAAE,OAAO;YACjB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC;SAClC,CAAC,CAAC,IAAI,EAAE,CAAC;QAEV,IAAI,CAAC,MAAM;YAAE,OAAO,EAAE,CAAC;QAEvB,OAAO,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;YACrC,MAAM,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC7D,OAAO;gBACL,IAAI,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;gBAC1B,QAAQ;gBACR,IAAI,EAAE,IAAI,IAAI,CAAC,OAAO,CAAC;gBACvB,OAAO;gBACP,MAAM;aACP,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,GAAY;IAC/C,MAAM,MAAM,GAAmB;QAC7B,KAAK,EAAE,IAAI;QACX,MAAM,EAAE,EAAE;QACV,QAAQ,EAAE,EAAE;QACZ,SAAS,EAAE,EAAE;KACd,CAAC;IAEF,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,QAAQ,CAAC,wBAAwB,EAAE;YAChD,GAAG;YACH,QAAQ,EAAE,OAAO;YACjB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC;SAClC,CAAC,CAAC,IAAI,EAAE,CAAC;QAEV,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC;QAErB,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YACtC,IAAI,CAAC,IAAI;gBAAE,SAAS;YAEpB,MAAM,WAAW,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;YAC5B,MAAM,cAAc,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;YAC/B,qDAAqD;YACrD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAElC,kBAAkB;YAClB,IAAI,WAAW,KAAK,GAAG,IAAI,cAAc,KAAK,GAAG,EAAE,CAAC;gBAClD,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC5B,SAAS;YACX,CAAC;YAED,qCAAqC;YACrC,IAAI,WAAW,KAAK,GAAG,IAAI,WAAW,KAAK,GAAG,EAAE,CAAC;gBAC/C,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;oBACjB,IAAI;oBACJ,MAAM,EAAE,eAAe,CAAC,WAAW,CAAC;oBACpC,MAAM,EAAE,IAAI;iBACb,CAAC,CAAC;YACL,CAAC;YAED,2CAA2C;YAC3C,IAAI,cAAc,KAAK,GAAG,IAAI,cAAc,KAAK,GAAG,EAAE,CAAC;gBACrD,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;oBACnB,IAAI;oBACJ,MAAM,EAAE,eAAe,CAAC,cAAc,CAAC;oBACvC,MAAM,EAAE,KAAK;iBACd,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,MAAM,CAAC;IAChB,CAAC;AACH,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,YAAY,CAAC,KAAW,EAAE,GAAY;IACpD,IAAI,CAAC;QACH,wCAAwC;QACxC,MAAM,WAAW,GAAG,QAAQ,CAC1B,mCAAmC,KAAK,CAAC,WAAW,EAAE,QAAQ,EAC9D;YACE,GAAG;YACH,QAAQ,EAAE,OAAO;YACjB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC;SAClC,CACF,CAAC,IAAI,EAAE,CAAC;QAET,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,sDAAsD;YACtD,+EAA+E;YAC/E,+EAA+E;YAC/E,MAAM,IAAI,GAAG,QAAQ,CAAC,yDAAyD,EAAE;gBAC/E,GAAG;gBACH,QAAQ,EAAE,OAAO;gBACjB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC;aAClC,CAAC,CAAC,IAAI,EAAE,CAAC;YAEV,OAAO,IAAI,IAAI,IAAI,CAAC;QACtB,CAAC;QAED,iEAAiE;QACjE,MAAM,aAAa,GAAG,QAAQ,CAAC,YAAY,WAAW,QAAQ,EAAE;YAC9D,GAAG;YACH,QAAQ,EAAE,OAAO;YACjB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC;SAClC,CAAC,CAAC,IAAI,EAAE,CAAC;QAEV,kDAAkD;QAClD,MAAM,eAAe,GAAG,QAAQ,CAAC,eAAe,EAAE;YAChD,GAAG;YACH,QAAQ,EAAE,OAAO;YACjB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC;SAClC,CAAC,CAAC,IAAI,EAAE,CAAC;QAEV,qBAAqB;QACrB,MAAM,QAAQ,GAAG,CAAC,aAAa,EAAE,eAAe,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC/E,OAAO,QAAQ,IAAI,IAAI,CAAC;IAC1B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CACtB,IAAY;IAEZ,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,GAAG;YACN,OAAO,UAAU,CAAC;QACpB,KAAK,GAAG;YACN,OAAO,OAAO,CAAC;QACjB,KAAK,GAAG;YACN,OAAO,SAAS,CAAC;QACnB,KAAK,GAAG;YACN,OAAO,SAAS,CAAC;QACnB;YACE,OAAO,UAAU,CAAC;IACtB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Grep-like content search across item fields.
|
|
3
|
+
*
|
|
4
|
+
* Recursively searches all text content (title, description, notes, AC text)
|
|
5
|
+
* and returns matched field paths.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Result of grep search on an item
|
|
9
|
+
*/
|
|
10
|
+
export interface GrepMatch {
|
|
11
|
+
/** Field paths where pattern matched (e.g., "description", "notes[1].content") */
|
|
12
|
+
matchedFields: string[];
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Search an item for a regex pattern across all text fields.
|
|
16
|
+
*
|
|
17
|
+
* @param item - The item to search
|
|
18
|
+
* @param pattern - Regex pattern string
|
|
19
|
+
* @param caseInsensitive - Whether to match case-insensitively (default: true)
|
|
20
|
+
* @returns GrepMatch with matched field paths, or null if no matches
|
|
21
|
+
*/
|
|
22
|
+
export declare function grepItem(item: Record<string, unknown>, pattern: string, caseInsensitive?: boolean): GrepMatch | null;
|
|
23
|
+
/**
|
|
24
|
+
* Format matched fields for display.
|
|
25
|
+
* Groups and simplifies paths for readability.
|
|
26
|
+
*/
|
|
27
|
+
export declare function formatMatchedFields(fields: string[]): string;
|
|
28
|
+
//# sourceMappingURL=grep.d.ts.map
|