@howlil/ez-agents 2.0.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/LICENSE +21 -0
- package/README.md +845 -0
- package/README.zh-CN.md +702 -0
- package/agents/ez-codebase-mapper.md +770 -0
- package/agents/ez-debugger.md +1255 -0
- package/agents/ez-executor.md +487 -0
- package/agents/ez-integration-checker.md +443 -0
- package/agents/ez-nyquist-auditor.md +176 -0
- package/agents/ez-phase-researcher.md +553 -0
- package/agents/ez-plan-checker.md +706 -0
- package/agents/ez-planner.md +1307 -0
- package/agents/ez-project-researcher.md +629 -0
- package/agents/ez-research-synthesizer.md +247 -0
- package/agents/ez-roadmapper.md +650 -0
- package/agents/ez-ui-auditor.md +441 -0
- package/agents/ez-ui-checker.md +302 -0
- package/agents/ez-ui-researcher.md +355 -0
- package/agents/ez-verifier.md +579 -0
- package/bin/install.js +2862 -0
- package/bin/update.js +214 -0
- package/commands/ez/add-phase.md +43 -0
- package/commands/ez/add-tests.md +41 -0
- package/commands/ez/add-todo.md +47 -0
- package/commands/ez/audit-milestone.md +36 -0
- package/commands/ez/autonomous.md +41 -0
- package/commands/ez/check-todos.md +45 -0
- package/commands/ez/cleanup.md +18 -0
- package/commands/ez/complete-milestone.md +136 -0
- package/commands/ez/debug.md +168 -0
- package/commands/ez/discuss-phase.md +90 -0
- package/commands/ez/execute-phase.md +41 -0
- package/commands/ez/health.md +22 -0
- package/commands/ez/help.md +22 -0
- package/commands/ez/insert-phase.md +32 -0
- package/commands/ez/join-discord.md +18 -0
- package/commands/ez/list-phase-assumptions.md +46 -0
- package/commands/ez/map-codebase.md +71 -0
- package/commands/ez/new-milestone.md +44 -0
- package/commands/ez/new-project.md +42 -0
- package/commands/ez/pause-work.md +38 -0
- package/commands/ez/plan-milestone-gaps.md +34 -0
- package/commands/ez/plan-phase.md +45 -0
- package/commands/ez/progress.md +24 -0
- package/commands/ez/quick.md +45 -0
- package/commands/ez/reapply-patches.md +124 -0
- package/commands/ez/remove-phase.md +31 -0
- package/commands/ez/research-phase.md +190 -0
- package/commands/ez/resume-work.md +40 -0
- package/commands/ez/set-profile.md +34 -0
- package/commands/ez/settings.md +36 -0
- package/commands/ez/stats.md +18 -0
- package/commands/ez/ui-phase.md +34 -0
- package/commands/ez/ui-review.md +32 -0
- package/commands/ez/update.md +37 -0
- package/commands/ez/validate-phase.md +35 -0
- package/commands/ez/verify-work.md +38 -0
- package/get-shit-done/bin/ez-tools.cjs +598 -0
- package/get-shit-done/bin/lib/assistant-adapter.cjs +205 -0
- package/get-shit-done/bin/lib/audit-exec.cjs +150 -0
- package/get-shit-done/bin/lib/auth.cjs +175 -0
- package/get-shit-done/bin/lib/circuit-breaker.cjs +118 -0
- package/get-shit-done/bin/lib/commands.cjs +666 -0
- package/get-shit-done/bin/lib/config.cjs +183 -0
- package/get-shit-done/bin/lib/core.cjs +495 -0
- package/get-shit-done/bin/lib/file-lock.cjs +236 -0
- package/get-shit-done/bin/lib/frontmatter.cjs +299 -0
- package/get-shit-done/bin/lib/fs-utils.cjs +153 -0
- package/get-shit-done/bin/lib/git-utils.cjs +203 -0
- package/get-shit-done/bin/lib/health-check.cjs +163 -0
- package/get-shit-done/bin/lib/index.cjs +113 -0
- package/get-shit-done/bin/lib/init.cjs +710 -0
- package/get-shit-done/bin/lib/logger.cjs +117 -0
- package/get-shit-done/bin/lib/milestone.cjs +241 -0
- package/get-shit-done/bin/lib/model-provider.cjs +146 -0
- package/get-shit-done/bin/lib/phase.cjs +908 -0
- package/get-shit-done/bin/lib/retry.cjs +119 -0
- package/get-shit-done/bin/lib/roadmap.cjs +305 -0
- package/get-shit-done/bin/lib/safe-exec.cjs +128 -0
- package/get-shit-done/bin/lib/safe-path.cjs +130 -0
- package/get-shit-done/bin/lib/state.cjs +721 -0
- package/get-shit-done/bin/lib/temp-file.cjs +239 -0
- package/get-shit-done/bin/lib/template.cjs +222 -0
- package/get-shit-done/bin/lib/test-file-lock.cjs +112 -0
- package/get-shit-done/bin/lib/test-graceful.cjs +93 -0
- package/get-shit-done/bin/lib/test-logger.cjs +60 -0
- package/get-shit-done/bin/lib/test-safe-exec.cjs +38 -0
- package/get-shit-done/bin/lib/test-safe-path.cjs +33 -0
- package/get-shit-done/bin/lib/test-temp-file.cjs +125 -0
- package/get-shit-done/bin/lib/timeout-exec.cjs +62 -0
- package/get-shit-done/bin/lib/verify.cjs +820 -0
- package/get-shit-done/references/checkpoints.md +776 -0
- package/get-shit-done/references/continuation-format.md +249 -0
- package/get-shit-done/references/decimal-phase-calculation.md +65 -0
- package/get-shit-done/references/git-integration.md +248 -0
- package/get-shit-done/references/git-planning-commit.md +38 -0
- package/get-shit-done/references/model-profile-resolution.md +34 -0
- package/get-shit-done/references/model-profiles.md +93 -0
- package/get-shit-done/references/phase-argument-parsing.md +61 -0
- package/get-shit-done/references/planning-config.md +200 -0
- package/get-shit-done/references/questioning.md +162 -0
- package/get-shit-done/references/tdd.md +263 -0
- package/get-shit-done/references/ui-brand.md +160 -0
- package/get-shit-done/references/verification-patterns.md +612 -0
- package/get-shit-done/templates/DEBUG.md +164 -0
- package/get-shit-done/templates/UAT.md +247 -0
- package/get-shit-done/templates/UI-SPEC.md +100 -0
- package/get-shit-done/templates/VALIDATION.md +76 -0
- package/get-shit-done/templates/codebase/architecture.md +255 -0
- package/get-shit-done/templates/codebase/concerns.md +310 -0
- package/get-shit-done/templates/codebase/conventions.md +307 -0
- package/get-shit-done/templates/codebase/integrations.md +280 -0
- package/get-shit-done/templates/codebase/stack.md +186 -0
- package/get-shit-done/templates/codebase/structure.md +285 -0
- package/get-shit-done/templates/codebase/testing.md +480 -0
- package/get-shit-done/templates/config.json +37 -0
- package/get-shit-done/templates/context.md +352 -0
- package/get-shit-done/templates/continue-here.md +78 -0
- package/get-shit-done/templates/copilot-instructions.md +7 -0
- package/get-shit-done/templates/debug-subagent-prompt.md +91 -0
- package/get-shit-done/templates/discovery.md +146 -0
- package/get-shit-done/templates/milestone-archive.md +123 -0
- package/get-shit-done/templates/milestone.md +115 -0
- package/get-shit-done/templates/phase-prompt.md +610 -0
- package/get-shit-done/templates/planner-subagent-prompt.md +117 -0
- package/get-shit-done/templates/project.md +184 -0
- package/get-shit-done/templates/requirements.md +231 -0
- package/get-shit-done/templates/research-project/ARCHITECTURE.md +204 -0
- package/get-shit-done/templates/research-project/FEATURES.md +147 -0
- package/get-shit-done/templates/research-project/PITFALLS.md +200 -0
- package/get-shit-done/templates/research-project/STACK.md +120 -0
- package/get-shit-done/templates/research-project/SUMMARY.md +170 -0
- package/get-shit-done/templates/research.md +552 -0
- package/get-shit-done/templates/retrospective.md +54 -0
- package/get-shit-done/templates/roadmap.md +202 -0
- package/get-shit-done/templates/state.md +176 -0
- package/get-shit-done/templates/summary-complex.md +59 -0
- package/get-shit-done/templates/summary-minimal.md +41 -0
- package/get-shit-done/templates/summary-standard.md +48 -0
- package/get-shit-done/templates/summary.md +248 -0
- package/get-shit-done/templates/user-setup.md +311 -0
- package/get-shit-done/templates/verification-report.md +322 -0
- package/get-shit-done/workflows/add-phase.md +112 -0
- package/get-shit-done/workflows/add-tests.md +351 -0
- package/get-shit-done/workflows/add-todo.md +158 -0
- package/get-shit-done/workflows/audit-milestone.md +332 -0
- package/get-shit-done/workflows/autonomous.md +743 -0
- package/get-shit-done/workflows/check-todos.md +177 -0
- package/get-shit-done/workflows/cleanup.md +152 -0
- package/get-shit-done/workflows/complete-milestone.md +766 -0
- package/get-shit-done/workflows/diagnose-issues.md +219 -0
- package/get-shit-done/workflows/discovery-phase.md +289 -0
- package/get-shit-done/workflows/discuss-phase.md +762 -0
- package/get-shit-done/workflows/execute-phase.md +468 -0
- package/get-shit-done/workflows/execute-plan.md +483 -0
- package/get-shit-done/workflows/health.md +159 -0
- package/get-shit-done/workflows/help.md +492 -0
- package/get-shit-done/workflows/insert-phase.md +130 -0
- package/get-shit-done/workflows/list-phase-assumptions.md +178 -0
- package/get-shit-done/workflows/map-codebase.md +316 -0
- package/get-shit-done/workflows/new-milestone.md +384 -0
- package/get-shit-done/workflows/new-project.md +1111 -0
- package/get-shit-done/workflows/node-repair.md +92 -0
- package/get-shit-done/workflows/pause-work.md +122 -0
- package/get-shit-done/workflows/plan-milestone-gaps.md +274 -0
- package/get-shit-done/workflows/plan-phase.md +651 -0
- package/get-shit-done/workflows/progress.md +382 -0
- package/get-shit-done/workflows/quick.md +610 -0
- package/get-shit-done/workflows/remove-phase.md +155 -0
- package/get-shit-done/workflows/research-phase.md +74 -0
- package/get-shit-done/workflows/resume-project.md +307 -0
- package/get-shit-done/workflows/set-profile.md +81 -0
- package/get-shit-done/workflows/settings.md +242 -0
- package/get-shit-done/workflows/stats.md +57 -0
- package/get-shit-done/workflows/transition.md +544 -0
- package/get-shit-done/workflows/ui-phase.md +290 -0
- package/get-shit-done/workflows/ui-review.md +157 -0
- package/get-shit-done/workflows/update.md +320 -0
- package/get-shit-done/workflows/validate-phase.md +167 -0
- package/get-shit-done/workflows/verify-phase.md +243 -0
- package/get-shit-done/workflows/verify-work.md +584 -0
- package/package.json +55 -0
- package/scripts/build-hooks.js +43 -0
- package/scripts/run-tests.cjs +29 -0
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* GSD Git Utils — Safe git operations with atomic commits
|
|
5
|
+
*
|
|
6
|
+
* Provides:
|
|
7
|
+
* - Atomic commits with validation
|
|
8
|
+
* - Branch creation and management
|
|
9
|
+
* - Safe git operations using execFile
|
|
10
|
+
* - Error handling with recovery suggestions
|
|
11
|
+
*
|
|
12
|
+
* Usage:
|
|
13
|
+
* const GitUtils = require('./git-utils.cjs');
|
|
14
|
+
* const git = new GitUtils(process.cwd());
|
|
15
|
+
* await git.commitAtomic('feat: add feature', ['file1.js']);
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
const { execFile } = require('child_process');
|
|
19
|
+
const { promisify } = require('util');
|
|
20
|
+
const execFileAsync = promisify(execFile);
|
|
21
|
+
const Logger = require('./logger.cjs');
|
|
22
|
+
const logger = new Logger();
|
|
23
|
+
|
|
24
|
+
class GitUtils {
|
|
25
|
+
constructor(cwd) {
|
|
26
|
+
this.cwd = cwd || process.cwd();
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Execute git command safely
|
|
31
|
+
*/
|
|
32
|
+
async exec(args, options = {}) {
|
|
33
|
+
const { timeout = 30000 } = options;
|
|
34
|
+
|
|
35
|
+
try {
|
|
36
|
+
const { stdout, stderr } = await execFileAsync('git', args, {
|
|
37
|
+
cwd: this.cwd,
|
|
38
|
+
encoding: 'utf-8',
|
|
39
|
+
timeout,
|
|
40
|
+
maxBuffer: 10 * 1024 * 1024
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
logger.debug('Git command executed', { args, stdout_length: stdout?.length });
|
|
44
|
+
|
|
45
|
+
return { stdout: stdout?.trim(), stderr: stderr?.trim() };
|
|
46
|
+
} catch (err) {
|
|
47
|
+
logger.error('Git command failed', { args, error: err.message });
|
|
48
|
+
throw err;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Check if directory is a git repo
|
|
54
|
+
*/
|
|
55
|
+
async isGitRepo() {
|
|
56
|
+
try {
|
|
57
|
+
await this.exec(['rev-parse', '--git-dir']);
|
|
58
|
+
return true;
|
|
59
|
+
} catch {
|
|
60
|
+
return false;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Get current branch name
|
|
66
|
+
*/
|
|
67
|
+
async getCurrentBranch() {
|
|
68
|
+
const { stdout } = await this.exec(['rev-parse', '--abbrev-ref', 'HEAD']);
|
|
69
|
+
return stdout;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Get git status (porcelain format)
|
|
74
|
+
*/
|
|
75
|
+
async getStatus() {
|
|
76
|
+
const { stdout } = await this.exec(['status', '--porcelain']);
|
|
77
|
+
return stdout.split('\n').filter(line => line.trim());
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Check if there are uncommitted changes
|
|
82
|
+
*/
|
|
83
|
+
async hasChanges() {
|
|
84
|
+
const status = await this.getStatus();
|
|
85
|
+
return status.length > 0;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* Stage files for commit
|
|
90
|
+
*/
|
|
91
|
+
async add(files) {
|
|
92
|
+
if (!Array.isArray(files)) files = [files];
|
|
93
|
+
await this.exec(['add', ...files]);
|
|
94
|
+
logger.info('Files staged', { files });
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Add all changes
|
|
99
|
+
*/
|
|
100
|
+
async addAll() {
|
|
101
|
+
await this.exec(['add', '-A']);
|
|
102
|
+
logger.info('All files staged');
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Create atomic commit with validation
|
|
107
|
+
*/
|
|
108
|
+
async commitAtomic(message, files = []) {
|
|
109
|
+
// Stage files if provided
|
|
110
|
+
if (files.length > 0) {
|
|
111
|
+
await this.add(files);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
// Validate commit message format (conventional commits)
|
|
115
|
+
const conventionalPattern = /^(feat|fix|docs|chore|test|refactor|style|perf)(\([^)]+\))?:\s.+/;
|
|
116
|
+
if (!conventionalPattern.test(message)) {
|
|
117
|
+
logger.warn('Commit message may not follow conventional commits', { message });
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
// Create commit
|
|
121
|
+
await this.exec(['commit', '-m', message]);
|
|
122
|
+
|
|
123
|
+
// Get commit hash
|
|
124
|
+
const { stdout } = await this.exec(['rev-parse', '--short', 'HEAD']);
|
|
125
|
+
|
|
126
|
+
logger.info('Commit created', { hash: stdout, message });
|
|
127
|
+
|
|
128
|
+
return stdout;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* Create new branch
|
|
133
|
+
*/
|
|
134
|
+
async createBranch(name, from = 'HEAD') {
|
|
135
|
+
await this.exec(['checkout', '-b', name, from]);
|
|
136
|
+
logger.info('Branch created', { name, from });
|
|
137
|
+
return name;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* Switch to branch
|
|
142
|
+
*/
|
|
143
|
+
async checkout(branch) {
|
|
144
|
+
await this.exec(['checkout', branch]);
|
|
145
|
+
logger.info('Checked out branch', { branch });
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
/**
|
|
149
|
+
* Merge branch
|
|
150
|
+
*/
|
|
151
|
+
async mergeBranch(branch, squash = false) {
|
|
152
|
+
const args = squash ? ['merge', '--squash', branch] : ['merge', branch];
|
|
153
|
+
await this.exec(args);
|
|
154
|
+
logger.info('Branch merged', { branch, squash });
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/**
|
|
158
|
+
* Create tag
|
|
159
|
+
*/
|
|
160
|
+
async tagRelease(version, message = '') {
|
|
161
|
+
const args = ['-a', version, '-m', message || `Release ${version}`];
|
|
162
|
+
await this.exec(['tag', ...args]);
|
|
163
|
+
logger.info('Tag created', { version });
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
/**
|
|
167
|
+
* Push to remote
|
|
168
|
+
*/
|
|
169
|
+
async push(remote = 'origin', branch = null) {
|
|
170
|
+
const args = ['push', remote];
|
|
171
|
+
if (branch) args.push(branch);
|
|
172
|
+
await this.exec(args);
|
|
173
|
+
logger.info('Pushed to remote', { remote, branch });
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
/**
|
|
177
|
+
* Pull from remote
|
|
178
|
+
*/
|
|
179
|
+
async pull(remote = 'origin', branch = null) {
|
|
180
|
+
const args = ['pull', remote];
|
|
181
|
+
if (branch) args.push(branch);
|
|
182
|
+
await this.exec(args);
|
|
183
|
+
logger.info('Pulled from remote', { remote, branch });
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
/**
|
|
187
|
+
* Get recent commits
|
|
188
|
+
*/
|
|
189
|
+
async getCommits(count = 5) {
|
|
190
|
+
const { stdout } = await this.exec(['log', `-n${count}`, '--oneline']);
|
|
191
|
+
return stdout.split('\n');
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
/**
|
|
195
|
+
* Get diff between commits/branches
|
|
196
|
+
*/
|
|
197
|
+
async getDiff(from, to = 'HEAD') {
|
|
198
|
+
const { stdout } = await this.exec(['diff', `${from}..${to}`, '--stat']);
|
|
199
|
+
return stdout;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
module.exports = GitUtils;
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* GSD Health Check — Health monitoring for GSD workflow
|
|
5
|
+
*
|
|
6
|
+
* Validates GSD environment and configuration
|
|
7
|
+
* Used by workflows to detect failures and use fallback functions
|
|
8
|
+
*
|
|
9
|
+
* Usage:
|
|
10
|
+
* const HealthCheck = require('./health-check.cjs');
|
|
11
|
+
* const health = new HealthCheck();
|
|
12
|
+
* const result = health.runAll();
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
const fs = require('fs');
|
|
16
|
+
const path = require('path');
|
|
17
|
+
const { execSync } = require('child_process');
|
|
18
|
+
|
|
19
|
+
class HealthCheck {
|
|
20
|
+
/**
|
|
21
|
+
* Create a HealthCheck instance
|
|
22
|
+
*/
|
|
23
|
+
constructor() {
|
|
24
|
+
this.issues = [];
|
|
25
|
+
this.warnings = [];
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Check Node.js version (must be >= 16)
|
|
30
|
+
* @returns {boolean} - True if version is acceptable
|
|
31
|
+
*/
|
|
32
|
+
checkNodeVersion() {
|
|
33
|
+
try {
|
|
34
|
+
const version = process.version;
|
|
35
|
+
const major = parseInt(version.slice(1).split('.')[0]);
|
|
36
|
+
if (major < 16) {
|
|
37
|
+
this.issues.push(`Node.js version ${version} is below required 16.x`);
|
|
38
|
+
return false;
|
|
39
|
+
}
|
|
40
|
+
return true;
|
|
41
|
+
} catch (err) {
|
|
42
|
+
this.issues.push('Cannot determine Node.js version');
|
|
43
|
+
return false;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Check if .planning directory exists
|
|
49
|
+
* @returns {boolean} - True if exists
|
|
50
|
+
*/
|
|
51
|
+
checkPlanningDirectory() {
|
|
52
|
+
const planningDir = '.planning';
|
|
53
|
+
if (!fs.existsSync(planningDir)) {
|
|
54
|
+
this.warnings.push('.planning directory does not exist');
|
|
55
|
+
return false;
|
|
56
|
+
}
|
|
57
|
+
return true;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Check if config.json exists and is valid JSON
|
|
62
|
+
* @returns {boolean} - True if exists and valid
|
|
63
|
+
*/
|
|
64
|
+
checkConfigFile() {
|
|
65
|
+
const configPath = '.planning/config.json';
|
|
66
|
+
if (!fs.existsSync(configPath)) {
|
|
67
|
+
this.warnings.push('config.json not found');
|
|
68
|
+
return false;
|
|
69
|
+
}
|
|
70
|
+
try {
|
|
71
|
+
JSON.parse(fs.readFileSync(configPath, 'utf-8'));
|
|
72
|
+
return true;
|
|
73
|
+
} catch (err) {
|
|
74
|
+
this.issues.push('config.json is invalid JSON');
|
|
75
|
+
return false;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* Check if STATE.md exists
|
|
81
|
+
* @returns {boolean} - True if exists
|
|
82
|
+
*/
|
|
83
|
+
checkStateFile() {
|
|
84
|
+
const statePath = '.planning/STATE.md';
|
|
85
|
+
if (!fs.existsSync(statePath)) {
|
|
86
|
+
this.warnings.push('STATE.md not found');
|
|
87
|
+
return false;
|
|
88
|
+
}
|
|
89
|
+
return true;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Check if ROADMAP.md exists
|
|
94
|
+
* @returns {boolean} - True if exists
|
|
95
|
+
*/
|
|
96
|
+
checkRoadmapFile() {
|
|
97
|
+
const roadmapPath = '.planning/ROADMAP.md';
|
|
98
|
+
if (!fs.existsSync(roadmapPath)) {
|
|
99
|
+
this.warnings.push('ROADMAP.md not found');
|
|
100
|
+
return false;
|
|
101
|
+
}
|
|
102
|
+
return true;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Check if PROJECT.md exists
|
|
107
|
+
* @returns {boolean} - True if exists
|
|
108
|
+
*/
|
|
109
|
+
checkProjectFile() {
|
|
110
|
+
const projectPath = '.planning/PROJECT.md';
|
|
111
|
+
if (!fs.existsSync(projectPath)) {
|
|
112
|
+
this.warnings.push('PROJECT.md not found');
|
|
113
|
+
return false;
|
|
114
|
+
}
|
|
115
|
+
return true;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* Check if REQUIREMENTS.md exists
|
|
120
|
+
* @returns {boolean} - True if exists
|
|
121
|
+
*/
|
|
122
|
+
checkRequirementsFile() {
|
|
123
|
+
const reqPath = '.planning/REQUIREMENTS.md';
|
|
124
|
+
if (!fs.existsSync(reqPath)) {
|
|
125
|
+
this.warnings.push('REQUIREMENTS.md not found');
|
|
126
|
+
return false;
|
|
127
|
+
}
|
|
128
|
+
return true;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* Run all health checks
|
|
133
|
+
* @returns {Object} - Health status object
|
|
134
|
+
*/
|
|
135
|
+
runAll() {
|
|
136
|
+
const results = {
|
|
137
|
+
status: 'healthy',
|
|
138
|
+
timestamp: new Date().toISOString(),
|
|
139
|
+
node_version: process.version,
|
|
140
|
+
checks: {
|
|
141
|
+
node_version: this.checkNodeVersion(),
|
|
142
|
+
planning_dir: this.checkPlanningDirectory(),
|
|
143
|
+
config_file: this.checkConfigFile(),
|
|
144
|
+
state_file: this.checkStateFile(),
|
|
145
|
+
roadmap_file: this.checkRoadmapFile(),
|
|
146
|
+
project_file: this.checkProjectFile(),
|
|
147
|
+
requirements_file: this.checkRequirementsFile()
|
|
148
|
+
},
|
|
149
|
+
issues: this.issues,
|
|
150
|
+
warnings: this.warnings
|
|
151
|
+
};
|
|
152
|
+
|
|
153
|
+
if (this.issues.length > 0) {
|
|
154
|
+
results.status = 'unhealthy';
|
|
155
|
+
} else if (this.warnings.length > 0) {
|
|
156
|
+
results.status = 'degraded';
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
return results;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
module.exports = HealthCheck;
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* GSD Lib Index — Central export for all GSD libraries
|
|
5
|
+
*
|
|
6
|
+
* Provides single import point for all utility modules.
|
|
7
|
+
*
|
|
8
|
+
* Usage:
|
|
9
|
+
* const lib = require('./index.cjs');
|
|
10
|
+
* const logger = new lib.Logger();
|
|
11
|
+
* const git = new lib.GitUtils(process.cwd());
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
const path = require('path');
|
|
15
|
+
const fs = require('fs');
|
|
16
|
+
|
|
17
|
+
// Core utilities
|
|
18
|
+
const Logger = require('./logger.cjs');
|
|
19
|
+
const LoggerInstance = new Logger();
|
|
20
|
+
|
|
21
|
+
// File system
|
|
22
|
+
const fsUtils = require('./fs-utils.cjs');
|
|
23
|
+
|
|
24
|
+
// Security
|
|
25
|
+
const safeExec = require('./safe-exec.cjs');
|
|
26
|
+
const safePath = require('./safe-path.cjs');
|
|
27
|
+
const auth = require('./auth.cjs');
|
|
28
|
+
const auditExec = require('./audit-exec.cjs');
|
|
29
|
+
|
|
30
|
+
// Git
|
|
31
|
+
const GitUtils = require('./git-utils.cjs');
|
|
32
|
+
|
|
33
|
+
// Reliability
|
|
34
|
+
const retry = require('./retry.cjs');
|
|
35
|
+
const CircuitBreaker = require('./circuit-breaker.cjs');
|
|
36
|
+
|
|
37
|
+
// Concurrency
|
|
38
|
+
const fileLock = require('./file-lock.cjs');
|
|
39
|
+
const tempFile = require('./temp-file.cjs');
|
|
40
|
+
|
|
41
|
+
// Health & Testing
|
|
42
|
+
const healthCheck = require('./health-check.cjs');
|
|
43
|
+
const timeoutExec = require('./timeout-exec.cjs');
|
|
44
|
+
|
|
45
|
+
// Multi-model
|
|
46
|
+
const modelProvider = require('./model-provider.cjs');
|
|
47
|
+
|
|
48
|
+
// Adapters
|
|
49
|
+
const assistantAdapter = require('./assistant-adapter.cjs');
|
|
50
|
+
|
|
51
|
+
module.exports = {
|
|
52
|
+
// Core
|
|
53
|
+
Logger,
|
|
54
|
+
logger: LoggerInstance,
|
|
55
|
+
|
|
56
|
+
// File system
|
|
57
|
+
...fsUtils,
|
|
58
|
+
|
|
59
|
+
// Security
|
|
60
|
+
...safeExec,
|
|
61
|
+
...safePath,
|
|
62
|
+
...auth,
|
|
63
|
+
...auditExec,
|
|
64
|
+
|
|
65
|
+
// Git
|
|
66
|
+
GitUtils,
|
|
67
|
+
|
|
68
|
+
// Reliability
|
|
69
|
+
...retry,
|
|
70
|
+
CircuitBreaker,
|
|
71
|
+
|
|
72
|
+
// Concurrency
|
|
73
|
+
...fileLock,
|
|
74
|
+
...tempFile,
|
|
75
|
+
|
|
76
|
+
// Health & Testing
|
|
77
|
+
...healthCheck,
|
|
78
|
+
...timeoutExec,
|
|
79
|
+
|
|
80
|
+
// Multi-model
|
|
81
|
+
...modelProvider,
|
|
82
|
+
|
|
83
|
+
// Adapters
|
|
84
|
+
...assistantAdapter,
|
|
85
|
+
|
|
86
|
+
// Version info
|
|
87
|
+
version: '2.0.0',
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Get health status of all modules
|
|
91
|
+
*/
|
|
92
|
+
getHealthStatus() {
|
|
93
|
+
return {
|
|
94
|
+
version: this.version,
|
|
95
|
+
nodeVersion: process.version,
|
|
96
|
+
platform: process.platform,
|
|
97
|
+
modules: {
|
|
98
|
+
logger: 'ok',
|
|
99
|
+
fsUtils: 'ok',
|
|
100
|
+
safeExec: 'ok',
|
|
101
|
+
safePath: 'ok',
|
|
102
|
+
auth: auth.isKeychainAvailable() ? 'keychain' : 'fallback',
|
|
103
|
+
gitUtils: 'ok',
|
|
104
|
+
retry: 'ok',
|
|
105
|
+
circuitBreaker: 'ok',
|
|
106
|
+
fileLock: 'ok',
|
|
107
|
+
tempFile: 'ok',
|
|
108
|
+
modelProvider: 'ok',
|
|
109
|
+
assistantAdapter: 'ok'
|
|
110
|
+
}
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
};
|