kodu 2.1.3 → 2.2.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/__tests__/core/registry/registry.service.test.ts +82 -0
- package/__tests__/shared/runbook/runbook.service.test.ts +104 -0
- package/dist/package.json +1 -1
- package/dist/src/app.module.js +6 -0
- package/dist/src/app.module.js.map +1 -1
- package/dist/src/commands/ops/ops-add.command.d.ts +18 -0
- package/dist/src/commands/ops/ops-add.command.js +102 -0
- package/dist/src/commands/ops/ops-add.command.js.map +1 -0
- package/dist/src/commands/ops/ops-init.command.d.ts +22 -0
- package/dist/src/commands/ops/ops-init.command.js +130 -0
- package/dist/src/commands/ops/ops-init.command.js.map +1 -0
- package/dist/src/commands/ops/ops-list.command.d.ts +12 -0
- package/dist/src/commands/ops/ops-list.command.js +73 -0
- package/dist/src/commands/ops/ops-list.command.js.map +1 -0
- package/dist/src/commands/ops/ops-path.command.d.ts +9 -0
- package/dist/src/commands/ops/ops-path.command.js +52 -0
- package/dist/src/commands/ops/ops-path.command.js.map +1 -0
- package/dist/src/commands/ops/ops-runbook.command.d.ts +12 -0
- package/dist/src/commands/ops/ops-runbook.command.js +81 -0
- package/dist/src/commands/ops/ops-runbook.command.js.map +1 -0
- package/dist/src/commands/ops/ops-status.command.d.ts +11 -0
- package/dist/src/commands/ops/ops-status.command.js +62 -0
- package/dist/src/commands/ops/ops-status.command.js.map +1 -0
- package/dist/src/commands/ops/ops-use.command.d.ts +12 -0
- package/dist/src/commands/ops/ops-use.command.js +76 -0
- package/dist/src/commands/ops/ops-use.command.js.map +1 -0
- package/dist/src/commands/ops/ops.command.d.ts +7 -0
- package/dist/src/commands/ops/ops.command.js +56 -0
- package/dist/src/commands/ops/ops.command.js.map +1 -0
- package/dist/src/commands/ops/ops.helpers.d.ts +2 -0
- package/dist/src/commands/ops/ops.helpers.js +11 -0
- package/dist/src/commands/ops/ops.helpers.js.map +1 -0
- package/dist/src/commands/ops/ops.module.d.ts +2 -0
- package/dist/src/commands/ops/ops.module.js +36 -0
- package/dist/src/commands/ops/ops.module.js.map +1 -0
- package/dist/src/core/registry/registry.module.d.ts +2 -0
- package/dist/src/core/registry/registry.module.js +22 -0
- package/dist/src/core/registry/registry.module.js.map +1 -0
- package/dist/src/core/registry/registry.schema.d.ts +24 -0
- package/dist/src/core/registry/registry.schema.js +21 -0
- package/dist/src/core/registry/registry.schema.js.map +1 -0
- package/dist/src/core/registry/registry.service.d.ts +16 -0
- package/dist/src/core/registry/registry.service.js +91 -0
- package/dist/src/core/registry/registry.service.js.map +1 -0
- package/dist/src/shared/runbook/runbook.module.d.ts +2 -0
- package/dist/src/shared/runbook/runbook.module.js +22 -0
- package/dist/src/shared/runbook/runbook.module.js.map +1 -0
- package/dist/src/shared/runbook/runbook.service.d.ts +20 -0
- package/dist/src/shared/runbook/runbook.service.js +118 -0
- package/dist/src/shared/runbook/runbook.service.js.map +1 -0
- package/dist/src/shared/runbook/runbook.templates.d.ts +6 -0
- package/dist/src/shared/runbook/runbook.templates.js +49 -0
- package/dist/src/shared/runbook/runbook.templates.js.map +1 -0
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/registry.schema.json +39 -0
- package/scripts/generate-json-schema.ts +14 -5
- package/skills/ac/SKILL.md +239 -0
- package/skills/al/SKILL.md +98 -0
- package/skills/audit/SKILL.md +205 -0
- package/skills/audit/audit-baseline-template.yml +188 -0
- package/skills/audit/runtime-detect.md +64 -0
- package/skills/audit/stacks/_generic.md +41 -0
- package/skills/audit/stacks/_registry.md +47 -0
- package/skills/audit/stacks/go.md +66 -0
- package/skills/audit/stacks/java.md +44 -0
- package/skills/audit/stacks/node.md +57 -0
- package/skills/audit/stacks/python.md +45 -0
- package/skills/audit/stacks/rust.md +44 -0
- package/skills/audit-api-contracts/SKILL.md +201 -0
- package/skills/audit-architecture/SKILL.md +200 -0
- package/skills/audit-bugs/SKILL.md +226 -0
- package/skills/audit-concurrency/SKILL.md +197 -0
- package/skills/audit-deployment/SKILL.md +218 -0
- package/skills/audit-docs/SKILL.md +209 -0
- package/skills/audit-errors/SKILL.md +216 -0
- package/skills/audit-logging/SKILL.md +197 -0
- package/skills/audit-matrix/SKILL.md +245 -0
- package/skills/audit-meta/SKILL.md +120 -0
- package/skills/audit-naming/SKILL.md +200 -0
- package/skills/audit-owasp/SKILL.md +223 -0
- package/skills/audit-performance/SKILL.md +199 -0
- package/skills/audit-reinvention/SKILL.md +214 -0
- package/skills/audit-secrets/SKILL.md +198 -0
- package/skills/audit-tests/SKILL.md +210 -0
- package/skills/audit-validation/SKILL.md +206 -0
- package/skills/audit-verify/SKILL.md +139 -0
- package/skills/audit-yagni/SKILL.md +188 -0
- package/skills/generate-project-docs/SKILL.md +380 -0
- package/skills/ops/SKILL.md +94 -0
- package/skills/post-call-task-builder/SKILL.md +419 -0
- package/skills/skills-best-practices/SKILL.md +415 -0
- package/src/app.module.ts +6 -0
- package/src/commands/ops/ops-add.command.ts +83 -0
- package/src/commands/ops/ops-init.command.ts +125 -0
- package/src/commands/ops/ops-list.command.ts +57 -0
- package/src/commands/ops/ops-path.command.ts +38 -0
- package/src/commands/ops/ops-runbook.command.ts +74 -0
- package/src/commands/ops/ops-status.command.ts +47 -0
- package/src/commands/ops/ops-use.command.ts +76 -0
- package/src/commands/ops/ops.command.ts +42 -0
- package/src/commands/ops/ops.helpers.ts +20 -0
- package/src/commands/ops/ops.module.ts +23 -0
- package/src/core/registry/registry.module.ts +9 -0
- package/src/core/registry/registry.schema.ts +46 -0
- package/src/core/registry/registry.service.ts +128 -0
- package/src/shared/runbook/runbook.module.ts +9 -0
- package/src/shared/runbook/runbook.service.ts +164 -0
- package/src/shared/runbook/runbook.templates.ts +66 -0
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { promises as fs } from 'node:fs';
|
|
2
|
+
import os from 'node:os';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { afterEach, beforeEach, describe, expect, it } from 'vitest';
|
|
5
|
+
import { RegistryService } from '../../../src/core/registry/registry.service';
|
|
6
|
+
|
|
7
|
+
describe('RegistryService', () => {
|
|
8
|
+
let tmpDir: string;
|
|
9
|
+
let originalXdg: string | undefined;
|
|
10
|
+
let service: RegistryService;
|
|
11
|
+
|
|
12
|
+
beforeEach(async () => {
|
|
13
|
+
tmpDir = await fs.mkdtemp(path.join(os.tmpdir(), 'kodu-registry-'));
|
|
14
|
+
originalXdg = process.env.XDG_CONFIG_HOME;
|
|
15
|
+
process.env.XDG_CONFIG_HOME = tmpDir;
|
|
16
|
+
// Путь реестра читается в конструкторе — создаём после установки env.
|
|
17
|
+
service = new RegistryService();
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
afterEach(async () => {
|
|
21
|
+
if (originalXdg === undefined) {
|
|
22
|
+
delete process.env.XDG_CONFIG_HOME;
|
|
23
|
+
} else {
|
|
24
|
+
process.env.XDG_CONFIG_HOME = originalXdg;
|
|
25
|
+
}
|
|
26
|
+
await fs.rm(tmpDir, { recursive: true, force: true });
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
it('returns empty registry when file does not exist', async () => {
|
|
30
|
+
const registry = await service.load();
|
|
31
|
+
expect(registry.projects).toEqual({});
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
it('does not create the file until something is saved', async () => {
|
|
35
|
+
await service.load();
|
|
36
|
+
await expect(fs.access(service.getFilePath())).rejects.toBeTruthy();
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
it('adds a project and persists it to disk', async () => {
|
|
40
|
+
await service.add('my-api', { path: '/work/my-api', stands: ['dev'] });
|
|
41
|
+
|
|
42
|
+
const onDisk = JSON.parse(await fs.readFile(service.getFilePath(), 'utf8'));
|
|
43
|
+
expect(onDisk.projects['my-api']).toEqual({
|
|
44
|
+
path: '/work/my-api',
|
|
45
|
+
stands: ['dev'],
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
it('rejects a duplicate project name by default', async () => {
|
|
50
|
+
await service.add('my-api', { path: '/work/my-api', stands: ['dev'] });
|
|
51
|
+
|
|
52
|
+
await expect(
|
|
53
|
+
service.add('my-api', { path: '/other', stands: ['dev'] }),
|
|
54
|
+
).rejects.toThrow(/уже есть в реестре/);
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
it('overwrites when overwrite option is set', async () => {
|
|
58
|
+
await service.add('my-api', { path: '/work/my-api', stands: ['dev'] });
|
|
59
|
+
await service.add(
|
|
60
|
+
'my-api',
|
|
61
|
+
{ path: '/new', stands: ['prod'] },
|
|
62
|
+
{ overwrite: true },
|
|
63
|
+
);
|
|
64
|
+
|
|
65
|
+
const entry = await service.get('my-api');
|
|
66
|
+
expect(entry?.path).toBe('/new');
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
it('updates an existing project', async () => {
|
|
70
|
+
await service.add('my-api', { path: '/work/my-api', stands: ['dev'] });
|
|
71
|
+
await service.update('my-api', { path: '/moved' });
|
|
72
|
+
|
|
73
|
+
expect((await service.get('my-api'))?.path).toBe('/moved');
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
it('throws when reading an invalid registry file', async () => {
|
|
77
|
+
await fs.mkdir(path.dirname(service.getFilePath()), { recursive: true });
|
|
78
|
+
await fs.writeFile(service.getFilePath(), '{ not json', 'utf8');
|
|
79
|
+
|
|
80
|
+
await expect(service.load()).rejects.toThrow();
|
|
81
|
+
});
|
|
82
|
+
});
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { promises as fs } from 'node:fs';
|
|
2
|
+
import os from 'node:os';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { afterEach, beforeEach, describe, expect, it } from 'vitest';
|
|
5
|
+
import { RunbookService } from '../../../src/shared/runbook/runbook.service';
|
|
6
|
+
|
|
7
|
+
describe('RunbookService', () => {
|
|
8
|
+
let root: string;
|
|
9
|
+
const service = new RunbookService();
|
|
10
|
+
|
|
11
|
+
beforeEach(async () => {
|
|
12
|
+
root = await fs.mkdtemp(path.join(os.tmpdir(), 'kodu-runbook-'));
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
afterEach(async () => {
|
|
16
|
+
await fs.rm(root, { recursive: true, force: true });
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
async function readGitignore(): Promise<string> {
|
|
20
|
+
return fs.readFile(path.join(root, '.gitignore'), 'utf8');
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
describe('scaffold', () => {
|
|
24
|
+
it('creates config.json and runbook.md', async () => {
|
|
25
|
+
await service.scaffold(
|
|
26
|
+
{ project: 'demo', stands: ['local', 'dev'], activeStand: 'local' },
|
|
27
|
+
root,
|
|
28
|
+
);
|
|
29
|
+
|
|
30
|
+
const config = await service.readConfig(root);
|
|
31
|
+
expect(config.project).toBe('demo');
|
|
32
|
+
expect(config.activeStand).toBe('local');
|
|
33
|
+
|
|
34
|
+
const runbook = await service.readRunbook(root);
|
|
35
|
+
expect(runbook).toContain('## Стенд: dev');
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
it('does not overwrite an existing runbook.md', async () => {
|
|
39
|
+
await service.scaffold(
|
|
40
|
+
{ project: 'demo', stands: ['local'], activeStand: 'local' },
|
|
41
|
+
root,
|
|
42
|
+
);
|
|
43
|
+
await fs.writeFile(service.runbookPath(root), 'ручные правки', 'utf8');
|
|
44
|
+
|
|
45
|
+
await service.scaffold(
|
|
46
|
+
{ project: 'demo', stands: ['local'], activeStand: 'dev' },
|
|
47
|
+
root,
|
|
48
|
+
);
|
|
49
|
+
|
|
50
|
+
expect(await service.readRunbook(root)).toBe('ручные правки');
|
|
51
|
+
});
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
describe('ensureGitignore', () => {
|
|
55
|
+
it('returns no-git outside a git repository', async () => {
|
|
56
|
+
expect(await service.ensureGitignore(root)).toBe('no-git');
|
|
57
|
+
await expect(
|
|
58
|
+
fs.access(path.join(root, '.gitignore')),
|
|
59
|
+
).rejects.toBeTruthy();
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
it('creates .gitignore when missing in a git repo', async () => {
|
|
63
|
+
await fs.mkdir(path.join(root, '.git'));
|
|
64
|
+
|
|
65
|
+
expect(await service.ensureGitignore(root)).toBe('created');
|
|
66
|
+
expect(await readGitignore()).toContain('/.runbook/');
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
it('appends to an existing .gitignore', async () => {
|
|
70
|
+
await fs.mkdir(path.join(root, '.git'));
|
|
71
|
+
await fs.writeFile(
|
|
72
|
+
path.join(root, '.gitignore'),
|
|
73
|
+
'node_modules\n',
|
|
74
|
+
'utf8',
|
|
75
|
+
);
|
|
76
|
+
|
|
77
|
+
expect(await service.ensureGitignore(root)).toBe('added');
|
|
78
|
+
const content = await readGitignore();
|
|
79
|
+
expect(content).toContain('node_modules');
|
|
80
|
+
expect(content).toContain('/.runbook/');
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
it('is idempotent — does not duplicate the entry', async () => {
|
|
84
|
+
await fs.mkdir(path.join(root, '.git'));
|
|
85
|
+
await fs.writeFile(path.join(root, '.gitignore'), '.runbook/\n', 'utf8');
|
|
86
|
+
|
|
87
|
+
expect(await service.ensureGitignore(root)).toBe('present');
|
|
88
|
+
const occurrences = (await readGitignore()).split('runbook').length - 1;
|
|
89
|
+
expect(occurrences).toBe(1);
|
|
90
|
+
});
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
describe('detectStack', () => {
|
|
94
|
+
it('detects docker-compose and .env.example', async () => {
|
|
95
|
+
await fs.writeFile(path.join(root, 'docker-compose.yml'), '', 'utf8');
|
|
96
|
+
await fs.writeFile(path.join(root, '.env.example'), '', 'utf8');
|
|
97
|
+
|
|
98
|
+
const detected = await service.detectStack(root);
|
|
99
|
+
expect(detected.compose).toBe(true);
|
|
100
|
+
expect(detected.envExample).toBe(true);
|
|
101
|
+
expect(detected.dockerfile).toBe(false);
|
|
102
|
+
});
|
|
103
|
+
});
|
|
104
|
+
});
|
package/dist/package.json
CHANGED
package/dist/src/app.module.js
CHANGED
|
@@ -10,11 +10,14 @@ exports.AppModule = void 0;
|
|
|
10
10
|
const common_1 = require("@nestjs/common");
|
|
11
11
|
const clean_module_1 = require("./commands/clean/clean.module");
|
|
12
12
|
const init_module_1 = require("./commands/init/init.module");
|
|
13
|
+
const ops_module_1 = require("./commands/ops/ops.module");
|
|
13
14
|
const pack_module_1 = require("./commands/pack/pack.module");
|
|
14
15
|
const config_module_1 = require("./core/config/config.module");
|
|
15
16
|
const fs_module_1 = require("./core/file-system/fs.module");
|
|
17
|
+
const registry_module_1 = require("./core/registry/registry.module");
|
|
16
18
|
const ui_module_1 = require("./core/ui/ui.module");
|
|
17
19
|
const git_module_1 = require("./shared/git/git.module");
|
|
20
|
+
const runbook_module_1 = require("./shared/runbook/runbook.module");
|
|
18
21
|
const tokenizer_module_1 = require("./shared/tokenizer/tokenizer.module");
|
|
19
22
|
let AppModule = class AppModule {
|
|
20
23
|
};
|
|
@@ -27,9 +30,12 @@ exports.AppModule = AppModule = __decorate([
|
|
|
27
30
|
fs_module_1.FsModule,
|
|
28
31
|
git_module_1.GitModule,
|
|
29
32
|
tokenizer_module_1.TokenizerModule,
|
|
33
|
+
registry_module_1.RegistryModule,
|
|
34
|
+
runbook_module_1.RunbookModule,
|
|
30
35
|
init_module_1.InitModule,
|
|
31
36
|
pack_module_1.PackModule,
|
|
32
37
|
clean_module_1.CleanModule,
|
|
38
|
+
ops_module_1.OpsModule,
|
|
33
39
|
],
|
|
34
40
|
})
|
|
35
41
|
], AppModule);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app.module.js","sourceRoot":"","sources":["../../src/app.module.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAwC;AACxC,gEAA4D;AAC5D,6DAAyD;AACzD,6DAAyD;AACzD,+DAA2D;AAC3D,4DAAwD;AACxD,mDAA+C;AAC/C,wDAAoD;AACpD,0EAAsE;
|
|
1
|
+
{"version":3,"file":"app.module.js","sourceRoot":"","sources":["../../src/app.module.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAwC;AACxC,gEAA4D;AAC5D,6DAAyD;AACzD,0DAAsD;AACtD,6DAAyD;AACzD,+DAA2D;AAC3D,4DAAwD;AACxD,qEAAiE;AACjE,mDAA+C;AAC/C,wDAAoD;AACpD,oEAAgE;AAChE,0EAAsE;AAiB/D,IAAM,SAAS,GAAf,MAAM,SAAS;CAAG,CAAA;AAAZ,8BAAS;oBAAT,SAAS;IAfrB,IAAA,eAAM,EAAC;QACN,OAAO,EAAE;YACP,4BAAY;YACZ,oBAAQ;YACR,oBAAQ;YACR,sBAAS;YACT,kCAAe;YACf,gCAAc;YACd,8BAAa;YACb,wBAAU;YACV,wBAAU;YACV,0BAAW;YACX,sBAAS;SACV;KACF,CAAC;GACW,SAAS,CAAG"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { CommandRunner } from 'nest-commander';
|
|
2
|
+
import { RegistryService } from '../../core/registry/registry.service';
|
|
3
|
+
import { UiService } from '../../core/ui/ui.service';
|
|
4
|
+
type AddOptions = {
|
|
5
|
+
path?: string;
|
|
6
|
+
repo?: string;
|
|
7
|
+
stand?: string[];
|
|
8
|
+
};
|
|
9
|
+
export declare class OpsAddCommand extends CommandRunner {
|
|
10
|
+
private readonly ui;
|
|
11
|
+
private readonly registry;
|
|
12
|
+
constructor(ui: UiService, registry: RegistryService);
|
|
13
|
+
parsePath(value: string): string;
|
|
14
|
+
parseRepo(value: string): string;
|
|
15
|
+
parseStand(value: string, previous?: string[]): string[];
|
|
16
|
+
run(inputs: string[], options: AddOptions): Promise<void>;
|
|
17
|
+
}
|
|
18
|
+
export {};
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.OpsAddCommand = void 0;
|
|
16
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
17
|
+
const nest_commander_1 = require("nest-commander");
|
|
18
|
+
const registry_schema_1 = require("../../core/registry/registry.schema");
|
|
19
|
+
const registry_service_1 = require("../../core/registry/registry.service");
|
|
20
|
+
const ui_service_1 = require("../../core/ui/ui.service");
|
|
21
|
+
let OpsAddCommand = class OpsAddCommand extends nest_commander_1.CommandRunner {
|
|
22
|
+
ui;
|
|
23
|
+
registry;
|
|
24
|
+
constructor(ui, registry) {
|
|
25
|
+
super();
|
|
26
|
+
this.ui = ui;
|
|
27
|
+
this.registry = registry;
|
|
28
|
+
}
|
|
29
|
+
parsePath(value) {
|
|
30
|
+
return value;
|
|
31
|
+
}
|
|
32
|
+
parseRepo(value) {
|
|
33
|
+
return value;
|
|
34
|
+
}
|
|
35
|
+
parseStand(value, previous = []) {
|
|
36
|
+
return [...previous, value];
|
|
37
|
+
}
|
|
38
|
+
async run(inputs, options) {
|
|
39
|
+
const name = inputs[0];
|
|
40
|
+
if (!name) {
|
|
41
|
+
this.ui.log.error('Укажи имя проекта: kodu ops add <name> [--path <dir>]');
|
|
42
|
+
process.exitCode = 1;
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
const projectPath = node_path_1.default.resolve(options.path ?? process.cwd());
|
|
46
|
+
const stands = options.stand && options.stand.length > 0
|
|
47
|
+
? options.stand
|
|
48
|
+
: [...registry_schema_1.DEFAULT_STANDS];
|
|
49
|
+
try {
|
|
50
|
+
await this.registry.add(name, {
|
|
51
|
+
path: projectPath,
|
|
52
|
+
repo: options.repo,
|
|
53
|
+
stands,
|
|
54
|
+
});
|
|
55
|
+
this.ui.log.success(`Проект "${name}" добавлен в реестр.`);
|
|
56
|
+
this.ui.log.info(`Путь: ${projectPath}`);
|
|
57
|
+
this.ui.log.info(`Стенды: ${stands.join(', ')}`);
|
|
58
|
+
}
|
|
59
|
+
catch (error) {
|
|
60
|
+
this.ui.log.error(error.message);
|
|
61
|
+
process.exitCode = 1;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
};
|
|
65
|
+
exports.OpsAddCommand = OpsAddCommand;
|
|
66
|
+
__decorate([
|
|
67
|
+
(0, nest_commander_1.Option)({
|
|
68
|
+
flags: '-p, --path <dir>',
|
|
69
|
+
description: 'Путь к репозиторию (по умолчанию текущая директория)',
|
|
70
|
+
}),
|
|
71
|
+
__metadata("design:type", Function),
|
|
72
|
+
__metadata("design:paramtypes", [String]),
|
|
73
|
+
__metadata("design:returntype", String)
|
|
74
|
+
], OpsAddCommand.prototype, "parsePath", null);
|
|
75
|
+
__decorate([
|
|
76
|
+
(0, nest_commander_1.Option)({
|
|
77
|
+
flags: '-r, --repo <url>',
|
|
78
|
+
description: 'URL репозитория (git clone)',
|
|
79
|
+
}),
|
|
80
|
+
__metadata("design:type", Function),
|
|
81
|
+
__metadata("design:paramtypes", [String]),
|
|
82
|
+
__metadata("design:returntype", String)
|
|
83
|
+
], OpsAddCommand.prototype, "parseRepo", null);
|
|
84
|
+
__decorate([
|
|
85
|
+
(0, nest_commander_1.Option)({
|
|
86
|
+
flags: '-s, --stand <stand>',
|
|
87
|
+
description: 'Стенд проекта (можно повторять)',
|
|
88
|
+
}),
|
|
89
|
+
__metadata("design:type", Function),
|
|
90
|
+
__metadata("design:paramtypes", [String, Array]),
|
|
91
|
+
__metadata("design:returntype", Array)
|
|
92
|
+
], OpsAddCommand.prototype, "parseStand", null);
|
|
93
|
+
exports.OpsAddCommand = OpsAddCommand = __decorate([
|
|
94
|
+
(0, nest_commander_1.SubCommand)({
|
|
95
|
+
name: 'add',
|
|
96
|
+
description: 'Зарегистрировать проект в глобальном реестре по уникальному имени',
|
|
97
|
+
arguments: '<name>',
|
|
98
|
+
}),
|
|
99
|
+
__metadata("design:paramtypes", [ui_service_1.UiService,
|
|
100
|
+
registry_service_1.RegistryService])
|
|
101
|
+
], OpsAddCommand);
|
|
102
|
+
//# sourceMappingURL=ops-add.command.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ops-add.command.js","sourceRoot":"","sources":["../../../../src/commands/ops/ops-add.command.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,0DAA6B;AAC7B,mDAAmE;AACnE,yEAAqE;AACrE,2EAAuE;AACvE,yDAAqD;AAe9C,IAAM,aAAa,GAAnB,MAAM,aAAc,SAAQ,8BAAa;IAE3B;IACA;IAFnB,YACmB,EAAa,EACb,QAAyB;QAE1C,KAAK,EAAE,CAAC;QAHS,OAAE,GAAF,EAAE,CAAW;QACb,aAAQ,GAAR,QAAQ,CAAiB;IAG5C,CAAC;IAMD,SAAS,CAAC,KAAa;QACrB,OAAO,KAAK,CAAC;IACf,CAAC;IAMD,SAAS,CAAC,KAAa;QACrB,OAAO,KAAK,CAAC;IACf,CAAC;IAMD,UAAU,CAAC,KAAa,EAAE,WAAqB,EAAE;QAC/C,OAAO,CAAC,GAAG,QAAQ,EAAE,KAAK,CAAC,CAAC;IAC9B,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,MAAgB,EAAE,OAAmB;QAC7C,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QAEvB,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CACf,uDAAuD,CACxD,CAAC;YACF,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QAED,MAAM,WAAW,GAAG,mBAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QAChE,MAAM,MAAM,GACV,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC;YACvC,CAAC,CAAC,OAAO,CAAC,KAAK;YACf,CAAC,CAAC,CAAC,GAAG,gCAAc,CAAC,CAAC;QAE1B,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE;gBAC5B,IAAI,EAAE,WAAW;gBACjB,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,MAAM;aACP,CAAC,CAAC;YACH,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,WAAW,IAAI,sBAAsB,CAAC,CAAC;YAC3D,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,WAAW,EAAE,CAAC,CAAC;YACzC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACnD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CAAE,KAAe,CAAC,OAAO,CAAC,CAAC;YAC5C,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;CACF,CAAA;AA/DY,sCAAa;AAYxB;IAJC,IAAA,uBAAM,EAAC;QACN,KAAK,EAAE,kBAAkB;QACzB,WAAW,EAAE,sDAAsD;KACpE,CAAC;;;;8CAGD;AAMD;IAJC,IAAA,uBAAM,EAAC;QACN,KAAK,EAAE,kBAAkB;QACzB,WAAW,EAAE,6BAA6B;KAC3C,CAAC;;;;8CAGD;AAMD;IAJC,IAAA,uBAAM,EAAC;QACN,KAAK,EAAE,qBAAqB;QAC5B,WAAW,EAAE,iCAAiC;KAC/C,CAAC;;;;+CAGD;wBA9BU,aAAa;IANzB,IAAA,2BAAU,EAAC;QACV,IAAI,EAAE,KAAK;QACX,WAAW,EACT,mEAAmE;QACrE,SAAS,EAAE,QAAQ;KACpB,CAAC;qCAGuB,sBAAS;QACH,kCAAe;GAHjC,aAAa,CA+DzB"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { CommandRunner } from 'nest-commander';
|
|
2
|
+
import { RegistryService } from '../../core/registry/registry.service';
|
|
3
|
+
import { UiService } from '../../core/ui/ui.service';
|
|
4
|
+
import { RunbookService } from '../../shared/runbook/runbook.service';
|
|
5
|
+
type InitOptions = {
|
|
6
|
+
name?: string;
|
|
7
|
+
active?: string;
|
|
8
|
+
stand?: string[];
|
|
9
|
+
};
|
|
10
|
+
export declare class OpsInitCommand extends CommandRunner {
|
|
11
|
+
private readonly ui;
|
|
12
|
+
private readonly registry;
|
|
13
|
+
private readonly runbook;
|
|
14
|
+
constructor(ui: UiService, registry: RegistryService, runbook: RunbookService);
|
|
15
|
+
parseName(value: string): string;
|
|
16
|
+
parseActive(value: string): string;
|
|
17
|
+
parseStand(value: string, previous?: string[]): string[];
|
|
18
|
+
run(_inputs: string[], options: InitOptions): Promise<void>;
|
|
19
|
+
private reportGitignore;
|
|
20
|
+
private registerProject;
|
|
21
|
+
}
|
|
22
|
+
export {};
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.OpsInitCommand = void 0;
|
|
16
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
17
|
+
const nest_commander_1 = require("nest-commander");
|
|
18
|
+
const registry_schema_1 = require("../../core/registry/registry.schema");
|
|
19
|
+
const registry_service_1 = require("../../core/registry/registry.service");
|
|
20
|
+
const ui_service_1 = require("../../core/ui/ui.service");
|
|
21
|
+
const runbook_service_1 = require("../../shared/runbook/runbook.service");
|
|
22
|
+
let OpsInitCommand = class OpsInitCommand extends nest_commander_1.CommandRunner {
|
|
23
|
+
ui;
|
|
24
|
+
registry;
|
|
25
|
+
runbook;
|
|
26
|
+
constructor(ui, registry, runbook) {
|
|
27
|
+
super();
|
|
28
|
+
this.ui = ui;
|
|
29
|
+
this.registry = registry;
|
|
30
|
+
this.runbook = runbook;
|
|
31
|
+
}
|
|
32
|
+
parseName(value) {
|
|
33
|
+
return value;
|
|
34
|
+
}
|
|
35
|
+
parseActive(value) {
|
|
36
|
+
return value;
|
|
37
|
+
}
|
|
38
|
+
parseStand(value, previous = []) {
|
|
39
|
+
return [...previous, value];
|
|
40
|
+
}
|
|
41
|
+
async run(_inputs, options) {
|
|
42
|
+
const root = process.cwd();
|
|
43
|
+
const name = options.name ?? node_path_1.default.basename(root);
|
|
44
|
+
const stands = options.stand && options.stand.length > 0
|
|
45
|
+
? options.stand
|
|
46
|
+
: [...registry_schema_1.DEFAULT_STANDS];
|
|
47
|
+
const activeStand = options.active ?? stands[0] ?? 'local';
|
|
48
|
+
try {
|
|
49
|
+
await this.runbook.scaffold({ project: name, stands, activeStand }, root);
|
|
50
|
+
this.ui.log.success(`Создан .runbook/ для проекта "${name}".`);
|
|
51
|
+
this.ui.log.info(`Активный стенд: ${activeStand}`);
|
|
52
|
+
this.ui.log.info(`Заполни шаги деплоя в ${this.runbook.runbookPath(root)}`);
|
|
53
|
+
const gitignore = await this.runbook.ensureGitignore(root);
|
|
54
|
+
this.reportGitignore(gitignore);
|
|
55
|
+
await this.registerProject(name, root, stands);
|
|
56
|
+
}
|
|
57
|
+
catch (error) {
|
|
58
|
+
this.ui.log.error(error.message);
|
|
59
|
+
process.exitCode = 1;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
reportGitignore(result) {
|
|
63
|
+
switch (result) {
|
|
64
|
+
case 'created':
|
|
65
|
+
this.ui.log.success('Создан .gitignore с записью /.runbook/');
|
|
66
|
+
break;
|
|
67
|
+
case 'added':
|
|
68
|
+
this.ui.log.success('Добавил /.runbook/ в .gitignore');
|
|
69
|
+
break;
|
|
70
|
+
case 'present':
|
|
71
|
+
this.ui.log.info('/.runbook/ уже в .gitignore');
|
|
72
|
+
break;
|
|
73
|
+
case 'no-git':
|
|
74
|
+
this.ui.log.warn('Это не git-репозиторий — .gitignore не настроен. Не коммить .runbook/ вручную.');
|
|
75
|
+
break;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
async registerProject(name, root, stands) {
|
|
79
|
+
const existing = await this.registry.get(name);
|
|
80
|
+
if (!existing) {
|
|
81
|
+
await this.registry.add(name, { path: root, stands });
|
|
82
|
+
this.ui.log.success(`Проект "${name}" добавлен в реестр.`);
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
if (existing.path === root) {
|
|
86
|
+
this.ui.log.info(`Проект "${name}" уже в реестре.`);
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
this.ui.log.warn(`Имя "${name}" уже занято другим путём (${existing.path}). ` +
|
|
90
|
+
'Запусти заново с другим именем: kodu ops init --name <другое-имя>');
|
|
91
|
+
}
|
|
92
|
+
};
|
|
93
|
+
exports.OpsInitCommand = OpsInitCommand;
|
|
94
|
+
__decorate([
|
|
95
|
+
(0, nest_commander_1.Option)({
|
|
96
|
+
flags: '-n, --name <name>',
|
|
97
|
+
description: 'Уникальное имя проекта (по умолчанию — имя папки)',
|
|
98
|
+
}),
|
|
99
|
+
__metadata("design:type", Function),
|
|
100
|
+
__metadata("design:paramtypes", [String]),
|
|
101
|
+
__metadata("design:returntype", String)
|
|
102
|
+
], OpsInitCommand.prototype, "parseName", null);
|
|
103
|
+
__decorate([
|
|
104
|
+
(0, nest_commander_1.Option)({
|
|
105
|
+
flags: '-a, --active <stand>',
|
|
106
|
+
description: 'Активный стенд по умолчанию (по умолчанию local)',
|
|
107
|
+
}),
|
|
108
|
+
__metadata("design:type", Function),
|
|
109
|
+
__metadata("design:paramtypes", [String]),
|
|
110
|
+
__metadata("design:returntype", String)
|
|
111
|
+
], OpsInitCommand.prototype, "parseActive", null);
|
|
112
|
+
__decorate([
|
|
113
|
+
(0, nest_commander_1.Option)({
|
|
114
|
+
flags: '-s, --stand <stand>',
|
|
115
|
+
description: 'Стенд проекта (можно повторять)',
|
|
116
|
+
}),
|
|
117
|
+
__metadata("design:type", Function),
|
|
118
|
+
__metadata("design:paramtypes", [String, Array]),
|
|
119
|
+
__metadata("design:returntype", Array)
|
|
120
|
+
], OpsInitCommand.prototype, "parseStand", null);
|
|
121
|
+
exports.OpsInitCommand = OpsInitCommand = __decorate([
|
|
122
|
+
(0, nest_commander_1.SubCommand)({
|
|
123
|
+
name: 'init',
|
|
124
|
+
description: 'Настроить стенды в текущем проекте: создать .runbook/, .gitignore и зарегистрировать проект',
|
|
125
|
+
}),
|
|
126
|
+
__metadata("design:paramtypes", [ui_service_1.UiService,
|
|
127
|
+
registry_service_1.RegistryService,
|
|
128
|
+
runbook_service_1.RunbookService])
|
|
129
|
+
], OpsInitCommand);
|
|
130
|
+
//# sourceMappingURL=ops-init.command.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ops-init.command.js","sourceRoot":"","sources":["../../../../src/commands/ops/ops-init.command.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { CommandRunner } from 'nest-commander';
|
|
2
|
+
import { RegistryService } from '../../core/registry/registry.service';
|
|
3
|
+
import { UiService } from '../../core/ui/ui.service';
|
|
4
|
+
import { RunbookService } from '../../shared/runbook/runbook.service';
|
|
5
|
+
export declare class OpsListCommand extends CommandRunner {
|
|
6
|
+
private readonly ui;
|
|
7
|
+
private readonly registry;
|
|
8
|
+
private readonly runbook;
|
|
9
|
+
constructor(ui: UiService, registry: RegistryService, runbook: RunbookService);
|
|
10
|
+
run(): Promise<void>;
|
|
11
|
+
private readActiveStand;
|
|
12
|
+
}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.OpsListCommand = void 0;
|
|
13
|
+
const nest_commander_1 = require("nest-commander");
|
|
14
|
+
const registry_service_1 = require("../../core/registry/registry.service");
|
|
15
|
+
const ui_service_1 = require("../../core/ui/ui.service");
|
|
16
|
+
const runbook_service_1 = require("../../shared/runbook/runbook.service");
|
|
17
|
+
let OpsListCommand = class OpsListCommand extends nest_commander_1.CommandRunner {
|
|
18
|
+
ui;
|
|
19
|
+
registry;
|
|
20
|
+
runbook;
|
|
21
|
+
constructor(ui, registry, runbook) {
|
|
22
|
+
super();
|
|
23
|
+
this.ui = ui;
|
|
24
|
+
this.registry = registry;
|
|
25
|
+
this.runbook = runbook;
|
|
26
|
+
}
|
|
27
|
+
async run() {
|
|
28
|
+
try {
|
|
29
|
+
const projects = await this.registry.list();
|
|
30
|
+
const names = Object.keys(projects).sort((a, b) => a.localeCompare(b));
|
|
31
|
+
if (names.length === 0) {
|
|
32
|
+
this.ui.log.info('Реестр пуст. Добавь проект: kodu ops add <name> --path <dir>');
|
|
33
|
+
this.ui.log.info(`Файл реестра: ${this.registry.getFilePath()}`);
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
for (const name of names) {
|
|
37
|
+
const entry = projects[name];
|
|
38
|
+
const active = await this.readActiveStand(entry.path);
|
|
39
|
+
const activeLabel = active ? ` [активный: ${active}]` : '';
|
|
40
|
+
this.ui.log.info(`${name}${activeLabel}`);
|
|
41
|
+
this.ui.log.info(` путь: ${entry.path}`);
|
|
42
|
+
this.ui.log.info(` стенды: ${entry.stands.join(', ')}`);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
catch (error) {
|
|
46
|
+
this.ui.log.error(error.message);
|
|
47
|
+
process.exitCode = 1;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
async readActiveStand(root) {
|
|
51
|
+
try {
|
|
52
|
+
if (!(await this.runbook.exists(root))) {
|
|
53
|
+
return undefined;
|
|
54
|
+
}
|
|
55
|
+
return (await this.runbook.readConfig(root)).activeStand;
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
return undefined;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
exports.OpsListCommand = OpsListCommand;
|
|
63
|
+
exports.OpsListCommand = OpsListCommand = __decorate([
|
|
64
|
+
(0, nest_commander_1.SubCommand)({
|
|
65
|
+
name: 'list',
|
|
66
|
+
aliases: ['ls'],
|
|
67
|
+
description: 'Показать все проекты из реестра и их активные стенды',
|
|
68
|
+
}),
|
|
69
|
+
__metadata("design:paramtypes", [ui_service_1.UiService,
|
|
70
|
+
registry_service_1.RegistryService,
|
|
71
|
+
runbook_service_1.RunbookService])
|
|
72
|
+
], OpsListCommand);
|
|
73
|
+
//# sourceMappingURL=ops-list.command.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ops-list.command.js","sourceRoot":"","sources":["../../../../src/commands/ops/ops-list.command.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,mDAA2D;AAC3D,2EAAuE;AACvE,yDAAqD;AACrD,0EAAsE;AAO/D,IAAM,cAAc,GAApB,MAAM,cAAe,SAAQ,8BAAa;IAE5B;IACA;IACA;IAHnB,YACmB,EAAa,EACb,QAAyB,EACzB,OAAuB;QAExC,KAAK,EAAE,CAAC;QAJS,OAAE,GAAF,EAAE,CAAW;QACb,aAAQ,GAAR,QAAQ,CAAiB;QACzB,YAAO,GAAP,OAAO,CAAgB;IAG1C,CAAC;IAED,KAAK,CAAC,GAAG;QACP,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;YAC5C,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;YAEvE,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACvB,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CACd,8DAA8D,CAC/D,CAAC;gBACF,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,iBAAiB,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;gBACjE,OAAO;YACT,CAAC;YAED,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;gBAC7B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBACtD,MAAM,WAAW,GAAG,MAAM,CAAC,CAAC,CAAC,eAAe,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC3D,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,WAAW,EAAE,CAAC,CAAC;gBAC1C,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;gBAC5C,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAC3D,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CAAE,KAAe,CAAC,OAAO,CAAC,CAAC;YAC5C,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,eAAe,CAAC,IAAY;QACxC,IAAI,CAAC;YACH,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;gBACvC,OAAO,SAAS,CAAC;YACnB,CAAC;YACD,OAAO,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC;QAC3D,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;CACF,CAAA;AA9CY,wCAAc;yBAAd,cAAc;IAL1B,IAAA,2BAAU,EAAC;QACV,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE,CAAC,IAAI,CAAC;QACf,WAAW,EAAE,sDAAsD;KACpE,CAAC;qCAGuB,sBAAS;QACH,kCAAe;QAChB,gCAAc;GAJ/B,cAAc,CA8C1B"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { CommandRunner } from 'nest-commander';
|
|
2
|
+
import { RegistryService } from '../../core/registry/registry.service';
|
|
3
|
+
import { UiService } from '../../core/ui/ui.service';
|
|
4
|
+
export declare class OpsPathCommand extends CommandRunner {
|
|
5
|
+
private readonly ui;
|
|
6
|
+
private readonly registry;
|
|
7
|
+
constructor(ui: UiService, registry: RegistryService);
|
|
8
|
+
run(inputs: string[]): Promise<void>;
|
|
9
|
+
}
|