Initializing A TypeScript Project For AI Workflow Orchestrator
Hey guys! So, we're embarking on an exciting journey to build "aiflow," an AI Workflow Orchestrator CLI tool. This first step is crucial β setting up the project's foundation. Think of it as laying the groundwork for a skyscraper; we need a solid base to build upon. This article will guide you through initializing a TypeScript project, step by step, ensuring we have a robust and well-structured environment for our development.
Understanding the Project Structure
Before diving into the code, let's visualize the project structure. Having a clear structure from the start helps maintainability and scalability. We're aiming for the following:
aiflow/
βββ src/
β βββ cli/
β β βββ index.ts
β βββ core/
β βββ agents/
β βββ integrations/
β βββ utils/
βββ tests/
βββ workflows/
βββ package.json
βββ tsconfig.json
βββ jest.config.js
βββ .eslintrc.js
βββ .prettierrc
βββ .gitignore
βββ README.md
src/
: This is where our main application code lives. It's further divided into modules likecli
,core
,agents
,integrations
, andutils
, each serving a specific purpose.cli/
: This directory will house the code for our command-line interface.core/
: Contains the core logic and functionalities of aiflow.agents/
: This is where we'll define and manage our AI agents.integrations/
: Handles integrations with external services and APIs.utils/
: Utility functions and helper modules.tests/
: Contains our unit and integration tests.workflows/
: This directory might hold workflow definitions or related files (we can adjust this later if needed).package.json
: Our npm configuration file, listing dependencies and scripts.tsconfig.json
: TypeScript compiler options.jest.config.js
: Jest configuration for our testing framework..eslintrc.js
: ESLint configuration for linting our code..prettierrc
: Prettier configuration for code formatting..gitignore
: Specifies files and directories that Git should ignore.README.md
: A vital file for project documentation.
Step-by-Step Initialization Process
Letβs break down the initialization process into manageable steps.
1. Initializing the npm Project
First, we'll use npm init
to create a package.json
file. This file is the heart of our Node.js project, managing dependencies, scripts, and other metadata. Open your terminal, navigate to your desired project directory, and run:
npm init
You'll be prompted to answer a series of questions, such as the project name, version, description, and entry point. You can accept the defaults for now and modify them later in package.json
. Once completed, you'll have a package.json
file in your project root.
2. Installing TypeScript and Core Dependencies
Next, we need to install TypeScript and our core dependencies. We'll use npm install
to fetch these packages and add them to our project. Hereβs the command to run:
npm install commander js-yaml chalk zod
This command installs the production dependencies. These are the packages our application needs to run in a production environment:
commander
: A library for building command-line interfaces.js-yaml
: A library for parsing and stringifying YAML files.chalk
: A library for adding colors to console output.zod
: A TypeScript-first schema declaration and validation library.
Now, let's install our development dependencies. These are tools we need during development, but not in production:
npm install typescript @types/node @types/js-yaml jest @types/jest ts-jest eslint @typescript-eslint/parser @typescript-eslint/eslint-plugin prettier esbuild -D
Hereβs a breakdown of these development dependencies:
typescript
: The TypeScript compiler.@types/node
: TypeScript type definitions for Node.js.@types/js-yaml
: TypeScript type definitions forjs-yaml
.jest
: A popular JavaScript testing framework.@types/jest
: TypeScript type definitions for Jest.ts-jest
: A Jest preprocessor for TypeScript.eslint
: A JavaScript linter.@typescript-eslint/parser
: An ESLint parser for TypeScript.@typescript-eslint/eslint-plugin
: ESLint rules for TypeScript.prettier
: A code formatter.esbuild
: An extremely fast JavaScript bundler and minifier.
The -D
flag is shorthand for --save-dev
, which tells npm to save these packages as development dependencies.
3. Creating tsconfig.json
with Strict Mode Enabled
Now, let's create our tsconfig.json
file. This file configures the TypeScript compiler. We'll enable strict mode to catch potential errors early on. Create a file named tsconfig.json
in the project root and paste the following configuration:
{
"compilerOptions": {
"target": "ES2022",
"module": "commonjs",
"lib": ["ES2022"],
"outDir": "./dist",
"rootDir": "./src",
"strict": true,
"esModuleInterop": true,
"skipLibCheck": true,
"forceConsistentCasingInFileNames": true,
"resolveJsonModule": true,
"declaration": true,
"declarationMap": true,
"sourceMap": true
},
"include": ["src/**/*"],
"exclude": ["node_modules", "dist", "tests"]
}
Let's break down these options:
target
: Specifies the ECMAScript target version (ES2022 in this case).module
: Specifies the module system (CommonJS).lib
: Includes library files for specific ECMAScript versions.outDir
: Specifies the output directory for compiled JavaScript files (./dist
).rootDir
: Specifies the root directory of the source files (./src
).strict
: Enables all strict type-checking options.esModuleInterop
: Enables interoperability between CommonJS and ES Modules.skipLibCheck
: Skips type checking of declaration files.forceConsistentCasingInFileNames
: Enforces consistent casing in file names.resolveJsonModule
: Allows importing JSON files as modules.declaration
: Generates declaration files (.d.ts
).declarationMap
: Generates source map files for declaration files.sourceMap
: Generates source map files for debugging.include
: Specifies the files to include in the compilation (src/**/*
).exclude
: Specifies the files to exclude (node_modules
,dist
,tests
).
4. Setting Up Jest for Testing with TypeScript Support
Testing is crucial for building reliable software. We'll use Jest, a popular JavaScript testing framework, with ts-jest
for TypeScript support. Create a file named jest.config.js
in the project root and add the following configuration:
/** @type {import('ts-jest').JestConfigWithTsJest} */
module.exports = {
preset: 'ts-jest',
testEnvironment: 'node',
modulePathIgnorePatterns: ["<rootDir>/dist/"],
};
This configuration tells Jest to use the ts-jest
preset for TypeScript support and sets the test environment to Node.js. We've also added modulePathIgnorePatterns
to ignore the dist
directory, where our compiled JavaScript files will reside.
5. Configuring ESLint and Prettier
ESLint helps us maintain code quality by enforcing coding standards, while Prettier automatically formats our code for consistency. Let's set them up.
First, create a file named .eslintrc.js
in the project root and add the following configuration:
module.exports = {
parser: '@typescript-eslint/parser',
plugins: ['@typescript-eslint'],
extends: [
'eslint:recommended',
'plugin:@typescript-eslint/recommended',
'plugin:@typescript-eslint/recommended-requiring-type-checking',
],
parserOptions: {
ecmaVersion: 'latest',
sourceType: 'module',
project: ['./tsconfig.json'],
},
rules: {
'no-unused-vars': 'warn',
'@typescript-eslint/no-unused-vars': 'warn',
'@typescript-eslint/explicit-function-return-type': 'warn',
},
};
This configuration tells ESLint to use the @typescript-eslint/parser
to parse TypeScript code and enables the recommended rules from @typescript-eslint/eslint-plugin
. We also extend the recommended rules requiring type checking and set some custom rules, such as warning on unused variables and requiring explicit function return types.
Now, let's configure Prettier. Create a file named .prettierrc
in the project root and add the following configuration:
{
"semi": false,
"trailingComma": "all",
"singleQuote": true,
"printWidth": 120,
"tabWidth": 2
}
This configuration tells Prettier to:
- Omit semicolons.
- Add trailing commas where possible.
- Use single quotes.
- Set a print width of 120 characters.
- Use a tab width of 2 spaces.
6. Creating the Directory Structure
Now, let's create the directory structure we discussed earlier. You can use the mkdir
command in your terminal:
mkdir src src/cli src/core src/agents src/integrations src/utils tests workflows
This command creates the src
, src/cli
, src/core
, src/agents
, src/integrations
, src/utils
, tests
, and workflows
directories.
7. Adding a Basic CLI Entry Point
Let's create a basic CLI entry point that prints the aiflow version. Create a file named index.ts
inside the src/cli
directory and add the following code:
#!/usr/bin/env node
import { Command } from 'commander';
import chalk from 'chalk';
const program = new Command();
program
.name('aiflow')
.description('AI Workflow Orchestrator - Manage AI agents for development tasks')
.version('0.1.0');
program.parse();
if (!process.argv.slice(2).length) {
console.log(chalk.blue('aiflow v0.1.0'));
}
This code uses the commander
library to define a command-line program named aiflow
. It sets the description and version and prints the version if no arguments are provided.
The #!/usr/bin/env node
shebang at the beginning of the file tells the system to execute this script using Node.js.
8. Adding npm Scripts
Finally, let's add npm scripts to our package.json
file for common tasks like building, testing, linting, and formatting. Open package.json
and add the following scripts to the scripts
section:
"scripts": {
"build": "esbuild src/cli/index.ts --bundle --outfile=dist/cli/index.js --platform=node --format=cjs",
"test": "jest",
"lint": "eslint src --ext .ts",
"format": "prettier --write src/**/*.ts",
"prepare": "npm run build",
"version": "node dist/cli/index.js",
"postversion": "git push && git push --tags"
},
Hereβs what these scripts do:
build
: Builds the project usingesbuild
, bundling thesrc/cli/index.ts
file intodist/cli/index.js
.test
: Runs Jest tests.lint
: Runs ESLint on TypeScript files in thesrc
directory.format
: Formats TypeScript files using Prettier.prepare
: This script runs automatically duringnpm install
andnpm update
, ensuring our code is built before being used.version
: Prints the version of the CLI.postversion
: Pushes the changes and tags to Git after versioning.
Acceptance Criteria Check
Now that we've set up our project, let's ensure we meet the acceptance criteria.
- Project builds without errors using
npm run build
: Runnpm run build
in your terminal. If the build completes without errors, you're good to go. - Jest runs successfully with
npm test
: Runnpm test
. Jest should run and pass (though we don't have any tests yet, it should run without errors). - ESLint passes with
npm run lint
: Runnpm run lint
. ESLint should run and pass without any errors or warnings (we might get warnings about unused variables, which we'll address later). - CLI can be run with
node dist/cli/index.js
and shows version: Runnode dist/cli/index.js
in your terminal. It should printaiflow v0.1.0
. - TypeScript strict mode is enabled: We enabled strict mode in
tsconfig.json
, so this is already taken care of. - All configuration files are properly set up: We've created and configured
tsconfig.json
,jest.config.js
,.eslintrc.js
, and.prettierrc
, so we're all set.
Conclusion
Guys, we've successfully initialized our TypeScript project for aiflow! We've set up the project structure, installed dependencies, configured TypeScript, Jest, ESLint, and Prettier, and added a basic CLI entry point. This is a fantastic foundation for building our AI Workflow Orchestrator. In the next steps, we'll dive deeper into implementing the core functionalities of aiflow. Stay tuned!
Repair Input Keywords
- How to initialize an npm project? Corrected: How do I initialize an npm project?
- How to set up Jest for testing with TypeScript support? Corrected: What are the steps to set up Jest for testing in a TypeScript project?
SEO Title
Initializing a TypeScript Project for AI Workflow Orchestrator