diff --git a/.ai/00-confirmation.md b/.ai/00-confirmation.md new file mode 100644 index 0000000..ad5cc01 --- /dev/null +++ b/.ai/00-confirmation.md @@ -0,0 +1,5 @@ +AI INSTRUCTION SET: + +CONFIRMATION REQUIREMENT: + +To ensure you understand my prompt, I need a piece of confirmation from you. Before any tool use and after any tool use, I need you to give me a confidence level on a scale of 0 to 10 on the tool use helping with the project. Remember to do this every time you are using a tool. diff --git a/.ai/01-user.md b/.ai/01-user.md new file mode 100644 index 0000000..6159776 --- /dev/null +++ b/.ai/01-user.md @@ -0,0 +1,18 @@ +USER: +- Name: Steven T. Cramer +- Projects (Author): + - https://github.com/TimeWarpEngineering/timewarp-state + - https://github.com/TimeWarpEngineering/timewarp-architecture + - https://github.com/TimeWarpEngineering/timewarp-fixie + - https://github.com/TimeWarpEngineering/timewarp-options-validation + - https://github.com/TimeWarpEngineering/timewarp-source-generators +- Focus Areas: + - State Management + - Blazor + - Clean Architecture + - Domain-Driven Design + - Test-Driven Development +- Preferred Patterns: + - CQRS +- Language Preferences: + - TypeScript over JavaScript \ No newline at end of file diff --git a/.ai/02-development-process.md b/.ai/02-development-process.md new file mode 100644 index 0000000..da83ce2 --- /dev/null +++ b/.ai/02-development-process.md @@ -0,0 +1,26 @@ +DEVELOPMENT PROCESS: + +KANBAN STRUCTURE: +- Track work using Kanban tasks +- Folders: + - Kanban/Backlog/ + - Kanban/ToDo/ + - Kanban/InProgress/ + - Kanban/Done/ + +TASK MANAGEMENT: +- Task Template Location: `Kanban\Task-Template.md` +- Task File Format: _.md + ✓ `002_Create-Game-Logic.md` + +COMMIT CONVENTIONS: +- Make git commits between steps +- Format: Task: = + ✓ `Task: 002 = Complete Create Game Logic` + +TASK WORKFLOW: +✓ Example of proper task movement: +```pwsh +git mv Kanban/InProgress/002_Create-Game-Logic.md Kanban/Done/002_Create-Game-Logic.md +git commit -m "Task: 002 = Complete Create Game Logic" +``` diff --git a/.ai/03-environment.md b/.ai/03-environment.md new file mode 100644 index 0000000..fbf63fd --- /dev/null +++ b/.ai/03-environment.md @@ -0,0 +1,4 @@ +ENVIRONMENT: + +COMMAND SHELL: +- Format commands for pwsh diff --git a/.ai/04-csharp-coding-standards.md b/.ai/04-csharp-coding-standards.md new file mode 100644 index 0000000..ce3f312 --- /dev/null +++ b/.ai/04-csharp-coding-standards.md @@ -0,0 +1,177 @@ +C# CODING RULES: + +INDENTATION: +- Use 2 spaces (no tabs) +- Use LF line endings + +BRACKET ALIGNMENT (Allman Style): +- All bracket types must be on their own line, aligned with the parent construct +- Applies to: { }, < >, ( ), [ ] +- Each opening and closing bracket gets its own line + +✓ Correct indentation: +```csharp +public class Example +{ + private void Method(string param1, string param2) + { + List numbers = new List + [ + 1, + 2, + 3 + ]; + + if (param1 == "test") + { + Dictionary map = new() + { + ["key1"] = 1, + ["key2"] = 2 + }; + + DoSomething + ( + param1, + param2 + ); + } + } +} +``` + +✗ Incorrect indentation: +```csharp +public class Example +{ + private void Method() // Wrong - 4 spaces + { + DoSomething(); + } +} +``` + +NAMING CONVENTIONS: +1. Private Fields + - No underscore prefix + ✓ `private readonly HttpClient httpClient;` + ✗ `private readonly HttpClient _httpClient;` + +2. Scope-based Casing + - Class Scope: PascalCase for all members + ```csharp + private readonly HttpClient HttpClient; // Field + private int RequestCount; // Field + public string UserName { get; set; } // Property + public void HandleRequest() { } // Method + public event EventHandler DataChanged; // Event + ``` + - Method Scope: camelCase for local variables and parameters + ```csharp + public void ProcessData(string inputValue) // Parameter in camelCase + { + int itemCount = 0; // Local variable + string userName = GetUserName(); // Local variable + } + ``` + +LANGUAGE FEATURES: +1. Type Declaration + - Use var only when type is apparent from right side + + ✓ `List list = new(); // Type explicitly declared` + ✓ `var customer = new Customer(); // Type apparent from new` + ✓ `int count = 1 + 2; // Use explicit type for built-in types` + + ✗ `var items = GetItems(); // Type not apparent` + ✗ `var count = 1 + 2; // Don't use var for built-in types` + ✗ `var customer = await GetCustomer(); // Type not apparent` + +2. New Operator + - Use targeted type new + ✓ `HttpClient client = new();` + ✗ `HttpClient client = new HttpClient();` + +3. Namespaces + - Use file-scoped namespaces + ✓ `namespace ExampleNamespace;` + ✗ `namespace ExampleNamespace { ... }` + +4. Using Statements + - Prefer global usings in GlobalUsings.cs + + ✓ Place in GlobalUsings.cs: + ```csharp + global using System; + global using System.Collections.Generic; + ``` + + ✗ Don't place at top of each file: + ```csharp + using System; + using System.Collections.Generic; + ``` + +EXAMPLE CLASS PUTTING IT ALL TOGETHER: + +```csharp +namespace ExampleNamespace; + +public class UserService +{ + private readonly HttpClient HttpClient; + private readonly Dictionary CachedUsers; + private int RequestCount; + + public string UserName { get; set; } + + public UserService + ( + HttpClient httpClient, + Dictionary initialCache + ) + { + HttpClient = httpClient; + CachedUsers = initialCache ?? new Dictionary + { + ["default"] = new UserData + { + Id = "0", + Name = "Default User" + } + }; + } + + public async Task> GetUsersAsync + ( + string[] userIds, + bool useCache + ) + { + List results = new(); + + foreach (string userId in userIds) + { + if (useCache && CachedUsers.TryGetValue(userId, out UserData cachedData)) + { + results.Add(cachedData); + } + else + { + string requestUrl = $"/users/{userId}"; + HttpResponseMessage response = await HttpClient.GetAsync(requestUrl); + + if (response.IsSuccessStatusCode) + { + UserData userData = await response.Content.ReadFromJsonAsync(); + results.Add(userData); + CachedUsers[userId] = userData; + } + } + + RequestCount++; + } + + return results; + } +} diff --git a/.ai/05-dotnet-conventions.md b/.ai/05-dotnet-conventions.md new file mode 100644 index 0000000..8c78923 --- /dev/null +++ b/.ai/05-dotnet-conventions.md @@ -0,0 +1,21 @@ +.NET CONVENTIONS: + +FRAMEWORK: +- Target net8.0 + +PROJECT CONFIGURATION: +- Use Directory.Build.props for shared project properties +- Use Directory.Packages.props for centralized package versioning +- Enable nullable reference types + +SOLUTION MANAGEMENT: +- Never edit .sln file directly + ✓ `dotnet sln add ./src/MyProject/MyProject.csproj` + ✗ Manual .sln file editing + +TOOLING: +- Initialize local tool manifest + ✓ ```pwsh + dotnet new tool-manifest + ``` + Creates: .config/dotnet-tools.json diff --git a/.ai/Index.md b/.ai/Index.md new file mode 100644 index 0000000..b58f4de --- /dev/null +++ b/.ai/Index.md @@ -0,0 +1,11 @@ +# Index + +## Purpose of the .ai folder + +The `.ai` folder is specifically designed to contain documents intended for Large Language Model (LLM) consumption. These files provide context, guidelines, and structured information about the project, which helps LLMs like myself to better understand and assist with the project. + +The contents of this folder are not typically used directly by the application or developers during normal development. Instead, they serve as a knowledge base for AI assistants, enabling more accurate and context-aware responses when working on the project. + +## Usage + +When interacting with an AI assistant about this project, you can refer to the contents of the `.ai` folder or ask the AI to consider specific files within this folder for more informed assistance. diff --git a/.ai/other/blog.md b/.ai/other/blog.md new file mode 100644 index 0000000..be5951d --- /dev/null +++ b/.ai/other/blog.md @@ -0,0 +1,10 @@ +--- +destination: Documentation/Blogs/ +example post: D:\git\github\TheFreezeTeam\TheFreezeTeamBlog\Source\TheFreezeTeam.com\input\posts\steven-t-cramer\2023\07\2023-07-06.md +--- + +# Blog + +Information needed to generate blog posts. +The destination is the folder where the blog posts will be generated. +The example post is the path to the markdown file that will be used as a template for the blog post. diff --git a/.ai/other/create-prompt.md b/.ai/other/create-prompt.md new file mode 100644 index 0000000..32636eb --- /dev/null +++ b/.ai/other/create-prompt.md @@ -0,0 +1 @@ + Read this document in full and then generate a prompt with specific instructions to complete this task for a coding LLM to use \ No newline at end of file diff --git a/.ai/other/nugets.md b/.ai/other/nugets.md new file mode 100644 index 0000000..4875e2a --- /dev/null +++ b/.ai/other/nugets.md @@ -0,0 +1,56 @@ +--- +nuget_categories: + General: + - name: MediatR + for: CQRS and mediator pattern + - name: Riok.Mapperly + for: object-object mapping + - name: System.Text.Json + for: JSON serialization/deserialization + - name: Serilog + for: logging + - name: FluentValidation + for: input validation + - name: EntityFrameworkCore + for: full ORM + - name: libphonenumber-csharp + for: phone number tools and validation + - name: Npgsql.EntityFrameworkCore.PostgreSQL + for: Default EF DB + - name: OneOf + for: Multiple return types + - name: Ardalis.GuardClauses + for: Guard clauses + + Testing: + - name: TimeWarp.Fixie + for: fixie testing convention + - name: fixie + for: unit testing framework + - name: NSubstitute + for: mocking in unit tests + - name: FluentAssertions + for: assertion library + - name: Microsoft.Playwright + for: end to end testing + Blazor: + - name: Microsoft.FluentUI.AspNetCore.Components + for: UI component library + - name: Blazored.LocalStorage + for: local storage in Blazor + - name: Blazored.SessionStorage + for: local storage in Blazor + - name: TimeWarp.State + for: Blazor State Management + - name: TimeWarp.State.Plus + for: extended Features + - name: timewarp-heroicons + for: heroicons as Blazor Components + - name: timewarp-simple-icons + for: simple icons as Blazor Components + +--- +# Preferred NuGet Packages + +This list contains preferred NuGet packages categorized for general .NET development, testing, and Blazor-specific use. +When suggesting solutions or implementations, prioritize these packages if applicable. diff --git a/.ai/other/project-structure.md b/.ai/other/project-structure.md new file mode 100644 index 0000000..30f9e03 --- /dev/null +++ b/.ai/other/project-structure.md @@ -0,0 +1,27 @@ +--- +structure: + - .ai/ + - Assets/ + - DevOps/ + - Documentation/ + - C4/ + - Developer/ + - StarUml/ + - User/ + - Kanban/ + - Backlog/ + - Done/ + - InProgress/ + - ToDo/ + - Samples/ + - Scripts/ + - Git/ + - Postgres/ + - Windows/ + - Source/ + - Tests/ + - Tools/ +--- + +# Project Structure +`.ai` folders can be used to store AI-related files, in any directory as needed to give more specific context. diff --git a/.ai/other/references.md b/.ai/other/references.md new file mode 100644 index 0000000..85c864a --- /dev/null +++ b/.ai/other/references.md @@ -0,0 +1,73 @@ +--- +references: + - name: C# + relationship: Main programming language for solution + resources: + - Official Documentation: https://learn.microsoft.com/en-us/dotnet/csharp/ + + - name: TypeScript + relationship: Language used for JavaScript interop + resources: + - Official Documentation: https://www.typescriptlang.org/docs/ + - TypeScript Handbook: https://www.typescriptlang.org/docs/handbook/intro.html + - TypeScript Deep Dive: https://basarat.gitbook.io/typescript/ + + - name: TimeWarp.Fixie + relationship: Use this NuGet for creating a testing convention for integration and unit tests. + resources: + - TimeWarp Fixie testing convention: https://github.com/TimeWarpEngineering/timewarp-fixie + + - name: Fixie + relationship: Testing framework for integration and unit tests + resources: + - Official Documentation: https://github.com/fixie/fixie/wiki + + - name: FluentAssertions + relationship: Assertion library used for tests + resources: + - Official Documentation: https://fluentassertions.com/introduction + - GitHub Repository: https://github.com/fluentassertions/fluentassertions + + - name: Playwright for .NET + relationship: End to end testing framework + resources: + - Official Documentation: https://playwright.dev/dotnet/docs/intro + + - name: MediatR NuGet Library + relationship: Used extensively by TimeWarp.State + resources: + - Official Documentation: https://github.com/jbogard/MediatR/wiki + - Authors Blog: https://www.jimmybogard.com/ + + - name: AnyClone NuGet Library + relationship: Used as the default cloning ability if ICloneable has not been implemented. + resources: + - Official Repository: https://github.com/replaysMike/AnyClone + + - name: YAML + relationship: Used in .yaml and .yml files + resources: + - Official Specification: https://yaml.org/spec/1.2.2/ + - Learn YAML in Y minutes: https://learnxinyminutes.com/docs/yaml/ + - Common YAML Gotchas: https://stackoverflow.com/questions/3790454/how-do-i-break-a-string-over-multiple-lines + + - name: JSON + relationship: Used in .json files + resources: + - Official Specification: https://www.json.org/json-en.html + - JSON Schema: https://json-schema.org/learn/getting-started-step-by-step + - Working with JSON in TypeScript: https://blog.logrocket.com/working-with-json-typescript/ + + - name: Markdown + relationship: Used for documentation and ai.context files + resources: + - Official Guide: https://www.markdownguide.org/ + - GitHub Flavored Markdown Spec: https://github.github.com/gfm/ + - Mastering Markdown: https://guides.github.com/features/mastering-markdown/ +--- + +This file contains a list of external dependencies and libraries. +The YAML front-matter above provides structured data about each dependency, +including its relationship to the project and links to relevant resources. +These resources include official documentation, articles, blogs, and Stack Overflow posts. +This structure allows for easy parsing by automated tools while maintaining readability for developers. diff --git a/.ai/other/shell-commands.md b/.ai/other/shell-commands.md new file mode 100644 index 0000000..9338495 --- /dev/null +++ b/.ai/other/shell-commands.md @@ -0,0 +1,13 @@ +--- +shell-commands: + - name: fixie + type: dotnet tool + description: A .NET global tool for running tests with Fixie + command: dotnet fixie + install: dotnet tool install Fixie.Console + - name: timewarp-sync + type: dotnet tool + description: A .NET global tool to synchronize and manage shared files across multiple repositories. +--- +# Shell Commands +Shell commands available that we want AI to be aware of and recommend. Although they may not be in this repo. diff --git a/.ai/other/tools.md b/.ai/other/tools.md new file mode 100644 index 0000000..fffd347 --- /dev/null +++ b/.ai/other/tools.md @@ -0,0 +1,11 @@ +--- +tools: + - name: Beyond Compare + description: A powerful file and directory comparison tool + - name: PowerGrep + description: A powerful text search tool +--- + +# Tools + +This is a list of tools the user has installed that we want AI to be aware of. diff --git a/.cline-rules b/.cline-rules new file mode 100644 index 0000000..7374ef3 --- /dev/null +++ b/.cline-rules @@ -0,0 +1,24 @@ +AI INSTRUCTION SET: + +CONFIRMATION REQUIREMENT: + +To ensure you understand my prompt, I need a piece of confirmation from you. Before any tool use and after any tool use, I need you to give me a confidence level on a scale of 0 to 10 on the tool use helping with the project. Remember to do this every time you are using a tool. + +USER: +- Name: Steven T. Cramer +- Projects (Author): + - https://github.com/TimeWarpEngineering/timewarp-state + - https://github.com/TimeWarpEngineering/timewarp-architecture + - https://github.com/TimeWarpEngineering/timewarp-fixie + - https://github.com/TimeWarpEngineering/timewarp-options-validation + - https://github.com/TimeWarpEngineering/timewarp-source-generators +- Focus Areas: + - State Management + - Blazor + - Clean Architecture + - Domain-Driven Design + - Test-Driven Development +- Preferred Patterns: + - CQRS +- Language Preferences: + - TypeScript over JavaScript diff --git a/Kanban/Backlog/Scratch/Done.md b/Kanban/Backlog/Scratch/Done.md new file mode 100644 index 0000000..79431f4 --- /dev/null +++ b/Kanban/Backlog/Scratch/Done.md @@ -0,0 +1,10 @@ +- [x] Update RouteManager to subscribe to Route Change and update the URL if not already there. +- [x] Search with powergrep for "" + if blazor-state\Directory.Build.props has `preview` then do we need it in all the others? +- [x] Extract common items to Directory.Build.props +- [x] ReduxDevToolsBehavoir uses the pipeline but we probably don't care to log those interaction. + So Maybe we should add a Filter to ignore logging some request IReduxAction marker or something? +- [x] Move ReduxDevToolsBehavoir to top of pipeline. + So when doing time travel we can disable actions from actually being executed. +- [x] Move JavaScriptInterop Folder out of Behaviors (It isn't a behavior) although ReduxDevTools depends on it. + This will let dev tools go back to pages. diff --git a/Kanban/Backlog/Scratch/Overview.md b/Kanban/Backlog/Scratch/Overview.md new file mode 100644 index 0000000..e1f5752 --- /dev/null +++ b/Kanban/Backlog/Scratch/Overview.md @@ -0,0 +1 @@ +# Scratch pad for Kanban board stuff. diff --git a/Kanban/Backlog/Scratch/Rejected.md b/Kanban/Backlog/Scratch/Rejected.md new file mode 100644 index 0000000..5420f80 --- /dev/null +++ b/Kanban/Backlog/Scratch/Rejected.md @@ -0,0 +1,4 @@ +- [ ] Implement DevTools Handlers (Currently only Jump works) +See the MobX example for how to implement more ReduxDevTools functionality +https://github.com/zalmoxisus/mobx-remotedev/blob/master/src/monitorActions.js + > I have changed my mind. The fancy stuff in ReduxDevTools I don't really use and is not high ROI diff --git a/Kanban/Backlog/Scratch/Todo.md b/Kanban/Backlog/Scratch/Todo.md new file mode 100644 index 0000000..6e5d34b --- /dev/null +++ b/Kanban/Backlog/Scratch/Todo.md @@ -0,0 +1,6 @@ +- [ ] Improve usefulness of ILogger. +- [ ] Document all public interfaces +- [ ] Check visibility on classes props etc... private public internal etc.. +- [x] Convert js to ts. See Blazor package for example and Logging. +- [ ] Consider splitting Packages for DevTools as production we will not want to deploy. TimeWarp.State.ReduxDevTools +- [ ] Review TODOs in source diff --git a/Kanban/Backlog/_._ b/Kanban/Backlog/_._ new file mode 100644 index 0000000..e69de29 diff --git a/Kanban/Done/_._ b/Kanban/Done/_._ new file mode 100644 index 0000000..e69de29 diff --git a/Kanban/ReadMe.md b/Kanban/ReadMe.md new file mode 100644 index 0000000..e87ff8a --- /dev/null +++ b/Kanban/ReadMe.md @@ -0,0 +1,26 @@ +# Kanban Board + +This Kanban board helps manage and track tasks for the project using a simple folder structure. +Each task is represented by a Markdown file, and the status of a task is indicated by the folder it is in. + +## Folders + +1. **Backlog**: Contains tasks that are NOT yet ready to be worked on. These tasks have a temporary backlog scoped unique identifier. +2. **ToDo**: Contains tasks that are ready to be worked on. When a task from the Backlog becomes ready, it is assigned a unique identifier and moved to this folder. +3. **InProgress**: Contains tasks that are currently being worked on. +4. **Done**: Contains tasks that have been completed. + +## File Naming Convention + +- For tasks in the Backlog folder, use a short description with a 'B' prefix followed by a three-digit identifier, +such as `B001_Research-Authentication-Methods.md` or `B002_Design-Game-Rules.md`. +- When a task becomes "Ready," assign it a unique identifier (without the 'B' prefix) and move it to the ToDo folder, e.g., +`001_Implement-User-Registration.md` or `002_Create-Game-Logic.md`. +- <3 digit Id>_ + +## Workflow + +1. Create a task in the Backlog folder with a short description as the filename. +2. When a task is ready to be worked on, assign it a unique identifier and move it to the ToDo folder. +3. As you work on tasks, move them to the InProgress folder. +4. When a task is complete, move it to the Done folder. diff --git a/Kanban/Task-Template.md b/Kanban/Task-Template.md new file mode 100644 index 0000000..9584ab0 --- /dev/null +++ b/Kanban/Task-Template.md @@ -0,0 +1,37 @@ +# Task 000: Title + +## Description + +- Provide a brief description of the task, outlining its purpose and goals. + +## Requirements + +- List any specific requirements or criteria that must be met for the task to be considered complete. + +## Checklist + Add or remove items to the checklist as necessary when creating the task or implementing it. + +### Design +- [ ] Update Model +- [ ] Add/Update Tests +### Implementation +- [ ] Update Dependencies +- [ ] Update Relevant Configuration Settings +- [ ] Verify Functionality +### Documentation +- [ ] Update Documentation +- [ ] Update ai-context.md +### Review +- [ ] Consider Accessibility Implications +- [ ] Consider Monitoring and Alerting Implications +- [ ] Consider Performance Implications +- [ ] Consider Security Implications +- [ ] Code Review + +## Notes + +- Include any additional information, resources, or references relevant to the task + +## Implementation Notes + +- Include notes while task is in progress \ No newline at end of file diff --git a/Kanban/ToDo/-.- b/Kanban/ToDo/-.- new file mode 100644 index 0000000..e69de29 diff --git a/Source/TheFreezeTeam.com/input/images/LogoNoMarginNoShadow.svg b/Source/TheFreezeTeam.com/input/images/LogoNoMarginNoShadow.svg new file mode 100644 index 0000000..2e20294 --- /dev/null +++ b/Source/TheFreezeTeam.com/input/images/LogoNoMarginNoShadow.svg @@ -0,0 +1,624 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Source/TheFreezeTeam.com/input/posts/steven-t-cramer/2024/10/2024-01-17-enforcing-state-action-architecture.md b/Source/TheFreezeTeam.com/input/posts/steven-t-cramer/2024/10/2024-01-17-enforcing-state-action-architecture.md new file mode 100644 index 0000000..25c5ea1 --- /dev/null +++ b/Source/TheFreezeTeam.com/input/posts/steven-t-cramer/2024/10/2024-01-17-enforcing-state-action-architecture.md @@ -0,0 +1,16 @@ +--- +Title: Enforcing State-Action Architecture with TimeWarp.State Analyzer +Published: 2099-12-16 +Tags: +- .NET +- C# +- TimeWarp.State +- Roslyn +- Static Analysis +Author: Steven T. Cramer +Description: Learn how TimeWarp.State's analyzer ensures proper architectural boundaries by enforcing Actions to be nested within their State classes. +Image: /assets/posts/2024/timewarp-state-analyzer.png +--- + + + \ No newline at end of file diff --git a/Source/TheFreezeTeam.com/input/posts/steven-t-cramer/2024/12/2024-02-TimeWarp-State-11-Release.md b/Source/TheFreezeTeam.com/input/posts/steven-t-cramer/2024/12/2024-02-TimeWarp-State-11-Release.md new file mode 100644 index 0000000..2282694 --- /dev/null +++ b/Source/TheFreezeTeam.com/input/posts/steven-t-cramer/2024/12/2024-02-TimeWarp-State-11-Release.md @@ -0,0 +1,15 @@ +--- +Title: TimeWarp.State 11.0.0 Release Announcement +Published: 02/10/2024 +Tags: + - Blazor + - State Management + - TimeWarp + - .NET +Author: Steven T. Cramer +Excerpt: A New Era in Blazor State Management +Description: Announcing the release of TimeWarp.State 11.0.0, a major evolution in state management for Blazor applications. +Image: 5fe5b757-4530-4555-9503-5ebdbf9975a3.jpg +--- + + \ No newline at end of file diff --git a/Source/TheFreezeTeam.com/input/posts/steven-t-cramer/2024/12/5fe5b757-4530-4555-9503-5ebdbf9975a3.jpg b/Source/TheFreezeTeam.com/input/posts/steven-t-cramer/2024/12/5fe5b757-4530-4555-9503-5ebdbf9975a3.jpg new file mode 100644 index 0000000..a186327 Binary files /dev/null and b/Source/TheFreezeTeam.com/input/posts/steven-t-cramer/2024/12/5fe5b757-4530-4555-9503-5ebdbf9975a3.jpg differ diff --git a/cline.ps1 b/cline.ps1 new file mode 100644 index 0000000..2908c99 --- /dev/null +++ b/cline.ps1 @@ -0,0 +1,27 @@ +# Define the list of files to concatenate +$files = @( + ".ai/00-confirmation.md", + ".ai/01-user.md" + # ".ai/02-development-process.md", + # ".ai/03-environment.md", + # ".ai/04-csharp-coding-standards.md", + # ".ai/05-dotnet-conventions.md" +) + +# Initialize an empty array to store the content +$content = @() + +# Loop through each file +foreach ($file in $files) { + # Read the file content and add it to the array + $content += (Get-Content $file -Raw) # + "`n" +} + +# Join all the content into a single string +$combinedContent = $content -join "`n" + +# Output the combined content (you can redirect this to a file if needed) +$combinedContent + +# Optionally, save to a file +$combinedContent | Out-File -FilePath ".cline-rules" \ No newline at end of file