@git.zone/cli 2.13.11 → 2.13.13

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.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "json.schemas": [
3
3
  {
4
- "fileMatch": ["/npmextra.json"],
4
+ "fileMatch": ["/.smartconfig.json"],
5
5
  "schema": {
6
6
  "type": "object",
7
7
  "properties": {
@@ -3,7 +3,7 @@
3
3
  */
4
4
  export const commitinfo = {
5
5
  name: '@git.zone/cli',
6
- version: '2.13.10',
6
+ version: '2.13.13',
7
7
  description: 'A comprehensive CLI tool for enhancing and managing local development workflows with gitzone utilities, focusing on project setup, version control, code formatting, and template management.'
8
8
  };
9
9
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMDBfY29tbWl0aW5mb19kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvMDBfY29tbWl0aW5mb19kYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHO0lBQ3hCLElBQUksRUFBRSxlQUFlO0lBQ3JCLE9BQU8sRUFBRSxTQUFTO0lBQ2xCLFdBQVcsRUFBRSwrTEFBK0w7Q0FDN00sQ0FBQSJ9
@@ -2,6 +2,10 @@ import { BaseFormatter } from '../classes.baseformatter.js';
2
2
  import type { IPlannedChange } from '../interfaces.format.js';
3
3
  export declare class TemplatesFormatter extends BaseFormatter {
4
4
  get name(): string;
5
+ /**
6
+ * Render a template directory through smartscaf and return a map of path → content.
7
+ */
8
+ private renderTemplate;
5
9
  analyze(): Promise<IPlannedChange[]>;
6
10
  private analyzeTemplate;
7
11
  applyChange(change: IPlannedChange): Promise<void>;
@@ -6,6 +6,27 @@ export class TemplatesFormatter extends BaseFormatter {
6
6
  get name() {
7
7
  return 'templates';
8
8
  }
9
+ /**
10
+ * Render a template directory through smartscaf and return a map of path → content.
11
+ */
12
+ async renderTemplate(templateName) {
13
+ const templateDir = plugins.path.join(paths.templatesDir, templateName);
14
+ const scafTemplate = new plugins.smartscaf.ScafTemplate(templateDir);
15
+ await scafTemplate.readTemplateFromDir();
16
+ const gitzoneData = this.project.gitzoneConfig?.data;
17
+ if (gitzoneData) {
18
+ await scafTemplate.supplyVariables({
19
+ module: gitzoneData.module,
20
+ projectType: gitzoneData.projectType,
21
+ });
22
+ }
23
+ const renderedFiles = await scafTemplate.renderToMemory();
24
+ const fileMap = new Map();
25
+ for (const file of renderedFiles) {
26
+ fileMap.set(file.path, file.contents.toString());
27
+ }
28
+ return fileMap;
29
+ }
9
30
  async analyze() {
10
31
  const changes = [];
11
32
  const project = this.project;
@@ -20,7 +41,8 @@ export class TemplatesFormatter extends BaseFormatter {
20
41
  switch (projectType) {
21
42
  case 'npm':
22
43
  case 'wcc':
23
- const accessLevel = project.gitzoneConfig?.data?.npmciOptions?.npmAccessLevel;
44
+ const accessLevel = project.gitzoneConfig?.data?.release?.accessLevel
45
+ || project.gitzoneConfig?.data?.npmciOptions?.npmAccessLevel;
24
46
  const ciTemplate = accessLevel === 'public' ? 'ci_default' : 'ci_default_private';
25
47
  const ciChanges = await this.analyzeTemplate(ciTemplate, [
26
48
  { templatePath: '.gitea/workflows/default_nottags.yaml', destPath: '.gitea/workflows/default_nottags.yaml' },
@@ -66,49 +88,43 @@ export class TemplatesFormatter extends BaseFormatter {
66
88
  async analyzeTemplate(templateName, files) {
67
89
  const changes = [];
68
90
  const templateDir = plugins.path.join(paths.templatesDir, templateName);
69
- // Check if template exists
70
91
  const templateExists = await plugins.smartfs.directory(templateDir).exists();
71
92
  if (!templateExists) {
72
93
  logVerbose(`Template ${templateName} not found`);
73
94
  return changes;
74
95
  }
96
+ let renderedFiles;
97
+ try {
98
+ renderedFiles = await this.renderTemplate(templateName);
99
+ }
100
+ catch (error) {
101
+ logVerbose(`Failed to render template ${templateName}: ${error.message}`);
102
+ return changes;
103
+ }
75
104
  for (const file of files) {
76
- const templateFilePath = plugins.path.join(templateDir, file.templatePath);
77
- const destFilePath = file.destPath;
78
- // Check if template file exists
79
- const fileExists = await plugins.smartfs.file(templateFilePath).exists();
80
- if (!fileExists) {
81
- logVerbose(`Template file ${templateFilePath} not found`);
105
+ // Look up by templatePath first, then destPath (frontmatter may rename files)
106
+ const processedContent = renderedFiles.get(file.templatePath)
107
+ || renderedFiles.get(file.destPath);
108
+ if (!processedContent) {
109
+ logVerbose(`Template file ${file.templatePath} not found in rendered output`);
82
110
  continue;
83
111
  }
84
- try {
85
- // Read template content
86
- const templateContent = (await plugins.smartfs
87
- .file(templateFilePath)
112
+ const destExists = await plugins.smartfs.file(file.destPath).exists();
113
+ let currentContent = '';
114
+ if (destExists) {
115
+ currentContent = (await plugins.smartfs
116
+ .file(file.destPath)
88
117
  .encoding('utf8')
89
118
  .read());
90
- // Check if destination file exists
91
- const destExists = await plugins.smartfs.file(destFilePath).exists();
92
- let currentContent = '';
93
- if (destExists) {
94
- currentContent = (await plugins.smartfs
95
- .file(destFilePath)
96
- .encoding('utf8')
97
- .read());
98
- }
99
- // Only add change if content differs
100
- if (templateContent !== currentContent) {
101
- changes.push({
102
- type: destExists ? 'modify' : 'create',
103
- path: destFilePath,
104
- module: this.name,
105
- description: `Apply template ${templateName}/${file.templatePath}`,
106
- content: templateContent,
107
- });
108
- }
109
119
  }
110
- catch (error) {
111
- logVerbose(`Failed to read template ${templateFilePath}: ${error.message}`);
120
+ if (processedContent !== currentContent) {
121
+ changes.push({
122
+ type: destExists ? 'modify' : 'create',
123
+ path: file.destPath,
124
+ module: this.name,
125
+ description: `Apply template ${templateName}/${file.templatePath}`,
126
+ content: processedContent,
127
+ });
112
128
  }
113
129
  }
114
130
  return changes;
@@ -125,4 +141,4 @@ export class TemplatesFormatter extends BaseFormatter {
125
141
  logger.log('info', `Applied template to ${change.path}`);
126
142
  }
127
143
  }
128
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVtcGxhdGVzLmZvcm1hdHRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3RzL21vZF9mb3JtYXQvZm9ybWF0dGVycy90ZW1wbGF0ZXMuZm9ybWF0dGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUU1RCxPQUFPLEtBQUssT0FBTyxNQUFNLG1CQUFtQixDQUFDO0FBQzdDLE9BQU8sS0FBSyxLQUFLLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEMsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUU5RCxNQUFNLE9BQU8sa0JBQW1CLFNBQVEsYUFBYTtJQUNuRCxJQUFJLElBQUk7UUFDTixPQUFPLFdBQVcsQ0FBQztJQUNyQixDQUFDO0lBRUQsS0FBSyxDQUFDLE9BQU87UUFDWCxNQUFNLE9BQU8sR0FBcUIsRUFBRSxDQUFDO1FBQ3JDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7UUFDN0IsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLGFBQWEsRUFBRSxJQUFJLEVBQUUsV0FBVyxDQUFDO1FBRTdELHFDQUFxQztRQUNyQyxNQUFNLGFBQWEsR0FBRyxNQUFNLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxFQUFFO1lBQ3pELEVBQUUsWUFBWSxFQUFFLHVCQUF1QixFQUFFLFFBQVEsRUFBRSx1QkFBdUIsRUFBRTtZQUM1RSxFQUFFLFlBQVksRUFBRSxxQkFBcUIsRUFBRSxRQUFRLEVBQUUscUJBQXFCLEVBQUU7U0FDekUsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLGFBQWEsQ0FBQyxDQUFDO1FBRS9CLDhDQUE4QztRQUM5QyxRQUFRLFdBQVcsRUFBRSxDQUFDO1lBQ3BCLEtBQUssS0FBSyxDQUFDO1lBQ1gsS0FBSyxLQUFLO2dCQUNSLE1BQU0sV0FBVyxHQUFHLE9BQU8s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
144
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVtcGxhdGVzLmZvcm1hdHRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3RzL21vZF9mb3JtYXQvZm9ybWF0dGVycy90ZW1wbGF0ZXMuZm9ybWF0dGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUU1RCxPQUFPLEtBQUssT0FBTyxNQUFNLG1CQUFtQixDQUFDO0FBQzdDLE9BQU8sS0FBSyxLQUFLLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEMsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUU5RCxNQUFNLE9BQU8sa0JBQW1CLFNBQVEsYUFBYTtJQUNuRCxJQUFJLElBQUk7UUFDTixPQUFPLFdBQVcsQ0FBQztJQUNyQixDQUFDO0lBRUQ7O09BRUc7SUFDSyxLQUFLLENBQUMsY0FBYyxDQUFDLFlBQW9CO1FBQy9DLE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFFeEUsTUFBTSxZQUFZLEdBQUcsSUFBSSxPQUFPLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNyRSxNQUFNLFlBQVksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBRXpDLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQztRQUNyRCxJQUFJLFdBQVcsRUFBRSxDQUFDO1lBQ2hCLE1BQU0sWUFBWSxDQUFDLGVBQWUsQ0FBQztnQkFDakMsTUFBTSxFQUFFLFdBQVcsQ0FBQyxNQUFNO2dCQUMxQixXQUFXLEVBQUUsV0FBVyxDQUFDLFdBQVc7YUFDckMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUVELE1BQU0sYUFBYSxHQUFHLE1BQU0sWUFBWSxDQUFDLGNBQWMsRUFBRSxDQUFD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
@@ -7,4 +7,5 @@ import * as smartobject from '@push.rocks/smartobject';
7
7
  import * as smartnpm from '@push.rocks/smartnpm';
8
8
  import * as smartconfig from '@push.rocks/smartconfig';
9
9
  import * as smartdiff from '@push.rocks/smartdiff';
10
- export { path, smartfile, smartinteract, smartlegal, smartobject, smartnpm, smartconfig, smartdiff, };
10
+ import * as smartscaf from '@push.rocks/smartscaf';
11
+ export { path, smartfile, smartinteract, smartlegal, smartobject, smartnpm, smartconfig, smartdiff, smartscaf, };
@@ -7,5 +7,6 @@ import * as smartobject from '@push.rocks/smartobject';
7
7
  import * as smartnpm from '@push.rocks/smartnpm';
8
8
  import * as smartconfig from '@push.rocks/smartconfig';
9
9
  import * as smartdiff from '@push.rocks/smartdiff';
10
- export { path, smartfile, smartinteract, smartlegal, smartobject, smartnpm, smartconfig, smartdiff, };
11
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kLnBsdWdpbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9tb2RfZm9ybWF0L21vZC5wbHVnaW5zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsZUFBZSxDQUFDO0FBRTlCLE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBQzdCLE9BQU8sS0FBSyxTQUFTLE1BQU0sdUJBQXVCLENBQUM7QUFDbkQsT0FBTyxLQUFLLGFBQWEsTUFBTSwyQkFBMkIsQ0FBQztBQUMzRCxPQUFPLEtBQUssVUFBVSxNQUFNLHdCQUF3QixDQUFDO0FBQ3JELE9BQU8sS0FBSyxXQUFXLE1BQU0seUJBQXlCLENBQUM7QUFDdkQsT0FBTyxLQUFLLFFBQVEsTUFBTSxzQkFBc0IsQ0FBQztBQUNqRCxPQUFPLEtBQUssV0FBVyxNQUFNLHlCQUF5QixDQUFDO0FBQ3ZELE9BQU8sS0FBSyxTQUFTLE1BQU0sdUJBQXVCLENBQUM7QUFFbkQsT0FBTyxFQUNMLElBQUksRUFDSixTQUFTLEVBQ1QsYUFBYSxFQUNiLFVBQVUsRUFDVixXQUFXLEVBQ1gsUUFBUSxFQUNSLFdBQVcsRUFDWCxTQUFTLEdBQ1YsQ0FBQyJ9
10
+ import * as smartscaf from '@push.rocks/smartscaf';
11
+ export { path, smartfile, smartinteract, smartlegal, smartobject, smartnpm, smartconfig, smartdiff, smartscaf, };
12
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kLnBsdWdpbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9tb2RfZm9ybWF0L21vZC5wbHVnaW5zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsZUFBZSxDQUFDO0FBRTlCLE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBQzdCLE9BQU8sS0FBSyxTQUFTLE1BQU0sdUJBQXVCLENBQUM7QUFDbkQsT0FBTyxLQUFLLGFBQWEsTUFBTSwyQkFBMkIsQ0FBQztBQUMzRCxPQUFPLEtBQUssVUFBVSxNQUFNLHdCQUF3QixDQUFDO0FBQ3JELE9BQU8sS0FBSyxXQUFXLE1BQU0seUJBQXlCLENBQUM7QUFDdkQsT0FBTyxLQUFLLFFBQVEsTUFBTSxzQkFBc0IsQ0FBQztBQUNqRCxPQUFPLEtBQUssV0FBVyxNQUFNLHlCQUF5QixDQUFDO0FBQ3ZELE9BQU8sS0FBSyxTQUFTLE1BQU0sdUJBQXVCLENBQUM7QUFDbkQsT0FBTyxLQUFLLFNBQVMsTUFBTSx1QkFBdUIsQ0FBQztBQUVuRCxPQUFPLEVBQ0wsSUFBSSxFQUNKLFNBQVMsRUFDVCxhQUFhLEVBQ2IsVUFBVSxFQUNWLFdBQVcsRUFDWCxRQUFRLEVBQ1IsV0FBVyxFQUNYLFNBQVMsRUFDVCxTQUFTLEdBQ1YsQ0FBQyJ9
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@git.zone/cli",
3
3
  "private": false,
4
- "version": "2.13.11",
4
+ "version": "2.13.13",
5
5
  "description": "A comprehensive CLI tool for enhancing and managing local development workflows with gitzone utilities, focusing on project setup, version control, code formatting, and template management.",
6
6
  "main": "dist_ts/index.ts",
7
7
  "typings": "dist_ts/index.d.ts",
@@ -86,7 +86,7 @@
86
86
  "@push.rocks/smartopen": "^2.0.0",
87
87
  "@push.rocks/smartpath": "^6.0.0",
88
88
  "@push.rocks/smartpromise": "^4.2.3",
89
- "@push.rocks/smartscaf": "^4.0.19",
89
+ "@push.rocks/smartscaf": "^4.0.21",
90
90
  "@push.rocks/smartshell": "^3.3.7",
91
91
  "@push.rocks/smartunique": "^3.0.9",
92
92
  "@push.rocks/smartupdate": "^2.0.6",
@@ -3,6 +3,6 @@
3
3
  */
4
4
  export const commitinfo = {
5
5
  name: '@git.zone/cli',
6
- version: '2.13.10',
6
+ version: '2.13.13',
7
7
  description: 'A comprehensive CLI tool for enhancing and managing local development workflows with gitzone utilities, focusing on project setup, version control, code formatting, and template management.'
8
8
  }
@@ -9,6 +9,32 @@ export class TemplatesFormatter extends BaseFormatter {
9
9
  return 'templates';
10
10
  }
11
11
 
12
+ /**
13
+ * Render a template directory through smartscaf and return a map of path → content.
14
+ */
15
+ private async renderTemplate(templateName: string): Promise<Map<string, string>> {
16
+ const templateDir = plugins.path.join(paths.templatesDir, templateName);
17
+
18
+ const scafTemplate = new plugins.smartscaf.ScafTemplate(templateDir);
19
+ await scafTemplate.readTemplateFromDir();
20
+
21
+ const gitzoneData = this.project.gitzoneConfig?.data;
22
+ if (gitzoneData) {
23
+ await scafTemplate.supplyVariables({
24
+ module: gitzoneData.module,
25
+ projectType: gitzoneData.projectType,
26
+ });
27
+ }
28
+
29
+ const renderedFiles = await scafTemplate.renderToMemory();
30
+
31
+ const fileMap = new Map<string, string>();
32
+ for (const file of renderedFiles) {
33
+ fileMap.set(file.path, file.contents.toString());
34
+ }
35
+ return fileMap;
36
+ }
37
+
12
38
  async analyze(): Promise<IPlannedChange[]> {
13
39
  const changes: IPlannedChange[] = [];
14
40
  const project = this.project;
@@ -25,7 +51,8 @@ export class TemplatesFormatter extends BaseFormatter {
25
51
  switch (projectType) {
26
52
  case 'npm':
27
53
  case 'wcc':
28
- const accessLevel = project.gitzoneConfig?.data?.npmciOptions?.npmAccessLevel;
54
+ const accessLevel = (project.gitzoneConfig?.data as any)?.release?.accessLevel
55
+ || project.gitzoneConfig?.data?.npmciOptions?.npmAccessLevel;
29
56
  const ciTemplate = accessLevel === 'public' ? 'ci_default' : 'ci_default_private';
30
57
  const ciChanges = await this.analyzeTemplate(ciTemplate, [
31
58
  { templatePath: '.gitea/workflows/default_nottags.yaml', destPath: '.gitea/workflows/default_nottags.yaml' },
@@ -80,53 +107,47 @@ export class TemplatesFormatter extends BaseFormatter {
80
107
  const changes: IPlannedChange[] = [];
81
108
  const templateDir = plugins.path.join(paths.templatesDir, templateName);
82
109
 
83
- // Check if template exists
84
110
  const templateExists = await plugins.smartfs.directory(templateDir).exists();
85
111
  if (!templateExists) {
86
112
  logVerbose(`Template ${templateName} not found`);
87
113
  return changes;
88
114
  }
89
115
 
116
+ let renderedFiles: Map<string, string>;
117
+ try {
118
+ renderedFiles = await this.renderTemplate(templateName);
119
+ } catch (error) {
120
+ logVerbose(`Failed to render template ${templateName}: ${error.message}`);
121
+ return changes;
122
+ }
123
+
90
124
  for (const file of files) {
91
- const templateFilePath = plugins.path.join(templateDir, file.templatePath);
92
- const destFilePath = file.destPath;
125
+ // Look up by templatePath first, then destPath (frontmatter may rename files)
126
+ const processedContent = renderedFiles.get(file.templatePath)
127
+ || renderedFiles.get(file.destPath);
93
128
 
94
- // Check if template file exists
95
- const fileExists = await plugins.smartfs.file(templateFilePath).exists();
96
- if (!fileExists) {
97
- logVerbose(`Template file ${templateFilePath} not found`);
129
+ if (!processedContent) {
130
+ logVerbose(`Template file ${file.templatePath} not found in rendered output`);
98
131
  continue;
99
132
  }
100
133
 
101
- try {
102
- // Read template content
103
- const templateContent = (await plugins.smartfs
104
- .file(templateFilePath)
134
+ const destExists = await plugins.smartfs.file(file.destPath).exists();
135
+ let currentContent = '';
136
+ if (destExists) {
137
+ currentContent = (await plugins.smartfs
138
+ .file(file.destPath)
105
139
  .encoding('utf8')
106
140
  .read()) as string;
141
+ }
107
142
 
108
- // Check if destination file exists
109
- const destExists = await plugins.smartfs.file(destFilePath).exists();
110
- let currentContent = '';
111
- if (destExists) {
112
- currentContent = (await plugins.smartfs
113
- .file(destFilePath)
114
- .encoding('utf8')
115
- .read()) as string;
116
- }
117
-
118
- // Only add change if content differs
119
- if (templateContent !== currentContent) {
120
- changes.push({
121
- type: destExists ? 'modify' : 'create',
122
- path: destFilePath,
123
- module: this.name,
124
- description: `Apply template ${templateName}/${file.templatePath}`,
125
- content: templateContent,
126
- });
127
- }
128
- } catch (error) {
129
- logVerbose(`Failed to read template ${templateFilePath}: ${error.message}`);
143
+ if (processedContent !== currentContent) {
144
+ changes.push({
145
+ type: destExists ? 'modify' : 'create',
146
+ path: file.destPath,
147
+ module: this.name,
148
+ description: `Apply template ${templateName}/${file.templatePath}`,
149
+ content: processedContent,
150
+ });
130
151
  }
131
152
  }
132
153
 
@@ -8,6 +8,7 @@ import * as smartobject from '@push.rocks/smartobject';
8
8
  import * as smartnpm from '@push.rocks/smartnpm';
9
9
  import * as smartconfig from '@push.rocks/smartconfig';
10
10
  import * as smartdiff from '@push.rocks/smartdiff';
11
+ import * as smartscaf from '@push.rocks/smartscaf';
11
12
 
12
13
  export {
13
14
  path,
@@ -18,4 +19,5 @@ export {
18
19
  smartnpm,
19
20
  smartconfig,
20
21
  smartdiff,
22
+ smartscaf,
21
23
  };