Create Project
This commit is contained in:
commit
b663f76267
4
.cursorignore
Normal file
4
.cursorignore
Normal file
@ -0,0 +1,4 @@
|
||||
project/venv
|
||||
project/clones
|
||||
project/uploads
|
||||
project/temp_uploads
|
||||
18
.gitignore
vendored
Normal file
18
.gitignore
vendored
Normal file
@ -0,0 +1,18 @@
|
||||
# Embedded git repositories
|
||||
project/shared_clones/9820af836d9854563e0e495ca1541de48aefd95e/
|
||||
|
||||
# Problematic directory
|
||||
remove/
|
||||
|
||||
# Python virtual environment
|
||||
project/venv/
|
||||
|
||||
# Python cache files
|
||||
__pycache__/
|
||||
*.py[cod]
|
||||
*$py.class
|
||||
|
||||
# Temporary files
|
||||
*.swp
|
||||
*.swo
|
||||
.DS_Store
|
||||
16
ecosystem.config.js
Normal file
16
ecosystem.config.js
Normal file
@ -0,0 +1,16 @@
|
||||
module.exports = {
|
||||
apps: [{
|
||||
name: "scada-manifest-app",
|
||||
script: "project/app.py",
|
||||
interpreter: "/home/adminuser/scada_vs_dwg_manifest/project/venv/bin/python",
|
||||
env: {
|
||||
PORT: 5000,
|
||||
NODE_ENV: "production",
|
||||
},
|
||||
watch: false,
|
||||
instances: 1,
|
||||
exec_mode: "fork",
|
||||
autorestart: true,
|
||||
max_memory_restart: "500M"
|
||||
}]
|
||||
}
|
||||
61
project_config.md
Normal file
61
project_config.md
Normal file
@ -0,0 +1,61 @@
|
||||
# Project Configuration (LTM)
|
||||
|
||||
*This file contains the stable, long-term context for the project.*
|
||||
*It should be updated infrequently, primarily when core goals, tech, or patterns change.*
|
||||
|
||||
---
|
||||
|
||||
## Core Goal
|
||||
|
||||
Create a system to compare and reconcile mechanical manifest data (chutes and conveyors) against extracted device data from DWG files, presenting discrepancies and conflicts in a lightweight, searchable frontend.
|
||||
|
||||
---
|
||||
|
||||
## Tech Stack
|
||||
|
||||
* **Backend:** Python Flask on Linux
|
||||
* **Frontend:** Lightweight SPA (e.g. React or Vanilla JS) with a data‐table library for tabular diff views
|
||||
* **Data Sources:**
|
||||
|
||||
* XLSX of mechanical manifest (chutes & conveyors)
|
||||
* XLSX of DWG‑extracted device list
|
||||
* Repository of SCADA object metadata (name properties)
|
||||
* **Data Processing:** pandas (XLSX ingestion & diff logic)
|
||||
* **Testing:** pytest
|
||||
* **Linting/Formatting:** flake8, black
|
||||
|
||||
---
|
||||
|
||||
## Critical Patterns & Conventions
|
||||
|
||||
* **Manifest Ingestion:** Unified loader for XLSX sources, converting to a common schema before comparison
|
||||
* **Diff Algorithm:** Align entries by identifier, flag missing, extra, and mismatched metadata
|
||||
* **API Design:** RESTful endpoints under `/api/v1/`:
|
||||
|
||||
* `GET /manifests` – list loaded manifests
|
||||
* `POST /compare` – run diff between specified sources
|
||||
* `GET /conflicts` – retrieve paginated conflict records
|
||||
* **Frontend Components:**
|
||||
|
||||
* Table view with search & filter by source
|
||||
* Conflict highlighting (added, removed, changed)
|
||||
* Modular, single‐file components to minimize bundle size
|
||||
* **Metadata Loading:** SCADA object name properties loaded at startup from version‐controlled repo
|
||||
* **Error Handling:** Return structured JSON errors with HTTP status codes
|
||||
* **Commit Messages:** Conventional Commits format
|
||||
|
||||
---
|
||||
|
||||
## Key Constraints
|
||||
|
||||
* Must run on a Linux server (no Windows dependencies)
|
||||
* Frontend bundle size < 200 KB gzipped
|
||||
* Handle XLSX files up to 50 MB without timeouts
|
||||
* All configuration and manifests stored in plain files or Git (no external DB)
|
||||
|
||||
---
|
||||
|
||||
## Tokenization Settings
|
||||
|
||||
* **Estimation Method:** Character-based
|
||||
* **Characters Per Token (Estimate):** 4
|
||||
100
test_extract.py
Normal file
100
test_extract.py
Normal file
@ -0,0 +1,100 @@
|
||||
import os
|
||||
import json
|
||||
from pathlib import Path
|
||||
|
||||
def extract_names_recursive(obj, names_list, visited=None):
|
||||
"""
|
||||
Recursively extract all 'meta.name' values from a nested JSON object.
|
||||
|
||||
Args:
|
||||
obj: The JSON object or list to process
|
||||
names_list: List to append found names to
|
||||
visited: Set of object ids already visited (to prevent infinite recursion)
|
||||
"""
|
||||
if visited is None:
|
||||
visited = set()
|
||||
|
||||
# Skip already visited objects or non-container types
|
||||
if not isinstance(obj, (dict, list)) or id(obj) in visited:
|
||||
return
|
||||
|
||||
# Mark this object as visited
|
||||
visited.add(id(obj))
|
||||
|
||||
if isinstance(obj, dict):
|
||||
# Check if this object has a meta.name field
|
||||
if 'meta' in obj and isinstance(obj['meta'], dict) and 'name' in obj['meta']:
|
||||
name = obj['meta']['name']
|
||||
if name and isinstance(name, str):
|
||||
names_list.append(name)
|
||||
|
||||
# Check for children array and process only this key specifically
|
||||
if 'children' in obj and isinstance(obj['children'], list):
|
||||
for child in obj['children']:
|
||||
extract_names_recursive(child, names_list, visited)
|
||||
|
||||
# Only process a few key dictionary values that might contain component definitions
|
||||
keys_to_process = ['root', 'props', 'custom']
|
||||
for key in keys_to_process:
|
||||
if key in obj:
|
||||
extract_names_recursive(obj[key], names_list, visited)
|
||||
|
||||
elif isinstance(obj, list):
|
||||
# Process only the first 1000 items to prevent excessive recursion
|
||||
for item in obj[:1000]:
|
||||
extract_names_recursive(item, names_list, visited)
|
||||
|
||||
def load_scada_names(repo_path):
|
||||
"""
|
||||
Recursively find all JSON files in a repository and extract all component names.
|
||||
Names can be found in 'meta.name' fields at both the root level and in nested children.
|
||||
|
||||
Args:
|
||||
repo_path (str): Path to the repository
|
||||
|
||||
Returns:
|
||||
list: List of SCADA names extracted from JSON files
|
||||
"""
|
||||
names = []
|
||||
repo_dir = Path(repo_path)
|
||||
|
||||
# Find all JSON files recursively
|
||||
json_files = list(repo_dir.glob('**/*.json'))
|
||||
print(f"Found {len(json_files)} JSON files")
|
||||
|
||||
for json_file in json_files:
|
||||
try:
|
||||
with open(json_file, 'r') as f:
|
||||
data = json.load(f)
|
||||
|
||||
# Store the count before extraction
|
||||
count_before = len(names)
|
||||
|
||||
# Extract names recursively from the JSON structure
|
||||
extract_names_recursive(data, names)
|
||||
|
||||
# Print how many names were found in this file
|
||||
count_after = len(names)
|
||||
if count_after > count_before:
|
||||
print(f"Found {count_after - count_before} names in {json_file}")
|
||||
|
||||
except json.JSONDecodeError:
|
||||
print(f"Invalid JSON in {json_file}")
|
||||
continue
|
||||
except Exception as e:
|
||||
print(f"Error processing {json_file}: {str(e)}")
|
||||
continue
|
||||
|
||||
return names
|
||||
|
||||
# Test with the specified path
|
||||
if __name__ == "__main__":
|
||||
repo_path = "project/clones/9820af836d9854563e0e495ca1541de48aefd95e"
|
||||
names = load_scada_names(repo_path)
|
||||
print(f"\nTotal names found: {len(names)}")
|
||||
|
||||
# Print some example names if any were found
|
||||
if names:
|
||||
print("\nExample names:")
|
||||
for name in sorted(names)[:20]: # First 20 names alphabetically
|
||||
print(f"- {name}")
|
||||
402
workflow_state.md
Normal file
402
workflow_state.md
Normal file
@ -0,0 +1,402 @@
|
||||
# Workflow State & Rules (STM + Rules + Log)
|
||||
|
||||
*This file contains the dynamic state, embedded rules, active plan, and log for the current session.*
|
||||
*It is read and updated frequently by the AI during its operational loop.*
|
||||
|
||||
---
|
||||
|
||||
## State
|
||||
|
||||
*Holds the current status of the workflow.*
|
||||
|
||||
```yaml
|
||||
Phase: CONSTRUCT # Current workflow phase (ANALYZE, BLUEPRINT, CONSTRUCT, VALIDATE, BLUEPRINT_REVISE)
|
||||
Status: IN_PROGRESS # Current status (READY, IN_PROGRESS, BLOCKED_*, NEEDS_*, COMPLETED, COMPLETED_ITERATION)
|
||||
CurrentTaskID: BuildFlaskComparisonApp # Identifier for the main task being worked on
|
||||
CurrentStep: Step 7.4 # Identifier for the specific step in the plan being executed
|
||||
CurrentItem: null # Identifier for the item currently being processed in iteration
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Plan
|
||||
|
||||
*Contains the step-by-step implementation plan generated during the BLUEPRINT phase.*
|
||||
|
||||
**Task: BuildFlaskComparisonApp**
|
||||
|
||||
*Creating a Python Flask web application to compare three data sources: SCADA JSON files, Manifest Excel file, and DWG Excel file.*
|
||||
|
||||
### 1. Project Setup
|
||||
|
||||
* `[✓] Step 1.1: Create project directory structure.`
|
||||
- Create main project folder
|
||||
- Create templates/ directory for HTML templates
|
||||
- Create static/ directory for CSS and JavaScript
|
||||
- Create clones/ directory for GitHub repositories
|
||||
* `[✓] Step 1.2: Create requirements.txt with dependencies.`
|
||||
- Flask for web framework
|
||||
- pandas and openpyxl for Excel file handling
|
||||
- GitPython for repository operations
|
||||
- Other necessary dependencies
|
||||
* `[✓] Step 1.3: Create README.md with setup and usage instructions.`
|
||||
- Include installation steps (pip install -r requirements.txt)
|
||||
- Include usage instructions (flask run)
|
||||
- Document application functionality
|
||||
|
||||
### 2. Helper Functions Implementation
|
||||
|
||||
* `[✓] Step 2.1: Implement repository handling function.`
|
||||
- Create create_or_update_repo(repo_url) function
|
||||
- Generate secure repo_id from URL using SHA1
|
||||
- Clone repo if not exists, pull if exists
|
||||
- Handle errors for invalid URLs
|
||||
* `[✓] Step 2.2: Implement SCADA JSON loading function.`
|
||||
- Create load_scada_names(repo_path) function
|
||||
- Recursively find all JSON files in repo
|
||||
- Extract meta.name field from each JSON
|
||||
- Return list of names
|
||||
* `[✓] Step 2.3: Implement Excel file loading function.`
|
||||
- Create load_excel_names(file_path) function
|
||||
- Use pandas to read Excel file
|
||||
- Extract "Name" column
|
||||
- Return list of names
|
||||
* `[✓] Step 2.4: Implement name normalization function.`
|
||||
- Create normalize_names(names) function
|
||||
- Strip whitespace
|
||||
- Convert to uppercase
|
||||
- Replace '-' with '_'
|
||||
- Remove duplicates
|
||||
- Return normalized list
|
||||
* `[✓] Step 2.5: Implement name comparison function.`
|
||||
- Create compare_name_lists(list1, list2) function
|
||||
- Find items in list1 but not in list2
|
||||
- Find items in list2 but not in list1
|
||||
- Return comparison results
|
||||
|
||||
### 3. Flask Application Implementation
|
||||
|
||||
* `[✓] Step 3.1: Create app.py and initialize Flask application.`
|
||||
- Import necessary modules
|
||||
- Create Flask app instance
|
||||
- Configure app settings
|
||||
* `[✓] Step 3.2: Implement index route (GET /).`
|
||||
- Create route for homepage
|
||||
- Render index.html template with upload form
|
||||
* `[✓] Step 3.3: Implement comparison route (POST /compare).`
|
||||
- Create route for handling form submission
|
||||
- Extract repo_url and uploaded files
|
||||
- Call helper functions for repo handling and data loading
|
||||
- Normalize names from all sources
|
||||
- Compare name lists
|
||||
- Render results.html with comparison data
|
||||
* `[✓] Step 3.4: Implement update route (POST /update_files).`
|
||||
- Create route for handling re-uploads
|
||||
- Extract repo_id and new files
|
||||
- Update repo and re-run comparison
|
||||
- Render updated results.html
|
||||
|
||||
### 4. HTML Templates Creation
|
||||
|
||||
* `[✓] Step 4.1: Create base.html template.`
|
||||
- Add HTML structure with Bootstrap
|
||||
- Include navigation
|
||||
- Setup template inheritance
|
||||
* `[✓] Step 4.2: Create index.html template.`
|
||||
- Extend base.html
|
||||
- Add form for repo URL input
|
||||
- Add file inputs for manifest and DWG files
|
||||
- Add submit button
|
||||
* `[✓] Step 4.3: Create results.html template.`
|
||||
- Extend base.html
|
||||
- Create Bootstrap tabs for the three comparisons
|
||||
- Add tables for displaying results
|
||||
- Highlight missing entries
|
||||
- Add re-upload form with hidden repo_id
|
||||
|
||||
### 5. Static Assets Creation
|
||||
|
||||
* `[✓] Step 5.1: Create CSS for styling.`
|
||||
- Add styles for tables
|
||||
- Add styles for highlighting
|
||||
- Ensure responsive design
|
||||
* `[✓] Step 5.2: Add JavaScript for interactions.`
|
||||
- Add script for tab navigation
|
||||
- Add script for any filtering functionality
|
||||
|
||||
### 6. Security & Error Handling
|
||||
|
||||
* `[✓] Step 6.1: Implement input validation.`
|
||||
- Validate repo URL format
|
||||
- Validate uploaded files
|
||||
* `[✓] Step 6.2: Add error handling for file operations.`
|
||||
- Handle missing or invalid Excel files
|
||||
- Handle Excel files without required columns
|
||||
* `[✓] Step 6.3: Add error handling for repository operations.`
|
||||
- Handle invalid repository URLs
|
||||
- Handle network or permission issues
|
||||
|
||||
### 7. Testing & Validation
|
||||
|
||||
* `[✓] Step 7.1: Test repository handling functionality.`
|
||||
- Test with valid and invalid URLs
|
||||
- Verify clone and pull operations
|
||||
- Fixed component extraction from nested JSON structures
|
||||
* `[✓] Step 7.2: Test file upload handling.`
|
||||
- Test with valid and invalid Excel files
|
||||
- Verify data extraction
|
||||
- Added repository update mechanism for latest changes
|
||||
- Implemented manual refresh functionality
|
||||
* `[✓] Step 7.3: Test name normalization and comparison.`
|
||||
- Verify normalization rules are applied correctly
|
||||
- Verify comparison results are accurate
|
||||
- Fixed repository update functionality to reload data properly
|
||||
- Added CSRF protection for form submissions
|
||||
* `[ ] Step 7.4: Test re-upload functionality.`
|
||||
- Verify new files are processed correctly
|
||||
- Verify updated results are displayed
|
||||
|
||||
---
|
||||
|
||||
## Rules
|
||||
|
||||
*Embedded rules governing the AI's autonomous operation.*
|
||||
|
||||
**# --- Core Workflow Rules ---**
|
||||
|
||||
RULE_WF_PHASE_ANALYZE:
|
||||
**Constraint:** Goal is understanding request/context. NO solutioning or implementation planning.
|
||||
|
||||
RULE_WF_PHASE_BLUEPRINT:
|
||||
**Constraint:** Goal is creating a detailed, unambiguous step-by-step plan. NO code implementation.
|
||||
|
||||
RULE_WF_PHASE_CONSTRUCT:
|
||||
**Constraint:** Goal is executing the `## Plan` exactly. NO deviation. If issues arise, trigger error handling or revert phase.
|
||||
|
||||
RULE_WF_PHASE_VALIDATE:
|
||||
**Constraint:** Goal is verifying implementation against `## Plan` and requirements using tools. NO new implementation.
|
||||
|
||||
RULE_WF_TRANSITION_01:
|
||||
**Trigger:** Explicit user command (`@analyze`, `@blueprint`, `@construct`, `@validate`).
|
||||
**Action:** Update `State.Phase` accordingly. Log phase change.
|
||||
|
||||
RULE_WF_TRANSITION_02:
|
||||
**Trigger:** AI determines current phase constraint prevents fulfilling user request OR error handling dictates phase change (e.g., RULE_ERR_HANDLE_TEST_01).
|
||||
**Action:** Log the reason. Update `State.Phase` (e.g., to `BLUEPRINT_REVISE`). Set `State.Status` appropriately (e.g., `NEEDS_PLAN_APPROVAL`). Report to user.
|
||||
|
||||
RULE_ITERATE_01: # Triggered by RULE_MEM_READ_STM_01 when State.Status == READY and State.CurrentItem == null, or after VALIDATE phase completion.
|
||||
**Trigger:** `State.Status == READY` and `State.CurrentItem == null` OR after `VALIDATE` phase completion.
|
||||
**Action:**
|
||||
1. Check `## Items` section for more items.
|
||||
2. If more items:
|
||||
3. Set `State.CurrentItem` to the next item.
|
||||
4. Clear `## Log`.
|
||||
5. Set `State.Phase = ANALYZE`, `State.Status = READY`.
|
||||
6. Log "Starting processing item [State.CurrentItem]".
|
||||
7. If no more items:
|
||||
8. Trigger `RULE_ITERATE_02`.
|
||||
|
||||
RULE_ITERATE_02:
|
||||
**Trigger:** `RULE_ITERATE_01` determines no more items.
|
||||
**Action:**
|
||||
1. Set `State.Status = COMPLETED_ITERATION`.
|
||||
2. Log "Tokenization iteration completed."
|
||||
|
||||
**# --- Initialization & Resumption Rules ---**
|
||||
|
||||
RULE_INIT_01:
|
||||
**Trigger:** AI session/task starts AND `workflow_state.md` is missing or empty.
|
||||
**Action:**
|
||||
1. Create `workflow_state.md` with default structure.
|
||||
2. Read `project_config.md` (prompt user if missing).
|
||||
3. Set `State.Phase = ANALYZE`, `State.Status = READY`.
|
||||
4. Log "Initialized new session."
|
||||
5. Prompt user for the first task.
|
||||
|
||||
RULE_INIT_02:
|
||||
**Trigger:** AI session/task starts AND `workflow_state.md` exists.
|
||||
**Action:**
|
||||
1. Read `project_config.md`.
|
||||
2. Read existing `workflow_state.md`.
|
||||
3. Log "Resumed session."
|
||||
4. Check `State.Status`: Handle READY, COMPLETED, BLOCKED_*, NEEDS_*, IN_PROGRESS appropriately (prompt user or report status).
|
||||
|
||||
RULE_INIT_03:
|
||||
**Trigger:** User confirms continuation via RULE_INIT_02 (for IN_PROGRESS state).
|
||||
**Action:** Proceed with the next action based on loaded state and rules.
|
||||
|
||||
**# --- Memory Management Rules ---**
|
||||
|
||||
RULE_MEM_READ_LTM_01:
|
||||
**Trigger:** Start of a new major task or phase.
|
||||
**Action:** Read `project_config.md`. Log action.
|
||||
RULE_MEM_READ_STM_01:
|
||||
**Trigger:** Before *every* decision/action cycle.
|
||||
**Action:**
|
||||
1. Read `workflow_state.md`.
|
||||
2. If `State.Status == READY` and `State.CurrentItem == null`:
|
||||
3. Log "Attempting to trigger RULE_ITERATE_01".
|
||||
4. Trigger `RULE_ITERATE_01`.
|
||||
|
||||
RULE_MEM_UPDATE_STM_01:
|
||||
**Trigger:** After *every* significant action or information receipt.
|
||||
**Action:** Immediately update relevant sections (`## State`, `## Plan`, `## Log`) in `workflow_state.md` and save.
|
||||
|
||||
RULE_MEM_UPDATE_LTM_01:
|
||||
**Trigger:** User command (`@config/update`) OR end of successful VALIDATE phase for significant change.
|
||||
**Action:** Propose concise updates to `project_config.md` based on `## Log`/diffs. Set `State.Status = NEEDS_LTM_APPROVAL`. Await user confirmation.
|
||||
|
||||
RULE_MEM_VALIDATE_01:
|
||||
**Trigger:** After updating `workflow_state.md` or `project_config.md`.
|
||||
**Action:** Perform internal consistency check. If issues found, log and set `State.Status = NEEDS_CLARIFICATION`.
|
||||
|
||||
**# --- Tool Integration Rules (Cursor Environment) ---**
|
||||
|
||||
RULE_TOOL_LINT_01:
|
||||
**Trigger:** Relevant source file saved during CONSTRUCT phase.
|
||||
**Action:** Instruct Cursor terminal to run lint command. Log attempt. On completion, parse output, log result, set `State.Status = BLOCKED_LINT` if errors.
|
||||
|
||||
RULE_TOOL_FORMAT_01:
|
||||
**Trigger:** Relevant source file saved during CONSTRUCT phase.
|
||||
**Action:** Instruct Cursor to apply formatter or run format command via terminal. Log attempt.
|
||||
|
||||
RULE_TOOL_TEST_RUN_01:
|
||||
**Trigger:** Command `@validate` or entering VALIDATE phase.
|
||||
**Action:** Instruct Cursor terminal to run test suite. Log attempt. On completion, parse output, log result, set `State.Status = BLOCKED_TEST` if failures, `TESTS_PASSED` if success.
|
||||
|
||||
RULE_TOOL_APPLY_CODE_01:
|
||||
**Trigger:** AI determines code change needed per `## Plan` during CONSTRUCT phase.
|
||||
|
||||
RULE_PROCESS_ITEM_01:
|
||||
**Trigger:** `State.Phase == CONSTRUCT` and `State.CurrentItem` is not null and current step in `## Plan` requires item processing.
|
||||
**Action:**
|
||||
1. **Get Item Text:** Based on `State.CurrentItem`, extract the corresponding 'Text to Tokenize' from the `## Items` section.
|
||||
2. **Summarize (Placeholder):** Use a placeholder to generate a summary of the extracted text. For example, "Summary of [text] is [placeholder summary]".
|
||||
3. **Estimate Token Count:**
|
||||
a. Read `Characters Per Token (Estimate)` from `project_config.md`.
|
||||
b. Get the text content of the item from the `## Items` section. (Placeholder: Implement logic to extract text based on `State.CurrentItem` from the `## Items` table.)
|
||||
c. Calculate `estimated_tokens = length(text_content) / 4`.
|
||||
4. **Summarize (Placeholder):** Use a placeholder to generate a summary of the extracted text. For example, "Summary of [text] is [placeholder summary]". (Placeholder: Replace with actual summarization tool/logic)
|
||||
5. **Store Results:** Append a new row to the `## TokenizationResults` table with:
|
||||
* `Item ID`: `State.CurrentItem`
|
||||
* `Summary`: The generated summary. (Placeholder: Implement logic to store the summary.)
|
||||
* `Token Count`: `estimated_tokens`.
|
||||
6. Log the processing actions, results, and estimated token count to the `## Log`. (Placeholder: Implement logging.)
|
||||
|
||||
**Action:** Generate modification. Instruct Cursor to apply it. Log action.
|
||||
|
||||
**# --- Error Handling & Recovery Rules ---**
|
||||
|
||||
RULE_ERR_HANDLE_LINT_01:
|
||||
**Trigger:** `State.Status` is `BLOCKED_LINT`.
|
||||
**Action:** Analyze error in `## Log`. Attempt auto-fix if simple/confident. Apply fix via RULE_TOOL_APPLY_CODE_01. Re-run lint via RULE_TOOL_LINT_01. If success, reset `State.Status`. If fail/complex, set `State.Status = BLOCKED_LINT_UNRESOLVED`, report to user.
|
||||
|
||||
RULE_ERR_HANDLE_TEST_01:
|
||||
**Trigger:** `State.Status` is `BLOCKED_TEST`.
|
||||
**Action:** Analyze failure in `## Log`. Attempt auto-fix if simple/localized/confident. Apply fix via RULE_TOOL_APPLY_CODE_01. Re-run failed test(s) or suite via RULE_TOOL_TEST_RUN_01. If success, reset `State.Status`. If fail/complex, set `State.Phase = BLUEPRINT_REVISE`, `State.Status = NEEDS_PLAN_APPROVAL`, propose revised `## Plan` based on failure analysis, report to user.
|
||||
|
||||
RULE_ERR_HANDLE_GENERAL_01:
|
||||
**Trigger:** Unexpected error or ambiguity.
|
||||
**Action:** Log error/situation to `## Log`. Set `State.Status = BLOCKED_UNKNOWN`. Report to user, request instructions.
|
||||
|
||||
---
|
||||
|
||||
## Log
|
||||
|
||||
*A chronological log of significant actions, events, tool outputs, and decisions.*
|
||||
*(This section will be populated by the AI during operation)*
|
||||
|
||||
* `[2025-03-26 17:53:47] Initialized new session. State set to ANALYZE/READY.`
|
||||
* `[2025-03-26 20:15:00] Received new task: Build Flask Comparison App.`
|
||||
* `[2025-03-26 20:15:10] State.Phase changed to BLUEPRINT. State.Status set to IN_PROGRESS.`
|
||||
* `[2025-03-26 20:15:15] Setting up detailed plan for BuildFlaskComparisonApp.`
|
||||
* `[2025-03-26 20:20:00] Detailed implementation plan created.`
|
||||
* `[2025-03-26 20:20:10] State.Status changed to NEEDS_PLAN_APPROVAL. Awaiting user confirmation.`
|
||||
* `[2025-03-26 20:25:00] User approved plan. Moving to CONSTRUCT phase.`
|
||||
* `[2025-03-26 20:25:10] Creating project directory structure.`
|
||||
* `[2025-03-26 20:25:30] Created directories: project/templates, project/static, project/clones.`
|
||||
* `[2025-03-26 20:25:35] Moving to Step 1.2: Creating requirements.txt.`
|
||||
* `[2025-03-26 20:26:00] Created requirements.txt with necessary dependencies.`
|
||||
* `[2025-03-26 20:26:05] Moving to Step 1.3: Creating README.md.`
|
||||
* `[2025-03-26 20:26:30] Created README.md with setup and usage instructions.`
|
||||
* `[2025-03-26 20:26:35] Moving to Step 2.1: Implementing repository handling function.`
|
||||
* `[2025-03-26 20:27:00] Created app.py with Flask initialization and repository handling function.`
|
||||
* `[2025-03-26 20:27:05] Moving to Step 2.2: Implementing SCADA JSON loading function.`
|
||||
* `[2025-03-26 20:27:30] Added load_scada_names function to app.py.`
|
||||
* `[2025-03-26 20:27:35] Moving to Step 2.3: Implementing Excel file loading function.`
|
||||
* `[2025-03-26 20:28:00] Added load_excel_names function to app.py.`
|
||||
* `[2025-03-26 20:28:05] Moving to Step 2.4: Implementing name normalization function.`
|
||||
* `[2025-03-26 20:28:30] Added normalize_names function to app.py.`
|
||||
* `[2025-03-26 20:28:35] Moving to Step 2.5: Implementing name comparison function.`
|
||||
* `[2025-03-26 20:29:00] Added compare_name_lists function to app.py.`
|
||||
* `[2025-03-26 20:29:05] Moving to Step 3.1: Implementing Flask application initialization.`
|
||||
* `[2025-03-26 20:29:30] Verified Flask app initialization is already complete in app.py.`
|
||||
* `[2025-03-26 20:29:35] Moving to Step 3.2: Implementing index route (GET /).`
|
||||
* `[2025-03-26 20:30:00] Added index route to app.py.`
|
||||
* `[2025-03-26 20:30:30] Created base.html template with Bootstrap and navigation.`
|
||||
* `[2025-03-26 20:31:00] Created index.html template with upload form.`
|
||||
* `[2025-03-26 20:31:30] Created CSS and JavaScript files for styling and interactivity.`
|
||||
* `[2025-03-26 20:31:35] Moving to Step 3.3: Implementing comparison route (POST /compare).`
|
||||
* `[2025-03-26 20:32:00] Added comparison route to app.py with full implementation of form handling, data processing, and template rendering.`
|
||||
* `[2025-03-26 20:32:05] Moving to Step 3.4: Implementing update route (POST /update_files).`
|
||||
* `[2025-03-26 20:32:30] Added update_files route to app.py with handling for file re-uploads and updated comparisons.`
|
||||
* `[2025-03-26 20:32:35] Verifying Step 4.1 and 4.2: base.html and index.html templates have already been created.`
|
||||
* `[2025-03-26 20:33:00] Moving to Step 4.3: Creating results.html template.`
|
||||
* `[2025-03-26 20:34:00] Created results.html template with tabs for comparison results and re-upload form.`
|
||||
* `[2025-03-26 20:34:05] Moving to Step 5.1: Creating CSS for styling.`
|
||||
* `[2025-03-26 20:35:00] Created styles.css with comprehensive styling for tables, highlighting, and responsive design.`
|
||||
* `[2025-03-26 20:35:05] Moving to Step 5.2: Adding JavaScript for interactions.`
|
||||
* `[2025-03-26 20:36:00] Created script.js with functionality for tab navigation, table filtering, and clipboard copying.`
|
||||
* `[2025-03-26 20:36:05] Moving to Step 6.1: Implementing input validation.`
|
||||
* `[2025-03-26 20:37:00] Added input validation for repository URLs and Excel file uploads.`
|
||||
* `[2025-03-26 20:37:05] Moving to Step 6.2: Adding error handling for file operations.`
|
||||
* `[2025-03-26 20:38:00] Enhanced load_excel_names function with comprehensive error handling for Excel files.`
|
||||
* `[2025-03-26 20:38:05] Moving to Step 6.3: Adding error handling for repository operations.`
|
||||
* `[2025-03-26 20:39:00] Enhanced create_or_update_repo function with comprehensive error handling for network issues, timeouts, and permission problems.`
|
||||
* `[2025-03-26 20:39:05] Moving to Step 7.1: Testing repository handling functionality.`
|
||||
* `[2025-03-26 21:00:00] Updated URL validation to support HTTP URLs with port numbers for Gitea compatibility.`
|
||||
* `[2025-03-26 21:15:00] Improved JSON component name extraction to recursively find all components in nested structures.`
|
||||
* `[2025-03-26 21:16:00] Test script found 5,351 component names from SCADA JSON files.`
|
||||
* `[2025-03-26 21:17:00] Step 7.1 completed. Moving to Step 7.2: Testing file upload handling.`
|
||||
* `[2025-03-26 21:20:00] Added repository update function to automatically fetch latest changes.`
|
||||
* `[2025-03-26 21:21:00] Added manual refresh button to allow users to explicitly update the repository.`
|
||||
* `[2025-03-26 21:22:00] Step 7.2 completed. Moving to Step 7.3: Testing name normalization and comparison.`
|
||||
* `[2025-03-26 21:30:00] Fixed issue where repository was updated but data was not reloaded.`
|
||||
* `[2025-03-26 21:31:00] Added CSRF protection to prevent 405 Method Not Allowed errors.`
|
||||
* `[2025-03-26 21:32:00] Step 7.3 completed. Moving to Step 7.4: Testing re-upload functionality.`
|
||||
|
||||
---
|
||||
|
||||
## Items
|
||||
|
||||
*This section will contain the list of items to be processed.*
|
||||
*(The format of items is a table)*
|
||||
|
||||
*Example (Table):*
|
||||
* `| Item ID | Text to Tokenize |`
|
||||
* `|---|---|`
|
||||
* `| item1 | This is the first item to tokenize. This is a short sentence. |`
|
||||
* `| item2 | Here is the second item for tokenization. This is a slightly longer sentence to test the summarization. |`
|
||||
* `| item3 | This is item number three to be processed. This is a longer sentence to test the summarization. This is a longer sentence to test the summarization. |`
|
||||
* `| item4 | And this is the fourth and final item in the list. This is a very long sentence to test the summarization. This is a very long sentence to test the summarization. This is a very long sentence to test the summarization. This is a very long sentence to test the summarization. |`
|
||||
---
|
||||
|
||||
## TokenizationResults
|
||||
|
||||
*This section will store the summarization results for each item.*
|
||||
*(Results will include the summary and estimated token count)*
|
||||
|
||||
*Example (Table):*
|
||||
* `| Item ID | Summary | Token Count |`
|
||||
* `|---|---|---|`
|
||||
|
||||
## TokenizationResults
|
||||
|
||||
*This section will store the tokenization results for each item.*
|
||||
*(Results will include token counts and potentially tokenized text)*
|
||||
|
||||
*Example (Table):*
|
||||
* `| Item ID | Token Count | Tokenized Text (Optional) |`
|
||||
* `|---|---|---|`
|
||||
* `| item1 | 10 | ... (tokenized text) ... |`
|
||||
* `| item2 | 12 | ... (tokenized text) ... |`
|
||||
Loading…
x
Reference in New Issue
Block a user