imlil 1.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.
Files changed (175) hide show
  1. package/.eslintrc.cjs +40 -0
  2. package/DOCS.md +63 -0
  3. package/README.md +160 -0
  4. package/agentTestSandbox/cli-test-zone/README.md +0 -0
  5. package/agentTestSandbox/cli-test-zone/imlil.blueprint.json +5 -0
  6. package/agentTestSandbox/cli-test-zone/notes-warning.md +3 -0
  7. package/agentTestSandbox/cli-test-zone/package.json +0 -0
  8. package/agentTestSandbox/cli-test-zone/public/index.html +0 -0
  9. package/agentTestSandbox/cli-test-zone/src/App.js +0 -0
  10. package/agentTestSandbox/cli-test-zone/src/App.jsx +29 -0
  11. package/agentTestSandbox/cli-test-zone/src/__tests__/App.test.jsx +48 -0
  12. package/agentTestSandbox/cli-test-zone/src/components/AddTodo.js +0 -0
  13. package/agentTestSandbox/cli-test-zone/src/components/Navigation/Navigation.jsx +48 -0
  14. package/agentTestSandbox/cli-test-zone/src/components/Navigation/__tests__/Navigation.module.test.js +45 -0
  15. package/agentTestSandbox/cli-test-zone/src/components/Navigation/__tests__/Navigation.test.jsx +47 -0
  16. package/agentTestSandbox/cli-test-zone/src/components/Navigation.js +0 -0
  17. package/agentTestSandbox/cli-test-zone/src/components/TodoItem/TodoItem.jsx +41 -0
  18. package/agentTestSandbox/cli-test-zone/src/components/TodoItem/__tests__/TodoItem.test.jsx +65 -0
  19. package/agentTestSandbox/cli-test-zone/src/components/TodoItem.js +0 -0
  20. package/agentTestSandbox/cli-test-zone/src/components/TodoList/TodoList.module.css +62 -0
  21. package/agentTestSandbox/cli-test-zone/src/components/TodoList.js +0 -0
  22. package/agentTestSandbox/cli-test-zone/src/index.js +0 -0
  23. package/agentTestSandbox/cli-test-zone/src/pages/About.js +0 -0
  24. package/agentTestSandbox/cli-test-zone/src/pages/Home.js +0 -0
  25. package/agentTestSandbox/cli-test-zone/src/store/TodoContext.js +0 -0
  26. package/agentTestSandbox/cli-test-zone/src/styles/Todo.css +0 -0
  27. package/agentTestSandbox/cli-test-zone/src/styles/index.css +0 -0
  28. package/agentTestSandbox/cli-test-zone/src/utils/__tests__/localStorage.test.js +48 -0
  29. package/agentTestSandbox/cli-test-zone/src/utils/localStorage.js +38 -0
  30. package/agentTestSandbox/parallel-test/.env.example +0 -0
  31. package/agentTestSandbox/parallel-test/.eslintrc.json +0 -0
  32. package/agentTestSandbox/parallel-test/.github/workflows/__tests__/workflows.test.ts +115 -0
  33. package/agentTestSandbox/parallel-test/.github/workflows/cd.yml +0 -0
  34. package/agentTestSandbox/parallel-test/.github/workflows/ci.yml +4 -0
  35. package/agentTestSandbox/parallel-test/.imlil/plan-2026-02-08.md +186 -0
  36. package/agentTestSandbox/parallel-test/.prettierrc +0 -0
  37. package/agentTestSandbox/parallel-test/Dockerfile +0 -0
  38. package/agentTestSandbox/parallel-test/README.md +3 -0
  39. package/agentTestSandbox/parallel-test/ast.json +74 -0
  40. package/agentTestSandbox/parallel-test/docker-compose.yml +4 -0
  41. package/agentTestSandbox/parallel-test/jest.config.js +61 -0
  42. package/agentTestSandbox/parallel-test/k8s/__tests__/deployment.test.ts +168 -0
  43. package/agentTestSandbox/parallel-test/k8s/frontend-deployment.yaml +4 -0
  44. package/agentTestSandbox/parallel-test/nginx/nginx.conf +0 -0
  45. package/agentTestSandbox/parallel-test/package.json +50 -0
  46. package/agentTestSandbox/parallel-test/prisma/__tests__/schema.test.ts +176 -0
  47. package/agentTestSandbox/parallel-test/prisma/schema.prisma +109 -0
  48. package/agentTestSandbox/parallel-test/server/__tests__/controllers/dashboard.controller.test.ts +127 -0
  49. package/agentTestSandbox/parallel-test/server/__tests__/index.test.ts +60 -0
  50. package/agentTestSandbox/parallel-test/server/__tests__/models/user.model.test.ts +111 -0
  51. package/agentTestSandbox/parallel-test/server/config/__tests__/swagger.test.ts +128 -0
  52. package/agentTestSandbox/parallel-test/server/config/database.ts +0 -0
  53. package/agentTestSandbox/parallel-test/server/config/redis.ts +0 -0
  54. package/agentTestSandbox/parallel-test/server/config/swagger.ts +0 -0
  55. package/agentTestSandbox/parallel-test/server/controllers/__tests__/auth.controller.test.ts +178 -0
  56. package/agentTestSandbox/parallel-test/server/controllers/__tests__/user.controller.test.ts +105 -0
  57. package/agentTestSandbox/parallel-test/server/controllers/auth.controller.ts +148 -0
  58. package/agentTestSandbox/parallel-test/server/controllers/dashboard.controller.ts +137 -0
  59. package/agentTestSandbox/parallel-test/server/controllers/user.controller.ts +161 -0
  60. package/agentTestSandbox/parallel-test/server/index.ts +62 -0
  61. package/agentTestSandbox/parallel-test/server/middleware/__tests__/auth.middleware.test.ts +74 -0
  62. package/agentTestSandbox/parallel-test/server/middleware/auth.middleware.ts +55 -0
  63. package/agentTestSandbox/parallel-test/server/middleware/error.middleware.ts +0 -0
  64. package/agentTestSandbox/parallel-test/server/middleware/validation.middleware.ts +0 -0
  65. package/agentTestSandbox/parallel-test/server/models/analytics.model.ts +0 -0
  66. package/agentTestSandbox/parallel-test/server/models/profile.model.ts +0 -0
  67. package/agentTestSandbox/parallel-test/server/models/user.model.ts +78 -0
  68. package/agentTestSandbox/parallel-test/server/routes/auth.routes.ts +0 -0
  69. package/agentTestSandbox/parallel-test/server/routes/dashboard.routes.ts +0 -0
  70. package/agentTestSandbox/parallel-test/server/routes/user.routes.ts +0 -0
  71. package/agentTestSandbox/parallel-test/src/App.tsx +0 -0
  72. package/agentTestSandbox/parallel-test/src/__tests__/config.test.ts +127 -0
  73. package/agentTestSandbox/parallel-test/src/__tests__/index.test.tsx +36 -0
  74. package/agentTestSandbox/parallel-test/src/__tests__/setup.test.ts +34 -0
  75. package/agentTestSandbox/parallel-test/src/__tests__/setupTest.test.ts +44 -0
  76. package/agentTestSandbox/parallel-test/src/components/common/Button/Button.tsx +80 -0
  77. package/agentTestSandbox/parallel-test/src/components/common/Button/__tests__/Button.test.tsx +75 -0
  78. package/agentTestSandbox/parallel-test/src/components/common/Card/Card.tsx +0 -0
  79. package/agentTestSandbox/parallel-test/src/components/common/Input/Input.tsx +0 -0
  80. package/agentTestSandbox/parallel-test/src/components/common/Table/Table.tsx +0 -0
  81. package/agentTestSandbox/parallel-test/src/components/features/Authentication/LoginForm.tsx +75 -0
  82. package/agentTestSandbox/parallel-test/src/components/features/Authentication/RegisterForm.tsx +0 -0
  83. package/agentTestSandbox/parallel-test/src/components/features/Authentication/__tests__/LoginForm.test.tsx +101 -0
  84. package/agentTestSandbox/parallel-test/src/components/features/Dashboard/AnalyticsChart.tsx +0 -0
  85. package/agentTestSandbox/parallel-test/src/components/features/Dashboard/DashboardStats.tsx +81 -0
  86. package/agentTestSandbox/parallel-test/src/components/features/Dashboard/__tests__/DashboardStats.test.tsx +122 -0
  87. package/agentTestSandbox/parallel-test/src/components/layouts/Header.tsx +70 -0
  88. package/agentTestSandbox/parallel-test/src/components/layouts/MainLayout.tsx +0 -0
  89. package/agentTestSandbox/parallel-test/src/components/layouts/Sidebar.tsx +0 -0
  90. package/agentTestSandbox/parallel-test/src/components/layouts/__tests__/MainLayout.test.tsx +65 -0
  91. package/agentTestSandbox/parallel-test/src/hooks/__tests__/useAuth.test.ts +75 -0
  92. package/agentTestSandbox/parallel-test/src/hooks/useApi.ts +0 -0
  93. package/agentTestSandbox/parallel-test/src/hooks/useAuth.ts +54 -0
  94. package/agentTestSandbox/parallel-test/src/hooks/useTheme.ts +0 -0
  95. package/agentTestSandbox/parallel-test/src/index.tsx +0 -0
  96. package/agentTestSandbox/parallel-test/src/services/__tests__/api.service.test.ts +48 -0
  97. package/agentTestSandbox/parallel-test/src/services/analytics.service.ts +0 -0
  98. package/agentTestSandbox/parallel-test/src/services/api.service.ts +59 -0
  99. package/agentTestSandbox/parallel-test/src/services/api.ts +0 -0
  100. package/agentTestSandbox/parallel-test/src/services/auth.service.ts +0 -0
  101. package/agentTestSandbox/parallel-test/src/services/user.service.ts +0 -0
  102. package/agentTestSandbox/parallel-test/src/store/__tests__/store.test.ts +60 -0
  103. package/agentTestSandbox/parallel-test/src/store/index.ts +23 -0
  104. package/agentTestSandbox/parallel-test/src/store/slices/authSlice.ts +0 -0
  105. package/agentTestSandbox/parallel-test/src/store/slices/dashboardSlice.ts +0 -0
  106. package/agentTestSandbox/parallel-test/src/store/slices/userSlice.ts +0 -0
  107. package/agentTestSandbox/parallel-test/src/types/auth.types.ts +0 -0
  108. package/agentTestSandbox/parallel-test/src/types/dashboard.types.ts +0 -0
  109. package/agentTestSandbox/parallel-test/src/types/user.types.ts +0 -0
  110. package/agentTestSandbox/parallel-test/src/utils/constants.ts +0 -0
  111. package/agentTestSandbox/parallel-test/src/utils/formatters.ts +0 -0
  112. package/agentTestSandbox/parallel-test/src/utils/validation.ts +0 -0
  113. package/agentTestSandbox/parallel-test/src/views/Dashboard.tsx +0 -0
  114. package/agentTestSandbox/parallel-test/src/views/Login.tsx +31 -0
  115. package/agentTestSandbox/parallel-test/src/views/Profile.tsx +0 -0
  116. package/agentTestSandbox/parallel-test/src/views/Register.tsx +0 -0
  117. package/agentTestSandbox/parallel-test/src/views/Settings.tsx +0 -0
  118. package/agentTestSandbox/parallel-test/src/views/__tests__/Login.test.tsx +62 -0
  119. package/agentTestSandbox/parallel-test/src/vite-env.d.ts +1 -0
  120. package/agentTestSandbox/parallel-test/tailwind.config.js +0 -0
  121. package/agentTestSandbox/parallel-test/tests/integration/api/auth.test.ts +120 -0
  122. package/agentTestSandbox/parallel-test/tests/unit/components/Button.test.tsx +35 -0
  123. package/agentTestSandbox/parallel-test/tests/unit/config/jest.config.test.js +62 -0
  124. package/agentTestSandbox/parallel-test/tests/unit/config/jest.setup.test.js +52 -0
  125. package/agentTestSandbox/parallel-test/tests/unit/infrastructure/__tests__/docker-config.test.ts +107 -0
  126. package/agentTestSandbox/parallel-test/tsconfig.json +0 -0
  127. package/agentTestSandbox/zone2/Makefile +58 -0
  128. package/agentTestSandbox/zone2/README.md +0 -0
  129. package/agentTestSandbox/zone2/docs/API.md +0 -0
  130. package/agentTestSandbox/zone2/docs/CONTRIBUTING.md +0 -0
  131. package/agentTestSandbox/zone2/imlil.blueprint.json +5 -0
  132. package/agentTestSandbox/zone2/notes-warning.md +3 -0
  133. package/agentTestSandbox/zone2/src/calculator.c +0 -0
  134. package/agentTestSandbox/zone2/src/calculator.h +0 -0
  135. package/agentTestSandbox/zone2/src/core/__tests__/test_memory.c +89 -0
  136. package/agentTestSandbox/zone2/src/core/memory.c +60 -0
  137. package/agentTestSandbox/zone2/src/display.c +0 -0
  138. package/agentTestSandbox/zone2/src/display.h +0 -0
  139. package/agentTestSandbox/zone2/src/input_handler.c +0 -0
  140. package/agentTestSandbox/zone2/src/input_handler.h +0 -0
  141. package/agentTestSandbox/zone2/src/main.c +0 -0
  142. package/agentTestSandbox/zone2/src/utils/error_handling.c +0 -0
  143. package/agentTestSandbox/zone2/src/utils/error_handling.h +0 -0
  144. package/agentTestSandbox/zone2/src/utils/input.c +0 -0
  145. package/agentTestSandbox/zone2/src/utils/input.h +0 -0
  146. package/agentTestSandbox/zone2/src/utils/math_utils.c +0 -0
  147. package/agentTestSandbox/zone2/src/utils/math_utils.h +0 -0
  148. package/agentTestSandbox/zone2/src/utils/stack.c +0 -0
  149. package/agentTestSandbox/zone2/src/utils/stack.h +0 -0
  150. package/agentTestSandbox/zone2/src/utils.c +34 -0
  151. package/agentTestSandbox/zone2/tests/__tests__/test_makefile.c +58 -0
  152. package/agentTestSandbox/zone2/tests/calculator_tests.c +0 -0
  153. package/agentTestSandbox/zone2/tests/input_handler_tests.c +0 -0
  154. package/agentTestSandbox/zone2/tests/math_utils_tests.c +0 -0
  155. package/agentTestSandbox/zone2/tests/test_calculator.c +0 -0
  156. package/agentTestSandbox/zone2/tests/test_input.c +0 -0
  157. package/agentTestSandbox/zone2/tests/test_stack.c +0 -0
  158. package/agentTestSandbox/zone2/tests/test_utils.c +8 -0
  159. package/bin/cli.js +369 -0
  160. package/imlil.config.js +22 -0
  161. package/index.js +0 -0
  162. package/jest.config.js +5 -0
  163. package/package.json +45 -0
  164. package/src/__tests__/cli.test.js +5 -0
  165. package/src/actions/Action.js +125 -0
  166. package/src/agents/Agent.js +64 -0
  167. package/src/agents/Operator.js +147 -0
  168. package/src/agents/ScrumAgent.js +74 -0
  169. package/src/agents/SupervisorAgent.js +198 -0
  170. package/src/agents/ValidatorAgent.js +48 -0
  171. package/src/agents/coder.js +208 -0
  172. package/src/agents/worker.js +52 -0
  173. package/src/utils/db.js +40 -0
  174. package/src/utils/embedapi.js +19 -0
  175. package/test-api.js +24 -0
package/.eslintrc.cjs ADDED
@@ -0,0 +1,40 @@
1
+ module.exports = {
2
+ env: {
3
+ browser: true,
4
+ es2021: true,
5
+ node: true,
6
+ },
7
+ extends: 'airbnb-base',
8
+ overrides: [
9
+ {
10
+ env: {
11
+ node: true,
12
+ },
13
+ files: [
14
+ '.eslintrc.{js,cjs}',
15
+ ],
16
+ parserOptions: {
17
+ sourceType: 'script',
18
+ },
19
+ },
20
+ {
21
+ files: ['src/**/*.test.js'],
22
+ env: {
23
+ jest: true,
24
+ },
25
+ },
26
+ ],
27
+ parserOptions: {
28
+ ecmaVersion: 'latest',
29
+ sourceType: 'module',
30
+ },
31
+ rules: {
32
+ 'import/extensions': ['error', 'ignorePackages'],
33
+ 'max-len': 'off',
34
+ 'no-console': 'off',
35
+ 'no-restricted-syntax': 'off',
36
+ 'no-await-in-loop': 'off',
37
+ 'no-continue': 'off',
38
+ 'prefer-destructuring': 'off',
39
+ },
40
+ };
package/DOCS.md ADDED
@@ -0,0 +1,63 @@
1
+ # `imlil` Documentation
2
+
3
+ This document provides a deeper dive into the architecture and functionality of `imlil`.
4
+
5
+ ## Architecture
6
+
7
+ `imlil` uses a multi-agent system to build projects. The main agents are:
8
+
9
+ - **Supervisor Agent**: This is the project manager. It takes the user's initial prompt, creates a plan, and delegates tasks to Operator agents.
10
+ - **Operator Agent**: This agent is responsible for executing a specific task from the plan. It uses the AI model to generate the code or commands needed to complete the task.
11
+ - **Coder Agent**: This agent is specialized in writing and modifying code. It receives instructions from the Operator and performs file system operations.
12
+
13
+ ### The Flow
14
+
15
+ 1. The user runs `imlil make "..."`.
16
+ 2. The `SupervisorAgent` is instantiated.
17
+ 3. The `SupervisorAgent` creates a high-level plan using the AI model.
18
+ 4. The plan is broken down into a series of tasks.
19
+ 5. The `SupervisorAgent` assigns tasks to `Operator` agents, up to `maxAgents`.
20
+ 6. Each `Operator` agent uses the AI model to generate a sequence of actions (like `writeFile`, `gitCommit`, etc.) to complete its task.
21
+ 7. The actions are executed by the `Coder` agent.
22
+ 8. The process continues until all tasks are completed.
23
+
24
+ ## Configuration (`imlil.config.js`)
25
+
26
+ - **`mode`**: Can be `'yolo'` or `'safe'`. In `yolo` mode, the agents are given more freedom to experiment. `'safe'` mode will be more conservative. (Note: `'safe'` mode is not yet fully implemented).
27
+ - **`maxAgents`**: An integer that determines how many agents can run in parallel. This is useful for controlling API usage and resource consumption.
28
+ - **`cliPersonality`**: A system prompt that is prepended to every call to the AI model. This allows you to customize the personality and tone of the CLI's output and behavior.
29
+
30
+ ## Agents in Detail
31
+
32
+ ### `SupervisorAgent.js`
33
+
34
+ - **Purpose**: To manage the overall project creation process.
35
+ - **Key Methods**:
36
+ - `run()`: The main entry point. It creates a plan and starts assigning tasks.
37
+ - `createPlan()`: Interacts with the AI to get a structured plan.
38
+ - `assignTask()`: Creates and dispatches an `Operator` agent for a task.
39
+
40
+ ### `Operator.js`
41
+
42
+ - **Purpose**: To execute a single task from the plan.
43
+ - **Key Methods**:
44
+ - `run()`: Takes a task and generates a series of actions to complete it.
45
+ - `executeAction()`: Executes a single action, like writing a file or running a command.
46
+
47
+ ### `coder.js`
48
+
49
+ - **Purpose**: A specialized agent for code generation and modification.
50
+ - **Key Methods**:
51
+ - `run()`: Takes a task and generates code.
52
+ - `executeAction()`: Interacts with the `Action.js` toolkit to modify the filesystem.
53
+
54
+ ## The Action Toolkit (`Action.js`)
55
+
56
+ This class provides a set of methods that agents can use to interact with the user's system. It's a layer of abstraction over the filesystem and git.
57
+
58
+ - `writeFile(filePath, content)`
59
+ - `readFile(filePath)`
60
+ - `gitAdd(files)`
61
+ - `gitCommit(message)`
62
+
63
+ This architecture allows for extending the tool's capabilities by adding new actions and new types of agents.
package/README.md ADDED
@@ -0,0 +1,160 @@
1
+ # imlil.dev: Your CTO in a box.
2
+
3
+
4
+ ### 🚀 100+ Agents. 60 Seconds. Zero Limits.
5
+
6
+ **One CLI. One API Key. Infinite Staff.**
7
+
8
+ [![npm version](https://img.shields.io/npm/v/imlil.svg?style=flat-square)](https://www.npmjs.com/package/imlil)
9
+ [![Methodology: TDD](https://img.shields.io/badge/Methodology-TDD%20Strict-red.svg?style=flat-square)](https://imlil.dev/docs/tdd)
10
+ [![SaaS: Premium](https://img.shields.io/badge/Model-Pay%20As%20You%20Go-green.svg?style=flat-square)](https://imlil.dev/pricing)
11
+ [![Concurrency: Unlimited](https://img.shields.io/badge/Staffing-Unlimited-blue.svg?style=flat-square)](https://imlil.dev/docs)
12
+
13
+ ---
14
+
15
+ **imlil.dev is the first High-Velocity AI Firm that lives in your terminal.**
16
+
17
+ Forget "coding assistants." You need a **team**.
18
+ **imlil** gives you a **CTO, Engineering Managers, Scrum Masters, Senior Devs, and QA Leads**—all working in parallel.
19
+
20
+ **10 Agents? 100 Agents? 1,000 Agents?**
21
+ There is no limit. If you have the tokens, we have the staff.
22
+ Build a full-stack SaaS (Backend + Frontend + Infra) in **60 seconds flat**.
23
+
24
+ ---
25
+
26
+ ## 👥 Meet Your New Employees
27
+
28
+ When you run `imlil make`, you are hiring a specialized, autonomous workforce:
29
+
30
+ ### 1. **The Supervisor (CTO)**
31
+ * **Role:** Architect & Planner.
32
+ * **Job:** Designs the system, selects the stack (e.g., Next.js, Rust, Python), and maps out the entire project structure.
33
+ * **Output:** A master architectural plan.
34
+
35
+ ### 2. **The Operator (Engineering Manager)**
36
+ * **Role:** Task Orchestrator.
37
+ * **Job:** Breaks the CTO's plan into hundreds of parallel tickets. Assigns them to the worker pool.
38
+
39
+ ### 3. **The Scrum Master (Agile Coach)**
40
+ * **Role:** Flow Optimizer.
41
+ * **Job:** Unblocks agents, manages retries, and ensures velocity remains high.
42
+
43
+ ### 4. **The Coder (Senior Developer)**
44
+ * **Role:** Implementation Specialist.
45
+ * **Job:** Writes clean, idiomatic code.
46
+ * **Superpower:** **Surgical Precision.** Unlike other tools that overwrite files blindly, The Coder reads your codebase's structure and inserts changes without breaking existing logic.
47
+
48
+ ### 5. **The Validator (QA Lead)**
49
+ * **Role:** The Gatekeeper.
50
+ * **Job:** Enforces **Strict TDD**.
51
+ 1. Writes a failing test.
52
+ 2. Verifies the failure.
53
+ 3. Approves the Coder's work *only* if the test passes.
54
+
55
+ ---
56
+
57
+ ## ⚡ Why Hire This Team?
58
+
59
+ ### 1. **Unlimited Parallel Concurrency**
60
+ Why wait for one developer? **imlil** spawns an army.
61
+ * **Scale:** Run **50+ agents** simultaneously.
62
+ * **Speed:** Build a full-stack SaaS in minutes, not weeks.
63
+ * **Infrastructure:** True multi-threaded execution for maximum throughput.
64
+
65
+ ### 2. **Bleeding-Edge Intelligence (EmbedAPI)**
66
+ Your team uses the absolute latest research models, updated automatically.
67
+
68
+ **Currently Supported (2026):**
69
+ * ⚡ **Gemini 3 Flash** (The fastest inference engine on the market)
70
+ * 🧠 **Gemini 3 Pro** (Unmatched reasoning and context)
71
+ * 🤖 **Claude 4.6 (Opus/Sonnet)** (Best-in-class coding & agentic behavior)
72
+ * 🚀 **GPT-5.3-Codex** (The new gold standard for software engineering)
73
+
74
+ ### 3. **Context-Aware Memory**
75
+ Your team never forgets. They map your entire project's DNA before writing a single line of code, ensuring every file fits the architecture perfectly.
76
+
77
+ ---
78
+
79
+ ## 📦 Installation
80
+
81
+ ```bash
82
+ npm install -g imlil
83
+ ```
84
+
85
+ ## 🔑 Setup
86
+
87
+ 1. **Get your Universal API Key:**
88
+ Sign up at [https://imlil.dev](https://imlil.dev).
89
+ > **⚠️ Note:** There is **no free plan**. This is enterprise-grade tooling.
90
+
91
+ 2. **Authenticate:**
92
+ ```bash
93
+ export EMBED_API_KEY="your-key-here"
94
+ ```
95
+
96
+ ---
97
+
98
+ ## 🛠️ Usage
99
+
100
+ ### The `make` Command
101
+ Issue a contract to your new digital firm.
102
+
103
+ ```bash
104
+ # Contract: Build a SaaS Dashboard with 20 staff members
105
+ imlil make "A modern SaaS dashboard with Next.js 14, Tailwind, Supabase, and Stripe integration" --max-agents 20
106
+ ```
107
+
108
+ ### Options
109
+ * `--max-agents <number>`: Staffing level. Default `10`. Increase for speed, decrease for cost efficiency.
110
+ * `--debug`: Audit the internal Slack channels (logs) of your agents.
111
+
112
+ ---
113
+
114
+ ## 💻 Development
115
+
116
+ ### Scripts
117
+
118
+ * `npm test`: Runs the test suite.
119
+ * `npm run lint`: Lints the codebase.
120
+
121
+ ---
122
+
123
+ ## 💎 Pricing: Pay-As-You-Go
124
+
125
+ **imlil** operates on a transparent, usage-based model via **EmbedAPI**.
126
+
127
+ * **No Salaries:** You don't pay fixed monthly costs.
128
+ * **Token-Based:** Pay only for the compute (tokens) your team consumes.
129
+ * **Direct Pass-Through:** We provide the infrastructure; you provide the fuel.
130
+
131
+ *Check [imlil.dev/pricing](https://imlil.dev/pricing) for current rates.*
132
+
133
+ ---
134
+
135
+ ## 🏗️ The Org Chart
136
+
137
+ ```mermaid
138
+ graph TD;
139
+ Client[User] -->|Goal| Supervisor[Supervisor (CTO)];
140
+ Supervisor -->|Plan| Operator[Operator (Manager)];
141
+ Operator -->|Tasks| Backlog[Task Queue];
142
+
143
+ subgraph Swarm [The Worker Pool]
144
+ Scrum[Scrum Master] -->|Assigns| Coder[Coder];
145
+ Coder -->|Code| Validator[QA Lead];
146
+ Validator -->|TDD Check| Coder;
147
+ Validator -->|Pass| Done[Done];
148
+ end
149
+
150
+ Backlog --> Scrum;
151
+ ```
152
+
153
+ ---
154
+
155
+ ## 📜 License
156
+
157
+ Copyright © 2026 **imlil.dev**. All rights reserved.
158
+ Released under the MIT License.
159
+
160
+ > *"You define the product. We build the company that builds it."*
File without changes
@@ -0,0 +1,5 @@
1
+ {
2
+ "fileStructure": "src/\n ├── components/\n │ ├── TodoList/\n │ ├── TodoItem/\n │ ├── AddTodo/\n │ └── Navigation/\n ├── store/\n │ └── todoSlice/\n ├── utils/\n └── styles/",
3
+ "conventions": "- Components: PascalCase (e.g., TodoList.jsx)\n- Hooks: camelCase prefixed with 'use' (e.g., useLocalStorage)\n- Utils: camelCase\n- CSS Modules: ComponentName.module.css\n- Tests: ComponentName.test.jsx in same directory as component",
4
+ "techStack": "- React 18\n- React Router DOM\n- Local Storage for state persistence\n- CSS Modules for styling\n- PropTypes for type checking"
5
+ }
@@ -0,0 +1,3 @@
1
+ # IMLIL Supervisor Notes
2
+
3
+ This is where I'll drop any warnings or important notes for you.
File without changes
File without changes
@@ -0,0 +1,29 @@
1
+ import React from 'react';
2
+ import { BrowserRouter as Router, Routes, Route } from 'react-router-dom';
3
+ import Navigation from './components/Navigation/Navigation';
4
+ import TodoList from './components/TodoList/TodoList';
5
+
6
+ const Home = () => (
7
+ <div>
8
+ <h1>Welcome to Todo App</h1>
9
+ <p>Manage your tasks efficiently</p>
10
+ </div>
11
+ );
12
+
13
+ const App = () => {
14
+ return (
15
+ <Router>
16
+ <div>
17
+ <Navigation />
18
+ <main>
19
+ <Routes>
20
+ <Route path="/" element={<Home />} />
21
+ <Route path="/todos" element={<TodoList />} />
22
+ </Routes>
23
+ </main>
24
+ </div>
25
+ </Router>
26
+ );
27
+ };
28
+
29
+ export default App;
@@ -0,0 +1,48 @@
1
+
2
+ import { render, screen } from '@testing-library/react';
3
+ import { BrowserRouter as Router, Routes, Route, MemoryRouter } from 'react-router-dom';
4
+ import { viretest } from 'vitest';
5
+ import App from '../App';
6
+
7
+ describe('App Router Configuration', () => {
8
+ it('should render the home page by default', () => {
9
+ render(
10
+ <MemoryRouter initialEntries={['/']}>
11
+ <App />
12
+ </MemoryRouter>
13
+ );
14
+ expect(screen.getByTestId('home-page')).toBeInTheDocument();
15
+ });
16
+
17
+ it('should render the todo list page when navigating to /todos', () => {
18
+ render(
19
+ <MemoryRouter initialEntries={['/todos']}>
20
+ <App />
21
+ </MemoryRouter>
22
+ );
23
+ expect(screen.getByTestId('todo-list-page')).toBeInTheDocument();
24
+ });
25
+
26
+ it('should display 404 page for unknown routes', () => {
27
+ render(
28
+ <MemoryRouter initialEntries={[/invalid-route/]}>
29
+ <App />
30
+ </MemoryRouter>
31
+ );
32
+ expect(screen.getByTestId('not-found-page')).toBeInTheDocument();
33
+ });
34
+
35
+ it('should have navigation links for home and todo list', () => {
36
+ render(
37
+ <MemoryRouter>
38
+ <App />
39
+ </MemoryRouter>
40
+ );
41
+
42
+ const homeLink = screen.getByRole('link', { name: /home/i });
43
+ const todosLink = screen.getByRole('link', { name: /todos/i });
44
+
45
+ expect(homeLink).toBeInTheDocument();
46
+ expect(todosLink).toBeInTheDocument();
47
+ });
48
+ });
@@ -0,0 +1,48 @@
1
+ import React from 'react';
2
+ import { NavLink } from 'react-router-dom';
3
+ import PropTypes from 'prop-types';
4
+ import styles from './Navigation.module.css';
5
+
6
+ const Navigation = () => {
7
+ return (
8
+ <nav className={styles.navigation}>
9
+ <ul className={styles.navList}>
10
+ <li>
11
+ <NavLink
12
+ to="/"
13
+ className={({ isActive }) =>
14
+ `${styles.navLink} ${isActive ? styles.active : ''}`
15
+ }
16
+ end={true}
17
+ >
18
+ Home
19
+ </NavLink>
20
+ </li>
21
+ <li>
22
+ <NavLink
23
+ to="/active"
24
+ className={({ isActive }) =>
25
+ `${styles.navLink} ${isActive ? styles.active : ''}`
26
+ }
27
+ >
28
+ Active
29
+ </NavLink>
30
+ </li>
31
+ <li>
32
+ <NavLink
33
+ to="/completed"
34
+ className={({ isActive }) =>
35
+ `${styles.navLink} ${isActive ? styles.active : ''}`
36
+ }
37
+ >
38
+ Completed
39
+ </NavLink>
40
+ </li>
41
+ </ul>
42
+ </nav>
43
+ );
44
+ };
45
+
46
+ Navigation.propTypes = {};
47
+
48
+ export default Navigation;
@@ -0,0 +1,45 @@
1
+ import React from 'react';
2
+ import { render } from '@testing-library/react';
3
+ import styles from '../Navigation.module.css';
4
+
5
+ // Mock the CSS module
6
+ jest.mock('../Navigation.module.css', () => ({
7
+ nav: 'nav',
8
+ link: 'link',
9
+ active: 'active'
10
+ }));
11
+
12
+ describe('CSS Modules - Navigation Styles', () => {
13
+ it('should have the correct CSS module styles', () => {
14
+ // Verify that the styles object has the expected properties
15
+ expect(styles).toHaveProperty('nav');
16
+ expect(styles).toHaveProperty('link');
17
+ expect(styles).toHaveProperty('active');
18
+ });
19
+
20
+ it('should apply styles properly to Navigation component', () => {
21
+ const { container } = render(
22
+ <nav className={styles.nav}>
23
+ <a className={styles.link}>Link</a>
24
+ </nav>
25
+ );
26
+
27
+ // Verify that the classes are applied
28
+ const navElement = container.querySelector('nav');
29
+ const linkElement = container.querySelector('a');
30
+
31
+ expect(navElement).toHaveClass(styles.nav);
32
+ expect(linkElement).toHaveClass(styles.link);
33
+ });
34
+
35
+ it('should apply active styles when active class is added', () => {
36
+ const { container } = render(
37
+ <nav className={styles.nav}>
38
+ <a className={`${styles.link} ${styles.active}`}>Active Link</a>
39
+ </nav>
40
+ );
41
+
42
+ const activeLink = container.querySelector('a');
43
+ expect(activeLink).toHaveClass(styles.active);
44
+ });
45
+ });
@@ -0,0 +1,47 @@
1
+ import { render, screen } from '@testing-library/react';
2
+ import { BrowserRouter as Router } from 'react-router-dom';
3
+ import Navigation from '../Navigation';
4
+
5
+ describe('Navigation Component', () => {
6
+ const renderWithRouter = () => {
7
+ render(
8
+ <Router>
9
+ <Navigation />
10
+ </Router>
11
+ );
12
+ };
13
+
14
+ it('renders without crashing', () => {
15
+ expect(() => renderWithRouter()).not.toThrow();
16
+ });
17
+
18
+ it('displays the home link', () => {
19
+ renderWithRouter();
20
+ const homeLink = screen.getByRole('link', { name: /Home/i });
21
+ expect(homeLink).toBeInTheDocument();
22
+ });
23
+
24
+ it('displays the active todos link', () => {
25
+ renderWithRouter();
26
+ const activeLink = screen.getByRole('link', { name: /Active/i });
27
+ expect(activeLink).toBeInTheDocument();
28
+ });
29
+
30
+ it('displays the completed todos link', () => {
31
+ renderWithRouter();
32
+ const completedLink = screen.getByRole('link', { name: /Completed/i });
33
+ expect(completedLink).toBeInTheDocument();
34
+ });
35
+
36
+ it('has accessible navigation', () => {
37
+ renderWithRouter();
38
+ const nav = screen.getByRole('navigation');
39
+ expect(nav).toBeInTheDocument();
40
+ });
41
+
42
+ it('has accessible landmark', () => {
43
+ renderWithRouter();
44
+ const nav = screen.getByRole('navigation');
45
+ expect(nav).toHaveAttribute('aria-label', 'main navigation');
46
+ });
47
+ });
@@ -0,0 +1,41 @@
1
+ import React from 'react';
2
+ import PropTypes from 'prop-types';
3
+ import styles from './TodoItem.module.css';
4
+
5
+ const TodoItem = ({ id, text, completed, onToggle, onDelete }) => {
6
+ return (
7
+ <div className={styles.todoItem}>
8
+ <div className={styles.content}>
9
+ <label className={styles.checkboxLabel}>
10
+ <input
11
+ type="checkbox"
12
+ checked={completed}
13
+ onChange={() => onToggle(id)}
14
+ className={styles.checkbox}
15
+ />
16
+ <span className={`${styles.text} ${completed ? styles.completed : ''}`}>
17
+ {text}
18
+ </span>
19
+ </label>
20
+ </div>
21
+ <button
22
+ type="button"
23
+ onClick={() => onDelete(id)}
24
+ className={styles.deleteButton}
25
+ aria-label="Delete todo"
26
+ >
27
+ <span aria-hidden="true">×</span>
28
+ </button>
29
+ </div>
30
+ );
31
+ };
32
+
33
+ TodoItem.propTypes = {
34
+ id: PropTypes.string.isRequired,
35
+ text: PropTypes.string.isRequired,
36
+ completed: PropTypes.bool.isRequired,
37
+ onToggle: PropTypes.func.isRequired,
38
+ onDelete: PropTypes.func.isRequired
39
+ };
40
+
41
+ export default TodoItem;
@@ -0,0 +1,65 @@
1
+ import React from 'react';
2
+ import { render, screen, fireEvent } from '@testing-library/react';
3
+ import userEvent from '@testing-library/user-event';
4
+ import TodoItem from '../TodoItem';
5
+
6
+ const mockTodo = {
7
+ id: '123',
8
+ text: 'Buy groceries',
9
+ completed: false
10
+ };
11
+
12
+ const mockOnToggle = jest.fn();
13
+ const mockOnDelete = jest.fn();
14
+
15
+ const setup = (props = {}) => {
16
+ return render(
17
+ <TodoItem
18
+ todo={mockTodo}
19
+ onToggle={mockOnToggle}
20
+ onDelete={mockOnDelete}
21
+ {...props}
22
+ />
23
+ });
24
+ };
25
+
26
+ describe('TodoItem', () => {
27
+ beforeEach(() => {
28
+ jest.clearAllMocks();
29
+ });
30
+
31
+ it('renders todo text', () => {
32
+ setup();
33
+ expect(screen.getByText('Buy groceries')).toBeInTheDocument();
34
+ });
35
+
36
+ it('renders checkbox with correct checked state', () => {
37
+ setup();
38
+ const checkbox = screen.getByRole('checkbox');
39
+ expect(checkbox).toBeInTheDocument();
40
+ expect(checkbox).not.toBeChecked();
41
+ });
42
+
43
+ it('calls onToggle when checkbox is clicked', async () => {
44
+ setup();
45
+ const checkbox = screen.getByRole('checkbox');
46
+ await userEvent.click(checkbox);
47
+ expect(mockOnToggle).toHaveBeenCalledWith('123');
48
+ });
49
+
50
+ it('calls onDelete when delete button is clicked', async () => {
51
+ setup();
52
+ const deleteButton = screen.getByRole('button', { name: /delete/i });
53
+ await userEvent.click(deleteButton);
54
+ expect(mockOnDelete).toHaveBeenCalledWith('123');
55
+ });
56
+
57
+ it('applies completed style when todo is completed', () => {
58
+ const completedTodo = { ...mockTodo, completed: true };
59
+ setup({ todo: completedTodo });
60
+ const todoText = screen.getByText('Buy groceries');
61
+ expect(todoText).toHaveStyle({
62
+ textDecoration: 'line-through'
63
+ });
64
+ });
65
+ });
@@ -0,0 +1,62 @@
1
+ .listContainer {
2
+ width: 100%;
3
+ max-width: 600px;
4
+ margin: 0 auto;
5
+ padding: 20px;
6
+ }
7
+
8
+ .todoList {
9
+ list-style: none;
10
+ padding: 0;
11
+ margin: 20px 0;
12
+ }
13
+
14
+ .todoItem {
15
+ display: flex;
16
+ justify-content: space-between;
17
+ align-items: center;
18
+ padding: 10px 15px;
19
+ margin-bottom: 8px;
20
+ background-color: #fff;
21
+ border-radius: 4px;
22
+ box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
23
+ transition: all 0.3s ease;
24
+ }
25
+
26
+ .todoItem:hover {
27
+ box-shadow: 0 4px 8px rgba(0, 0, 0, 0.15);
28
+ transform: translateY(-1px);
29
+ }
30
+
31
+ .completed {
32
+ background-color: #f0f0f0;
33
+ text-decoration: line-through;
34
+ color: #888;
35
+ }
36
+
37
+ .actions {
38
+ display: flex;
39
+ gap: 10px;
40
+ }
41
+
42
+ .button {
43
+ padding: 6px 12px;
44
+ border: none;
45
+ border-radius: 4px;
46
+ cursor: pointer;
47
+ transition: background-color 0.2s ease;
48
+ }
49
+
50
+ .deleteButton {
51
+ background-color: #ff4444;
52
+ color: white;
53
+ }
54
+
55
+ .deleteButton:hover {
56
+ background-color: #ee2222;
57
+ }
58
+
59
+ .checkbox {
60
+ margin-right: 10px;
61
+ cursor: pointer;
62
+ }
File without changes