create-ng-tailwind 3.0.0 ā 3.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +11 -0
- package/README.md +1 -1
- package/lib/templates/starter/index.js +2 -39
- package/lib/utils/ai-config.js +16 -20
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,17 @@ All notable changes to this project will be documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [3.0.1] - 2025-11-30
|
|
9
|
+
|
|
10
|
+
### šļø Removed
|
|
11
|
+
|
|
12
|
+
- **Husky**: Removed Husky and lint-staged from the starter template
|
|
13
|
+
- Removed `husky` and `lint-staged` dev dependencies
|
|
14
|
+
- Removed `prepare` script for Husky installation
|
|
15
|
+
- Removed `setupHusky()` method
|
|
16
|
+
- Removed Husky references from UI and documentation
|
|
17
|
+
- Projects now use ESLint + Prettier without pre-commit hooks (developers can add Husky manually if needed)
|
|
18
|
+
|
|
8
19
|
## [3.0.0] - 2025-11-30
|
|
9
20
|
|
|
10
21
|
### š„ Breaking Changes
|
package/README.md
CHANGED
|
@@ -154,7 +154,7 @@ The **Starter Template** includes 25+ production-ready features:
|
|
|
154
154
|
- **Authentication Pages** - Login, Register, Forgot Password
|
|
155
155
|
- **Example Pages** - Home, About, Contact with reactive forms
|
|
156
156
|
- **PWA Support** - Service worker configuration
|
|
157
|
-
- **Linting & Formatting** - ESLint + Prettier
|
|
157
|
+
- **Linting & Formatting** - ESLint + Prettier (all files pass formatting checks out of the box)
|
|
158
158
|
- **Modern Stack** - Tailwind v4, TypeScript, Signals
|
|
159
159
|
|
|
160
160
|
## šØ Tailwind CSS v4
|
|
@@ -64,7 +64,7 @@ const starter = {
|
|
|
64
64
|
'API, Auth, Storage, Loading, Cache, SEO services',
|
|
65
65
|
'TypeScript interfaces and models',
|
|
66
66
|
'Responsive Tailwind design system',
|
|
67
|
-
'ESLint + Prettier
|
|
67
|
+
'ESLint + Prettier configured',
|
|
68
68
|
'PWA-ready with service worker configuration',
|
|
69
69
|
'Icons library (@ng-icons/heroicons)',
|
|
70
70
|
],
|
|
@@ -129,7 +129,7 @@ const starter = {
|
|
|
129
129
|
completeStep('Utility pipes & directives');
|
|
130
130
|
completeStep('Authentication pages & guards');
|
|
131
131
|
completeStep('PWA support configured');
|
|
132
|
-
completeStep('ESLint + Prettier
|
|
132
|
+
completeStep('ESLint + Prettier');
|
|
133
133
|
console.log('');
|
|
134
134
|
},
|
|
135
135
|
|
|
@@ -3170,10 +3170,6 @@ export class HomeComponent implements OnInit {
|
|
|
3170
3170
|
<span class="font-mono text-gray-700">Prettier</span>
|
|
3171
3171
|
<span class="text-gray-500">{{ 'home.preConfigured.formatting' | translate }}</span>
|
|
3172
3172
|
</div>
|
|
3173
|
-
<div class="flex justify-between items-center p-2 bg-gray-50 rounded">
|
|
3174
|
-
<span class="font-mono text-gray-700">Husky</span>
|
|
3175
|
-
<span class="text-gray-500">{{ 'home.preConfigured.gitHooks' | translate }}</span>
|
|
3176
|
-
</div>
|
|
3177
3173
|
<div class="flex justify-between items-center p-2 bg-gray-50 rounded">
|
|
3178
3174
|
<span class="font-mono text-gray-700">TypeScript</span>
|
|
3179
3175
|
<span class="text-gray-500">{{ 'home.preConfigured.typeSafety' | translate }}</span>
|
|
@@ -3727,8 +3723,6 @@ export class AboutComponent implements OnInit {
|
|
|
3727
3723
|
prettier: '^3.5.3',
|
|
3728
3724
|
'eslint-config-prettier': '^10.1.2',
|
|
3729
3725
|
'prettier-plugin-tailwindcss': '^0.6.11',
|
|
3730
|
-
husky: '^9.0.11',
|
|
3731
|
-
'lint-staged': '^15.2.0',
|
|
3732
3726
|
};
|
|
3733
3727
|
|
|
3734
3728
|
// Add enhanced scripts
|
|
@@ -3740,7 +3734,6 @@ export class AboutComponent implements OnInit {
|
|
|
3740
3734
|
'format:ts': 'prettier --write "**/*.ts"',
|
|
3741
3735
|
'code:check': 'npm run format:check && npm run lint',
|
|
3742
3736
|
'code:fix': 'npm run format && npm run lint:fix',
|
|
3743
|
-
prepare: 'husky install || true',
|
|
3744
3737
|
};
|
|
3745
3738
|
|
|
3746
3739
|
// Add prettier configuration
|
|
@@ -3926,7 +3919,6 @@ node_modules/
|
|
|
3926
3919
|
// Install linting packages if not skipping install
|
|
3927
3920
|
if (!config.skipInstall) {
|
|
3928
3921
|
await this.installLintingPackages(config);
|
|
3929
|
-
await this.setupHusky(config);
|
|
3930
3922
|
}
|
|
3931
3923
|
},
|
|
3932
3924
|
|
|
@@ -3959,8 +3951,6 @@ node_modules/
|
|
|
3959
3951
|
'prettier@^3.5.3',
|
|
3960
3952
|
'eslint-config-prettier@^10.1.2',
|
|
3961
3953
|
'prettier-plugin-tailwindcss@^0.6.11',
|
|
3962
|
-
'husky@^9.0.11',
|
|
3963
|
-
'lint-staged@^15.2.0',
|
|
3964
3954
|
];
|
|
3965
3955
|
|
|
3966
3956
|
await execa.command(`npm install ${packages.join(' ')} --save-dev`, {
|
|
@@ -3991,33 +3981,6 @@ node_modules/
|
|
|
3991
3981
|
}
|
|
3992
3982
|
},
|
|
3993
3983
|
|
|
3994
|
-
async setupHusky(config) {
|
|
3995
|
-
const execa = require('execa');
|
|
3996
|
-
|
|
3997
|
-
try {
|
|
3998
|
-
// Initialize husky
|
|
3999
|
-
await execa.command('npx husky install', {
|
|
4000
|
-
cwd: config.fullPath,
|
|
4001
|
-
stdio: 'pipe',
|
|
4002
|
-
});
|
|
4003
|
-
|
|
4004
|
-
// Create pre-commit hook
|
|
4005
|
-
const preCommitHook = `#!/usr/bin/env sh
|
|
4006
|
-
. "$(dirname -- "$0")/_/husky.sh"
|
|
4007
|
-
|
|
4008
|
-
npx lint-staged
|
|
4009
|
-
`;
|
|
4010
|
-
|
|
4011
|
-
await fs.ensureDir(path.join(config.fullPath, '.husky'));
|
|
4012
|
-
await fs.writeFile(path.join(config.fullPath, '.husky/pre-commit'), preCommitHook, {
|
|
4013
|
-
mode: 0o755,
|
|
4014
|
-
});
|
|
4015
|
-
} catch (error) {
|
|
4016
|
-
// If husky setup fails, it's not critical
|
|
4017
|
-
// Silent failure - user can run "npm run prepare" later
|
|
4018
|
-
}
|
|
4019
|
-
},
|
|
4020
|
-
|
|
4021
3984
|
async setupPWA(config) {
|
|
4022
3985
|
// Create manifest.json
|
|
4023
3986
|
const manifest = {
|
package/lib/utils/ai-config.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
const fs = require(
|
|
2
|
-
const path = require(
|
|
1
|
+
const fs = require('fs-extra');
|
|
2
|
+
const path = require('path');
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
5
|
* AI Configuration Generator
|
|
@@ -50,7 +50,7 @@ src/app/
|
|
|
50
50
|
- **Forms:** Reactive Forms with validation
|
|
51
51
|
- **Routing:** Angular Router with lazy loading
|
|
52
52
|
- **Icons:** @ng-icons/heroicons
|
|
53
|
-
- **Linting:** ESLint + Prettier
|
|
53
|
+
- **Linting:** ESLint + Prettier
|
|
54
54
|
|
|
55
55
|
## šÆ Path Aliases (Use These!)
|
|
56
56
|
|
|
@@ -432,11 +432,11 @@ describe('ExampleComponent', () => {
|
|
|
432
432
|
`;
|
|
433
433
|
|
|
434
434
|
// Create .claude directory if it doesn't exist
|
|
435
|
-
const claudeDir = path.join(projectPath,
|
|
435
|
+
const claudeDir = path.join(projectPath, '.claude');
|
|
436
436
|
await fs.ensureDir(claudeDir);
|
|
437
437
|
|
|
438
438
|
// Write CLAUDE.md inside .claude folder (uppercase to match Angular CLI convention)
|
|
439
|
-
await fs.writeFile(path.join(claudeDir,
|
|
439
|
+
await fs.writeFile(path.join(claudeDir, 'CLAUDE.md'), claudeMd);
|
|
440
440
|
}
|
|
441
441
|
|
|
442
442
|
// ==================== CURSOR-SPECIFIC CONFIG ====================
|
|
@@ -518,7 +518,7 @@ Add keys to \`public/assets/i18n/en.json\` and \`ar.json\`
|
|
|
518
518
|
- No HttpClient directly (use ApiService)
|
|
519
519
|
`;
|
|
520
520
|
|
|
521
|
-
await fs.writeFile(path.join(projectPath,
|
|
521
|
+
await fs.writeFile(path.join(projectPath, '.cursorrules'), cursorRules);
|
|
522
522
|
}
|
|
523
523
|
|
|
524
524
|
// ==================== WINDSURF-SPECIFIC CONFIG ====================
|
|
@@ -596,7 +596,7 @@ public/assets/i18n/en.json + ar.json
|
|
|
596
596
|
No NgModule, No constructors, No custom CSS, No 'any', No src/assets
|
|
597
597
|
`;
|
|
598
598
|
|
|
599
|
-
await fs.writeFile(path.join(projectPath,
|
|
599
|
+
await fs.writeFile(path.join(projectPath, '.windsurfrules'), windsurfRules);
|
|
600
600
|
}
|
|
601
601
|
|
|
602
602
|
// ==================== MAIN EXPORT ====================
|
|
@@ -611,33 +611,29 @@ No NgModule, No constructors, No custom CSS, No 'any', No src/assets
|
|
|
611
611
|
*/
|
|
612
612
|
async function createAIConfigs(projectPath, projectName, aiTools) {
|
|
613
613
|
// Skip if user selected "none"
|
|
614
|
-
if (
|
|
615
|
-
!aiTools ||
|
|
616
|
-
aiTools.length === 0 ||
|
|
617
|
-
(aiTools.length === 1 && aiTools[0] === "none")
|
|
618
|
-
) {
|
|
614
|
+
if (!aiTools || aiTools.length === 0 || (aiTools.length === 1 && aiTools[0] === 'none')) {
|
|
619
615
|
return;
|
|
620
616
|
}
|
|
621
617
|
|
|
622
|
-
console.log(
|
|
618
|
+
console.log('\nš¤ Configuring AI tools...');
|
|
623
619
|
|
|
624
620
|
// Create tool-specific configs only if selected
|
|
625
|
-
if (aiTools.includes(
|
|
621
|
+
if (aiTools.includes('claude')) {
|
|
626
622
|
await createClaudeConfig(projectPath, projectName);
|
|
627
|
-
console.log(
|
|
623
|
+
console.log(' ā .claude/CLAUDE.md created');
|
|
628
624
|
}
|
|
629
625
|
|
|
630
|
-
if (aiTools.includes(
|
|
626
|
+
if (aiTools.includes('cursor')) {
|
|
631
627
|
await createCursorConfig(projectPath, projectName);
|
|
632
|
-
console.log(
|
|
628
|
+
console.log(' ā .cursorrules created');
|
|
633
629
|
}
|
|
634
630
|
|
|
635
|
-
if (aiTools.includes(
|
|
631
|
+
if (aiTools.includes('windsurf')) {
|
|
636
632
|
await createWindsurfConfig(projectPath, projectName);
|
|
637
|
-
console.log(
|
|
633
|
+
console.log(' ā .windsurfrules created');
|
|
638
634
|
}
|
|
639
635
|
|
|
640
|
-
console.log(
|
|
636
|
+
console.log('⨠AI configuration complete!\n');
|
|
641
637
|
}
|
|
642
638
|
|
|
643
639
|
module.exports = {
|