Loading...
Loading...
Comprehensive software development planning and implementation skill. Triggers when: Creating new Python software with CLI/GUI/Web interfaces, planning software architecture and modules, designing scientific or engineering applications, setting up bilingual documentation and PyPI publishing, or needing academic research-based feature design. Capabilities: Pre-development planning and research, multi-interface design (CLI + PySide6 GUI + Flask Web), scientific visualization with pyqtgraph, academic literature-based feature design, sample data and test documentation generation, bilingual README with structured sections, GPLv3 licensing and PyPI publishing setup.
npx skill4agent add cycleuser/skills software-plannerpdf/Software Name (v1.0)
├── Core Features (from research)
│ ├── Feature 1: [description with citation]
│ ├── Feature 2: [description with citation]
│ └── Feature 3: [description with citation]
├── Data Models
│ ├── Model 1: fields, relationships
│ └── Model 2: fields, relationships
├── Algorithms
│ ├── Algorithm 1: input, output, complexity
│ └── Algorithm 2: input, output, complexity
└── User Interfaces
├── CLI: commands, flags, arguments
├── GUI: windows, panels, controls
└── Web: routes, templates, API endpointscli.pygui.pyapp.pycore.pyapi.pyimport argparse
def main():
parser = argparse.ArgumentParser(
prog="softwarename",
description="Software description",
formatter_class=argparse.RawDescriptionHelpFormatter,
)
# Unified flags (required)
parser.add_argument("-V", "--version", action="version", version=f"softwarename {__version__}")
parser.add_argument("-v", "--verbose", action="store_true", help="Verbose output")
parser.add_argument("-o", "--output", help="Output path")
parser.add_argument("--json", action="store_true", dest="json_output", help="Output as JSON")
parser.add_argument("-q", "--quiet", action="store_true", help="Suppress output")
# Mode selection
subparsers = parser.add_subparsers(dest="mode")
# GUI mode
gui_parser = subparsers.add_parser("gui", help="Launch GUI")
gui_parser.add_argument("--no-web", action="store_true", help="Disable embedded web server")
# Web mode
web_parser = subparsers.add_parser("web", help="Launch web server")
web_parser.add_argument("--host", default="127.0.0.1")
web_parser.add_argument("--port", type=int, default=5000)
# CLI operations
cli_parser = subparsers.add_parser("cli", help="CLI mode")
cli_parser.add_argument("input", help="Input file or data")softwarename guisoftwarename websoftwarename cli <args>python -m packagenamefrom PySide6.QtWidgets import (
QApplication, QMainWindow, QWidget, QVBoxLayout,
QHBoxLayout, QPushButton, QLabel, QLineEdit,
QComboBox, QSpinBox, QDoubleSpinBox, QTableWidget,
QTabWidget, QGroupBox, QFileDialog, QMessageBox,
)
from PySide6.QtCore import Qt
import pyqtgraph as pg
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("Software Name v1.0")
self.setMinimumSize(800, 600)
# Central widget with default styling
central = QWidget()
self.setCentralWidget(central)
layout = QVBoxLayout(central)
# Controls in group box
control_group = QGroupBox("Parameters")
control_layout = QHBoxLayout(control_group)
# Input controls
self.input_edit = QLineEdit()
self.input_edit.setPlaceholderText("Enter input...")
control_layout.addWidget(QLabel("Input:"))
control_layout.addWidget(self.input_edit)
# Action buttons
btn_run = QPushButton("Run")
btn_run.clicked.connect(self.run_analysis)
control_layout.addWidget(btn_run)
layout.addWidget(control_group)
# Visualization with pyqtgraph
self.plot_widget = pg.PlotWidget()
self.plot_widget.setBackground('w') # White background for plots
self.plot_widget.showGrid(x=True, y=True)
layout.addWidget(self.plot_widget)
# Results table
self.results_table = QTableWidget()
self.results_table.setColumnCount(4)
self.results_table.setHorizontalHeaderLabels(["ID", "Name", "Value", "Score"])
layout.addWidget(self.results_table)QLineEditQSpinBoxQDoubleSpinBoxQComboBoxQCheckBoxQPushButtonfrom flask import Flask, render_template, jsonify, request
app = Flask(__name__)
@app.route("/")
def index():
return render_template("index.html")
@app.route("/api/analyze", methods=["POST"])
def analyze():
data = request.json
result = perform_analysis(data)
return jsonify(result.to_dict())
@app.route("/api/results/<id>")
def get_results(id):
result = get_stored_result(id)
return jsonify(result.to_dict())
def run_server(host="127.0.0.1", port=5000):
print(f"Starting server at http://{host}:{port}")
app.run(host=host, port=port, debug=False)from dataclasses import dataclass, field
from typing import Any, Optional
@dataclass
class ToolResult:
success: bool
data: Any = None
error: Optional[str] = None
metadata: dict = field(default_factory=dict)
def to_dict(self) -> dict:
return {
"success": self.success,
"data": self.data,
"error": self.error,
"metadata": self.metadata,
}data/
├── sample_input.json # Example input data
├── sample_results.json # Expected output for testing
├── test_cases.json # Test case definitions
└── reference_data.csv # Reference/benchmark data{
"description": "Sample input for testing",
"version": "1.0",
"cases": [
{
"id": "case_001",
"name": "Basic test case",
"input": {
"param1": "value1",
"param2": 100
},
"expected_output": {
"result": "expected_result",
"score": 0.95
}
}
]
}project_name/
├── pyproject.toml # Package configuration
├── requirements.txt # Dependencies list
├── LICENSE # GPLv3 license
├── README.md # English documentation
├── README_CN.md # Chinese documentation
├── MANIFEST.in # Package manifest
├── upload_pypi.sh # PyPI upload script (Unix)
├── upload_pypi.bat # PyPI upload script (Windows)
├── pdf/ # Academic reference papers
│ ├── paper1.pdf
│ └── paper2.pdf
├── data/ # Sample data
│ ├── sample_input.json
│ └── test_cases.json
├── images/ # Screenshots
│ └── placeholder.png
├── tests/ # Test suite
│ ├── __init__.py
│ ├── conftest.py
│ └── test_core.py
└── packagename/ # Main package
├── __init__.py # Version and exports
├── __main__.py # python -m entry
├── cli.py # CLI implementation
├── gui.py # GUI implementation
├── app.py # Flask web app
├── core.py # Business logic
└── api.py # Unified APIpdf/# Create project structure
mkdir -p project_name/{pdf,data,images,tests,packagename}
# Create required files
touch project_name/{pyproject.toml,requirements.txt,LICENSE,README.md,README_CN.md}
touch project_name/upload_pypi.{sh,bat}
# Create package files
touch project_name/packagename/{__init__.py,__main__.py,cli.py,gui.py,app.py,core.py,api.py}
# Create test files
touch project_name/tests/{__init__.py,conftest.py,test_core.py}