@lousy-agents/cli 2.0.0 → 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/dist/145.js +29 -0
- package/dist/145.js.map +1 -0
- package/dist/190.js +1765 -0
- package/dist/190.js.map +1 -0
- package/dist/255.js +1850 -0
- package/dist/255.js.map +1 -0
- package/dist/31.js +127 -0
- package/dist/31.js.map +1 -0
- package/dist/399.js +13 -0
- package/dist/399.js.map +1 -0
- package/dist/610.js +254 -0
- package/dist/610.js.map +1 -0
- package/dist/651.js +39 -0
- package/dist/651.js.map +1 -0
- package/dist/659.js +16 -0
- package/dist/659.js.map +1 -0
- package/dist/709.js +47 -0
- package/dist/709.js.map +1 -0
- package/dist/835.js +298 -0
- package/dist/835.js.map +1 -0
- package/dist/index.js +30651 -9
- package/dist/index.js.map +1 -1
- package/dist/mcp-server.js +46530 -5
- package/dist/mcp-server.js.map +1 -1
- package/package.json +4 -2
- package/dist/commands/copilot-setup.d.ts +0 -5
- package/dist/commands/copilot-setup.d.ts.map +0 -1
- package/dist/commands/copilot-setup.js +0 -97
- package/dist/commands/copilot-setup.js.map +0 -1
- package/dist/commands/init.d.ts +0 -13
- package/dist/commands/init.d.ts.map +0 -1
- package/dist/commands/init.js +0 -109
- package/dist/commands/init.js.map +0 -1
- package/dist/commands/new.d.ts +0 -21
- package/dist/commands/new.d.ts.map +0 -1
- package/dist/commands/new.js +0 -94
- package/dist/commands/new.js.map +0 -1
- package/dist/entities/copilot-agent.d.ts +0 -15
- package/dist/entities/copilot-agent.d.ts.map +0 -1
- package/dist/entities/copilot-agent.js +0 -53
- package/dist/entities/copilot-agent.js.map +0 -1
- package/dist/entities/copilot-setup.d.ts +0 -65
- package/dist/entities/copilot-setup.d.ts.map +0 -1
- package/dist/entities/copilot-setup.js +0 -6
- package/dist/entities/copilot-setup.js.map +0 -1
- package/dist/entities/index.d.ts +0 -7
- package/dist/entities/index.d.ts.map +0 -1
- package/dist/entities/index.js +0 -7
- package/dist/entities/index.js.map +0 -1
- package/dist/entities/skill.d.ts +0 -15
- package/dist/entities/skill.d.ts.map +0 -1
- package/dist/entities/skill.js +0 -63
- package/dist/entities/skill.js.map +0 -1
- package/dist/gateways/action-version-gateway.d.ts +0 -39
- package/dist/gateways/action-version-gateway.d.ts.map +0 -1
- package/dist/gateways/action-version-gateway.js +0 -47
- package/dist/gateways/action-version-gateway.js.map +0 -1
- package/dist/gateways/agent-file-gateway.d.ts +0 -50
- package/dist/gateways/agent-file-gateway.d.ts.map +0 -1
- package/dist/gateways/agent-file-gateway.js +0 -34
- package/dist/gateways/agent-file-gateway.js.map +0 -1
- package/dist/gateways/environment-gateway.d.ts +0 -30
- package/dist/gateways/environment-gateway.d.ts.map +0 -1
- package/dist/gateways/environment-gateway.js +0 -56
- package/dist/gateways/environment-gateway.js.map +0 -1
- package/dist/gateways/file-system-utils.d.ts +0 -8
- package/dist/gateways/file-system-utils.d.ts.map +0 -1
- package/dist/gateways/file-system-utils.js +0 -17
- package/dist/gateways/file-system-utils.js.map +0 -1
- package/dist/gateways/file-system-workflow-gateway.d.ts +0 -27
- package/dist/gateways/file-system-workflow-gateway.d.ts.map +0 -1
- package/dist/gateways/file-system-workflow-gateway.js +0 -99
- package/dist/gateways/file-system-workflow-gateway.js.map +0 -1
- package/dist/gateways/index.d.ts +0 -10
- package/dist/gateways/index.d.ts.map +0 -1
- package/dist/gateways/index.js +0 -10
- package/dist/gateways/index.js.map +0 -1
- package/dist/gateways/skill-file-gateway.d.ts +0 -59
- package/dist/gateways/skill-file-gateway.d.ts.map +0 -1
- package/dist/gateways/skill-file-gateway.js +0 -37
- package/dist/gateways/skill-file-gateway.js.map +0 -1
- package/dist/gateways/workflow-gateway.d.ts +0 -43
- package/dist/gateways/workflow-gateway.d.ts.map +0 -1
- package/dist/gateways/workflow-gateway.js +0 -6
- package/dist/gateways/workflow-gateway.js.map +0 -1
- package/dist/index.d.ts +0 -3
- package/dist/index.d.ts.map +0 -1
- package/dist/lib/config.d.ts +0 -28
- package/dist/lib/config.d.ts.map +0 -1
- package/dist/lib/config.js +0 -406
- package/dist/lib/config.js.map +0 -1
- package/dist/lib/copilot-setup-config.d.ts +0 -79
- package/dist/lib/copilot-setup-config.d.ts.map +0 -1
- package/dist/lib/copilot-setup-config.js +0 -119
- package/dist/lib/copilot-setup-config.js.map +0 -1
- package/dist/lib/filesystem-structure.d.ts +0 -45
- package/dist/lib/filesystem-structure.d.ts.map +0 -1
- package/dist/lib/filesystem-structure.js +0 -69
- package/dist/lib/filesystem-structure.js.map +0 -1
- package/dist/lib/mcp-test-client.d.ts +0 -43
- package/dist/lib/mcp-test-client.d.ts.map +0 -1
- package/dist/lib/mcp-test-client.js +0 -167
- package/dist/lib/mcp-test-client.js.map +0 -1
- package/dist/lib/project-name-validation.d.ts +0 -43
- package/dist/lib/project-name-validation.d.ts.map +0 -1
- package/dist/lib/project-name-validation.js +0 -131
- package/dist/lib/project-name-validation.js.map +0 -1
- package/dist/mcp/index.d.ts +0 -5
- package/dist/mcp/index.d.ts.map +0 -1
- package/dist/mcp/index.js +0 -5
- package/dist/mcp/index.js.map +0 -1
- package/dist/mcp/server.d.ts +0 -15
- package/dist/mcp/server.d.ts.map +0 -1
- package/dist/mcp/server.js +0 -120
- package/dist/mcp/server.js.map +0 -1
- package/dist/mcp/tools/analyze-action-versions.d.ts +0 -9
- package/dist/mcp/tools/analyze-action-versions.d.ts.map +0 -1
- package/dist/mcp/tools/analyze-action-versions.js +0 -81
- package/dist/mcp/tools/analyze-action-versions.js.map +0 -1
- package/dist/mcp/tools/create-copilot-setup-workflow.d.ts +0 -9
- package/dist/mcp/tools/create-copilot-setup-workflow.d.ts.map +0 -1
- package/dist/mcp/tools/create-copilot-setup-workflow.js +0 -121
- package/dist/mcp/tools/create-copilot-setup-workflow.js.map +0 -1
- package/dist/mcp/tools/discover-environment.d.ts +0 -9
- package/dist/mcp/tools/discover-environment.d.ts.map +0 -1
- package/dist/mcp/tools/discover-environment.js +0 -30
- package/dist/mcp/tools/discover-environment.js.map +0 -1
- package/dist/mcp/tools/discover-workflow-setup-actions.d.ts +0 -9
- package/dist/mcp/tools/discover-workflow-setup-actions.d.ts.map +0 -1
- package/dist/mcp/tools/discover-workflow-setup-actions.js +0 -37
- package/dist/mcp/tools/discover-workflow-setup-actions.js.map +0 -1
- package/dist/mcp/tools/index.d.ts +0 -11
- package/dist/mcp/tools/index.d.ts.map +0 -1
- package/dist/mcp/tools/index.js +0 -11
- package/dist/mcp/tools/index.js.map +0 -1
- package/dist/mcp/tools/read-copilot-setup-workflow.d.ts +0 -9
- package/dist/mcp/tools/read-copilot-setup-workflow.d.ts.map +0 -1
- package/dist/mcp/tools/read-copilot-setup-workflow.js +0 -38
- package/dist/mcp/tools/read-copilot-setup-workflow.js.map +0 -1
- package/dist/mcp/tools/resolve-action-versions.d.ts +0 -10
- package/dist/mcp/tools/resolve-action-versions.d.ts.map +0 -1
- package/dist/mcp/tools/resolve-action-versions.js +0 -61
- package/dist/mcp/tools/resolve-action-versions.js.map +0 -1
- package/dist/mcp/tools/types.d.ts +0 -67
- package/dist/mcp/tools/types.d.ts.map +0 -1
- package/dist/mcp/tools/types.js +0 -24
- package/dist/mcp/tools/types.js.map +0 -1
- package/dist/mcp-server.d.ts +0 -7
- package/dist/mcp-server.d.ts.map +0 -1
- package/dist/use-cases/action-resolution.d.ts +0 -66
- package/dist/use-cases/action-resolution.d.ts.map +0 -1
- package/dist/use-cases/action-resolution.js +0 -107
- package/dist/use-cases/action-resolution.js.map +0 -1
- package/dist/use-cases/candidate-builder.d.ts +0 -17
- package/dist/use-cases/candidate-builder.d.ts.map +0 -1
- package/dist/use-cases/candidate-builder.js +0 -67
- package/dist/use-cases/candidate-builder.js.map +0 -1
- package/dist/use-cases/copilot-setup.d.ts +0 -8
- package/dist/use-cases/copilot-setup.d.ts.map +0 -1
- package/dist/use-cases/copilot-setup.js +0 -10
- package/dist/use-cases/copilot-setup.js.map +0 -1
- package/dist/use-cases/create-copilot-agent.d.ts +0 -29
- package/dist/use-cases/create-copilot-agent.d.ts.map +0 -1
- package/dist/use-cases/create-copilot-agent.js +0 -73
- package/dist/use-cases/create-copilot-agent.js.map +0 -1
- package/dist/use-cases/create-skill.d.ts +0 -30
- package/dist/use-cases/create-skill.d.ts.map +0 -1
- package/dist/use-cases/create-skill.js +0 -75
- package/dist/use-cases/create-skill.js.map +0 -1
- package/dist/use-cases/index.d.ts +0 -10
- package/dist/use-cases/index.d.ts.map +0 -1
- package/dist/use-cases/index.js +0 -10
- package/dist/use-cases/index.js.map +0 -1
- package/dist/use-cases/setup-step-discovery.d.ts +0 -87
- package/dist/use-cases/setup-step-discovery.d.ts.map +0 -1
- package/dist/use-cases/setup-step-discovery.js +0 -202
- package/dist/use-cases/setup-step-discovery.js.map +0 -1
- package/dist/use-cases/workflow-generator.d.ts +0 -34
- package/dist/use-cases/workflow-generator.d.ts.map +0 -1
- package/dist/use-cases/workflow-generator.js +0 -195
- package/dist/use-cases/workflow-generator.js.map +0 -1
|
@@ -1,119 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Configuration for the copilot-setup command.
|
|
3
|
-
* Uses c12 for configuration loading, allowing runtime customization.
|
|
4
|
-
*/
|
|
5
|
-
import { loadConfig } from "c12";
|
|
6
|
-
/**
|
|
7
|
-
* Default version file mappings
|
|
8
|
-
*/
|
|
9
|
-
const DEFAULT_VERSION_FILES = [
|
|
10
|
-
{ filename: ".nvmrc", type: "node" },
|
|
11
|
-
{ filename: ".node-version", type: "node" },
|
|
12
|
-
{ filename: ".python-version", type: "python" },
|
|
13
|
-
{ filename: ".java-version", type: "java" },
|
|
14
|
-
{ filename: ".ruby-version", type: "ruby" },
|
|
15
|
-
{ filename: ".go-version", type: "go" },
|
|
16
|
-
];
|
|
17
|
-
/**
|
|
18
|
-
* Default setup action configurations
|
|
19
|
-
*/
|
|
20
|
-
const DEFAULT_SETUP_ACTIONS = [
|
|
21
|
-
{
|
|
22
|
-
action: "actions/setup-node",
|
|
23
|
-
type: "node",
|
|
24
|
-
versionFileKey: "node-version-file",
|
|
25
|
-
},
|
|
26
|
-
{
|
|
27
|
-
action: "actions/setup-python",
|
|
28
|
-
type: "python",
|
|
29
|
-
versionFileKey: "python-version-file",
|
|
30
|
-
},
|
|
31
|
-
{
|
|
32
|
-
action: "actions/setup-java",
|
|
33
|
-
type: "java",
|
|
34
|
-
versionFileKey: "java-version-file",
|
|
35
|
-
},
|
|
36
|
-
{
|
|
37
|
-
action: "actions/setup-ruby",
|
|
38
|
-
type: "ruby",
|
|
39
|
-
versionFileKey: "ruby-version-file",
|
|
40
|
-
},
|
|
41
|
-
{
|
|
42
|
-
action: "actions/setup-go",
|
|
43
|
-
type: "go",
|
|
44
|
-
versionFileKey: "go-version-file",
|
|
45
|
-
},
|
|
46
|
-
];
|
|
47
|
-
/**
|
|
48
|
-
* Default setup action patterns to detect in workflows
|
|
49
|
-
*/
|
|
50
|
-
const DEFAULT_SETUP_ACTION_PATTERNS = [
|
|
51
|
-
"actions/setup-node",
|
|
52
|
-
"actions/setup-python",
|
|
53
|
-
"actions/setup-java",
|
|
54
|
-
"actions/setup-go",
|
|
55
|
-
"actions/setup-ruby",
|
|
56
|
-
"jdx/mise-action",
|
|
57
|
-
];
|
|
58
|
-
/**
|
|
59
|
-
* Default copilot-setup configuration
|
|
60
|
-
*/
|
|
61
|
-
const DEFAULT_CONFIG = {
|
|
62
|
-
versionFiles: DEFAULT_VERSION_FILES,
|
|
63
|
-
setupActions: DEFAULT_SETUP_ACTIONS,
|
|
64
|
-
setupActionPatterns: DEFAULT_SETUP_ACTION_PATTERNS,
|
|
65
|
-
};
|
|
66
|
-
/**
|
|
67
|
-
* Loads the copilot-setup configuration using c12
|
|
68
|
-
* Falls back to defaults if no configuration is found
|
|
69
|
-
*/
|
|
70
|
-
export async function loadCopilotSetupConfig() {
|
|
71
|
-
const { config } = await loadConfig({
|
|
72
|
-
name: "lousy-agents",
|
|
73
|
-
defaults: DEFAULT_CONFIG,
|
|
74
|
-
packageJson: "copilotSetup",
|
|
75
|
-
});
|
|
76
|
-
return config || DEFAULT_CONFIG;
|
|
77
|
-
}
|
|
78
|
-
/**
|
|
79
|
-
* Resets the cached configuration (useful for testing)
|
|
80
|
-
*
|
|
81
|
-
* This function is retained for backwards compatibility but is a no-op
|
|
82
|
-
* because configuration is no longer cached at module scope.
|
|
83
|
-
*/
|
|
84
|
-
export function resetCopilotSetupConfigCache() {
|
|
85
|
-
// no in-memory cache to reset
|
|
86
|
-
}
|
|
87
|
-
/**
|
|
88
|
-
* Gets a version file type to action mapping from config
|
|
89
|
-
* Returns a partial record as not all types may be configured
|
|
90
|
-
*/
|
|
91
|
-
export function getVersionTypeToActionMap(config) {
|
|
92
|
-
const map = {};
|
|
93
|
-
for (const action of config.setupActions) {
|
|
94
|
-
map[action.type] = action.action;
|
|
95
|
-
}
|
|
96
|
-
return map;
|
|
97
|
-
}
|
|
98
|
-
/**
|
|
99
|
-
* Gets a version file type to config key mapping from config
|
|
100
|
-
* Returns a partial record as not all types may be configured
|
|
101
|
-
*/
|
|
102
|
-
export function getVersionFileConfigKeyMap(config) {
|
|
103
|
-
const map = {};
|
|
104
|
-
for (const action of config.setupActions) {
|
|
105
|
-
map[action.type] = action.versionFileKey;
|
|
106
|
-
}
|
|
107
|
-
return map;
|
|
108
|
-
}
|
|
109
|
-
/**
|
|
110
|
-
* Gets a filename to version type mapping from config
|
|
111
|
-
*/
|
|
112
|
-
export function getVersionFilenameToTypeMap(config) {
|
|
113
|
-
const map = {};
|
|
114
|
-
for (const file of config.versionFiles) {
|
|
115
|
-
map[file.filename] = file.type;
|
|
116
|
-
}
|
|
117
|
-
return map;
|
|
118
|
-
}
|
|
119
|
-
//# sourceMappingURL=copilot-setup-config.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"copilot-setup-config.js","sourceRoot":"","sources":["../../src/lib/copilot-setup-config.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Template context for processing template variables in file content
|
|
3
|
-
*/
|
|
4
|
-
export interface TemplateContext {
|
|
5
|
-
projectName: string;
|
|
6
|
-
}
|
|
7
|
-
/**
|
|
8
|
-
* Represents a file to be created in the filesystem
|
|
9
|
-
*/
|
|
10
|
-
export interface FileNode {
|
|
11
|
-
type: "file";
|
|
12
|
-
path: string;
|
|
13
|
-
content: string;
|
|
14
|
-
}
|
|
15
|
-
/**
|
|
16
|
-
* Represents a directory to be created in the filesystem
|
|
17
|
-
*/
|
|
18
|
-
export interface DirectoryNode {
|
|
19
|
-
type: "directory";
|
|
20
|
-
path: string;
|
|
21
|
-
}
|
|
22
|
-
/**
|
|
23
|
-
* Union type for filesystem nodes
|
|
24
|
-
*/
|
|
25
|
-
export type FilesystemNode = FileNode | DirectoryNode;
|
|
26
|
-
/**
|
|
27
|
-
* Declarative filesystem structure definition
|
|
28
|
-
*/
|
|
29
|
-
export interface FilesystemStructure {
|
|
30
|
-
nodes: FilesystemNode[];
|
|
31
|
-
}
|
|
32
|
-
/**
|
|
33
|
-
* Checks if a file or directory exists
|
|
34
|
-
*/
|
|
35
|
-
export declare function fileExists(path: string): Promise<boolean>;
|
|
36
|
-
/**
|
|
37
|
-
* Creates the filesystem structure defined by the given structure definition
|
|
38
|
-
* Preserves existing files and directories without modification
|
|
39
|
-
* Automatically creates parent directories for files
|
|
40
|
-
* @param structure The declarative filesystem structure to create
|
|
41
|
-
* @param targetDir The base directory where the structure should be created
|
|
42
|
-
* @param templateContext Optional context for processing template variables in file content
|
|
43
|
-
*/
|
|
44
|
-
export declare function createFilesystemStructure(structure: FilesystemStructure, targetDir: string, templateContext?: TemplateContext): Promise<void>;
|
|
45
|
-
//# sourceMappingURL=filesystem-structure.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"filesystem-structure.d.ts","sourceRoot":"","sources":["../../src/lib/filesystem-structure.ts"],"names":[],"mappings":"AAKA;;GAEG;AACH,MAAM,WAAW,eAAe;IAC5B,WAAW,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,QAAQ;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC1B,IAAI,EAAE,WAAW,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,aAAa,CAAC;AAEtD;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAChC,KAAK,EAAE,cAAc,EAAE,CAAC;CAC3B;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAO/D;AAsBD;;;;;;;GAOG;AACH,wBAAsB,yBAAyB,CAC3C,SAAS,EAAE,mBAAmB,EAC9B,SAAS,EAAE,MAAM,EACjB,eAAe,CAAC,EAAE,eAAe,GAClC,OAAO,CAAC,IAAI,CAAC,CA2Bf"}
|
|
@@ -1,69 +0,0 @@
|
|
|
1
|
-
import { access, mkdir, writeFile } from "node:fs/promises";
|
|
2
|
-
import { dirname, join } from "node:path";
|
|
3
|
-
import { consola } from "consola";
|
|
4
|
-
import { Eta } from "eta";
|
|
5
|
-
/**
|
|
6
|
-
* Checks if a file or directory exists
|
|
7
|
-
*/
|
|
8
|
-
export async function fileExists(path) {
|
|
9
|
-
try {
|
|
10
|
-
await access(path);
|
|
11
|
-
return true;
|
|
12
|
-
}
|
|
13
|
-
catch {
|
|
14
|
-
return false;
|
|
15
|
-
}
|
|
16
|
-
}
|
|
17
|
-
/**
|
|
18
|
-
* Singleton Eta instance for template processing
|
|
19
|
-
*/
|
|
20
|
-
const eta = new Eta();
|
|
21
|
-
/**
|
|
22
|
-
* Processes template content using Eta templating engine
|
|
23
|
-
* @param content The template content to process
|
|
24
|
-
* @param context The template context with values to substitute
|
|
25
|
-
* @returns The processed content with template variables replaced
|
|
26
|
-
*/
|
|
27
|
-
function processTemplate(content, context) {
|
|
28
|
-
try {
|
|
29
|
-
return eta.renderString(content, context);
|
|
30
|
-
}
|
|
31
|
-
catch (error) {
|
|
32
|
-
const message = error instanceof Error ? error.message : String(error);
|
|
33
|
-
throw new Error(`Template processing failed: ${message}`);
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
/**
|
|
37
|
-
* Creates the filesystem structure defined by the given structure definition
|
|
38
|
-
* Preserves existing files and directories without modification
|
|
39
|
-
* Automatically creates parent directories for files
|
|
40
|
-
* @param structure The declarative filesystem structure to create
|
|
41
|
-
* @param targetDir The base directory where the structure should be created
|
|
42
|
-
* @param templateContext Optional context for processing template variables in file content
|
|
43
|
-
*/
|
|
44
|
-
export async function createFilesystemStructure(structure, targetDir, templateContext) {
|
|
45
|
-
for (const node of structure.nodes) {
|
|
46
|
-
const fullPath = join(targetDir, node.path);
|
|
47
|
-
// Skip if already exists to preserve existing files/directories
|
|
48
|
-
if (await fileExists(fullPath)) {
|
|
49
|
-
consola.debug(`Skipping existing: ${fullPath}`);
|
|
50
|
-
continue;
|
|
51
|
-
}
|
|
52
|
-
if (node.type === "directory") {
|
|
53
|
-
await mkdir(fullPath, { recursive: true });
|
|
54
|
-
consola.debug(`Created directory: ${fullPath}`);
|
|
55
|
-
}
|
|
56
|
-
else if (node.type === "file") {
|
|
57
|
-
// Create parent directories if they don't exist
|
|
58
|
-
const dir = dirname(fullPath);
|
|
59
|
-
await mkdir(dir, { recursive: true });
|
|
60
|
-
// Process template if context is provided
|
|
61
|
-
const content = templateContext
|
|
62
|
-
? processTemplate(node.content, templateContext)
|
|
63
|
-
: node.content;
|
|
64
|
-
await writeFile(fullPath, content, "utf-8");
|
|
65
|
-
consola.debug(`Created file: ${fullPath}`);
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
//# sourceMappingURL=filesystem-structure.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"filesystem-structure.js","sourceRoot":"","sources":["../../src/lib/filesystem-structure.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAsC1B;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAAY;IACzC,IAAI,CAAC;QACD,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;QACnB,OAAO,IAAI,CAAC;IAChB,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,KAAK,CAAC;IACjB,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,GAAG,GAAG,IAAI,GAAG,EAAE,CAAC;AAEtB;;;;;GAKG;AACH,SAAS,eAAe,CAAC,OAAe,EAAE,OAAwB;IAC9D,IAAI,CAAC;QACD,OAAO,GAAG,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC9C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvE,MAAM,IAAI,KAAK,CAAC,+BAA+B,OAAO,EAAE,CAAC,CAAC;IAC9D,CAAC;AACL,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAC3C,SAA8B,EAC9B,SAAiB,EACjB,eAAiC;IAEjC,KAAK,MAAM,IAAI,IAAI,SAAS,CAAC,KAAK,EAAE,CAAC;QACjC,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QAE5C,gEAAgE;QAChE,IAAI,MAAM,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC7B,OAAO,CAAC,KAAK,CAAC,sBAAsB,QAAQ,EAAE,CAAC,CAAC;YAChD,SAAS;QACb,CAAC;QAED,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YAC5B,MAAM,KAAK,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC3C,OAAO,CAAC,KAAK,CAAC,sBAAsB,QAAQ,EAAE,CAAC,CAAC;QACpD,CAAC;aAAM,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAC9B,gDAAgD;YAChD,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;YAC9B,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAEtC,0CAA0C;YAC1C,MAAM,OAAO,GAAG,eAAe;gBAC3B,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,EAAE,eAAe,CAAC;gBAChD,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC;YAEnB,MAAM,SAAS,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;YAC5C,OAAO,CAAC,KAAK,CAAC,iBAAiB,QAAQ,EAAE,CAAC,CAAC;QAC/C,CAAC;IACL,CAAC;AACL,CAAC"}
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* MCP test client for integration testing.
|
|
3
|
-
*
|
|
4
|
-
* This client communicates with an MCP server process via stdio,
|
|
5
|
-
* sending JSON-RPC messages and receiving responses.
|
|
6
|
-
*/
|
|
7
|
-
/**
|
|
8
|
-
* MCP client for testing.
|
|
9
|
-
* Sends JSON-RPC messages to the MCP server and receives responses.
|
|
10
|
-
*/
|
|
11
|
-
export declare class McpTestClient {
|
|
12
|
-
private process;
|
|
13
|
-
private messageId;
|
|
14
|
-
private responseBuffer;
|
|
15
|
-
private pendingResponses;
|
|
16
|
-
private isStarted;
|
|
17
|
-
/**
|
|
18
|
-
* Starts the MCP server process.
|
|
19
|
-
*/
|
|
20
|
-
start(): Promise<void>;
|
|
21
|
-
private processResponses;
|
|
22
|
-
/**
|
|
23
|
-
* Sends a JSON-RPC request to the MCP server.
|
|
24
|
-
*/
|
|
25
|
-
sendRequest(method: string, params?: unknown): Promise<unknown>;
|
|
26
|
-
/**
|
|
27
|
-
* Sends an initialize request to the MCP server.
|
|
28
|
-
*/
|
|
29
|
-
initialize(): Promise<unknown>;
|
|
30
|
-
/**
|
|
31
|
-
* Lists all available tools from the MCP server.
|
|
32
|
-
*/
|
|
33
|
-
listTools(): Promise<unknown>;
|
|
34
|
-
/**
|
|
35
|
-
* Calls a tool on the MCP server.
|
|
36
|
-
*/
|
|
37
|
-
callTool(name: string, args: Record<string, unknown>): Promise<unknown>;
|
|
38
|
-
/**
|
|
39
|
-
* Stops the MCP server process.
|
|
40
|
-
*/
|
|
41
|
-
stop(): void;
|
|
42
|
-
}
|
|
43
|
-
//# sourceMappingURL=mcp-test-client.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-test-client.d.ts","sourceRoot":"","sources":["../../src/lib/mcp-test-client.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAgBH;;;GAGG;AACH,qBAAa,aAAa;IACtB,OAAO,CAAC,OAAO,CAA6B;IAC5C,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,cAAc,CAAM;IAC5B,OAAO,CAAC,gBAAgB,CAGV;IACd,OAAO,CAAC,SAAS,CAAS;IAE1B;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAwC5B,OAAO,CAAC,gBAAgB;IAkCxB;;OAEG;IACG,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IA2CrE;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC;IAQpC;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC,OAAO,CAAC;IAInC;;OAEG;IACG,QAAQ,CACV,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,OAAO,CAAC,OAAO,CAAC;IAInB;;OAEG;IACH,IAAI,IAAI,IAAI;CAYf"}
|
|
@@ -1,167 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* MCP test client for integration testing.
|
|
3
|
-
*
|
|
4
|
-
* This client communicates with an MCP server process via stdio,
|
|
5
|
-
* sending JSON-RPC messages and receiving responses.
|
|
6
|
-
*/
|
|
7
|
-
import { spawn } from "node:child_process";
|
|
8
|
-
/**
|
|
9
|
-
* Time to wait for the MCP server process to start and be ready
|
|
10
|
-
* to accept connections. Allows for process initialization overhead.
|
|
11
|
-
*/
|
|
12
|
-
const SERVER_STARTUP_DELAY_MS = 100;
|
|
13
|
-
/**
|
|
14
|
-
* Maximum time to wait for a response from the MCP server
|
|
15
|
-
* before considering the request timed out.
|
|
16
|
-
*/
|
|
17
|
-
const REQUEST_TIMEOUT_MS = 5000;
|
|
18
|
-
/**
|
|
19
|
-
* MCP client for testing.
|
|
20
|
-
* Sends JSON-RPC messages to the MCP server and receives responses.
|
|
21
|
-
*/
|
|
22
|
-
export class McpTestClient {
|
|
23
|
-
process = null;
|
|
24
|
-
messageId = 0;
|
|
25
|
-
responseBuffer = "";
|
|
26
|
-
pendingResponses = new Map();
|
|
27
|
-
isStarted = false;
|
|
28
|
-
/**
|
|
29
|
-
* Starts the MCP server process.
|
|
30
|
-
*/
|
|
31
|
-
async start() {
|
|
32
|
-
return new Promise((resolve, reject) => {
|
|
33
|
-
// Start the MCP server using the built dist file
|
|
34
|
-
this.process = spawn("node", ["dist/mcp-server.js"], {
|
|
35
|
-
cwd: process.cwd(),
|
|
36
|
-
stdio: ["pipe", "pipe", "pipe"],
|
|
37
|
-
});
|
|
38
|
-
if (!this.process.stdout || !this.process.stdin) {
|
|
39
|
-
reject(new Error("Failed to create process streams"));
|
|
40
|
-
return;
|
|
41
|
-
}
|
|
42
|
-
// Handle stdout data
|
|
43
|
-
this.process.stdout.on("data", (data) => {
|
|
44
|
-
this.responseBuffer += data.toString();
|
|
45
|
-
this.processResponses();
|
|
46
|
-
});
|
|
47
|
-
// Handle stderr for debugging
|
|
48
|
-
this.process.stderr?.on("data", (data) => {
|
|
49
|
-
// Log errors but don't fail - stderr is expected for some operations
|
|
50
|
-
console.error("MCP server stderr:", data.toString());
|
|
51
|
-
});
|
|
52
|
-
this.process.on("error", (error) => {
|
|
53
|
-
reject(error);
|
|
54
|
-
});
|
|
55
|
-
this.process.on("exit", () => {
|
|
56
|
-
this.isStarted = false;
|
|
57
|
-
});
|
|
58
|
-
this.isStarted = true;
|
|
59
|
-
// Give the server a moment to start
|
|
60
|
-
setTimeout(resolve, SERVER_STARTUP_DELAY_MS);
|
|
61
|
-
});
|
|
62
|
-
}
|
|
63
|
-
processResponses() {
|
|
64
|
-
// Try to parse complete JSON-RPC messages
|
|
65
|
-
const lines = this.responseBuffer.split("\n");
|
|
66
|
-
for (let i = 0; i < lines.length - 1; i++) {
|
|
67
|
-
const line = lines[i].trim();
|
|
68
|
-
if (line) {
|
|
69
|
-
try {
|
|
70
|
-
const response = JSON.parse(line);
|
|
71
|
-
if (response.id !== undefined) {
|
|
72
|
-
const pending = this.pendingResponses.get(response.id);
|
|
73
|
-
if (pending) {
|
|
74
|
-
this.pendingResponses.delete(response.id);
|
|
75
|
-
if (response.error) {
|
|
76
|
-
pending.reject(new Error(response.error.message));
|
|
77
|
-
}
|
|
78
|
-
else {
|
|
79
|
-
pending.resolve(response.result);
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
catch {
|
|
85
|
-
// Not a valid JSON line, skip
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
// Keep the last incomplete line in the buffer
|
|
90
|
-
this.responseBuffer = lines[lines.length - 1];
|
|
91
|
-
}
|
|
92
|
-
/**
|
|
93
|
-
* Sends a JSON-RPC request to the MCP server.
|
|
94
|
-
*/
|
|
95
|
-
async sendRequest(method, params) {
|
|
96
|
-
if (!this.process?.stdin || !this.isStarted) {
|
|
97
|
-
throw new Error("MCP server not started");
|
|
98
|
-
}
|
|
99
|
-
const id = ++this.messageId;
|
|
100
|
-
const request = {
|
|
101
|
-
jsonrpc: "2.0",
|
|
102
|
-
id,
|
|
103
|
-
method,
|
|
104
|
-
params: params || {},
|
|
105
|
-
};
|
|
106
|
-
return new Promise((resolve, reject) => {
|
|
107
|
-
this.pendingResponses.set(id, { resolve, reject });
|
|
108
|
-
// Set a timeout
|
|
109
|
-
const timeout = setTimeout(() => {
|
|
110
|
-
this.pendingResponses.delete(id);
|
|
111
|
-
reject(new Error(`Request timeout for ${method}`));
|
|
112
|
-
}, REQUEST_TIMEOUT_MS);
|
|
113
|
-
// Check if stdin is still writable before writing
|
|
114
|
-
if (!this.process?.stdin?.writable) {
|
|
115
|
-
clearTimeout(timeout);
|
|
116
|
-
this.pendingResponses.delete(id);
|
|
117
|
-
reject(new Error("MCP server stdin is not writable"));
|
|
118
|
-
return;
|
|
119
|
-
}
|
|
120
|
-
this.process.stdin.write(`${JSON.stringify(request)}\n`, (error) => {
|
|
121
|
-
if (error) {
|
|
122
|
-
clearTimeout(timeout);
|
|
123
|
-
this.pendingResponses.delete(id);
|
|
124
|
-
reject(error);
|
|
125
|
-
}
|
|
126
|
-
});
|
|
127
|
-
});
|
|
128
|
-
}
|
|
129
|
-
/**
|
|
130
|
-
* Sends an initialize request to the MCP server.
|
|
131
|
-
*/
|
|
132
|
-
async initialize() {
|
|
133
|
-
return this.sendRequest("initialize", {
|
|
134
|
-
protocolVersion: "2024-11-05",
|
|
135
|
-
capabilities: {},
|
|
136
|
-
clientInfo: { name: "test-client", version: "1.0.0" },
|
|
137
|
-
});
|
|
138
|
-
}
|
|
139
|
-
/**
|
|
140
|
-
* Lists all available tools from the MCP server.
|
|
141
|
-
*/
|
|
142
|
-
async listTools() {
|
|
143
|
-
return this.sendRequest("tools/list", {});
|
|
144
|
-
}
|
|
145
|
-
/**
|
|
146
|
-
* Calls a tool on the MCP server.
|
|
147
|
-
*/
|
|
148
|
-
async callTool(name, args) {
|
|
149
|
-
return this.sendRequest("tools/call", { name, arguments: args });
|
|
150
|
-
}
|
|
151
|
-
/**
|
|
152
|
-
* Stops the MCP server process.
|
|
153
|
-
*/
|
|
154
|
-
stop() {
|
|
155
|
-
if (this.process) {
|
|
156
|
-
this.isStarted = false;
|
|
157
|
-
// Clear pending responses before killing
|
|
158
|
-
for (const [id, pending] of this.pendingResponses) {
|
|
159
|
-
pending.reject(new Error("MCP server stopped"));
|
|
160
|
-
this.pendingResponses.delete(id);
|
|
161
|
-
}
|
|
162
|
-
this.process.kill();
|
|
163
|
-
this.process = null;
|
|
164
|
-
}
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
//# sourceMappingURL=mcp-test-client.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-test-client.js","sourceRoot":"","sources":["../../src/lib/mcp-test-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Project name validation utilities for npm/TypeScript projects.
|
|
3
|
-
* This module provides validation for project names that can be reused
|
|
4
|
-
* across different project types (webapp, CLI, probot, MCP server, etc.).
|
|
5
|
-
*/
|
|
6
|
-
/**
|
|
7
|
-
* Result of project name validation
|
|
8
|
-
*/
|
|
9
|
-
export interface ProjectNameValidationResult {
|
|
10
|
-
isValid: boolean;
|
|
11
|
-
errorMessage?: string;
|
|
12
|
-
}
|
|
13
|
-
/**
|
|
14
|
-
* Validates that a project name is a valid npm package name.
|
|
15
|
-
* Supports both unscoped (e.g., "my-package") and scoped (e.g., "@scope/my-package") names.
|
|
16
|
-
*
|
|
17
|
-
* Based on npm naming rules:
|
|
18
|
-
* - Lowercase only
|
|
19
|
-
* - No spaces
|
|
20
|
-
* - Can contain hyphens, underscores, periods, and numbers
|
|
21
|
-
* - Unscoped names cannot start with . or _
|
|
22
|
-
* - Maximum 214 characters
|
|
23
|
-
*
|
|
24
|
-
* @param name The project name to validate
|
|
25
|
-
* @returns Validation result with isValid flag and optional error message
|
|
26
|
-
*/
|
|
27
|
-
export declare function validateProjectName(name: string): ProjectNameValidationResult;
|
|
28
|
-
/**
|
|
29
|
-
* Simple boolean check for project name validity.
|
|
30
|
-
* Use validateProjectName() when you need the error message.
|
|
31
|
-
*
|
|
32
|
-
* @param name The project name to validate
|
|
33
|
-
* @returns true if the name is valid, false otherwise
|
|
34
|
-
*/
|
|
35
|
-
export declare function isValidProjectName(name: string): boolean;
|
|
36
|
-
/**
|
|
37
|
-
* Gets a user-friendly error message for an invalid project name.
|
|
38
|
-
*
|
|
39
|
-
* @param name The project name that was validated
|
|
40
|
-
* @returns Error message describing why the name is invalid, or undefined if valid
|
|
41
|
-
*/
|
|
42
|
-
export declare function getProjectNameError(name: string): string | undefined;
|
|
43
|
-
//# sourceMappingURL=project-name-validation.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"project-name-validation.d.ts","sourceRoot":"","sources":["../../src/lib/project-name-validation.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;GAEG;AACH,MAAM,WAAW,2BAA2B;IACxC,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;CACzB;AA2HD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,2BAA2B,CAa7E;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAExD;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAEpE"}
|
|
@@ -1,131 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Project name validation utilities for npm/TypeScript projects.
|
|
3
|
-
* This module provides validation for project names that can be reused
|
|
4
|
-
* across different project types (webapp, CLI, probot, MCP server, etc.).
|
|
5
|
-
*/
|
|
6
|
-
/**
|
|
7
|
-
* Pattern for valid npm package name segments (scope or package name)
|
|
8
|
-
*/
|
|
9
|
-
const NPM_NAME_PATTERN = /^[a-z0-9][-a-z0-9._]*$/;
|
|
10
|
-
/**
|
|
11
|
-
* Maximum allowed length for npm package names
|
|
12
|
-
*/
|
|
13
|
-
const MAX_NAME_LENGTH = 214;
|
|
14
|
-
/**
|
|
15
|
-
* Creates validation result from error message (undefined = valid)
|
|
16
|
-
*/
|
|
17
|
-
const toResult = (errorMessage) => errorMessage ? { isValid: false, errorMessage } : { isValid: true };
|
|
18
|
-
/**
|
|
19
|
-
* Runs validation rules in order, returning first failure or success
|
|
20
|
-
*/
|
|
21
|
-
const runValidationRules = (name, rules) => {
|
|
22
|
-
for (const rule of rules) {
|
|
23
|
-
const error = rule(name);
|
|
24
|
-
if (error) {
|
|
25
|
-
return toResult(error);
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
return toResult(undefined);
|
|
29
|
-
};
|
|
30
|
-
// ============================================================================
|
|
31
|
-
// Validation Rules
|
|
32
|
-
// ============================================================================
|
|
33
|
-
const requiredRule = (name) => !name || name.length === 0 ? "Project name is required" : undefined;
|
|
34
|
-
const maxLengthRule = (name) => name.length > MAX_NAME_LENGTH
|
|
35
|
-
? "Project name must be 214 characters or less"
|
|
36
|
-
: undefined;
|
|
37
|
-
const noLeadingDotOrUnderscoreRule = (name) => name.startsWith(".") || name.startsWith("_")
|
|
38
|
-
? "Project name cannot start with . or _"
|
|
39
|
-
: undefined;
|
|
40
|
-
const validCharactersRule = (name) => !NPM_NAME_PATTERN.test(name)
|
|
41
|
-
? "Project name must be lowercase and can only contain letters, numbers, hyphens, underscores, and periods"
|
|
42
|
-
: undefined;
|
|
43
|
-
// ============================================================================
|
|
44
|
-
// Scoped Package Validation
|
|
45
|
-
// ============================================================================
|
|
46
|
-
const validateScopedName = (name) => {
|
|
47
|
-
const parts = name.split("/");
|
|
48
|
-
const scopeFormatRule = () => parts.length !== 2
|
|
49
|
-
? "Scoped package name must be in format @scope/name"
|
|
50
|
-
: undefined;
|
|
51
|
-
const scopeNotEmptyRule = () => parts[0].length < 2 ? "Scope name cannot be empty" : undefined;
|
|
52
|
-
const scopeValidRule = () => {
|
|
53
|
-
const scope = parts[0].slice(1); // Remove leading @
|
|
54
|
-
return !NPM_NAME_PATTERN.test(scope)
|
|
55
|
-
? "Scope must be lowercase and can only contain letters, numbers, hyphens, underscores, and periods"
|
|
56
|
-
: undefined;
|
|
57
|
-
};
|
|
58
|
-
const packageNameNotEmptyRule = () => !parts[1] || parts[1].length === 0
|
|
59
|
-
? "Package name after scope cannot be empty"
|
|
60
|
-
: undefined;
|
|
61
|
-
const packageNameValidRule = () => !NPM_NAME_PATTERN.test(parts[1])
|
|
62
|
-
? "Package name must be lowercase and can only contain letters, numbers, hyphens, underscores, and periods"
|
|
63
|
-
: undefined;
|
|
64
|
-
const scopedRules = [
|
|
65
|
-
scopeFormatRule,
|
|
66
|
-
scopeNotEmptyRule,
|
|
67
|
-
scopeValidRule,
|
|
68
|
-
packageNameNotEmptyRule,
|
|
69
|
-
packageNameValidRule,
|
|
70
|
-
];
|
|
71
|
-
return runValidationRules(name, scopedRules);
|
|
72
|
-
};
|
|
73
|
-
// ============================================================================
|
|
74
|
-
// Unscoped Package Validation
|
|
75
|
-
// ============================================================================
|
|
76
|
-
const validateUnscopedName = (name) => {
|
|
77
|
-
const unscopedRules = [
|
|
78
|
-
noLeadingDotOrUnderscoreRule,
|
|
79
|
-
validCharactersRule,
|
|
80
|
-
];
|
|
81
|
-
return runValidationRules(name, unscopedRules);
|
|
82
|
-
};
|
|
83
|
-
// ============================================================================
|
|
84
|
-
// Main Validation Function
|
|
85
|
-
// ============================================================================
|
|
86
|
-
/**
|
|
87
|
-
* Validates that a project name is a valid npm package name.
|
|
88
|
-
* Supports both unscoped (e.g., "my-package") and scoped (e.g., "@scope/my-package") names.
|
|
89
|
-
*
|
|
90
|
-
* Based on npm naming rules:
|
|
91
|
-
* - Lowercase only
|
|
92
|
-
* - No spaces
|
|
93
|
-
* - Can contain hyphens, underscores, periods, and numbers
|
|
94
|
-
* - Unscoped names cannot start with . or _
|
|
95
|
-
* - Maximum 214 characters
|
|
96
|
-
*
|
|
97
|
-
* @param name The project name to validate
|
|
98
|
-
* @returns Validation result with isValid flag and optional error message
|
|
99
|
-
*/
|
|
100
|
-
export function validateProjectName(name) {
|
|
101
|
-
// Common rules that apply to all package names
|
|
102
|
-
const commonRules = [requiredRule, maxLengthRule];
|
|
103
|
-
const commonResult = runValidationRules(name, commonRules);
|
|
104
|
-
if (!commonResult.isValid) {
|
|
105
|
-
return commonResult;
|
|
106
|
-
}
|
|
107
|
-
// Route to scoped or unscoped validation
|
|
108
|
-
return name.startsWith("@")
|
|
109
|
-
? validateScopedName(name)
|
|
110
|
-
: validateUnscopedName(name);
|
|
111
|
-
}
|
|
112
|
-
/**
|
|
113
|
-
* Simple boolean check for project name validity.
|
|
114
|
-
* Use validateProjectName() when you need the error message.
|
|
115
|
-
*
|
|
116
|
-
* @param name The project name to validate
|
|
117
|
-
* @returns true if the name is valid, false otherwise
|
|
118
|
-
*/
|
|
119
|
-
export function isValidProjectName(name) {
|
|
120
|
-
return validateProjectName(name).isValid;
|
|
121
|
-
}
|
|
122
|
-
/**
|
|
123
|
-
* Gets a user-friendly error message for an invalid project name.
|
|
124
|
-
*
|
|
125
|
-
* @param name The project name that was validated
|
|
126
|
-
* @returns Error message describing why the name is invalid, or undefined if valid
|
|
127
|
-
*/
|
|
128
|
-
export function getProjectNameError(name) {
|
|
129
|
-
return validateProjectName(name).errorMessage;
|
|
130
|
-
}
|
|
131
|
-
//# sourceMappingURL=project-name-validation.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"project-name-validation.js","sourceRoot":"","sources":["../../src/lib/project-name-validation.ts"],"names":[],"mappings":"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"}
|