Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Documentation generation for C, C++, and Java codebases using Doxygen and Javadoc. Extract API documentation from source code, generate cross-references, call graphs, and comprehensive technical documentation.
.claude/skills/a5c-ai-doxygen-javadoc/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 213% | 0% |
| case-03 | ✗→✓ | ▲ Improved | 180% | 0% |
| case-15 | ✗→✓ | ▲ Improved | 651% | 0% |
| case-16 | ✗→✓ | ▲ Improved | 284% | 0% |
| case-02 | ✓→✓ | = Same ✓ | 48% | 0% |
Generate comprehensive API documentation for C, C++, Java, and other languages using Doxygen and Javadoc with cross-references, call graphs, and coverage analysis.
Invoke this skill when you need to:
| Parameter | Type | Required | Description | |-----------|------|----------|-------------| | projectPath | string | Yes | Root path of the project | | tool | string | No | doxygen or javadoc (auto-detected) | | sourceDir | string | No | Source directory (default: src) | | outputDir | string | No | Output directory (default: docs) | | outputFormat | array | No | html, latex, pdf, xml, man | | includeGraphs | boolean | No | Generate call/dependency graphs | | configFile | string | No | Existing Doxyfile or pom.xml path | | coverageReport | boolean | No | Generate coverage analysis |
json{ "projectPath": "./mylib", "tool": "doxygen", "sourceDir": "src", "outputDir": "docs/api", "outputFormat": ["html", "xml"], "includeGraphs": true, "coverageReport": true }
docs/api/
├── html/
│ ├── index.html # Main documentation page
│ ├── annotated.html # Class/struct list
│ ├── files.html # File list
│ ├── modules.html # Module grouping
│ ├── namespaces.html # Namespace documentation
│ ├── hierarchy.html # Class hierarchy
│ ├── class_*.html # Individual class pages
│ ├── struct_*.html # Struct documentation
│ ├── group__*.html # Module documentation
│ ├── *_8h.html # Header file documentation
│ └── search/ # Search index
├── xml/
│ ├── index.xml # XML index
│ ├── class_*.xml # Class XML
│ └── doxygen-layout.xml # Layout configuration
├── latex/ # LaTeX output (if enabled)
└── coverage.json # Documentation coveragedocs/api/
├── index.html # Package overview
├── overview-summary.html # Overview page
├── allclasses-index.html # Class index
├── allpackages-index.html # Package index
├── com/
│ └── example/
│ └── package/
│ ├── package-summary.html
│ ├── ClassName.html
│ └── ...
├── element-list # Package list
└── member-search-index.js # Search datacpp/** * @file database.h * @brief Database connection and query utilities. * * This module provides thread-safe database connection pooling * and query execution with automatic retry logic. * * @author Development Team * @date 2026-01-24 * @version 1.0.0 * * @copyright Copyright (c) 2026, Company Inc. */
cpp/** * @class ConnectionPool * @brief Thread-safe database connection pool. * * Manages a pool of database connections with configurable * minimum and maximum sizes. Connections are automatically * validated before use. * * @tparam Connection The connection type to pool * * @note This class is thread-safe. * @warning Do not exceed maxConnections in high-load scenarios. * * @see Connection * @see PoolConfig * * @code{.cpp} * ConnectionPool<MySqlConnection> pool(config); * auto conn = pool.acquire(); * conn->execute("SELECT * FROM users"); * pool.release(conn); * @endcode */ template<typename Connection> class ConnectionPool { public: /** * @brief Creates a new connection pool. * * @param config Pool configuration parameters * @throws ConfigurationError If config is invalid * * @pre config.maxConnections > 0 * @post Pool is initialized with minConnections */ explicit ConnectionPool(const PoolConfig& config); /** * @brief Acquires a connection from the pool. * * Blocks until a connection is available or timeout expires. * * @param timeout Maximum wait time in milliseconds * @return Shared pointer to the acquired connection * @throws TimeoutError If no connection available within timeout * * @par Thread Safety * This method is thread-safe. */ std::shared_ptr<Connection> acquire(int timeout = 30000); /** * @brief Releases a connection back to the pool. * * @param conn The connection to release * @retval true Connection successfully returned * @retval false Connection was invalid or pool is closed */ bool release(std::shared_ptr<Connection> conn); };
cpp/** * @brief Executes a SQL query with parameter binding. * * @param[in] query The SQL query string with placeholders * @param[in] params Parameter values to bind * @param[out] results Query results (if SELECT) * * @return Number of affected rows (for INSERT/UPDATE/DELETE) * * @throws QueryError If query execution fails * @throws ConnectionError If database connection is lost * * @par Example * @code{.cpp} * std::vector<std::string> params = {"John", "25"}; * ResultSet results; * int affected = executeQuery( * "SELECT * FROM users WHERE name = ? AND age > ?", * params, * results * ); * @endcode * * @par Performance * Query preparation is cached for repeated executions. * * @todo Add support for batch parameter binding * @bug Large result sets may cause memory issues (see #123) * * @since 1.0.0 * @deprecated Use PreparedStatement::execute() instead */ int executeQuery( const std::string& query, const std::vector<std::string>& params, ResultSet& results );
cpp/** * @defgroup Database Database Module * @brief Database connectivity and operations. * * This module provides database abstraction layer with support * for multiple database backends. * * @{ */ /** * @defgroup Database_Connection Connection Management * @brief Connection pooling and lifecycle. */ /** * @defgroup Database_Query Query Execution * @brief Query building and execution. */ /** @} */ // end of Database group
java/** * Database connectivity and query utilities. * * <p>This package provides thread-safe database operations with * connection pooling and automatic retry logic.</p> * * <h2>Usage Example</h2> * <pre>{@code * ConnectionPool pool = new ConnectionPool.Builder() * .maxConnections(10) * .timeout(Duration.ofSeconds(30)) * .build(); * * try (Connection conn = pool.acquire()) { * ResultSet rs = conn.executeQuery("SELECT * FROM users"); * } * }</pre> * * @author Development Team * @version 1.0.0 * @since 1.0.0 * @see com.example.database.ConnectionPool */ package com.example.database;
java/** * Thread-safe database connection pool. * * <p>Manages a pool of database connections with configurable * minimum and maximum sizes. Connections are validated before * being handed out.</p> * * <h2>Thread Safety</h2> * <p>This class is thread-safe. All public methods use proper * synchronization.</p> * * @param <T> The connection type to pool * * @author John Doe * @version 1.0.0 * @since 1.0.0 * * @see Connection * @see PoolConfig */ public class ConnectionPool<T extends Connection> implements AutoCloseable { /** * Creates a connection pool with the specified configuration. * * @param config the pool configuration * @throws IllegalArgumentException if config is null * @throws ConfigurationException if config values are invalid */ public ConnectionPool(PoolConfig config) { // Implementation } /** * Acquires a connection from the pool. * * <p>This method blocks until a connection becomes available * or the specified timeout expires.</p> * * @param timeout maximum time to wait for a connection * @return a valid connection from the pool * @throws TimeoutException if no connection available within timeout * @throws PoolClosedException if the pool has been closed */ public T acquire(Duration timeout) throws TimeoutException { // Implementation } /** * {@inheritDoc} * * <p>Closes all connections and releases resources.</p> */ @Override public void close() { // Implementation } }
java/** * Executes a parameterized SQL query. * * <p>Parameters are bound in the order provided. Use {@code ?} * as placeholder in the query string.</p> * * <h3>Example</h3> * <pre>{@code * List<User> users = db.query( * "SELECT * FROM users WHERE age > ? AND status = ?", * List.of(18, "active"), * User.class * ); * }</pre> * * @param <R> the result type * @param sql the SQL query with {@code ?} placeholders * @param params the parameter values (in order) * @param resultType the class to map results to * @return list of mapped results * @throws SQLException if query execution fails * @throws MappingException if result mapping fails * * @see #execute(String, List) for non-SELECT queries * @since 1.0.0 */ public <R> List<R> query(String sql, List<?> params, Class<R> resultType) throws SQLException { // Implementation }
ini# Doxyfile configuration # Project settings PROJECT_NAME = "MyLib" PROJECT_NUMBER = "1.0.0" PROJECT_BRIEF = "Database connectivity library" PROJECT_LOGO = logo.png # Input settings INPUT = src include FILE_PATTERNS = *.c *.cc *.cpp *.h *.hpp RECURSIVE = YES EXCLUDE = src/test src/vendor EXCLUDE_PATTERNS = *_test.cpp *_mock.h # Output settings OUTPUT_DIRECTORY = docs GENERATE_HTML = YES GENERATE_XML = YES GENERATE_LATEX = NO # HTML settings HTML_OUTPUT = html HTML_EXTRA_STYLESHEET = custom.css SEARCHENGINE = YES DISABLE_INDEX = NO GENERATE_TREEVIEW = YES # Graph settings HAVE_DOT = YES CALL_GRAPH = YES CALLER_GRAPH = YES CLASS_GRAPH = YES COLLABORATION_GRAPH = YES INCLUDE_GRAPH = YES INCLUDED_BY_GRAPH = YES DOT_IMAGE_FORMAT = svg # Documentation extraction EXTRACT_ALL = NO EXTRACT_PRIVATE = NO EXTRACT_STATIC = YES EXTRACT_LOCAL_CLASSES = YES # Warning settings WARN_IF_UNDOCUMENTED = YES WARN_IF_DOC_ERROR = YES WARN_NO_PARAMDOC = YES WARN_AS_ERROR = NO # Preprocessing ENABLE_PREPROCESSING = YES MACRO_EXPANSION = YES PREDEFINED = DOXYGEN_SKIP # Aliases for custom commands ALIASES = "thread_safe=\par Thread Safety\n" ALIASES += "performance=\par Performance\n"
xml<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-javadoc-plugin</artifactId> <version>3.6.3</version> <configuration> <source>17</source> <show>protected</show> <nohelp>true</nohelp> <doclint>all,-missing</doclint> <additionalOptions> <additionalOption>-Xdoclint:none</additionalOption> </additionalOptions> <links> <link>https://docs.oracle.com/en/java/javase/17/docs/api/</link> </links> <tags> <tag> <name>apiNote</name> <placement>a</placement> <head>API Note:</head> </tag> <tag> <name>implSpec</name> <placement>a</placement> <head>Implementation Specification:</head> </tag> <tag> <name>implNote</name> <placement>a</placement> <head>Implementation Note:</head> </tag> </tags> </configuration> <executions> <execution> <id>attach-javadocs</id> <goals> <goal>jar</goal> </goals> </execution> </executions> </plugin>
bash# Ubuntu/Debian apt-get install doxygen graphviz # macOS brew install doxygen graphviz # Windows (chocolatey) choco install doxygen.install graphviz
bash# Included with JDK java -version # JDK 11+ recommended
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→pass | 7,365 | 9,671 | +31% | 1 | 1 | 0% | 1,444 | 4,525 | +213% | 0 | 0 | — |
case-02 | pass→pass | 37,424 | 25,107 | -33% | 1 | 1 | 0% | 5,226 | 7,734 | +48% | 0 | 0 | — |
case-03 | fail→pass | 13,357 | 10,013 | -25% | 1 | 1 | 0% | 1,710 | 4,780 | +180% | 0 | 0 | — |
case-04 | pass→pass | 22,716 | 20,977 | -8% | 1 | 1 | 0% | 3,369 | 6,692 | +99% | 0 | 0 | — |
case-05 | pass→pass | 14,172 | 20,846 | +47% | 1 | 1 | 0% | 2,115 | 6,035 | +185% | 0 | 0 | — |
case-06 | pass→pass | 13,273 | 12,038 | -9% | 1 | 1 | 0% | 1,921 | 5,544 | +189% | 0 | 0 | — |
case-07 | pass→pass | 10,667 | 15,066 | +41% | 1 | 1 | 0% | 1,524 | 5,367 | +252% | 0 | 0 | — |
case-08 | pass→pass | 9,707 | 13,215 | +36% | 1 | 1 | 0% | 1,649 | 5,209 | +216% | 0 | 0 | — |
case-09 | pass→pass | 13,789 | 15,655 | +14% | 1 | 1 | 0% | 1,972 | 5,602 | +184% | 0 | 0 | — |
case-10 | pass→pass | 7,685 | 12,376 | +61% | 1 | 1 | 0% | 1,378 | 5,059 | +267% | 0 | 0 | — |
case-11 | pass→pass | 16,711 | 18,362 | +10% | 1 | 1 | 0% | 2,056 | 5,757 | +180% | 0 | 0 | — |
case-12 | pass→pass | 15,632 | 17,681 | +13% | 1 | 1 | 0% | 1,807 | 5,591 | +209% | 0 | 0 | — |
case-13 | pass→pass | 8,353 | 13,901 | +66% | 1 | 1 | 0% | 1,560 | 5,232 | +235% | 0 | 0 | — |
case-14 | pass→pass | 13,785 | 9,102 | -34% | 1 | 1 | 0% | 1,655 | 5,582 | +237% | 0 | 0 | — |
case-15 | fail→pass | 8,876 | 10,130 | +14% | 1 | 1 | 0% | 633 | 4,751 | +651% | 0 | 0 | — |
case-16 | fail→pass | 12,965 | 9,788 | -25% | 1 | 1 | 0% | 1,444 | 5,551 | +284% | 0 | 0 | — |
case-17 | pass→pass | 10,546 | 10,682 | +1% | 1 | 1 | 0% | 903 | 4,630 | +413% | 0 | 0 | — |
case-18 | pass→pass | 14,322 | 10,740 | -25% | 1 | 1 | 0% | 1,389 | 4,847 | +249% | 0 | 0 | — |
case-19 | pass→pass | 3,758 | 10,310 | +174% | 1 | 1 | 0% | 691 | 4,445 | +543% | 0 | 0 | — |
case-20 | pass→pass | 9,358 | 10,776 | +15% | 1 | 1 | 0% | 910 | 4,778 | +425% | 0 | 0 | — |
case-21 | pass→pass | 6,852 | 6,180 | -10% | 1 | 1 | 0% | 1,221 | 4,923 | +303% | 0 | 0 | — |
case-22 | pass→pass | 12,197 | 9,181 | -25% | 1 | 1 | 0% | 1,739 | 5,320 | +206% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of +18 percentage points is the difference between those two pass rates over the 22 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.