@zaowu-labs/dev 1.0.1
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 +24 -0
- package/dist/contracts.d.ts +83 -0
- package/dist/contracts.d.ts.map +1 -0
- package/dist/contracts.js +24 -0
- package/dist/contracts.js.map +1 -0
- package/dist/domain.d.ts +3 -0
- package/dist/domain.d.ts.map +1 -0
- package/dist/domain.js +36 -0
- package/dist/domain.js.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +664 -0
- package/dist/index.js.map +1 -0
- package/dist/sync.d.ts +10 -0
- package/dist/sync.d.ts.map +1 -0
- package/dist/sync.js +113 -0
- package/dist/sync.js.map +1 -0
- package/package.json +41 -0
package/README.md
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# @zaowu-labs/dev
|
|
2
|
+
|
|
3
|
+
Developer workflow package for ZaoWu.
|
|
4
|
+
|
|
5
|
+
This package reads Git state for status, commit-message preview, and local diff
|
|
6
|
+
review. It also owns the preview-first `dev sync` operation that fetches origin
|
|
7
|
+
and hard-resets the current branch only after explicit confirmation.
|
|
8
|
+
|
|
9
|
+
Safety:
|
|
10
|
+
|
|
11
|
+
- Status, commit preview, and review do not modify Git state.
|
|
12
|
+
- Sync is destructive, previews by default, and requires explicit confirmation.
|
|
13
|
+
- Sync also requires `--discard-local` when tracked changes or commits ahead of
|
|
14
|
+
the remote branch would be discarded. Untracked files are preserved.
|
|
15
|
+
- Sync operation plans disclose `git fetch origin`, the exact hard-reset target,
|
|
16
|
+
and network access to the origin remote.
|
|
17
|
+
- Commit preview and review output are read-only and report risks as warnings.
|
|
18
|
+
- Commit preview returns both a copyable `message` and a structured `suggestion`
|
|
19
|
+
with inferred type, scope, subject, title, and body lines.
|
|
20
|
+
- Commit and review findings include severity, priority, and category so CLI
|
|
21
|
+
users and automation can triage risks consistently.
|
|
22
|
+
- Review hunks include new-file line ranges, and line-specific findings expose
|
|
23
|
+
an optional line number.
|
|
24
|
+
- Machine-readable commit and review output includes a schema version.
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import type { OperationPlan } from '@zaowu-labs/core';
|
|
2
|
+
export type DevCommandRunner = (command: string, args: readonly string[], options?: {
|
|
3
|
+
cwd?: string;
|
|
4
|
+
}) => string;
|
|
5
|
+
export declare const DEV_CHANGE_CATEGORIES: readonly ["source", "test", "docs", "dependency", "workflow", "config", "other"];
|
|
6
|
+
export type DevChangeCategory = (typeof DEV_CHANGE_CATEGORIES)[number];
|
|
7
|
+
export type DevChangeCategories = Record<DevChangeCategory, number>;
|
|
8
|
+
export interface GitChangeSummary {
|
|
9
|
+
files: string[];
|
|
10
|
+
untrackedFiles: string[];
|
|
11
|
+
additions: number;
|
|
12
|
+
deletions: number;
|
|
13
|
+
categories: DevChangeCategories;
|
|
14
|
+
}
|
|
15
|
+
export interface DevCommitSuggestion {
|
|
16
|
+
type: string;
|
|
17
|
+
scope: string;
|
|
18
|
+
subject: string;
|
|
19
|
+
title: string;
|
|
20
|
+
body: string[];
|
|
21
|
+
}
|
|
22
|
+
export interface DevReviewFinding {
|
|
23
|
+
severity: 'info' | 'warning';
|
|
24
|
+
priority: 'low' | 'medium' | 'high';
|
|
25
|
+
category: 'summary' | 'test' | 'dependency' | 'quality' | 'performance' | 'execution' | 'filesystem' | 'network' | 'security' | 'git';
|
|
26
|
+
title: string;
|
|
27
|
+
detail: string;
|
|
28
|
+
filePath?: string;
|
|
29
|
+
hunkHeader?: string;
|
|
30
|
+
line?: number;
|
|
31
|
+
}
|
|
32
|
+
export interface DevCommitResult {
|
|
33
|
+
schemaVersion: 1;
|
|
34
|
+
status: 'ok';
|
|
35
|
+
source: 'staged';
|
|
36
|
+
summary: GitChangeSummary;
|
|
37
|
+
suggestion: DevCommitSuggestion;
|
|
38
|
+
message: string;
|
|
39
|
+
findings: DevReviewFinding[];
|
|
40
|
+
recommendedChecks: string[];
|
|
41
|
+
}
|
|
42
|
+
export interface DevStatusResult {
|
|
43
|
+
schemaVersion: 1;
|
|
44
|
+
status: 'ok';
|
|
45
|
+
branch: string;
|
|
46
|
+
clean: boolean;
|
|
47
|
+
ahead: number;
|
|
48
|
+
behind: number;
|
|
49
|
+
staged: string[];
|
|
50
|
+
unstaged: string[];
|
|
51
|
+
untracked: string[];
|
|
52
|
+
}
|
|
53
|
+
export declare const isDevFindingSeverity: (value: unknown) => value is DevReviewFinding["severity"];
|
|
54
|
+
export declare const isDevFindingPriority: (value: unknown) => value is DevReviewFinding["priority"];
|
|
55
|
+
export declare const isDevFindingCategory: (value: unknown) => value is DevReviewFinding["category"];
|
|
56
|
+
export interface DevDiffHunk {
|
|
57
|
+
filePath: string;
|
|
58
|
+
header: string;
|
|
59
|
+
addedLines: number;
|
|
60
|
+
removedLines: number;
|
|
61
|
+
startLine: number;
|
|
62
|
+
endLine: number;
|
|
63
|
+
}
|
|
64
|
+
export interface DevReviewResult {
|
|
65
|
+
schemaVersion: 1;
|
|
66
|
+
status: 'ok';
|
|
67
|
+
source: 'staged' | 'working-tree';
|
|
68
|
+
summary: GitChangeSummary;
|
|
69
|
+
diffHunks: DevDiffHunk[];
|
|
70
|
+
findings: DevReviewFinding[];
|
|
71
|
+
recommendedChecks: string[];
|
|
72
|
+
}
|
|
73
|
+
export type DevReviewMode = 'auto' | 'staged' | 'worktree';
|
|
74
|
+
export interface DevSyncResult {
|
|
75
|
+
schemaVersion: 1;
|
|
76
|
+
status: 'ok' | 'preview';
|
|
77
|
+
branch: string;
|
|
78
|
+
previousCommit: string;
|
|
79
|
+
currentCommit: string;
|
|
80
|
+
output: string;
|
|
81
|
+
operationPlan?: OperationPlan;
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=contracts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contracts.d.ts","sourceRoot":"","sources":["../src/contracts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export const DEV_CHANGE_CATEGORIES = [
|
|
2
|
+
'source',
|
|
3
|
+
'test',
|
|
4
|
+
'docs',
|
|
5
|
+
'dependency',
|
|
6
|
+
'workflow',
|
|
7
|
+
'config',
|
|
8
|
+
'other',
|
|
9
|
+
];
|
|
10
|
+
export const isDevFindingSeverity = (value) => value === 'info' || value === 'warning';
|
|
11
|
+
export const isDevFindingPriority = (value) => value === 'low' || value === 'medium' || value === 'high';
|
|
12
|
+
export const isDevFindingCategory = (value) => [
|
|
13
|
+
'summary',
|
|
14
|
+
'test',
|
|
15
|
+
'dependency',
|
|
16
|
+
'quality',
|
|
17
|
+
'performance',
|
|
18
|
+
'execution',
|
|
19
|
+
'filesystem',
|
|
20
|
+
'network',
|
|
21
|
+
'security',
|
|
22
|
+
'git',
|
|
23
|
+
].includes(value);
|
|
24
|
+
//# sourceMappingURL=contracts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contracts.js","sourceRoot":"","sources":["../src/contracts.ts"],"names":[],"mappings":"AAQA,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC,QAAQ;IACR,MAAM;IACN,MAAM;IACN,YAAY;IACZ,UAAU;IACV,QAAQ;IACR,OAAO;CACC,CAAC;AAgEX,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,KAAc,EAAyC,EAAE,CAC5F,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,SAAS,CAAC;AAC1C,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,KAAc,EAAyC,EAAE,CAC5F,KAAK,KAAK,KAAK,IAAI,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,MAAM,CAAC;AAC5D,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,KAAc,EAAyC,EAAE,CAC5F;IACE,SAAS;IACT,MAAM;IACN,YAAY;IACZ,SAAS;IACT,aAAa;IACb,WAAW;IACX,YAAY;IACZ,SAAS;IACT,UAAU;IACV,KAAK;CACN,CAAC,QAAQ,CAAC,KAAe,CAAC,CAAC"}
|
package/dist/domain.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"domain.d.ts","sourceRoot":"","sources":["../src/domain.ts"],"names":[],"mappings":"AAAA,OAAO,EAA0B,KAAK,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEjF,eAAO,MAAM,UAAU,EAAE,gBAiCxB,CAAC"}
|
package/dist/domain.js
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { createCapabilityLedger } from '@zaowu-labs/core';
|
|
2
|
+
export const DEV_DOMAIN = {
|
|
3
|
+
name: 'dev',
|
|
4
|
+
summary: 'Developer workflows for review, commit, and repository assistance',
|
|
5
|
+
capabilities: createCapabilityLedger({
|
|
6
|
+
modifiesGit: true,
|
|
7
|
+
usesNetwork: true,
|
|
8
|
+
accessesSecrets: true,
|
|
9
|
+
}),
|
|
10
|
+
commands: [
|
|
11
|
+
{
|
|
12
|
+
name: 'commit',
|
|
13
|
+
summary: 'Preview and prepare a Git commit message',
|
|
14
|
+
status: 'available',
|
|
15
|
+
sensitive: true,
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
name: 'review',
|
|
19
|
+
summary: 'Review a repository change without modifying files',
|
|
20
|
+
status: 'available',
|
|
21
|
+
sensitive: true,
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
name: 'status',
|
|
25
|
+
summary: 'Show Git working tree status for the current project',
|
|
26
|
+
status: 'available',
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
name: 'sync',
|
|
30
|
+
summary: 'Synchronize the local branch with the same-named branch on origin',
|
|
31
|
+
status: 'available',
|
|
32
|
+
sensitive: true,
|
|
33
|
+
},
|
|
34
|
+
],
|
|
35
|
+
};
|
|
36
|
+
//# sourceMappingURL=domain.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"domain.js","sourceRoot":"","sources":["../src/domain.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAyB,MAAM,kBAAkB,CAAC;AAEjF,MAAM,CAAC,MAAM,UAAU,GAAqB;IAC1C,IAAI,EAAE,KAAK;IACX,OAAO,EAAE,mEAAmE;IAC5E,YAAY,EAAE,sBAAsB,CAAC;QACnC,WAAW,EAAE,IAAI;QACjB,WAAW,EAAE,IAAI;QACjB,eAAe,EAAE,IAAI;KACtB,CAAC;IACF,QAAQ,EAAE;QACR;YACE,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,0CAA0C;YACnD,MAAM,EAAE,WAAW;YACnB,SAAS,EAAE,IAAI;SAChB;QACD;YACE,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,oDAAoD;YAC7D,MAAM,EAAE,WAAW;YACnB,SAAS,EAAE,IAAI;SAChB;QACD;YACE,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,sDAAsD;YAC/D,MAAM,EAAE,WAAW;SACpB;QACD;YACE,IAAI,EAAE,MAAM;YACZ,OAAO,EAAE,mEAAmE;YAC5E,MAAM,EAAE,WAAW;YACnB,SAAS,EAAE,IAAI;SAChB;KACF;CACF,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export { DEV_DOMAIN } from './domain.js';
|
|
2
|
+
import { type DevCommandRunner, type DevCommitResult, type DevReviewMode, type DevReviewResult, type DevStatusResult, type DevSyncResult } from './contracts.js';
|
|
3
|
+
import { type DevSyncOptions } from './sync.js';
|
|
4
|
+
export * from './contracts.js';
|
|
5
|
+
export declare const previewDevCommit: (commandRunner: DevCommandRunner, options?: {
|
|
6
|
+
cwd?: string;
|
|
7
|
+
}) => DevCommitResult;
|
|
8
|
+
export declare const getDevStatus: (commandRunner: DevCommandRunner, options?: {
|
|
9
|
+
cwd?: string;
|
|
10
|
+
}) => DevStatusResult;
|
|
11
|
+
export declare const reviewDevChanges: (commandRunner: DevCommandRunner, options?: {
|
|
12
|
+
cwd?: string;
|
|
13
|
+
mode?: DevReviewMode;
|
|
14
|
+
}) => DevReviewResult;
|
|
15
|
+
export declare const syncDevRepo: (commandRunner: DevCommandRunner, options?: DevSyncOptions) => DevSyncResult;
|
|
16
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,OAAO,EAIL,KAAK,gBAAgB,EACrB,KAAK,eAAe,EAIpB,KAAK,aAAa,EAClB,KAAK,eAAe,EACpB,KAAK,eAAe,EACpB,KAAK,aAAa,EAEnB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAuB,KAAK,cAAc,EAAE,MAAM,WAAW,CAAC;AAErE,cAAc,gBAAgB,CAAC;AA2wB/B,eAAO,MAAM,gBAAgB,GAC3B,eAAe,gBAAgB,EAC/B,UAAS;IAAE,GAAG,CAAC,EAAE,MAAM,CAAA;CAAO,KAC7B,eA4BF,CAAC;AAEF,eAAO,MAAM,YAAY,GACvB,eAAe,gBAAgB,EAC/B,UAAS;IAAE,GAAG,CAAC,EAAE,MAAM,CAAA;CAAO,KAC7B,eAuDF,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAC3B,eAAe,gBAAgB,EAC/B,UAAS;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,aAAa,CAAA;CAAO,KACnD,eA+CF,CAAC;AAEF,eAAO,MAAM,WAAW,GACtB,eAAe,gBAAgB,EAC/B,UAAS,cAAmB,KAC3B,aAA0E,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,664 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import { ZaoWuError } from '@zaowu-labs/core';
|
|
3
|
+
export { DEV_DOMAIN } from './domain.js';
|
|
4
|
+
import { DEV_CHANGE_CATEGORIES, } from './contracts.js';
|
|
5
|
+
import { syncDevRepoInternal } from './sync.js';
|
|
6
|
+
export * from './contracts.js';
|
|
7
|
+
const DEV_REVIEW_SCHEMA_VERSION = 1;
|
|
8
|
+
const DEV_COMMIT_SCHEMA_VERSION = 1;
|
|
9
|
+
const DEV_STATUS_SCHEMA_VERSION = 1;
|
|
10
|
+
const runGit = (commandRunner, args, cwd) => {
|
|
11
|
+
try {
|
|
12
|
+
return commandRunner('git', args, { cwd });
|
|
13
|
+
}
|
|
14
|
+
catch {
|
|
15
|
+
throw new ZaoWuError({
|
|
16
|
+
code: 'GIT_COMMAND_FAILED',
|
|
17
|
+
message: 'Git command failed.',
|
|
18
|
+
why: `ZaoWu tried to run \`git ${args.join(' ')}\`, but Git returned an error.`,
|
|
19
|
+
fix: 'Run this command inside a Git repository and make sure Git is available on PATH.',
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
const createEmptyCategories = () => Object.fromEntries(DEV_CHANGE_CATEGORIES.map((cat) => [cat, 0]));
|
|
24
|
+
const getFileCategory = (filePath) => {
|
|
25
|
+
const file = filePath.replaceAll('\\', '/');
|
|
26
|
+
if (file.includes('.test.') || file.includes('.spec.')) {
|
|
27
|
+
return 'test';
|
|
28
|
+
}
|
|
29
|
+
if (file === 'package.json' || file === 'pnpm-lock.yaml' || file.endsWith('/package.json')) {
|
|
30
|
+
return 'dependency';
|
|
31
|
+
}
|
|
32
|
+
if (file.startsWith('.github/workflows/') || file.startsWith('scripts/')) {
|
|
33
|
+
return 'workflow';
|
|
34
|
+
}
|
|
35
|
+
if (file.startsWith('docs/') || file.endsWith('.md')) {
|
|
36
|
+
return 'docs';
|
|
37
|
+
}
|
|
38
|
+
if (file.startsWith('packages/') && (file.includes('/src/') || file.endsWith('/src/index.ts'))) {
|
|
39
|
+
return 'source';
|
|
40
|
+
}
|
|
41
|
+
if (file === 'tsconfig.json' ||
|
|
42
|
+
file === 'eslint.config.js' ||
|
|
43
|
+
file === '.prettierrc' ||
|
|
44
|
+
file.startsWith('.changeset/')) {
|
|
45
|
+
return 'config';
|
|
46
|
+
}
|
|
47
|
+
return 'other';
|
|
48
|
+
};
|
|
49
|
+
const summarizeCategories = (files) => {
|
|
50
|
+
const categories = createEmptyCategories();
|
|
51
|
+
for (const file of files) {
|
|
52
|
+
categories[getFileCategory(file)] += 1;
|
|
53
|
+
}
|
|
54
|
+
return categories;
|
|
55
|
+
};
|
|
56
|
+
const parseNumstat = (output, files, untrackedFiles = []) => {
|
|
57
|
+
let additions = 0;
|
|
58
|
+
let deletions = 0;
|
|
59
|
+
const allFiles = [...new Set([...files, ...untrackedFiles])];
|
|
60
|
+
for (const line of output.split(/\r?\n/)) {
|
|
61
|
+
if (!line.trim()) {
|
|
62
|
+
continue;
|
|
63
|
+
}
|
|
64
|
+
const [added, deleted] = line.split(/\s+/);
|
|
65
|
+
additions += Number.parseInt(added, 10) || 0;
|
|
66
|
+
deletions += Number.parseInt(deleted, 10) || 0;
|
|
67
|
+
}
|
|
68
|
+
return {
|
|
69
|
+
files: allFiles,
|
|
70
|
+
untrackedFiles: [...untrackedFiles],
|
|
71
|
+
additions,
|
|
72
|
+
deletions,
|
|
73
|
+
categories: summarizeCategories(allFiles),
|
|
74
|
+
};
|
|
75
|
+
};
|
|
76
|
+
const getChangedFiles = (commandRunner, args, cwd) => runGit(commandRunner, args, cwd)
|
|
77
|
+
.split(/\r?\n/)
|
|
78
|
+
.map((line) => line.trim())
|
|
79
|
+
.filter(Boolean);
|
|
80
|
+
const getSummary = (commandRunner, nameArgs, numstatArgs, cwd) => {
|
|
81
|
+
const files = getChangedFiles(commandRunner, nameArgs, cwd);
|
|
82
|
+
if (files.length === 0) {
|
|
83
|
+
return {
|
|
84
|
+
files: [],
|
|
85
|
+
untrackedFiles: [],
|
|
86
|
+
additions: 0,
|
|
87
|
+
deletions: 0,
|
|
88
|
+
categories: createEmptyCategories(),
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
return parseNumstat(runGit(commandRunner, numstatArgs, cwd), files);
|
|
92
|
+
};
|
|
93
|
+
const getStagedSummary = (commandRunner, cwd) => getSummary(commandRunner, ['diff', '--cached', '--name-only'], ['diff', '--cached', '--numstat'], cwd);
|
|
94
|
+
const getWorkingTreeSummary = (commandRunner, cwd) => parseNumstat(runGit(commandRunner, ['diff', '--numstat'], cwd), getChangedFiles(commandRunner, ['diff', '--name-only'], cwd), getChangedFiles(commandRunner, ['ls-files', '--others', '--exclude-standard'], cwd));
|
|
95
|
+
const stripDiffPath = (value) => {
|
|
96
|
+
let cleaned = value.replace(/^[ab]\//, '');
|
|
97
|
+
if (cleaned.startsWith('"') && cleaned.endsWith('"')) {
|
|
98
|
+
cleaned = cleaned.slice(1, -1);
|
|
99
|
+
}
|
|
100
|
+
return cleaned;
|
|
101
|
+
};
|
|
102
|
+
const parseDiffHunks = (diff) => {
|
|
103
|
+
const hunks = [];
|
|
104
|
+
let currentFile = '';
|
|
105
|
+
let currentHunk;
|
|
106
|
+
let currentNewLine = 0;
|
|
107
|
+
for (const line of diff.split(/\r?\n/)) {
|
|
108
|
+
const fileMatch = /^diff --git a\/(.+?) b\/(.+)$/.exec(line);
|
|
109
|
+
if (fileMatch) {
|
|
110
|
+
currentFile = stripDiffPath(fileMatch[2]);
|
|
111
|
+
currentHunk = undefined;
|
|
112
|
+
currentNewLine = 0;
|
|
113
|
+
continue;
|
|
114
|
+
}
|
|
115
|
+
const hunkMatch = /^@@\s+-(?:\d+)(?:,\d+)?\s+\+(\d+)(?:,(\d+))?\s+@@/.exec(line);
|
|
116
|
+
if (hunkMatch && currentFile) {
|
|
117
|
+
const startLine = Number.parseInt(hunkMatch[1], 10);
|
|
118
|
+
const lineCount = Number.parseInt(hunkMatch[2] ?? '1', 10);
|
|
119
|
+
currentNewLine = startLine;
|
|
120
|
+
currentHunk = {
|
|
121
|
+
filePath: currentFile,
|
|
122
|
+
header: hunkMatch[0],
|
|
123
|
+
addedLines: 0,
|
|
124
|
+
removedLines: 0,
|
|
125
|
+
startLine,
|
|
126
|
+
endLine: Math.max(startLine, startLine + lineCount - 1),
|
|
127
|
+
addedText: [],
|
|
128
|
+
addedLineNumbers: [],
|
|
129
|
+
};
|
|
130
|
+
hunks.push(currentHunk);
|
|
131
|
+
continue;
|
|
132
|
+
}
|
|
133
|
+
if (!currentHunk) {
|
|
134
|
+
continue;
|
|
135
|
+
}
|
|
136
|
+
if (line.startsWith('\')) {
|
|
137
|
+
continue;
|
|
138
|
+
}
|
|
139
|
+
if (line.startsWith('+')) {
|
|
140
|
+
currentHunk.addedLines += 1;
|
|
141
|
+
currentHunk.addedText.push(line.slice(1));
|
|
142
|
+
currentHunk.addedLineNumbers.push(currentNewLine);
|
|
143
|
+
currentNewLine += 1;
|
|
144
|
+
continue;
|
|
145
|
+
}
|
|
146
|
+
if (line.startsWith('-')) {
|
|
147
|
+
currentHunk.removedLines += 1;
|
|
148
|
+
continue;
|
|
149
|
+
}
|
|
150
|
+
currentNewLine += 1;
|
|
151
|
+
}
|
|
152
|
+
return hunks;
|
|
153
|
+
};
|
|
154
|
+
const toPublicDiffHunks = (hunks) => hunks.map(({ filePath, header, addedLines, removedLines, startLine, endLine }) => ({
|
|
155
|
+
filePath,
|
|
156
|
+
header,
|
|
157
|
+
addedLines,
|
|
158
|
+
removedLines,
|
|
159
|
+
startLine,
|
|
160
|
+
endLine,
|
|
161
|
+
}));
|
|
162
|
+
const getReviewDiffHunks = (commandRunner, source, cwd) => {
|
|
163
|
+
const args = source === 'working-tree' ? ['diff', '--unified=0'] : ['diff', '--cached', '--unified=0'];
|
|
164
|
+
return parseDiffHunks(runGit(commandRunner, args, cwd));
|
|
165
|
+
};
|
|
166
|
+
const inferCommitType = (files) => {
|
|
167
|
+
if (files.every((file) => file.startsWith('docs/') || file.endsWith('.md'))) {
|
|
168
|
+
return 'docs';
|
|
169
|
+
}
|
|
170
|
+
if (files.some((file) => file.endsWith('package.json') || file.endsWith('pnpm-lock.yaml'))) {
|
|
171
|
+
return 'chore';
|
|
172
|
+
}
|
|
173
|
+
if (files.some((file) => file.startsWith('packages/') && file.includes('/src/'))) {
|
|
174
|
+
return 'feat';
|
|
175
|
+
}
|
|
176
|
+
if (files.some((file) => file.includes('.test.') || file.includes('.spec.'))) {
|
|
177
|
+
return 'test';
|
|
178
|
+
}
|
|
179
|
+
return 'chore';
|
|
180
|
+
};
|
|
181
|
+
const inferScope = (files) => {
|
|
182
|
+
const packageMatch = files
|
|
183
|
+
.map((file) => /^packages\/([^/]+)/.exec(file)?.[1])
|
|
184
|
+
.find((scope) => Boolean(scope));
|
|
185
|
+
if (packageMatch) {
|
|
186
|
+
return packageMatch;
|
|
187
|
+
}
|
|
188
|
+
if (files.every((file) => file.startsWith('docs/') || file.endsWith('.md'))) {
|
|
189
|
+
return 'docs';
|
|
190
|
+
}
|
|
191
|
+
if (files.some((file) => file === 'package.json' || file === 'pnpm-lock.yaml' || file.endsWith('/package.json'))) {
|
|
192
|
+
return 'deps';
|
|
193
|
+
}
|
|
194
|
+
if (files.some((file) => file.startsWith('.github/workflows/') || file.startsWith('scripts/'))) {
|
|
195
|
+
return 'workflow';
|
|
196
|
+
}
|
|
197
|
+
if (files.some((file) => file === 'tsconfig.json' ||
|
|
198
|
+
file === 'eslint.config.js' ||
|
|
199
|
+
file === '.prettierrc' ||
|
|
200
|
+
file.startsWith('.changeset/'))) {
|
|
201
|
+
return 'config';
|
|
202
|
+
}
|
|
203
|
+
return 'project';
|
|
204
|
+
};
|
|
205
|
+
const normalizeCommitScope = (scope) => scope
|
|
206
|
+
.toLowerCase()
|
|
207
|
+
.replace(/[^a-z0-9._-]+/g, '-')
|
|
208
|
+
.replace(/^-+|-+$/g, '') || 'project';
|
|
209
|
+
const inferCommitSubject = (summary, scope) => {
|
|
210
|
+
if (summary.categories.dependency > 0) {
|
|
211
|
+
return 'update dependency metadata';
|
|
212
|
+
}
|
|
213
|
+
if (summary.categories.docs > 0 &&
|
|
214
|
+
summary.files.every((file) => getFileCategory(file) === 'docs')) {
|
|
215
|
+
return 'update documentation';
|
|
216
|
+
}
|
|
217
|
+
if (summary.categories.test > 0 && summary.categories.source === 0) {
|
|
218
|
+
return 'update tests';
|
|
219
|
+
}
|
|
220
|
+
if (summary.categories.workflow > 0 && summary.categories.source === 0) {
|
|
221
|
+
return 'update workflows';
|
|
222
|
+
}
|
|
223
|
+
if (summary.categories.config > 0 && summary.categories.source === 0) {
|
|
224
|
+
return 'update configuration';
|
|
225
|
+
}
|
|
226
|
+
return `update ${scope}`;
|
|
227
|
+
};
|
|
228
|
+
const describeCommitCategories = (categories) => {
|
|
229
|
+
const entries = Object.entries(categories)
|
|
230
|
+
.filter(([, count]) => count > 0)
|
|
231
|
+
.map(([name, count]) => `${name}=${count}`);
|
|
232
|
+
return entries.length > 0 ? entries.join(', ') : 'none';
|
|
233
|
+
};
|
|
234
|
+
const createCommitSuggestion = (summary) => {
|
|
235
|
+
const type = inferCommitType(summary.files);
|
|
236
|
+
const scope = normalizeCommitScope(inferScope(summary.files));
|
|
237
|
+
const subject = inferCommitSubject(summary, scope);
|
|
238
|
+
const title = `${type}(${scope}): ${subject}`;
|
|
239
|
+
return {
|
|
240
|
+
type,
|
|
241
|
+
scope,
|
|
242
|
+
subject,
|
|
243
|
+
title,
|
|
244
|
+
body: [
|
|
245
|
+
`Staged files: ${summary.files.length}.`,
|
|
246
|
+
`Change size: +${summary.additions}/-${summary.deletions}.`,
|
|
247
|
+
`Categories: ${describeCommitCategories(summary.categories)}.`,
|
|
248
|
+
],
|
|
249
|
+
};
|
|
250
|
+
};
|
|
251
|
+
const getRecommendedChecks = (summary) => {
|
|
252
|
+
const checks = [];
|
|
253
|
+
const addCheck = (check) => {
|
|
254
|
+
if (!checks.includes(check)) {
|
|
255
|
+
checks.push(check);
|
|
256
|
+
}
|
|
257
|
+
};
|
|
258
|
+
if (summary.categories.dependency > 0) {
|
|
259
|
+
addCheck('corepack pnpm install --frozen-lockfile');
|
|
260
|
+
}
|
|
261
|
+
if (summary.categories.source > 0 ||
|
|
262
|
+
summary.categories.test > 0 ||
|
|
263
|
+
summary.categories.dependency > 0 ||
|
|
264
|
+
summary.categories.workflow > 0 ||
|
|
265
|
+
summary.categories.config > 0) {
|
|
266
|
+
addCheck('corepack pnpm build');
|
|
267
|
+
addCheck('corepack pnpm test');
|
|
268
|
+
}
|
|
269
|
+
if (summary.categories.docs > 0 ||
|
|
270
|
+
summary.categories.workflow > 0 ||
|
|
271
|
+
summary.categories.config > 0) {
|
|
272
|
+
addCheck('corepack pnpm lint');
|
|
273
|
+
addCheck('corepack pnpm format:check');
|
|
274
|
+
}
|
|
275
|
+
if (checks.length === 0) {
|
|
276
|
+
addCheck('corepack pnpm test');
|
|
277
|
+
}
|
|
278
|
+
return checks;
|
|
279
|
+
};
|
|
280
|
+
const addFindingOnce = (findings, finding) => {
|
|
281
|
+
if (findings.some((existing) => existing.title === finding.title &&
|
|
282
|
+
existing.filePath === finding.filePath &&
|
|
283
|
+
existing.hunkHeader === finding.hunkHeader &&
|
|
284
|
+
existing.line === finding.line)) {
|
|
285
|
+
return;
|
|
286
|
+
}
|
|
287
|
+
findings.push(finding);
|
|
288
|
+
};
|
|
289
|
+
const SENSITIVE_REVIEW_FILE_EXTENSIONS = new Set([
|
|
290
|
+
'.bash',
|
|
291
|
+
'.bat',
|
|
292
|
+
'.cjs',
|
|
293
|
+
'.cmd',
|
|
294
|
+
'.cts',
|
|
295
|
+
'.js',
|
|
296
|
+
'.jsx',
|
|
297
|
+
'.mjs',
|
|
298
|
+
'.mts',
|
|
299
|
+
'.ps1',
|
|
300
|
+
'.sh',
|
|
301
|
+
'.ts',
|
|
302
|
+
'.tsx',
|
|
303
|
+
'.zsh',
|
|
304
|
+
]);
|
|
305
|
+
const SENSITIVE_REVIEW_FILE_NAMES = new Set([
|
|
306
|
+
'eslint.config.js',
|
|
307
|
+
'package.json',
|
|
308
|
+
'pnpm-workspace.yaml',
|
|
309
|
+
'tsconfig.json',
|
|
310
|
+
'vitest.config.ts',
|
|
311
|
+
]);
|
|
312
|
+
const isSensitiveReviewFile = (filePath) => {
|
|
313
|
+
const normalized = filePath.replaceAll('\\', '/');
|
|
314
|
+
const fileName = path.basename(filePath);
|
|
315
|
+
if (SENSITIVE_REVIEW_FILE_NAMES.has(fileName)) {
|
|
316
|
+
return true;
|
|
317
|
+
}
|
|
318
|
+
if (/^(?:\.github\/workflows|examples\/workflows)\//.test(normalized)) {
|
|
319
|
+
return /\.ya?ml$/.test(normalized);
|
|
320
|
+
}
|
|
321
|
+
return SENSITIVE_REVIEW_FILE_EXTENSIONS.has(/\.[^.]+$/.exec(fileName)?.[0] ?? '');
|
|
322
|
+
};
|
|
323
|
+
const hasShellExecutionAdded = (line) => /(?:^|[^\w.])exec\s*\(/.test(line) ||
|
|
324
|
+
/\b(?:execFile|execFileSync|spawn|spawnSync|execSync)\s*\(/.test(line);
|
|
325
|
+
const hasFileMutationAdded = (line) => /\b(?:writeFile|writeFileSync|appendFile|appendFileSync|rm|rmSync|unlink|unlinkSync)\s*\(/.test(line);
|
|
326
|
+
const hasNetworkAccessAdded = (line) => /\bfetch\s*\(/.test(line);
|
|
327
|
+
const hasSecretLikeLiteralAdded = (line) => /\b(?:sk-[A-Za-z0-9_-]{20,}|gh[pousr]_[A-Za-z0-9_]{20,}|xox[baprs]-[A-Za-z0-9-]{20,})\b/.test(line) ||
|
|
328
|
+
/\b(?:api[_-]?key|token|secret|password)\b\s*[:=]\s*['"](?!(?:test|example|dummy|placeholder|redacted|set|missing)[\w-]*['"])[^'"]{16,}['"]/i.test(line);
|
|
329
|
+
const hasDestructiveGitCommandAdded = (line) => /\bgit\s+(?:reset\s+--hard|push\s+--force(?:-with-lease)?|clean\s+-[A-Za-z]*[fd][A-Za-z]*|checkout\s+--)\b/.test(line) ||
|
|
330
|
+
(/\bgit\b/.test(line) &&
|
|
331
|
+
(/[`'"]reset[`'"]\s*,\s*[`'"]--hard[`'"]/.test(line) ||
|
|
332
|
+
/[`'"]push[`'"]\s*,\s*[`'"]--force(?:-with-lease)?[`'"]/.test(line) ||
|
|
333
|
+
/[`'"]clean[`'"]\s*,\s*[`'"]-[A-Za-z]*[fd][A-Za-z]*[`'"]/.test(line) ||
|
|
334
|
+
/[`'"]checkout[`'"]\s*,\s*[`'"]--[`'"]/.test(line)));
|
|
335
|
+
const findFirstAddedLineNumber = (hunk, predicate) => {
|
|
336
|
+
const index = hunk.addedText.findIndex(predicate);
|
|
337
|
+
return index >= 0 ? hunk.addedLineNumbers[index] : undefined;
|
|
338
|
+
};
|
|
339
|
+
const addDiffHeuristicFindings = (findings, hunks) => {
|
|
340
|
+
for (const hunk of hunks) {
|
|
341
|
+
const shouldScanSensitiveText = isSensitiveReviewFile(hunk.filePath);
|
|
342
|
+
if (hunk.addedLines + hunk.removedLines > 80) {
|
|
343
|
+
addFindingOnce(findings, {
|
|
344
|
+
severity: 'warning',
|
|
345
|
+
priority: 'medium',
|
|
346
|
+
category: 'quality',
|
|
347
|
+
title: 'Large diff hunk',
|
|
348
|
+
detail: 'This hunk is large enough to hide review risk; consider splitting it before merge.',
|
|
349
|
+
filePath: hunk.filePath,
|
|
350
|
+
hunkHeader: hunk.header,
|
|
351
|
+
});
|
|
352
|
+
}
|
|
353
|
+
if (shouldScanSensitiveText && hunk.addedText.some(hasShellExecutionAdded)) {
|
|
354
|
+
addFindingOnce(findings, {
|
|
355
|
+
severity: 'warning',
|
|
356
|
+
priority: 'high',
|
|
357
|
+
category: 'execution',
|
|
358
|
+
title: 'Shell execution added',
|
|
359
|
+
detail: 'Added code appears to run shell commands; confirm preview or confirmation behavior.',
|
|
360
|
+
filePath: hunk.filePath,
|
|
361
|
+
hunkHeader: hunk.header,
|
|
362
|
+
line: findFirstAddedLineNumber(hunk, hasShellExecutionAdded),
|
|
363
|
+
});
|
|
364
|
+
}
|
|
365
|
+
if (shouldScanSensitiveText && hunk.addedText.some(hasFileMutationAdded)) {
|
|
366
|
+
addFindingOnce(findings, {
|
|
367
|
+
severity: 'warning',
|
|
368
|
+
priority: 'medium',
|
|
369
|
+
category: 'filesystem',
|
|
370
|
+
title: 'File mutation added',
|
|
371
|
+
detail: 'Added code appears to write or delete files; confirm it cannot silently overwrite user data.',
|
|
372
|
+
filePath: hunk.filePath,
|
|
373
|
+
hunkHeader: hunk.header,
|
|
374
|
+
line: findFirstAddedLineNumber(hunk, hasFileMutationAdded),
|
|
375
|
+
});
|
|
376
|
+
}
|
|
377
|
+
if (shouldScanSensitiveText && hunk.addedText.some(hasNetworkAccessAdded)) {
|
|
378
|
+
addFindingOnce(findings, {
|
|
379
|
+
severity: 'warning',
|
|
380
|
+
priority: 'medium',
|
|
381
|
+
category: 'network',
|
|
382
|
+
title: 'Network access added',
|
|
383
|
+
detail: 'Added code appears to access the network; confirm preview and user consent behavior.',
|
|
384
|
+
filePath: hunk.filePath,
|
|
385
|
+
hunkHeader: hunk.header,
|
|
386
|
+
line: findFirstAddedLineNumber(hunk, hasNetworkAccessAdded),
|
|
387
|
+
});
|
|
388
|
+
}
|
|
389
|
+
if (hunk.addedText.some((line) => /\b(?:it|describe|test)\.only\s*\(/.test(line))) {
|
|
390
|
+
addFindingOnce(findings, {
|
|
391
|
+
severity: 'warning',
|
|
392
|
+
priority: 'high',
|
|
393
|
+
category: 'test',
|
|
394
|
+
title: 'Focused test committed',
|
|
395
|
+
detail: 'A focused test marker was added and would narrow the test run.',
|
|
396
|
+
filePath: hunk.filePath,
|
|
397
|
+
hunkHeader: hunk.header,
|
|
398
|
+
line: findFirstAddedLineNumber(hunk, (line) => /\b(?:it|describe|test)\.only\s*\(/.test(line)),
|
|
399
|
+
});
|
|
400
|
+
}
|
|
401
|
+
if (shouldScanSensitiveText && hunk.addedText.some(hasSecretLikeLiteralAdded)) {
|
|
402
|
+
addFindingOnce(findings, {
|
|
403
|
+
severity: 'warning',
|
|
404
|
+
priority: 'high',
|
|
405
|
+
category: 'security',
|
|
406
|
+
title: 'Secret-like literal added',
|
|
407
|
+
detail: 'Added code appears to contain a credential-like literal; move secrets to environment variables and rotate any exposed value.',
|
|
408
|
+
filePath: hunk.filePath,
|
|
409
|
+
hunkHeader: hunk.header,
|
|
410
|
+
line: findFirstAddedLineNumber(hunk, hasSecretLikeLiteralAdded),
|
|
411
|
+
});
|
|
412
|
+
}
|
|
413
|
+
if (shouldScanSensitiveText && hunk.addedText.some(hasDestructiveGitCommandAdded)) {
|
|
414
|
+
addFindingOnce(findings, {
|
|
415
|
+
severity: 'warning',
|
|
416
|
+
priority: 'high',
|
|
417
|
+
category: 'git',
|
|
418
|
+
title: 'Destructive Git command added',
|
|
419
|
+
detail: 'Added code appears to run a destructive Git command; confirm it cannot reset, clean, or force-push user work without explicit consent.',
|
|
420
|
+
filePath: hunk.filePath,
|
|
421
|
+
hunkHeader: hunk.header,
|
|
422
|
+
line: findFirstAddedLineNumber(hunk, hasDestructiveGitCommandAdded),
|
|
423
|
+
});
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
};
|
|
427
|
+
const addDependencyConsistencyFindings = (findings, files) => {
|
|
428
|
+
const hasPackageManifest = files.some((file) => file === 'package.json' || file.endsWith('/package.json'));
|
|
429
|
+
const hasLockfile = files.includes('pnpm-lock.yaml');
|
|
430
|
+
if (hasPackageManifest && !hasLockfile) {
|
|
431
|
+
findings.push({
|
|
432
|
+
severity: 'warning',
|
|
433
|
+
priority: 'medium',
|
|
434
|
+
category: 'dependency',
|
|
435
|
+
title: 'Package manifest without lockfile',
|
|
436
|
+
detail: 'A package manifest changed without pnpm-lock.yaml; confirm dependency resolution did not change or run a frozen install.',
|
|
437
|
+
});
|
|
438
|
+
}
|
|
439
|
+
if (hasLockfile && !hasPackageManifest) {
|
|
440
|
+
findings.push({
|
|
441
|
+
severity: 'warning',
|
|
442
|
+
priority: 'medium',
|
|
443
|
+
category: 'dependency',
|
|
444
|
+
title: 'Lockfile without package manifest',
|
|
445
|
+
detail: 'pnpm-lock.yaml changed without a package manifest; confirm the lockfile change is intentional.',
|
|
446
|
+
});
|
|
447
|
+
}
|
|
448
|
+
};
|
|
449
|
+
const isGeneratedArtifactFile = (filePath) => {
|
|
450
|
+
const normalized = filePath.replaceAll('\\', '/');
|
|
451
|
+
const fileName = path.basename(filePath);
|
|
452
|
+
return (normalized.includes('/dist/') ||
|
|
453
|
+
normalized.startsWith('dist/') ||
|
|
454
|
+
normalized.includes('/coverage/') ||
|
|
455
|
+
normalized.startsWith('coverage/') ||
|
|
456
|
+
normalized.includes('/node_modules/') ||
|
|
457
|
+
normalized.startsWith('node_modules/') ||
|
|
458
|
+
normalized.includes('/.turbo/') ||
|
|
459
|
+
normalized.startsWith('.turbo/') ||
|
|
460
|
+
fileName.endsWith('.tsbuildinfo') ||
|
|
461
|
+
fileName.endsWith('.tgz'));
|
|
462
|
+
};
|
|
463
|
+
const addGeneratedArtifactFindings = (findings, files) => {
|
|
464
|
+
for (const file of files.filter(isGeneratedArtifactFile)) {
|
|
465
|
+
addFindingOnce(findings, {
|
|
466
|
+
severity: 'warning',
|
|
467
|
+
priority: 'high',
|
|
468
|
+
category: 'quality',
|
|
469
|
+
title: 'Generated artifact staged',
|
|
470
|
+
detail: 'This path looks like a build, coverage, dependency, or package artifact; confirm it belongs in source control before committing.',
|
|
471
|
+
filePath: file,
|
|
472
|
+
});
|
|
473
|
+
}
|
|
474
|
+
};
|
|
475
|
+
const getPackageName = (filePath) => /^packages\/([^/]+)\//.exec(filePath.replaceAll('\\', '/'))?.[1];
|
|
476
|
+
const isTestFile = (filePath) => filePath.includes('.test.') || filePath.includes('.spec.');
|
|
477
|
+
const addPackageTestCoverageFindings = (findings, files) => {
|
|
478
|
+
const changedSourcePackages = [
|
|
479
|
+
...new Set(files
|
|
480
|
+
.filter((file) => file.replaceAll('\\', '/').startsWith('packages/') &&
|
|
481
|
+
file.replaceAll('\\', '/').includes('/src/') &&
|
|
482
|
+
!isTestFile(file))
|
|
483
|
+
.map((file) => getPackageName(file))
|
|
484
|
+
.filter((packageName) => Boolean(packageName))),
|
|
485
|
+
];
|
|
486
|
+
if (changedSourcePackages.length === 0) {
|
|
487
|
+
return;
|
|
488
|
+
}
|
|
489
|
+
const changedTestPackages = new Set(files
|
|
490
|
+
.filter(isTestFile)
|
|
491
|
+
.map((file) => getPackageName(file))
|
|
492
|
+
.filter((packageName) => Boolean(packageName)));
|
|
493
|
+
const missingPackageTests = changedSourcePackages.filter((packageName) => !changedTestPackages.has(packageName));
|
|
494
|
+
if (missingPackageTests.length === 0) {
|
|
495
|
+
return;
|
|
496
|
+
}
|
|
497
|
+
findings.push({
|
|
498
|
+
severity: 'warning',
|
|
499
|
+
priority: 'medium',
|
|
500
|
+
category: 'test',
|
|
501
|
+
title: 'Package tests not detected',
|
|
502
|
+
detail: `Source changed in package(s) ${missingPackageTests.join(', ')}, but no matching package test file changed in this diff.`,
|
|
503
|
+
});
|
|
504
|
+
};
|
|
505
|
+
const createDevChangeFindings = (summary, diffHunks, options) => {
|
|
506
|
+
const findings = [];
|
|
507
|
+
if (options.includeSummary) {
|
|
508
|
+
findings.push({
|
|
509
|
+
severity: 'info',
|
|
510
|
+
priority: 'low',
|
|
511
|
+
category: 'summary',
|
|
512
|
+
title: 'Change size',
|
|
513
|
+
detail: `${summary.files.length} file(s), +${summary.additions}/-${summary.deletions}.`,
|
|
514
|
+
});
|
|
515
|
+
}
|
|
516
|
+
if (options.includeUntracked && summary.untrackedFiles.length > 0) {
|
|
517
|
+
findings.push({
|
|
518
|
+
severity: 'warning',
|
|
519
|
+
priority: 'medium',
|
|
520
|
+
category: 'git',
|
|
521
|
+
title: 'Untracked files detected',
|
|
522
|
+
detail: `${summary.untrackedFiles.length} untracked file(s) are listed by name only; stage them to include full diff context.`,
|
|
523
|
+
});
|
|
524
|
+
}
|
|
525
|
+
if (summary.files.some((file) => file.startsWith('packages/') && file.includes('/src/')) &&
|
|
526
|
+
!summary.files.some((file) => file.includes('.test.') || file.includes('.spec.'))) {
|
|
527
|
+
findings.push({
|
|
528
|
+
severity: 'warning',
|
|
529
|
+
priority: 'medium',
|
|
530
|
+
category: 'test',
|
|
531
|
+
title: 'Tests not detected',
|
|
532
|
+
detail: 'Source files changed, but no test file changed in this diff.',
|
|
533
|
+
});
|
|
534
|
+
}
|
|
535
|
+
if (summary.files.some((file) => file.endsWith('package.json') || file.endsWith('pnpm-lock.yaml'))) {
|
|
536
|
+
findings.push({
|
|
537
|
+
severity: 'warning',
|
|
538
|
+
priority: 'medium',
|
|
539
|
+
category: 'dependency',
|
|
540
|
+
title: 'Dependency metadata changed',
|
|
541
|
+
detail: 'Run a frozen install, build, and tests before merging.',
|
|
542
|
+
});
|
|
543
|
+
}
|
|
544
|
+
addDependencyConsistencyFindings(findings, summary.files);
|
|
545
|
+
addPackageTestCoverageFindings(findings, summary.files);
|
|
546
|
+
addGeneratedArtifactFindings(findings, summary.files);
|
|
547
|
+
addDiffHeuristicFindings(findings, diffHunks);
|
|
548
|
+
return findings;
|
|
549
|
+
};
|
|
550
|
+
export const previewDevCommit = (commandRunner, options = {}) => {
|
|
551
|
+
const summary = getStagedSummary(commandRunner, options.cwd);
|
|
552
|
+
if (summary.files.length === 0) {
|
|
553
|
+
throw new ZaoWuError({
|
|
554
|
+
code: 'NO_STAGED_CHANGES',
|
|
555
|
+
message: 'No staged changes found.',
|
|
556
|
+
why: '`zw dev commit` reads staged Git changes by default and does not modify Git state.',
|
|
557
|
+
fix: 'Run `git add <files>` and try again, or use `zw dev review` for unstaged changes.',
|
|
558
|
+
});
|
|
559
|
+
}
|
|
560
|
+
const diffHunks = getReviewDiffHunks(commandRunner, 'staged', options.cwd);
|
|
561
|
+
const suggestion = createCommitSuggestion(summary);
|
|
562
|
+
return {
|
|
563
|
+
schemaVersion: DEV_COMMIT_SCHEMA_VERSION,
|
|
564
|
+
status: 'ok',
|
|
565
|
+
source: 'staged',
|
|
566
|
+
summary,
|
|
567
|
+
suggestion,
|
|
568
|
+
message: suggestion.title,
|
|
569
|
+
findings: createDevChangeFindings(summary, diffHunks, {
|
|
570
|
+
includeSummary: false,
|
|
571
|
+
includeUntracked: false,
|
|
572
|
+
}),
|
|
573
|
+
recommendedChecks: getRecommendedChecks(summary),
|
|
574
|
+
};
|
|
575
|
+
};
|
|
576
|
+
export const getDevStatus = (commandRunner, options = {}) => {
|
|
577
|
+
const output = runGit(commandRunner, ['status', '--short', '--branch'], options.cwd);
|
|
578
|
+
const lines = output.split(/\r?\n/).filter(Boolean);
|
|
579
|
+
const firstLine = lines[0] ?? '';
|
|
580
|
+
const branch = /^##\s+(.+?)(?:\.{3}.+)?$/.exec(firstLine)?.[1].replace(/\s+\[.+\]$/, '') ?? 'unknown';
|
|
581
|
+
const ahead = Number.parseInt(/\bahead\s+(\d+)/.exec(firstLine)?.[1] ?? '0', 10) || 0;
|
|
582
|
+
const behind = Number.parseInt(/\bbehind\s+(\d+)/.exec(firstLine)?.[1] ?? '0', 10) || 0;
|
|
583
|
+
const staged = [];
|
|
584
|
+
const unstaged = [];
|
|
585
|
+
const untracked = [];
|
|
586
|
+
for (const line of lines.slice(firstLine.startsWith('##') ? 1 : 0)) {
|
|
587
|
+
const indexStatus = line[0] ?? ' ';
|
|
588
|
+
const worktreeStatus = line[1] ?? ' ';
|
|
589
|
+
let file = line.slice(3).trim();
|
|
590
|
+
if (file.includes(' -> ')) {
|
|
591
|
+
const parts = file.split(' -> ');
|
|
592
|
+
file = parts[parts.length - 1].trim();
|
|
593
|
+
}
|
|
594
|
+
if (file.startsWith('"') && file.endsWith('"')) {
|
|
595
|
+
file = file.slice(1, -1);
|
|
596
|
+
}
|
|
597
|
+
if (!file) {
|
|
598
|
+
continue;
|
|
599
|
+
}
|
|
600
|
+
if (indexStatus === '?' && worktreeStatus === '?') {
|
|
601
|
+
untracked.push(file);
|
|
602
|
+
continue;
|
|
603
|
+
}
|
|
604
|
+
if (indexStatus !== ' ') {
|
|
605
|
+
staged.push(file);
|
|
606
|
+
}
|
|
607
|
+
if (worktreeStatus !== ' ') {
|
|
608
|
+
unstaged.push(file);
|
|
609
|
+
}
|
|
610
|
+
}
|
|
611
|
+
return {
|
|
612
|
+
schemaVersion: DEV_STATUS_SCHEMA_VERSION,
|
|
613
|
+
status: 'ok',
|
|
614
|
+
branch,
|
|
615
|
+
clean: staged.length === 0 && unstaged.length === 0 && untracked.length === 0,
|
|
616
|
+
ahead,
|
|
617
|
+
behind,
|
|
618
|
+
staged,
|
|
619
|
+
unstaged,
|
|
620
|
+
untracked,
|
|
621
|
+
};
|
|
622
|
+
};
|
|
623
|
+
export const reviewDevChanges = (commandRunner, options = {}) => {
|
|
624
|
+
let source = 'staged';
|
|
625
|
+
let summary = options.mode === 'worktree'
|
|
626
|
+
? getWorkingTreeSummary(commandRunner, options.cwd)
|
|
627
|
+
: getStagedSummary(commandRunner, options.cwd);
|
|
628
|
+
if (options.mode === 'worktree') {
|
|
629
|
+
source = 'working-tree';
|
|
630
|
+
}
|
|
631
|
+
if (summary.files.length === 0 && (!options.mode || options.mode === 'auto')) {
|
|
632
|
+
source = 'working-tree';
|
|
633
|
+
summary = getWorkingTreeSummary(commandRunner, options.cwd);
|
|
634
|
+
}
|
|
635
|
+
if (summary.files.length === 0) {
|
|
636
|
+
const sourceDescription = options.mode === 'staged'
|
|
637
|
+
? 'staged changes'
|
|
638
|
+
: options.mode === 'worktree'
|
|
639
|
+
? 'working-tree changes'
|
|
640
|
+
: 'staged or working-tree changes';
|
|
641
|
+
throw new ZaoWuError({
|
|
642
|
+
code: 'NO_CHANGES_TO_REVIEW',
|
|
643
|
+
message: 'No changes found to review.',
|
|
644
|
+
why: `ZaoWu could not find ${sourceDescription}.`,
|
|
645
|
+
fix: 'Change files or stage changes before running `zw dev review`.',
|
|
646
|
+
});
|
|
647
|
+
}
|
|
648
|
+
const diffHunks = getReviewDiffHunks(commandRunner, source, options.cwd);
|
|
649
|
+
const findings = createDevChangeFindings(summary, diffHunks, {
|
|
650
|
+
includeSummary: true,
|
|
651
|
+
includeUntracked: true,
|
|
652
|
+
});
|
|
653
|
+
return {
|
|
654
|
+
schemaVersion: DEV_REVIEW_SCHEMA_VERSION,
|
|
655
|
+
status: 'ok',
|
|
656
|
+
source,
|
|
657
|
+
summary,
|
|
658
|
+
diffHunks: toPublicDiffHunks(diffHunks),
|
|
659
|
+
findings,
|
|
660
|
+
recommendedChecks: getRecommendedChecks(summary),
|
|
661
|
+
};
|
|
662
|
+
};
|
|
663
|
+
export const syncDevRepo = (commandRunner, options = {}) => syncDevRepoInternal(commandRunner, options, getDevStatus);
|
|
664
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/sync.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { DevCommandRunner, DevStatusResult, DevSyncResult } from './contracts.js';
|
|
2
|
+
export interface DevSyncOptions {
|
|
3
|
+
cwd?: string;
|
|
4
|
+
yes?: boolean;
|
|
5
|
+
discardLocal?: boolean;
|
|
6
|
+
}
|
|
7
|
+
export declare const syncDevRepoInternal: (commandRunner: DevCommandRunner, options: DevSyncOptions, getStatus: (runner: DevCommandRunner, options: {
|
|
8
|
+
cwd?: string;
|
|
9
|
+
}) => DevStatusResult) => DevSyncResult;
|
|
10
|
+
//# sourceMappingURL=sync.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../src/sync.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAEvF,MAAM,WAAW,cAAc;IAC7B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAqBD,eAAO,MAAM,mBAAmB,GAC9B,eAAe,gBAAgB,EAC/B,SAAS,cAAc,EACvB,WAAW,CAAC,MAAM,EAAE,gBAAgB,EAAE,OAAO,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,KAAK,eAAe,KAClF,aAgGF,CAAC"}
|
package/dist/sync.js
ADDED
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { createOperationPlan, hashOperationContent, ZaoWuError } from '@zaowu-labs/core';
|
|
2
|
+
const runGit = (runner, args, cwd) => {
|
|
3
|
+
try {
|
|
4
|
+
return runner('git', args, { cwd });
|
|
5
|
+
}
|
|
6
|
+
catch {
|
|
7
|
+
throw new ZaoWuError({
|
|
8
|
+
code: 'GIT_COMMAND_FAILED',
|
|
9
|
+
message: 'Git command failed.',
|
|
10
|
+
why: `ZaoWu could not execute: git ${args.join(' ')}`,
|
|
11
|
+
fix: 'Ensure Git is installed, the current directory is a Git repository, and the command succeeds manually.',
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
};
|
|
15
|
+
const getDiscardRisks = (status) => [
|
|
16
|
+
...(status.staged.length > 0 ? [`${status.staged.length} staged file(s)`] : []),
|
|
17
|
+
...(status.unstaged.length > 0 ? [`${status.unstaged.length} unstaged file(s)`] : []),
|
|
18
|
+
...(status.ahead > 0 ? [`${status.ahead} local commit(s) ahead of origin/${status.branch}`] : []),
|
|
19
|
+
];
|
|
20
|
+
export const syncDevRepoInternal = (commandRunner, options, getStatus) => {
|
|
21
|
+
const status = getStatus(commandRunner, options);
|
|
22
|
+
if (status.branch === 'unknown') {
|
|
23
|
+
throw new ZaoWuError({
|
|
24
|
+
code: 'GIT_COMMAND_FAILED',
|
|
25
|
+
message: 'Could not determine current branch.',
|
|
26
|
+
why: 'ZaoWu tried to read the current Git branch, but it is not a valid branch (possibly detached HEAD).',
|
|
27
|
+
fix: 'Switch to a valid branch (e.g., `git checkout main`) and try again.',
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
const previousCommit = runGit(commandRunner, ['rev-parse', 'HEAD'], options.cwd).trim();
|
|
31
|
+
const discardRisks = getDiscardRisks(status);
|
|
32
|
+
const hasDiscardRisk = discardRisks.length > 0;
|
|
33
|
+
const statusFingerprint = hashOperationContent(JSON.stringify({
|
|
34
|
+
branch: status.branch,
|
|
35
|
+
head: previousCommit,
|
|
36
|
+
staged: status.staged,
|
|
37
|
+
unstaged: status.unstaged,
|
|
38
|
+
untracked: status.untracked,
|
|
39
|
+
ahead: status.ahead,
|
|
40
|
+
}));
|
|
41
|
+
const operationPlan = createOperationPlan({
|
|
42
|
+
risk: 'high',
|
|
43
|
+
confirmationRequired: !options.yes,
|
|
44
|
+
subjects: [
|
|
45
|
+
`git:${status.branch}`,
|
|
46
|
+
`git-head:${previousCommit}`,
|
|
47
|
+
`git-status-sha256:${statusFingerprint}`,
|
|
48
|
+
`git-discard-risk:${hasDiscardRisk ? 'yes' : 'no'}`,
|
|
49
|
+
],
|
|
50
|
+
reads: ['current Git branch', 'current HEAD commit', 'current Git status'],
|
|
51
|
+
executes: ['git fetch origin', `git reset --hard origin/${status.branch}`],
|
|
52
|
+
network: ['git remote origin'],
|
|
53
|
+
notes: [
|
|
54
|
+
`This command will fetch remote updates and hard-reset your local \`${status.branch}\` branch to \`origin/${status.branch}\`.`,
|
|
55
|
+
'WARNING: Any local uncommitted changes or diverged local commits will be discarded.',
|
|
56
|
+
...(hasDiscardRisk
|
|
57
|
+
? [
|
|
58
|
+
`Local discard risk: ${discardRisks.join(', ')}.`,
|
|
59
|
+
'Confirmed sync requires both --yes and --discard-local while local discard risk is present.',
|
|
60
|
+
]
|
|
61
|
+
: ['No tracked local changes or local ahead commits detected.']),
|
|
62
|
+
...(status.untracked.length > 0
|
|
63
|
+
? [
|
|
64
|
+
`Untracked files detected: ${status.untracked.length}; git reset --hard will not delete them.`,
|
|
65
|
+
]
|
|
66
|
+
: []),
|
|
67
|
+
],
|
|
68
|
+
});
|
|
69
|
+
if (!options.yes) {
|
|
70
|
+
return {
|
|
71
|
+
schemaVersion: 1,
|
|
72
|
+
status: 'preview',
|
|
73
|
+
branch: status.branch,
|
|
74
|
+
previousCommit,
|
|
75
|
+
currentCommit: previousCommit,
|
|
76
|
+
output: hasDiscardRisk
|
|
77
|
+
? `Preview: ZaoWu will run \`git fetch origin\` and \`git reset --hard origin/${status.branch}\`. Re-run with --yes --discard-local only if the local discard risk is acceptable.`
|
|
78
|
+
: `Preview: ZaoWu will run \`git fetch origin\` and \`git reset --hard origin/${status.branch}\`.`,
|
|
79
|
+
operationPlan,
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
if (hasDiscardRisk && !options.discardLocal) {
|
|
83
|
+
throw new ZaoWuError({
|
|
84
|
+
code: 'GIT_SYNC_DISCARD_CONFIRMATION_REQUIRED',
|
|
85
|
+
message: 'Local Git changes require explicit discard confirmation.',
|
|
86
|
+
why: `ZaoWu found local state that would be discarded by the hard reset: ${discardRisks.join(', ')}.`,
|
|
87
|
+
fix: 'Review the preview output. If discarding that local state is intended, re-run with `--yes --discard-local --plan-fingerprint <hash>`.',
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
runGit(commandRunner, ['fetch', 'origin'], options.cwd);
|
|
91
|
+
try {
|
|
92
|
+
runGit(commandRunner, ['reset', '--hard', `origin/${status.branch}`], options.cwd);
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
throw new ZaoWuError({
|
|
96
|
+
code: 'GIT_COMMAND_FAILED',
|
|
97
|
+
message: 'Git reset failed.',
|
|
98
|
+
why: `ZaoWu ran \`git reset --hard origin/${status.branch}\`, but origin/${status.branch} does not exist or fetch failed.`,
|
|
99
|
+
fix: `Verify the remote branch origin/${status.branch} exists and you have internet access.`,
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
const currentCommit = runGit(commandRunner, ['rev-parse', 'HEAD'], options.cwd).trim();
|
|
103
|
+
return {
|
|
104
|
+
schemaVersion: 1,
|
|
105
|
+
status: 'ok',
|
|
106
|
+
branch: status.branch,
|
|
107
|
+
previousCommit,
|
|
108
|
+
currentCommit,
|
|
109
|
+
output: `Successfully synchronized branch \`${status.branch}\` to \`origin/${status.branch}\`.`,
|
|
110
|
+
operationPlan,
|
|
111
|
+
};
|
|
112
|
+
};
|
|
113
|
+
//# sourceMappingURL=sync.js.map
|
package/dist/sync.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync.js","sourceRoot":"","sources":["../src/sync.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@zaowu-labs/dev",
|
|
3
|
+
"version": "1.0.1",
|
|
4
|
+
"description": "ZaoWu developer workflows",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"license": "Apache-2.0",
|
|
7
|
+
"publishConfig": {
|
|
8
|
+
"access": "public"
|
|
9
|
+
},
|
|
10
|
+
"files": [
|
|
11
|
+
"dist",
|
|
12
|
+
"README.md"
|
|
13
|
+
],
|
|
14
|
+
"main": "./dist/index.js",
|
|
15
|
+
"types": "./dist/index.d.ts",
|
|
16
|
+
"exports": {
|
|
17
|
+
".": {
|
|
18
|
+
"types": "./dist/index.d.ts",
|
|
19
|
+
"import": "./dist/index.js"
|
|
20
|
+
}
|
|
21
|
+
},
|
|
22
|
+
"scripts": {
|
|
23
|
+
"build": "tsc -b --pretty false",
|
|
24
|
+
"typecheck": "tsc -b --pretty false",
|
|
25
|
+
"dev": "tsc -b --watch"
|
|
26
|
+
},
|
|
27
|
+
"dependencies": {
|
|
28
|
+
"@zaowu-labs/core": "workspace:*"
|
|
29
|
+
},
|
|
30
|
+
"keywords": [
|
|
31
|
+
"zaowu",
|
|
32
|
+
"developer-tools"
|
|
33
|
+
],
|
|
34
|
+
"repository": {
|
|
35
|
+
"type": "git",
|
|
36
|
+
"url": "https://github.com/zaowu-labs/zaowu.git",
|
|
37
|
+
"directory": "packages/dev"
|
|
38
|
+
},
|
|
39
|
+
"homepage": "https://github.com/zaowu-labs/zaowu",
|
|
40
|
+
"bugs": "https://github.com/zaowu-labs/zaowu/issues"
|
|
41
|
+
}
|